1function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}!function(t){"use strict";function e(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/,i=e.exec(t.toString());return i&&i.length>1?i[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function i(t){return/true/.test(t)?!0:/false/.test(t)?!1:isNaN(1*t)?t:parseFloat(t)}function n(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}var s="6.2.1",o={version:s,_plugins:{},_uuids:[],rtl:function(){return"rtl"===t("html").attr("dir")},plugin:function(t,i){var s=i||e(t),o=n(s);this._plugins[o]=this[s]=t},registerPlugin:function(t,i){var s=i?n(i):e(t.constructor).toLowerCase();t.uuid=this.GetYoDigits(6,s),t.$element.attr("data-"+s)||t.$element.attr("data-"+s,t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf."+s),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var i=n(e(t.$element.data("zfPlugin").constructor));this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-"+i).removeData("zfPlugin").trigger("destroyed.zf."+i);for(var s in t)t[s]=null},reInit:function(e){var i=e instanceof t;try{if(i)e.each(function(){t(this).data("zfPlugin")._init()});else{var s=typeof e,o=this,a={object:function(e){e.forEach(function(e){e=n(e),t("[data-"+e+"]").foundation("_init")})},string:function(){e=n(e),t("[data-"+e+"]").foundation("_init")},undefined:function(){this.object(Object.keys(o._plugins))}};a[s](e)}}catch(r){console.error(r)}finally{return e}},GetYoDigits:function(t,e){return t=t||6,Math.round(Math.pow(36,t+1)-Math.random()*Math.pow(36,t)).toString(36).slice(1)+(e?"-"+e:"")},reflow:function(e,n){"undefined"==typeof n?n=Object.keys(this._plugins):"string"==typeof n&&(n=[n]);var s=this;t.each(n,function(n,o){var a=s._plugins[o],r=t(e).find("[data-"+o+"]").addBack("[data-"+o+"]");r.each(function(){var e=t(this),n={};if(e.data("zfPlugin"))return void console.warn("Tried to initialize "+o+" on an element that already has a Foundation plugin.");if(e.attr("data-options")){e.attr("data-options").split(";").forEach(function(t,e){var s=t.split(":").map(function(t){return t.trim()});s[0]&&(n[s[0]]=i(s[1]))})}
1try{e.data("zfPlugin",new a(t(this),n))}catch(s){console.error(s)}finally{return}})})},getFnName:e,transitionend:function(t){var e,i={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend"},n=document.createElement("div");for(var s in i)"undefined"!=typeof n.style[s]&&(e=i[s]);return e?e:(e=setTimeout(function(){t.triggerHandler("transitionend",[t])},1),"transitionend")}};o.util={throttle:function(t,e){var i=null;return function(){var n=this,s=arguments;null===i&&(i=setTimeout(function(){t.apply(n,s),i=null},e))}}};var a=function(i){var n=typeof i,s=t("meta.foundation-mq"),a=t(".no-js");if(s.length||t('<meta class="foundation-mq">').appendTo(document.head),a.length&&a.removeClass("no-js"),"undefined"===n)o.MediaQuery._init(),o.reflow(this);else{if("string"!==n)throw new TypeError("We're sorry, "+n+" is not a valid parameter. You must use a string representing the method you wish to invoke.");var r=Array.prototype.slice.call(arguments,1),l=this.data("zfPlugin");if(void 0===l||void 0===l[i])throw new ReferenceError("We're sorry, '"+i+"' is not an available method for "+(l?e(l):"this element")+".");1===this.length?l[i].apply(l,r):this.each(function(e,n){l[i].apply(t(n).data("zfPlugin"),r)})}return this};window.Foundation=o,t.fn.foundation=a,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e<t.length&&!window.requestAnimationFrame;++e){var i=t[e];window.requestAnimationFrame=window[i+"RequestAnimationFrame"],window.cancelAnimationFrame=window[i+"CancelAnimationFrame"]||window[i+"CancelRequestAnimationFrame"]}if(/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)||!window.requestAnimationFrame||!window.cancelAnimationFrame){var n=0;window.requestAnimationFrame=function(t){var e=Date.now(),i=Math.max(n+16,e);return setTimeout(function(){t(n=i)},i-e)},window.cancelAnimationFrame=clearTimeout}window.performance&&window.performance.now||(window.performance={start:Date.now(),now:function(){return Date.now()-this.start}})}(),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,n=function(){},s=function(){return i.apply(this instanceof n?this:t,e.concat(Array.prototype.slice.call(arguments)))};return this.prototype&&(n.prototype=this.prototype),s.prototype=new n,s})}(jQuery),!function(t){function e(t){var e={};return"string"!=typeof t?e:(t=t.trim().slice(1,-1))?e=t.split("&").reduce(function(t,e){var i=e.replace(/\+/g," ").split("="),n=i[0],s=i[1];return n=decodeURIComponent(n),s=void 0===s?null:decodeURIComponent(s),t.hasOwnProperty(n)?Array.isArray(t[n])?t[n].push(s):t[n]=[t[n],s]:t[n]=s,t},{}):e}var i={queries:[],current:"",_init:function(){var i,n=this,s=t(".foundation-mq").css("font-family");i=e(s);for(var o in i)n.queries.push({name:o,value:"only screen and (min-width: "+i[o]+")"});this.current=this._getCurrentSize(),this._watcher()},atLeast:function(t){var e=this.get(t);return e?window.matchMedia(e).matches:!1},get:function(t){for(var e in this.queries){var i=this.queries[e];if(t===i.name)return i.value}return null},_getCurrentSize:function(){for(var t,e=0;e<this.queries.length;e++){var i=this.queries[e];window.matchMedia(i.value).matches&&(t=i)}return"object"==typeof t?t.name:t},_watcher:function(){var e=this;t(window).on("resize.zf.mediaquery",function(){var i=e._getCurrentSize();i!==e.current&&(t(window).trigger("changed.zf.mediaquery",[i,e.current]),e.current=i)})}};Foundation.MediaQuery=i,window.matchMedia||(window.matchMedia=function(){"use strict";var t=window.styleMedia||window.media;if(!t){var e=document.createElement("style"),i=document.getElementsByTagName("script")[0],n=null;e.type="text/css",e.id="matchmediajs-test",i.parentNode.insertBefore(e,i),n="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle,t={matchMedium:function(t){var i="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=i:e.textContent=i,"1px"===n.width}}}return function(e){return{matches:t.matchMedium(e||"all"),media:e||"all"}}}()),Foundation.MediaQuery=i}(jQuery),!function(t){function e(t){var e={};for(var i in t)e[t[i]]=t[i];return e}var i={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},n={},s={keys:e(i),parseKey:function(t){var e=i[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return t.shiftKey&&(e="SHIFT_"+e),t.ctrlKey&&(e="CTRL_"+e),t.altKey&&
1(e="ALT_"+e),e},handleKey:function(e,i,s){var o,a,r,l=n[i],u=this.parseKey(e);return l?(o="undefined"==typeof l.ltr?l:Foundation.rtl()?t.extend({},l.ltr,l.rtl):t.extend({},l.rtl,l.ltr),a=o[u],r=s[a],void(r&&"function"==typeof r?(r.apply(),(s.handled||"function"==typeof s.handled)&&s.handled.apply()):(s.unhandled||"function"==typeof s.unhandled)&&s.unhandled.apply())):console.warn("Component not defined!")},findFocusable:function(e){return e.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter(function(){return t(this).is(":visible")&&!(t(this).attr("tabindex")<0)})},register:function(t,e){n[t]=e}};Foundation.Keyboard=s}(jQuery),!function(t){function e(t,e,i){function n(r){a||(a=window.performance.now()),o=r-a,i.apply(e),t>o?s=window.requestAnimationFrame(n,e):(window.cancelAnimationFrame(s),e.trigger("finished.zf.animate",[e]).triggerHandler("finished.zf.animate",[e]))}var s,o,a=null;s=window.requestAnimationFrame(n)}function i(e,i,o,a){function r(){e||i.hide(),l(),a&&a.apply(i)}function l(){i[0].style.transitionDuration=0,i.removeClass(u+" "+d+" "+o)}if(i=t(i).eq(0),i.length){var u=e?n[0]:n[1],d=e?s[0]:s[1];l(),i.addClass(o).css("transition","none"),requestAnimationFrame(function(){i.addClass(u),e&&i.show()}),requestAnimationFrame(function(){i[0].offsetWidth,i.css("transition","").addClass(d)}),i.one(Foundation.transitionend(i),r)}}var n=["mui-enter","mui-leave"],s=["mui-enter-active","mui-leave-active"],o={animateIn:function(t,e,n){i(!0,t,e,n)},animateOut:function(t,e,n){i(!1,t,e,n)}};Foundation.Move=e,Foundation.Motion=o}(jQuery),!function(t){var e={Feather:function(e){var i=arguments.length<=1||void 0===arguments[1]?"zf":arguments[1];e.attr("role","menubar");var n=e.find("li").attr({role:"menuitem"}),s="is-"+i+"-submenu",o=s+"-item",a="is-"+i+"-submenu-parent";e.find("a:first").attr("tabindex",0),n.each(function(){var e=t(this),i=e.children("ul");i.length&&(e.addClass(a).attr({"aria-haspopup":!0,"aria-expanded":!1,"aria-label":e.children("a:first").text()}),i.addClass("submenu "+s).attr({"data-submenu":"","aria-hidden":!0,role:"menu"})),e.parent("[data-submenu]").length&&e.addClass("is-submenu-item "+o)})},Burn:function(t,e){var i=(t.find("li").removeAttr("tabindex"),"is-"+e+"-submenu"),n=i+"-item",s="is-"+e+"-submenu-parent";t.find("*").removeClass(i+" "+n+" "+s+" is-submenu-item submenu is-active").removeAttr("data-submenu").css("display","")}};Foundation.Nest=e}(jQuery),!function(t){function e(t,e,n,s){var o,a,r,l,u=i(t);if(e){var d=i(e);a=u.offset.top+u.height<=d.height+d.offset.top,o=u.offset.top>=d.offset.top,r=u.offset.left>=d.offset.left,l=u.offset.left+u.width<=d.width}else a=u.offset.top+u.height<=u.windowDims.height+u.windowDims.offset.top,o=u.offset.top>=u.windowDims.offset.top,r=u.offset.left>=u.windowDims.offset.left,l=u.offset.left+u.width<=u.windowDims.width;var h=[a,o,r,l];return n?r===l==!0:s?o===a==!0:-1===h.indexOf(!1)}function i(t,e){if(t=t.length?t[0]:t,t===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var i=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),s=document.body.getBoundingClientRect(),o=window.pageYOffset,a=window.pageXOffset;return{width:i.width,height:i.height,offset:{top:i.top+o,left:i.left+a},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+a}},windowDims:{width:s.width,height:s.height,offset:{top:o,left:a}}}}function n(t,e,n,s,o,a){var r=i(t),l=e?i(e):null;switch(n){case"top":return{left:Foundation.rtl()?l.offset.left-r.width+l.width:l.offset.left,top:l.offset.top-(r.height+s)};case"left":return{left:l.offset.left-(r.width+o),top:l.offset.top};case"right":return{left:l.offset.left+l.width+o,top:l.offset.top};case"center top":return{left:l.offset.left+l.width/2-r.width/2,top:l.offset.top-(r.height+s)};case"center bottom":return{left:a?o:l.offset.left+l.width/2-r.width/2,top:l.offset.top+l.height+s};case"center left":return{left:l.offset.left-(r.width+o),top:l.offset.top+l.height/2-r.height/2};case"center right":return{left:l.offset.left+l.width+o+1,top:l.offset.top+l.height/2-r.height/2};
1case"center":return{left:r.windowDims.offset.left+r.windowDims.width/2-r.width/2,top:r.windowDims.offset.top+r.windowDims.height/2-r.height/2};case"reveal":return{left:(r.windowDims.width-r.width)/2,top:r.windowDims.offset.top+s};case"reveal full":return{left:r.windowDims.offset.left,top:r.windowDims.offset.top};case"left bottom":return{left:l.offset.left-(r.width+o),top:l.offset.top+l.height};case"right bottom":return{left:l.offset.left+l.width+o-r.width,top:l.offset.top+l.height};default:return{left:Foundation.rtl()?l.offset.left-r.width+l.width:l.offset.left,top:l.offset.top+l.height+s}}}Foundation.Box={ImNotTouchingYou:e,GetDimensions:i,GetOffsets:n}}(jQuery),!function(t){function e(){o(),n(),s(),i()}function i(e){var i=t("[data-yeti-box]"),n=["dropdown","tooltip","reveal"];if(e&&("string"==typeof e?n.push(e):"object"==typeof e&&"string"==typeof e[0]?n.concat(e):console.error("Plugin names must be strings")),i.length){var s=n.map(function(t){return"closeme.zf."+t}).join(" ");t(window).off(s).on(s,function(e,i){var n=e.namespace.split(".")[0],s=t("[data-"+n+"]").not('[data-yeti-box="'+i+'"]');s.each(function(){var e=t(this);e.triggerHandler("close.zf.trigger",[e])})})}}function n(e){var i=void 0,n=t("[data-resize]");n.length&&t(window).off("resize.zf.trigger").on("resize.zf.trigger",function(s){i&&clearTimeout(i),i=setTimeout(function(){a||n.each(function(){t(this).triggerHandler("resizeme.zf.trigger")}),n.attr("data-events","resize")},e||10)})}function s(e){var i=void 0,n=t("[data-scroll]");n.length&&t(window).off("scroll.zf.trigger").on("scroll.zf.trigger",function(s){i&&clearTimeout(i),i=setTimeout(function(){a||n.each(function(){t(this).triggerHandler("scrollme.zf.trigger")}),n.attr("data-events","scroll")},e||10)})}function o(){if(!a)return!1;var e=document.querySelectorAll("[data-resize], [data-scroll], [data-mutate]"),i=function(e){var i=t(e[0].target);switch(i.attr("data-events")){case"resize":i.triggerHandler("resizeme.zf.trigger",[i]);break;case"scroll":i.triggerHandler("scrollme.zf.trigger",[i,window.pageYOffset]);break;default:return!1}};if(e.length)for(var n=0;n<=e.length-1;n++){var s=new a(i);s.observe(e[n],{attributes:!0,childList:!1,characterData:!1,subtree:!1,attributeFilter:["data-events"]})}}var a=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e<t.length;e++)if(t[e]+"MutationObserver"in window)return window[t[e]+"MutationObserver"];return!1}(),r=function(e,i){e.data(i).split(" ").forEach(function(n){t("#"+n)["close"===i?"trigger":"triggerHandler"](i+".zf.trigger",[e])})};t(document).on("click.zf.trigger","[data-open]",function(){r(t(this),"open")}),t(document).on("click.zf.trigger","[data-close]",function(){var e=t(this).data("close");e?r(t(this),"close"):t(this).trigger("close.zf.trigger")}),t(document).on("click.zf.trigger","[data-toggle]",function(){r(t(this),"toggle")}),t(document).on("close.zf.trigger","[data-closable]",function(e){e.stopPropagation();var i=t(this).data("closable");""!==i?Foundation.Motion.animateOut(t(this),i,function(){t(this).trigger("closed.zf")}):t(this).fadeOut().trigger("closed.zf")}),t(document).on("focus.zf.trigger blur.zf.trigger","[data-toggle-focus]",function(){var e=t(this).data("toggle-focus");t("#"+e).triggerHandler("toggle.zf.trigger",[t(this)])}),t(window).load(function(){e()}),Foundation.IHearYou=e}(jQuery),!function(t){function e(t,e,i){var n,s,o=this,a=e.duration,r=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(s),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(s),l=0>=l?a:l,t.data("paused",!1),n=Date.now(),s=setTimeout(function(){e.infinite&&o.restart(),i()},l),t.trigger("timerstart.zf."+r)},this.pause=function(){this.isPaused=!0,clearTimeout(s),t.data("paused",!0);var e=Date.now();l-=e-n,t.trigger("timerpaused.zf."+r)}}function i(e,i){function n(){s--,0===s&&i()}var s=e.length;0===s&&i(),e.each(function(){this.complete?n():"undefined"!=typeof this.naturalWidth&&this.naturalWidth>0?n():t(this).one("load",function(){n()})})}Foundation.Timer=e,Foundation.onImagesLoaded=i}(jQuery),function(t){function e(){this.removeEventListener("touchmove",i),this.removeEventListener("touchend",e),u=!1}function i(i){if(t.spotSwipe.preventDefault&&i.preventDefault(),u){var n,s=i.touches[0].pageX,a=(i.touches[0].pageY,o-s);l=(new Date).getTime()-r,Math.abs(a)>=t.spotSwipe.moveThreshold&&l<=t.spotSwipe.timeThreshold&&(n=a>0?"left":"right"),n&&(i.preventDefault(),e.call(this),t(this).trigger("swipe",n).trigger("swipe"+n))}}function n(t){1==t.touches.length&&(o=t.touches[0].pageX,a=t.touches[0].pageY,u=!0,r=(new Date).getTime(),this.addEventListener("touchmove",i,!1),this.addEventListener("touchend",e,!1))}function s(){this.addEventListener&&this.addEventListener("touchstart",n,!1)}t.spotSwipe={version:"1.0.0",enabled:"ontouchstart"in document.documentElement,preventDefault:!1,moveThreshold:75,timeThreshold:200};var o,a,r,l,u=!1;t.event.special.swipe={setup:s},t.each(["left","up","down","right"],function(){t.event.special["swipe"+this]={setup:function(){t(this).on("swipe",t.noop)}}})}(jQuery),!function(t){t.fn.addTouch=function(){this.each(function(i,n){t(n).bind("touchstart touchmove touchend touchcancel",function(){e(event)})});var e=function(t){var e,i=t.changedTouches,n=i[0],s={touchstart:"mousedown",touchmove:"mou
1semove",touchend:"mouseup"},o=s[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=window.MouseEvent(o,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent"),e.initMouseEvent(o,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null)),n.target.dispatchEvent(e)}}}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Abide")}return _createClass(e,[{key:"_init",value:function(){this.$inputs=this.$element.find("input, textarea, select").not("[data-abide-ignore]"),this._events()}},{key:"_events",value:function(){var e=this;this.$element.off(".abide").on("reset.zf.abide",function(){e.resetForm()}).on("submit.zf.abide",function(){return e.validateForm()}),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",function(i){e.validateInput(t(i.target))}),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",function(i){e.validateInput(t(i.target))})}},{key:"_reflow",value:function(){this._init()}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"select":case"select-one":case"select-multiple":var i=t.find("option:selected");i.length&&i.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t){var e=t.siblings(this.options.formErrorSelector);return e.length||(e=t.parent().find(this.options.formErrorSelector)),e}},{key:"findLabel",value:function(t){var e=t[0].id,i=this.$element.find('label[for="'+e+'"]');return i.length?i:t.closest("label")}},{key:"findRadioLabels",value:function(e){var i=this,n=e.map(function(e,n){var s=n.id,o=i.$element.find('label[for="'+s+'"]');return o.length||(o=t(n).closest("label")),o[0]});return t(n)}},{key:"addErrorClasses",value:function(t){var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr("data-invalid","")}},{key:"removeRadioErrorClasses",value:function(t){var e=this.$element.find(':radio[name="'+t+'"]'),i=this.findRadioLabels(e),n=this.findFormError(e);i.length&&i.removeClass(this.options.labelErrorClass),n.length&&n.removeClass(this.options.formErrorClass),e.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"removeErrorClasses",value:function(t){if("radio"==t[0].type)return this.removeRadioErrorClasses(t.attr("name"));var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.removeClass(this.options.labelErrorClass),i.length&&i.removeClass(this.options.formErrorClass),t.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"validateInput",value:function(t){var e=this.requiredCheck(t),i=!1,n=!0,s=t.attr("data-validator"),o=!0;switch(t[0].type){case"radio":i=this.validateRadio(t.attr("name"));break;case"checkbox":i=e;break;case"select":case"select-one":case"select-multiple":i=e;break;default:i=this.validateText(t)}s&&(n=this.matchValidation(t,s,t.attr("required"))),t.attr("data-equalto")&&(o=this.options.validators.equalTo(t));var a=-1===[e,i,n,o].indexOf(!1),r=(a?"valid":"invalid")+".zf.abide";return this[a?"removeErrorClasses":"addErrorClasses"](t),t.trigger(r,[t]),a}},{key:"validateForm",value:function(){var e=[],i=this;this.$inputs.each(function(){e.push(i.validateInput(t(this)))});var n=-1===e.indexOf(!1);return this.$element.find("[data-abide-error]").css("display",n?"none":"block"),this.$element.trigger((n?"formvalid":"forminvalid")+".zf.abide",[this.$element]),n}},{key:"validateText",value:function(t,e){e=e||t.attr("pattern")||t.attr("type");var i=t.val(),n=!1;return i.length?n=this.options.patterns.hasOwnProperty(e)?this.options.patterns[e].test(i):e!==t.attr("type")?new RegExp(e).test(i):!0:t.prop("required")||(n=!0),n}},{key:"validateRadio",value:function(e){var i=this.$element.find(':radio[name="'+e+'"]'),n=!1;return void 0===i.attr("required")&&(n=!0),i.each(function(e,i){t(i).prop("checked")&&(n=!0)}),n}}
1,{key:"matchValidation",value:function(t,e,i){var n=this;i=!!i;var s=e.split(" ").map(function(e){return n.options.validators[e](t,i,t.parent())});return-1===s.indexOf(!1)}},{key:"resetForm",value:function(){var e=this.$element,i=this.options;t("."+i.labelErrorClass,e).not("small").removeClass(i.labelErrorClass),t("."+i.inputErrorClass,e).not("small").removeClass(i.inputErrorClass),t(i.formErrorSelector+"."+i.formErrorClass).removeClass(i.formErrorClass),e.find("[data-abide-error]").css("display","none"),t(":input",e).not(":button, :submit, :reset, :hidden, [data-abide-ignore]").val("").removeAttr("data-invalid"),e.trigger("formreset.zf.abide",[e])}},{key:"destroy",value:function(){var e=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each(function(){e.removeErrorClasses(t(this))}),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",liveValidate:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/},validators:{equalTo:function(e,i,n){return t("#"+e.attr("data-equalto")).val()===e.val()}}},Foundation.plugin(e,"Abide")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Accordion"),Foundation.Keyboard.register("Accordion",{ENTER:"toggle",SPACE:"toggle",ARROW_DOWN:"next",ARROW_UP:"previous"})}return _createClass(e,[{key:"_init",value:function(){this.$element.attr("role","tablist"),this.$tabs=this.$element.children("li, [data-accordion-item]"),this.$tabs.each(function(e,i){var n=t(i),s=n.children("[data-tab-content]"),o=s[0].id||Foundation.GetYoDigits(6,"accordion"),a=i.id||o+"-label";n.find("a:first").attr({"aria-controls":o,role:"tab",id:a,"aria-expanded":!1,"aria-selected":!1}),s.attr({role:"tabpanel","aria-labelledby":a,"aria-hidden":!0,id:o})});
1var e=this.$element.find(".is-active").children("[data-tab-content]");e.length&&this.down(e,!0),this._events()}},{key:"_events",value:function(){var e=this;this.$tabs.each(function(){var i=t(this),n=i.children("[data-tab-content]");n.length&&i.children("a").off("click.zf.accordion keydown.zf.accordion").on("click.zf.accordion",function(t){t.preventDefault(),i.hasClass("is-active")?(e.options.allowAllClosed||i.siblings().hasClass("is-active"))&&e.up(n):e.down(n)}).on("keydown.zf.accordion",function(t){Foundation.Keyboard.handleKey(t,"Accordion",{toggle:function(){e.toggle(n)},next:function(){var t=i.next().find("a").focus();e.options.multiExpand||t.trigger("click.zf.accordion")},previous:function(){var t=i.prev().find("a").focus();e.options.multiExpand||t.trigger("click.zf.accordion")},handled:function(){t.preventDefault(),t.stopPropagation()}})})})}},{key:"toggle",value:function(t){if(t.parent().hasClass("is-active")){if(!this.options.allowAllClosed&&!t.parent().siblings().hasClass("is-active"))return;this.up(t)}else this.down(t)}},{key:"down",value:function(e,i){var n=this;if(!this.options.multiExpand&&!i){var s=this.$element.children(".is-active").children("[data-tab-content]");s.length&&this.up(s)}e.attr("aria-hidden",!1).parent("[data-tab-content]").addBack().parent().addClass("is-active"),e.slideDown(this.options.slideSpeed,function(){n.$element.trigger("down.zf.accordion",[e])}),t("#"+e.attr("aria-labelledby")).attr({"aria-expanded":!0,"aria-selected":!0})}},{key:"up",value:function(e){var i=e.parent().siblings(),n=this,s=this.options.multiExpand?i.hasClass("is-active"):e.parent().hasClass("is-active");(this.options.allowAllClosed||s)&&(e.slideUp(n.options.slideSpeed,function(){n.$element.trigger("up.zf.accordion",[e])}),e.attr("aria-hidden",!0).parent().removeClass("is-active"),t("#"+e.attr("aria-labelledby")).attr({"aria-expanded":!1,"aria-selected":!1}))}},{key:"destroy",value:function(){this.$element.find("[data-tab-content]").slideUp(0).css("display",""),this.$element.find("a").off(".zf.accordion"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={slideSpeed:250,multiExpand:!1,allowAllClosed:!1},Foundation.plugin(e,"Accordion")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),Foundation.Nest.Feather(this.$element,"accordion"),this._init(),Foundation.registerPlugin(this,"AccordionMenu"),Foundation.Keyboard.register("AccordionMenu",{ENTER:"toggle",SPACE:"toggle",ARROW_RIGHT:"open",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"close",ESCAPE:"closeAll",TAB:"down",SHIFT_TAB:"up"})}return _createClass(e,[{key:"_init",value:function(){this.$element.find("[data-submenu]").not(".is-active").slideUp(0),this.$element.attr({role:"tablist","aria-multiselectable":this.options.multiOpen}),this.$menuLinks=this.$element.find(".is-accordion-submenu-parent"),this.$menuLinks.each(function(){var e=this.id||Foundation.GetYoDigits(6,"acc-menu-link"),i=t(this),n=i.children("[data-submenu]"),s=n[0].id||Foundation.GetYoDigits(6,"acc-menu"),o=n.hasClass("is-active");i.attr({"aria-controls":s,"aria-expanded":o,role:"tab",id:e}),n.attr({"aria-labelledby":e,"aria-hidden":!o,role:"tabpanel",id:s})});var e=this.$element.find(".is-active");if(e.length){var i=this;e.each(function(){i.down(t(this))})}this._events()}},{key:"_events",value:function(){var e=this;this.$element.find("li").each(function(){var i=t(this).children("[data-submenu]");i.length&&t(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",function(t){t.preventDefault(),e.toggle(i)})}).on("keydown.zf.accordionmenu",function(i){var n,s,o=t(this),a=o.parent("ul").children("li"),r=o.children("[data-submenu]");a.each(function(e){return t(this).is(o)?(n=a.eq(Math.max(0,e-1)).find("a").first(),s=a.eq(Math.min(e+1,a.length-1)).find("a").first(),t(this).children("[data-submenu]:visible").length&&(s=o.find("li:first-child").find("a").first()),t(this).is(":first-child")?n=o.parents("li").first().find("a").first():n.
1children("[data-submenu]:visible").length&&(n=n.find("li:last-child").find("a").first()),void(t(this).is(":last-child")&&(s=o.parents("li").first().next("li").find("a").first()))):void 0; 2}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){r.is(":hidden")&&(e.down(r),r.find("li").first().find("a").first().focus())},close:function(){r.length&&!r.is(":hidden")?e.up(r):o.parent("[data-submenu]").length&&(e.up(o.parent("[data-submenu]")),o.parents("li").first().find("a").first().focus())},up:function(){n.attr("tabindex",-1).focus(),i.preventDefault()},down:function(){s.attr("tabindex",-1).focus(),i.preventDefault()},toggle:function(){o.children("[data-submenu]").length&&e.toggle(o.children("[data-submenu]"))},closeAll:function(){e.hideAll()},handled:function(){i.stopImmediatePropagation()}})})}},{key:"hideAll",value:function(){this.$element.find("[data-submenu]").slideUp(this.options.slideSpeed)}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;this.options.multiOpen||this.up(this.$element.find(".is-active").not(t.parentsUntil(this.$element).add(t))),t.addClass("is-active").attr({"aria-hidden":!1}).parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),Foundation.Move(this.options.slideSpeed,t,function(){t.slideDown(e.options.slideSpeed,function(){e.$element.trigger("down.zf.accordionMenu",[t])})})}},{key:"up",value:function(t){var e=this;Foundation.Move(this.options.slideSpeed,t,function(){t.slideUp(e.options.slideSpeed,function(){e.$element.trigger("up.zf.accordionMenu",[t])})});var i=t.find("[data-submenu]").slideUp(0).addBack().attr("aria-hidden",!0);i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1)}},{key:"destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),Foundation.Nest.Burn(this.$element,"accordion"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={slideSpeed:250,multiOpen:!0},Foundation.plugin(e,"AccordionMenu")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),Foundation.Nest.Feather(this.$element,"drilldown"),this._init(),Foundation.registerPlugin(this,"Drilldown"),Foundation.Keyboard.register("Drilldown",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close",TAB:"down",SHIFT_TAB:"up"})}return _createClass(e,[{key:"_init",value:function(){this.$submenuAnchors=this.$element.find("li.is-drilldown-submenu-parent").children("a"),this.$submenus=this.$submenuAnchors.parent("li").children("[data-submenu]"),this.$menuItems=this.$element.find("li").not(".js-drilldown-back").attr("role","menuitem").find("a"),this._prepareMenu(),this._keyboardEvents()}},{key:"_prepareMenu",value:function(){var e=this;this.$submenuAnchors.each(function(){var i=t(this),n=i.find("a:first");e.options.parentLink&&n.clone().prependTo(i.children("[data-submenu]")).wrap('<li class="is-submenu-parent-item is-submenu-item is-drilldown-submenu-item" role="menu-item"></li>'),n.data("savedHref",n.attr("href")).removeAttr("href"),i.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"menu"}),e._events(i)}),this.$submenus.each(function(){var i=t(this),n=i.find(".js-drilldown-back");n.length||i.prepend(e.options.backButton),e._back(i)}),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=t(this.options.wrapper).addClass("is-drilldown").css(this._getMaxDims()),this.$element.wrap(this.$wrapper))}},{key:"_events",value:function(e){var i=this;e.off("click.zf.drilldown").on("click.zf.drilldown",function(n){if(t(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&(n.stopImmediatePropagation(),n.preventDefault()),i._show(e.parent("li")),i.options.closeOnClick){var s=t("body").not(i.$wrapper);s.off(".zf.drilldown").on("click.zf.drilldown",function(t){t.preventDefault(),i._hideAll(),s.off(".zf.drilldown")})}})}},{key:"_keyboardEvents",value:function(){var e=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a")).on("keydown.zf.drilldown",function(i){var n,s,o=t(this),a=o.parent("li").parent("ul").children("li").children("a");a.each(function(e){return t(this).is(o)?(n=a.eq(Math.max(0,e-1)),void(s=a.eq(Math.min(e+1,a.length-1)))):void 0}),Foundation.Keyboard.handleKey(i,"Drilldown",{next:function(){o.is(e.$submenuAnchors)&&(e._show(o.parent("li")),o.parent("li").one(Foundation.transitionend(o),function(){o.parent("li").find("ul li a").filter(e.$menuItems).first().focus()}),i.preventDefault())},previous:function(){e._hide(o.parent("li").parent("ul")),o.parent("li").parent("ul").one(Foundation.transitionend(o),function(){setTimeout(function(){o.parent("li").parent("ul").parent("li").children("a").first().focus()},1)}),i.preventDefault()},up:function(){n.focus(),i.preventDefault()},down:function(){s.focus(),i.preventDefault()},close:function(){e._back()},open:function(){o.is(e.$menuItems)?o.is(e.$submenuAnchors)&&(e._show(o.parent("li")),o.parent("li").one(Foundation.transitionend(o),function(){o.parent("li").find("ul li a").filter(e.$menuItems).first().focus()}),i.preventDefault()):(e._hide(o.parent("li").parent("ul")),o.parent("li").parent("ul").one(Foundation.transitionend(o),function(){setTimeout(function(){o.parent("li").parent("ul").parent("li").children("a").first().focus()},1)}),i.preventDefault())},handled:function(){i.stopImmediatePropagation()}})})}}
2,{key:"_hideAll",value:function(){var t=this.$element.find(".is-drilldown-submenu.is-active").addClass("is-closing");t.one(Foundation.transitionend(t),function(e){t.removeClass("is-active is-closing")}),this.$element.trigger("closed.zf.drilldown")}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",function(i){i.stopImmediatePropagation(),e._hide(t)})}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",function(e){setTimeout(function(){t._hideAll()},0)})}},{key:"_show",value:function(t){t.children("[data-submenu]").addClass("is-active"),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){t.addClass("is-closing").one(Foundation.transitionend(t),function(){t.removeClass("is-active is-closing"),t.blur()}),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var e=0,i={};return this.$submenus.add(this.$element).each(function(){var i=t(this).children("li").length;e=i>e?i:e}),i["min-height"]=e*this.$menuItems[0].getBoundingClientRect().height+"px",i["max-width"]=this.$element[0].getBoundingClientRect().width+"px",i}},{key:"destroy",value:function(){this._hideAll(),Foundation.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role").off(".zf.drilldown").end().off("zf.drilldown"),this.$element.find("a").each(function(){var e=t(this);e.data("savedHref")&&e.attr("href",e.data("savedHref")).removeData("savedHref")}),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={backButton:'<li class="js-drilldown-back"><a tabindex="0">Back</a></li>',wrapper:"<div></div>",parentLink:!1,closeOnClick:!1},Foundation.plugin(e,"Drilldown")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Dropdown"),Foundation.Keyboard.register("Dropdown",{ENTER:"open",SPACE:"open",ESCAPE:"close",TAB:"tab_forward",SHIFT_TAB:"tab_backward"})}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("id");this.$anchor=t('[data-toggle="'+e+'"]')||t('[data-open="'+e+'"]'),this.$anchor.attr({"aria-controls":e,"data-is-focus":!1,"data-yeti-box":e,"aria-haspopup":!0,"aria-expanded":!1}),this.options.positionClass=this.getPositionClass(),this.counter=4,this.usedPositions=[],this.$element.attr({"aria-hidden":"true","data-yeti-box":e,"data-resize":e,"aria-labelledby":this.$anchor[0].id||Foundation.GetYoDigits(6,"dd-anchor")}),this._events()}},{key:"getPositionClass",value:function(){var t=this.$element[0].className.match(/(top|left|right|bottom)/g);t=t?t[0]:"";var e=/float-(.+)\s/.exec(this.$anchor[0].className);e=e?e[1]:"";var i=e?e+" "+t:t;return i}},{key:"_reposition",value:function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.$element.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.$element.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.$element.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.$element.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.$element.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):this.$element.removeClass(t),this.classChanged=!0,this.counter--}},{key:"_setPosition",value:function(){if("false"===this.$anchor.attr("aria-expanded"))return!1;var t=this.getPositionClass(),e=Foundation.Box.GetDimensions(this.$element),i=(Foundation.Box.GetDimensions(this.$anchor),"left"===t?"left":"right"===t?"left":"top"),n="top"===i?"height":"width";"height"===n?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!Foundation.Box.ImNotTouchingYou(this.$element))return this.$element.offset(Foundation.Box.GetOffsets(this.$element,this.$anchor,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:e.windowDims.width-2*this.options.hOffset,height:"auto"}),this.classChanged=!0,!1;for(this.$element.offset(Foundation.Box.GetOffsets(this.$element,this.$anchor,t,this.options.vOffset,this.options.hOffset));!Foundation.Box.ImNotTouchingYou(this.$element,!1,!0)&&this.counter;)this._reposition(t),this._setPosition()}},{key:"_events",value:function(){var e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":this._setPosition.bind(this)}),this.options.hover&&(this.$anchor.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.open(),e.$anchor.data("hover",!0)},e.options.hoverDelay)}).on("mouseleave.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.close(),e.$anchor.data("hover",!1)},e.options.hoverDelay)}),this.options.hoverPane&&this.$element.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(e.timeout)}).on("mouseleave.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.close(),e.$anchor.data("hover",!1)},e.options.hoverDelay)})),this.$anchor.add(this.$element).on("keydown.zf.dropdown",function(i){var n=t(this),s=Foundation.Keyboard.findFocusable(e.$element);Foundation.Keyboard.handleKey(i,"Dropdown",{tab_forward:function(){e.$element.find(":focus").is(s.eq(-1))&&(e.options.trapFocus?(s.eq(0).focus(),i.preventDefault()):e.close())},tab_backward:function(){(e.$element.find(":focus").is(s.eq(0))||e.$element.is(":focus"))&&(e.options.trapFocus?(s.eq(-1).focus(),i.preventDefault()):e.close())},open:function(){n.is(e.$anchor)&&(e.open(),e.$element.attr("tabindex",-1).focus(),i.preventDefault())},close:function(){e.close(),e.$anchor.focus()}})})}},{key:"_addBodyHandler",value:function(){var e=t(document.body).not(this.$element),i=this;e.off("click.zf.dropdown").on("click.zf.dropdown",function(t){i.$anchor.is(t.target)||i.$anchor.find(t.target).length||i.$element.find(t.target).length||(i.close(),e.off("click.zf.dropdown"))})}},{key:"open",value:function(){if(this.$element.trigger("closeme.zf.dropdown",this.$element.attr("id")),this.$anchor.addClass("hover").attr({"aria-expanded":!0}),this._setPosition(),this.$element.addClass("is-open").attr({"aria-hidden":!1}),this.options.autoFocus){var t=Foundation.Keyboard.findFocusable(this.$element);t.length&&t.eq(0).focus()}this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdown",[this.$element])}},{key:"close",value:function(){if(!this.$element.hasClass("is-open"))return!1;if(this.$element.removeClass("is-open").attr({"aria-hidden":!0}),this.$anchor.removeClass("hover").attr("aria-expanded",!1),this.classChanged){var t=this.getPositionClass();t&&this.$element.removeClass(t),this.$element.addClass(this.options.positionClass).css({height:"",width:""}),this.classChanged=!1,this.counter=4,this.usedPositions.length=0}this.$element.trigger("hide.zf.dropdown",[this.$element])}},{key:"toggle",value:function(){if(this.$element.hasClass("is-open")){if(this.$anchor.data("hover"))return;this.close()}else this.open()}},{key:"destroy",value:function(){this.$element.off(".zf.trigger").hide(),this.$anchor.off(".zf.dropdown"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={hoverDelay:250,hover:!1,hoverPane:!1,vOffset:1,hOffset:1,positionClass:"",trapFocus:!1,autoFocus:!1,closeOnClick:!1},Foundation.plugin(e,"Dropdown")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
2return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),Foundation.Nest.Feather(this.$element,"dropdown"),this._init(),Foundation.registerPlugin(this,"DropdownMenu"),Foundation.Keyboard.register("DropdownMenu",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close"})}return _createClass(e,[{key:"_init",value:function(){var t=this.$element.find("li.is-dropdown-submenu-parent");this.$element.children(".is-dropdown-submenu-parent").children(".is-dropdown-submenu").addClass("first-sub"),this.$menuItems=this.$element.find('[role="menuitem"]'),this.$tabs=this.$element.children('[role="menuitem"]'),this.$tabs.find("ul.is-dropdown-submenu").addClass(this.options.verticalClass),this.$element.hasClass(this.options.rightClass)||"right"===this.options.alignment||Foundation.rtl()||this.$element.parents(".top-bar-right").is("*")?(this.options.alignment="right",t.addClass("opens-left")):t.addClass("opens-right"),this.changed=!1,this._events()}},{key:"_events",value:function(){var e=this,i="ontouchstart"in window||"undefined"!=typeof window.ontouchstart,n="is-dropdown-submenu-parent";(this.options.clickOpen||i)&&this.$menuItems.on("click.zf.dropdownmenu touchstart.zf.dropdownmenu",function(s){var o=t(s.target).parentsUntil("ul","."+n),a=o.hasClass(n),r="true"===o.attr("data-is-click");o.children(".is-dropdown-submenu");if(a)if(r){if(!e.options.closeOnClick||!e.options.clickOpen&&!i||e.options.forceFollow&&i)return;s.stopImmediatePropagation(),s.preventDefault(),e._hide(o)}else s.preventDefault(),s.stopImmediatePropagation(),e._show(o.children(".is-dropdown-submenu")),o.add(o.parentsUntil(e.$element,"."+n)).attr("data-is-click",!0)}),this.options.disableHover||this.$menuItems.on("mouseenter.zf.dropdownmenu",function(i){i.stopImmediatePropagation();var s=t(this),o=s.hasClass(n);o&&(clearTimeout(e.delay),e.delay=setTimeout(function(){e._show(s.children(".is-dropdown-submenu"))},e.options.hoverDelay))}).on("mouseleave.zf.dropdownmenu",function(i){var s=t(this),o=s.hasClass(n);if(o&&e.options.autoclose){if("true"===s.attr("data-is-click")&&e.options.clickOpen)return!1;clearTimeout(e.delay),e.delay=setTimeout(function(){e._hide(s)},e.options.closingTime)}}),this.$menuItems.on("keydown.zf.dropdownmenu",function(i){var n,s,o=t(i.target).parentsUntil("ul",'[role="menuitem"]'),a=e.$tabs.index(o)>-1,r=a?e.$tabs:o.siblings("li").add(o);r.each(function(e){return t(this).is(o)?(n=r.eq(e-1),void(s=r.eq(e+1))):void 0});var l=function(){o.is(":last-child")||s.children("a:first").focus()},u=function(){n.children("a:first").focus()},d=function(){var t=o.children("ul.is-dropdown-submenu");t.length&&(e._show(t),o.find("li > a:first").focus())},h=function(){var t=o.parent("ul").parent("li");t.children("a:first").focus(),e._hide(t)},c={open:d,close:function(){e._hide(e.$element),e.$menuItems.find("a:first").focus()},handled:function(){i.preventDefault(),i.stopImmediatePropagation()}};a?e.vertical?"left"===e.options.alignment?t.extend(c,{down:l,up:u,next:d,previous:h}):t.extend(c,{down:l,up:u,next:h,previous:d}):t.extend(c,{next:l,previous:u,down:d,up:h}):"left"===e.options.alignment?t.extend(c,{next:d,previous:h,down:l,up:u}):t.extend(c,{next:h,previous:d,down:l,up:u}),Foundation.Keyboard.handleKey(i,"DropdownMenu",c)})}},{key:"_addBodyHandler",value:function(){var e=t(document.body),i=this;e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu").on("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu",function(t){var n=i.$element.find(t.target);n.length||(i._hide(),e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu"))})}},{key:"_show",value:function(e){var i=this.$tabs.index(this.$tabs.filter(function(i,n){return t(n).find(e).length>0})),n=e.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,i),e.css("visibility","hidden").addClass("js-dropdown-active").attr({"aria-hidden":!1}).parent("li.is-dropdown-submenu-parent").addClass("is-active").attr({"aria-expanded":!0});var s=Foundation.Box.ImNotTouchingYou(e,null,!0);if(!s){var o="left"===this.options.alignment?"-right":"-left",a=e.parent(".is-dropdown-submenu-parent");a.removeClass("opens"+o).addClass("opens-"+this.options.alignment),s=Foundation.Box.ImNotTouchingYou(e,null,!0),s||a.removeClass("opens-"+this.options.alignment).addClass("opens-inner"),this.changed=!0}e.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownmenu",[e])}},{key:"_hide",value:function(t,e){var i;i=t&&t.length?t:void 0!==e?this.$tabs.not(function(t,i){return t===e}):this.$element;var n=i.hasClass("is-active")||i.find(".is-active").length>0;if(n){if(i.find("li.is-active").add(i).attr({"aria-expanded":!1,"data-is-click":!1}).removeClass("is-active"),i.find("ul.js-dropdown-active").attr({"aria-hidden":!0}).removeClass("js-dropdown-active"),this.changed||i.find("opens-inner").length){var s="left"===this.options.alignment?"right":"left";i.find("li.is-dropdown-submenu-parent").add(i).removeClass("opens-inner opens-"+this.options.alignment).addClass("opens-"+s),this.changed=!1}this.$element.trigger("hide.zf.dropdownmenu",[i])}}},{key:"destroy",value:function(){this.$menuItems.off(".zf.dropdownmenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),t(document.body).off(".zf.dropdownmenu"),Foundation.Nest.Burn(this.$element,"dropdown"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={disableHover:!1,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"left",closeOnClick:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0},Foundation.plugin(e,"DropdownMenu")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
2return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Equalizer")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("data-equalizer")||"",i=this.$element.find('[data-equalizer-watch="'+e+'"]');this.$watched=i.length?i:this.$element.find("[data-equalizer-watch]"),this.$element.attr("data-resize",e||Foundation.GetYoDigits(6,"eq")),this.hasNested=this.$element.find("[data-equalizer]").length>0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1;var n,s=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),t(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&n===!1||void 0===n)&&(s.length?Foundation.onImagesLoaded(s,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off(".zf.equalizer resizeme.zf.trigger")}},{key:"_events",value:function(){var t=this;this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",function(e){e.target!==t.$element[0]&&t._reflow()}):this.$element.on("resizeme.zf.trigger",this._reflow.bind(this)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!Foundation.MediaQuery.atLeast(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){return!this.options.equalizeOnStack&&this._isStacked()?(this.$watched.css("height","auto"),!1):void(this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this)))}},{key:"_isStacked",value:function(){return this.$watched[0].offsetTop!==this.$watched[1].offsetTop}},{key:"getHeights",value:function(t){for(var e=[],i=0,n=this.$watched.length;n>i;i++)this.$watched[i].style.height="auto",e.push(this.$watched[i].offsetHeight);t(e)}},{key:"getHeightsByRow",value:function(e){var i=this.$watched.length?this.$watched.first().offset().top:0,n=[],s=0;n[s]=[];for(var o=0,a=this.$watched.length;a>o;o++){this.$watched[o].style.height="auto";var r=t(this.$watched[o]).offset().top;r!=i&&(s++,n[s]=[],i=r),n[s].push([this.$watched[o],this.$watched[o].offsetHeight])}for(var l=0,u=n.length;u>l;l++){var d=t(n[l]).map(function(){return this[1]}).get(),h=Math.max.apply(null,d);n[l].push(h)}e(n)}},{key:"applyHeight",value:function(t){var e=Math.max.apply(null,t);this.$element.trigger("preequalized.zf.equalizer"),this.$watched.css("height",e),this.$element.trigger("postequalized.zf.equalizer")}},{key:"applyHeightByRow",value:function(e){this.$element.trigger("preequalized.zf.equalizer");for(var i=0,n=e.length;n>i;i++){var s=e[i].length,o=e[i][s-1];if(2>=s)t(e[i][0][0]).css({height:"auto"});else{this.$element.trigger("preequalizedrow.zf.equalizer");for(var a=0,r=s-1;r>a;a++)t(e[i][a][0]).css({height:o});this.$element.trigger("postequalizedrow.zf.equalizer")}}this.$element.trigger("postequalized.zf.equalizer")}},{key:"destroy",value:function(){this._pauseEvents(),this.$watched.css("height","auto"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={equalizeOnStack:!0,equalizeByRow:!1,equalizeOn:""},Foundation.plugin(e,"Equalizer")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,n),this.rules=[],this.currentPath="",this._init(),this._events(),Foundation.registerPlugin(this,"Interchange")}return _createClass(e,[{key:"_init",value:function(){this._addBreakpoints(),this._generateRules(),this._reflow()}},{key:"_events",value:function(){t(window).on("resize.zf.interchange",Foundation.util.throttle(this._reflow.bind(this),50))}},{key:"_reflow",value:function(){var t;for(var e in this.rules){var i=this.rules[e];window.matchMedia(i.query).matches&&(t=i)}t&&this.replace(t.path)}},{key:"_addBreakpoints",value:function(){for(var t in Foundation.MediaQuery.queries){var i=Foundation.MediaQuery.queries[t];e.SPECIAL_QUERIES[i.name]=i.value}}},{key:"_generateRules",value:function(t){var i,n=[];i=this.options.rules?this.options.rules:this.$element.data("interchange").match(/\[.*?\]/g);for(var s in i){var o=i[s].slice(1,-1).split(", "),a=o.slice(0,-1).join(""),r=o[o.length-1];e.SPECIAL_QUERIES[r]&&(r=e.SPECIAL_QUERIES[r]),n.push({path:a,query:r})}this.rules=n}},{key:"replace",value:function(e){if(this.currentPath!==e){var i=this,n="replaced.zf.interchange";"IMG"===this.$element[0].nodeName?this.$element.attr("src",e).load(function(){i.currentPath=e}).trigger(n):e.match(/\.(gif|jpg|jpeg|png|svg|tiff)([?#].*)?/i)?this.$element.css({"background-image":"url("+e+")"}).trigger(n):t.get(e,function(s){i.$element.html(s).trigger(n),t(s).foundation(),i.currentPath=e})}}},{key:"destroy",value:function(){}}]),e}();e.defaults={rules:null},e.SPECIAL_QUERIES={landscape:"screen and (orientation: landscape)",portrait:"screen and (orientation: portrait)",retina:"only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)"},Foundation.plugin(e,"Interchange")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
2return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Magellan")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element[0].id||Foundation.GetYoDigits(6,"magellan");this.$targets=t("[data-magellan-target]"),this.$links=this.$element.find("a"),this.$element.attr({"data-resize":e,"data-scroll":e,id:e}),this.$active=t(),this.scrollPos=parseInt(window.pageYOffset,10),this._events()}},{key:"calcPoints",value:function(){var e=this,i=document.body,n=document.documentElement;this.points=[],this.winHeight=Math.round(Math.max(window.innerHeight,n.clientHeight)),this.docHeight=Math.round(Math.max(i.scrollHeight,i.offsetHeight,n.clientHeight,n.scrollHeight,n.offsetHeight)),this.$targets.each(function(){var i=t(this),n=Math.round(i.offset().top-e.options.threshold);i.targetPoint=n,e.points.push(n)})}},{key:"_events",value:function(){var e=this;t("html, body"),{duration:e.options.animationDuration,easing:e.options.animationEasing};t(window).one("load",function(){e.options.deepLinking&&location.hash&&e.scrollToLoc(location.hash),e.calcPoints(),e._updateActive()}),this.$element.on({"resizeme.zf.trigger":this.reflow.bind(this),"scrollme.zf.trigger":this._updateActive.bind(this)}).on("click.zf.magellan",'a[href^="#"]',function(t){t.preventDefault();var i=this.getAttribute("href");e.scrollToLoc(i)})}},{key:"scrollToLoc",value:function(e){var i=Math.round(t(e).offset().top-this.options.threshold/2-this.options.barOffset);t("html, body").stop(!0).animate({scrollTop:i},this.options.animationDuration,this.options.animationEasing)}},{key:"reflow",value:function(){this.calcPoints(),this._updateActive()}},{key:"_updateActive",value:function(){var t,e=parseInt(window.pageYOffset,10);if(e+this.winHeight===this.docHeight)t=this.points.length-1;else if(e<this.points[0])t=0;else{var i=this.scrollPos<e,n=this,s=this.points.filter(function(t,s){return i?e>=t:t-n.options.threshold<=e});t=s.length?s.length-1:0}if(this.$active.removeClass(this.options.activeClass),this.$active=this.$links.eq(t).addClass(this.options.activeClass),this.options.deepLinking){var o=this.$active[0].getAttribute("href");window.history.pushState?window.history.pushState(null,null,o):window.location.hash=o}this.scrollPos=e,this.$element.trigger("update.zf.magellan",[this.$active])}},{key:"destroy",value:function(){if(this.$element.off(".zf.trigger .zf.magellan").find("."+this.options.activeClass).removeClass(this.options.activeClass),this.options.deepLinking){var t=this.$active[0].getAttribute("href");window.location.hash.replace(t,"")}Foundation.unregisterPlugin(this)}}]),e}();e.defaults={animationDuration:500,animationEasing:"linear",threshold:50,activeClass:"active",deepLinking:!1,barOffset:0},Foundation.plugin(e,"Magellan")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this.$lastTrigger=t(),this._init(),this._events(),Foundation.registerPlugin(this,"OffCanvas")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("id");if(this.$element.attr("aria-hidden","true"),t(document).find('[data-open="'+e+'"], [data-close="'+e+'"], [data-toggle="'+e+'"]').attr("aria-expanded","false").attr("aria-controls",e),this.options.closeOnClick)if(t(".js-off-canvas-exit").length)this.$exiter=t(".js-off-canvas-exit");else{var i=document.createElement("div");i.setAttribute("class","js-off-canvas-exit"),t("[data-off-canvas-content]").append(i),this.$exiter=t(i)}this.options.isRevealed=this.options.isRevealed||new RegExp(this.options.revealClass,"g").test(this.$element[0].className),this.options.isRevealed&&(this.options.revealOn=this.options.revealOn||this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split("-")[2],this._setMQChecker()),this.options.transitionTime||(this.options.transitionTime=1e3*parseFloat(window.getComputedStyle(t("[data-off-canvas-wrapper]")[0]).transitionDuration))}},{key:"_events",value:function(){this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"ke
2ydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick&&this.$exiter.length&&this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},{key:"_setMQChecker",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){Foundation.MediaQuery.atLeast(e.options.revealOn)?e.reveal(!0):e.reveal(!1)}).one("load.zf.offcanvas",function(){Foundation.MediaQuery.atLeast(e.options.revealOn)&&e.reveal(!0)})}},{key:"reveal",value:function(t){var e=this.$element.find("[data-close]");t?(this.close(),this.isRevealed=!0,this.$element.off("open.zf.trigger toggle.zf.trigger"),e.length&&e.hide()):(this.isRevealed=!1,this.$element.on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),e.length&&e.show())}},{key:"open",value:function(e,i){if(!this.$element.hasClass("is-open")&&!this.isRevealed){var n=this;t(document.body);this.options.forceTop&&t("body").scrollTop(0),Foundation.Move(this.options.transitionTime,this.$element,function(){t("[data-off-canvas-wrapper]").addClass("is-off-canvas-open is-open-"+n.options.position), 3n.$element.addClass("is-open")}),this.$element.attr("aria-hidden","false").trigger("opened.zf.offcanvas"),this.options.closeOnClick&&this.$exiter.addClass("is-visible"),i&&(this.$lastTrigger=i.attr("aria-expanded","true")),this.options.autoFocus&&this.$element.one(Foundation.transitionend(this.$element),function(){n.$element.find("a, button").eq(0).focus()}),this.options.trapFocus&&(t("[data-off-canvas-content]").attr("tabindex","-1"),this._trapFocus())}}},{key:"_trapFocus",value:function(){var t=Foundation.Keyboard.findFocusable(this.$element),e=t.eq(0),i=t.eq(-1);t.off(".zf.offcanvas").on("keydown.zf.offcanvas",function(t){9!==t.which&&9!==t.keycode||(t.target!==i[0]||t.shiftKey||(t.preventDefault(),e.focus()),t.target===e[0]&&t.shiftKey&&(t.preventDefault(),i.focus()))})}},{key:"close",value:function(e){if(this.$element.hasClass("is-open")&&!this.isRevealed){var i=this;t("[data-off-canvas-wrapper]").removeClass("is-off-canvas-open is-open-"+i.options.position),i.$element.removeClass("is-open"),this.$element.attr("aria-hidden","true").trigger("closed.zf.offcanvas"),this.options.closeOnClick&&this.$exiter.removeClass("is-visible"),this.$lastTrigger.attr("aria-expanded","false"),this.options.trapFocus&&t("[data-off-canvas-content]").removeAttr("tabindex")}}},{key:"toggle",value:function(t,e){this.$element.hasClass("is-open")?this.close(t,e):this.open(t,e)}},{key:"_handleKeyboard",value:function(t){27===t.which&&(t.stopPropagation(),t.preventDefault(),this.close(),this.$lastTrigger.focus())}},{key:"destroy",value:function(){this.close(),this.$element.off(".zf.trigger .zf.offcanvas"),this.$exiter.off(".zf.offcanvas"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={closeOnClick:!0,transitionTime:0,position:"left",forceTop:!0,isRevealed:!1,revealOn:null,autoFocus:!0,revealClass:"reveal-for-",trapFocus:!1},Foundation.plugin(e,"OffCanvas")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Orbit"),Foundation.Keyboard.register("Orbit",{ltr:{ARROW_RIGHT:"next",ARROW_LEFT:"previous"},rtl:{ARROW_LEFT:"next",ARROW_RIGHT:"previous"}})}return _createClass(e,[{key:"_init",value:function(){this.$wrapper=this.$element.find("."+this.options.containerClass),this.$slides=this.$element.find("."+this.options.slideClass);var t=this.$element.find("img"),e=this.$slides.filter(".is-active");e.length||this.$slides.eq(0).addClass("is-active"),this.options.useMUI||this.$slides.addClass("no-motionui"),t.length?Foundation.onImagesLoaded(t,this._prepareForOrbit.bind(this)):this._prepareForOrbit(),this.options.bullets&&this._loadBullets(),this._events(),this.options.autoPlay&&this.$slides.length>1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find("."+this.options.boxOfBullets).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new Foundation.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},function(){t.changeSlide(!0)}),this.timer.start()}},{key:"_prepareForOrbit",value:function(){var t=this;this._setWrapperHeight(function(e){t._setSlideHeight(e)})}},{key:"_setWrapperHeight",value:function(e){var i,n=0,s=0;this.$slides.each(function(){i=this.getBoundingClientRect().height,t(this).attr("data-sli
3de",s),s&&t(this).css({position:"relative",display:"none"}),n=i>n?i:n,s++}),s===this.$slides.length&&(this.$wrapper.css({height:n}),e(n))}},{key:"_setSlideHeight",value:function(e){this.$slides.each(function(){t(this).css("max-height",e)})}},{key:"_events",value:function(){var e=this;if(this.$slides.length>1){if(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",function(t){t.preventDefault(),e.changeSlide(!0)}).on("swiperight.zf.orbit",function(t){t.preventDefault(),e.changeSlide(!1)}),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",function(){e.$element.data("clickedOn",!e.$element.data("clickedOn")),e.timer[e.$element.data("clickedOn")?"pause":"start"]()}),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",function(){e.timer.pause()}).on("mouseleave.zf.orbit",function(){e.$element.data("clickedOn")||e.timer.start()})),this.options.navButtons){var i=this.$element.find("."+this.options.nextClass+", ."+this.options.prevClass);i.attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",function(i){i.preventDefault(),e.changeSlide(t(this).hasClass(e.options.nextClass))})}this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",function(){if(/is-active/g.test(this.className))return!1;var i=t(this).data("slide"),n=i>e.$slides.filter(".is-active").data("slide"),s=e.$slides.eq(i);e.changeSlide(n,s,i)}),this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",function(i){Foundation.Keyboard.handleKey(i,"Orbit",{next:function(){e.changeSlide(!0)},previous:function(){e.changeSlide(!1)},handled:function(){t(i.target).is(e.$bullets)&&e.$bullets.filter(".is-active").focus()}})})}}},{key:"changeSlide",value:function(t,e,i){var n=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(n[0].className))return!1;var s,o=this.$slides.first(),a=this.$slides.last(),r=t?"Right":"Left",l=t?"Left":"Right",u=this;s=e?e:t?this.options.infiniteWrap?n.next("."+this.options.slideClass).length?n.next("."+this.options.slideClass):o:n.next("."+this.options.slideClass):this.options.infiniteWrap?n.prev("."+this.options.slideClass).length?n.prev("."+this.options.slideClass):a:n.prev("."+this.options.slideClass),s.length&&(this.options.bullets&&(i=i||this.$slides.index(s),this._updateBullets(i)),this.options.useMUI?(Foundation.Motion.animateIn(s.addClass("is-active").css({position:"absolute",top:0}),this.options["animInFrom"+r],function(){s.css({position:"relative",display:"block"}).attr("aria-live","polite")}),Foundation.Motion.animateOut(n.removeClass("is-active"),this.options["animOutTo"+l],function(){n.removeAttr("aria-live"),u.options.autoPlay&&!u.timer.isPaused&&u.timer.restart()})):(n.removeClass("is-active is-in").removeAttr("aria-live").hide(),s.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[s]))}},{key:"_updateBullets",value:function(t){var e=this.$element.find("."+this.options.boxOfBullets).find(".is-active").removeClass("is-active").blur(),i=e.find("span:last").detach();this.$bullets.eq(t).addClass("is-active").append(i)}},{key:"destroy",value:function(){this.$element.off(".zf.orbit").find("*").off(".zf.orbit").end().hide(),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={bullets:!0,navButtons:!0,animInFromRight:"slide-in-right",animOutToRight:"slide-out-right",animInFromLeft:"slide-in-left",animOutToLeft:"slide-out-left",autoPlay:!0,timerDelay:5e3,infiniteWrap:!0,swipe:!0,pauseOnHover:!0,accessible:!0,containerClass:"orbit-container",slideClass:"orbit-slide",boxOfBullets:"orbit-bullets",nextClass:"orbit-next",prevClass:"orbit-previous",useMUI:!0},Foundation.plugin(e,"Orbit")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=t(i),this.rules=this.$element.data("responsive-menu"),this.currentMq=null,this.currentPlugin=null,this._init(),this._events(),Foundation.registerPlugin(this,"ResponsiveMenu")}return _createClass(e,[{key:"_init",value:function(){if("string"==typeof this.rules){for(var e={},n=this.rules.split(" "),s=0;s<n.length;s++){var o=n[s].split("-"),a=o.length>1?o[0]:"small",r=o.length>1?o[1]:o[0];null!==i[r]&&(e[a]=i[r])}this.rules=e}t.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_events",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){e._checkMediaQueries()})}},{key:"_checkMediaQueries",value:function(){var e,n=this;t.each(this.rules,function(t){Foundation.MediaQuery.atLeast(t)&&(e=t)}),e&&(this.currentPlugin instanceof this.rules[e].plugin||(t.each(i,function(t,e){n.$element.removeClass(e.cssClass)}),this.$element.addClass(this.rules[e].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[e].plugin(this.$element,{}
3)))}},{key:"destroy",value:function(){this.currentPlugin.destroy(),t(window).off(".zf.ResponsiveMenu"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={};var i={dropdown:{cssClass:"dropdown",plugin:Foundation._plugins["dropdown-menu"]||null},drilldown:{cssClass:"drilldown",plugin:Foundation._plugins.drilldown||null},accordion:{cssClass:"accordion-menu",plugin:Foundation._plugins["accordion-menu"]||null}};Foundation.plugin(e,"ResponsiveMenu")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=t(i),this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),this._events(),Foundation.registerPlugin(this,"ResponsiveToggle")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.data("responsive-toggle");e||console.error("Your tab bar needs an ID of a Menu as the value of data-tab-bar."),this.$targetMenu=t("#"+e),this.$toggler=this.$element.find("[data-toggle]"),this._update()}},{key:"_events",value:function(){t(window).on("changed.zf.mediaquery",this._update.bind(this)),this.$toggler.on("click.zf.responsiveToggle",this.toggleMenu.bind(this))}},{key:"_update",value:function(){Foundation.MediaQuery.atLeast(this.options.hideFor)?(this.$element.hide(),this.$targetMenu.show()):(this.$element.show(),this.$targetMenu.hide())}},{key:"toggleMenu",value:function(){Foundation.MediaQuery.atLeast(this.options.hideFor)||(this.$targetMenu.toggle(0),this.$element.trigger("toggled.zf.responsiveToggle"))}},{key:"destroy",value:function(){}}]),e}();e.defaults={hideFor:"medium"},Foundation.plugin(e,"ResponsiveToggle")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){function e(){return/iP(ad|hone|od).*OS/.test(window.navigator.userAgent)}var i=function(){function i(e,n){_classCallCheck(this,i),this.$element=e,this.options=t.extend({},i.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Reveal"),Foundation.Keyboard.register("Reveal",{ENTER:"open",SPACE:"open",ESCAPE:"close",TAB:"tab_forward",SHIFT_TAB:"tab_backward"})}return _createClass(i,[{key:"_init",value:function(){if(this.id=this.$element.attr("id"),this.isActive=!1,this.cached={mq:Foundation.MediaQuery.current},this.isiOS=e(),this.isiOS&&this.$element.addClass("is-ios"),this.$anchor=t(t('[data-open="'+this.id+'"]').length?'[data-open="'+this.id+'"]':'[data-toggle="'+this.id+'"]'),this.$anchor.length){var i=this.$anchor[0].id||Foundation.GetYoDigits(6,"reveal");this.$anchor.attr({"aria-controls":this.id,id:i,"aria-haspopup":!0,tabindex:0}),this.$element.attr({"aria-labelledby":i})}(this.options.fullScreen||this.$element.hasClass("full"))&&(this.options.fullScreen=!0,this.options.overlay=!1),this.options.overlay&&!this.$overlay&&(this.$overlay=this._makeOverlay(this.id)),this.$element.attr({role:"dialog","aria-hidden":!0,"data-yeti-box":this.id,"data-resize":this.id}),this.$overlay?this.$element.detach().appendTo(this.$overlay):(this.$element.detach().appendTo(t("body")),this.$element.addClass("without-overlay")),this._events(),this.options.deepLink&&window.location.hash==="#"+this.id&&t(window).one("load.zf.reveal",this.open.bind(this))}},{key:"_makeOverlay",value:function(e){var i=t("<div></div>").addClass("reveal-overlay").attr({tabindex:-1,"aria-hidden":!0}).appendTo("body");return i}},{key:"_updatePosition",value:function(){var e,i,n=this.$element.outerWidth(),s=t(window).width(),o=this.$element.outerHeight(),a=t(window).height();e="auto"===this.options.hOffset?parseInt((s-n)/2,10):parseInt(this.options.hOffset,10),i="auto"===this.options.vOffset?o>a?parseInt(Math.min(100,a/10),10):parseInt((a-o)/4,10):parseInt(this.options.vOffset,10),this.$element.css({top:i+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:e+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}
3),this.$anchor.length&&this.$anchor.on("keydown.zf.reveal",function(t){13!==t.which&&32!==t.which||(t.stopPropagation(),t.preventDefault(),e.open())}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.reveal",function(i){i.target===e.$element[0]||t.contains(e.$element[0],i.target)||e.close()}),this.options.deepLink&&t(window).on("popstate.zf.reveal:"+this.id,this._handleState.bind(this))}},{key:"_handleState",value:function(t){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"open",value:function(){var e=this;if(this.options.deepLink){var i="#"+this.id;window.history.pushState?window.history.pushState(null,null,i):window.location.hash=i}if(this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&this.$overlay.css({visibility:""}).hide(),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),this.options.animationIn?(this.options.overlay&&Foundation.Motion.animateIn(this.$overlay,"fade-in"),Foundation.Motion.animateIn(this.$element,this.options.animationIn,function(){e.focusableElements=Foundation.Keyboard.findFocusable(e.$element)})):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),this.$element.trigger("open.zf.reveal"),this.isiOS){var n=window.pageYOffset;t("html, body").addClass("is-reveal-open").scrollTop(n)}else t("body").addClass("is-reveal-open");t("body").addClass("is-reveal-open").attr("aria-hidden",!(!this.options.overlay&&!this.options.fullScreen)),setTimeout(function(){e._extraHandlers()},0)}},{key:"_extraHandlers",value:function(){var e=this;this.focusableElements=Foundation.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||t("body").on("click.zf.reveal",function(i){i.target===e.$element[0]||t.contains(e.$element[0],i.target)||e.close()}),this.options.closeOnEsc&&t(window).on("keydown.zf.reveal",function(t){Foundation.Keyboard.handleKey(t,"Reveal",{close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())}})}),this.$element.on("keydown.zf.reveal",function(i){var n=t(this);Foundation.Keyboard.handleKey(i,"Reveal",{tab_forward:function(){e.$element.find(":focus").is(e.focusableElements.eq(-1))&&(e.focusableElements.eq(0).focus(),i.preventDefault()),0===e.focusableElements.length&&i.preventDefault()},tab_backward:function(){(e.$element.find(":focus").is(e.focusableElements.eq(0))||e.$element.is(":focus"))&&(e.focusableElements.eq(-1).focus(),i.preventDefault()),0===e.focusableElements.length&&i.preventDefault()},open:function(){e.$element.find(":focus").is(e.$element.find("[data-close]"))?setTimeout(function(){e.$anchor.focus()},1):n.is(e.focusableElements)&&e.open()},close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())}})})}},{key:"close",value:function(){function e(){i.isiOS?t("html, body").removeClass("is-reveal-open"):t("body").removeClass("is-reveal-open"),t("body").attr({"aria-hidden":!1,tabindex:""}),i.$element.attr("aria-hidden",!0),i.$element.trigger("closed.zf.reveal")}if(!this.isActive||!this.$element.is(":visible"))return!1;var i=this;this.options.animationOut?(this.options.overlay?Foundation.Motion.animateOut(this.$overlay,"fade-out",e):e(),Foundation.Motion.animateOut(this.$element,this.options.animationOut)):(this.options.overlay?this.$overlay.hide(0,e):e(),this.$element.hide(this.options.hideDelay)),this.options.closeOnEsc&&t(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&t("body").off("click.zf.reveal"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,i.options.deepLink&&(window.history.replaceState?window.history.replaceState("",document.title,window.location.pathname):window.location.hash="")}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"destroy",value:function(){this.options.overlay&&(this.$element.appendTo(t("body")),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),t(window).off(".zf.reveal:"+this.id
3),Foundation.unregisterPlugin(this)}}]),i}();i.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,btmOffsetPct:10,overlay:!0,resetOnClose:!1,deepLink:!1},Foundation.plugin(i,"Reveal")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){function e(t,e){return t/e}function i(t,e,i,n){return Math.abs(t.position()[e]+t[n]()/2-i)}var n=function(){function n(e,i){_classCallCheck(this,n),this.$element=e,this.options=t.extend({},n.defaults,this.$element.data(),i),this._init(),Foundation.registerPlugin(this,"Slider"),Foundation.Keyboard.register("Slider",{ltr:{ARROW_RIGHT:"increase",ARROW_UP:"increase",ARROW_DOWN:"decrease",ARROW_LEFT:"decrease",SHIFT_ARROW_RIGHT:"increase_fast",SHIFT_ARROW_UP:"increase_fast",SHIFT_ARROW_DOWN:"decrease_fast",SHIFT_ARROW_LEFT:"decrease_fast"},rtl:{ARROW_LEFT:"increase",ARROW_RIGHT:"decrease",SHIFT_ARROW_LEFT:"increase_fast",SHIFT_ARROW_RIGHT:"decrease_fast"}})}return _createClass(n,[{key:"_init",value:function(){this.inputs=this.$element.find("input"),this.handles=this.$element.find("[data-slider-handle]"),this.$handle=this.handles.eq(0),this.$input=this.inputs.length?this.inputs.eq(0):t("#"+this.$handle.attr("aria-controls")),this.$fill=this.$element.find("[data-slider-fill]").css(this.options.vertical?"height":"width",0);var e=!1,i=this;(this.options.disabled||this.$element.hasClass(this.options.disabledClass))&&(this.options.disabled=!0,this.$element.addClass(this.options.disabledClass)),this.inputs.length||(this.inputs=t().add(this.$input),this.options.binding=!0),this._setInitAttr(0),this._events(this.$handle),this.handles[1]&&(this.options.doubleSided=!0,this.$handle2=this.handles.eq(1),this.$input2=this.inputs.length>1?this.inputs.eq(1):t("#"+this.$handle2.attr("aria-controls")),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),e=!0,this._setHandlePos(this.$handle,this.options.initialStart,!0,function(){i._setHandlePos(i.$handle2,i.options.initialEnd,!0)}),this._setInitAttr(1),this._events(this.$handle2)),e||this._setHandlePos(this.$handle,this.options.initialStart,!0)}},{key:"_setHandlePos",value:function(t,i,n,s){i=parseFloat(i),i<this.options.start?i=this.options.start:i>this.options.end&&(i=this.options.end);var o=this.options.doubleSided;if(o)if(0===this.handles.index(t)){var a=parseFloat(this.$handle2.attr("aria-valuenow"));i=i>=a?a-this.options.step:i}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));i=r>=i?r+this.options.step:i}this.options.vertical&&!n&&(i=this.options.end-i);var l=this,u=this.options.vertical,d=u?"height":"width",h=u?"top":"left",c=t[0].getBoundingClientRect()[d],f=this.$element[0].getBoundingClientRect()[d],p=e(i-this.options.start,this.options.end-this.options.start).toFixed(2),m=(f-c)*p,v=(100*e(m,f)).toFixed(this.options.decimal);i=parseFloat(i.toFixed(this.options.decimal));var g={};if(this._setValues(t,i),o){var w,y=0===this.handles.index(t),b=~~(100*e(c,f));if(y)g[h]=v+"%",w=parseFloat(this.$handle2[0].style[h])-v+b,s&&"function"==typeof s&&s();else{var $=parseFloat(this.$handle[0].style[h]);w=v-(isNaN($)?this.options.initialStart/((this.options.end-this.options.start)/100):$)+b}g["min-"+d]=w+"%"}this.$element.one("finished.zf.animate",function(){l.$element.trigger("moved.zf.slider",[t])});var C=this.$element.data("dragging")?1e3/60:this.options.moveTime;Foundation.Move(C,t,function(){t.css(h,v+"%"),l.options.doubleSided?l.$fill.css(g):l.$fill.css(d,100*p+"%")}),clearTimeout(l.timeout),l.timeout=setTimeout(function(){l.$element.trigger("changed.zf.slider",[t])},l.options.changedDelay)}},{key:"_setInitAttr",value:function(t){var e=this.inputs.eq(t).attr("id")||Foundation.GetYoDigits(6,"slider");this.inputs.eq(t).attr({id:e,max:this.options.end,min:this.options.start,step:this.options.step}),this.handles.eq(t).attr({role:"slider","aria-controls":e,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":0===t?this.options.initialStart:this.options.initialEnd,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var i=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(i).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,n,s){var o,a;if(s)o=this._adjustValue(null,s),a=!0;else{t.preventDefault();var r=this,l=this.options.vertical,u=l?"height":"width",d=l?"top":"left",h=l?t.pageY:t.pageX,c=this.$handle[0].getBoundingClientRect()[u]/2,f=this.$element[0].getBoundingClientRect()[u],p=this.$element.offset()[d]-h,m=p>0?-c:-f>
3p-c?f:Math.abs(p),v=e(m,f);if(o=(this.options.end-this.options.start)*v+this.options.start,Foundation.rtl()&&!this.options.vertical&&(o=this.options.end-o),o=r._adjustValue(null,o),a=!1,!n){var g=i(this.$handle,d,m,u),w=i(this.$handle2,d,m,u);n=w>=g?this.$handle:this.$handle2}}this._setHandlePos(n,o,a)}},{key:"_adjustValue",value:function(t,e){var i,n,s,o,a=this.options.step,r=parseFloat(a/2);return i=t?parseFloat(t.attr("aria-valuenow")):e,n=i%a,s=i-n,o=s+a,0===n?i:i=i>=s+r?o:s}},{key:"_events",value:function(e){if(this.options.disabled)return!1;var i,n=this;if(this.inputs.off("change.zf.slider").on("change.zf.slider",function(e){var i=n.inputs.index(t(this));n._handleEvent(e,n.handles.eq(i),t(this).val())}),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",function(e){return n.$element.data("dragging")?!1:void(t(e.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(e):n._handleEvent(e,n.$handle)))}),this.options.draggable){this.handles.addTouch();var s=t("body");e.off("mousedown.zf.slider").on("mousedown.zf.slider",function(o){e.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),i=t(o.currentTarget),s.on("mousemove.zf.slider",function(t){t.preventDefault(),n._handleEvent(t,i)}).on("mouseup.zf.slider",function(t){n._handleEvent(t,i),e.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")})})}e.off("keydown.zf.slider").on("keydown.zf.slider",function(e){var i,s=t(this),o=n.options.doubleSided?n.handles.index(s):0,a=parseFloat(n.inputs.eq(o).val());Foundation.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decrease_fast:function(){i=a-10*n.options.step},increase_fast:function(){i=a+10*n.options.step},handled:function(){e.preventDefault(),n._setHandlePos(s,i,!0)}})})}},{key:"destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),Foundation.unregisterPlugin(this)}}]),n}();n.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500},Foundation.plugin(n,"Slider")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){function e(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}var i=function(){function i(e,n){_classCallCheck(this,i),this.$element=e,this.options=t.extend({},i.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Sticky")}return _createClass(i,[{key:"_init",value:function(){var e=this.$element.parent("[data-sticky-container]"),i=this.$element[0].id||Foundation.GetYoDigits(6,"sticky"),n=this;e.length||(this.wasWrapped=!0),this.$container=e.length?e:t(this.options.container).wrapInner(this.$element),this.$container.addClass(this.options.containerClass),this.$element.addClass(this.options.stickyClass).attr({"data-resize":i}),this.scrollCount=this.options.checkEvery,this.isStuck=!1,t(window).one("load.zf.sticky",function(){""!==n.options.anchor?n.$anchor=t("#"+n.options.anchor):n._parsePoints(),n._setSizes(function(){n._calc(!1)}),n._events(i.split("-").reverse().join("-"))})}},{key:"_parsePoints",value:function(){var e=this.options.topAnchor,i=this.options.btmAnchor,n=[e,i],s={};if(e&&i)for(var o=0,a=n.length;a>o&&n[o];o++){var r;if("number"==typeof n[o])r=n[o];else{var l=n[o].split(":"),u=t("#"+l[0]);r=u.offset().top,l[1]&&"bottom"===l[1].toLowerCase()&&(r+=u[0].getBoundingClientRect().height)}s[o]=r}else s={0:1,1:document.documentElement.scrollHeight};this.points=s}},{key:"_events",value:function(e){var i=this,n=this.scrollListener="scroll.zf."+e;this.isOn||(this.canStick&&(this.isOn=!0,t(window).off(n).on(n,function(t){0===i.scrollCount?(i.scrollCount=i.options.checkEvery,i._setSizes(function(){i._calc(!1,window.pageYOffset)})):(i.scrollCount--,i._calc(!1,window.pageYOffset))})),this.$element.off("resizeme.zf.trigger").on("resizeme.zf.trigger",function(t,s){i._setSizes(function(){i._calc(!1),i.canStick?i.isOn||i._events(e):i.isOn&&i._pauseListeners(n)})}))}},{key:"_pauseListeners",value:function(e){this.isOn=!1,t(window).off(e),this.$element.trigger("pause.zf.sticky")}},{key:"_calc",value:function(t,e){return t&&this._setSizes(),this.canStick?(e||(e=window.pageYOffset),void(e>=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0))):(this.isStuck&&this._removeSticky(!0),!1)}},{key:"_setSticky",value:function(){var t=this.options.stickTo,e="top"===t?"marginTop":"marginBottom",i="top"===t?"bottom":"top",n={};n[e]=this.options[e]+"em",n[t]=0,n[i]="auto",n.left=this.$container.offset().left+parseInt(window.getComputedStyle(this.$container[0])["padding-left"],10),this.isStuck=!0,this.$element.removeClass("is-anchored is-at-"+i).addClass("is-stuck is-at-"+t).css(n).trigger("sticky.zf.stuckto:"+t)}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,i="top"===e,n={},s=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,o=i?"marginTop":"marginBottom",a=i?"bottom":"top",r=t?"top":"bottom";n[o]=0,t&&!i||i&&!t?(n[e]=s,n[a]=0):(n[e]=0,n[a]=s),n.left="",this.isStuck=!1,this.$element.removeClass("is-stuck is-at-"+e).addClass("is-anchored is-at-"+r).css(n).trigger("sticky.zf.unstuckfrom:"+r)}},{key:"_setSizes",value:function(t){this.canStick=Foundation.MediaQuery.atLeast(this.options.stickyOn),this.canStick||t();var e=this.$container[0].getBoundingClientRect().width,i=window.getComputedStyle(this.$container[0]),n=parseInt(i["padding-right"],10);this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":e-n+"px"});var s=this.$element[0].getBoundingClientRect().height||this.containerHeight;this.containerHeight=s,this.$container.css({height:s}),this.elemHeight=s,this.isStuck&&this.$element.css({left:this.$container.offset().left+parseInt(i["padding-left"],10)}),this._setBreakPoints(s,function(){t&&t()})}},{key:"_setBreakPoints",value:function(t,i){if(!this.canStick){if(!i)return!1;i()}var n=e(this.options.marginTop),s=e(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,a=this.points?this.points[1]:o+this.anchorHeight,r=window.innerHeight;"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""}),Foundation.unregisterPlugin(this)}}]),i}();
3i.defaults={container:"<div data-sticky-container></div>",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",checkEvery:-1},Foundation.plugin(i,"Sticky")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Tabs"),Foundation.Keyboard.register("Tabs",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"previous",ARROW_DOWN:"next",ARROW_LEFT:"previous"})}return _createClass(e,[{key:"_init",value:function(){var e=this;if(this.$tabTitles=this.$element.find("."+this.options.linkClass),this.$tabContent=t('[data-tabs-content="'+this.$element[0].id+'"]'),this.$tabTitles.each(function(){var i=t(this),n=i.find("a"),s=i.hasClass("is-active"),o=n[0].hash.slice(1),a=n[0].id?n[0].id:o+"-label",r=t("#"+o);i.attr({role:"presentation"}),n.attr({role:"tab","aria-controls":o,"aria-selected":s,id:a}),r.attr({role:"tabpanel","aria-hidden":!s,"aria-labelledby":a}),s&&e.options.autoFocus&&n.focus()}),this.options.matchHeight){var i=this.$tabContent.find("img");i.length?Foundation.onImagesLoaded(i,this._setHeight.bind(this)):this._setHeight()}this._events()}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this.options.matchHeight&&t(window).on("changed.zf.mediaquery",this._setHeight.bind(this))}},{key:"_addClickHandler",value:function(){var e=this;this.$element.off("click.zf.tabs").on("click.zf.tabs","."+this.options.linkClass,function(i){i.preventDefault(),i.stopPropagation(),t(this).hasClass("is-active")||e._handleTabChange(t(this))})}},{key:"_addKeyHandler",value:function(){var e=this;e.$element.find("li:first-of-type"),e.$element.find("li:last-of-type");this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",function(i){if(9!==i.which){i.stopPropagation(),i.preventDefault(); 4var n,s,o=t(this),a=o.parent("ul").children("li");a.each(function(i){return t(this).is(o)?void(e.options.wrapOnKeys?(n=0===i?a.last():a.eq(i-1),s=i===a.length-1?a.first():a.eq(i+1)):(n=a.eq(Math.max(0,i-1)),s=a.eq(Math.min(i+1,a.length-1)))):void 0}),Foundation.Keyboard.handleKey(i,"Tabs",{open:function(){o.find('[role="tab"]').focus(),e._handleTabChange(o)},previous:function(){n.find('[role="tab"]').focus(),e._handleTabChange(n)},next:function(){s.find('[role="tab"]').focus(),e._handleTabChange(s)}})}})}},{key:"_handleTabChange",value:function(e){var i=e.find('[role="tab"]'),n=i[0].hash,s=this.$tabContent.find(n),o=this.$element.find("."+this.options.linkClass+".is-active").removeClass("is-active").find('[role="tab"]').attr({"aria-selected":"false"});t("#"+o.attr("aria-controls")).removeClass("is-active").attr({"aria-hidden":"true"}),e.addClass("is-active"),i.attr({"aria-selected":"true"}),s.addClass("is-active").attr({"aria-hidden":"false"}),this.$element.trigger("change.zf.tabs",[e])}},{key:"selectTab",value:function(t){var e;e="object"==typeof t?t[0].id:t,e.indexOf("#")<0&&(e="#"+e);var i=this.$tabTitles.find('[href="'+e+'"]').parent("."+this.options.linkClass);this._handleTabChange(i)}},{key:"_setHeight",value:function(){var e=0;this.$tabContent.find("."+this.options.panelClass).css("height","").each(function(){var i=t(this),n=i.hasClass("is-active");n||i.css({visibility:"hidden",display:"block"});var s=this.getBoundingClientRect().height;n||i.css({visibility:"",display:""}),e=s>e?s:e}).css("height",e+"px")}},{key:"destroy",value:function(){this.$element.find("."+this.options.linkClass).off(".zf.tabs").hide().end().find("."+this.options.panelClass).hide(),this.options.matchHeight&&t(window).off("changed.zf.mediaquery"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,linkClass:"tabs-title",panelClass:"tabs-panel"},Foundation.plugin(e,"Tabs")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
4return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,i.data(),n),this.className="",this._init(),this._events(),Foundation.registerPlugin(this,"Toggler")}return _createClass(e,[{key:"_init",value:function(){var e;this.options.animate?(e=this.options.animate.split(" "),this.animationIn=e[0],this.animationOut=e[1]||null):(e=this.$element.data("toggler"),this.className="."===e[0]?e.slice(1):e);var i=this.$element[0].id;t('[data-open="'+i+'"], [data-close="'+i+'"], [data-toggle="'+i+'"]').attr("aria-controls",i),this.$element.attr("aria-expanded",!this.$element.is(":hidden"))}},{key:"_events",value:function(){this.$element.off("toggle.zf.trigger").on("toggle.zf.trigger",this.toggle.bind(this))}},{key:"toggle",value:function(){this[this.options.animate?"_toggleAnimate":"_toggleClass"]()}},{key:"_toggleClass",value:function(){this.$element.toggleClass(this.className);var t=this.$element.hasClass(this.className);t?this.$element.trigger("on.zf.toggler"):this.$element.trigger("off.zf.toggler"),this._updateARIA(t)}},{key:"_toggleAnimate",value:function(){var t=this;this.$element.is(":hidden")?Foundation.Motion.animateIn(this.$element,this.animationIn,function(){t._updateARIA(!0),this.trigger("on.zf.toggler")}):Foundation.Motion.animateOut(this.$element,this.animationOut,function(){t._updateARIA(!1),this.trigger("off.zf.toggler")})}},{key:"_updateARIA",value:function(t){this.$element.attr("aria-expanded",!!t)}},{key:"destroy",value:function(){this.$element.off(".zf.toggler"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={animate:!1},Foundation.plugin(e,"Toggler")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this.isActive=!1,this.isClick=!1,this._init(),Foundation.registerPlugin(this,"Tooltip")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("aria-describedby")||Foundation.GetYoDigits(6,"tooltip");this.options.positionClass=this._getPositionClass(this.$element),this.options.tipText=this.options.tipText||this.$element.attr("title"),this.template=this.options.template?t(this.options.template):this._buildTemplate(e),this.template.appendTo(document.body).text(this.options.tipText).hide(),this.$element.attr({title:"","aria-describedby":e,"data-yeti-box":e,"data-toggle":e,"data-resize":e}).addClass(this.triggerClass),this.usedPositions=[],this.counter=4,this.classChanged=!1,this._events()}},{key:"_getPositionClass",value:function(t){if(!t)return"";var e=t[0].className.match(/\b(top|left|right)\b/g);return e=e?e[0]:""}},{key:"_buildTemplate",value:function(e){var i=(this.options.tooltipClass+" "+this.options.positionClass+" "+this.options.templateClasses).trim(),n=t("<div></div>").addClass(i).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:e});return n}},{key:"_reposition",value:function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.template.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.template.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.template.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):this.template.removeClass(t),this.classChanged=!0,this.counter--}},{key:"_setPosition",value:function(){var t=this._getPositionClass(this.template),e=Foundation.Box.GetDimensions(this.template),i=Foundation.Box.GetDimensions(this.$element),n="left"===t?"left":"right"===t?"left":"top",s="top"===n?"height":"width";"height"===s?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!Foundation.Box.ImNotTouchingYou(this.template))return this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:i.windowDims.width-2*this.options.hOffset,height:"auto"}),!1;for(this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center "+(t||"bottom"),this.options.vOffset,this.options.hOffset));!Foundation.Box.ImNotTouchingYou(this.template)&&this.counter;)this._reposition(t),this._setPosition()}},{key:"show",value:function(){if("all"!==this.options.showOn&&!Foundation.MediaQuery.atLeast(this.options.showOn))return!1;var t=this;this.template.css("visibility","hidden").show(),this._setPosition(),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),t.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,function(){}),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,function(){t.isActive=!1,t.isClick=!1,t.classChanged&&(t.template.removeClass(t._getPositionClass(t.template)).addClass(t.o
4ptions.positionClass),t.usedPositions=[],t.counter=4,t.classChanged=!1)}),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e=(this.template,!1);this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",function(e){t.isActive||(t.timeout=setTimeout(function(){t.show()},t.options.hoverDelay))}).on("mouseleave.zf.tooltip",function(i){clearTimeout(t.timeout),(!e||!t.isClick&&t.options.clickOpen)&&t.hide()}),this.options.clickOpen&&this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick?t.hide():(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())}),this.options.disableForTouch||this.$element.on("tap.zf.tooltip touchend.zf.tooltip",function(e){t.isActive?t.hide():t.show()}),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",function(i){return e=!0,t.isClick?!1:void t.show()}).on("focusout.zf.tooltip",function(i){e=!1,t.isClick=!1,t.hide()}).on("resizeme.zf.trigger",function(){t.isActive&&t._setPosition()})}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tootip").removeAttr("aria-describedby").removeAttr("data-yeti-box").removeAttr("data-toggle").removeAttr("data-resize"),this.template.remove(),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={disableForTouch:!1,hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,positionClass:"",vOffset:10,hOffset:12},Foundation.plugin(e,"Tooltip")}(jQuery); 5'use strict'; 6 7// Polyfill for requestAnimationFrame 8(function() { 9 if (!Date.now) 10 Date.now = function() { return new Date().getTime(); }; 11 12 var vendors = ['webkit', 'moz']; 13 for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { 14 var vp = vendors[i]; 15 window.requestAnimationFrame = window[vp+'RequestAnimationFrame']; 16 window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame'] 17 || window[vp+'CancelRequestAnimationFrame']); 18 } 19 if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) 20 || !window.requestAnimationFrame || !window.cancelAnimationFrame) { 21 var lastTime = 0; 22 window.requestAnimationFrame = function(callback) { 23 var now = Date.now(); 24 var nextTime = Math.max(lastTime + 16, now); 25 return setTimeout(function() { callback(lastTime = nextTime); }, 26 nextTime - now); 27 }; 28 window.cancelAnimationFrame = clearTimeout; 29 } 30})(); 31 32var initClasses = ['mui-enter', 'mui-leave']; 33var activeClasses = ['mui-enter-active', 'mui-leave-active']; 34 35// Find the right "transitionend" event for this browser 36var endEvent = (function() { 37 var transitions = { 38 'transition': 'transitionend', 39 'WebkitTransition': 'webkitTransitionEnd', 40 'MozTransition': 'transitionend', 41 'OTransition': 'otransitionend' 42 } 43 var elem = window.document.createElement('div'); 44 45 for (var t in transitions) { 46 if (typeof elem.style[t] !== 'undefined') { 47 return transitions[t]; 48 } 49 } 50 51 return null; 52})(); 53 54function animate(isIn, element, animation, cb) { 55 element = $(element).eq(0); 56 57 if (!element.length) return; 58 59 if (endEvent === null) { 60 isIn ? element.show() : element.hide(); 61 cb(); 62 return; 63 } 64 65 var initClass = isIn ? initClasses[0] : initClasses[1]; 66 var activeClass = isIn ? activeClasses[0] : activeClasses[1]; 67 68 // Set up the animation 69 reset(); 70 element.addClass(animation); 71 element.css('transition', 'none'); 72 requestAnimationFrame(function() { 73 element.addClass(initClass); 74 if (isIn) element.show(); 75 }); 76 77 // Start the animation 78 requestAnimationFrame(function() { 79 element[0].offsetWidth; 80 element.css('transition', ''); 81 element.addClass(activeClass); 82 }); 83 84 // Clean up the animation when it finishes 85 element.one('transitionend', finish); 86 87 // Hides the element (for out animations), resets the element, and runs a callback 88 function finish() { 89 if (!isIn) element.hide(); 90 reset(); 91 if (cb) cb.apply(element); 92 } 93 94 // Resets transitions and removes motion-specific classes 95 function reset() { 96 element[0].style.transitionDuration = 0; 97 element.removeClass(initClass + ' ' + activeClass + ' ' + animation); 98 } 99} 100 101var MotionUI = { 102 animateIn: function(element, animation, cb) { 103 animate(true, element, animation, cb); 104 }, 105 106 animateOut: function(element, animation, cb) { 107 animate(false, element, animation, cb); 108 } 109} 110 111window.whatInput = (function() { 112 113 'use strict'; 114 115 /* 116 --------------- 117 variables 118 --------------- 119 */ 120 121 // array of actively pressed keys 122 var activeKeys = []; 123 124 // cache document.body 125 var body; 126 127 // boolean: true if touch buffer timer is running 128 var buffer = false;
129 130 // the last used input type 131 var currentInput = null; 132 133 // `input` types that don't accept text 134 var nonTypingInputs = [ 135 'button', 136 'checkbox', 137 'file', 138 'image', 139 'radio', 140 'reset', 141 'submit' 142 ]; 143 144 // detect version of mouse wheel event to use 145 // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel 146 var mouseWheel = detectWheel(); 147 148 // list of modifier keys commonly used with the mouse and 149 // can be safely ignored to prevent false keyboard detection 150 var ignoreMap = [ 151 16, // shift 152 17, // control 153 18, // alt 154 91, // Windows key / left Apple cmd 155 93 // Windows menu / right Apple cmd 156 ]; 157 158 // mapping of events to input types 159 var inputMap = { 160 'keydown': 'keyboard', 161 'keyup': 'keyboard', 162 'mousedown': 'mouse', 163 'mousemove': 'mouse', 164 'MSPointerDown': 'pointer', 165 'MSPointerMove': 'pointer', 166 'pointerdown': 'pointer', 167 'pointermove': 'pointer', 168 'touchstart': 'touch' 169 }; 170 171 // add correct mouse wheel event mapping to `inputMap` 172 inputMap[detectWheel()] = 'mouse'; 173 174 // array of all used input types 175 var inputTypes = []; 176 177 // mapping of key codes to a common name 178 var keyMap = { 179 9: 'tab', 180 13: 'enter', 181 16: 'shift', 182 27: 'esc', 183 32: 'space', 184 37: 'left', 185 38: 'up', 186 39: 'right', 187 40: 'down' 188 }; 189 190 // map of IE 10 pointer events 191 var pointerMap = { 192 2: 'touch', 193 3: 'touch', // treat pen like touch 194 4: 'mouse' 195 }; 196 197 // touch buffer timer 198 var timer; 199 200 201 /* 202 --------------- 203 functions 204 --------------- 205 */ 206 207 // allows events that are also triggered to be filtered out for `touchstart` 208 function eventBuffer() { 209 clearTimer(); 210 setInput(event); 211 212 buffer = true; 213 timer = window.setTimeout(function() { 214 buffer = false; 215 }, 650); 216 } 217 218 function bufferedEvent(event) { 219 if (!buffer) setInput(event); 220 } 221 222 function unBufferedEvent(event) { 223 clearTimer(); 224 setInput(event); 225 } 226 227 function clearTimer() { 228 window.clearTimeout(timer); 229 } 230 231 function setInput(event) { 232 var eventKey = key(event); 233 var value = inputMap[event.type]; 234 if (value === 'pointer') value = pointerType(event); 235 236 // don't do anything if the value matches the input type already set 237 if (currentInput !== value) { 238 var eventTarget = target(event); 239 var eventTargetNode = eventTarget.nodeName.toLowerCase(); 240 var eventTargetType = (eventTargetNode === 'input') ? eventTarget.getAttribute('type') : null; 241 242 if ( 243 (// only if the user flag to allow typing in form fields isn't set 244 !body.hasAttribute('data-whatinput-formtyping') && 245 246 // only if currentInput has a value 247 currentInput && 248 249 // only if the input is `keyboard` 250 value === 'keyboard' && 251 252 // not if the key is `TAB` 253 keyMap[eventKey] !== 'tab' && 254 255 // only if the target is a form input that accepts text 256 ( 257 eventTargetNode === 'textarea' || 258 eventTargetNode === 'select' || 259 (eventTargetNode === 'input' && nonTypingInputs.indexOf(eventTargetType) < 0) 260 )) || ( 261 // ignore modifier keys 262 ignoreMap.indexOf(eventKey) > -1 263 ) 264 ) { 265 // ignore keyboard typing 266 } else { 267 switchInput(value); 268 } 269 } 270 271 if (value === 'keyboard') logKeys(eventKey); 272 } 273 274 function switchInput(string) { 275 currentInput = string; 276 body.setAttribute('data-whatinput', currentInput); 277 278 if (inputTypes.indexOf(currentInput) === -1) inputTypes.push(currentInput); 279 } 280 281 function key(event) { 282 return (event.keyCode) ? event.keyCode : event.which; 283 } 284 285 function target(event) { 286 return event.target || event.srcElement; 287 } 288 289 function pointerType(event) { 290 if (typeof event.pointerType === 'number') { 291 return pointerMap[event.pointerType]; 292 } else { 293 return (event.pointerType === 'pen') ? 'touch' : event.pointerType; // treat pen like touch 294 } 295 } 296 297 // keyboard logging 298 function logKeys(eventKey) { 299 if (activeKeys.indexOf(keyMap[eventKey]) === -1 && keyMap[eventKey]) activeKeys.push(keyMap[eventKey]); 300 } 301 302 function unLogKeys(event) { 303 var eventKey = key(event); 304 var arrayPos = activeKeys.indexOf(keyMap[eventKey]); 305 306 if (arrayPos !== -1) activeKeys.splice(arrayPos, 1); 307 } 308 309 function bindEvents() { 310 body = document.body; 311 312 // pointer events (mouse, pen, touch) 313 if (window.PointerEvent) { 314 body.addEventListener('pointerdown', bufferedEvent); 315 body.addEventListener('pointermove', bufferedEvent); 316 } else if (window.MSPointerEvent) { 317 body.addEventListener('MSPointerDown', bufferedEvent); 318 body.addEventListener('MSPointerMove', bufferedEvent); 319 } else { 320 321 // mouse events 322 body.addEventListener('mousedown', bufferedEvent); 323 body.addEventListener('mousemove', bufferedEvent); 324 325 // touch events 326 if ('ontouchstart' in window) { 327 body.addEventListener('touchstart', eventBuffer); 328 } 329 } 330 331 // mouse wheel 332 body.addEventListener(mouseWheel, bufferedEvent); 333 334 // keyboard events 335 body.addEventListener('keydown', unBufferedEvent); 336 body.addEventListener('keyup', unBufferedEvent); 337 document.addEventListener('keyup', unLogKeys); 338 } 339 340 341 /* 342 --------------- 343 utilities 344 --------------- 345 */ 346 347 // detect version of mouse wheel event to use 348 // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel 349 function detectWheel() { 350 return mouseWheel = 'onwheel' in document.createElement('div') ? 351 'wheel' : // Modern browsers support "wheel" 352 353 document.onmousewheel !== undefined ? 354 'mousewheel' : // Webkit and IE support at least "mousewheel" 355 'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox 356 } 357 358 359 /* 360 --------------- 361 init 362 363 don't start script unless browser cuts the mustard, 364 also passes if polyfills are used 365 --------------- 366 */ 367 368 if ( 369 'addEventListener' in window && 370 Array.prototype.indexOf 371 ) { 372 373 // if the dom is already ready already (script was placed at bottom of <body>
373) 374 if (document.body) { 375 bindEvents(); 376 377 // otherwise wait for the dom to load (script was placed in the <head>) 378 } else { 379 document.addEventListener('DOMContentLoaded', bindEvents); 380 } 381 } 382 383 384 /* 385 --------------- 386 api 387 --------------- 388 */ 389 390 return { 391 392 // returns string: the current input type 393 ask: function() { return currentInput; }, 394 395 // returns array: currently pressed keys 396 keys: function() { return activeKeys; }, 397 398 // returns array: all the detected input types 399 types: function() { return inputTypes; }, 400 401 // accepts string: manually set the input type 402 set: switchInput 403 }; 404 405}()); 406 407/* 408 _ _ _ _ 409 ___| (_) ___| | __ (_)___ 410/ __| | |/ __| |/ / | / __| 411\__ \ | | (__| < _ | \__ \ 412|___/_|_|\___|_|\_(_)/ |___/ 413 |__/ 414 415 Version: 1.5.9 416 Author: Ken Wheeler 417 Website: http://kenwheeler.github.io 418 Docs: http://kenwheeler.github.io/slick 419 Repo: http://github.com/kenwheeler/slick 420 Issues: http://github.com/kenwheeler/slick/issues 421 422 */ 423!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){"use strict";var b=window.Slick||{};b=function(){function c(c,d){var f,e=this;e.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:a(c),appendDots:a(c),arrows:!0,asNavFor:null,prevArrow:'<button type="button" data-role="none" class="slick-prev" aria-label="Previous" tabindex="0" role="button">Previous</button>',nextArrow:'<button type="button" data-role="none" class="slick-next" aria-label="Next" tabindex="0" role="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(a,b){return'<button type="button" data-role="none" role="button" aria-required="false" tabindex="0">'+(b+1)+"</button>"},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!1
vendor: 38,833 bytes, lines 423-424
423,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},e.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},a.extend(e,e.initials),e.activeBreakpoint=null,e.animType=null,e.animProp=null,e.breakpoints=[],e.breakpointSettings=[],e.cssTransitions=!1,e.hidden="hidden",e.paused=!1,e.positionProp=null,e.respondTo=null,e.rowCount=1,e.shouldClick=!0,e.$slider=a(c),e.$slidesCache=null,e.transformType=null,e.transitionType=null,e.visibilityChange="visibilitychange",e.windowWidth=0,e.windowTimer=null,f=a(c).data("slick")||{},e.options=a.extend({},e.defaults,f,d),e.currentSlide=e.options.initialSlide,e.originalSettings=e.options,"undefined"!=typeof document.mozHidden?(e.hidden="mozHidden",e.visibilityChange="mozvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(e.hidden="webkitHidden",e.visibilityChange="webkitvisibilitychange"),e.autoPlay=a.proxy(e.autoPlay,e),e.autoPlayClear=a.proxy(e.autoPlayClear,e),e.changeSlide=a.proxy(e.changeSlide,e),e.clickHandler=a.proxy(e.clickHandler,e),e.selectHandler=a.proxy(e.selectHandler,e),e.setPosition=a.proxy(e.setPosition,e),e.swipeHandler=a.proxy(e.swipeHandler,e),e.dragHandler=a.proxy(e.dragHandler,e),e.keyHandler=a.proxy(e.keyHandler,e),e.autoPlayIterator=a.proxy(e.autoPlayIterator,e),e.instanceUid=b++,e.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,e.registerBreakpoints(),e.init(!0),e.checkResponsive(!0)}var b=0;return c}(),b.prototype.addSlide=b.prototype.slickAdd=function(b,c,d){var e=this;if("boolean"==typeof c)d=c,c=null;else if(0>c||c>=e.slideCount)return!1;e.unload(),"number"==typeof c?0===c&&0===e.$slides.length?a(b).appendTo(e.$slideTrack):d?a(b).insertBefore(e.$slides.eq(c)):a(b).insertAfter(e.$slides.eq(c)):d===!0?a(b).prependTo(e.$slideTrack):a(b).appendTo(e.$slideTrack),e.$slides=e.$slideTrack.children(this.options.slide),e.$slideTrack.children(this.options.slide).detach(),e.$slideTrack.append(e.$slides),e.$slides.each(function(b,c){a(c).attr("data-slick-index",b)}),e.$slidesCache=e.$slides,e.reinit()},b.prototype.animateHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.animate({height:b},a.options.speed)}},b.prototype.animateSlide=function(b,c){var d={},e=this;e.animateHeight(),e.options.rtl===!0&&e.options.vertical===!1&&(b=-b),e.transformsEnabled===!1?e.options.vertical===!1?e.$slideTrack.animate({left:b},e.options.speed,e.options.easing,c):e.$slideTrack.animate({top:b},e.options.speed,e.options.easing,c):e.cssTransitions===!1?(e.options.rtl===!0&&(e.currentLeft=-e.currentLeft),a({animStart:e.currentLeft}).animate({animStart:b},{duration:e.options.speed,easing:e.options.easing,step:function(a){a=Math.ceil(a),e.options.vertical===!1?(d[e.animType]="translate("+a+"px, 0px)",e.$slideTrack.css(d)):(d[e.animType]="translate(0px,"+a+"px)",e.$slideTrack.css(d))},complete:function(){c&&c.call()}})):(e.applyTransition(),b=Math.ceil(b),e.options.vertical===!1?d[e.animType]="translate3d("+b+"px, 0px, 0px)":d[e.animType]="translate3d(0px,"+b+"px, 0px)",e.$slideTrack.css(d),c&&setTimeout(function(){e.disableTransition(),c.call()},e.options.speed))},b.prototype.asNavFor=function(b){var c=this,d=c.options.asNavFor;d&&null!==d&&(d=a(d).not(c.$slider)),null!==d&&"object"==typeof d&&d.each(function(){var c=a(this).slick("getSlick");c.unslicked||c.slideHandler(b,!0)})},b.prototype.applyTransition=function(a){var b=this,c={};b.options.fade===!1?c[b.transitionType]=b.transformType+" "+b.options.speed+"ms "+b.options.cssEase:c[b.transitionType]="opacity "+b.options.speed+"ms "+b.options.cssEase,b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.autoPlay=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer),a.slideCount>a.options.slidesToShow&&a.paused!==!0&&(a.autoPlayTimer=setInterval(a.autoPlayIterator,a.options.autoplaySpeed))},b.prototype.autoPlayClear=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer)},b.prototype.autoPlayIterator=function(){var a=this;a.options.infinite===!1?1===a.direction?(a.currentSlide+1===a.slideCount-1&&(a.direction=0),a.slideHandler(a.currentSlide+a.options.slidesToScroll)):(a.currentSlide-1===0&&(a.direction=1),a.slideHandler(a.currentSlide-a.options.slidesToScroll)):a.slideHandler(a.currentSlide+a.options.slidesToScroll)},b.prototype.buildArrows=function(){var b=this;b.options.arrows===!0&&(b.$prevArrow=a(b.options.prevArrow).addClass("slick-arrow"),b.$nextArrow=a(b.options.nextArrow).addClass("slick-arrow"),b.slideCount>b.options.slidesToShow?(b.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.prependTo(b.options.appendArrows),b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.appendTo(b.options.appendArrows),b.options.infinite!==!0&&b.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):b.$prevArrow.add(b.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},b.prototype.buildDots=function(){var c,d,b=this;if(b.options.dots===!0&&b.slideCount>b.options.slidesToShow){for(d='<ul class="'+b.options.dotsClass+'">',c=0;c<=b.getDotCount();c+=1)d+="<li>"+b.options.customPaging.call(this,b,c)+"</li>";d+="</ul>",b.$dots=a(d).appendTo(b.options.appendDots),b.$dots.find("li").first().addClass("slick-active").attr("aria-hidden","false")}},b.prototype.buildOut=function(){var b=this;b.$slides=b.$slider.children(b.options.slide+":not(.slick-cloned)").addClass("slick-slide"),b.slideCount=b.$slides.length,b.$slides.each(function(b,c){a(c).attr("data-slick-index",b).data("originalStyling",a(c).attr("style")||"")}),b.$slider.addClass("slick-slider"),b.$slideTrack=0===b.slideCount?a('<div class="slick-track"/>').appendTo(b.$slider):b.$slides.wrapAll('<div class="slick-track"/>').parent(),b.$list=b.$slideTrack.wrap('<div aria-live="polite" class="slick-list"/>').parent(),b.$slideTrack.css("opacity",0),(b.options.centerMode===!0||b.options.swipeToSlide===!0)&&(b.options.slidesToScroll=1),a("img[data-lazy]",b.$slider).not("[src]").addClass("slick-loading"),b.setupInfinite(),b.buildArrows(),b.buildDots(),b.updateDots(),b.setSlideClasses("number"==typeof b.currentSlide?b.currentSlide:0),b.options.draggable===!0&&b.$list.addClass("draggable")},b.prototype.buildRows=function(){var b,c,d,e,f,g,h,a=this;if(e=document.createDocumentFragment(),g=a.$slider.children(),a.options.rows>1){for(h=a.options.slidesPerRow*a.options.rows,f=Math.ceil(g.length/h),b=0;f>b;b++){var i=document.createElement("div");for(c=0;c<a.options.rows;c++){var j=document.createElement("div");for(d=0;d<a.options.slidesPerRow;d++){var k=b*h+(c*a.options.slidesPerRow+d);g.get(k)&&j.appendChild(g.get(k))}i.appendChild(j)}e.appendChild(i)}a.$slider.html(e),a.$slider.children().children().children().css({width:100/a.options.slidesPerRow+"%",display:"inline-block"})}},b.prototype.checkResponsive=function(b,c){var e,f,g,d=this,h=!1,i=d.$slider.width(),j=window.innerWidth||a(window).width();if("window"===d.respondTo?g=j:"slider"===d.respondTo?g=i:"min"===d.respondTo&&(g=Math.min(j,i)),d.options.responsive&&d.options.responsive.length&&null!==d.options.responsive){f=null;for(e in d.breakpoints)d.breakpoints.hasOwnProperty(e)&&(d.originalSettings.mobileFirst===!1?g<d.breakpoints[e]&&(f=d.breakpoints[e]):g>d.breakpoints[e]&&(f=d.breakpoints[e]));null!==f?null!==d.activeBreakpoint?(f!==d.activeBreakpoint||c)&&(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):null!==d.activeBreakpoint&&(d.activeBreakpoint=null,d.options=d.originalSettings,b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b),h=f),b||h===!1||d.$slider.trigger("breakpoint",[d,h])}},b.prototype.changeSlide=function(b,c){var f,g,h,d=this,e=a(b.target);switch(e.is("a")&&b.preventDefault(),e.is("li")||(e=e.closest("li")),h=d.slideCount%d.options.slidesToScroll!==0,f=h?0:(d.slideCount-d.currentSlide)%d.options.slidesToScroll,b.data.message){case"previous":g=0===f?d.options.slidesToScroll:d.options.slidesToShow-f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide-g,!1,c);break;case"next":g=0===f?d.options.slidesToScroll:f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide+g,!1,c);break;case"index":var i=0===b.data.index?0:b.data.index||e.index()*d.options.slidesToScroll;d.slideHandler(d.checkNavigable(i),!1,c),e.children().trigger("focus");break;default:return}},b.prototype.checkNavigable=function(a){var c,d,b=this;if(c=b.getNavigableIndexes(),d=0,a>c[c.length-1])a=c[c.length-1];else for(var e in c){if(a<c[e]){a=d;break}d=c[e]}return a},b.prototype.cleanUpEvents=function(){var b=this;b.options.dots&&null!==b.$dots&&(a("li",b.$dots).off("click.slick",b.changeSlide),b.options.pauseOnDotsHover===!0&&b.options.autoplay===!0&&a("li",b.$dots).off("mouseenter.slick",a.proxy(b.setPaused,b,!0)).off("mouseleave.slick",a.proxy(b.setPaused,b,!1))),b.options.arrows===!0&&b.slideCount>b.options.slidesToShow&&(b.$prevArrow&&b.$prevArrow.off("click.slick",b.changeSlide),b.$nextArrow&&b.$nextArrow.off("click.slick",b.changeSlide)),b.$list.off("touchstart.slick mousedown.slick",b.swipeHandler),b.$list.off("touchmove.slick mousemove.slick",b.swipeHandler),b.$list.off("touchend.slick mouseup.slick",b.swipeHandler),b.$list.off("touchcancel.slick mouseleave.slick",b.swipeHandler),b.$list.off("click.slick",b.clickHandler),a(document).off(b.visibilityChange,b.visibility),b.$list.off("mouseenter.slick",a.proxy(b.setPaused,b,!0)),b.$list.off("mouseleave.slick",a.proxy(b.setPaused,b,!1)),b.options.accessibility===!0&&b.$list.off("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().off("click.slick",b.selectHandler),a(window).off("orientationchange.slick.slick-"+b.instanceUid,b.orientationChange),a(window).off("resize.slick.slick-"+b.instanceUid,b.resize),a("[draggable!=true]",b.$slideTrack).off("dragstart",b.preventDefault),a(window).off("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).off("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.cleanUpRows=function(){var b,a=this;a.options.rows>1&&(b=a.$slides.children().children(),b.removeAttr("style"),a.$slider.html(b))},b.prototype.clickHandler=function(a){var b=this;b.shouldClick===!1&&(a.stopImmediatePropagation(),a.stopPropagation(),a.preventDefault())},b.prototype.destroy=function(b){var c=this;c.autoPlayClear(),c.touchObject={},c.cleanUpEvents(),a(".slick-cloned",c.$slider).detach(),c.$dots&&c.$dots.remove(),c.$prevArrow&&c.$prevArrow.length&&(c.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.prevArrow)&&c.$prevArrow.remove()),c.$nextArrow&&c.$nextArrow.length&&(c.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.nextArrow)&&c.$nextArrow.remove()),c.$slides&&(c.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){a(this).attr("style",a(this).data("originalStyling"))}),c.$slideTrack.children(this.options.slide).detach(),c.$slideTrack.detach(),c.$list.detach(),c.$slider.append(c.$slides)),c.cleanUpRows(),c.$slider.removeClass("slick-slider"),c.$slider.removeClass("slick-initialized"),c.unslicked=!0,b||c.$slider.trigger("destroy",[c])},b.prototype.disableTransition=function(a){var b=this,c={};c[b.transitionType]="",b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.fadeSlide=function(a,b){var c=this;c.cssTransitions===!1?(c.$slides.eq(a).css({zIndex:c.options.zIndex}),c.$slides.eq(a).animate({opacity:1},c.options.speed,c.options.easing,b)):(c.applyTransition(a),c.$slides.eq(a).css({opacity:1,zIndex:c.options.zIndex}),b&&setTimeout(function(){c.disableTransition(a),b.call()},c.options.speed))},b.prototype.fadeSlideOut=function(a){var b=this;b.cssTransitions===!1?b.$slides.eq(a).animate({opacity:0,zIndex:b.options.zIndex-2},b.options.speed,b.options.easing):(b.applyTransition(a),b.$slides.eq(a).css({opacity:0,zIndex:b.options.zIndex-2}))},b.prototype.filterSlides=b.prototype.slickFilter=function(a){var b=this;null!==a&&(b.$slidesCache=b.$slides,b.unload(),b.$slideTrack.children(this.options.slide).detach(),b.$slidesCache.filter(a).appendTo(b.$slideTrack),b.reinit())},b.prototype.getCurrent=b.prototype.slickCurrentSlide=function(){var a=this;return a.currentSlide},b.prototype.getDotCount=function(){var a=this,b=0,c=0,d=0;if(a.options.infinite===!0)for(;b<a.slideCount;)++d,b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;else if(a.options.centerMode===!0)d=a.slideCount;else for(;b<a.slideCount;)++d,b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d-1},b.prototype.getLeft=function(a){var c,d,f,b=this,e=0;return b.slideOffset=0,d=b.$slides.first().outerHeight(!0),b.options.infinite===!0?(b.slideCount>b.options.slidesToShow&&(b.slideOffset=b.slideWidth*b.options.slidesToShow*-1,e=d*b.options.slidesToShow*-1),b.slideCount%b.options.slidesToScroll!==0&&a+b.options.slidesToScroll>b.slideCount&&b.slideCount>b.options.slidesToShow&&(a>b.slideCount?(b.slideOffset=(b.options.slidesToShow-(a-b.slideCount))*b.slideWidth*-1,e=(b.options.slidesToShow-(a-b.slideCount))*d*-1):(b.slideOffset=b.slideCount%b.options.slidesToScroll*b.slideWidth*-1,e=b.slideCount%b.options.slidesToScroll*d*-1))):a+b.options.slidesToShow>b.slideCount&&(b.slideOffset=(a+b.options.slidesToShow-b.slideCount)*b.slideWidth,e=(a+b.options.slidesToShow-b.slideCount)*d),b.slideCount<=b.options.slidesToShow&&(b.slideOffset=0,e=0),b.options.centerMode===!0&&b.options.infinite===!0?b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)-b.slideWidth:b.options.centerMode===!0&&(b.slideOffset=0,b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)),c=b.options.vertical===!1?a*b.slideWidth*-1+b.slideOffset:a*d*-1+e,b.options.variableWidth===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,b.options.centerMode===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow+1),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,c+=(b.$list.width()-f.outerWidth())/2)),c},b.prototype.getOption=b.prototype.slickGetOption=function(a){var b=this;return b.options[a]},b.prototype.getNavigableIndexes=function(){var e,a=this,b=0,c=0,d=[];for(a.options.infinite===!1?e=a.slideCount:(b=-1*a.options.slidesToScroll,c=-1*a.options.slidesToScroll,e=2*a.slideCount);e>b;)d.push(b),b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d},b.prototype.getSlick=function(){return this},b.prototype.getSlideCount=function(){var c,d,e,b=this;return e=b.options.centerMode===!0?b.slideWidth*Math.floor(b.options.slidesToShow/2):0,b.options.swipeToSlide===!0?(b.$slideTrack.find(".slick-slide").each(function(c,f){return f.offsetLeft-e+a(f).outerWidth()/2>-1*b.swipeLeft?(d=f,!1):void 0}),c=Math.abs(a(d).attr("data-slick-index")-b.currentSlide)||1):b.options.slidesToScroll},b.prototype.goTo=b.prototype.slickGoTo=function(a,b){var c=this;c.changeSlide({data:{message:"index",index:parseInt(a)}},b)},b.prototype.init=function(b){var c=this;a(c.$slider).hasClass("slick-initialized")||(a(c.$slider).addClass("slick-initialized"),c.buildRows(),c.buildOut(),c.setProps(),c.startLoad(),c.loadSlider(),c.initializeEvents(),c.updateArrows(),c.updateDots()),b&&c.$slider.trigger("init",[c]),c.options.accessibility===!0&&c.initADA()},b.prototype.initArrowEvents=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.on("click.slick",{message:"previous"},a.changeSlide),a.$nextArrow.on("click.slick",{message:"next"},a.changeSlide))},b.prototype.initDotEvents=function(){var b=this;b.options.dots===!0&&b.slideCount>b.options.slidesToShow&&a("li",b.$dots).on("click.slick",{message:"index"},b.changeSlide),b.options.dots===!0&&b.options.pauseOnDotsHover===!0&&b.options.autoplay===!0&&a("li",b.$dots).on("mouseenter.slick",a.proxy(b.setPaused,b,!0)).on("mouseleave.slick",a.proxy(b.setPaused,b,!1))},b.prototype.initializeEvents=function(){var b=this;b.initArrowEvents(),b.initDotEvents(),b.$list.on("touchstart.slick mousedown.slick",{action:"start"},b.swipeHandler),b.$list.on("touchmove.slick mousemove.slick",{action:"move"},b.swipeHandler),b.$list.on("touchend.slick mouseup.slick",{action:"end"},b.swipeHandler),b.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},b.swipeHandler),b.$list.on("click.slick",b.clickHandler),a(document).on(b.visibilityChange,a.proxy(b.visibility,b)),b.$list.on("mouseenter.slick",a.proxy(b.setPaused,b,!0)),b.$list.on("mouseleave.slick",a.proxy(b.setPaused,b,!1)),b.options.accessibility===!0&&b.$list.on("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),a(window).on("orientationchange.slick.slick-"+b.instanceUid,a.proxy(b.orientationChange,b)),a(window).on("resize.slick.slick-"+b.instanceUid,a.proxy(b.resize,b)),a("[draggable!=true]",b.$slideTrack).on("dragstart",b.preventDefault),a(window).on("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).on("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.initUI=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.show(),a.$nextArrow.show()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.show(),a.options.autoplay===!0&&a.autoPlay()},b.prototype.keyHandler=function(a){var b=this;a.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===a.keyCode&&b.options.accessibility===!0?b.changeSlide({data:{message:"previous"}}):39===a.keyCode&&b.options.accessibility===!0&&b.changeSlide({data:{message:"next"}}))},b.prototype.lazyLoad=function(){function g(b){a("img[data-lazy]",b).each(function(){var b=a(this),c=a(this).attr("data-lazy"),d=document.createElement("img");d.onload=function(){b.animate({opacity:0},100,function(){b.attr("src",c).animate({opacity:1},200,function(){b.removeAttr("data-lazy").removeClass("slick-loading")})})},d.src=c})}var c,d,e,f,b=this;b.options.centerMode===!0?b.options.infinite===!0?(e=b.currentSlide+(b.options.slidesToShow/2+1),f=e+b.options.slidesToShow+2):(e=Math.max(0,b.currentSlide-(b.options.slidesToShow/2+1)),f=2+(b.options.slidesToShow/2+1)+b.currentSlide):(e=b.options.infinite?b.options.slidesToShow+b.currentSlide:b.currentSlide,f=e+b.options.slidesToShow,b.options.fade===!0&&(e>0&&e--,f<=b.slideCount&&f++)),c=b.$slider.find(".slick-slide").slice(e,f),g(c),b.slideCount<=b.options.slidesToShow?(d=b.$slider.find(".slick-slide"),g(d)):b.currentSlide>=b.slideCount-b.options.slidesToShow?(d=b.$slider.find(".slick-cloned").slice(0,b.options.slidesToShow),g(d)):0===b.currentSlide&&(d=b.$slider.find(".slick-cloned").slice(-1*b.options.slidesToShow),g(d))},b.prototype.loadSlider=function(){var a=this;a.setPosition(),a.$slideTrack.css({opacity:1}),a.$slider.removeClass("slick-loading"),a.initUI(),"progressive"===a.options.lazyLoad&&a.progressiveLazyLoad()},b.prototype.next=b.prototype.slickNext=function(){var a=this;a.changeSlide({data:{message:"next"}})},b.prototype.orientationChange=function(){var a=this;a.checkResponsive(),a.setPosition()},b.prototype.pause=b.prototype.slickPause=function(){var a=this;a.autoPlayClear(),a.paused=!0},b.prototype.play=b.prototype.slickPlay=function(){var a=this;a.paused=!1,a.autoPlay()},b.prototype.postSlide=function(a){var b=this;b.$slider.trigger("afterChange",[b,a]),b.animating=!1,b.setPosition(),b.swipeLeft=null,b.options.autoplay===!0&&b.paused===!1&&b.autoPlay(),b.options.accessibility===!0&&b.initADA()},b.prototype.prev=b.prototype.slickPrev=function(){var a=this;a.changeSlide({data:{message:"previous"}})},b.prototype.preventDefault=function(a){a.preventDefault()},b.prototype.progressiveLazyLoad=function(){var c,d,b=this;c=a("img[data-lazy]",b.$slider).length,c>0&&(d=a("img[data-lazy]",b.$slider).first(),d.attr("src",null),d.attr("src",d.attr("data-lazy")).removeClass("slick-loading").load(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad(),b.options.adaptiveHeight===!0&&b.setPosition()}).error(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad()}))},b.prototype.refresh=function(b){var d,e,c=this;e=c.slideCount-c.options.slidesToShow,c.options.infinite||(c.slideCount<=c.options.slidesToShow?c.currentSlide=0:c.currentSlide>e&&(c.currentSlide=e)),d=c.currentSlide,c.destroy(!0),a.extend(c,c.initials,{currentSlide:d}),c.init(),b||c.changeSlide({data:{message:"index",index:d}},!1)},b.prototype.registerBreakpoints=function(){var c,d,e,b=this,f=b.options.responsive||null;if("array"===a.type(f)&&f.length){b.respondTo=b.options.respondTo||"window";for(c in f)if(e=b.breakpoints.length-1,d=f[c].breakpoint,f.hasOwnProperty(c)){for(;e>=0;)b.breakpoints[e]&&b.breakpoints[e]===d&&b.breakpoints.splice(e,1),e--;b.breakpoints.push(d),b.breakpointSettings[d]=f[c].settings}b.breakpoints.sort(function(a,c){return b.options.mobileFirst?a-c:c-a})}},b.prototype.reinit=function(){var b=this;b.$slides=b.$slideTrack.children(b.options.slide).addClass("slick-slide"),b.slideCount=b.$slides.length,b.currentSlide>=b.slideCount&&0!==b.currentSlide&&(b.currentSlide=b.currentSlide-b.options.slidesToScroll),b.slideCount<=b.options.slidesToShow&&(b.currentSlide=0),b.registerBreakpoints(),b.setProps(),b.setupInfinite(),b.buildArrows(),b.updateArrows(),b.initArrowEvents(),b.buildDots(),b.updateDots(),b.initDotEvents(),b.checkResponsive(!1,!0),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),b.setSlideClasses(0),b.setPosition(),b.$slider.trigger("reInit",[b]),b.options.autoplay===!0&&b.focusHandler()},b.prototype.resize=function(){var b=this;a(window).width()!==b.windowWidth&&(clearTimeout(b.windowDelay),b.windowDelay=window.setTimeout(function(){b.windowWidth=a(window).width(),b.checkResponsive(),b.unslicked||b.setPosition()},50))},b.prototype.removeSlide=b.prototype.slickRemove=function(a,b,c){var d=this;return"boolean"==typeof a?(b=a,a=b===!0?0:d.slideCount-1):a=b===!0?--a:a,d.slideCount<1||0>a||a>d.slideCount-1?!1:(d.unload(),c===!0?d.$slideTrack.children().remove():d.$slideTrack.children(this.options.slide).eq(a).remove(),d.$slides=d.$slideTrack.children(this.options.slide),d.$slideTrack.children(this.options.slide).detach(),d.$slideTrack.append(d.$slides),d.$slidesCache=d.$slides,void d.reinit())},b.prototype.setCSS=function(a){var d,e,b=this,c={};b.options.rtl===!0&&(a=-a),d="left"==b.positionProp?Math.ceil(a)+"px":"0px",e="top"==b.positionProp?Math.ceil(a)+"px":"0px",c[b.positionProp]=a,b.transformsEnabled===!1?b.$slideTrack.css(c):(c={},b.cssTransitions===!1?(c[b.animType]="translate("+d+", "+e+")",b.$slideTrack.css(c)):(c[b.animType]="translate3d("+d+", "+e+", 0px)",b.$slideTrack.css(c)))},b.prototype.setDimensions=function(){var a=this;a.options.vertical===!1?a.options.centerMode===!0&&a.$list.css({padding:"0px "+a.options.centerPadding}):(a.$list.height(a.$slides.first().outerHeight(!0)*a.options.slidesToShow),a.options.centerMode===!0&&a.$list.css({padding:a.options.centerPadding+" 0px"})),a.listWidth=a.$list.width(),a.listHeight=a.$list.height(),a.options.vertical===!1&&a.options.variableWidth===!1?(a.slideWidth=Math.ceil(a.listWidth/a.options.slidesToShow),a.$slideTrack.width(Math.ceil(a.slideWidth*a.$slideTrack.children(".slick-slide").length))):a.options.variableWidth===!0?a.$slideTrack.width(5e3*a.slideCount):(a.slideWidth=Math.ceil(a.listWidth),a.$slideTrack.height(Math.ceil(a.$slides.first().outerHeight(!0)*a.$slideTrack.children(".slick-slide").length)));var b=a.$slides.first().outerWidth(!0)-a.$slides.first().width();a.options.variableWidth===!1&&a.$slideTrack.children(".slick-slide").width(a.slideWidth-b)},b.prototype.setFade=function(){var c,b=this;b.$slides.each(function(d,e){c=b.slideWidth*d*-1,b.options.rtl===!0?a(e).css({position:"relative",right:c,top:0,zIndex:b.options.zIndex-2,opacity:0}):a(e).css({position:"relative",left:c,top:0,zIndex:b.options.zIndex-2,opacity:0})}),b.$slides.eq(b.currentSlide).css({zIndex:b.options.zIndex-1,opacity:1})},b.prototype.setHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.css("height",b)}},b.prototype.setOption=b.prototype.slickSetOption=function(b,c,d){var f,g,e=this;if("responsive"===b&&"array"===a.type(c))for(g in c)if("array"!==a.type(e.options.responsive))e.options.responsive=[c[g]];else{for(f=e.options.responsive.length-1;f>=0;)e.options.responsive[f].breakpoint===c[g].breakpoint&&e.options.responsive.splice(f,1),f--;e.options.responsive.push(c[g])}else e.options[b]=c;d===!0&&(e.unload(),e.reinit())},b.prototype.setPosition=function(){var a=this;a.setDimensions(),a.setHeight(),a.options.fade===!1?a.setCSS(a.getLeft(a.currentSlide)):a.setFade(),a.$slider.trigger("setPosition",[a])},b.prototype.setProps=function(){var a=this,b=document.body.style;a.positionProp=a.options.vertical===!0?"top":"left","top"===a.positionProp?a.$slider.addClass("slick-vertical"):a.$slider.removeClass("slick-vertical"),(void 0!==b.WebkitTransition||void 0!==b.MozTransition||void 0!==b.msTransition)&&a.options.useCSS===!0&&(a.cssTransitions=!0),a.options.fade&&("number"==typeof a.options.zIndex?a.options.zIndex<3&&(a.options.zIndex=3):a.options.zIndex=a.defaults.zIndex),void 0!==b.OTransform&&(a.animType="OTransform",a.transformType="-o-transform",a.transitionType="OTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.MozTransform&&(a.animType="MozTransform",a.transformType="-moz-transform",a.transitionType="MozTransition",void 0===b.perspectiveProperty&&void 0===b.MozPerspective&&(a.animType=!1)),void 0!==b.webkitTransform&&(a.animType="webkitTransform",a.transformType="-webkit-transform",a.transitionType="webkitTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.msTransform&&(a.animType="msTransform",a.transformType="-ms-transform",a.transitionType="msTransition",void 0===b.msTransform&&(a.animType=!1)),void 0!==b.transform&&a.animType!==!1&&(a.animType="transform",a.transformType="transform",a.transitionType="transition"),a.transformsEnabled=a.options.useTransform&&null!==a.animType&&a.animType!==!1},b.prototype.setSlideClasses=function(a){var c,d,e,f,b=this;d=b.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),b.$slides.eq(a).addClass("slick-current"),b.options.centerMode===!0?(c=Math.floor(b.options.slidesToShow/2),b.options.infinite===!0&&(a>=c&&a<=b.slideCount-1-c?b.$slides.slice(a-c,a+c+1).addClass("slick-active").attr("aria-hidden","false"):(e=b.options.slidesToShow+a,d.slice(e-c+1,e+c+2).addClass("slick-active").attr("aria-hidden","false")),0===a?d.eq(d.length-1-b.options.slidesToShow).addClass("slick-center"):a===b.slideCount-1&&d.eq(b.options.slidesToShow).addClass("slick-center")),b.$slides.eq(a).addClass("slick-center")):a>=0&&a<=b.slideCount-b.options.slidesToShow?b.$slides.slice(a,a+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):d.length<=b.options.slidesToShow?d.addClass("slick-active").attr("aria-hidden","false"):(f=b.slideCount%b.options.slidesToShow,e=b.options.infinite===!0?b.options.slidesToShow+a:a,b.options.slidesToShow==b.options.slidesToScroll&&b.slideCount-a<b.options.slidesToShow?d.slice(e-(b.options.slidesToShow-f),e+f).addClass("slick-active").attr("aria-hidden","false"):d.slice(e,e+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false")),"ondemand"===b.options.lazyLoad&&b.lazyLoad()},b.prototype.setupInfinite=function(){var c,d,e,b=this;if(b.options.fade===!0&&(b.options.centerMode=!1),b.options.infinite===!0&&b.options.fade===!1&&(d=null,b.slideCount>b.options.slidesToShow)){for(e=b.options.centerMode===!0?b.options.slidesToShow+1:b.options.slidesToShow,c=b.slideCount;c>b.slideCount-e;c-=1)d=c-1,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d-b.slideCount).prependTo(b.$slideTrack).addClass("slick-cloned");for(c=0;e>c;c+=1)d=c,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d+b.slideCount).appendTo(b.$slideTrack).addClass("slick-cloned");b.$slideTrack.find(".slick-cloned").find("[id]").each(function(){a(this).attr("id","")})}},b.prototype.setPaused=function(a){var b=this;b.options.autoplay===!0&&b.options.pauseOnHover===!0&&(b.paused=a,a?b.autoPlayClear():b.autoPlay())},b.prototype.selectHandler=function(b){var c=this,d=a(b.target).is(".slick-slide")?a(b.target):a(b.target).parents(".slick-slide"),e=parseInt(d.attr("data-slick-index"));return e||(e=0),c.slideCount<=c.options.slidesToShow?(c.setSlideClasses(e),void c.asNavFor(e)):void c.slideHandler(e)},b.prototype.slideHandler=function(a,b,c){var d,e,f,g,h=null,i=this;return b=b||!1,i.animating===!0&&i.options.waitForAnimate===!0||i.options.fade===!0&&i.currentSlide===a||i.slideCount<=i.options.slidesToShow?void 0:(b===!1&&i.asNavFor(a),d=a,h=i.getLeft(d),g=i.getLeft(i.currentSlide),i.currentLeft=null===i.swipeLeft?g:i.swipeLeft,i.options.infinite===!1&&i.options.centerMode===!1&&(0>a||a>i.getDotCount()*i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d); 424}):i.postSlide(d))):i.options.infinite===!1&&i.options.centerMode===!0&&(0>a||a>i.slideCount-i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d)}):i.postSlide(d))):(i.options.autoplay===!0&&clearInterval(i.autoPlayTimer),e=0>d?i.slideCount%i.options.slidesToScroll!==0?i.slideCount-i.slideCount%i.options.slidesToScroll:i.slideCount+d:d>=i.slideCount?i.slideCount%i.options.slidesToScroll!==0?0:d-i.slideCount:d,i.animating=!0,i.$slider.trigger("beforeChange",[i,i.currentSlide,e]),f=i.currentSlide,i.currentSlide=e,i.setSlideClasses(i.currentSlide),i.updateDots(),i.updateArrows(),i.options.fade===!0?(c!==!0?(i.fadeSlideOut(f),i.fadeSlide(e,function(){i.postSlide(e)})):i.postSlide(e),void i.animateHeight()):void(c!==!0?i.animateSlide(h,function(){i.postSlide(e)}):i.postSlide(e))))},b.prototype.startLoad=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.hide(),a.$nextArrow.hide()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.hide(),a.$slider.addClass("slick-loading")},b.prototype.swipeDirection=function(){var a,b,c,d,e=this;return a=e.touchObject.startX-e.touchObject.curX,b=e.touchObject.startY-e.touchObject.curY,c=Math.atan2(b,a),d=Math.round(180*c/Math.PI),0>d&&(d=360-Math.abs(d)),45>=d&&d>=0?e.options.rtl===!1?"left":"right":360>=d&&d>=315?e.options.rtl===!1?"left":"right":d>=135&&225>=d?e.options.rtl===!1?"right":"left":e.options.verticalSwiping===!0?d>=35&&135>=d?"left":"right":"vertical"},b.prototype.swipeEnd=function(a){var c,b=this;if(b.dragging=!1,b.shouldClick=b.touchObject.swipeLength>10?!1:!0,void 0===b.touchObject.curX)return!1;if(b.touchObject.edgeHit===!0&&b.$slider.trigger("edge",[b,b.swipeDirection()]),b.touchObject.swipeLength>=b.touchObject.minSwipe)switch(b.swipeDirection()){case"left":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide+b.getSlideCount()):b.currentSlide+b.getSlideCount(),b.slideHandler(c),b.currentDirection=0,b.touchObject={},b.$slider.trigger("swipe",[b,"left"]);break;case"right":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide-b.getSlideCount()):b.currentSlide-b.getSlideCount(),b.slideHandler(c),b.currentDirection=1,b.touchObject={},b.$slider.trigger("swipe",[b,"right"])}else b.touchObject.startX!==b.touchObject.curX&&(b.slideHandler(b.currentSlide),b.touchObject={})},b.prototype.swipeHandler=function(a){var b=this;if(!(b.options.swipe===!1||"ontouchend"in document&&b.options.swipe===!1||b.options.draggable===!1&&-1!==a.type.indexOf("mouse")))switch(b.touchObject.fingerCount=a.originalEvent&&void 0!==a.originalEvent.touches?a.originalEvent.touches.length:1,b.touchObject.minSwipe=b.listWidth/b.options.touchThreshold,b.options.verticalSwiping===!0&&(b.touchObject.minSwipe=b.listHeight/b.options.touchThreshold),a.data.action){case"start":b.swipeStart(a);break;case"move":b.swipeMove(a);break;case"end":b.swipeEnd(a)}},b.prototype.swipeMove=function(a){var d,e,f,g,h,b=this;return h=void 0!==a.originalEvent?a.originalEvent.touches:null,!b.dragging||h&&1!==h.length?!1:(d=b.getLeft(b.currentSlide),b.touchObject.curX=void 0!==h?h[0].pageX:a.clientX,b.touchObject.curY=void 0!==h?h[0].pageY:a.clientY,b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curX-b.touchObject.startX,2))),b.options.verticalSwiping===!0&&(b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curY-b.touchObject.startY,2)))),e=b.swipeDirection(),"vertical"!==e?(void 0!==a.originalEvent&&b.touchObject.swipeLength>4&&a.preventDefault(),g=(b.options.rtl===!1?1:-1)*(b.touchObject.curX>b.touchObject.startX?1:-1),b.options.verticalSwiping===!0&&(g=b.touchObject.curY>b.touchObject.startY?1:-1),f=b.touchObject.swipeLength,b.touchObject.edgeHit=!1,b.options.infinite===!1&&(0===b.currentSlide&&"right"===e||b.currentSlide>=b.getDotCount()&&"left"===e)&&(f=b.touchObject.swipeLength*b.options.edgeFriction,b.touchObject.edgeHit=!0),b.options.vertical===!1?b.swipeLeft=d+f*g:b.swipeLeft=d+f*(b.$list.height()/b.listWidth)*g,b.options.verticalSwiping===!0&&(b.swipeLeft=d+f*g),b.options.fade===!0||b.options.touchMove===!1?!1:b.animating===!0?(b.swipeLeft=null,!1):void b.setCSS(b.swipeLeft)):void 0)},b.prototype.swipeStart=function(a){var c,b=this;return 1!==b.touchObject.fingerCount||b.slideCount<=b.options.slidesToShow?(b.touchObject={},!1):(void 0!==a.originalEvent&&void 0!==a.originalEvent.touches&&(c=a.originalEvent.touches[0]),b.touchObject.startX=b.touchObject.curX=void 0!==c?c.pageX:a.clientX,b.touchObject.startY=b.touchObject.curY=void 0!==c?c.pageY:a.clientY,void(b.dragging=!0))},b.prototype.unfilterSlides=b.prototype.slickUnfilter=function(){var a=this;null!==a.$slidesCache&&(a.unload(),a.$slideTrack.children(this.options.slide).detach(),a.$slidesCache.appendTo(a.$slideTrack),a.reinit())},b.prototype.unload=function(){var b=this;a(".slick-cloned",b.$slider).remove(),b.$dots&&b.$dots.remove(),b.$prevArrow&&b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.remove(),b.$nextArrow&&b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.remove(),b.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},b.prototype.unslick=function(a){var b=this;b.$slider.trigger("unslick",[b,a]),b.destroy()},b.prototype.updateArrows=function(){var b,a=this;b=Math.floor(a.options.slidesToShow/2),a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&!a.options.infinite&&(a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===a.currentSlide?(a.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-a.options.slidesToShow&&a.options.centerMode===!1?(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-1&&a.options.centerMode===!0&&(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},b.prototype.updateDots=function(){var a=this;null!==a.$dots&&(a.$dots.find("li").removeClass("slick-active").attr("aria-hidden","true"),a.$dots.find("li").eq(Math.floor(a.currentSlide/a.options.slidesToScroll)).addClass("slick-active").attr("aria-hidden","false"))},b.prototype.visibility=function(){var a=this;document[a.hidden]?(a.paused=!0,a.autoPlayClear()):a.options.autoplay===!0&&(a.paused=!1,a.autoPlay())},b.prototype.initADA=function(){var b=this;b.$slides.add(b.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),b.$slideTrack.attr("role","listbox"),b.$slides.not(b.$slideTrack.find(".slick-cloned")).each(function(c){a(this).attr({role:"option","aria-describedby":"slick-slide"+b.instanceUid+c})}),null!==b.$dots&&b.$dots.attr("role","tablist").find("li").each(function(c){a(this).attr({role:"presentation","aria-selected":"false","aria-controls":"navigation"+b.instanceUid+c,id:"slick-slide"+b.instanceUid+c})}).first().attr("aria-selected","true").end().find("button").attr("role","button").end().closest("div").attr("role","toolbar"),b.activateADA()},b.prototype.activateADA=function(){var a=this;a.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},b.prototype.focusHandler=function(){var b=this;b.$slider.on("focus.slick blur.slick","*",function(c){c.stopImmediatePropagation();var d=a(this);setTimeout(function(){b.isPlay&&(d.is(":focus")?(b.autoPlayClear(),b.paused=!0):(b.paused=!1,b.autoPlay()))},0)})},a.fn.slick=function(){var f,g,a=this,c=arguments[0],d=Array.prototype.slice.call(arguments,1),e=a.length;for(f=0;e>f;f++)if("object"==typeof c||"undefined"==typeof c?a[f].slick=new b(a[f],c):g=a[f].slick[c].apply(a[f].slick,d),"undefined"!=typeof g)return g;return a}});
vendor: 144,231 bytes, lines 424-5991
424 425// ================================================== 426// fancyBox v3.5.7 427// 428// Licensed GPLv3 for open source use 429// or fancyBox Commercial License for commercial use 430// 431// http://fancyapps.com/fancybox/ 432// Copyright 2019 fancyApps 433// 434// ================================================== 435(function (window, document, $, undefined) { 436 "use strict"; 437 438 window.console = window.console || { 439 info: function (stuff) {} 440 }; 441 442 // If there's no jQuery, fancyBox can't work 443 // ========================================= 444 445 if (!$) { 446 return; 447 } 448 449 // Check if fancyBox is already initialized 450 // ======================================== 451 452 if ($.fn.fancybox) { 453 console.info("fancyBox already initialized"); 454 455 return; 456 } 457 458 // Private default settings 459 // ======================== 460 461 var defaults = { 462 // Close existing modals 463 // Set this to false if you do not need to stack multiple instances 464 closeExisting: false, 465 466 // Enable infinite gallery navigation 467 loop: false, 468 469 // Horizontal space between slides 470 gutter: 50, 471 472 // Enable keyboard navigation 473 keyboard: true, 474 475 // Should allow caption to overlap the content 476 preventCaptionOverlap: true, 477 478 // Should display navigation arrows at the screen edges 479 arrows: true, 480 481 // Should display counter at the top left corner 482 infobar: true, 483 484 // Should display close button (using `btnTpl.smallBtn` template) over the content 485 // Can be true, false, "auto" 486 // If "auto" - will be automatically enabled for "html", "inline" or "ajax" items 487 smallBtn: "auto", 488 489 // Should display toolbar (buttons at the top) 490 // Can be true, false, "auto" 491 // If "auto" - will be automatically hidden if "smallBtn" is enabled 492 toolbar: "auto", 493 494 // What buttons should appear in the top right corner. 495 // Buttons will be created using templates from `btnTpl` option 496 // and they will be placed into toolbar (class="fancybox-toolbar"` element) 497 buttons: [ 498 "zoom", 499 //"share", 500 "slideShow", 501 //"fullScreen", 502 //"download", 503 "thumbs", 504 "close" 505 ], 506 507 // Detect "idle" time in seconds 508 idleTime: 3, 509 510 // Disable right-click and use simple image protection for images 511 protect: false, 512 513 // Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc 514 modal: false, 515 516 image: { 517 // Wait for images to load before displaying 518 // true - wait for image to load and then display; 519 // false - display thumbnail and load the full-sized image over top, 520 // requires predefined image dimensions (`data-width` and `data-height` attributes) 521 preload: false 522 }, 523 524 ajax: { 525 // Object containing settings for ajax request 526 settings: { 527 // This helps to indicate that request comes from the modal 528 // Feel free to change naming 529 data: { 530 fancybox: true 531 } 532 } 533 }, 534 535 iframe: { 536 // Iframe template 537 tpl: '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" allowfullscreen="allowfullscreen" allow="autoplay; fullscreen" src=""></iframe>', 538 539 // Preload iframe before displaying it 540 // This allows to calculate iframe content width and height 541 // (note: Due to "Same Origin Policy", you can't get cross domain data). 542 preload: true, 543 544 // Custom CSS styling for iframe wrapping element 545 // You can use this to set custom iframe dimensions 546 css: {}, 547 548 // Iframe tag attributes 549 attr: { 550 scrolling: "auto" 551 } 552 }, 553 554 // For HTML5 video only 555 video: { 556 tpl: '<video class="fancybox-video" controls controlsList="nodownload" poster="{{poster}}">' + 557 '<source src="{{src}}" type="{{format}}" />' + 558 'Sorry, your browser doesn\'t support embedded videos, <a href="{{src}}">download</a> and watch with your favorite video player!' + 559 "</video>", 560 format: "", // custom video format 561 autoStart: true 562 }, 563 564 // Default content type if cannot be detected automatically 565 defaultType: "image", 566 567 // Open/close animation type 568 // Possible values: 569 // false - disable 570 // "zoom" - zoom images from/to thumbnail 571 // "fade" 572 // "zoom-in-out" 573 // 574 animationEffect: "zoom", 575 576 // Duration in ms for open/close animation 577 animationDuration: 366, 578 579 // Should image change opacity while zooming 580 // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios 581 zoomOpacity: "auto", 582 583 // Transition effect between slides 584 // 585 // Possible values: 586 // false - disable 587 // "fade' 588 // "slide' 589 // "circular' 590 // "tube' 591 // "zoom-in-out' 592 // "rotate' 593 // 594 transitionEffect: "fade", 595 596 // Duration in ms for transition animation 597 transitionDuration: 366, 598 599 // Custom CSS class for slide element 600 slideClass: "", 601 602 // Custom CSS class for layout 603 baseClass: "", 604 605 // Base template for layout 606 baseTpl: '<div class="fancybox-container" role="dialog" tabindex="-1">' + 607 '<div class="fancybox-bg"></div>' + 608 '<div class="fancybox-inner">' + 609 '<div class="fancybox-infobar"><span data-fancybox-index></span> / <span data-fancybox-count></span></div>' + 610 '<div class="fancybox-toolbar">{{buttons}}</div>' + 611 '<div class="fancybox-navigation">{{arrows}}</div>' + 612 '<div class="fancybox-stage"></div>' + 613 '<div class="fancybox-caption"><div class="fancybox-caption__body"></div></div>' + 614 "</div>" + 615 "</div>", 616 617 // Loading indicator template 618 spinnerTpl: '<div class="fancybox-loading"></div>', 619 620 // Error message template 621 errorTpl: '<div class="fancybox-error"><p>{{ERROR}}</p></div>', 622 623 btnTpl: { 624 download: '<a download data-fancybox-download class="fancybox-button fancybox-button--download" title="{{DOWNLOAD}}" href="javascript:;">' + 625 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.62 17.09V19H5.38v-1.91zm-2.97-6.96L17 11.45l-5 4.87-5-4.87 1.36-1.32 2.68 2.64V5h1.92v7.77z"/></svg>' + 626 "</a>", 627 628 zoom: '<button data-fancybox-zoom class="fancybox-button fancybox-button--zoom" title="{{ZOOM}}">' + 629 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.7 17.3l-3-3a5.9 5.9 0 0 0-.6-7.6 5.9 5.9 0 0 0-8.4 0 5.9 5.9 0 0 0 0 8.4 5.9 5.9 0 0 0 7.7.7l3 3a1 1 0 0 0 1.3 0c.4-.5.4-1 0-1.5zM8.1 13.8a4 4 0 0 1 0-5.7 4 4 0 0 1 5.7 0 4 4 0 0 1 0 5.7 4 4 0 0 1-5.7 0z"/></svg>' + 630 "</button>", 631 632 close: '<button data-fancybox-close class="fancybox-button fancybox-button--close" title="{{CLOSE}}">' + 633 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 10.6L6.6 5.2 5.2 6.6l5.4 5.4-5.4 5.4 1.4 1.4 5.4-5.4 5.4 5.4 1.4-1.4-5.4-5.4 5.4-5.4-1.4-1.4-5.4 5.4z"/></svg>' + 634 "</button>", 635 636 // Arrows 637 arrowLeft: '<button data-fancybox-prev class="fancybox-button fancybox-button--arrow_left" title="{{PREV}}">' + 638 '<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.28 15.7l-1.34 1.37L5 12l4.94-5.07 1.34 1.38-2.68 2.72H19v1.94H8.6z"/></svg></div>' + 639 "</button>", 640 641 arrowRight: '<button data-fancybox-next class="fancybox-button fancybox-button--arrow_right" title="{{NEXT}}">' + 642 '<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 12.97l-2.68 2.72 1.34 1.38L19 12l-4.94-5.07-1.34 1.38 2.68 2.72H5v1.94z"/></svg></div>' + 643 "</button>", 644 645 // This small close button will be appended to your html/inline/ajax content by default, 646 // if "smallBtn" option is not set to false 647 smallBtn: '<button type="button" data-fancybox-close class="fancybox-button fancybox-close-small" title="{{CLOSE}}">' + 648 '<svg xmlns="http://www.w3.org/2000/svg" version="1" viewBox="0 0 24 24"><path d="M13 12l5-5-1-1-5 5-5-5-1 1 5 5-5 5 1 1 5-5 5 5 1-1z"/></svg>' + 649 "</button>" 650 }, 651 652 // Container is injected into this element 653 parentEl: "body", 654 655 // Hide browser vertical scrollbars; use at your own risk 656 hideScrollbar: true, 657 658 // Focus handling 659 // ============== 660 661 // Try to focus on the first focusable element after opening 662 autoFocus: true, 663 664 // Put focus back to active element after closing 665 backFocus: true, 666 667 // Do not let user to focus on element outside modal content 668 trapFocus: true, 669 670 // Module specific options 671 // ======================= 672 673 fullScreen: { 674 autoStart: false 675 }, 676 677 // Set `touch: false` to disable panning/swiping 678 touch: { 679 vertical: true, // Allow to drag content vertically 680 momentum: true // Continue movement after releasing mouse/touch when panning 681 }, 682 683 // Hash value when initializing manually, 684 // set `false` to disable hash change 685 hash: null, 686 687 // Customize or add new media types 688 // Example: 689 /* 690 media : { 691 youtube : { 692 params : { 693 autoplay : 0 694 } 695 } 696 } 697 */ 698 media: {}, 699 700 slideShow: { 701 autoStart: false, 702 speed: 3000 703 }, 704 705 thumbs: { 706 autoStart: false, // Display thumbnails on opening 707 hideOnClose: true, // Hide thumbnail grid when closing animation starts 708 parentEl: ".fancybox-container", // Container is injected into this element 709 axis: "y" // Vertical (y) or horizontal (x) scrolling 710 }, 711 712 // Use mousewheel to navigate gallery 713 // If 'auto' - enabled for images only 714 wheel: "auto", 715 716 // Callbacks 717 //========== 718 719 // See Documentation/API/Events for more information 720 // Example: 721 /* 722 afterShow: function( instance, current ) { 723 console.info( 'Clicked element:' ); 724 console.info( current.opts.$orig ); 725 } 726 */ 727 728 onInit: $.noop, // When instance has been initialized 729 730 beforeLoad: $.noop, // Before the content of a slide is being loaded 731 afterLoad: $.noop, // When the content of a slide is done loading 732 733 beforeShow: $.noop, // Before open animation starts 734 afterShow: $.noop, // When content is done loading and animating 735 736 beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close. 737 afterClose: $.noop, // After instance has been closed 738 739 onActivate: $.noop, // When instance is brought to front 740 onDeactivate: $.noop, // When other instance has been activated 741 742 // Interaction 743 // =========== 744 745 // Use options below to customize taken action when user clicks or double clicks on the fancyBox area, 746 // each option can be string or method that returns value. 747 // 748 // Possible values: 749 // "close" - close instance 750 // "next" - move to next gallery item 751 // "nextOrClose" - move to next gallery item or close if gallery has only one item 752 // "toggleControls" - show/hide controls 753 // "zoom" - zoom image (if loaded) 754 // false - do nothing 755 756 // Clicked on the content 757 clickContent: function (current, event) { 758 return current.type === "image" ? "zoom" : false; 759 }, 760 761 // Clicked on the slide 762 clickSlide: "close", 763 764 // Clicked on the background (backdrop) element; 765 // if you have not changed the layout, then most likely you need to use `clickSlide` option 766 clickOutside: "close", 767 768 // Same as previous two, but for double click 769 dblclickContent: false, 770 dblclickSlide: false, 771 dblclickOutside: false, 772 773 // Custom options when mobile device is detected 774 // ============================================= 775 776 mobile: { 777 preventCaptionOverlap: false, 778 idleTime: false, 779 clickContent: function (current, event) { 780 return current.type === "image" ? "toggleControls" : false; 781 }, 782 clickSlide: function (current, event) { 783 return current.type === "image" ? "toggleControls" : "close"; 784 }, 785 dblclickContent: function (current, event) { 786 return current.type === "image" ? "zoom" : false; 787 }, 788 dblclickSlide: function (current, event) { 789 return current.type === "image" ? "zoom" : false; 790 } 791 }, 792 793 // Internationalization 794 // ==================== 795 796 lang: "en", 797 i18n: { 798 en: { 799 CLOSE: "Close", 800 NEXT: "Next", 801 PREV: "Previous", 802 ERROR: "The requested content cannot be loaded. <br/> Please try again later.", 803 PLAY_START: "Start slideshow", 804 PLAY_STOP: "Pause slideshow", 805 FULL_SCREEN: "Full screen", 806 THUMBS: "Thumbnails", 807 DOWNLOAD: "Download", 808 SHARE: "Share", 809 ZOOM: "Zoom" 810 }, 811 de: { 812 CLOSE: "Schließen", 813 NEXT: "Weiter", 814 PREV: "Zurück", 815 ERROR: "Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es später nochmal.", 816 PLAY_START: "Diaschau starten", 817 PLAY_STOP: "Diaschau beenden", 818 FULL_SCREEN: "Vollbild", 819 THUMBS: "Vorschaubilder", 820 DOWNLOAD: "Herunterladen", 821 SHARE: "Teilen", 822 ZOOM: "Vergrößern" 823 } 824 } 825 }; 826 827 // Few useful variables and methods 828 // ================================ 829 830 var $W = $(window); 831 var $D = $(document); 832 833 var called = 0; 834 835 // Check if an object is a jQuery object and not a native JavaScript object 836 // ======================================================================== 837 var isQuery = function (obj) { 838 return obj && obj.hasOwnProperty && obj instanceof $; 839 }; 840 841 // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame" 842 // =============================================================================== 843 var requestAFrame = (function () { 844 return ( 845 window.requestAnimationFrame || 846 window.webkitRequestAnimationFrame || 847 window.mozRequestAnimationFrame || 848 window.oRequestAnimationFrame || 849 // if all else fails, use setTimeout 850 function (callback) { 851 return window.setTimeout(callback, 1000 / 60); 852 } 853 ); 854 })(); 855 856 var cancelAFrame = (function () { 857 return ( 858 window.cancelAnimationFrame || 859 window.webkitCancelAnimationFrame || 860 window.mozCancelAnimationFrame || 861 window.oCancelAnimationFrame || 862 function (id) { 863 window.clearTimeout(id); 864 } 865 ); 866 })(); 867 868 // Detect the supported transition-end event property name 869 // ======================================================= 870 var transitionEnd = (function () { 871 var el = document.createElement("fakeelement"), 872 t; 873 874 var transitions = { 875 transition: "transitionend", 876 OTransition: "oTransitionEnd", 877 MozTransition: "transitionend", 878 WebkitTransition: "webkitTransitionEnd" 879 }; 880 881 for (t in transitions) { 882 if (el.style[t] !== undefined) { 883 return transitions[t]; 884 } 885 } 886 887 return "transitionend"; 888 })(); 889 890 // Force redraw on an element. 891 // This helps in cases where the browser doesn't redraw an updated element properly 892 // ================================================================================ 893 var forceRedraw = function ($el) { 894 return $el && $el.length && $el[0].offsetHeight; 895 }; 896 897 // Exclude array (`buttons`) options from deep merging 898 // =================================================== 899 var mergeOpts = function (opts1, opts2) { 900 var rez = $.extend(true, {}, opts1, opts2); 901 902 $.each(opts2, function (key, value) { 903 if ($.isArray(value)) { 904 rez[key] = value; 905 } 906 }); 907 908 return rez; 909 }; 910 911 // How much of an element is visible in viewport 912 // ============================================= 913 914 var inViewport = function (elem) { 915 var elemCenter, rez; 916 917 if (!elem || elem.ownerDocument !== document) { 918 return false; 919 } 920 921 $(".fancybox-container").css("pointer-events", "none"); 922 923 elemCenter = { 924 x: elem.getBoundingClientRect().left + elem.offsetWidth / 2, 925 y: elem.getBoundingClientRect().top + elem.offsetHeight / 2 926 }; 927 928 rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem; 929 930 $(".fancybox-container").css("pointer-events", ""); 931 932 return rez; 933 }; 934 935 // Class definition 936 // ================ 937 938 var FancyBox = function (content, opts, index) { 939 var self = this; 940 941 self.opts = mergeOpts({ 942 index: index 943 }, $.fancybox.defaults); 944 945 if ($.isPlainObject(opts)) { 946 self.opts = mergeOpts(self.opts, opts); 947 } 948 949 if ($.fancybox.isMobile) { 950 self.opts = mergeOpts(self.opts, self.opts.mobile); 951 } 952 953 self.id = self.opts.id || ++called; 954 955 self.currIndex = parseInt(self.opts.index, 10) || 0; 956 self.prevIndex = null; 957 958 self.prevPos = null; 959 self.currPos = 0; 960 961 self.firstRun = true; 962 963 // All group items 964 self.group = []; 965 966 // Existing slides (for current, next and previous gallery items) 967 self.slides = {}; 968 969 // Create group elements 970 self.addContent(content); 971 972 if (!self.group.length) { 973 return; 974 } 975 976 self.init(); 977 }; 978 979 $.extend(FancyBox.prototype, { 980 // Create DOM structure 981 // ==================== 982 983 init: function () { 984 var self = this, 985 firstItem = self.group[self.currIndex], 986 firstItemOpts = firstItem.opts, 987 $container, 988 buttonStr; 989 990 if (firstItemOpts.closeExisting) { 991 $.fancybox.close(true); 992 } 993 994 // Hide scrollbars 995 // =============== 996 997 $("body").addClass("fancybox-active"); 998 999 if ( 1000 !$.fancybox.getInstance() && 1001 firstItemOpts.hideScrollbar !== false && 1002 !$.fancybox.isMobile && 1003 document.body.scrollHeight > window.innerHeight 1004 ) { 1005 $("head").append( 1006 '<style id="fancybox-style-noscroll" type="text/css">.compensate-for-scrollbar{margin-right:' + 1007 (window.innerWidth - document.documentElement.clientWidth) + 1008 "px;}</style>" 1009 ); 1010 1011 $("body").addClass("compensate-for-scrollbar"); 1012 } 1013 1014 // Build html markup and set references 1015 // ==================================== 1016 1017 // Build html code for buttons and insert into main template 1018 buttonStr = ""; 1019 1020 $.each(firstItemOpts.buttons, function (index, value) { 1021 buttonStr += firstItemOpts.btnTpl[value] || ""; 1022 }); 1023 1024 // Create markup from base template, it will be initially hidden to 1025 // avoid unnecessary work like painting while initializing is not complete 1026 $container = $( 1027 self.translate( 1028 self, 1029 firstItemOpts.baseTpl 1030 .replace("{{buttons}}", buttonStr) 1031 .replace("{{arrows}}", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight) 1032 ) 1033 ) 1034 .attr("id", "fancybox-container-" + self.id) 1035 .addClass(firstItemOpts.baseClass) 1036 .data("FancyBox", self) 1037 .appendTo(firstItemOpts.parentEl); 1038 1039 // Create object holding references to jQuery wrapped nodes 1040 self.$refs = { 1041 container: $container 1042 }; 1043 1044 ["bg", "inner", "infobar", "toolbar", "stage", "caption", "navigation"].forEach(function (item) { 1045 self.$refs[item] = $container.find(".fancybox-" + item); 1046 }); 1047 1048 self.trigger("onInit"); 1049 1050 // Enable events, deactive previous instances 1051 self.activate(); 1052 1053 // Build slides, load and reveal content 1054 self.jumpTo(self.currIndex); 1055 }, 1056 1057 // Simple i18n support - replaces object keys found in template 1058 // with corresponding values 1059 // ============================================================ 1060 1061 translate: function (obj, str) { 1062 var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en; 1063 1064 return str.replace(/\{\{(\w+)\}\}/g, function (match, n) { 1065 return arr[n] === undefined ? match : arr[n]; 1066 }); 1067 }, 1068 1069 // Populate current group with fresh content 1070 // Check if each object has valid type and content 1071 // =============================================== 1072 1073 addContent: function (content) { 1074 var self = this, 1075 items = $.makeArray(content), 1076 thumbs; 1077 1078 $.each(items, function (i, item) { 1079 var obj = {}, 1080 opts = {}, 1081 $item, 1082 type, 1083 found, 1084 src, 1085 srcParts; 1086 1087 // Step 1 - Make sure we have an object 1088 // ==================================== 1089 1090 if ($.isPlainObject(item)) { 1091 // We probably have manual usage here, something like 1092 // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] ) 1093 1094 obj = item; 1095 opts = item.opts || item; 1096 } else if ($.type(item) === "object" && $(item).length) { 1097 // Here we probably have jQuery collection returned by some selector 1098 $item = $(item); 1099 1100 // Support attributes like `data-options='{"touch" : false}'` and `data-touch='false'` 1101 opts = $item.data() || {}; 1102 opts = $.extend(true, {}, opts, opts.options); 1103 1104 // Here we store clicked element 1105 opts.$orig = $item; 1106 1107 obj.src = self.opts.src || opts.src || $item.attr("href"); 1108 1109 // Assume that simple syntax is used, for example: 1110 // `$.fancybox.open( $("#test"), {} );` 1111 if (!obj.type && !obj.src) { 1112 obj.type = "inline"; 1113 obj.src = item; 1114 } 1115 } else { 1116 // Assume we have a simple html code, for example: 1117 // $.fancybox.open( '<div><h1>Hi!</h1></div>' ); 1118 obj = { 1119 type: "html", 1120 src: item + "" 1121 }; 1122 } 1123 1124 // Each gallery object has full collection of options 1125 obj.opts = $.extend(true, {}, self.opts, opts); 1126 1127 // Do not merge buttons array 1128 if ($.isArray(opts.buttons)) { 1129 obj.opts.buttons = opts.buttons; 1130 } 1131 1132 if ($.fancybox.isMobile && obj.opts.mobile) { 1133 obj.opts = mergeOpts(obj.opts, obj.opts.mobile); 1134 } 1135 1136 // Step 2 - Make sure we have content type, if not - try to guess 1137 // ============================================================== 1138 1139 type = obj.type || obj.opts.type; 1140 src = obj.src || ""; 1141 1142 if (!type && src) { 1143 if ((found = src.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))) { 1144 type = "video"; 1145 1146 if (!obj.opts.video.format) { 1147 obj.opts.video.format = "video/" + (found[1] === "ogv" ? "ogg" : found[1]); 1148 } 1149 } else if (src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)) { 1150 type = "image"; 1151 } else if (src.match(/\.(pdf)((\?|#).*)?$/i)) { 1152 type = "iframe"; 1153 obj = $.extend(true, obj, { 1154 contentType: "pdf", 1155 opts: { 1156 iframe: { 1157 preload: false 1158 } 1159 } 1160 }); 1161 } else if (src.charAt(0) === "#") { 1162 type = "inline"; 1163 } 1164 } 1165 1166 if (type) { 1167 obj.type = type; 1168 } else { 1169 self.trigger("objectNeedsType", obj); 1170 } 1171 1172 if (!obj.contentType) { 1173 obj.contentType = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1 ? "html" : obj.type; 1174 } 1175 1176 // Step 3 - Some adjustments 1177 // ========================= 1178 1179 obj.index = self.group.length; 1180 1181 if (obj.opts.smallBtn == "auto") { 1182 obj.opts.smallBtn = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1; 1183 } 1184 1185 if (obj.opts.toolbar === "auto") { 1186 obj.opts.toolbar = !obj.opts.smallBtn; 1187 } 1188 1189 // Find thumbnail image, check if exists and if is in the viewport 1190 obj.$thumb = obj.opts.$thumb || null; 1191 1192 if (obj.opts.$trigger && obj.index === self.opts.index) { 1193 obj.$thumb = obj.opts.$trigger.find("img:first"); 1194 1195 if (obj.$thumb.length) { 1196 obj.opts.$orig = obj.opts.$trigger; 1197 } 1198 } 1199 1200 if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) { 1201 obj.$thumb = obj.opts.$orig.find("img:first"); 1202 } 1203 1204 if (obj.$thumb && !obj.$thumb.length) { 1205 obj.$thumb = null; 1206 } 1207 1208 obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null); 1209 1210 // "caption" is a "special" option, it can be used to customize caption per gallery item 1211 if ($.type(obj.opts.caption) === "function") { 1212 obj.opts.caption = obj.opts.caption.apply(item, [self, obj]); 1213 } 1214 1215 if ($.type(self.opts.caption) === "function") { 1216 obj.opts.caption = self.opts.caption.apply(item, [self, obj]); 1217 } 1218 1219 // Make sure we have caption as a string or jQuery object 1220 if (!(obj.opts.caption instanceof $)) { 1221 obj.opts.caption = obj.opts.caption === undefined ? "" : obj.opts.caption + ""; 1222 } 1223 1224 // Check if url contains "filter" used to filter the content 1225 // Example: "ajax.html #something" 1226 if (obj.type === "ajax") { 1227 srcParts = src.split(/\s+/, 2); 1228 1229 if (srcParts.length > 1) { 1230 obj.src = srcParts.shift(); 1231 1232 obj.opts.filter = srcParts.shift(); 1233 } 1234 } 1235 1236 // Hide all buttons and disable interactivity for modal items 1237 if (obj.opts.modal) { 1238 obj.opts = $.extend(true, obj.opts, { 1239 trapFocus: true, 1240 // Remove buttons 1241 infobar: 0, 1242 toolbar: 0, 1243 1244 smallBtn: 0, 1245 1246 // Disable keyboard navigation 1247 keyboard: 0, 1248 1249 // Disable some modules 1250 slideShow: 0, 1251 fullScreen: 0, 1252 thumbs: 0, 1253 touch: 0, 1254 1255 // Disable click event handlers 1256 clickContent: false, 1257 clickSlide: false, 1258 clickOutside: false, 1259 dblclickContent: false, 1260 dblclickSlide: false, 1261 dblclickOutside: false 1262 }); 1263 } 1264 1265 // Step 4 - Add processed object to group 1266 // ====================================== 1267 1268 self.group.push(obj); 1269 }); 1270 1271 // Update controls if gallery is already opened 1272 if (Object.keys(self.slides).length) { 1273 self.updateControls(); 1274 1275 // Update thumbnails, if needed 1276 thumbs = self.Thumbs; 1277 1278 if (thumbs && thumbs.isActive) { 1279 thumbs.create(); 1280 1281 thumbs.focus(); 1282 } 1283 } 1284 }, 1285 1286 // Attach an event handler functions for: 1287 // - navigation buttons 1288 // - browser scrolling, resizing; 1289 // - focusing 1290 // - keyboard 1291 // - detecting inactivity 1292 // ====================================== 1293 1294 addEvents: function () { 1295 var self = this; 1296 1297 self.removeEvents(); 1298 1299 // Make navigation elements clickable 1300 // ================================== 1301 1302 self.$refs.container 1303 .on("click.fb-close", "[data-fancybox-close]", function (e) { 1304 e.stopPropagation(); 1305 e.preventDefault(); 1306 1307 self.close(e); 1308 }) 1309 .on("touchstart.fb-prev click.fb-prev", "[data-fancybox-prev]", function (e) { 1310 e.stopPropagation(); 1311 e.preventDefault(); 1312 1313 self.previous(); 1314 }) 1315 .on("touchstart.fb-next click.fb-next", "[data-fancybox-next]", function (e) { 1316 e.stopPropagation(); 1317 e.preventDefault(); 1318 1319 self.next(); 1320 }) 1321 .on("click.fb", "[data-fancybox-zoom]", function (e) { 1322 // Click handler for zoom button 1323 self[self.isScaledDown() ? "scaleToActual" : "scaleToFit"](); 1324 }); 1325 1326 // Handle page scrolling and browser resizing 1327 // ========================================== 1328 1329 $W.on("orientationchange.fb resize.fb", function (e) { 1330 if (e && e.originalEvent && e.originalEvent.type === "resize") { 1331 if (self.requestId) { 1332 cancelAFrame(self.requestId); 1333 } 1334 1335 self.requestId = requestAFrame(function () { 1336 self.update(e); 1337 }); 1338 } else { 1339 if (self.current && self.current.type === "iframe") { 1340 self.$refs.stage.hide(); 1341 } 1342 1343 setTimeout( 1344 function () { 1345 self.$refs.stage.show(); 1346 1347 self.update(e); 1348 }, 1349 $.fancybox.isMobile ? 600 : 250 1350 ); 1351 } 1352 }); 1353 1354 $D.on("keydown.fb", function (e) { 1355 var instance = $.fancybox ? $.fancybox.getInstance() : null, 1356 current = instance.current, 1357 keycode = e.keyCode || e.which; 1358 1359 // Trap keyboard focus inside of the modal 1360 // ======================================= 1361 1362 if (keycode == 9) { 1363 if (current.opts.trapFocus) { 1364 self.focus(e); 1365 } 1366 1367 return; 1368 } 1369 1370 // Enable keyboard navigation 1371 // ========================== 1372 1373 if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is("input,textarea,video,audio,select")) { 1374 return; 1375 } 1376 1377 // Backspace and Esc keys 1378 if (keycode === 8 || keycode === 27) { 1379 e.preventDefault(); 1380 1381 self.close(e); 1382 1383 return; 1384 } 1385 1386 // Left arrow and Up arrow 1387 if (keycode === 37 || keycode === 38) { 1388 e.preventDefault(); 1389 1390 self.previous(); 1391 1392 return; 1393 } 1394 1395 // Righ arrow and Down arrow 1396 if (keycode === 39 || keycode === 40) { 1397 e.preventDefault(); 1398 1399 self.next(); 1400 1401 return; 1402 } 1403 1404 self.trigger("afterKeydown", e, keycode); 1405 }); 1406 1407 // Hide controls after some inactivity period 1408 if (self.group[self.currIndex].opts.idleTime) { 1409 self.idleSecondsCounter = 0; 1410 1411 $D.on( 1412 "mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle", 1413 function (e) { 1414 self.idleSecondsCounter = 0; 1415 1416 if (self.isIdle) { 1417 self.showControls(); 1418 } 1419 1420 self.isIdle = false; 1421 } 1422 ); 1423 1424 self.idleInterval = window.setInterval(function () { 1425 self.idleSecondsCounter++; 1426 1427 if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) { 1428 self.isIdle = true; 1429 self.idleSecondsCounter = 0; 1430 1431 self.hideControls(); 1432 } 1433 }, 1000); 1434 } 1435 }, 1436 1437 // Remove events added by the core 1438 // =============================== 1439 1440 removeEvents: function () { 1441 var self = this; 1442 1443 $W.off("orientationchange.fb resize.fb"); 1444 $D.off("keydown.fb .fb-idle"); 1445 1446 this.$refs.container.off(".fb-close .fb-prev .fb-next"); 1447 1448 if (self.idleInterval) { 1449 window.clearInterval(self.idleInterval); 1450 1451 self.idleInterval = null; 1452 } 1453 }, 1454 1455 // Change to previous gallery item 1456 // =============================== 1457 1458 previous: function (duration) { 1459 return this.jumpTo(this.currPos - 1, duration); 1460 }, 1461 1462 // Change to next gallery item 1463 // =========================== 1464 1465 next: function (duration) { 1466 return this.jumpTo(this.currPos + 1, duration); 1467 }, 1468 1469 // Switch to selected gallery item 1470 // =============================== 1471 1472 jumpTo: function (pos, duration) { 1473 var self = this, 1474 groupLen = self.group.length, 1475 firstRun, 1476 isMoved, 1477 loop, 1478 current, 1479 previous, 1480 slidePos, 1481 stagePos, 1482 prop, 1483 diff; 1484 1485 if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) { 1486 return; 1487 } 1488 1489 // Should loop? 1490 pos = parseInt(pos, 10); 1491 loop = self.current ? self.current.opts.loop : self.opts.loop; 1492 1493 if (!loop && (pos < 0 || pos >= groupLen)) { 1494 return false; 1495 } 1496 1497 // Check if opening for the first time; this helps to speed things up 1498 firstRun = self.firstRun = !Object.keys(self.slides).length; 1499 1500 // Create slides 1501 previous = self.current; 1502 1503 self.prevIndex = self.currIndex; 1504 self.prevPos = self.currPos; 1505 1506 current = self.createSlide(pos); 1507 1508 if (groupLen > 1) { 1509 if (loop || current.index < groupLen - 1) { 1510 self.createSlide(pos + 1); 1511 } 1512 1513 if (loop || current.index > 0) { 1514 self.createSlide(pos - 1); 1515 } 1516 } 1517 1518 self.current = current; 1519 self.currIndex = current.index; 1520 self.currPos = current.pos; 1521 1522 self.trigger("beforeShow", firstRun); 1523 1524 self.updateControls(); 1525 1526 // Validate duration length 1527 current.forcedDuration = undefined; 1528 1529 if ($.isNumeric(duration)) { 1530 current.forcedDuration = duration; 1531 } else { 1532 duration = current.opts[firstRun ? "animationDuration" : "transitionDuration"]; 1533 } 1534 1535 duration = parseInt(duration, 10); 1536 1537 // Check if user has swiped the slides or if still animating 1538 isMoved = self.isMoved(current); 1539 1540 // Make sure current slide is visible 1541 current.$slide.addClass("fancybox-slide--current"); 1542 1543 // Fresh start - reveal container, current slide and start loading content 1544 if (firstRun) { 1545 if (current.opts.animationEffect && duration) { 1546 self.$refs.container.css("transition-duration", duration + "ms"); 1547 } 1548 1549 self.$refs.container.addClass("fancybox-is-open").trigger("focus"); 1550 1551 // Attempt to load content into slide 1552 // This will later call `afterLoad` -> `revealContent` 1553 self.loadSlide(current); 1554 1555 self.preload("image"); 1556 1557 return; 1558 } 1559 1560 // Get actual slide/stage positions (before cleaning up) 1561 slidePos = $.fancybox.getTranslate(previous.$slide); 1562 stagePos = $.fancybox.getTranslate(self.$refs.stage); 1563 1564 // Clean up all slides 1565 $.each(self.slides, function (index, slide) { 1566 $.fancybox.stop(slide.$slide, true); 1567 }); 1568 1569 if (previous.pos !== current.pos) { 1570 previous.isComplete = false; 1571 } 1572 1573 previous.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"); 1574 1575 // If slides are out of place, then animate them to correct position 1576 if (isMoved) { 1577 // Calculate horizontal swipe distance 1578 diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter); 1579 1580 $.each(self.slides, function (index, slide) { 1581 slide.$slide.removeClass("fancybox-animated").removeClass(function (index, className) { 1582 return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); 1583 }); 1584 1585 // Make sure that each slide is in equal distance 1586 // This is mostly needed for freshly added slides, because they are not yet positioned 1587 var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter; 1588 1589 $.fancybox.setTranslate(slide.$slide, { 1590 top: 0, 1591 left: leftPos - stagePos.left + diff 1592 }); 1593 1594 if (slide.pos !== current.pos) { 1595 slide.$slide.addClass("fancybox-slide--" + (slide.pos > current.pos ? "next" : "previous")); 1596 } 1597 1598 // Redraw to make sure that transition will start 1599 forceRedraw(slide.$slide); 1600 1601 // Animate the slide 1602 $.fancybox.animate( 1603 slide.$slide, { 1604 top: 0, 1605 left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter 1606 }, 1607 duration, 1608 function () { 1609 slide.$slide 1610 .css({ 1611 transform: "", 1612 opacity: "" 1613 }) 1614 .removeClass("fancybox-slide--next fancybox-slide--previous"); 1615 1616 if (slide.pos === self.currPos) { 1617 self.complete(); 1618 } 1619 } 1620 ); 1621 }); 1622 } else if (duration && current.opts.transitionEffect) { 1623 // Set transition effect for previously active slide 1624 prop = "fancybox-animated fancybox-fx-" + current.opts.transitionEffect; 1625 1626 previous.$slide.addClass("fancybox-slide--" + (previous.pos > current.pos ? "next" : "previous")); 1627 1628 $.fancybox.animate( 1629 previous.$slide, 1630 prop, 1631 duration, 1632 function () { 1633 previous.$slide.removeClass(prop).removeClass("fancybox-slide--next fancybox-slide--previous"); 1634 }, 1635 false 1636 ); 1637 } 1638 1639 if (current.isLoaded) { 1640 self.revealContent(current); 1641 } else { 1642 self.loadSlide(current); 1643 } 1644 1645 self.preload("image"); 1646 }, 1647 1648 // Create new "slide" element 1649 // These are gallery items that are actually added to DOM 1650 // ======================================================= 1651 1652 createSlide: function (pos) { 1653 var self = this, 1654 $slide, 1655 index; 1656 1657 index = pos % self.group.length; 1658 index = index < 0 ? self.group.length + index : index; 1659 1660 if (!self.slides[pos] && self.group[index]) { 1661 $slide = $('<div class="fancybox-slide"></div>').appendTo(self.$refs.stage); 1662 1663 self.slides[pos] = $.extend(true, {}, self.group[index], { 1664 pos: pos, 1665 $slide: $slide, 1666 isLoaded: false 1667 }); 1668 1669 self.updateSlide(self.slides[pos]); 1670 } 1671 1672 return self.slides[pos]; 1673 }, 1674 1675 // Scale image to the actual size of the image; 1676 // x and y values should be relative to the slide 1677 // ============================================== 1678 1679 scaleToActual: function (x, y, duration) { 1680 var self = this, 1681 current = self.current, 1682 $content = current.$content, 1683 canvasWidth = $.fancybox.getTranslate(current.$slide).width, 1684 canvasHeight = $.fancybox.getTranslate(current.$slide).height, 1685 newImgWidth = current.width, 1686 newImgHeight = current.height, 1687 imgPos, 1688 posX, 1689 posY, 1690 scaleX, 1691 scaleY; 1692 1693 if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { 1694 return; 1695 } 1696 1697 self.isAnimating = true; 1698 1699 $.fancybox.stop($content); 1700 1701 x = x === undefined ? canvasWidth * 0.5 : x; 1702 y = y === undefined ? canvasHeight * 0.5 : y; 1703 1704 imgPos = $.fancybox.getTranslate($content); 1705 1706 imgPos.top -= $.fancybox.getTranslate(current.$slide).top; 1707 imgPos.left -= $.fancybox.getTranslate(current.$slide).left; 1708 1709 scaleX = newImgWidth / imgPos.width; 1710 scaleY = newImgHeight / imgPos.height; 1711 1712 // Get center position for original image 1713 posX = canvasWidth * 0.5 - newImgWidth * 0.5; 1714 posY = canvasHeight * 0.5 - newImgHeight * 0.5; 1715 1716 // Make sure image does not move away from edges 1717 if (newImgWidth > canvasWidth) { 1718 posX = imgPos.left * scaleX - (x * scaleX - x); 1719 1720 if (posX > 0) { 1721 posX = 0; 1722 } 1723 1724 if (posX < canvasWidth - newImgWidth) { 1725 posX = canvasWidth - newImgWidth; 1726 } 1727 } 1728 1729 if (newImgHeight > canvasHeight) { 1730 posY = imgPos.top * scaleY - (y * scaleY - y); 1731 1732 if (posY > 0) { 1733 posY = 0; 1734 } 1735 1736 if (posY < canvasHeight - newImgHeight) { 1737 posY = canvasHeight - newImgHeight; 1738 } 1739 } 1740 1741 self.updateCursor(newImgWidth, newImgHeight); 1742 1743 $.fancybox.animate( 1744 $content, { 1745 top: posY, 1746 left: posX, 1747 scaleX: scaleX, 1748 scaleY: scaleY 1749 }, 1750 duration || 366, 1751 function () { 1752 self.isAnimating = false; 1753 } 1754 ); 1755 1756 // Stop slideshow 1757 if (self.SlideShow && self.SlideShow.isActive) { 1758 self.SlideShow.stop(); 1759 } 1760 }, 1761 1762 // Scale image to fit inside parent element 1763 // ======================================== 1764 1765 scaleToFit: function (duration) { 1766 var self = this, 1767 current = self.current, 1768 $content = current.$content, 1769 end; 1770 1771 if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { 1772 return; 1773 } 1774 1775 self.isAnimating = true; 1776 1777 $.fancybox.stop($content); 1778 1779 end = self.getFitPos(current); 1780 1781 self.updateCursor(end.width, end.height); 1782 1783 $.fancybox.animate( 1784 $content, { 1785 top: end.top, 1786 left: end.left, 1787 scaleX: end.width / $content.width(), 1788 scaleY: end.height / $content.height() 1789 }, 1790 duration || 366, 1791 function () { 1792 self.isAnimating = false; 1793 } 1794 ); 1795 }, 1796 1797 // Calculate image size to fit inside viewport 1798 // =========================================== 1799 1800 getFitPos: function (slide) { 1801 var self = this, 1802 $content = slide.$content, 1803 $slide = slide.$slide, 1804 width = slide.width || slide.opts.width, 1805 height = slide.height || slide.opts.height, 1806 maxWidth, 1807 maxHeight, 1808 minRatio, 1809 aspectRatio, 1810 rez = {}; 1811 1812 if (!slide.isLoaded || !$content || !$content.length) { 1813 return false; 1814 } 1815 1816 maxWidth = $.fancybox.getTranslate(self.$refs.stage).width; 1817 maxHeight = $.fancybox.getTranslate(self.$refs.stage).height; 1818 1819 maxWidth -= 1820 parseFloat($slide.css("paddingLeft")) + 1821 parseFloat($slide.css("paddingRight")) + 1822 parseFloat($content.css("marginLeft")) + 1823 parseFloat($content.css("marginRight")); 1824 1825 maxHeight -= 1826 parseFloat($slide.css("paddingTop")) + 1827 parseFloat($slide.css("paddingBottom")) + 1828 parseFloat($content.css("marginTop")) + 1829 parseFloat($content.css("marginBottom")); 1830 1831 if (!width || !height) { 1832 width = maxWidth; 1833 height = maxHeight; 1834 } 1835 1836 minRatio = Math.min(1, maxWidth / width, maxHeight / height); 1837 1838 width = minRatio * width; 1839 height = minRatio * height; 1840 1841 // Adjust width/height to precisely fit into container 1842 if (width > maxWidth - 0.5) { 1843 width = maxWidth; 1844 } 1845 1846 if (height > maxHeight - 0.5) { 1847 height = maxHeight; 1848 } 1849 1850 if (slide.type === "image") { 1851 rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css("paddingTop")); 1852 rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css("paddingLeft")); 1853 } else if (slide.contentType === "video") { 1854 // Force aspect ratio for the video 1855 // "I say the whole world must learn of our peaceful ways… by force!" 1856 aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9; 1857 1858 if (height > width / aspectRatio) { 1859 height = width / aspectRatio; 1860 } else if (width > height * aspectRatio) { 1861 width = height * aspectRatio; 1862 } 1863 } 1864 1865 rez.width = width; 1866 rez.height = height; 1867 1868 return rez; 1869 }, 1870 1871 // Update content size and position for all slides 1872 // ============================================== 1873 1874 update: function (e) { 1875 var self = this; 1876 1877 $.each(self.slides, function (key, slide) { 1878 self.updateSlide(slide, e); 1879 }); 1880 }, 1881 1882 // Update slide content position and size 1883 // ====================================== 1884 1885 updateSlide: function (slide, e) { 1886 var self = this, 1887 $content = slide && slide.$content, 1888 width = slide.width || slide.opts.width, 1889 height = slide.height || slide.opts.height, 1890 $slide = slide.$slide; 1891 1892 // First, prevent caption overlap, if needed 1893 self.adjustCaption(slide); 1894 1895 // Then resize content to fit inside the slide 1896 if ($content && (width || height || slide.contentType === "video") && !slide.hasError) { 1897 $.fancybox.stop($content); 1898 1899 $.fancybox.setTranslate($content, self.getFitPos(slide)); 1900 1901 if (slide.pos === self.currPos) { 1902 self.isAnimating = false; 1903 1904 self.updateCursor(); 1905 } 1906 } 1907 1908 // Then some adjustments 1909 self.adjustLayout(slide); 1910 1911 if ($slide.length) { 1912 $slide.trigger("refresh"); 1913 1914 if (slide.pos === self.currPos) { 1915 self.$refs.toolbar 1916 .add(self.$refs.navigation.find(".fancybox-button--arrow_right")) 1917 .toggleClass("compensate-for-scrollbar", $slide.get(0).scrollHeight > $slide.get(0).clientHeight); 1918 } 1919 } 1920 1921 self.trigger("onUpdate", slide, e); 1922 }, 1923 1924 // Horizontally center slide 1925 // ========================= 1926 1927 centerSlide: function (duration) { 1928 var self = this, 1929 current = self.current, 1930 $slide = current.$slide; 1931 1932 if (self.isClosing || !current) { 1933 return; 1934 } 1935 1936 $slide.siblings().css({ 1937 transform: "", 1938 opacity: "" 1939 }); 1940 1941 $slide 1942 .parent() 1943 .children() 1944 .removeClass("fancybox-slide--previous fancybox-slide--next"); 1945 1946 $.fancybox.animate( 1947 $slide, { 1948 top: 0, 1949 left: 0, 1950 opacity: 1 1951 }, 1952 duration === undefined ? 0 : duration, 1953 function () { 1954 // Clean up 1955 $slide.css({ 1956 transform: "", 1957 opacity: "" 1958 }); 1959 1960 if (!current.isComplete) { 1961 self.complete(); 1962 } 1963 }, 1964 false 1965 ); 1966 }, 1967 1968 // Check if current slide is moved (swiped) 1969 // ======================================== 1970 1971 isMoved: function (slide) { 1972 var current = slide || this.current, 1973 slidePos, 1974 stagePos; 1975 1976 if (!current) { 1977 return false; 1978 } 1979 1980 stagePos = $.fancybox.getTranslate(this.$refs.stage); 1981 slidePos = $.fancybox.getTranslate(current.$slide); 1982 1983 return ( 1984 !current.$slide.hasClass("fancybox-animated") && 1985 (Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5) 1986 ); 1987 }, 1988 1989 // Update cursor style depending if content can be zoomed 1990 // ====================================================== 1991 1992 updateCursor: function (nextWidth, nextHeight) { 1993 var self = this, 1994 current = self.current, 1995 $container = self.$refs.container, 1996 canPan, 1997 isZoomable; 1998 1999 if (!current || self.isClosing || !self.Guestures) { 2000 return; 2001 } 2002 2003 $container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"); 2004 2005 canPan = self.canPan(nextWidth, nextHeight); 2006 2007 isZoomable = canPan ? true : self.isZoomable(); 2008 2009 $container.toggleClass("fancybox-is-zoomable", isZoomable); 2010 2011 $("[data-fancybox-zoom]").prop("disabled", !isZoomable); 2012 2013 if (canPan) { 2014 $container.addClass("fancybox-can-pan"); 2015 } else if ( 2016 isZoomable && 2017 (current.opts.clickContent === "zoom" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == "zoom")) 2018 ) { 2019 $container.addClass("fancybox-can-zoomIn"); 2020 } else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== "video") { 2021 $container.addClass("fancybox-can-swipe"); 2022 } 2023 }, 2024 2025 // Check if current slide is zoomable 2026 // ================================== 2027 2028 isZoomable: function () { 2029 var self = this, 2030 current = self.current, 2031 fitPos; 2032 2033 // Assume that slide is zoomable if: 2034 // - image is still loading 2035 // - actual size of the image is smaller than available area 2036 if (current && !self.isClosing && current.type === "image" && !current.hasError) { 2037 if (!current.isLoaded) { 2038 return true; 2039 } 2040 2041 fitPos = self.getFitPos(current); 2042 2043 if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) { 2044 return true; 2045 } 2046 } 2047 2048 return false; 2049 }, 2050 2051 // Check if current image dimensions are smaller than actual 2052 // ========================================================= 2053 2054 isScaledDown: function (nextWidth, nextHeight) { 2055 var self = this, 2056 rez = false, 2057 current = self.current, 2058 $content = current.$content; 2059 2060 if (nextWidth !== undefined && nextHeight !== undefined) { 2061 rez = nextWidth < current.width && nextHeight < current.height; 2062 } else if ($content) { 2063 rez = $.fancybox.getTranslate($content); 2064 rez = rez.width < current.width && rez.height < current.height; 2065 } 2066 2067 return rez; 2068 }, 2069 2070 // Check if image dimensions exceed parent element 2071 // =============================================== 2072 2073 canPan: function (nextWidth, nextHeight) { 2074 var self = this, 2075 current = self.current, 2076 pos = null, 2077 rez = false; 2078 2079 if (current.type === "image" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) { 2080 rez = self.getFitPos(current); 2081 2082 if (nextWidth !== undefined && nextHeight !== undefined) { 2083 pos = { 2084 width: nextWidth, 2085 height: nextHeight 2086 }; 2087 } else if (current.isComplete) { 2088 pos = $.fancybox.getTranslate(current.$content); 2089 } 2090 2091 if (pos && rez) { 2092 rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5; 2093 } 2094 } 2095 2096 return rez; 2097 }, 2098 2099 // Load content into the slide 2100 // =========================== 2101 2102 loadSlide: function (slide) { 2103 var self = this, 2104 type, 2105 $slide, 2106 ajaxLoad; 2107 2108 if (slide.isLoading || slide.isLoaded) { 2109 return; 2110 } 2111 2112 slide.isLoading = true; 2113 2114 if (self.trigger("beforeLoad", slide) === false) { 2115 slide.isLoading = false; 2116 2117 return false; 2118 } 2119 2120 type = slide.type; 2121 $slide = slide.$slide; 2122 2123 $slide 2124 .off("refresh") 2125 .trigger("onReset") 2126 .addClass(slide.opts.slideClass); 2127 2128 // Create content depending on the type 2129 switch (type) { 2130 case "image": 2131 self.setImage(slide); 2132 2133 break; 2134 2135 case "iframe": 2136 self.setIframe(slide); 2137 2138 break; 2139 2140 case "html": 2141 self.setContent(slide, slide.src || slide.content); 2142 2143 break; 2144 2145 case "video": 2146 self.setContent( 2147 slide, 2148 slide.opts.video.tpl 2149 .replace(/\{\{src\}\}/gi, slide.src) 2150 .replace("{{format}}", slide.opts.videoFormat || slide.opts.video.format || "") 2151 .replace("{{poster}}", slide.thumb || "") 2152 ); 2153 2154 break; 2155 2156 case "inline": 2157 if ($(slide.src).length) { 2158 self.setContent(slide, $(slide.src)); 2159 } else { 2160 self.setError(slide); 2161 } 2162 2163 break; 2164 2165 case "ajax": 2166 self.showLoading(slide); 2167 2168 ajaxLoad = $.ajax( 2169 $.extend({}, slide.opts.ajax.settings, { 2170 url: slide.src, 2171 success: function (data, textStatus) { 2172 if (textStatus === "success") { 2173 self.setContent(slide, data); 2174 } 2175 }, 2176 error: function (jqXHR, textStatus) { 2177 if (jqXHR && textStatus !== "abort") { 2178 self.setError(slide); 2179 } 2180 } 2181 }) 2182 ); 2183 2184 $slide.one("onReset", function () { 2185 ajaxLoad.abort(); 2186 }); 2187 2188 break; 2189 2190 default: 2191 self.setError(slide); 2192 2193 break; 2194 } 2195 2196 return true; 2197 }, 2198 2199 // Use thumbnail image, if possible 2200 // ================================ 2201 2202 setImage: function (slide) { 2203 var self = this, 2204 ghost; 2205 2206 // Check if need to show loading icon 2207 setTimeout(function () { 2208 var $img = slide.$image; 2209 2210 if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) { 2211 self.showLoading(slide); 2212 } 2213 }, 50); 2214 2215 //Check if image has srcset 2216 self.checkSrcset(slide); 2217 2218 // This will be wrapper containing both ghost and actual image 2219 slide.$content = $('<div class="fancybox-content"></div>') 2220 .addClass("fancybox-is-hidden") 2221 .appendTo(slide.$slide.addClass("fancybox-slide--image")); 2222 2223 // If we have a thumbnail, we can display it while actual image is loading 2224 // Users will not stare at black screen and actual image will appear gradually 2225 if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) { 2226 slide.width = slide.opts.width; 2227 slide.height = slide.opts.height; 2228 2229 ghost = document.createElement("img"); 2230 2231 ghost.onerror = function () { 2232 $(this).remove(); 2233 2234 slide.$ghost = null; 2235 }; 2236 2237 ghost.onload = function () { 2238 self.afterLoad(slide); 2239 }; 2240 2241 slide.$ghost = $(ghost) 2242 .addClass("fancybox-image") 2243 .appendTo(slide.$content) 2244 .attr("src", slide.thumb); 2245 } 2246 2247 // Start loading actual image 2248 self.setBigImage(slide); 2249 }, 2250 2251 // Check if image has srcset and get the source 2252 // ============================================ 2253 checkSrcset: function (slide) { 2254 var srcset = slide.opts.srcset || slide.opts.image.srcset, 2255 found, 2256 temp, 2257 pxRatio, 2258 windowWidth; 2259 2260 // If we have "srcset", then we need to find first matching "src" value. 2261 // This is necessary, because when you set an src attribute, the browser will preload the image 2262 // before any javascript or even CSS is applied. 2263 if (srcset) { 2264 pxRatio = window.devicePixelRatio || 1; 2265 windowWidth = window.innerWidth * pxRatio; 2266 2267 temp = srcset.split(",").map(function (el) { 2268 var ret = {}; 2269 2270 el.trim() 2271 .split(/\s+/) 2272 .forEach(function (el, i) { 2273 var value = parseInt(el.substring(0, el.length - 1), 10); 2274 2275 if (i === 0) { 2276 return (ret.url = el); 2277 } 2278 2279 if (value) { 2280 ret.value = value; 2281 ret.postfix = el[el.length - 1]; 2282 } 2283 }); 2284 2285 return ret; 2286 }); 2287 2288 // Sort by value 2289 temp.sort(function (a, b) { 2290 return a.value - b.value; 2291 }); 2292 2293 // Ok, now we have an array of all srcset values 2294 for (var j = 0; j < temp.length; j++) { 2295 var el = temp[j]; 2296 2297 if ((el.postfix === "w" && el.value >= windowWidth) || (el.postfix === "x" && el.value >= pxRatio)) { 2298 found = el; 2299 break; 2300 } 2301 } 2302 2303 // If not found, take the last one 2304 if (!found && temp.length) { 2305 found = temp[temp.length - 1]; 2306 } 2307 2308 if (found) { 2309 slide.src = found.url; 2310 2311 // If we have default width/height values, we can calculate height for matching source 2312 if (slide.width && slide.height && found.postfix == "w") { 2313 slide.height = (slide.width / slide.height) * found.value; 2314 slide.width = found.value; 2315 } 2316 2317 slide.opts.srcset = srcset; 2318 } 2319 } 2320 }, 2321 2322 // Create full-size image 2323 // ====================== 2324 2325 setBigImage: function (slide) { 2326 var self = this, 2327 img = document.createElement("img"), 2328 $img = $(img); 2329 2330 slide.$image = $img 2331 .one("error", function () { 2332 self.setError(slide); 2333 }) 2334 .one("load", function () { 2335 var sizes; 2336 2337 if (!slide.$ghost) { 2338 self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight); 2339 2340 self.afterLoad(slide); 2341 } 2342 2343 if (self.isClosing) { 2344 return; 2345 } 2346 2347 if (slide.opts.srcset) { 2348 sizes = slide.opts.sizes; 2349 2350 if (!sizes || sizes === "auto") { 2351 sizes = 2352 (slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? "100" : Math.round((slide.width / slide.height) * 100)) + 2353 "vw"; 2354 } 2355 2356 $img.attr("sizes", sizes).attr("srcset", slide.opts.srcset); 2357 } 2358 2359 // Hide temporary image after some delay 2360 if (slide.$ghost) { 2361 setTimeout(function () { 2362 if (slide.$ghost && !self.isClosing) { 2363 slide.$ghost.hide(); 2364 } 2365 }, Math.min(300, Math.max(1000, slide.height / 1600))); 2366 } 2367 2368 self.hideLoading(slide); 2369 }) 2370 .addClass("fancybox-image") 2371 .attr("src", slide.src) 2372 .appendTo(slide.$content); 2373 2374 if ((img.complete || img.readyState == "complete") && $img.naturalWidth && $img.naturalHeight) { 2375 $img.trigger("load"); 2376 } else if (img.error) { 2377 $img.trigger("error"); 2378 } 2379 }, 2380 2381 // Computes the slide size from image size and maxWidth/maxHeight 2382 // ============================================================== 2383 2384 resolveImageSlideSize: function (slide, imgWidth, imgHeight) { 2385 var maxWidth = parseInt(slide.opts.width, 10), 2386 maxHeight = parseInt(slide.opts.height, 10); 2387 2388 // Sets the default values from the image 2389 slide.width = imgWidth; 2390 slide.height = imgHeight; 2391 2392 if (maxWidth > 0) { 2393 slide.width = maxWidth; 2394 slide.height = Math.floor((maxWidth * imgHeight) / imgWidth); 2395 } 2396 2397 if (maxHeight > 0) { 2398 slide.width = Math.floor((maxHeight * imgWidth) / imgHeight); 2399 slide.height = maxHeight; 2400 } 2401 }, 2402 2403 // Create iframe wrapper, iframe and bindings 2404 // ========================================== 2405 2406 setIframe: function (slide) { 2407 var self = this, 2408 opts = slide.opts.iframe, 2409 $slide = slide.$slide, 2410 $iframe; 2411 2412 slide.$content = $('<div class="fancybox-content' + (opts.preload ? " fancybox-is-hidden" : "") + '"></div>') 2413 .css(opts.css) 2414 .appendTo($slide); 2415 2416 $slide.addClass("fancybox-slide--" + slide.contentType); 2417 2418 slide.$iframe = $iframe = $(opts.tpl.replace(/\{rnd\}/g, new Date().getTime())) 2419 .attr(opts.attr) 2420 .appendTo(slide.$content); 2421 2422 if (opts.preload) { 2423 self.showLoading(slide); 2424 2425 // Unfortunately, it is not always possible to determine if iframe is successfully loaded 2426 // (due to browser security policy) 2427 2428 $iframe.on("load.fb error.fb", function (e) { 2429 this.isReady = 1; 2430 2431 slide.$slide.trigger("refresh"); 2432 2433 self.afterLoad(slide); 2434 }); 2435 2436 // Recalculate iframe content size 2437 // =============================== 2438 2439 $slide.on("refresh.fb", function () { 2440 var $content = slide.$content, 2441 frameWidth = opts.css.width, 2442 frameHeight = opts.css.height, 2443 $contents, 2444 $body; 2445 2446 if ($iframe[0].isReady !== 1) { 2447 return; 2448 } 2449 2450 try { 2451 $contents = $iframe.contents(); 2452 $body = $contents.find("body"); 2453 } catch (ignore) {} 2454 2455 // Calculate content dimensions, if it is accessible 2456 if ($body && $body.length && $body.children().length) { 2457 // Avoid scrolling to top (if multiple instances) 2458 $slide.css("overflow", "visible"); 2459 2460 $content.css({ 2461 width: "100%", 2462 "max-width": "100%", 2463 height: "9999px" 2464 }); 2465 2466 if (frameWidth === undefined) { 2467 frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true))); 2468 } 2469 2470 $content.css("width", frameWidth ? frameWidth : "").css("max-width", ""); 2471 2472 if (frameHeight === undefined) { 2473 frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true))); 2474 } 2475 2476 $content.css("height", frameHeight ? frameHeight : ""); 2477 2478 $slide.css("overflow", "auto"); 2479 } 2480 2481 $content.removeClass("fancybox-is-hidden"); 2482 }); 2483 } else { 2484 self.afterLoad(slide); 2485 } 2486 2487 $iframe.attr("src", slide.src); 2488 2489 // Remove iframe if closing or changing gallery item 2490 $slide.one("onReset", function () { 2491 // This helps IE not to throw errors when closing 2492 try { 2493 $(this) 2494 .find("iframe") 2495 .hide() 2496 .unbind() 2497 .attr("src", "//about:blank"); 2498 } catch (ignore) {} 2499 2500 $(this) 2501 .off("refresh.fb") 2502 .empty(); 2503 2504 slide.isLoaded = false; 2505 slide.isRevealed = false; 2506 }); 2507 }, 2508 2509 // Wrap and append content to the slide 2510 // ====================================== 2511 2512 setContent: function (slide, content) { 2513 var self = this; 2514 2515 if (self.isClosing) { 2516 return; 2517 } 2518 2519 self.hideLoading(slide); 2520 2521 if (slide.$content) { 2522 $.fancybox.stop(slide.$content); 2523 } 2524 2525 slide.$slide.empty(); 2526 2527 // If content is a jQuery object, then it will be moved to the slide. 2528 // The placeholder is created so we will know where to put it back. 2529 if (isQuery(content) && content.parent().length) { 2530 // Make sure content is not already moved to fancyBox 2531 if (content.hasClass("fancybox-content") || content.parent().hasClass("fancybox-content")) { 2532 content.parents(".fancybox-slide").trigger("onReset"); 2533 } 2534 2535 // Create temporary element marking original place of the content 2536 slide.$placeholder = $("<div>") 2537 .hide() 2538 .insertAfter(content); 2539 2540 // Make sure content is visible 2541 content.css("display", "inline-block"); 2542 } else if (!slide.hasError) { 2543 // If content is just a plain text, try to convert it to html 2544 if ($.type(content) === "string") { 2545 content = $("<div>") 2546 .append($.trim(content)) 2547 .contents(); 2548 } 2549 2550 // If "filter" option is provided, then filter content 2551 if (slide.opts.filter) { 2552 content = $("<div>") 2553 .html(content) 2554 .find(slide.opts.filter); 2555 } 2556 } 2557 2558 slide.$slide.one("onReset", function () { 2559 // Pause all html5 video/audio 2560 $(this) 2561 .find("video,audio") 2562 .trigger("pause"); 2563 2564 // Put content back 2565 if (slide.$placeholder) { 2566 slide.$placeholder.after(content.removeClass("fancybox-content").hide()).remove(); 2567 2568 slide.$placeholder = null; 2569 } 2570 2571 // Remove custom close button 2572 if (slide.$smallBtn) { 2573 slide.$smallBtn.remove(); 2574 2575 slide.$smallBtn = null; 2576 } 2577 2578 // Remove content and mark slide as not loaded 2579 if (!slide.hasError) { 2580 $(this).empty(); 2581 2582 slide.isLoaded = false; 2583 slide.isRevealed = false; 2584 } 2585 }); 2586 2587 $(content).appendTo(slide.$slide); 2588 2589 if ($(content).is("video,audio")) { 2590 $(content).addClass("fancybox-video"); 2591 2592 $(content).wrap("<div></div>"); 2593 2594 slide.contentType = "video"; 2595 2596 slide.opts.width = slide.opts.width || $(content).attr("width"); 2597 slide.opts.height = slide.opts.height || $(content).attr("height"); 2598 } 2599 2600 slide.$content = slide.$slide 2601 .children() 2602 .filter("div,form,main,video,audio,article,.fancybox-content") 2603 .first(); 2604 2605 slide.$content.siblings().hide(); 2606 2607 // Re-check if there is a valid content 2608 // (in some cases, ajax response can contain various elements or plain text) 2609 if (!slide.$content.length) { 2610 slide.$content = slide.$slide 2611 .wrapInner("<div></div>") 2612 .children() 2613 .first(); 2614 } 2615 2616 slide.$content.addClass("fancybox-content"); 2617 2618 slide.$slide.addClass("fancybox-slide--" + slide.contentType); 2619 2620 self.afterLoad(slide); 2621 }, 2622 2623 // Display error message 2624 // ===================== 2625 2626 setError: function (slide) { 2627 slide.hasError = true; 2628 2629 slide.$slide 2630 .trigger("onReset") 2631 .removeClass("fancybox-slide--" + slide.contentType) 2632 .addClass("fancybox-slide--error"); 2633 2634 slide.contentType = "html"; 2635 2636 this.setContent(slide, this.translate(slide, slide.opts.errorTpl)); 2637 2638 if (slide.pos === this.currPos) { 2639 this.isAnimating = false; 2640 } 2641 }, 2642 2643 // Show loading icon inside the slide 2644 // ================================== 2645 2646 showLoading: function (slide) { 2647 var self = this; 2648 2649 slide = slide || self.current; 2650 2651 if (slide && !slide.$spinner) { 2652 slide.$spinner = $(self.translate(self, self.opts.spinnerTpl)) 2653 .appendTo(slide.$slide) 2654 .hide() 2655 .fadeIn("fast"); 2656 } 2657 }, 2658 2659 // Remove loading icon from the slide 2660 // ================================== 2661 2662 hideLoading: function (slide) { 2663 var self = this; 2664 2665 slide = slide || self.current; 2666 2667 if (slide && slide.$spinner) { 2668 slide.$spinner.stop().remove(); 2669 2670 delete slide.$spinner; 2671 } 2672 }, 2673 2674 // Adjustments after slide content has been loaded 2675 // =============================================== 2676 2677 afterLoad: function (slide) { 2678 var self = this; 2679 2680 if (self.isClosing) { 2681 return; 2682 } 2683 2684 slide.isLoading = false; 2685 slide.isLoaded = true; 2686 2687 self.trigger("afterLoad", slide); 2688 2689 self.hideLoading(slide); 2690 2691 // Add small close button 2692 if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) { 2693 slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content); 2694 } 2695 2696 // Disable right click 2697 if (slide.opts.protect && slide.$content && !slide.hasError) { 2698 slide.$content.on("contextmenu.fb", function (e) { 2699 if (e.button == 2) { 2700 e.preventDefault(); 2701 } 2702 2703 return true; 2704 }); 2705 2706 // Add fake element on top of the image 2707 // This makes a bit harder for user to select image 2708 if (slide.type === "image") { 2709 $('<div class="fancybox-spaceball"></div>').appendTo(slide.$content); 2710 } 2711 } 2712 2713 self.adjustCaption(slide); 2714 2715 self.adjustLayout(slide); 2716 2717 if (slide.pos === self.currPos) { 2718 self.updateCursor(); 2719 } 2720 2721 self.revealContent(slide); 2722 }, 2723 2724 // Prevent caption overlap, 2725 // fix css inconsistency across browsers 2726 // ===================================== 2727 2728 adjustCaption: function (slide) { 2729 var self = this, 2730 current = slide || self.current, 2731 caption = current.opts.caption, 2732 preventOverlap = current.opts.preventCaptionOverlap, 2733 $caption = self.$refs.caption, 2734 $clone, 2735 captionH = false; 2736 2737 $caption.toggleClass("fancybox-caption--separate", preventOverlap); 2738 2739 if (preventOverlap && caption && caption.length) { 2740 if (current.pos !== self.currPos) { 2741 $clone = $caption.clone().appendTo($caption.parent()); 2742 2743 $clone 2744 .children() 2745 .eq(0) 2746 .empty() 2747 .html(caption); 2748 2749 captionH = $clone.outerHeight(true); 2750 2751 $clone.empty().remove(); 2752 } else if (self.$caption) { 2753 captionH = self.$caption.outerHeight(true); 2754 } 2755 2756 current.$slide.css("padding-bottom", captionH || ""); 2757 } 2758 }, 2759 2760 // Simple hack to fix inconsistency across browsers, described here (affects Edge, too): 2761 // https://bugzilla.mozilla.org/show_bug.cgi?id=748518 2762 // ==================================================================================== 2763 2764 adjustLayout: function (slide) { 2765 var self = this, 2766 current = slide || self.current, 2767 scrollHeight, 2768 marginBottom, 2769 inlinePadding, 2770 actualPadding; 2771 2772 if (current.isLoaded && current.opts.disableLayoutFix !== true) { 2773 current.$content.css("margin-bottom", ""); 2774 2775 // If we would always set margin-bottom for the content, 2776 // then it would potentially break vertical align 2777 if (current.$content.outerHeight() > current.$slide.height() + 0.5) { 2778 inlinePadding = current.$slide[0].style["padding-bottom"]; 2779 actualPadding = current.$slide.css("padding-bottom"); 2780 2781 if (parseFloat(actualPadding) > 0) { 2782 scrollHeight = current.$slide[0].scrollHeight; 2783 2784 current.$slide.css("padding-bottom", 0); 2785 2786 if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) { 2787 marginBottom = actualPadding; 2788 } 2789 2790 current.$slide.css("padding-bottom", inlinePadding); 2791 } 2792 } 2793 2794 current.$content.css("margin-bottom", marginBottom); 2795 } 2796 }, 2797 2798 // Make content visible 2799 // This method is called right after content has been loaded or 2800 // user navigates gallery and transition should start 2801 // ============================================================ 2802 2803 revealContent: function (slide) { 2804 var self = this, 2805 $slide = slide.$slide, 2806 end = false, 2807 start = false, 2808 isMoved = self.isMoved(slide), 2809 isRevealed = slide.isRevealed, 2810 effect, 2811 effectClassName, 2812 duration, 2813 opacity; 2814 2815 slide.isRevealed = true; 2816 2817 effect = slide.opts[self.firstRun ? "animationEffect" : "transitionEffect"]; 2818 duration = slide.opts[self.firstRun ? "animationDuration" : "transitionDuration"]; 2819 2820 duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10); 2821 2822 if (isMoved || slide.pos !== self.currPos || !duration) { 2823 effect = false; 2824 } 2825 2826 // Check if can zoom 2827 if (effect === "zoom") { 2828 if (slide.pos === self.currPos && duration && slide.type === "image" && !slide.hasError && (start = self.getThumbPos(slide))) { 2829 end = self.getFitPos(slide); 2830 } else { 2831 effect = "fade"; 2832 } 2833 } 2834 2835 // Zoom animation 2836 // ============== 2837 if (effect === "zoom") { 2838 self.isAnimating = true; 2839 2840 end.scaleX = end.width / start.width; 2841 end.scaleY = end.height / start.height; 2842 2843 // Check if we need to animate opacity 2844 opacity = slide.opts.zoomOpacity; 2845 2846 if (opacity == "auto") { 2847 opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1; 2848 } 2849 2850 if (opacity) { 2851 start.opacity = 0.1; 2852 end.opacity = 1; 2853 } 2854 2855 // Draw image at start position 2856 $.fancybox.setTranslate(slide.$content.removeClass("fancybox-is-hidden"), start); 2857 2858 forceRedraw(slide.$content); 2859 2860 // Start animation 2861 $.fancybox.animate(slide.$content, end, duration, function () { 2862 self.isAnimating = false; 2863 2864 self.complete(); 2865 }); 2866 2867 return; 2868 } 2869 2870 self.updateSlide(slide); 2871 2872 // Simply show content if no effect 2873 // ================================ 2874 if (!effect) { 2875 slide.$content.removeClass("fancybox-is-hidden"); 2876 2877 if (!isRevealed && isMoved && slide.type === "image" && !slide.hasError) { 2878 slide.$content.hide().fadeIn("fast"); 2879 } 2880 2881 if (slide.pos === self.currPos) { 2882 self.complete(); 2883 } 2884 2885 return; 2886 } 2887 2888 // Prepare for CSS transiton 2889 // ========================= 2890 $.fancybox.stop($slide); 2891 2892 //effectClassName = "fancybox-animated fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-fx-" + effect; 2893 effectClassName = "fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-animated fancybox-fx-" + effect; 2894 2895 $slide.addClass(effectClassName).removeClass("fancybox-slide--current"); //.addClass(effectClassName); 2896 2897 slide.$content.removeClass("fancybox-is-hidden"); 2898 2899 // Force reflow 2900 forceRedraw($slide); 2901 2902 if (slide.type !== "image") { 2903 slide.$content.hide().show(0); 2904 } 2905 2906 $.fancybox.animate( 2907 $slide, 2908 "fancybox-slide--current", 2909 duration, 2910 function () { 2911 $slide.removeClass(effectClassName).css({ 2912 transform: "", 2913 opacity: "" 2914 }); 2915 2916 if (slide.pos === self.currPos) { 2917 self.complete(); 2918 } 2919 }, 2920 true 2921 ); 2922 }, 2923 2924 // Check if we can and have to zoom from thumbnail 2925 //================================================ 2926 2927 getThumbPos: function (slide) { 2928 var rez = false, 2929 $thumb = slide.$thumb, 2930 thumbPos, 2931 btw, 2932 brw, 2933 bbw, 2934 blw; 2935 2936 if (!$thumb || !inViewport($thumb[0])) { 2937 return false; 2938 } 2939 2940 thumbPos = $.fancybox.getTranslate($thumb); 2941 2942 btw = parseFloat($thumb.css("border-top-width") || 0); 2943 brw = parseFloat($thumb.css("border-right-width") || 0); 2944 bbw = parseFloat($thumb.css("border-bottom-width") || 0); 2945 blw = parseFloat($thumb.css("border-left-width") || 0); 2946 2947 rez = { 2948 top: thumbPos.top + btw, 2949 left: thumbPos.left + blw, 2950 width: thumbPos.width - brw - blw, 2951 height: thumbPos.height - btw - bbw, 2952 scaleX: 1, 2953 scaleY: 1 2954 }; 2955 2956 return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false; 2957 }, 2958 2959 // Final adjustments after current gallery item is moved to position 2960 // and it`s content is loaded 2961 // ================================================================== 2962 2963 complete: function () { 2964 var self = this, 2965 current = self.current, 2966 slides = {}, 2967 $el; 2968 2969 if (self.isMoved() || !current.isLoaded) { 2970 return; 2971 } 2972 2973 if (!current.isComplete) { 2974 current.isComplete = true; 2975 2976 current.$slide.siblings().trigger("onReset"); 2977 2978 self.preload("inline"); 2979 2980 // Trigger any CSS transiton inside the slide 2981 forceRedraw(current.$slide); 2982 2983 current.$slide.addClass("fancybox-slide--complete"); 2984 2985 // Remove unnecessary slides 2986 $.each(self.slides, function (key, slide) { 2987 if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) { 2988 slides[slide.pos] = slide; 2989 } else if (slide) { 2990 $.fancybox.stop(slide.$slide); 2991 2992 slide.$slide.off().remove(); 2993 } 2994 }); 2995 2996 self.slides = slides; 2997 } 2998 2999 self.isAnimating = false; 3000 3001 self.updateCursor(); 3002 3003 self.trigger("afterShow"); 3004 3005 // Autoplay first html5 video/audio 3006 if (!!current.opts.video.autoStart) { 3007 current.$slide 3008 .find("video,audio") 3009 .filter(":visible:first") 3010 .trigger("play") 3011 .one("ended", function () { 3012 if (Document.exitFullscreen) { 3013 Document.exitFullscreen(); 3014 } else if (this.webkitExitFullscreen) { 3015 this.webkitExitFullscreen(); 3016 } 3017 3018 self.next(); 3019 }); 3020 } 3021 3022 // Try to focus on the first focusable element 3023 if (current.opts.autoFocus && current.contentType === "html") { 3024 // Look for the first input with autofocus attribute 3025 $el = current.$content.find("input[autofocus]:enabled:visible:first"); 3026 3027 if ($el.length) { 3028 $el.trigger("focus"); 3029 } else { 3030 self.focus(null, true); 3031 } 3032 } 3033 3034 // Avoid jumping 3035 current.$slide.scrollTop(0).scrollLeft(0); 3036 }, 3037 3038 // Preload next and previous slides 3039 // ================================ 3040 3041 preload: function (type) { 3042 var self = this, 3043 prev, 3044 next; 3045 3046 if (self.group.length < 2) { 3047 return; 3048 } 3049 3050 next = self.slides[self.currPos + 1]; 3051 prev = self.slides[self.currPos - 1]; 3052 3053 if (prev && prev.type === type) { 3054 self.loadSlide(prev); 3055 } 3056 3057 if (next && next.type === type) { 3058 self.loadSlide(next); 3059 } 3060 }, 3061 3062 // Try to find and focus on the first focusable element 3063 // ==================================================== 3064 3065 focus: function (e, firstRun) { 3066 var self = this, 3067 focusableStr = [ 3068 "a[href]", 3069 "area[href]", 3070 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 3071 "select:not([disabled]):not([aria-hidden])", 3072 "textarea:not([disabled]):not([aria-hidden])", 3073 "button:not([disabled]):not([aria-hidden])", 3074 "iframe", 3075 "object", 3076 "embed", 3077 "video", 3078 "audio", 3079 "[contenteditable]", 3080 '[tabindex]:not([tabindex^="-"])' 3081 ].join(","), 3082 focusableItems, 3083 focusedItemIndex; 3084 3085 if (self.isClosing) { 3086 return; 3087 } 3088 3089 if (e || !self.current || !self.current.isComplete) { 3090 // Focus on any element inside fancybox 3091 focusableItems = self.$refs.container.find("*:visible"); 3092 } else { 3093 // Focus inside current slide 3094 focusableItems = self.current.$slide.find("*:visible" + (firstRun ? ":not(.fancybox-close-small)" : "")); 3095 } 3096 3097 focusableItems = focusableItems.filter(focusableStr).filter(function () { 3098 return $(this).css("visibility") !== "hidden" && !$(this).hasClass("disabled"); 3099 }); 3100 3101 if (focusableItems.length) { 3102 focusedItemIndex = focusableItems.index(document.activeElement); 3103 3104 if (e && e.shiftKey) { 3105 // Back tab 3106 if (focusedItemIndex < 0 || focusedItemIndex == 0) { 3107 e.preventDefault(); 3108 3109 focusableItems.eq(focusableItems.length - 1).trigger("focus"); 3110 } 3111 } else { 3112 // Outside or Forward tab 3113 if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) { 3114 if (e) { 3115 e.preventDefault(); 3116 } 3117 3118 focusableItems.eq(0).trigger("focus"); 3119 } 3120 } 3121 } else { 3122 self.$refs.container.trigger("focus"); 3123 } 3124 }, 3125 3126 // Activates current instance - brings container to the front and enables keyboard, 3127 // notifies other instances about deactivating 3128 // ================================================================================= 3129 3130 activate: function () { 3131 var self = this; 3132 3133 // Deactivate all instances 3134 $(".fancybox-container").each(function () { 3135 var instance = $(this).data("FancyBox"); 3136 3137 // Skip self and closing instances 3138 if (instance && instance.id !== self.id && !instance.isClosing) { 3139 instance.trigger("onDeactivate"); 3140 3141 instance.removeEvents(); 3142 3143 instance.isVisible = false; 3144 } 3145 }); 3146 3147 self.isVisible = true; 3148 3149 if (self.current || self.isIdle) { 3150 self.update(); 3151 3152 self.updateControls(); 3153 } 3154 3155 self.trigger("onActivate"); 3156 3157 self.addEvents(); 3158 }, 3159 3160 // Start closing procedure 3161 // This will start "zoom-out" animation if needed and clean everything up afterwards 3162 // ================================================================================= 3163 3164 close: function (e, d) { 3165 var self = this, 3166 current = self.current, 3167 effect, 3168 duration, 3169 $content, 3170 domRect, 3171 opacity, 3172 start, 3173 end; 3174 3175 var done = function () { 3176 self.cleanUp(e); 3177 }; 3178 3179 if (self.isClosing) { 3180 return false; 3181 } 3182 3183 self.isClosing = true; 3184 3185 // If beforeClose callback prevents closing, make sure content is centered 3186 if (self.trigger("beforeClose", e) === false) { 3187 self.isClosing = false; 3188 3189 requestAFrame(function () { 3190 self.update(); 3191 }); 3192 3193 return false; 3194 } 3195 3196 // Remove all events 3197 // If there are multiple instances, they will be set again by "activate" method 3198 self.removeEvents(); 3199 3200 $content = current.$content; 3201 effect = current.opts.animationEffect; 3202 duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0; 3203 3204 current.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"); 3205 3206 if (e !== true) { 3207 $.fancybox.stop(current.$slide); 3208 } else { 3209 effect = false; 3210 } 3211 3212 // Remove other slides 3213 current.$slide 3214 .siblings() 3215 .trigger("onReset") 3216 .remove(); 3217 3218 // Trigger animations 3219 if (duration) { 3220 self.$refs.container 3221 .removeClass("fancybox-is-open") 3222 .addClass("fancybox-is-closing") 3223 .css("transition-duration", duration + "ms"); 3224 } 3225 3226 // Clean up 3227 self.hideLoading(current); 3228 3229 self.hideControls(true); 3230 3231 self.updateCursor(); 3232 3233 // Check if possible to zoom-out 3234 if ( 3235 effect === "zoom" && 3236 !($content && duration && current.type === "image" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current))) 3237 ) { 3238 effect = "fade"; 3239 } 3240 3241 if (effect === "zoom") { 3242 $.fancybox.stop($content); 3243 3244 domRect = $.fancybox.getTranslate($content); 3245 3246 start = { 3247 top: domRect.top, 3248 left: domRect.left, 3249 scaleX: domRect.width / end.width, 3250 scaleY: domRect.height / end.height, 3251 width: end.width, 3252 height: end.height 3253 }; 3254 3255 // Check if we need to animate opacity 3256 opacity = current.opts.zoomOpacity; 3257 3258 if (opacity == "auto") { 3259 opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1; 3260 } 3261 3262 if (opacity) { 3263 end.opacity = 0; 3264 } 3265 3266 $.fancybox.setTranslate($content, start); 3267 3268 forceRedraw($content); 3269 3270 $.fancybox.animate($content, end, duration, done); 3271 3272 return true; 3273 } 3274 3275 if (effect && duration) { 3276 $.fancybox.animate( 3277 current.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"), 3278 "fancybox-animated fancybox-fx-" + effect, 3279 duration, 3280 done 3281 ); 3282 } else { 3283 // If skip animation 3284 if (e === true) { 3285 setTimeout(done, duration); 3286 } else { 3287 done(); 3288 } 3289 } 3290 3291 return true; 3292 }, 3293 3294 // Final adjustments after removing the instance 3295 // ============================================= 3296 3297 cleanUp: function (e) { 3298 var self = this, 3299 instance, 3300 $focus = self.current.opts.$orig, 3301 x, 3302 y; 3303 3304 self.current.$slide.trigger("onReset"); 3305 3306 self.$refs.container.empty().remove(); 3307 3308 self.trigger("afterClose", e); 3309 3310 // Place back focus 3311 if (!!self.current.opts.backFocus) { 3312 if (!$focus || !$focus.length || !$focus.is(":visible")) { 3313 $focus = self.$trigger; 3314 } 3315 3316 if ($focus && $focus.length) { 3317 x = window.scrollX; 3318 y = window.scrollY; 3319 3320 $focus.trigger("focus"); 3321 3322 $("html, body") 3323 .scrollTop(y) 3324 .scrollLeft(x); 3325 } 3326 } 3327 3328 self.current = null; 3329 3330 // Check if there are other instances 3331 instance = $.fancybox.getInstance(); 3332 3333 if (instance) { 3334 instance.activate(); 3335 } else { 3336 $("body").removeClass("fancybox-active compensate-for-scrollbar"); 3337 3338 $("#fancybox-style-noscroll").remove(); 3339 } 3340 }, 3341 3342 // Call callback and trigger an event 3343 // ================================== 3344 3345 trigger: function (name, slide) { 3346 var args = Array.prototype.slice.call(arguments, 1), 3347 self = this, 3348 obj = slide && slide.opts ? slide : self.current, 3349 rez; 3350 3351 if (obj) { 3352 args.unshift(obj); 3353 } else { 3354 obj = self; 3355 } 3356 3357 args.unshift(self); 3358 3359 if ($.isFunction(obj.opts[name])) { 3360 rez = obj.opts[name].apply(obj, args); 3361 } 3362 3363 if (rez === false) { 3364 return rez; 3365 } 3366 3367 if (name === "afterClose" || !self.$refs) { 3368 $D.trigger(name + ".fb", args); 3369 } else { 3370 self.$refs.container.trigger(name + ".fb", args); 3371 } 3372 }, 3373 3374 // Update infobar values, navigation button states and reveal caption 3375 // ================================================================== 3376 3377 updateControls: function () { 3378 var self = this, 3379 current = self.current, 3380 index = current.index, 3381 $container = self.$refs.container, 3382 $caption = self.$refs.caption, 3383 caption = current.opts.caption; 3384 3385 // Recalculate content dimensions 3386 current.$slide.trigger("refresh"); 3387 3388 // Set caption 3389 if (caption && caption.length) { 3390 self.$caption = $caption; 3391 3392 $caption 3393 .children() 3394 .eq(0) 3395 .html(caption); 3396 } else { 3397 self.$caption = null; 3398 } 3399 3400 if (!self.hasHiddenControls && !self.isIdle) { 3401 self.showControls(); 3402 } 3403 3404 // Update info and navigation elements 3405 $container.find("[data-fancybox-count]").html(self.group.length); 3406 $container.find("[data-fancybox-index]").html(index + 1); 3407 3408 $container.find("[data-fancybox-prev]").prop("disabled", !current.opts.loop && index <= 0); 3409 $container.find("[data-fancybox-next]").prop("disabled", !current.opts.loop && index >= self.group.length - 1); 3410 3411 if (current.type === "image") { 3412 // Re-enable buttons; update download button source 3413 $container 3414 .find("[data-fancybox-zoom]") 3415 .show() 3416 .end() 3417 .find("[data-fancybox-download]") 3418 .attr("href", current.opts.image.src || current.src) 3419 .show(); 3420 } else if (current.opts.toolbar) { 3421 $container.find("[data-fancybox-download],[data-fancybox-zoom]").hide(); 3422 } 3423 3424 // Make sure focus is not on disabled button/element 3425 if ($(document.activeElement).is(":hidden,[disabled]")) { 3426 self.$refs.container.trigger("focus"); 3427 } 3428 }, 3429 3430 // Hide toolbar and caption 3431 // ======================== 3432 3433 hideControls: function (andCaption) { 3434 var self = this, 3435 arr = ["infobar", "toolbar", "nav"]; 3436 3437 if (andCaption || !self.current.opts.preventCaptionOverlap) { 3438 arr.push("caption"); 3439 } 3440 3441 this.$refs.container.removeClass( 3442 arr 3443 .map(function (i) { 3444 return "fancybox-show-" + i; 3445 }) 3446 .join(" ") 3447 ); 3448 3449 this.hasHiddenControls = true; 3450 }, 3451 3452 showControls: function () { 3453 var self = this, 3454 opts = self.current ? self.current.opts : self.opts, 3455 $container = self.$refs.container; 3456 3457 self.hasHiddenControls = false; 3458 self.idleSecondsCounter = 0; 3459 3460 $container 3461 .toggleClass("fancybox-show-toolbar", !!(opts.toolbar && opts.buttons)) 3462 .toggleClass("fancybox-show-infobar", !!(opts.infobar && self.group.length > 1)) 3463 .toggleClass("fancybox-show-caption", !!self.$caption) 3464 .toggleClass("fancybox-show-nav", !!(opts.arrows && self.group.length > 1)) 3465 .toggleClass("fancybox-is-modal", !!opts.modal); 3466 }, 3467 3468 // Toggle toolbar and caption 3469 // ========================== 3470 3471 toggleControls: function () { 3472 if (this.hasHiddenControls) { 3473 this.showControls(); 3474 } else { 3475 this.hideControls(); 3476 } 3477 } 3478 }); 3479 3480 $.fancybox = { 3481 version: "3.5.7", 3482 defaults: defaults, 3483 3484 // Get current instance and execute a command. 3485 // 3486 // Examples of usage: 3487 // 3488 // $instance = $.fancybox.getInstance(); 3489 // $.fancybox.getInstance().jumpTo( 1 ); 3490 // $.fancybox.getInstance( 'jumpTo', 1 ); 3491 // $.fancybox.getInstance( function() { 3492 // console.info( this.currIndex ); 3493 // }); 3494 // ====================================================== 3495 3496 getInstance: function (command) { 3497 var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"), 3498 args = Array.prototype.slice.call(arguments, 1); 3499 3500 if (instance instanceof FancyBox) { 3501 if ($.type(command) === "string") { 3502 instance[command].apply(instance, args); 3503 } else if ($.type(command) === "function") { 3504 command.apply(instance, args); 3505 } 3506 3507 return instance; 3508 } 3509 3510 return false; 3511 }, 3512 3513 // Create new instance 3514 // =================== 3515 3516 open: function (items, opts, index) { 3517 return new FancyBox(items, opts, index); 3518 }, 3519 3520 // Close current or all instances 3521 // ============================== 3522 3523 close: function (all) { 3524 var instance = this.getInstance(); 3525 3526 if (instance) { 3527 instance.close(); 3528 3529 // Try to find and close next instance 3530 if (all === true) { 3531 this.close(all); 3532 } 3533 } 3534 }, 3535 3536 // Close all instances and unbind all events 3537 // ========================================= 3538 3539 destroy: function () { 3540 this.close(true); 3541 3542 $D.add("body").off("click.fb-start", "**"); 3543 }, 3544 3545 // Try to detect mobile devices 3546 // ============================ 3547 3548 isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), 3549 3550 // Detect if 'translate3d' support is available 3551 // ============================================ 3552 3553 use3d: (function () { 3554 var div = document.createElement("div"); 3555 3556 return ( 3557 window.getComputedStyle && 3558 window.getComputedStyle(div) && 3559 window.getComputedStyle(div).getPropertyValue("transform") && 3560 !(document.documentMode && document.documentMode < 11) 3561 ); 3562 })(), 3563 3564 // Helper function to get current visual state of an element 3565 // returns array[ top, left, horizontal-scale, vertical-scale, opacity ] 3566 // ===================================================================== 3567 3568 getTranslate: function ($el) { 3569 var domRect; 3570 3571 if (!$el || !$el.length) { 3572 return false; 3573 } 3574 3575 domRect = $el[0].getBoundingClientRect(); 3576 3577 return { 3578 top: domRect.top || 0, 3579 left: domRect.left || 0, 3580 width: domRect.width, 3581 height: domRect.height, 3582 opacity: parseFloat($el.css("opacity")) 3583 }; 3584 }, 3585 3586 // Shortcut for setting "translate3d" properties for element 3587 // Can set be used to set opacity, too 3588 // ======================================================== 3589 3590 setTranslate: function ($el, props) { 3591 var str = "", 3592 css = {}; 3593 3594 if (!$el || !props) { 3595 return; 3596 } 3597 3598 if (props.left !== undefined || props.top !== undefined) { 3599 str = 3600 (props.left === undefined ? $el.position().left : props.left) + 3601 "px, " + 3602 (props.top === undefined ? $el.position().top : props.top) + 3603 "px"; 3604 3605 if (this.use3d) { 3606 str = "translate3d(" + str + ", 0px)"; 3607 } else { 3608 str = "translate(" + str + ")"; 3609 } 3610 } 3611 3612 if (props.scaleX !== undefined && props.scaleY !== undefined) { 3613 str += " scale(" + props.scaleX + ", " + props.scaleY + ")"; 3614 } else if (props.scaleX !== undefined) { 3615 str += " scaleX(" + props.scaleX + ")"; 3616 } 3617 3618 if (str.length) { 3619 css.transform = str; 3620 } 3621 3622 if (props.opacity !== undefined) { 3623 css.opacity = props.opacity; 3624 } 3625 3626 if (props.width !== undefined) { 3627 css.width = props.width; 3628 } 3629 3630 if (props.height !== undefined) { 3631 css.height = props.height; 3632 } 3633 3634 return $el.css(css); 3635 }, 3636 3637 // Simple CSS transition handler 3638 // ============================= 3639 3640 animate: function ($el, to, duration, callback, leaveAnimationName) { 3641 var self = this, 3642 from; 3643 3644 if ($.isFunction(duration)) { 3645 callback = duration; 3646 duration = null; 3647 } 3648 3649 self.stop($el); 3650 3651 from = self.getTranslate($el); 3652 3653 $el.on(transitionEnd, function (e) { 3654 // Skip events from child elements and z-index change 3655 if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == "z-index")) { 3656 return; 3657 } 3658 3659 self.stop($el); 3660 3661 if ($.isNumeric(duration)) { 3662 $el.css("transition-duration", ""); 3663 } 3664 3665 if ($.isPlainObject(to)) { 3666 if (to.scaleX !== undefined && to.scaleY !== undefined) { 3667 self.setTranslate($el, { 3668 top: to.top, 3669 left: to.left, 3670 width: from.width * to.scaleX, 3671 height: from.height * to.scaleY, 3672 scaleX: 1, 3673 scaleY: 1 3674 }); 3675 } 3676 } else if (leaveAnimationName !== true) { 3677 $el.removeClass(to); 3678 } 3679 3680 if ($.isFunction(callback)) { 3681 callback(e); 3682 } 3683 }); 3684 3685 if ($.isNumeric(duration)) { 3686 $el.css("transition-duration", duration + "ms"); 3687 } 3688 3689 // Start animation by changing CSS properties or class name 3690 if ($.isPlainObject(to)) { 3691 if (to.scaleX !== undefined && to.scaleY !== undefined) { 3692 delete to.width; 3693 delete to.height; 3694 3695 if ($el.parent().hasClass("fancybox-slide--image")) { 3696 $el.parent().addClass("fancybox-is-scaling"); 3697 } 3698 } 3699 3700 $.fancybox.setTranslate($el, to); 3701 } else { 3702 $el.addClass(to); 3703 } 3704 3705 // Make sure that `transitionend` callback gets fired 3706 $el.data( 3707 "timer", 3708 setTimeout(function () { 3709 $el.trigger(transitionEnd); 3710 }, duration + 33) 3711 ); 3712 }, 3713 3714 stop: function ($el, callCallback) { 3715 if ($el && $el.length) { 3716 clearTimeout($el.data("timer")); 3717 3718 if (callCallback) { 3719 $el.trigger(transitionEnd); 3720 } 3721 3722 $el.off(transitionEnd).css("transition-duration", ""); 3723 3724 $el.parent().removeClass("fancybox-is-scaling"); 3725 } 3726 } 3727 }; 3728 3729 // Default click handler for "fancyboxed" links 3730 // ============================================ 3731 3732 function _run(e, opts) { 3733 var items = [], 3734 index = 0, 3735 $target, 3736 value, 3737 instance; 3738 3739 // Avoid opening multiple times 3740 if (e && e.isDefaultPrevented()) { 3741 return; 3742 } 3743 3744 e.preventDefault(); 3745 3746 opts = opts || {}; 3747 3748 if (e && e.data) { 3749 opts = mergeOpts(e.data.options, opts); 3750 } 3751 3752 $target = opts.$target || $(e.currentTarget).trigger("blur"); 3753 instance = $.fancybox.getInstance(); 3754 3755 if (instance && instance.$trigger && instance.$trigger.is($target)) { 3756 return; 3757 } 3758 3759 if (opts.selector) { 3760 items = $(opts.selector); 3761 } else { 3762 // Get all related items and find index for clicked one 3763 value = $target.attr("data-fancybox") || ""; 3764 3765 if (value) { 3766 items = e.data ? e.data.items : []; 3767 items = items.length ? items.filter('[data-fancybox="' + value + '"]') : $('[data-fancybox="' + value + '"]'); 3768 } else { 3769 items = [$target]; 3770 } 3771 } 3772 3773 index = $(items).index($target); 3774 3775 // Sometimes current item can not be found 3776 if (index < 0) { 3777 index = 0; 3778 } 3779 3780 instance = $.fancybox.open(items, opts, index); 3781 3782 // Save last active element 3783 instance.$trigger = $target; 3784 } 3785 3786 // Create a jQuery plugin 3787 // ====================== 3788 3789 $.fn.fancybox = function (options) { 3790 var selector; 3791 3792 options = options || {}; 3793 selector = options.selector || false; 3794 3795 if (selector) { 3796 // Use body element instead of document so it executes first 3797 $("body") 3798 .off("click.fb-start", selector) 3799 .on("click.fb-start", selector, { 3800 options: options 3801 }, _run); 3802 } else { 3803 this.off("click.fb-start").on( 3804 "click.fb-start", { 3805 items: this, 3806 options: options 3807 }, 3808 _run 3809 ); 3810 } 3811 3812 return this; 3813 }; 3814 3815 // Self initializing plugin for all elements having `data-fancybox` attribute 3816 // ========================================================================== 3817 3818 $D.on("click.fb-start", "[data-fancybox]", _run); 3819 3820 // Enable "trigger elements" 3821 // ========================= 3822 3823 $D.on("click.fb-start", "[data-fancybox-trigger]", function (e) { 3824 $('[data-fancybox="' + $(this).attr("data-fancybox-trigger") + '"]') 3825 .eq($(this).attr("data-fancybox-index") || 0) 3826 .trigger("click.fb-start", { 3827 $trigger: $(this) 3828 }); 3829 }); 3830 3831 // Track focus event for better accessibility styling 3832 // ================================================== 3833 (function () { 3834 var buttonStr = ".fancybox-button", 3835 focusStr = "fancybox-focus", 3836 $pressed = null; 3837 3838 $D.on("mousedown mouseup focus blur", buttonStr, function (e) { 3839 switch (e.type) { 3840 case "mousedown": 3841 $pressed = $(this); 3842 break; 3843 case "mouseup": 3844 $pressed = null; 3845 break; 3846 case "focusin": 3847 $(buttonStr).removeClass(focusStr); 3848 3849 if (!$(this).is($pressed) && !$(this).is("[disabled]")) { 3850 $(this).addClass(focusStr); 3851 } 3852 break; 3853 case "focusout": 3854 $(buttonStr).removeClass(focusStr); 3855 break; 3856 } 3857 }); 3858 })(); 3859})(window, document, jQuery); 3860// ========================================================================== 3861// 3862// Media 3863// Adds additional media type support 3864// 3865// ========================================================================== 3866(function ($) { 3867 "use strict"; 3868 3869 // Object containing properties for each media type 3870 var defaults = { 3871 youtube: { 3872 matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, 3873 params: { 3874 autoplay: 1, 3875 autohide: 1, 3876 fs: 1, 3877 rel: 0, 3878 hd: 1, 3879 wmode: "transparent", 3880 enablejsapi: 1, 3881 html5: 1 3882 }, 3883 paramPlace: 8, 3884 type: "iframe", 3885 url: "https://www.youtube-nocookie.com/embed/$4", 3886 thumb: "https://img.youtube.com/vi/$4/hqdefault.jpg" 3887 }, 3888 3889 vimeo: { 3890 matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, 3891 params: { 3892 autoplay: 1, 3893 hd: 1, 3894 show_title: 1, 3895 show_byline: 1, 3896 show_portrait: 0, 3897 fullscreen: 1 3898 }, 3899 paramPlace: 3, 3900 type: "iframe", 3901 url: "//player.vimeo.com/video/$2" 3902 }, 3903 3904 instagram: { 3905 matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, 3906 type: "image", 3907 url: "//$1/p/$2/media/?size=l" 3908 }, 3909 3910 // Examples: 3911 // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 3912 // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z 3913 // https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en 3914 // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572 3915 gmap_place: { 3916 matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, 3917 type: "iframe", 3918 url: function (rez) { 3919 return ( 3920 "//maps.google." + 3921 rez[2] + 3922 "/?ll=" + 3923 (rez[9] ? rez[9] + "&z=" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\//, "&") : "") : rez[12] + "").replace(/\?/, "&") + 3924 "&output=" + 3925 (rez[12] && rez[12].indexOf("layer=c") > 0 ? "svembed" : "embed") 3926 ); 3927 } 3928 }, 3929 3930 // Examples: 3931 // https://www.google.com/maps/search/Empire+State+Building/ 3932 // https://www.google.com/maps/search/?api=1&query=centurylink+field 3933 // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393 3934 gmap_search: { 3935 matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, 3936 type: "iframe", 3937 url: function (rez) { 3938 return "//maps.google." + rez[2] + "/maps?q=" + rez[5].replace("query=", "q=").replace("api=1", "") + "&output=embed"; 3939 } 3940 } 3941 }; 3942 3943 // Formats matching url to final form 3944 var format = function (url, rez, params) { 3945 if (!url) { 3946 return; 3947 } 3948 3949 params = params || ""; 3950 3951 if ($.type(params) === "object") { 3952 params = $.param(params, true); 3953 } 3954 3955 $.each(rez, function (key, value) { 3956 url = url.replace("$" + key, value || ""); 3957 }); 3958 3959 if (params.length) { 3960 url += (url.indexOf("?") > 0 ? "&" : "?") + params; 3961 } 3962 3963 return url; 3964 }; 3965 3966 $(document).on("objectNeedsType.fb", function (e, instance, item) { 3967 var url = item.src || "", 3968 type = false, 3969 media, 3970 thumb, 3971 rez, 3972 params, 3973 urlParams, 3974 paramObj, 3975 provider; 3976 3977 media = $.extend(true, {}, defaults, item.opts.media); 3978 3979 // Look for any matching media type 3980 $.each(media, function (providerName, providerOpts) { 3981 rez = url.match(providerOpts.matcher); 3982 3983 if (!rez) { 3984 return; 3985 } 3986 3987 type = providerOpts.type; 3988 provider = providerName; 3989 paramObj = {}; 3990 3991 if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) { 3992 urlParams = rez[providerOpts.paramPlace]; 3993 3994 if (urlParams[0] == "?") { 3995 urlParams = urlParams.substring(1); 3996 } 3997 3998 urlParams = urlParams.split("&"); 3999 4000 for (var m = 0; m < urlParams.length; ++m) { 4001 var p = urlParams[m].split("=", 2); 4002 4003 if (p.length == 2) { 4004 paramObj[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); 4005 } 4006 } 4007 } 4008 4009 params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj); 4010 4011 url = 4012 $.type(providerOpts.url) === "function" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params); 4013 4014 thumb = 4015 $.type(providerOpts.thumb) === "function" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez); 4016 4017 if (providerName === "youtube") { 4018 url = url.replace(/&t=((\d+)m)?(\d+)s/, function (match, p1, m, s) { 4019 return "&start=" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10)); 4020 }); 4021 } else if (providerName === "vimeo") { 4022 url = url.replace("&%23", "#"); 4023 } 4024 4025 return false; 4026 }); 4027 4028 // If it is found, then change content type and update the url 4029 4030 if (type) { 4031 if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) { 4032 item.opts.thumb = thumb; 4033 } 4034 4035 if (type === "iframe") { 4036 item.opts = $.extend(true, item.opts, { 4037 iframe: { 4038 preload: false, 4039 attr: { 4040 scrolling: "no" 4041 } 4042 } 4043 }); 4044 } 4045 4046 $.extend(item, { 4047 type: type, 4048 src: url, 4049 origSrc: item.src, 4050 contentSource: provider, 4051 contentType: type === "image" ? "image" : provider == "gmap_place" || provider == "gmap_search" ? "map" : "video" 4052 }); 4053 } else if (url) { 4054 item.type = item.opts.defaultType; 4055 } 4056 }); 4057 4058 // Load YouTube/Video API on request to detect when video finished playing 4059 var VideoAPILoader = { 4060 youtube: { 4061 src: "https://www.youtube.com/iframe_api", 4062 class: "YT", 4063 loading: false, 4064 loaded: false 4065 }, 4066 4067 vimeo: { 4068 src: "https://player.vimeo.com/api/player.js", 4069 class: "Vimeo", 4070 loading: false, 4071 loaded: false 4072 }, 4073 4074 load: function (vendor) { 4075 var _this = this, 4076 script; 4077 4078 if (this[vendor].loaded) { 4079 setTimeout(function () { 4080 _this.done(vendor); 4081 }); 4082 return; 4083 } 4084 4085 if (this[vendor].loading) { 4086 return; 4087 } 4088 4089 this[vendor].loading = true; 4090 4091 script = document.createElement("script"); 4092 script.type = "text/javascript"; 4093 script.src = this[vendor].src; 4094 4095 if (vendor === "youtube") { 4096 window.onYouTubeIframeAPIReady = function () { 4097 _this[vendor].loaded = true; 4098 _this.done(vendor); 4099 }; 4100 } else { 4101 script.onload = function () { 4102 _this[vendor].loaded = true; 4103 _this.done(vendor); 4104 }; 4105 } 4106 4107 document.body.appendChild(script); 4108 }, 4109 done: function (vendor) { 4110 var instance, $el, player; 4111 4112 if (vendor === "youtube") { 4113 delete window.onYouTubeIframeAPIReady; 4114 } 4115 4116 instance = $.fancybox.getInstance(); 4117 4118 if (instance) { 4119 $el = instance.current.$content.find("iframe"); 4120 4121 if (vendor === "youtube" && YT !== undefined && YT) { 4122 player = new YT.Player($el.attr("id"), { 4123 events: { 4124 onStateChange: function (e) { 4125 if (e.data == 0) { 4126 instance.next(); 4127 } 4128 } 4129 } 4130 }); 4131 } else if (vendor === "vimeo" && Vimeo !== undefined && Vimeo) { 4132 player = new Vimeo.Player($el); 4133 4134 player.on("ended", function () { 4135 instance.next(); 4136 }); 4137 } 4138 } 4139 } 4140 }; 4141 4142 $(document).on({ 4143 "afterShow.fb": function (e, instance, current) { 4144 if (instance.group.length > 1 && (current.contentSource === "youtube" || current.contentSource === "vimeo")) { 4145 VideoAPILoader.load(current.contentSource); 4146 } 4147 } 4148 }); 4149})(jQuery); 4150// ========================================================================== 4151// 4152// Guestures 4153// Adds touch guestures, handles click and tap events 4154// 4155// ========================================================================== 4156(function (window, document, $) { 4157 "use strict"; 4158 4159 var requestAFrame = (function () { 4160 return ( 4161 window.requestAnimationFrame || 4162 window.webkitRequestAnimationFrame || 4163 window.mozRequestAnimationFrame || 4164 window.oRequestAnimationFrame || 4165 // if all else fails, use setTimeout 4166 function (callback) { 4167 return window.setTimeout(callback, 1000 / 60); 4168 } 4169 ); 4170 })(); 4171 4172 var cancelAFrame = (function () { 4173 return ( 4174 window.cancelAnimationFrame || 4175 window.webkitCancelAnimationFrame || 4176 window.mozCancelAnimationFrame || 4177 window.oCancelAnimationFrame || 4178 function (id) { 4179 window.clearTimeout(id); 4180 } 4181 ); 4182 })(); 4183 4184 var getPointerXY = function (e) { 4185 var result = []; 4186 4187 e = e.originalEvent || e || window.e; 4188 e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e]; 4189 4190 for (var key in e) { 4191 if (e[key].pageX) { 4192 result.push({ 4193 x: e[key].pageX, 4194 y: e[key].pageY 4195 }); 4196 } else if (e[key].clientX) { 4197 result.push({ 4198 x: e[key].clientX, 4199 y: e[key].clientY 4200 }); 4201 } 4202 } 4203 4204 return result; 4205 }; 4206 4207 var distance = function (point2, point1, what) { 4208 if (!point1 || !point2) { 4209 return 0; 4210 } 4211 4212 if (what === "x") { 4213 return point2.x - point1.x; 4214 } else if (what === "y") { 4215 return point2.y - point1.y; 4216 } 4217 4218 return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2)); 4219 }; 4220 4221 var isClickable = function ($el) { 4222 if ( 4223 $el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe') || 4224 $.isFunction($el.get(0).onclick) || 4225 $el.data("selectable") 4226 ) { 4227 return true; 4228 } 4229 4230 // Check for attributes like data-fancybox-next or data-fancybox-close 4231 for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) { 4232 if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") { 4233 return true; 4234 } 4235 } 4236 4237 return false; 4238 }; 4239 4240 var hasScrollbars = function (el) { 4241 var overflowY = window.getComputedStyle(el)["overflow-y"], 4242 overflowX = window.getComputedStyle(el)["overflow-x"], 4243 vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight, 4244 horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth; 4245 4246 return vertical || horizontal; 4247 }; 4248 4249 var isScrollable = function ($el) { 4250 var rez = false; 4251 4252 while (true) { 4253 rez = hasScrollbars($el.get(0)); 4254 4255 if (rez) { 4256 break; 4257 } 4258 4259 $el = $el.parent(); 4260 4261 if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) { 4262 break; 4263 } 4264 } 4265 4266 return rez; 4267 }; 4268 4269 var Guestures = function (instance) { 4270 var self = this; 4271 4272 self.instance = instance; 4273 4274 self.$bg = instance.$refs.bg; 4275 self.$stage = instance.$refs.stage; 4276 self.$container = instance.$refs.container; 4277 4278 self.destroy(); 4279 4280 self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart")); 4281 }; 4282 4283 Guestures.prototype.destroy = function () { 4284 var self = this; 4285 4286 self.$container.off(".fb.touch"); 4287 4288 $(document).off(".fb.touch"); 4289 4290 if (self.requestId) { 4291 cancelAFrame(self.requestId); 4292 self.requestId = null; 4293 } 4294 4295 if (self.tapped) { 4296 clearTimeout(self.tapped); 4297 self.tapped = null; 4298 } 4299 }; 4300 4301 Guestures.prototype.ontouchstart = function (e) { 4302 var self = this, 4303 $target = $(e.target), 4304 instance = self.instance, 4305 current = instance.current, 4306 $slide = current.$slide, 4307 $content = current.$content, 4308 isTouchDevice = e.type == "touchstart"; 4309 4310 // Do not respond to both (touch and mouse) events 4311 if (isTouchDevice) { 4312 self.$container.off("mousedown.fb.touch"); 4313 } 4314 4315 // Ignore right click 4316 if (e.originalEvent && e.originalEvent.button == 2) { 4317 return; 4318 } 4319 4320 // Ignore taping on links, buttons, input elements 4321 if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) { 4322 return; 4323 } 4324 // Ignore clicks on the scrollbar 4325 if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) { 4326 return; 4327 } 4328 4329 // Ignore clicks while zooming or closing 4330 if (!current || instance.isAnimating || current.$slide.hasClass("fancybox-animated")) { 4331 e.stopPropagation(); 4332 e.preventDefault(); 4333 4334 return; 4335 } 4336 4337 self.realPoints = self.startPoints = getPointerXY(e); 4338 4339 if (!self.startPoints.length) { 4340 return; 4341 } 4342 4343 // Allow other scripts to catch touch event if "touch" is set to false 4344 if (current.touch) { 4345 e.stopPropagation(); 4346 } 4347 4348 self.startEvent = e; 4349 4350 self.canTap = true; 4351 self.$target = $target; 4352 self.$content = $content; 4353 self.opts = current.opts.touch; 4354 4355 self.isPanning = false; 4356 self.isSwiping = false; 4357 self.isZooming = false; 4358 self.isScrolling = false; 4359 self.canPan = instance.canPan(); 4360 4361 self.startTime = new Date().getTime(); 4362 self.distanceX = self.distanceY = self.distance = 0; 4363 4364 self.canvasWidth = Math.round($slide[0].clientWidth); 4365 self.canvasHeight = Math.round($slide[0].clientHeight); 4366 4367 self.contentLastPos = null; 4368 self.contentStartPos = $.fancybox.getTranslate(self.$content) || { 4369 top: 0, 4370 left: 0 4371 }; 4372 self.sliderStartPos = $.fancybox.getTranslate($slide); 4373 4374 // Since position will be absolute, but we need to make it relative to the stage 4375 self.stagePos = $.fancybox.getTranslate(instance.$refs.stage); 4376 4377 self.sliderStartPos.top -= self.stagePos.top; 4378 self.sliderStartPos.left -= self.stagePos.left; 4379 4380 self.contentStartPos.top -= self.stagePos.top; 4381 self.contentStartPos.left -= self.stagePos.left; 4382 4383 $(document) 4384 .off(".fb.touch") 4385 .on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend")) 4386 .on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove")); 4387 4388 if ($.fancybox.isMobile) { 4389 document.addEventListener("scroll", self.onscroll, true); 4390 } 4391 4392 // Skip if clicked outside the sliding area 4393 if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) { 4394 if ($target.is(".fancybox-image")) { 4395 e.preventDefault(); 4396 } 4397 4398 if (!($.fancybox.isMobile && $target.parents(".fancybox-caption").length)) { 4399 return; 4400 } 4401 } 4402 4403 self.isScrollable = isScrollable($target) || isScrollable($target.parent()); 4404 4405 // Check if element is scrollable and try to prevent default behavior (scrolling) 4406 if (!($.fancybox.isMobile && self.isScrollable)) { 4407 e.preventDefault(); 4408 } 4409 4410 // One finger or mouse click - swipe or pan an image 4411 if (self.startPoints.length === 1 || current.hasError) { 4412 if (self.canPan) { 4413 $.fancybox.stop(self.$content); 4414 4415 self.isPanning = true; 4416 } else { 4417 self.isSwiping = true; 4418 } 4419 4420 self.$container.addClass("fancybox-is-grabbing"); 4421 } 4422 4423 // Two fingers - zoom image 4424 if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) { 4425 self.canTap = false; 4426 self.isSwiping = false; 4427 self.isPanning = false; 4428 4429 self.isZooming = true; 4430 4431 $.fancybox.stop(self.$content); 4432 4433 self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft(); 4434 self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop(); 4435 4436 self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width; 4437 self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height; 4438 4439 self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]); 4440 } 4441 }; 4442 4443 Guestures.prototype.onscroll = function (e) { 4444 var self = this; 4445 4446 self.isScrolling = true; 4447 4448 document.removeEventListener("scroll", self.onscroll, true); 4449 }; 4450 4451 Guestures.prototype.ontouchmove = function (e) { 4452 var self = this; 4453 4454 // Make sure user has not released over iframe or disabled element 4455 if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) { 4456 self.ontouchend(e); 4457 return; 4458 } 4459 4460 if (self.isScrolling) { 4461 self.canTap = false; 4462 return; 4463 } 4464 4465 self.newPoints = getPointerXY(e); 4466 4467 if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) { 4468 return; 4469 } 4470 4471 if (!(self.isSwiping && self.isSwiping === true)) { 4472 e.preventDefault(); 4473 } 4474 4475 self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x"); 4476 self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y"); 4477 4478 self.distance = distance(self.newPoints[0], self.startPoints[0]); 4479 4480 // Skip false ontouchmove events (Chrome) 4481 if (self.distance > 0) { 4482 if (self.isSwiping) { 4483 self.onSwipe(e); 4484 } else if (self.isPanning) { 4485 self.onPan(); 4486 } else if (self.isZooming) { 4487 self.onZoom(); 4488 } 4489 } 4490 }; 4491 4492 Guestures.prototype.onSwipe = function (e) { 4493 var self = this, 4494 instance = self.instance, 4495 swiping = self.isSwiping, 4496 left = self.sliderStartPos.left || 0, 4497 angle; 4498 4499 // If direction is not yet determined 4500 if (swiping === true) { 4501 // We need at least 10px distance to correctly calculate an angle 4502 if (Math.abs(self.distance) > 10) { 4503 self.canTap = false; 4504 4505 if (instance.group.length < 2 && self.opts.vertical) { 4506 self.isSwiping = "y"; 4507 } else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) { 4508 self.isSwiping = "x"; 4509 } else { 4510 angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI); 4511 4512 self.isSwiping = angle > 45 && angle < 135 ? "y" : "x"; 4513 } 4514 4515 if (self.isSwiping === "y" && $.fancybox.isMobile && self.isScrollable) { 4516 self.isScrolling = true; 4517 4518 return; 4519 } 4520 4521 instance.isDragging = self.isSwiping; 4522 4523 // Reset points to avoid jumping, because we dropped first swipes to calculate the angle 4524 self.startPoints = self.newPoints; 4525 4526 $.each(instance.slides, function (index, slide) { 4527 var slidePos, stagePos; 4528 4529 $.fancybox.stop(slide.$slide); 4530 4531 slidePos = $.fancybox.getTranslate(slide.$slide); 4532 stagePos = $.fancybox.getTranslate(instance.$refs.stage); 4533 4534 slide.$slide 4535 .css({ 4536 transform: "", 4537 opacity: "", 4538 "transition-duration": "" 4539 }) 4540 .removeClass("fancybox-animated") 4541 .removeClass(function (index, className) { 4542 return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); 4543 }); 4544 4545 if (slide.pos === instance.current.pos) { 4546 self.sliderStartPos.top = slidePos.top - stagePos.top; 4547 self.sliderStartPos.left = slidePos.left - stagePos.left; 4548 } 4549 4550 $.fancybox.setTranslate(slide.$slide, { 4551 top: slidePos.top - stagePos.top, 4552 left: slidePos.left - stagePos.left 4553 }); 4554 }); 4555 4556 // Stop slideshow 4557 if (instance.SlideShow && instance.SlideShow.isActive) { 4558 instance.SlideShow.stop(); 4559 } 4560 } 4561 4562 return; 4563 } 4564 4565 // Sticky edges 4566 if (swiping == "x") { 4567 if ( 4568 self.distanceX > 0 && 4569 (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop)) 4570 ) { 4571 left = left + Math.pow(self.distanceX, 0.8); 4572 } else if ( 4573 self.distanceX < 0 && 4574 (self.instance.group.length < 2 || 4575 (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop)) 4576 ) { 4577 left = left - Math.pow(-self.distanceX, 0.8); 4578 } else { 4579 left = left + self.distanceX; 4580 } 4581 } 4582 4583 self.sliderLastPos = { 4584 top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY, 4585 left: left 4586 }; 4587 4588 if (self.requestId) { 4589 cancelAFrame(self.requestId); 4590 4591 self.requestId = null; 4592 } 4593 4594 self.requestId = requestAFrame(function () { 4595 if (self.sliderLastPos) { 4596 $.each(self.instance.slides, function (index, slide) { 4597 var pos = slide.pos - self.instance.currPos; 4598 4599 $.fancybox.setTranslate(slide.$slide, { 4600 top: self.sliderLastPos.top, 4601 left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter 4602 }); 4603 }); 4604 4605 self.$container.addClass("fancybox-is-sliding"); 4606 } 4607 }); 4608 }; 4609 4610 Guestures.prototype.onPan = function () { 4611 var self = this; 4612 4613 // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit) 4614 if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) { 4615 self.startPoints = self.newPoints; 4616 return; 4617 } 4618 4619 self.canTap = false; 4620 4621 self.contentLastPos = self.limitMovement(); 4622 4623 if (self.requestId) { 4624 cancelAFrame(self.requestId); 4625 } 4626 4627 self.requestId = requestAFrame(function () { 4628 $.fancybox.setTranslate(self.$content, self.contentLastPos); 4629 }); 4630 }; 4631 4632 // Make panning sticky to the edges 4633 Guestures.prototype.limitMovement = function () { 4634 var self = this; 4635 4636 var canvasWidth = self.canvasWidth; 4637 var canvasHeight = self.canvasHeight; 4638 4639 var distanceX = self.distanceX; 4640 var distanceY = self.distanceY; 4641 4642 var contentStartPos = self.contentStartPos; 4643 4644 var currentOffsetX = contentStartPos.left; 4645 var currentOffsetY = contentStartPos.top; 4646 4647 var currentWidth = contentStartPos.width; 4648 var currentHeight = contentStartPos.height; 4649 4650 var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY; 4651 4652 if (currentWidth > canvasWidth) { 4653 newOffsetX = currentOffsetX + distanceX; 4654 } else { 4655 newOffsetX = currentOffsetX; 4656 } 4657 4658 newOffsetY = currentOffsetY + distanceY; 4659 4660 // Slow down proportionally to traveled distance 4661 minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5); 4662 minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5); 4663 4664 maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5); 4665 maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5); 4666 4667 // -> 4668 if (distanceX > 0 && newOffsetX > minTranslateX) { 4669 newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0; 4670 } 4671 4672 // <- 4673 if (distanceX < 0 && newOffsetX < maxTranslateX) { 4674 newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0; 4675 } 4676 4677 // \/ 4678 if (distanceY > 0 && newOffsetY > minTranslateY) { 4679 newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0; 4680 } 4681 4682 // /\ 4683 if (distanceY < 0 && newOffsetY < maxTranslateY) { 4684 newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0; 4685 } 4686 4687 return { 4688 top: newOffsetY, 4689 left: newOffsetX 4690 }; 4691 }; 4692 4693 Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) { 4694 var self = this; 4695 4696 var canvasWidth = self.canvasWidth; 4697 var canvasHeight = self.canvasHeight; 4698 4699 if (newWidth > canvasWidth) { 4700 newOffsetX = newOffsetX > 0 ? 0 : newOffsetX; 4701 newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX; 4702 } else { 4703 // Center horizontally 4704 newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2); 4705 } 4706 4707 if (newHeight > canvasHeight) { 4708 newOffsetY = newOffsetY > 0 ? 0 : newOffsetY; 4709 newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY; 4710 } else { 4711 // Center vertically 4712 newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2); 4713 } 4714 4715 return { 4716 top: newOffsetY, 4717 left: newOffsetX 4718 }; 4719 }; 4720 4721 Guestures.prototype.onZoom = function () { 4722 var self = this; 4723 4724 // Calculate current distance between points to get pinch ratio and new width and height 4725 var contentStartPos = self.contentStartPos; 4726 4727 var currentWidth = contentStartPos.width; 4728 var currentHeight = contentStartPos.height; 4729 4730 var currentOffsetX = contentStartPos.left; 4731 var currentOffsetY = contentStartPos.top; 4732 4733 var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]); 4734 4735 var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers; 4736 4737 var newWidth = Math.floor(currentWidth * pinchRatio); 4738 var newHeight = Math.floor(currentHeight * pinchRatio); 4739 4740 // This is the translation due to pinch-zooming 4741 var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX; 4742 var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY; 4743 4744 // Point between the two touches 4745 var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft(); 4746 var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop(); 4747 4748 // And this is the translation due to translation of the centerpoint 4749 // between the two fingers 4750 var translateFromTranslatingX = centerPointEndX - self.centerPointStartX; 4751 var translateFromTranslatingY = centerPointEndY - self.centerPointStartY; 4752 4753 // The new offset is the old/current one plus the total translation 4754 var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX); 4755 var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY); 4756 4757 var newPos = { 4758 top: newOffsetY, 4759 left: newOffsetX, 4760 scaleX: pinchRatio, 4761 scaleY: pinchRatio 4762 }; 4763 4764 self.canTap = false; 4765 4766 self.newWidth = newWidth; 4767 self.newHeight = newHeight; 4768 4769 self.contentLastPos = newPos; 4770 4771 if (self.requestId) { 4772 cancelAFrame(self.requestId); 4773 } 4774 4775 self.requestId = requestAFrame(function () { 4776 $.fancybox.setTranslate(self.$content, self.contentLastPos); 4777 }); 4778 }; 4779 4780 Guestures.prototype.ontouchend = function (e) { 4781 var self = this; 4782 4783 var swiping = self.isSwiping; 4784 var panning = self.isPanning; 4785 var zooming = self.isZooming; 4786 var scrolling = self.isScrolling; 4787 4788 self.endPoints = getPointerXY(e); 4789 self.dMs = Math.max(new Date().getTime() - self.startTime, 1); 4790 4791 self.$container.removeClass("fancybox-is-grabbing"); 4792 4793 $(document).off(".fb.touch"); 4794 4795 document.removeEventListener("scroll", self.onscroll, true); 4796 4797 if (self.requestId) { 4798 cancelAFrame(self.requestId); 4799 4800 self.requestId = null; 4801 } 4802 4803 self.isSwiping = false; 4804 self.isPanning = false; 4805 self.isZooming = false; 4806 self.isScrolling = false; 4807 4808 self.instance.isDragging = false; 4809 4810 if (self.canTap) { 4811 return self.onTap(e); 4812 } 4813 4814 self.speed = 100; 4815 4816 // Speed in px/ms 4817 self.velocityX = (self.distanceX / self.dMs) * 0.5; 4818 self.velocityY = (self.distanceY / self.dMs) * 0.5; 4819 4820 if (panning) { 4821 self.endPanning(); 4822 } else if (zooming) { 4823 self.endZooming(); 4824 } else { 4825 self.endSwiping(swiping, scrolling); 4826 } 4827 4828 return; 4829 }; 4830 4831 Guestures.prototype.endSwiping = function (swiping, scrolling) { 4832 var self = this, 4833 ret = false, 4834 len = self.instance.group.length, 4835 distanceX = Math.abs(self.distanceX), 4836 canAdvance = swiping == "x" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50), 4837 speedX = 300; 4838 4839 self.sliderLastPos = null; 4840 4841 // Close if swiped vertically / navigate if horizontally 4842 if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) { 4843 // Continue vertical movement 4844 $.fancybox.animate( 4845 self.instance.current.$slide, { 4846 top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150, 4847 opacity: 0 4848 }, 4849 200 4850 ); 4851 ret = self.instance.close(true, 250); 4852 } else if (canAdvance && self.distanceX > 0) { 4853 ret = self.instance.previous(speedX); 4854 } else if (canAdvance && self.distanceX < 0) { 4855 ret = self.instance.next(speedX); 4856 } 4857 4858 if (ret === false && (swiping == "x" || swiping == "y")) { 4859 self.instance.centerSlide(200); 4860 } 4861 4862 self.$container.removeClass("fancybox-is-sliding"); 4863 }; 4864 4865 // Limit panning from edges 4866 // ======================== 4867 Guestures.prototype.endPanning = function () { 4868 var self = this, 4869 newOffsetX, 4870 newOffsetY, 4871 newPos; 4872 4873 if (!self.contentLastPos) { 4874 return; 4875 } 4876 4877 if (self.opts.momentum === false || self.dMs > 350) { 4878 newOffsetX = self.contentLastPos.left; 4879 newOffsetY = self.contentLastPos.top; 4880 } else { 4881 // Continue movement 4882 newOffsetX = self.contentLastPos.left + self.velocityX * 500; 4883 newOffsetY = self.contentLastPos.top + self.velocityY * 500; 4884 } 4885 4886 newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height); 4887 4888 newPos.width = self.contentStartPos.width; 4889 newPos.height = self.contentStartPos.height; 4890 4891 $.fancybox.animate(self.$content, newPos, 366); 4892 }; 4893 4894 Guestures.prototype.endZooming = function () { 4895 var self = this; 4896 4897 var current = self.instance.current; 4898 4899 var newOffsetX, newOffsetY, newPos, reset; 4900 4901 var newWidth = self.newWidth; 4902 var newHeight = self.newHeight; 4903 4904 if (!self.contentLastPos) { 4905 return; 4906 } 4907 4908 newOffsetX = self.contentLastPos.left; 4909 newOffsetY = self.contentLastPos.top; 4910 4911 reset = { 4912 top: newOffsetY, 4913 left: newOffsetX, 4914 width: newWidth, 4915 height: newHeight, 4916 scaleX: 1, 4917 scaleY: 1 4918 }; 4919 4920 // Reset scalex/scaleY values; this helps for perfomance and does not break animation 4921 $.fancybox.setTranslate(self.$content, reset); 4922 4923 if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) { 4924 self.instance.scaleToFit(150); 4925 } else if (newWidth > current.width || newHeight > current.height) { 4926 self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150); 4927 } else { 4928 newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight); 4929 4930 $.fancybox.animate(self.$content, newPos, 150); 4931 } 4932 }; 4933 4934 Guestures.prototype.onTap = function (e) { 4935 var self = this; 4936 var $target = $(e.target); 4937 4938 var instance = self.instance; 4939 var current = instance.current; 4940 4941 var endPoints = (e && getPointerXY(e)) || self.startPoints; 4942 4943 var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0; 4944 var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0; 4945 4946 var where; 4947 4948 var process = function (prefix) { 4949 var action = current.opts[prefix]; 4950 4951 if ($.isFunction(action)) { 4952 action = action.apply(instance, [current, e]); 4953 } 4954 4955 if (!action) { 4956 return; 4957 } 4958 4959 switch (action) { 4960 case "close": 4961 instance.close(self.startEvent); 4962 4963 break; 4964 4965 case "toggleControls": 4966 instance.toggleControls(); 4967 4968 break; 4969 4970 case "next": 4971 instance.next(); 4972 4973 break; 4974 4975 case "nextOrClose": 4976 if (instance.group.length > 1) { 4977 instance.next(); 4978 } else { 4979 instance.close(self.startEvent); 4980 } 4981 4982 break; 4983 4984 case "zoom": 4985 if (current.type == "image" && (current.isLoaded || current.$ghost)) { 4986 if (instance.canPan()) { 4987 instance.scaleToFit(); 4988 } else if (instance.isScaledDown()) { 4989 instance.scaleToActual(tapX, tapY); 4990 } else if (instance.group.length < 2) { 4991 instance.close(self.startEvent); 4992 } 4993 } 4994 4995 break; 4996 } 4997 }; 4998 4999 // Ignore right click 5000 if (e.originalEvent && e.originalEvent.button == 2) { 5001 return; 5002 } 5003 5004 // Skip if clicked on the scrollbar 5005 if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) { 5006 return; 5007 } 5008 5009 // Check where is clicked 5010 if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) { 5011 where = "Outside"; 5012 } else if ($target.is(".fancybox-slide")) { 5013 where = "Slide"; 5014 } else if ( 5015 instance.current.$content && 5016 instance.current.$content 5017 .find($target) 5018 .addBack() 5019 .filter($target).length 5020 ) { 5021 where = "Content"; 5022 } else { 5023 return; 5024 } 5025 5026 // Check if this is a double tap 5027 if (self.tapped) { 5028 // Stop previously created single tap 5029 clearTimeout(self.tapped); 5030 self.tapped = null; 5031 5032 // Skip if distance between taps is too big 5033 if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) { 5034 return this; 5035 } 5036 5037 // OK, now we assume that this is a double-tap 5038 process("dblclick" + where); 5039 } else { 5040 // Single tap will be processed if user has not clicked second time within 300ms 5041 // or there is no need to wait for double-tap 5042 self.tapX = tapX; 5043 self.tapY = tapY; 5044 5045 if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) { 5046 self.tapped = setTimeout(function () { 5047 self.tapped = null; 5048 5049 if (!instance.isAnimating) { 5050 process("click" + where); 5051 } 5052 }, 500); 5053 } else { 5054 process("click" + where); 5055 } 5056 } 5057 5058 return this; 5059 }; 5060 5061 $(document) 5062 .on("onActivate.fb", function (e, instance) { 5063 if (instance && !instance.Guestures) { 5064 instance.Guestures = new Guestures(instance); 5065 } 5066 }) 5067 .on("beforeClose.fb", function (e, instance) { 5068 if (instance && instance.Guestures) { 5069 instance.Guestures.destroy(); 5070 } 5071 }); 5072})(window, document, jQuery); 5073// ========================================================================== 5074// 5075// SlideShow 5076// Enables slideshow functionality 5077// 5078// Example of usage: 5079// $.fancybox.getInstance().SlideShow.start() 5080// 5081// ========================================================================== 5082(function (document, $) { 5083 "use strict"; 5084 5085 $.extend(true, $.fancybox.defaults, { 5086 btnTpl: { 5087 slideShow: '<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}">' + 5088 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.5 5.4v13.2l11-6.6z"/></svg>' + 5089 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.33 5.75h2.2v12.5h-2.2V5.75zm5.15 0h2.2v12.5h-2.2V5.75z"/></svg>' + 5090 "</button>" 5091 }, 5092 slideShow: { 5093 autoStart: false, 5094 speed: 3000, 5095 progress: true 5096 } 5097 }); 5098 5099 var SlideShow = function (instance) { 5100 this.instance = instance; 5101 this.init(); 5102 }; 5103 5104 $.extend(SlideShow.prototype, { 5105 timer: null, 5106 isActive: false, 5107 $button: null, 5108 5109 init: function () { 5110 var self = this, 5111 instance = self.instance, 5112 opts = instance.group[instance.currIndex].opts.slideShow; 5113 5114 self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () { 5115 self.toggle(); 5116 }); 5117 5118 if (instance.group.length < 2 || !opts) { 5119 self.$button.hide(); 5120 } else if (opts.progress) { 5121 self.$progress = $('<div class="fancybox-progress"></div>').appendTo(instance.$refs.inner); 5122 } 5123 }, 5124 5125 set: function (force) { 5126 var self = this, 5127 instance = self.instance, 5128 current = instance.current; 5129 5130 // Check if reached last element 5131 if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) { 5132 if (self.isActive && current.contentType !== "video") { 5133 if (self.$progress) { 5134 $.fancybox.animate(self.$progress.show(), { 5135 scaleX: 1 5136 }, current.opts.slideShow.speed); 5137 } 5138 5139 self.timer = setTimeout(function () { 5140 if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) { 5141 instance.jumpTo(0); 5142 } else { 5143 instance.next(); 5144 } 5145 }, current.opts.slideShow.speed); 5146 } 5147 } else { 5148 self.stop(); 5149 instance.idleSecondsCounter = 0; 5150 instance.showControls(); 5151 } 5152 }, 5153 5154 clear: function () { 5155 var self = this; 5156 5157 clearTimeout(self.timer); 5158 5159 self.timer = null; 5160 5161 if (self.$progress) { 5162 self.$progress.removeAttr("style").hide(); 5163 } 5164 }, 5165 5166 start: function () { 5167 var self = this, 5168 current = self.instance.current; 5169 5170 if (current) { 5171 self.$button 5172 .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP) 5173 .removeClass("fancybox-button--play") 5174 .addClass("fancybox-button--pause"); 5175 5176 self.isActive = true; 5177 5178 if (current.isComplete) { 5179 self.set(true); 5180 } 5181 5182 self.instance.trigger("onSlideShowChange", true); 5183 } 5184 }, 5185 5186 stop: function () { 5187 var self = this, 5188 current = self.instance.current; 5189 5190 self.clear(); 5191 5192 self.$button 5193 .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START) 5194 .removeClass("fancybox-button--pause") 5195 .addClass("fancybox-button--play"); 5196 5197 self.isActive = false; 5198 5199 self.instance.trigger("onSlideShowChange", false); 5200 5201 if (self.$progress) { 5202 self.$progress.removeAttr("style").hide(); 5203 } 5204 }, 5205 5206 toggle: function () { 5207 var self = this; 5208 5209 if (self.isActive) { 5210 self.stop(); 5211 } else { 5212 self.start(); 5213 } 5214 } 5215 }); 5216 5217 $(document).on({ 5218 "onInit.fb": function (e, instance) { 5219 if (instance && !instance.SlideShow) { 5220 instance.SlideShow = new SlideShow(instance); 5221 } 5222 }, 5223 5224 "beforeShow.fb": function (e, instance, current, firstRun) { 5225 var SlideShow = instance && instance.SlideShow; 5226 5227 if (firstRun) { 5228 if (SlideShow && current.opts.slideShow.autoStart) { 5229 SlideShow.start(); 5230 } 5231 } else if (SlideShow && SlideShow.isActive) { 5232 SlideShow.clear(); 5233 } 5234 }, 5235 5236 "afterShow.fb": function (e, instance, current) { 5237 var SlideShow = instance && instance.SlideShow; 5238 5239 if (SlideShow && SlideShow.isActive) { 5240 SlideShow.set(); 5241 } 5242 }, 5243 5244 "afterKeydown.fb": function (e, instance, current, keypress, keycode) { 5245 var SlideShow = instance && instance.SlideShow; 5246 5247 // "P" or Spacebar 5248 if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) { 5249 keypress.preventDefault(); 5250 5251 SlideShow.toggle(); 5252 } 5253 }, 5254 5255 "beforeClose.fb onDeactivate.fb": function (e, instance) { 5256 var SlideShow = instance && instance.SlideShow; 5257 5258 if (SlideShow) { 5259 SlideShow.stop(); 5260 } 5261 } 5262 }); 5263 5264 // Page Visibility API to pause slideshow when window is not active 5265 $(document).on("visibilitychange", function () { 5266 var instance = $.fancybox.getInstance(), 5267 SlideShow = instance && instance.SlideShow; 5268 5269 if (SlideShow && SlideShow.isActive) { 5270 if (document.hidden) { 5271 SlideShow.clear(); 5272 } else { 5273 SlideShow.set(); 5274 } 5275 } 5276 }); 5277})(document, jQuery); 5278// ========================================================================== 5279// 5280// FullScreen 5281// Adds fullscreen functionality 5282// 5283// ========================================================================== 5284(function (document, $) { 5285 "use strict"; 5286 5287 // Collection of methods supported by user browser 5288 var fn = (function () { 5289 var fnMap = [ 5290 ["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"], 5291 // new WebKit 5292 [ 5293 "webkitRequestFullscreen", 5294 "webkitExitFullscreen", 5295 "webkitFullscreenElement", 5296 "webkitFullscreenEnabled", 5297 "webkitfullscreenchange", 5298 "webkitfullscreenerror" 5299 ], 5300 // old WebKit (Safari 5.1) 5301 [ 5302 "webkitRequestFullScreen", 5303 "webkitCancelFullScreen", 5304 "webkitCurrentFullScreenElement", 5305 "webkitCancelFullScreen", 5306 "webkitfullscreenchange", 5307 "webkitfullscreenerror" 5308 ], 5309 [ 5310 "mozRequestFullScreen", 5311 "mozCancelFullScreen", 5312 "mozFullScreenElement", 5313 "mozFullScreenEnabled", 5314 "mozfullscreenchange", 5315 "mozfullscreenerror" 5316 ], 5317 ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"] 5318 ]; 5319 5320 var ret = {}; 5321 5322 for (var i = 0; i < fnMap.length; i++) { 5323 var val = fnMap[i]; 5324 5325 if (val && val[1] in document) { 5326 for (var j = 0; j < val.length; j++) { 5327 ret[fnMap[0][j]] = val[j]; 5328 } 5329 5330 return ret; 5331 } 5332 } 5333 5334 return false; 5335 })(); 5336 5337 if (fn) { 5338 var FullScreen = { 5339 request: function (elem) { 5340 elem = elem || document.documentElement; 5341 5342 elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT); 5343 }, 5344 exit: function () { 5345 document[fn.exitFullscreen](); 5346 }, 5347 toggle: function (elem) { 5348 elem = elem || document.documentElement; 5349 5350 if (this.isFullscreen()) { 5351 this.exit(); 5352 } else { 5353 this.request(elem); 5354 } 5355 }, 5356 isFullscreen: function () { 5357 return Boolean(document[fn.fullscreenElement]); 5358 }, 5359 enabled: function () { 5360 return Boolean(document[fn.fullscreenEnabled]); 5361 } 5362 }; 5363 5364 $.extend(true, $.fancybox.defaults, { 5365 btnTpl: { 5366 fullScreen: '<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fsenter" title="{{FULL_SCREEN}}">' + 5367 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>' + 5368 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 16h3v3h2v-5H5zm3-8H5v2h5V5H8zm6 11h2v-3h3v-2h-5zm2-11V5h-2v5h5V8z"/></svg>' + 5369 "</button>" 5370 }, 5371 fullScreen: { 5372 autoStart: false 5373 } 5374 }); 5375 5376 $(document).on(fn.fullscreenchange, function () { 5377 var isFullscreen = FullScreen.isFullscreen(), 5378 instance = $.fancybox.getInstance(); 5379 5380 if (instance) { 5381 // If image is zooming, then force to stop and reposition properly 5382 if (instance.current && instance.current.type === "image" && instance.isAnimating) { 5383 instance.isAnimating = false; 5384 5385 instance.update(true, true, 0); 5386 5387 if (!instance.isComplete) { 5388 instance.complete(); 5389 } 5390 } 5391 5392 instance.trigger("onFullscreenChange", isFullscreen); 5393 5394 instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen); 5395 5396 instance.$refs.toolbar 5397 .find("[data-fancybox-fullscreen]") 5398 .toggleClass("fancybox-button--fsenter", !isFullscreen) 5399 .toggleClass("fancybox-button--fsexit", isFullscreen); 5400 } 5401 }); 5402 } 5403 5404 $(document).on({ 5405 "onInit.fb": function (e, instance) { 5406 var $container; 5407 5408 if (!fn) { 5409 instance.$refs.toolbar.find("[data-fancybox-fullscreen]").remove(); 5410 5411 return; 5412 } 5413 5414 if (instance && instance.group[instance.currIndex].opts.fullScreen) { 5415 $container = instance.$refs.container; 5416 5417 $container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (e) { 5418 e.stopPropagation(); 5419 e.preventDefault(); 5420 5421 FullScreen.toggle(); 5422 }); 5423 5424 if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) { 5425 FullScreen.request(); 5426 } 5427 5428 // Expose API 5429 instance.FullScreen = FullScreen; 5430 } else if (instance) { 5431 instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide(); 5432 } 5433 }, 5434 5435 "afterKeydown.fb": function (e, instance, current, keypress, keycode) { 5436 // "F" 5437 if (instance && instance.FullScreen && keycode === 70) { 5438 keypress.preventDefault(); 5439 5440 instance.FullScreen.toggle(); 5441 } 5442 }, 5443 5444 "beforeClose.fb": function (e, instance) { 5445 if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) { 5446 FullScreen.exit(); 5447 } 5448 } 5449 }); 5450})(document, jQuery); 5451// ========================================================================== 5452// 5453// Thumbs 5454// Displays thumbnails in a grid 5455// 5456// ========================================================================== 5457(function (document, $) { 5458 "use strict"; 5459 5460 var CLASS = "fancybox-thumbs", 5461 CLASS_ACTIVE = CLASS + "-active"; 5462 5463 // Make sure there are default values 5464 $.fancybox.defaults = $.extend( 5465 true, { 5466 btnTpl: { 5467 thumbs: '<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="{{THUMBS}}">' + 5468 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.59 14.59h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76H5.65V5.65z"/></svg>' + 5469 "</button>" 5470 }, 5471 thumbs: { 5472 autoStart: false, // Display thumbnails on opening 5473 hideOnClose: true, // Hide thumbnail grid when closing animation starts 5474 parentEl: ".fancybox-container", // Container is injected into this element 5475 axis: "y" // Vertical (y) or horizontal (x) scrolling 5476 } 5477 }, 5478 $.fancybox.defaults 5479 ); 5480 5481 var FancyThumbs = function (instance) { 5482 this.init(instance); 5483 }; 5484 5485 $.extend(FancyThumbs.prototype, { 5486 $button: null, 5487 $grid: null, 5488 $list: null, 5489 isVisible: false, 5490 isActive: false, 5491 5492 init: function (instance) { 5493 var self = this, 5494 group = instance.group, 5495 enabled = 0; 5496 5497 self.instance = instance; 5498 self.opts = group[instance.currIndex].opts.thumbs; 5499 5500 instance.Thumbs = self; 5501 5502 self.$button = instance.$refs.toolbar.find("[data-fancybox-thumbs]"); 5503 5504 // Enable thumbs if at least two group items have thumbnails 5505 for (var i = 0, len = group.length; i < len; i++) { 5506 if (group[i].thumb) { 5507 enabled++; 5508 } 5509 5510 if (enabled > 1) { 5511 break; 5512 } 5513 } 5514 5515 if (enabled > 1 && !!self.opts) { 5516 self.$button.removeAttr("style").on("click", function () { 5517 self.toggle(); 5518 }); 5519 5520 self.isActive = true; 5521 } else { 5522 self.$button.hide(); 5523 } 5524 }, 5525 5526 create: function () { 5527 var self = this, 5528 instance = self.instance, 5529 parentEl = self.opts.parentEl, 5530 list = [], 5531 src; 5532 5533 if (!self.$grid) { 5534 // Create main element 5535 self.$grid = $('<div class="' + CLASS + " " + CLASS + "-" + self.opts.axis + '"></div>').appendTo( 5536 instance.$refs.container 5537 .find(parentEl) 5538 .addBack() 5539 .filter(parentEl) 5540 ); 5541 5542 // Add "click" event that performs gallery navigation 5543 self.$grid.on("click", "a", function () { 5544 instance.jumpTo($(this).attr("data-index")); 5545 }); 5546 } 5547 5548 // Build the list 5549 if (!self.$list) { 5550 self.$list = $('<div class="' + CLASS + '__list">').appendTo(self.$grid); 5551 } 5552 5553 $.each(instance.group, function (i, item) { 5554 src = item.thumb; 5555 5556 if (!src && item.type === "image") { 5557 src = item.src; 5558 } 5559 5560 list.push( 5561 '<a href="javascript:;" tabindex="0" data-index="' + 5562 i + 5563 '"' + 5564 (src && src.length ? ' style="background-image:url(' + src + ')"' : 'class="fancybox-thumbs-missing"') + 5565 "></a>" 5566 ); 5567 }); 5568 5569 self.$list[0].innerHTML = list.join(""); 5570 5571 if (self.opts.axis === "x") { 5572 // Set fixed width for list element to enable horizontal scrolling 5573 self.$list.width( 5574 parseInt(self.$grid.css("padding-right"), 10) + 5575 instance.group.length * 5576 self.$list 5577 .children() 5578 .eq(0) 5579 .outerWidth(true) 5580 ); 5581 } 5582 }, 5583 5584 focus: function (duration) { 5585 var self = this, 5586 $list = self.$list, 5587 $grid = self.$grid, 5588 thumb, 5589 thumbPos; 5590 5591 if (!self.instance.current) { 5592 return; 5593 } 5594 5595 thumb = $list 5596 .children() 5597 .removeClass(CLASS_ACTIVE) 5598 .filter('[data-index="' + self.instance.current.index + '"]') 5599 .addClass(CLASS_ACTIVE); 5600 5601 thumbPos = thumb.position(); 5602 5603 // Check if need to scroll to make current thumb visible 5604 if (self.opts.axis === "y" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) { 5605 $list.stop().animate({ 5606 scrollTop: $list.scrollTop() + thumbPos.top 5607 }, 5608 duration 5609 ); 5610 } else if ( 5611 self.opts.axis === "x" && 5612 (thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth())) 5613 ) { 5614 $list 5615 .parent() 5616 .stop() 5617 .animate({ 5618 scrollLeft: thumbPos.left 5619 }, 5620 duration 5621 ); 5622 } 5623 }, 5624 5625 update: function () { 5626 var that = this; 5627 that.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible); 5628 5629 if (that.isVisible) { 5630 if (!that.$grid) { 5631 that.create(); 5632 } 5633 5634 that.instance.trigger("onThumbsShow"); 5635 5636 that.focus(0); 5637 } else if (that.$grid) { 5638 that.instance.trigger("onThumbsHide"); 5639 } 5640 5641 // Update content position 5642 that.instance.update(); 5643 }, 5644 5645 hide: function () { 5646 this.isVisible = false; 5647 this.update(); 5648 }, 5649 5650 show: function () { 5651 this.isVisible = true; 5652 this.update(); 5653 }, 5654 5655 toggle: function () { 5656 this.isVisible = !this.isVisible; 5657 this.update(); 5658 } 5659 }); 5660 5661 $(document).on({ 5662 "onInit.fb": function (e, instance) { 5663 var Thumbs; 5664 5665 if (instance && !instance.Thumbs) { 5666 Thumbs = new FancyThumbs(instance); 5667 5668 if (Thumbs.isActive && Thumbs.opts.autoStart === true) { 5669 Thumbs.show(); 5670 } 5671 } 5672 }, 5673 5674 "beforeShow.fb": function (e, instance, item, firstRun) { 5675 var Thumbs = instance && instance.Thumbs; 5676 5677 if (Thumbs && Thumbs.isVisible) { 5678 Thumbs.focus(firstRun ? 0 : 250); 5679 } 5680 }, 5681 5682 "afterKeydown.fb": function (e, instance, current, keypress, keycode) { 5683 var Thumbs = instance && instance.Thumbs; 5684 5685 // "G" 5686 if (Thumbs && Thumbs.isActive && keycode === 71) { 5687 keypress.preventDefault(); 5688 5689 Thumbs.toggle(); 5690 } 5691 }, 5692 5693 "beforeClose.fb": function (e, instance) { 5694 var Thumbs = instance && instance.Thumbs; 5695 5696 if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) { 5697 Thumbs.$grid.hide(); 5698 } 5699 } 5700 }); 5701})(document, jQuery); 5702//// ========================================================================== 5703// 5704// Share 5705// Displays simple form for sharing current url 5706// 5707// ========================================================================== 5708(function (document, $) { 5709 "use strict"; 5710 5711 $.extend(true, $.fancybox.defaults, { 5712 btnTpl: { 5713 share: '<button data-fancybox-share class="fancybox-button fancybox-button--share" title="{{SHARE}}">' + 5714 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2.55 19c1.4-8.4 9.1-9.8 11.9-9.8V5l7 7-7 6.3v-3.5c-2.8 0-10.5 2.1-11.9 4.2z"/></svg>' + 5715 "</button>" 5716 }, 5717 share: { 5718 url: function (instance, item) { 5719 return ( 5720 (!instance.currentHash && !(item.type === "inline" || item.type === "html") ? item.origSrc || item.src : false) || window.location 5721 ); 5722 }, 5723 tpl: '<div class="fancybox-share">' + 5724 "<h1>{{SHARE}}</h1>" + 5725 "<p>" + 5726 '<a class="fancybox-share__button fancybox-share__button--fb" href="https://www.facebook.com/sharer/sharer.php?u={{url}}">' + 5727 '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m287 456v-299c0-21 6-35 35-35h38v-63c-7-1-29-3-55-3-54 0-91 33-91 94v306m143-254h-205v72h196" /></svg>' + 5728 "<span>Facebook</span>" + 5729 "</a>" + 5730 '<a class="fancybox-share__button fancybox-share__button--tw" href="https://twitter.com/intent/tweet?url={{url}}&text={{descr}}">' + 5731 '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z" /></svg>' + 5732 "<span>Twitter</span>" + 5733 "</a>" + 5734 '<a class="fancybox-share__button fancybox-share__button--pt" href="https://www.pinterest.com/pin/create/button/?url={{url}}&description={{descr}}&media={{media}}">' + 5735 '<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m265 56c-109 0-164 78-164 144 0 39 15 74 47 87 5 2 10 0 12-5l4-19c2-6 1-8-3-13-9-11-15-25-15-45 0-58 43-110 113-110 62 0 96 38 96 88 0 67-30 122-73 122-24 0-42-19-36-44 6-29 20-60 20-81 0-19-10-35-31-35-25 0-44 26-44 60 0 21 7 36 7 36l-30 125c-8 37-1 83 0 87 0 3 4 4 5 2 2-3 32-39 42-75l16-64c8 16 31 29 56 29 74 0 124-67 124-157 0-69-58-132-146-132z" fill="#fff"/></svg>' + 5736 "<span>Pinterest</span>" + 5737 "</a>" + 5738 "</p>" + 5739 '<p><input class="fancybox-share__input" type="text" value="{{url_raw}}" onclick="select()" /></p>' + 5740 "</div>" 5741 } 5742 }); 5743 5744 function escapeHtml(string) { 5745 var entityMap = { 5746 "&": "&", 5747 "<": "<", 5748 ">": ">", 5749 '"': """, 5750 "'": "'", 5751 "/": "/", 5752 "`": "`", 5753 "=": "=" 5754 }; 5755 5756 return String(string).replace(/[&<>"'`=\/]/g, function (s) { 5757 return entityMap[s]; 5758 }); 5759 } 5760 5761 $(document).on("click", "[data-fancybox-share]", function () { 5762 var instance = $.fancybox.getInstance(), 5763 current = instance.current || null, 5764 url, 5765 tpl; 5766 5767 if (!current) { 5768 return; 5769 } 5770 5771 if ($.type(current.opts.share.url) === "function") { 5772 url = current.opts.share.url.apply(current, [instance, current]); 5773 } 5774 5775 tpl = current.opts.share.tpl 5776 .replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "") 5777 .replace(/\{\{url\}\}/g, encodeURIComponent(url)) 5778 .replace(/\{\{url_raw\}\}/g, escapeHtml(url)) 5779 .replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : ""); 5780 5781 $.fancybox.open({ 5782 src: instance.translate(instance, tpl), 5783 type: "html", 5784 opts: { 5785 touch: false, 5786 animationEffect: false, 5787 afterLoad: function (shareInstance, shareCurrent) { 5788 // Close self if parent instance is closing 5789 instance.$refs.container.one("beforeClose.fb", function () { 5790 shareInstance.close(null, 0); 5791 }); 5792 5793 // Opening links in a popup window 5794 shareCurrent.$content.find(".fancybox-share__button").click(function () { 5795 window.open(this.href, "Share", "width=550, height=450"); 5796 return false; 5797 }); 5798 }, 5799 mobile: { 5800 autoFocus: false 5801 } 5802 } 5803 }); 5804 }); 5805})(document, jQuery); 5806// ========================================================================== 5807// 5808// Hash 5809// Enables linking to each modal 5810// 5811// ========================================================================== 5812(function (window, document, $) { 5813 "use strict"; 5814 5815 // Simple $.escapeSelector polyfill (for jQuery prior v3) 5816 if (!$.escapeSelector) { 5817 $.escapeSelector = function (sel) { 5818 var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 5819 var fcssescape = function (ch, asCodePoint) { 5820 if (asCodePoint) { 5821 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 5822 if (ch === "\0") { 5823 return "\uFFFD"; 5824 } 5825 5826 // Control characters and (dependent upon position) numbers get escaped as code points 5827 return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; 5828 } 5829 5830 // Other potentially-special ASCII characters get backslash-escaped 5831 return "\\" + ch; 5832 }; 5833 5834 return (sel + "").replace(rcssescape, fcssescape); 5835 }; 5836 } 5837 5838 // Get info about gallery name and current index from url 5839 function parseUrl() { 5840 var hash = window.location.hash.substr(1), 5841 rez = hash.split("-"), 5842 index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1, 5843 gallery = rez.join("-"); 5844 5845 return { 5846 hash: hash, 5847 /* Index is starting from 1 */ 5848 index: index < 1 ? 1 : index, 5849 gallery: gallery 5850 }; 5851 } 5852 5853 // Trigger click evnt on links to open new fancyBox instance 5854 function triggerFromUrl(url) { 5855 if (url.gallery !== "") { 5856 // If we can find element matching 'data-fancybox' atribute, 5857 // then triggering click event should start fancyBox 5858 $("[data-fancybox='" + $.escapeSelector(url.gallery) + "']") 5859 .eq(url.index - 1) 5860 .focus() 5861 .trigger("click.fb-start"); 5862 } 5863 } 5864 5865 // Get gallery name from current instance 5866 function getGalleryID(instance) { 5867 var opts, ret; 5868 5869 if (!instance) { 5870 return false; 5871 } 5872 5873 opts = instance.current ? instance.current.opts : instance.opts; 5874 ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : ""); 5875 5876 return ret === "" ? false : ret; 5877 } 5878 5879 // Start when DOM becomes ready 5880 $(function () { 5881 // Check if user has disabled this module 5882 if ($.fancybox.defaults.hash === false) { 5883 return; 5884 } 5885 5886 // Update hash when opening/closing fancyBox 5887 $(document).on({ 5888 "onInit.fb": function (e, instance) { 5889 var url, gallery; 5890 5891 if (instance.group[instance.currIndex].opts.hash === false) { 5892 return; 5893 } 5894 5895 url = parseUrl(); 5896 gallery = getGalleryID(instance); 5897 5898 // Make sure gallery start index matches index from hash 5899 if (gallery && url.gallery && gallery == url.gallery) { 5900 instance.currIndex = url.index - 1; 5901 } 5902 }, 5903 5904 "beforeShow.fb": function (e, instance, current, firstRun) { 5905 var gallery; 5906 5907 if (!current || current.opts.hash === false) { 5908 return; 5909 } 5910 5911 // Check if need to update window hash 5912 gallery = getGalleryID(instance); 5913 5914 if (!gallery) { 5915 return; 5916 } 5917 5918 // Variable containing last hash value set by fancyBox 5919 // It will be used to determine if fancyBox needs to close after hash change is detected 5920 instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : ""); 5921 5922 // If current hash is the same (this instance most likely is opened by hashchange), then do nothing 5923 if (window.location.hash === "#" + instance.currentHash) { 5924 return; 5925 } 5926 5927 if (firstRun && !instance.origHash) { 5928 instance.origHash = window.location.hash; 5929 } 5930 5931 if (instance.hashTimer) { 5932 clearTimeout(instance.hashTimer); 5933 } 5934 5935 // Update hash 5936 instance.hashTimer = setTimeout(function () { 5937 if ("replaceState" in window.history) { 5938 window.history[firstRun ? "pushState" : "replaceState"]({}, 5939 document.title, 5940 window.location.pathname + window.location.search + "#" + instance.currentHash 5941 ); 5942 5943 if (firstRun) { 5944 instance.hasCreatedHistory = true; 5945 } 5946 } else { 5947 window.location.hash = instance.currentHash; 5948 } 5949 5950 instance.hashTimer = null; 5951 }, 300); 5952 }, 5953 5954 "beforeClose.fb": function (e, instance, current) { 5955 if (!current || current.opts.hash === false) { 5956 return; 5957 } 5958 5959 clearTimeout(instance.hashTimer); 5960 5961 // Goto previous history entry 5962 if (instance.currentHash && instance.hasCreatedHistory) { 5963 window.history.back(); 5964 } else if (instance.currentHash) { 5965 if ("replaceState" in window.history) { 5966 window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || "")); 5967 } else { 5968 window.location.hash = instance.origHash; 5969 } 5970 } 5971 5972 instance.currentHash = null; 5973 } 5974 }); 5975 5976 // Check if need to start/close after url has changed 5977 $(window).on("hashchange.fb", function () { 5978 var url = parseUrl(), 5979 fb = null; 5980 5981 // Find last fancyBox instance that has "hash" 5982 $.each( 5983 $(".fancybox-container") 5984 .get() 5985 .reverse(), 5986 function (index, value) { 5987 var tmp = $(value).data("FancyBox"); 5988 5989 if (tmp && tmp.currentHash) { 5990 fb = tmp; 5991 return false;
5992 } 5993 } 5994 ); 5995 5996 if (fb) { 5997 // Now, compare hash values 5998 if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) { 5999 fb.currentHash = null; 6000 6001 fb.close(); 6002 } 6003 } else if (url.gallery !== "") { 6004 triggerFromUrl(url); 6005 } 6006 }); 6007 6008 // Check current hash and trigger click event on matching element to start fancyBox, if needed 6009 setTimeout(function () { 6010 if (!$.fancybox.getInstance()) { 6011 triggerFromUrl(parseUrl()); 6012 } 6013 }, 50); 6014 }); 6015})(window, document, jQuery); 6016// ========================================================================== 6017// 6018// Wheel 6019// Basic mouse weheel support for gallery navigation 6020// 6021// ========================================================================== 6022(function (document, $) { 6023 "use strict"; 6024 6025 var prevTime = new Date().getTime(); 6026 6027 $(document).on({ 6028 "onInit.fb": function (e, instance, current) { 6029 instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) { 6030 var current = instance.current, 6031 currTime = new Date().getTime(); 6032 6033 if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) { 6034 return; 6035 } 6036 6037 e.preventDefault(); 6038 e.stopPropagation(); 6039 6040 if (current.$slide.hasClass("fancybox-animated")) { 6041 return; 6042 } 6043 6044 e = e.originalEvent || e; 6045 6046 if (currTime - prevTime < 250) { 6047 return; 6048 } 6049 6050 prevTime = currTime; 6051 6052 instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"](); 6053 }); 6054 } 6055 }); 6056})(document, jQuery); 6057 6058// Generated by CoffeeScript 1.12.4 6059 6060/** @preserve OverlappingMarkerSpiderfier 6061https://github.com/jawj/OverlappingMarkerSpiderfier 6062Copyright (c) 2011 - 2013 George MacKerron 6063Released under the MIT licence: http://opensource.org/licenses/mit-license 6064Note: The Google Maps API v3 must be included *before* this code 6065 */ 6066 6067(function() { 6068 var ref, 6069 hasProp = {}.hasOwnProperty, 6070 slice = [].slice; 6071 6072 if (((ref = this['google']) != null ? ref['maps'] : void 0) == null) { 6073 return; 6074 } 6075 6076 this['OverlappingMarkerSpiderfier'] = (function() { 6077 var ge, gm, j, lcH, lcU, len, mt, p, ref1, twoPi, x; 6078 6079 p = _Class.prototype; 6080 6081 ref1 = [_Class, p]; 6082 for (j = 0, len = ref1.length; j < len; j++) { 6083 x = ref1[j]; 6084 x['VERSION'] = '0.3.3'; 6085 } 6086 6087 gm = google.maps; 6088 6089 ge = gm.event; 6090 6091 mt = gm.MapTypeId; 6092 6093 twoPi = Math.PI * 2; 6094 6095 p['keepSpiderfied'] = false; 6096 6097 p['markersWontHide'] = false; 6098 6099 p['markersWontMove'] = false; 6100 6101 p['nearbyDistance'] = 20; 6102 6103 p['circleSpiralSwitchover'] = 9; 6104 6105 p['circleFootSeparation'] = 23; 6106 6107 p['circleStartAngle'] = twoPi / 12; 6108 6109 p['spiralFootSeparation'] = 26; 6110 6111 p['spiralLengthStart'] = 11; 6112 6113 p['spiralLengthFactor'] = 4; 6114 6115 p['spiderfiedZIndex'] = 1000; 6116 6117 p['usualLegZIndex'] = 10; 6118 6119 p['highlightedLegZIndex'] = 20; 6120 6121 p['legWeight'] = 1.5; 6122 6123 p['legColors'] = { 6124 'usual': {}, 6125 'highlighted': {} 6126 }; 6127 6128 lcU = p['legColors']['usual']; 6129 6130 lcH = p['legColors']['highlighted']; 6131 6132 lcU[mt.HYBRID] = lcU[mt.SATELLITE] = '#fff'; 6133 6134 lcH[mt.HYBRID] = lcH[mt.SATELLITE] = '#f00'; 6135 6136 lcU[mt.TERRAIN] = lcU[mt.ROADMAP] = '#444'; 6137 6138 lcH[mt.TERRAIN] = lcH[mt.ROADMAP] = '#f00'; 6139 6140 function _Class(map1, opts) { 6141 var e, k, l, len1, ref2, v; 6142 this.map = map1; 6143 if (opts == null) { 6144 opts = {}; 6145 } 6146 for (k in opts) { 6147 if (!hasProp.call(opts, k)) continue; 6148 v = opts[k]; 6149 this[k] = v; 6150 } 6151 this.projHelper = new this.constructor.ProjHelper(this.map); 6152 this.initMarkerArrays(); 6153 this.listeners = {}; 6154 ref2 = ['click', 'zoom_changed', 'maptypeid_changed']; 6155 for (l = 0, len1 = ref2.length; l < len1; l++) { 6156 e = ref2[l]; 6157 ge.addListener(this.map, e, (function(_this) { 6158 return function() { 6159 return _this['unspiderfy'](); 6160 }; 6161 })(this)); 6162 } 6163 } 6164 6165 p.initMarkerArrays = function() { 6166 this.markers = []; 6167 return this.markerListenerRefs = []; 6168 }; 6169 6170 p['addMarker'] = function(marker) { 6171 var listenerRefs; 6172 if (marker['_oms'] != null) { 6173 return this; 6174 } 6175 marker['_oms'] = true; 6176 listenerRefs = [ 6177 ge.addListener(marker, 'click', (function(_this) { 6178 return function(event) { 6179 return _this.spiderListener(marker, event); 6180 }; 6181 })(this)) 6182 ]; 6183 if (!this['markersWontHide']) { 6184 listenerRefs.push(ge.addListener(marker, 'visible_changed', (function(_this) { 6185 return function() { 6186 return _this.markerChangeListener(marker, false); 6187 }; 6188 })(this))); 6189 } 6190 if (!this['markersWontMove']) { 6191 listenerRefs.push(ge.addListener(marker, 'position_changed', (function(_this) { 6192 return function() { 6193 return _this.markerChangeListener(marker, true); 6194 }; 6195 })(this))); 6196 } 6197 this.markerListenerRefs.push(listenerRefs); 6198 this.markers.push(marker); 6199 return this; 6200 }; 6201 6202 p.markerChangeListener = function(marker, positionChanged) { 6203 if ((marker['_omsData'] != null) && (positionChanged || !marker.getVisible()) && !((this.spiderfying != null) || (this.unspiderfying != null))) { 6204 return this['unspiderfy'](positionChanged ? marker : null); 6205 } 6206 }; 6207 6208 p['getMarkers'] = function() { 6209 return this.markers.slice(0); 6210 }; 6211 6212 p['removeMarker'] = function(marker) { 6213 var i, l, len1, listenerRef, listenerRefs; 6214 if (marker['_omsData'] != null) { 6215 this['unspiderfy'](); 6216 } 6217 i = this.arrIndexOf(this.markers, marker); 6218 if (i < 0) { 6219 return this; 6220 } 6221 listenerRefs = this.markerListenerRefs.splice(i, 1)[0]; 6222 for (l = 0, len1 = listenerRefs.length; l < len1; l++) { 6223 listenerRef = listenerRefs[l]; 6224 ge.removeListener(listenerRef); 6225 } 6226 delete marker['_oms']; 6227 this.markers.splice(i, 1); 6228 return this; 6229 }; 6230 6231 p['clearMarkers'] = function() { 6232 var i, l, len1, len2, listenerRef, listenerRefs, marker, n, ref2; 6233 this['unspiderfy'](); 6234 ref2 = this.markers; 6235 for (i = l = 0, len1 = ref2.length; l < len1; i = ++l) {
vendor: 11,498 bytes, lines 6236-6562
6236 marker = ref2[i]; 6237 listenerRefs = this.markerListenerRefs[i]; 6238 for (n = 0, len2 = listenerRefs.length; n < len2; n++) { 6239 listenerRef = listenerRefs[n]; 6240 ge.removeListener(listenerRef); 6241 } 6242 delete marker['_oms']; 6243 } 6244 this.initMarkerArrays(); 6245 return this; 6246 }; 6247 6248 p['addListener'] = function(event, func) { 6249 var base; 6250 ((base = this.listeners)[event] != null ? base[event] : base[event] = []).push(func); 6251 return this; 6252 }; 6253 6254 p['removeListener'] = function(event, func) { 6255 var i; 6256 i = this.arrIndexOf(this.listeners[event], func); 6257 if (!(i < 0)) { 6258 this.listeners[event].splice(i, 1); 6259 } 6260 return this; 6261 }; 6262 6263 p['clearListeners'] = function(event) { 6264 this.listeners[event] = []; 6265 return this; 6266 }; 6267 6268 p.trigger = function() { 6269 var args, event, func, l, len1, ref2, ref3, results; 6270 event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; 6271 ref3 = (ref2 = this.listeners[event]) != null ? ref2 : []; 6272 results = []; 6273 for (l = 0, len1 = ref3.length; l < len1; l++) { 6274 func = ref3[l]; 6275 results.push(func.apply(null, args)); 6276 } 6277 return results; 6278 }; 6279 6280 p.generatePtsCircle = function(count, centerPt) { 6281 var angle, angleStep, circumference, i, l, legLength, ref2, results; 6282 circumference = this['circleFootSeparation'] * (2 + count); 6283 legLength = circumference / twoPi; 6284 angleStep = twoPi / count; 6285 results = []; 6286 for (i = l = 0, ref2 = count; 0 <= ref2 ? l < ref2 : l > ref2; i = 0 <= ref2 ? ++l : --l) { 6287 angle = this['circleStartAngle'] + i * angleStep; 6288 results.push(new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))); 6289 } 6290 return results; 6291 }; 6292 6293 p.generatePtsSpiral = function(count, centerPt) { 6294 var angle, i, l, legLength, pt, ref2, results; 6295 legLength = this['spiralLengthStart']; 6296 angle = 0; 6297 results = []; 6298 for (i = l = 0, ref2 = count; 0 <= ref2 ? l < ref2 : l > ref2; i = 0 <= ref2 ? ++l : --l) { 6299 angle += this['spiralFootSeparation'] / legLength + i * 0.0005; 6300 pt = new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle)); 6301 legLength += twoPi * this['spiralLengthFactor'] / angle; 6302 results.push(pt); 6303 } 6304 return results; 6305 }; 6306 6307 p.spiderListener = function(marker, event) { 6308 var l, len1, m, mPt, markerPt, markerSpiderfied, nDist, nearbyMarkerData, nonNearbyMarkers, pxSq, ref2; 6309 markerSpiderfied = marker['_omsData'] != null; 6310 if (!(markerSpiderfied && this['keepSpiderfied'])) { 6311 this['unspiderfy'](); 6312 } 6313 if (markerSpiderfied || this.map.getStreetView().getVisible() || this.map.getMapTypeId() === 'GoogleEarthAPI') { 6314 return this.trigger('click', marker, event); 6315 } else { 6316 nearbyMarkerData = []; 6317 nonNearbyMarkers = []; 6318 nDist = this['nearbyDistance']; 6319 pxSq = nDist * nDist; 6320 markerPt = this.llToPt(marker.position); 6321 ref2 = this.markers; 6322 for (l = 0, len1 = ref2.length; l < len1; l++) { 6323 m = ref2[l]; 6324 if (!((m.map != null) && m.getVisible())) { 6325 continue; 6326 } 6327 mPt = this.llToPt(m.position); 6328 if (this.ptDistanceSq(mPt, markerPt) < pxSq) { 6329 nearbyMarkerData.push({ 6330 marker: m, 6331 markerPt: mPt 6332 }); 6333 } else { 6334 nonNearbyMarkers.push(m); 6335 } 6336 } 6337 if (nearbyMarkerData.length === 1) { 6338 return this.trigger('click', marker, event); 6339 } else { 6340 return this.spiderfy(nearbyMarkerData, nonNearbyMarkers); 6341 } 6342 } 6343 }; 6344 6345 p['markersNearMarker'] = function(marker, firstOnly) { 6346 var l, len1, m, mPt, markerPt, markers, nDist, pxSq, ref2, ref3, ref4; 6347 if (firstOnly == null) { 6348 firstOnly = false; 6349 } 6350 if (this.projHelper.getProjection() == null) { 6351 throw "Must wait for 'idle' event on map before calling markersNearMarker"; 6352 } 6353 nDist = this['nearbyDistance']; 6354 pxSq = nDist * nDist; 6355 markerPt = this.llToPt(marker.position); 6356 markers = []; 6357 ref2 = this.markers; 6358 for (l = 0, len1 = ref2.length; l < len1; l++) { 6359 m = ref2[l]; 6360 if (m === marker || (m.map == null) || !m.getVisible()) { 6361 continue; 6362 } 6363 mPt = this.llToPt((ref3 = (ref4 = m['_omsData']) != null ? ref4.usualPosition : void 0) != null ? ref3 : m.position); 6364 if (this.ptDistanceSq(mPt, markerPt) < pxSq) { 6365 markers.push(m); 6366 if (firstOnly) { 6367 break; 6368 } 6369 } 6370 } 6371 return markers; 6372 }; 6373 6374 p['markersNearAnyOtherMarker'] = function() { 6375 var i, i1, i2, l, len1, len2, len3, m, m1, m1Data, m2, m2Data, mData, n, nDist, pxSq, q, ref2, ref3, ref4, results; 6376 if (this.projHelper.getProjection() == null) { 6377 throw "Must wait for 'idle' event on map before calling markersNearAnyOtherMarker"; 6378 } 6379 nDist = this['nearbyDistance']; 6380 pxSq = nDist * nDist; 6381 mData = (function() { 6382 var l, len1, ref2, ref3, ref4, results; 6383 ref2 = this.markers; 6384 results = []; 6385 for (l = 0, len1 = ref2.length; l < len1; l++) { 6386 m = ref2[l]; 6387 results.push({ 6388 pt: this.llToPt((ref3 = (ref4 = m['_omsData']) != null ? ref4.usualPosition : void 0) != null ? ref3 : m.position), 6389 willSpiderfy: false 6390 }); 6391 } 6392 return results; 6393 }).call(this); 6394 ref2 = this.markers; 6395 for (i1 = l = 0, len1 = ref2.length; l < len1; i1 = ++l) { 6396 m1 = ref2[i1]; 6397 if (!((m1.map != null) && m1.getVisible())) { 6398 continue; 6399 } 6400 m1Data = mData[i1]; 6401 if (m1Data.willSpiderfy) { 6402 continue; 6403 } 6404 ref3 = this.markers; 6405 for (i2 = n = 0, len2 = ref3.length; n < len2; i2 = ++n) { 6406 m2 = ref3[i2]; 6407 if (i2 === i1) { 6408 continue; 6409 } 6410 if (!((m2.map != null) && m2.getVisible())) { 6411 continue; 6412 } 6413 m2Data = mData[i2]; 6414 if (i2 < i1 && !m2Data.willSpiderfy) { 6415 continue; 6416 } 6417 if (this.ptDistanceSq(m1Data.pt, m2Data.pt) < pxSq) { 6418 m1Data.willSpiderfy = m2Data.willSpiderfy = true; 6419 break; 6420 } 6421 } 6422 } 6423 ref4 = this.markers; 6424 results = []; 6425 for (i = q = 0, len3 = ref4.length; q < len3; i = ++q) { 6426 m = ref4[i]; 6427 if (mData[i].willSpiderfy) { 6428 results.push(m); 6429 } 6430 } 6431 return results; 6432 }; 6433 6434 p.makeHighlightListenerFuncs = function(marker) { 6435 return { 6436 highlight: (function(_this) { 6437 return function() { 6438 return marker['_omsData'].leg.setOptions({ 6439 strokeColor: _this['legColors']['highlighted'][_this.map.mapTypeId], 6440 zIndex: _this['highlightedLegZIndex'] 6441 }); 6442 }; 6443 })(this), 6444 unhighlight: (function(_this) { 6445 return function() { 6446 return marker['_omsData'].leg.setOptions({ 6447 strokeColor: _this['legColors']['usual'][_this.map.mapTypeId], 6448 zIndex: _this['usualLegZIndex'] 6449 }); 6450 }; 6451 })(this) 6452 }; 6453 }; 6454 6455 p.spiderfy = function(markerData, nonNearbyMarkers) { 6456 var bodyPt, footLl, footPt, footPts, highlightListenerFuncs, leg, marker, md, nearestMarkerDatum, numFeet, spiderfiedMarkers; 6457 this.spiderfying = true; 6458 numFeet = markerData.length; 6459 bodyPt = this.ptAverage((function() { 6460 var l, len1, results; 6461 results = []; 6462 for (l = 0, len1 = markerData.length; l < len1; l++) { 6463 md = markerData[l]; 6464 results.push(md.markerPt); 6465 } 6466 return results; 6467 })()); 6468 footPts = numFeet >= this['circleSpiralSwitchover'] ? this.generatePtsSpiral(numFeet, bodyPt).reverse() : this.generatePtsCircle(numFeet, bodyPt); 6469 spiderfiedMarkers = (function() { 6470 var l, len1, results; 6471 results = []; 6472 for (l = 0, len1 = footPts.length; l < len1; l++) { 6473 footPt = footPts[l]; 6474 footLl = this.ptToLl(footPt); 6475 nearestMarkerDatum = this.minExtract(markerData, (function(_this) { 6476 return function(md) { 6477 return _this.ptDistanceSq(md.markerPt, footPt); 6478 }; 6479 })(this)); 6480 marker = nearestMarkerDatum.marker; 6481 leg = new gm.Polyline({ 6482 map: this.map, 6483 path: [marker.position, footLl], 6484 strokeColor: this['legColors']['usual'][this.map.mapTypeId], 6485 strokeWeight: this['legWeight'], 6486 zIndex: this['usualLegZIndex'] 6487 }); 6488 marker['_omsData'] = { 6489 usualPosition: marker.position, 6490 leg: leg 6491 }; 6492 if (this['legColors']['highlighted'][this.map.mapTypeId] !== this['legColors']['usual'][this.map.mapTypeId]) { 6493 highlightListenerFuncs = this.makeHighlightListenerFuncs(marker); 6494 marker['_omsData'].hightlightListeners = { 6495 highlight: ge.addListener(marker, 'mouseover', highlightListenerFuncs.highlight), 6496 unhighlight: ge.addListener(marker, 'mouseout', highlightListenerFuncs.unhighlight) 6497 }; 6498 } 6499 marker.setPosition(footLl); 6500 marker.setZIndex(Math.round(this['spiderfiedZIndex'] + footPt.y)); 6501 results.push(marker); 6502 } 6503 return results; 6504 }).call(this); 6505 delete this.spiderfying; 6506 this.spiderfied = true; 6507 return this.trigger('spiderfy', spiderfiedMarkers, nonNearbyMarkers); 6508 }; 6509 6510 p['unspiderfy'] = function(markerNotToMove) { 6511 var l, len1, listeners, marker, nonNearbyMarkers, ref2, unspiderfiedMarkers; 6512 if (markerNotToMove == null) { 6513 markerNotToMove = null; 6514 } 6515 if (this.spiderfied == null) { 6516 return this; 6517 } 6518 this.unspiderfying = true; 6519 unspiderfiedMarkers = []; 6520 nonNearbyMarkers = []; 6521 ref2 = this.markers; 6522 for (l = 0, len1 = ref2.length; l < len1; l++) { 6523 marker = ref2[l]; 6524 if (marker['_omsData'] != null) { 6525 marker['_omsData'].leg.setMap(null); 6526 if (marker !== markerNotToMove) { 6527 marker.setPosition(marker['_omsData'].usualPosition); 6528 } 6529 marker.setZIndex(null); 6530 listeners = marker['_omsData'].hightlightListeners; 6531 if (listeners != null) { 6532 ge.removeListener(listeners.highlight); 6533 ge.removeListener(listeners.unhighlight); 6534 } 6535 delete marker['_omsData']; 6536 unspiderfiedMarkers.push(marker); 6537 } else { 6538 nonNearbyMarkers.push(marker); 6539 } 6540 } 6541 delete this.unspiderfying; 6542 delete this.spiderfied; 6543 this.trigger('unspiderfy', unspiderfiedMarkers, nonNearbyMarkers); 6544 return this; 6545 }; 6546 6547 p.ptDistanceSq = function(pt1, pt2) { 6548 var dx, dy; 6549 dx = pt1.x - pt2.x; 6550 dy = pt1.y - pt2.y; 6551 return dx * dx + dy * dy; 6552 }; 6553 6554 p.ptAverage = function(pts) { 6555 var l, len1, numPts, pt, sumX, sumY; 6556 sumX = sumY = 0; 6557 for (l = 0, len1 = pts.length; l < len1; l++) { 6558 pt = pts[l]; 6559 sumX += pt.x; 6560 sumY += pt.y; 6561 } 6562 numPts = pts.length;
6563 return new gm.Point(sumX / numPts, sumY / numPts); 6564 }; 6565 6566 p.llToPt = function(ll) { 6567 return this.projHelper.getProjection().fromLatLngToDivPixel(ll); 6568 }; 6569 6570 p.ptToLl = function(pt) { 6571 return this.projHelper.getProjection().fromDivPixelToLatLng(pt); 6572 }; 6573 6574 p.minExtract = function(set, func) { 6575 var bestIndex, bestVal, index, item, l, len1, val; 6576 for (index = l = 0, len1 = set.length; l < len1; index = ++l) { 6577 item = set[index]; 6578 val = func(item); 6579 if ((typeof bestIndex === "undefined" || bestIndex === null) || val < bestVal) { 6580 bestVal = val; 6581 bestIndex = index; 6582 } 6583 } 6584 return set.splice(bestIndex, 1)[0]; 6585 }; 6586 6587 p.arrIndexOf = function(arr, obj) { 6588 var i, l, len1, o; 6589 if (arr.indexOf != null) { 6590 return arr.indexOf(obj); 6591 } 6592 for (i = l = 0, len1 = arr.length; l < len1; i = ++l) { 6593 o = arr[i]; 6594 if (o === obj) { 6595 return i; 6596 } 6597 } 6598 return -1; 6599 }; 6600 6601 _Class.ProjHelper = function(map) { 6602 return this.setMap(map); 6603 }; 6604 6605 _Class.ProjHelper.prototype = new gm.OverlayView(); 6606 6607 _Class.ProjHelper.prototype['draw'] = function() {}; 6608 6609 return _Class; 6610 6611 })(); 6612 6613}).call(this); 6614 6615var $ = jQuery.noConflict(); 6616 6617$(document).foundation(); 6618 6619var $homepageSlider = $('.homepage-slider'); 6620 6621$(document).ready(function () { 6622 if($homepageSlider.length) { 6623 $homepageSlider.slick({ 6624 arrows: true, 6625 dots: true, 6626 autoplay: true, 6627 autoplaySpeed: 6000, 6628 fade: true 6629 }); 6630 } 6631 6632 // gallery slider 6633 var $gallerySlider = $('.gallery-widget-slider'); 6634 6635 $gallerySlider.on('init', function(slick){ 6636 var $slides = $gallerySlider.find('.slick-slide').not('.slick-cloned'), 6637 slidesNumber = $slides.length; // for some reason it receives 2 active slides 6638 $('.slides-counter').find('.current-slide-number').html('1'); 6639 $('.slides-counter').find('.total-slides').append(' of ' + slidesNumber); 6640 }); 6641 6642 $gallerySlider.on('afterChange', function(slick, currentSlide, nextSlide){ 6643 $('.slides-counter').find('.current-slide-number').html(currentSlide.currentSlide + 1); 6644 }); 6645 6646 if($gallerySlider.length) { 6647 var slickGallerySlider = $gallerySlider.slick({ 6648 arrows: true, 6649 dots: false, 6650 adaptiveHeight: true, 6651 prevArrow: '<button type="button" class="gallery-slider-prev">‹</button>', 6652 nextArrow: '<button type="button" class="gallery-slider-next">›</button>', 6653 appendArrows: $('.gallery-slider-nav'), 6654 }); 6655 } 6656 6657 $('.fancybox').fancybox(); 6658 6659 $.fn.almComplete = function(alm){ 6660 setTimeout(function () { 6661 new Foundation.Equalizer($('#page, #single-post'), { 6662 'data-equalize-on' : 'medium' 6663 }); 6664 }, 300); 6665 }; 6666 6667 /* make the mobile menu parent items links accessible */ 6668 6669 // disable prevent default 6670 $('#mobile-menu .is-accordion-submenu-parent > a').unbind('click'); 6671 6672 $('#mobile-menu .is-accordion-submenu-parent > a .dropdown-arrow').click(function (e) { 6673 e.preventDefault(); 6674 e.stopPropagation(); 6675 6676 $(this).toggleClass('is-opened'); 6677 6678 if($(this).hasClass('is-opened')) { 6679 $(document).trigger('down.zf.accordionMenu'); 6680 } else { 6681 $(document).trigger('up.zf.accordionMenu'); 6682 } 6683 6684 $(this).closest('.is-accordion-submenu-parent').find('.is-accordion-submenu').slideToggle(); 6685 }); 6686 6687 // disable current year on archives page 6688
6689 if($('body').hasClass('archive') && $('body').hasClass('date')) { 6690 var currentArchive = window.location.href, 6691 $archiveList = $('.archive-list'); 6692 6693 $archiveList.find("a[href='" + currentArchive + "']") 6694 .addClass('disabled-link') 6695 .click(function (e) { 6696 e.preventDefault(); 6697 }); 6698 } 6699}); 6700 6701$(window).load(function () { 6702 // make the content and sidebar height equal 6703 setTimeout(function () { 6704 var elem = new Foundation.Equalizer($('#page, #single-post'), { 6705 'data-equalize-on' : 'medium' 6706 }); 6707 }, 0); 6708 6709 $(document).on('change.zf.tabs down.zf.accordion up.zf.accordion down.zf.accordionMenu up.zf.accordionMenu', function () { 6710 new Foundation.Equalizer($('#page, #single-post'), { 6711 'data-equalize-on' : 'medium' 6712 }); 6713 }); 6714}); 6715 6716// tribe events tooltips for the mini calendar 6717 6718var $eventsWidget = $( '.events-widget' ); 6719 6720$eventsWidget.on( 'mouseenter', '.parish-tooltips',function() { 6721 6722 var bottomPad = 0, 6723 $this = $( this ), 6724 $body = $( 'body' ), 6725 $tip; 6726 6727 if ( $body.hasClass( 'events-gridview' ) ) { // Cal View Tooltips 6728 bottomPad = $this.find( 'a' ).outerHeight() + 18; 6729 } 6730 else if ( $body.is( '.single-tribe_events, .events-list, .tribe-events-day' ) ) { // Single/List View Recurring Tooltips 6731 bottomPad = $this.outerHeight() + 12; 6732 } 6733 else if ( $body.is( '.tribe-events-photo' ) ) { // Photo View 6734 bottomPad = $this.outerHeight() + 10; 6735 } 6736 6737 // Widget Tooltips 6738 if ( $this.parents( '.tribe-events-calendar-widget' ).length ) { 6739 bottomPad = $this.outerHeight() - 6; 6740 } 6741 if ( ! $body.hasClass( 'tribe-events-week' ) ) { 6742 $tip = $this.find( '.tribe-events-tooltip' ); 6743 6744 if ( ! $tip.length ) { 6745 var data = $this.data( 'tribejson' ); 6746 6747 if( ! data.hasOwnProperty('eventId') ) { 6748 return; 6749 } 6750 6751 if ( typeof data == 'string' ) { 6752 data = $.parseJSON( data ); 6753 } 6754 6755 $this.append( tribe_tmpl( 'tribe_tmpl_tooltip', data ) ); 6756 6757 // add links to tooltips 6758 6759 if( data.hasOwnProperty('permalink') ) { 6760 var $title = $(this).find('.entry-title'), 6761 titleText = $title.text(), 6762 link = data.permalink; 6763 6764 $title.html('<a href="' + link + '">' + titleText + '</a>'); 6765 } 6766 6767 $tip = $this.find( '.tribe-events-tooltip' ); 6768 6769 $tip.css( 'bottom', bottomPad ).show(); 6770 } 6771 else { 6772 $tip.css( 'bottom', bottomPad ).show(); 6773 } 6774 } 6775 6776} ).on( 'mouseleave', '.parish-tooltips', function() { 6777 $( this ).find( '.tribe-events-tooltip' ).stop( true, false ).fadeOut( 200 ); 6778} ); 6779 6780//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvdW5kYXRpb24ubWluLmpzIiwibW90aW9uLXVpLmpzIiwid2hhdC1pbnB1dC5qcyIsInNsaWNrLm1pbi5qcyIsImpxdWVyeS5mYW5jeWJveC5qcyIsIm9tcy5qcyIsImFwcC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD
6780QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB
6780QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoZ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJmb3VuZGF0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lm
6780KCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0hZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZSh0KXtpZih2b2lkIDA9PT1GdW5jdGlvbi5wcm90b3R5cGUubmFtZSl7dmFyIGU9L2Z1bmN0aW9uXFxzKFteKF17MSx9KVxcKC8saT1lLmV4ZWModC50b1N0cmluZygpKTtyZXR1cm4gaSYmaS5sZW5ndGg+MT9pWzFdLnRyaW0oKTpcIlwifXJldHVybiB2b2lkIDA9PT10LnByb3RvdHlwZT90LmNvbnN0cnVjdG9yLm5hbWU6dC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZX1mdW5jdGlvbiBpKHQpe3JldHVybi90cnVlLy50ZXN0KHQpPyEwOi9mYWxzZS8udGVzdCh0KT8hMTppc05hTigxKnQpP3Q6cGFyc2VGbG9hdCh0KX1mdW5jdGlvbiBuKHQpe3JldHVybiB0LnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csXCIkMS0kMlwiKS50b0xvd2VyQ2FzZSgpfXZhciBzPVwiNi4yLjFcIixvPXt2ZXJzaW9uOnMsX3BsdWdpbnM6e30sX3V1aWRzOltdLHJ0bDpmdW5jdGlvbigpe3JldHVyblwicnRsXCI9PT10KFwiaHRtbFwiKS5hdHRyKFwiZGlyXCIpfSxwbHVnaW46ZnVuY3Rpb24odCxpKXt2YXIgcz1pfHxlKHQpLG89bihzKTt0aGlzLl9wbHVnaW5zW29dPXRoaXNbc109dH0scmVnaXN0ZXJQbHVnaW46ZnVuY3Rpb24odCxpKXt2YXIgcz1pP24oaSk6ZSh0LmNvbnN0cnVjdG9yKS50b0xvd2VyQ2FzZSgpO3QudXVpZD10aGlzLkdldFlvRGlnaXRzKDYscyksdC4kZWxlbWVudC5hdHRyKFwiZGF0YS1cIitzKXx8dC4kZWxlbWVudC5hdHRyKFwiZGF0YS1cIitzLHQudXVpZCksdC4kZWxlbWVudC5kYXRhKFwiemZQbHVnaW5cIil8fHQuJGVsZW1lbnQuZGF0YShcInpmUGx1Z2luXCIsdCksdC4kZWxlbWVudC50cmlnZ2VyKFwiaW5pdC56Zi5cIitzKSx0aGlzLl91dWlkcy5wdXNoKHQudXVpZCl9LHVucmVnaXN0ZXJQbHVnaW46ZnVuY3Rpb24odCl7dmFyIGk9bihlKHQuJGVsZW1lbnQuZGF0YShcInpmUGx1Z2luXCIpLmNvbnN0cnVjdG9yKSk7dGhpcy5fdXVpZHMuc3BsaWNlKHRoaXMuX3V1aWRzLmluZGV4T2YodC51dWlkKSwxKSx0LiRlbGVtZW50LnJlbW92ZUF0dHIoXCJkYXRhLVwiK2kpLnJlbW92ZURhdGEoXCJ6ZlBsdWdpblwiKS50cmlnZ2VyKFwiZGVzdHJveWVkLnpmLlwiK2kpO2Zvcih2YXIgcyBpbiB0KXRbc109bnVsbH0scmVJbml0OmZ1bmN0aW9uKGUpe3ZhciBpPWUgaW5zdGFuY2VvZiB0O3RyeXtpZihpKWUuZWFjaChmdW5jdGlvbigpe3QodGhpcykuZGF0YShcInpmUGx1Z2luXCIpLl9pbml0KCl9KTtlbHNle3ZhciBzPXR5cGVvZiBlLG89dGhpcyxhPXtvYmplY3Q6ZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9bihlKSx0KFwiW2RhdGEtXCIrZStcIl1cIikuZm91bmRhdGlvbihcIl9pbml0XCIpfSl9LHN0cmluZzpmdW5jdGlvbigpe2U9bihlKSx0KFwiW2RhdGEtXCIrZStcIl1cIikuZm91bmRhdGlvbihcIl9pbml0XCIpfSx1bmRlZmluZWQ6ZnVuY3Rpb24oKXt0aGlzLm9iamVjdChPYmplY3Qua2V5cyhvLl9wbHVnaW5zKSl9fTthW3NdKGUpfX1jYXRjaChyKXtjb25zb2xlLmVycm9yKHIpfWZpbmFsbHl7cmV0dXJuIGV9fSxHZXRZb0RpZ2l0czpmdW5jdGlvbih0LGUpe3JldHVybiB0PXR8fDYsTWF0aC5yb3VuZChNYXRoLnBvdygzNix0KzEpLU1hdGgucmFuZG9tKCkqTWF0aC5wb3coMzYsdCkpLnRvU3RyaW5nKDM2KS5zbGljZSgxKSsoZT9cIi1cIitlOlwiXCIpfSxyZWZsb3c6ZnVuY3Rpb24oZSxuKXtcInVuZGVmaW5lZFwiPT10eXBlb2Ygbj9uPU9iamVjdC5rZXlzKHRoaXMuX3BsdWdpbnMpOlwic3RyaW5nXCI9PXR5cGVvZiBuJiYobj1bbl0pO3ZhciBzPXRoaXM7dC5lYWNoKG4sZnVuY3Rpb24obixvKXt2YXIgYT1zLl9wbHVnaW5zW29dLHI9dChlKS5maW5kKFwiW2RhdGEtXCIrbytcIl1cIikuYWRkQmFjayhcIltkYXRhLVwiK28rXCJdXCIpO3IuZWFjaChmdW5jdGlvbigpe3ZhciBlPXQodGhpcyksbj17fTtpZihlLmRhdGEoXCJ6ZlBsdWdpblwiKSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oXCJUcmllZCB0byBpbml0aWFsaXplIFwiK28rXCIgb24gYW4gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGEgRm91bmRhdGlvbiBwbHVnaW4uXCIpO2lmKGUuYXR0cihcImRhdGEtb3B0aW9uc1wiKSl7ZS5hdHRyKFwiZGF0YS1vcHRpb25zXCIpLnNwbGl0KFwiO1wiKS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIHM9dC5zcGxpdChcIjpcIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pO3NbMF0mJihuW3NbMF1dPWkoc1sxXSkpfSl9dHJ5e2UuZGF0YShcInpmUGx1Z2luXCIsbmV3IGEodCh0aGlzKSxuKSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcihzKX1maW5hbGx5e3JldHVybn19KX0pfSxnZXRGbk5hbWU6ZSx0cmFuc2l0aW9uZW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGk9e3RyYW5zaXRpb246XCJ0cmFuc2l0aW9uZW5kXCIsV2Via2l0VHJhbnNpdGlvbjpcIndlYmtpdFRyYW5zaXRpb25FbmRcIixNb3pUcmFuc2l0aW9uOlwidHJhbnNpdGlvbmVuZFwiLE9UcmFuc2l0aW9uOlwib3RyYW5zaXRpb25lbmRcIn0sbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2Zvcih2YXIgcyBpbiBpKVwidW5kZWZpbmVkXCIhPXR5cGVvZiBuLnN0eWxlW3NdJiYoZT1pW3NdKTtyZXR1cm4gZT9lOihlPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnRyaWdnZXJIYW5kbGVyKFwidHJhbnNpdGlvbmVuZFwiLFt0XSl9LDEpLFwidHJhbnNpdGlvbmVuZFwiKX19O28udXRpbD17dGhyb3R0bGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscz1hcmd1bWVudHM7bnVsbD09PWkmJihpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmFwcGx5KG4scyksaT1udWxsfSxlKSl9fX07dmFyIGE9ZnVuY3Rpb24oaSl7dmFyIG49dHlwZW9mIGkscz10KFwibWV0YS5mb3VuZGF0aW9uLW1xXCIpLGE9dChcIi5uby1qc1wiKTtpZihzLmxlbmd0aHx8dCgnPG1ldGEgY2xhc3M9XCJmb3VuZGF0aW9uLW1xXCI+JykuYXBwZW5kVG8oZG9jdW1lbnQuaGVhZCksYS5sZW5ndGgmJmEucmVtb3ZlQ2xhc3MoXCJuby1qc1wiKSxcInVuZGVmaW5lZFwiPT09bilvLk1lZGlhUXVlcnkuX2luaXQoKSxvLnJlZmxvdyh0aGlzKTtlbHNle2lmKFwic3RyaW5nXCIhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoXCJXZSdyZSBzb3JyeSwgXCIrbitcIiBpcyBub3QgYSB2YWxpZCBwYXJhbWV0ZXIuIFlvdSBtdXN0IHVzZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1ldGhvZCB5b3Ugd2lzaCB0byBpbnZva2UuXCIpO3ZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxsPXRoaXMuZGF0YShcInpmUGx1Z2luXCIpO2lmKHZvaWQgMD09PWx8fHZvaWQgMD09PWxbaV0pdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwiV2UncmUgc29ycnksICdcIitpK1wiJyBpcyBub3QgYW4gYXZhaWxhYmxlIG1ldGhvZCBmb3IgXCIrKGw/ZShsKTpcInRoaXMgZWxlbWVudFwiKStcIi5cIik7MT09PXRoaXMubGVuZ3RoP2xbaV0uYXBwbHkobCxyKTp0aGlzLmVhY2goZnVuY3Rpb24oZSxuKXtsW2ldLmFwcGx5KHQobikuZGF0YShcInpmUGx1Z2luXCIpLHIpfSl9cmV0dXJuIHRoaXN9O3dpbmRvdy5Gb3VuZGF0aW9uPW8sdC5mbi5mb3VuZGF0aW9uPWEsZnVuY3Rpb24oKXtEYXRlLm5vdyYmd2luZG93LkRhdGUubm93fHwod2luZG93LkRhdGUubm93PURhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9KTtmb3IodmFyIHQ9W1wid2Via2l0XCIsXCJtb3pcIl0sZT0wO2U8dC5sZW5ndGgmJiF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOysrZSl7dmFyIGk9dFtlXTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPXdpbmRvd1tpK1wiUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdLHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT13aW5kb3dbaStcIkNhbmNlbEFuaW1hdGlvbkZyYW1lXCJdfHx3aW5kb3dbaStcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiXX1pZigvaVAoYWR8aG9uZXxvZCkuKk9TIDYvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpfHwhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8IXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSl7dmFyIG49MDt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKHQpe3ZhciBlPURhdGUubm93KCksaT1NYXRoLm1heChuKzE2LGUpO3JldHVybiBzZXRUaW
67801lb3V0KGZ1bmN0aW9uKCl7dChuPWkpfSxpLWUpfSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9Y2xlYXJUaW1lb3V0fXdpbmRvdy5wZXJmb3JtYW5jZSYmd2luZG93LnBlcmZvcm1hbmNlLm5vd3x8KHdpbmRvdy5wZXJmb3JtYW5jZT17c3RhcnQ6RGF0ZS5ub3coKSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKS10aGlzLnN0YXJ0fX0pfSgpLEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kfHwoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgLSB3aGF0IGlzIHRyeWluZyB0byBiZSBib3VuZCBpcyBub3QgY2FsbGFibGVcIik7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGk9dGhpcyxuPWZ1bmN0aW9uKCl7fSxzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkodGhpcyBpbnN0YW5jZW9mIG4/dGhpczp0LGUuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKX07cmV0dXJuIHRoaXMucHJvdG90eXBlJiYobi5wcm90b3R5cGU9dGhpcy5wcm90b3R5cGUpLHMucHJvdG90eXBlPW5ldyBuLHN9KX0oalF1ZXJ5KSwhZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXt2YXIgZT17fTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgdD9lOih0PXQudHJpbSgpLnNsaWNlKDEsLTEpKT9lPXQuc3BsaXQoXCImXCIpLnJlZHVjZShmdW5jdGlvbih0LGUpe3ZhciBpPWUucmVwbGFjZSgvXFwrL2csXCIgXCIpLnNwbGl0KFwiPVwiKSxuPWlbMF0scz1pWzFdO3JldHVybiBuPWRlY29kZVVSSUNvbXBvbmVudChuKSxzPXZvaWQgMD09PXM/bnVsbDpkZWNvZGVVUklDb21wb25lbnQocyksdC5oYXNPd25Qcm9wZXJ0eShuKT9BcnJheS5pc0FycmF5KHRbbl0pP3Rbbl0ucHVzaChzKTp0W25dPVt0W25dLHNdOnRbbl09cyx0fSx7fSk6ZX12YXIgaT17cXVlcmllczpbXSxjdXJyZW50OlwiXCIsX2luaXQ6ZnVuY3Rpb24oKXt2YXIgaSxuPXRoaXMscz10KFwiLmZvdW5kYXRpb24tbXFcIikuY3NzKFwiZm9udC1mYW1pbHlcIik7aT1lKHMpO2Zvcih2YXIgbyBpbiBpKW4ucXVlcmllcy5wdXNoKHtuYW1lOm8sdmFsdWU6XCJvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogXCIraVtvXStcIilcIn0pO3RoaXMuY3VycmVudD10aGlzLl9nZXRDdXJyZW50U2l6ZSgpLHRoaXMuX3dhdGNoZXIoKX0sYXRMZWFzdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldCh0KTtyZXR1cm4gZT93aW5kb3cubWF0Y2hNZWRpYShlKS5tYXRjaGVzOiExfSxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMucXVlcmllcyl7dmFyIGk9dGhpcy5xdWVyaWVzW2VdO2lmKHQ9PT1pLm5hbWUpcmV0dXJuIGkudmFsdWV9cmV0dXJuIG51bGx9LF9nZXRDdXJyZW50U2l6ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7ZTx0aGlzLnF1ZXJpZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5xdWVyaWVzW2VdO3dpbmRvdy5tYXRjaE1lZGlhKGkudmFsdWUpLm1hdGNoZXMmJih0PWkpfXJldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P3QubmFtZTp0fSxfd2F0Y2hlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dCh3aW5kb3cpLm9uKFwicmVzaXplLnpmLm1lZGlhcXVlcnlcIixmdW5jdGlvbigpe3ZhciBpPWUuX2dldEN1cnJlbnRTaXplKCk7aSE9PWUuY3VycmVudCYmKHQod2luZG93KS50cmlnZ2VyKFwiY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5XCIsW2ksZS5jdXJyZW50XSksZS5jdXJyZW50PWkpfSl9fTtGb3VuZGF0aW9uLk1lZGlhUXVlcnk9aSx3aW5kb3cubWF0Y2hNZWRpYXx8KHdpbmRvdy5tYXRjaE1lZGlhPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9d2luZG93LnN0eWxlTWVkaWF8fHdpbmRvdy5tZWRpYTtpZighdCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIilbMF0sbj1udWxsO2UudHlwZT1cInRleHQvY3NzXCIsZS5pZD1cIm1hdGNobWVkaWFqcy10ZXN0XCIsaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpLG49XCJnZXRDb21wdXRlZFN0eWxlXCJpbiB3aW5kb3cmJndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCl8fGUuY3VycmVudFN0eWxlLHQ9e21hdGNoTWVkaXVtOmZ1bmN0aW9uKHQpe3ZhciBpPVwiQG1lZGlhIFwiK3QrXCJ7ICNtYXRjaG1lZGlhanMtdGVzdCB7IHdpZHRoOiAxcHg7IH0gfVwiO3JldHVybiBlLnN0eWxlU2hlZXQ/ZS5zdHlsZVNoZWV0LmNzc1RleHQ9aTplLnRleHRDb250ZW50PWksXCIxcHhcIj09PW4ud2lkdGh9fX1yZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJue21hdGNoZXM6dC5tYXRjaE1lZGl1bShlfHxcImFsbFwiKSxtZWRpYTplfHxcImFsbFwifX19KCkpLEZvdW5kYXRpb24uTWVkaWFRdWVyeT1pfShqUXVlcnkpLCFmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBlPXt9O2Zvcih2YXIgaSBpbiB0KWVbdFtpXV09dFtpXTtyZXR1cm4gZX12YXIgaT17OTpcIlRBQlwiLDEzOlwiRU5URVJcIiwyNzpcIkVTQ0FQRVwiLDMyOlwiU1BBQ0VcIiwzNzpcIkFSUk9XX0xFRlRcIiwzODpcIkFSUk9XX1VQXCIsMzk6XCJBUlJPV19SSUdIVFwiLDQwOlwiQVJST1dfRE9XTlwifSxuPXt9LHM9e2tleXM6ZShpKSxwYXJzZUtleTpmdW5jdGlvbih0KXt2YXIgZT1pW3Qud2hpY2h8fHQua2V5Q29kZV18fFN0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCkudG9VcHBlckNhc2UoKTtyZXR1cm4gdC5zaGlmdEtleSYmKGU9XCJTSElGVF9cIitlKSx0LmN0cmxLZXkmJihlPVwiQ1RSTF9cIitlKSx0LmFsdEtleSYmKGU9XCJBTFRfXCIrZSksZX0saGFuZGxlS2V5OmZ1bmN0aW9uKGUsaSxzKXt2YXIgbyxhLHIsbD1uW2ldLHU9dGhpcy5wYXJzZUtleShlKTtyZXR1cm4gbD8obz1cInVuZGVmaW5lZFwiPT10eXBlb2YgbC5sdHI/bDpGb3VuZGF0aW9uLnJ0bCgpP3QuZXh0ZW5kKHt9LGwubHRyLGwucnRsKTp0LmV4dGVuZCh7fSxsLnJ0bCxsLmx0ciksYT1vW3VdLHI9c1thXSx2b2lkKHImJlwiZnVuY3Rpb25cIj09dHlwZW9mIHI/KHIuYXBwbHkoKSwocy5
6780oYW5kbGVkfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBzLmhhbmRsZWQpJiZzLmhhbmRsZWQuYXBwbHkoKSk6KHMudW5oYW5kbGVkfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBzLnVuaGFuZGxlZCkmJnMudW5oYW5kbGVkLmFwcGx5KCkpKTpjb25zb2xlLndhcm4oXCJDb21wb25lbnQgbm90IGRlZmluZWQhXCIpfSxmaW5kRm9jdXNhYmxlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmZpbmQoXCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpbnB1dDpub3QoW2Rpc2FibGVkXSksIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lLCBvYmplY3QsIGVtYmVkLCAqW3RhYmluZGV4XSwgKltjb250ZW50ZWRpdGFibGVdXCIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0KHRoaXMpLmlzKFwiOnZpc2libGVcIikmJiEodCh0aGlzKS5hdHRyKFwidGFiaW5kZXhcIik8MCl9KX0scmVnaXN0ZXI6ZnVuY3Rpb24odCxlKXtuW3RdPWV9fTtGb3VuZGF0aW9uLktleWJvYXJkPXN9KGpRdWVyeSksIWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLGkpe2Z1bmN0aW9uIG4ocil7YXx8KGE9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpKSxvPXItYSxpLmFwcGx5KGUpLHQ+bz9zPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobixlKTood2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHMpLGUudHJpZ2dlcihcImZpbmlzaGVkLnpmLmFuaW1hdGVcIixbZV0pLnRyaWdnZXJIYW5kbGVyKFwiZmluaXNoZWQuemYuYW5pbWF0ZVwiLFtlXSkpfXZhciBzLG8sYT1udWxsO3M9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShuKX1mdW5jdGlvbiBpKGUsaSxvLGEpe2Z1bmN0aW9uIHIoKXtlfHxpLmhpZGUoKSxsKCksYSYmYS5hcHBseShpKX1mdW5jdGlvbiBsKCl7aVswXS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249MCxpLnJlbW92ZUNsYXNzKHUrXCIgXCIrZCtcIiBcIitvKX1pZihpPXQoaSkuZXEoMCksaS5sZW5ndGgpe3ZhciB1PWU/blswXTpuWzFdLGQ9ZT9zWzBdOnNbMV07bCgpLGkuYWRkQ2xhc3MobykuY3NzKFwidHJhbnNpdGlvblwiLFwibm9uZVwiKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtpLmFkZENsYXNzKHUpLGUmJmkuc2hvdygpfSkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aVswXS5vZmZzZXRXaWR0aCxpLmNzcyhcInRyYW5zaXRpb25cIixcIlwiKS5hZGRDbGFzcyhkKX0pLGkub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZChpKSxyKX19dmFyIG49W1wibXVpLWVudGVyXCIsXCJtdWktbGVhdmVcIl0scz1bXCJtdWktZW50ZXItYWN0aXZlXCIsXCJtdWktbGVhdmUtYWN0aXZlXCJdLG89e2FuaW1hdGVJbjpmdW5jdGlvbih0LGUsbil7aSghMCx0LGUsbil9LGFuaW1hdGVPdXQ6ZnVuY3Rpb24odCxlLG4pe2koITEsdCxlLG4pfX07Rm91bmRhdGlvbi5Nb3ZlPWUsRm91bmRhdGlvbi5Nb3Rpb249b30oalF1ZXJ5KSwhZnVuY3Rpb24odCl7dmFyIGU9e0ZlYXRoZXI6ZnVuY3Rpb24oZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aDw9MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdP1wiemZcIjphcmd1bWVudHNbMV07ZS5hdHRyKFwicm9sZVwiLFwibWVudWJhclwiKTt2YXIgbj1lLmZpbmQoXCJsaVwiKS5hdHRyKHtyb2xlOlwibWVudWl0ZW1cIn0pLHM9XCJpcy1cIitpK1wiLXN1Ym1lbnVcIixvPXMrXCItaXRlbVwiLGE9XCJpcy1cIitpK1wiLXN1Ym1lbnUtcGFyZW50XCI7ZS5maW5kKFwiYTpmaXJzdFwiKS5hdHRyKFwidGFiaW5kZXhcIiwwKSxuLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLGk9ZS5jaGlsZHJlbihcInVsXCIpO2kubGVuZ3RoJiYoZS5hZGRDbGFzcyhhKS5hdHRyKHtcImFyaWEtaGFzcG9wdXBcIjohMCxcImFyaWEtZXhwYW5kZWRcIjohMSxcImFyaWEtbGFiZWxcIjplLmNoaWxkcmVuKFwiYTpmaXJzdFwiKS50ZXh0KCl9KSxpLmFkZENsYXNzKFwic3VibWVudSBcIitzKS5hdHRyKHtcImRhdGEtc3VibWVudVwiOlwiXCIsXCJhcmlhLWhpZGRlblwiOiEwLHJvbGU6XCJtZW51XCJ9KSksZS5wYXJlbnQoXCJbZGF0YS1zdWJtZW51XVwiKS5sZW5ndGgmJmUuYWRkQ2xhc3MoXCJpcy1zdWJtZW51LWl0ZW0gXCIrbyl9KX0sQnVybjpmdW5jdGlvbih0LGUpe3ZhciBpPSh0LmZpbmQoXCJsaVwiKS5yZW1vdmVBdHRyKFwidGFiaW5kZXhcIiksXCJpcy1cIitlK1wiLXN1Ym1lbnVcIiksbj1pK1wiLWl0ZW1cIixzPVwiaXMtXCIrZStcIi1zdWJtZW51LXBhcmVudFwiO3QuZmluZChcIipcIikucmVtb3ZlQ2xhc3MoaStcIiBcIituK1wiIFwiK3MrXCIgaXMtc3VibWVudS1pdGVtIHN1Ym1lbnUgaXMtYWN0aXZlXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXN1Ym1lbnVcIikuY3NzKFwiZGlzcGxheVwiLFwiXCIpfX07Rm91bmRhdGlvbi5OZXN0PWV9KGpRdWVyeSksIWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4scyl7dmFyIG8sYSxyLGwsdT1pKHQpO2lmKGUpe3ZhciBkPWkoZSk7YT11Lm9mZnNldC50b3ArdS5oZWlnaHQ8PWQuaGVpZ2h0K2Qub2Zmc2V0LnRvcCxvPXUub2Zmc2V0LnRvcD49ZC5vZmZzZXQudG9wLHI9dS5vZmZzZXQubGVmdD49ZC5vZmZzZXQubGVmdCxsPXUub2Zmc2V0LmxlZnQrdS53aWR0aDw9ZC53aWR0aH1lbHNlIGE9dS5vZmZzZXQudG9wK3UuaGVpZ2h0PD11LndpbmRvd0RpbXMuaGVpZ2h0K3Uud2luZG93RGltcy5vZmZzZXQudG9wLG89dS5vZmZzZXQudG9wPj11LndpbmRvd0RpbXMub2Zmc2V0LnRvcCxyPXUub2Zmc2V0LmxlZnQ+PXUud2luZG93RGltcy5vZmZzZXQubGVmdCxsPXUub2Zmc2V0LmxlZnQrdS53aWR0aDw9dS53aW5kb3dEaW1zLndpZHRoO3ZhciBoPVthLG8scixsXTtyZXR1cm4gbj9yPT09bD09ITA6cz9vPT09YT09ITA6LTE9PT1oLmluZGV4T2YoITEpfWZ1bmN0aW9uIGkodCxlKXtpZih0PXQubGVuZ3RoP3RbMF06dCx0PT09d2luZG93fHx0PT09ZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKFwiSSdtIHNvcnJ5LCBEYXZlLiBJJ20gYWZyYWlkIEkgY2FuJ3QgZG8gdGhhdC5cIik7dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXQucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPWRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz13aW5kb3cucGFnZVlPZmZzZXQsYT13aW5kb3cucGFnZVhPZmZzZXQ7cmV0dXJue3dpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0LG9mZnNldDp7dG9wOmkudG9wK28sbGVmdDppLmxlZnQrYX0scGFyZW50RGltczp7d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHQsb2Zmc2V0Ont0b3A6bi50b3ArbyxsZWZ0Om4ubGVmdCthfX0sd2luZG93RGltczp7d2lkdGg6cy53aWR0aCxoZWlnaHQ6cy5oZWlnaHQsb2Zmc2V0Ont0b3A6byxsZWZ0OmF9fX19ZnVuY3Rpb24gbih0LGUsbixzLG8sYSl7dmFyIHI9aSh0KSxsPWU/aShlKTpudWxsO3N3aXRjaC
6780huKXtjYXNlXCJ0b3BcIjpyZXR1cm57bGVmdDpGb3VuZGF0aW9uLnJ0bCgpP2wub2Zmc2V0LmxlZnQtci53aWR0aCtsLndpZHRoOmwub2Zmc2V0LmxlZnQsdG9wOmwub2Zmc2V0LnRvcC0oci5oZWlnaHQrcyl9O2Nhc2VcImxlZnRcIjpyZXR1cm57bGVmdDpsLm9mZnNldC5sZWZ0LShyLndpZHRoK28pLHRvcDpsLm9mZnNldC50b3B9O2Nhc2VcInJpZ2h0XCI6cmV0dXJue2xlZnQ6bC5vZmZzZXQubGVmdCtsLndpZHRoK28sdG9wOmwub2Zmc2V0LnRvcH07Y2FzZVwiY2VudGVyIHRvcFwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQrbC53aWR0aC8yLXIud2lkdGgvMix0b3A6bC5vZmZzZXQudG9wLShyLmhlaWdodCtzKX07Y2FzZVwiY2VudGVyIGJvdHRvbVwiOnJldHVybntsZWZ0OmE/bzpsLm9mZnNldC5sZWZ0K2wud2lkdGgvMi1yLndpZHRoLzIsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodCtzfTtjYXNlXCJjZW50ZXIgbGVmdFwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQtKHIud2lkdGgrbyksdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodC8yLXIuaGVpZ2h0LzJ9O2Nhc2VcImNlbnRlciByaWdodFwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQrbC53aWR0aCtvKzEsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodC8yLXIuaGVpZ2h0LzJ9O2Nhc2VcImNlbnRlclwiOnJldHVybntsZWZ0OnIud2luZG93RGltcy5vZmZzZXQubGVmdCtyLndpbmRvd0RpbXMud2lkdGgvMi1yLndpZHRoLzIsdG9wOnIud2luZG93RGltcy5vZmZzZXQudG9wK3Iud2luZG93RGltcy5oZWlnaHQvMi1yLmhlaWdodC8yfTtjYXNlXCJyZXZlYWxcIjpyZXR1cm57bGVmdDooci53aW5kb3dEaW1zLndpZHRoLXIud2lkdGgpLzIsdG9wOnIud2luZG93RGltcy5vZmZzZXQudG9wK3N9O2Nhc2VcInJldmVhbCBmdWxsXCI6cmV0dXJue2xlZnQ6ci53aW5kb3dEaW1zLm9mZnNldC5sZWZ0LHRvcDpyLndpbmRvd0RpbXMub2Zmc2V0LnRvcH07Y2FzZVwibGVmdCBib3R0b21cIjpyZXR1cm57bGVmdDpsLm9mZnNldC5sZWZ0LShyLndpZHRoK28pLHRvcDpsLm9mZnNldC50b3ArbC5oZWlnaHR9O2Nhc2VcInJpZ2h0IGJvdHRvbVwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQrbC53aWR0aCtvLXIud2lkdGgsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodH07ZGVmYXVsdDpyZXR1cm57bGVmdDpGb3VuZGF0aW9uLnJ0bCgpP2wub2Zmc2V0LmxlZnQtci53aWR0aCtsLndpZHRoOmwub2Zmc2V0LmxlZnQsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodCtzfX19Rm91bmRhdGlvbi5Cb3g9e0ltTm90VG91Y2hpbmdZb3U6ZSxHZXREaW1lbnNpb25zOmksR2V0T2Zmc2V0czpufX0oalF1ZXJ5KSwhZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe28oKSxuKCkscygpLGkoKX1mdW5jdGlvbiBpKGUpe3ZhciBpPXQoXCJbZGF0YS15ZXRpLWJveF1cIiksbj1bXCJkcm9wZG93blwiLFwidG9vbHRpcFwiLFwicmV2ZWFsXCJdO2lmKGUmJihcInN0cmluZ1wiPT10eXBlb2YgZT9uLnB1c2goZSk6XCJvYmplY3RcIj09dHlwZW9mIGUmJlwic3RyaW5nXCI9PXR5cGVvZiBlWzBdP24uY29uY2F0KGUpOmNvbnNvbGUuZXJyb3IoXCJQbHVnaW4gbmFtZXMgbXVzdCBiZSBzdHJpbmdzXCIpKSxpLmxlbmd0aCl7dmFyIHM9bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCJjbG9zZW1lLnpmLlwiK3R9KS5qb2luKFwiIFwiKTt0KHdpbmRvdykub2ZmKHMpLm9uKHMsZnVuY3Rpb24oZSxpKXt2YXIgbj1lLm5hbWVzcGFjZS5zcGxpdChcIi5cIilbMF0scz10KFwiW2RhdGEtXCIrbitcIl1cIikubm90KCdbZGF0YS15ZXRpLWJveD1cIicraSsnXCJdJyk7cy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTtlLnRyaWdnZXJIYW5kbGVyKFwiY2xvc2UuemYudHJpZ2dlclwiLFtlXSl9KX0pfX1mdW5jdGlvbiBuKGUpe3ZhciBpPXZvaWQgMCxuPXQoXCJbZGF0YS1yZXNpemVdXCIpO24ubGVuZ3RoJiZ0KHdpbmRvdykub2ZmKFwicmVzaXplLnpmLnRyaWdnZXJcIikub24oXCJyZXNpemUuemYudHJpZ2dlclwiLGZ1bmN0aW9uKHMpe2kmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthfHxuLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLnRyaWdnZXJIYW5kbGVyKFwicmVzaXplbWUuemYudHJpZ2dlclwiKX0pLG4uYXR0cihcImRhdGEtZXZlbnRzXCIsXCJyZXNpemVcIil9LGV8fDEwKX0pfWZ1bmN0aW9uIHMoZSl7dmFyIGk9dm9pZCAwLG49dChcIltkYXRhLXNjcm9sbF1cIik7bi5sZW5ndGgmJnQod2luZG93KS5vZmYoXCJzY3JvbGwuemYudHJpZ2dlclwiKS5vbihcInNjcm9sbC56Zi50cmlnZ2VyXCIsZnVuY3Rpb24ocyl7aSYmY2xlYXJUaW1lb3V0KGkpLGk9c2V0VGltZW91dChmdW5jdGlvbigpe2F8fG4uZWFjaChmdW5jdGlvbigpe3QodGhpcykudHJpZ2dlckhhbmRsZXIoXCJzY3JvbGxtZS56Zi50cmlnZ2VyXCIpfSksbi5hdHRyKFwiZGF0YS1ldmVudHNcIixcInNjcm9sbFwiKX0sZXx8MTApfSl9ZnVuY3Rpb24gbygpe2lmKCFhKXJldHVybiExO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1yZXNpemVdLCBbZGF0YS1zY3JvbGxdLCBbZGF0YS1tdXRhdGVdXCIpLGk9ZnVuY3Rpb24oZSl7dmFyIGk9dChlWzBdLnRhcmdldCk7c3dpdGNoKGkuYXR0cihcImRhdGEtZXZlbnRzXCIpKXtjYXNlXCJyZXNpemVcIjppLnRyaWdnZXJIYW5kbGVyKFwicmVzaXplbWUuemYudHJpZ2dlclwiLFtpXSk7YnJlYWs7Y2FzZVwic2Nyb2xsXCI6aS50cmlnZ2VySGFuZGxlcihcInNjcm9sbG1lLnpmLnRyaWdnZXJcIixbaSx3aW5kb3cucGFnZVlPZmZzZXRdKTticmVhaztkZWZhdWx0OnJldHVybiExfX07aWYoZS5sZW5ndGgpZm9yKHZhciBuPTA7bjw9ZS5sZW5ndGgtMTtuKyspe3ZhciBzPW5ldyBhKGkpO3Mub2JzZXJ2ZShlW25dLHthdHRyaWJ1dGVzOiEwLGNoaWxkTGlzdDohMSxjaGFyYWN0ZXJEYXRhOiExLHN1YnRyZWU6ITEsYXR0cmlidXRlRmlsdGVyOltcImRhdGEtZXZlbnRzXCJdfSl9fXZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtcIldlYktpdFwiLFwiTW96XCIsXCJPXCIsXCJNc1wiLFwiXCJdLGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdK1wiTXV0YXRpb25PYnNlcnZlclwiaW4gd2luZG93KXJldHVybi
6780B3aW5kb3dbdFtlXStcIk11dGF0aW9uT2JzZXJ2ZXJcIl07cmV0dXJuITF9KCkscj1mdW5jdGlvbihlLGkpe2UuZGF0YShpKS5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihuKXt0KFwiI1wiK24pW1wiY2xvc2VcIj09PWk/XCJ0cmlnZ2VyXCI6XCJ0cmlnZ2VySGFuZGxlclwiXShpK1wiLnpmLnRyaWdnZXJcIixbZV0pfSl9O3QoZG9jdW1lbnQpLm9uKFwiY2xpY2suemYudHJpZ2dlclwiLFwiW2RhdGEtb3Blbl1cIixmdW5jdGlvbigpe3IodCh0aGlzKSxcIm9wZW5cIil9KSx0KGRvY3VtZW50KS5vbihcImNsaWNrLnpmLnRyaWdnZXJcIixcIltkYXRhLWNsb3NlXVwiLGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKS5kYXRhKFwiY2xvc2VcIik7ZT9yKHQodGhpcyksXCJjbG9zZVwiKTp0KHRoaXMpLnRyaWdnZXIoXCJjbG9zZS56Zi50cmlnZ2VyXCIpfSksdChkb2N1bWVudCkub24oXCJjbGljay56Zi50cmlnZ2VyXCIsXCJbZGF0YS10b2dnbGVdXCIsZnVuY3Rpb24oKXtyKHQodGhpcyksXCJ0b2dnbGVcIil9KSx0KGRvY3VtZW50KS5vbihcImNsb3NlLnpmLnRyaWdnZXJcIixcIltkYXRhLWNsb3NhYmxlXVwiLGZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGk9dCh0aGlzKS5kYXRhKFwiY2xvc2FibGVcIik7XCJcIiE9PWk/Rm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZU91dCh0KHRoaXMpLGksZnVuY3Rpb24oKXt0KHRoaXMpLnRyaWdnZXIoXCJjbG9zZWQuemZcIil9KTp0KHRoaXMpLmZhZGVPdXQoKS50cmlnZ2VyKFwiY2xvc2VkLnpmXCIpfSksdChkb2N1bWVudCkub24oXCJmb2N1cy56Zi50cmlnZ2VyIGJsdXIuemYudHJpZ2dlclwiLFwiW2RhdGEtdG9nZ2xlLWZvY3VzXVwiLGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKS5kYXRhKFwidG9nZ2xlLWZvY3VzXCIpO3QoXCIjXCIrZSkudHJpZ2dlckhhbmRsZXIoXCJ0b2dnbGUuemYudHJpZ2dlclwiLFt0KHRoaXMpXSl9KSx0K
6780HdpbmRvdykubG9hZChmdW5jdGlvbigpe2UoKX0pLEZvdW5kYXRpb24uSUhlYXJZb3U9ZX0oalF1ZXJ5KSwhZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsaSl7dmFyIG4scyxvPXRoaXMsYT1lLmR1cmF0aW9uLHI9T2JqZWN0LmtleXModC5kYXRhKCkpWzBdfHxcInRpbWVyXCIsbD0tMTt0aGlzLmlzUGF1c2VkPSExLHRoaXMucmVzdGFydD1mdW5jdGlvbigpe2w9LTEsY2xlYXJUaW1lb3V0KHMpLHRoaXMuc3RhcnQoKX0sdGhpcy5zdGFydD1mdW5jdGlvbigpe3RoaXMuaXNQYXVzZWQ9ITEsY2xlYXJUaW1lb3V0KHMpLGw9MD49bD9hOmwsdC5kYXRhKFwicGF1c2VkXCIsITEpLG49RGF0ZS5ub3coKSxzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmluZmluaXRlJiZvLnJlc3RhcnQoKSxpKCl9LGwpLHQudHJpZ2dlcihcInRpbWVyc3RhcnQuemYuXCIrcil9LHRoaXMucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmlzUGF1c2VkPSEwLGNsZWFyVGltZW91dChzKSx0LmRhdGEoXCJwYXVzZWRcIiwhMCk7dmFyIGU9RGF0ZS5ub3coKTtsLT1lLW4sdC50cmlnZ2VyKFwidGltZXJwYXVzZWQuemYuXCIrcil9fWZ1bmN0aW9uIGkoZSxpKXtmdW5jdGlvbiBuKCl7cy0tLDA9PT1zJiZpKCl9dmFyIHM9ZS5sZW5ndGg7MD09PXMmJmkoKSxlLmVhY2goZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlP24oKTpcInVuZGVmaW5lZFwiIT10eXBlb2YgdGhpcy5uYXR1cmFsV2lkdGgmJnRoaXMubmF0dXJhbFdpZHRoPjA/bigpOnQodGhpcykub25lKFwibG9hZFwiLGZ1bmN0aW9uKCl7bigpfSl9KX1Gb3VuZGF0aW9uLlRpbWVyPWUsRm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZD1pfShqUXVlcnkpLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixpKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLGUpLHU9ITF9ZnVuY3Rpb24gaShpKXtpZih0LnNwb3RTd2lwZS5wcmV2ZW50RGVmYXVsdCYmaS5wcmV2ZW50RGVmYXVsdCgpLHUpe3ZhciBuLHM9aS50b3VjaGVzWzBdLnBhZ2VYLGE9KGkudG91Y2hlc1swXS5wYWdlWSxvLXMpO2w9KG5ldyBEYXRlKS5nZXRUaW1lKCktcixNYXRoLmFicyhhKT49dC5zcG90U3dpcGUubW92ZVRocmVzaG9sZCYmbDw9dC5zcG90U3dpcGUudGltZVRocmVzaG9sZCYmKG49YT4wP1wibGVmdFwiOlwicmlnaHRcIiksbiYmKGkucHJldmVudERlZmF1bHQoKSxlLmNhbGwodGhpcyksdCh0aGlzKS50cmlnZ2VyKFwic3dpcGVcIixuKS50cmlnZ2VyKFwic3dpcGVcIituKSl9fWZ1bmN0aW9uIG4odCl7MT09dC50b3VjaGVzLmxlbmd0aCYmKG89dC50b3VjaGVzWzBdLnBhZ2VYLGE9dC50b3VjaGVzWzBdLnBhZ2VZLHU9ITAscj0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixpLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLGUsITEpKX1mdW5jdGlvbiBzKCl7dGhpcy5hZGRFdmVudExpc3RlbmVyJiZ0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsbiwhMSl9dC5zcG90U3dpcGU9e3ZlcnNpb246XCIxLjAuMFwiLGVuYWJsZWQ6XCJvbnRvdWNoc3RhcnRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxwcmV2ZW50RGVmYXVsdDohMSxtb3ZlVGhyZXNob2xkOjc1LHRpbWVUaHJlc2hvbGQ6MjAwfTt2YXIgbyxhLHIsbCx1PSExO3QuZXZlbnQuc3BlY2lhbC5zd2lwZT17c2V0dXA6c30sdC5lYWNoKFtcImxlZnRcIixcInVwXCIsXCJkb3duXCIsXCJyaWdodFwiXSxmdW5jdGlvbigpe3QuZXZlbnQuc3BlY2lhbFtcInN3aXBlXCIrdGhpc109e3NldHVwOmZ1bmN0aW9uKCl7dCh0aGlzKS5vbihcInN3aXBlXCIsdC5ub29wKX19fSl9KGpRdWVyeSksIWZ1bmN0aW9uKHQpe3QuZm4uYWRkVG91Y2g9ZnVuY3Rpb24oKXt0aGlzLmVhY2goZnVuY3Rpb24oaSxuKXt0KG4pLmJpbmQoXCJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbFwiLGZ1bmN0aW9uKCl7ZShldmVudCl9KX0pO3ZhciBlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dC5jaGFuZ2VkVG91Y2hlcyxuPWlbMF0scz17dG91Y2hzdGFydDpcIm1vdXNlZG93blwiLHRvdWNobW92ZTpcIm1vdXNlbW92ZVwiLHRvdWNoZW5kOlwibW91c2V1cFwifSxvPXNbdC50eXBlXTtcIk1vdXNlRXZlbnRcImluIHdpbmRvdyYmXCJmdW5jdGlvblwiPT10eXBlb2Ygd2luZG93Lk1vdXNlRXZlbnQ/ZT13aW5kb3cuTW91c2VFdmVudChvLHtidWJibGVzOiEwLGNhbmNlbGFibG
6780U6ITAsc2NyZWVuWDpuLnNjcmVlblgsc2NyZWVuWTpuLnNjcmVlblksY2xpZW50WDpuLmNsaWVudFgsY2xpZW50WTpuLmNsaWVudFl9KTooZT1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRcIiksZS5pbml0TW91c2VFdmVudChvLCEwLCEwLHdpbmRvdywxLG4uc2NyZWVuWCxuLnNjcmVlblksbi5jbGllbnRYLG4uY2xpZW50WSwhMSwhMSwhMSwhMSwwLG51bGwpKSxuLnRhcmdldC5kaXNwYXRjaEV2ZW50KGUpfX19KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aDw9MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdP3t9OmFyZ3VtZW50c1sxXTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsdGhpcy4kZWxlbWVudC5kYXRhKCksbiksdGhpcy5faW5pdCgpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIkFiaWRlXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRpbnB1dHM9dGhpcy4kZWxlbWVudC5maW5kKFwiaW5wdXQsIHRleHRhcmVhLCBzZWxlY3RcIikubm90KFwiW2RhdGEtYWJpZGUtaWdub3JlXVwiKSx0aGlzLl9ldmVudHMoKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJGVsZW1lbnQub2ZmKFwiLmFiaWRlXCIpLm9uKFwicmVzZXQuemYuYWJpZGVcIixmdW5jdGlvbigpe2UucmVzZXRGb3JtKCl9KS5vbihcInN1Ym1pdC56Zi5hYmlkZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGUudmFsaWRhdGVGb3JtKCl9KSxcImZpZWxkQ2hhbmdlXCI9PT10aGlzLm9wdGlvbnMudmFsaWRhdGVPbiYmdGhpcy4kaW5wdXRzLm9mZihcImNoYW5nZS56Zi5hYmlkZVwiKS5vbihcImNoYW5nZS56Zi5hYmlkZVwiLGZ1bmN0aW9uKGkpe2UudmFsaWRhdGVJbnB1dCh0KGkudGFyZ2V0KSl9KSx0aGlzLm9wdGlvbnMubGl2ZVZhbGlkYXRlJiZ0aGlzLiRpbnB1dHMub2ZmKFwiaW5wdXQuemYuYWJpZGVcIikub24oXCJpbnB1dC56Zi5hYmlkZVwiLGZ1bmN0aW9uKGkpe2UudmFsaWRhdGVJbnB1dCh0KGkudGFyZ2V0KSl9KX19LHtrZXk6XCJfcmVmbG93XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9pbml0KCl9fSx7a2V5OlwicmVxdWlyZWRDaGVja1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0LmF0dHIoXCJyZXF1aXJlZFwiKSlyZXR1cm4hMDt2YXIgZT0hMDtzd2l0Y2godFswXS50eXBlKXtjYXNlXCJzZWxlY3RcIjpjYXNlXCJzZWxlY3Qtb25lXCI6Y2FzZVwic2VsZWN0LW11bHRpcGxlXCI6dmFyIGk9dC5maW5kKFwib3B0aW9uOnNlbGVjdGVkXCIpO2kubGVuZ3RoJiZpLnZhbCgpfHwoZT0hMSk7YnJlYWs7ZGVmYXVsdDp0LnZhbCgpJiZ0LnZhbCgpLmxlbmd0aHx8KGU9ITEpfXJldHVybiBlfX0se2tleTpcImZpbmRGb3JtRXJyb3JcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNpYmxpbmdzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JTZWxlY3Rvcik7cmV0dXJuIGUubGVuZ3RofHwoZT10LnBhcmVudCgpLmZpbmQodGhpcy5vcHRpb25zLmZvcm1FcnJvclNlbGVjdG9yKSksZX19LHtrZXk6XCJmaW5kTGFiZWxcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10WzBdLmlkLGk9dGhpcy4kZWxlbWVudC5maW5kKCdsYWJlbFtmb3I9XCInK2UrJ1wiXScpO3JldHVybiBpLmxlbmd0aD9pOnQuY2xvc2VzdChcImxhYmVsXCIpfX0se2tleTpcImZpbmRSYWRpb0xhYmVsc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMsbj1lLm1hcChmdW5jdGlvbihlLG4pe3ZhciBzPW4uaWQsbz1pLiRlbGVtZW50LmZpbmQoJ2xhYmVsW2Zvcj1cIicrcysnXCJdJyk7cmV0dXJuIG8ubGVuZ3RofHwobz10KG4pLmNsb3Nlc3QoXCJsYWJlbFwiKSksb1swXX0pO3JldHVybiB0KG4pfX0se2tleTpcImFkZEVycm9yQ2xhc3Nlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZmluZExhYmVsKHQpLGk9dGhpcy5maW5kRm9ybUVycm9yKHQpO2UubGVuZ3RoJiZlLmFkZENsYXNzKHRoaXMub3B0aW9ucy5sYWJlbEVycm9yQ2xhc3MpLGkubGVuZ3RoJiZpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JDbGFzcyksdC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaW5wdXRFcnJvckNsYXNzKS5hdHRyKFwiZGF0YS1pbnZhbGlkXCIsXCJcIil9fSx7a2V5OlwicmVtb3ZlUmFkaW9FcnJvckNsYXNzZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLiRlbGVtZW50LmZpbmQoJzpyYWRpb1tuYW1lPVwiJyt0KydcIl0nKSxpPXRoaXMuZmluZFJhZGlvTGFiZWxzKGUpLG49dGhpcy5maW5kRm9ybUVycm9yKGUpO2kubGVuZ3RoJiZpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sYWJlbEVycm9yQ2xhc3MpLG4ubGVuZ3RoJiZuLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JDbGFzcyksZS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaW5wdXRFcnJvckNsYXNzKS5yZW1vdmVBdHRyKFwiZGF0YS1pbnZhbGlkXCIpfX0se2tleTpcInJlbW92ZUVycm9yQ2xhc3Nlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKFwicmFkaW9cIj09dFswXS50eXBlKXJldHVybi
6780B0aGlzLnJlbW92ZVJhZGlvRXJyb3JDbGFzc2VzKHQuYXR0cihcIm5hbWVcIikpO3ZhciBlPXRoaXMuZmluZExhYmVsKHQpLGk9dGhpcy5maW5kRm9ybUVycm9yKHQpO2UubGVuZ3RoJiZlLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sYWJlbEVycm9yQ2xhc3MpLGkubGVuZ3RoJiZpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JDbGFzcyksdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaW5wdXRFcnJvckNsYXNzKS5yZW1vdmVBdHRyKFwiZGF0YS1pbnZhbGlkXCIpfX0se2tleTpcInZhbGlkYXRlSW5wdXRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlcXVpcmVkQ2hlY2sodCksaT0hMSxuPSEwLHM9dC5hdHRyKFwiZGF0YS12YWxpZGF0b3JcIiksbz0hMDtzd2l0Y2godFswXS50eXBlKXtjYXNlXCJyYWRpb1wiOmk9dGhpcy52YWxpZGF0ZVJhZGlvKHQuYXR0cihcIm5hbWVcIikpO2JyZWFrO2Nhc2VcImNoZWNrYm94XCI6aT1lO2JyZWFrO2Nhc2VcInNlbGVjdFwiOmNhc2VcInNlbGVjdC1vbmVcIjpjYXNlXCJzZWxlY3QtbXVsdGlwbGVcIjppPWU7YnJlYWs7ZGVmYXVsdDppPXRoaXMudmFsaWRhdGVUZXh0KHQpfXMmJihuPXRoaXMubWF0Y2hWYWxpZGF0aW9uKHQscyx0LmF0dHIoXCJyZXF1aXJlZFwiKSkpLHQuYXR0cihcImRhdGEtZXF1YWx0b1wiKSYmKG89dGhpcy5vcHRpb25zLnZhbGlkYXRvcnMuZXF1YWxUbyh0KSk7dmFyIGE9LTE9PT1bZSxpLG4sb10uaW5kZXhPZighMSkscj0oYT9cInZhbGlkXCI6XCJpbnZhbGlkXCIpK1wiLnpmLmFiaWRlXCI7cmV0dXJuIHRoaXNbYT9cInJlbW92ZUVycm9yQ2xhc3Nlc1wiOlwiYWRkRXJyb3JDbGFzc2VzXCJdKHQpLHQud
6780HJpZ2dlcihyLFt0XSksYX19LHtrZXk6XCJ2YWxpZGF0ZUZvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPVtdLGk9dGhpczt0aGlzLiRpbnB1dHMuZWFjaChmdW5jdGlvbigpe2UucHVzaChpLnZhbGlkYXRlSW5wdXQodCh0aGlzKSkpfSk7dmFyIG49LTE9PT1lLmluZGV4T2YoITEpO3JldHVybiB0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1hYmlkZS1lcnJvcl1cIikuY3NzKFwiZGlzcGxheVwiLG4/XCJub25lXCI6XCJibG9ja1wiKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoKG4/XCJmb3JtdmFsaWRcIjpcImZvcm1pbnZhbGlkXCIpK1wiLnpmLmFiaWRlXCIsW3RoaXMuJGVsZW1lbnRdKSxufX0se2tleTpcInZhbGlkYXRlVGV4dFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7ZT1lfHx0LmF0dHIoXCJwYXR0ZXJuXCIpfHx0LmF0dHIoXCJ0eXBlXCIpO3ZhciBpPXQudmFsKCksbj0hMTtyZXR1cm4gaS5sZW5ndGg/bj10aGlzLm9wdGlvbnMucGF0dGVybnMuaGFzT3duUHJvcGVydHkoZSk/dGhpcy5vcHRpb25zLnBhdHRlcm5zW2VdLnRlc3QoaSk6ZSE9PXQuYXR0cihcInR5cGVcIik/bmV3IFJlZ0V4cChlKS50ZXN0KGkpOiEwOnQucHJvcChcInJlcXVpcmVkXCIpfHwobj0hMCksbn19LHtrZXk6XCJ2YWxpZGF0ZVJhZGlvXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy4kZWxlbWVudC5maW5kKCc6cmFkaW9bbmFtZT1cIicrZSsnXCJdJyksbj0hMTtyZXR1cm4gdm9pZCAwPT09aS5hdHRyKFwicmVxdWlyZWRcIikmJihuPSEwKSxpLmVhY2goZnVuY3Rpb24oZSxpKXt0KGkpLnByb3AoXCJjaGVja2VkXCIpJiYobj0hMCl9KSxufX0se2tleTpcIm1hdGNoVmFsaWRhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzO2k9ISFpO3ZhciBzPWUuc3BsaXQoXCIgXCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbi5vcHRpb25zLnZhbGlkYXRvcnNbZV0odCxpLHQucGFyZW50KCkpfSk7cmV0dXJuLTE9PT1zLmluZGV4T2YoITEpfX0se2tleTpcInJlc2V0Rm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudCxpPXRoaXMub3B0aW9uczt0KFwiLlwiK2kubGFiZWxFcnJvckNsYXNzLGUpLm5vdChcInNtYWxsXCIpLnJlbW92ZUNsYXNzKGkubGFiZWxFcnJvckNsYXNzKSx0KFwiLlwiK2kuaW5wdXRFcnJvckNsYXNzLGUpLm5vdChcInNtYWxsXCIpLnJlbW92ZUNsYXNzKGkuaW5wdXRFcnJvckNsYXNzKSx0KGkuZm9ybUVycm9yU2VsZWN0b3IrXCIuXCIraS5mb3JtRXJyb3JDbGFzcykucmVtb3ZlQ2xhc3MoaS5mb3JtRXJyb3JDbGFzcyksZS5maW5kKFwiW2RhdGEtYWJpZGUtZXJyb3JdXCIpLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIiksdChcIjppbnB1dFwiLGUpLm5vdChcIjpidXR0b24sIDpzdWJtaXQsIDpyZXNldCwgOmhpZGRlbiwgW2RhdGEtYWJpZGUtaWdub3JlXVwiKS52YWwoXCJcIikucmVtb3ZlQXR0cihcImRhdGEtaW52YWxpZFwiKSxlLnRyaWdnZXIoXCJmb3JtcmVzZXQuemYuYWJpZGVcIixbZV0pfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kZWxlbWVudC5vZmYoXCIuYWJpZGVcIikuZmluZChcIltkYXRhLWFiaWRlLWVycm9yXVwiKS5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpLHRoaXMuJGlucHV0cy5vZmYoXCIuYWJpZGVcIikuZWFjaChmdW5jdGlvbigpe2UucmVtb3ZlRXJyb3JDbGFzc2VzKHQodGhpcykpfSksRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e3ZhbGlkYXRlT246XCJmaWVsZENoYW5nZVwiLGxhYmVsRXJyb3JDbGFzczpcImlzLWludmFsaWQtbGFiZWxcIixpbnB1dEVycm9yQ2xhc3M6XCJpcy1pbnZhbGlkLWlucHV0XCIsZm9ybUVycm9yU2VsZWN0b3I6XCIuZm9ybS1lcnJvclwiLGZvcm1FcnJvckNsYXNzOlwiaXMtdmlzaWJsZVwiLGxpdmVWYWxpZGF0ZTohMSxwYXR0ZXJuczp7YWxwaGE6L15bYS16QS1aXSskLyxhbHBoYV9udW1lcmljOi9eW2EtekEtWjAtOV0rJC8saW50ZWdlcjovXlstK10/XFxkKyQvLG51bWJlcjovXlstK10/XFxkKig/OltcXC5cXCxdXFxkKyk/JC8sY2FyZDovXig/OjRbMC05XXsxMn0oPzpbMC05XXszfSk/fDVbMS01XVswLTldezE0fXw2KD86MDExfDVbMC05XVswLTldKVswLTldezEyfXwzWzQ3XVswLTldezEzfXwzKD86MFswLTVdfFs2OF1bMC05XSlbMC05XXsxMX18KD86MjEzMXwxODAwfDM1XFxkezN9KVxcZHsxMX0pJC8sY3Z2Oi9eKFswLTldKXszLDR9JC8sZW1haWw6L15bYS16QS1aMC05LiEjJCUmJyorXFwvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrJC8sdXJsOi9eKGh0dHBzP3xmdHB8ZmlsZXxzc2gpOlxcL1xcLygoKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6KSpAKT8oKChcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSkpfCgoKFthLXpBLVpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16QS1aXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLj8pKDpcXGQqKT8pKFxcLygoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCkrKFxcLygoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKSopKik/KT8oXFw/KCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKXxbXFx1RTAwMC1cXHVGOEZGXXxcXC98XFw/KSopPyhcXCMoKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRU
6780ZdKXwoJVtcXGRhLWZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApfFxcL3xcXD8pKik/JC8sZG9tYWluOi9eKFthLXpBLVowLTldKFthLXpBLVowLTlcXC1dezAsNjF9W2EtekEtWjAtOV0pP1xcLikrW2EtekEtWl17Miw4fSQvLGRhdGV0aW1lOi9eKFswLTJdWzAtOV17M30pXFwtKFswLTFdWzAtOV0pXFwtKFswLTNdWzAtOV0pVChbMC01XVswLTldKVxcOihbMC01XVswLTldKVxcOihbMC01XVswLTldKShafChbXFwtXFwrXShbMC0xXVswLTldKVxcOjAwKSkkLyxkYXRlOi8oPzoxOXwyMClbMC05XXsyfS0oPzooPzowWzEtOV18MVswLTJdKS0oPzowWzEtOV18MVswLTldfDJbMC05XSl8KD86KD8hMDIpKD86MFsxLTldfDFbMC0yXSktKD86MzApKXwoPzooPzowWzEzNTc4XXwxWzAyXSktMzEpKSQvLHRpbWU6L14oMFswLTldfDFbMC05XXwyWzAtM10pKDpbMC01XVswLTldKXsyfSQvLGRhdGVJU086L15cXGR7NH1bXFwvXFwtXVxcZHsxLDJ9W1xcL1xcLV1cXGR7MSwyfSQvLG1vbnRoX2RheV95ZWFyOi9eKDBbMS05XXwxWzAxMl0pWy0gXFwvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSBcXC8uXVxcZHs0fSQvLGRheV9tb250aF95ZWFyOi9eKDBbMS05XXxbMTJdWzAtOV18M1swMV0pWy0gXFwvLl0oMFsxLTldfDFbMDEyXSlbLSBcXC8uXVxcZHs0fSQvLGNvbG9yOi9eIz8oW2EtZkEtRjAtOV17Nn18W2EtZkEtRjAtOV17M30pJC99LHZhbGlkYXRvcnM6e2VxdWFsVG86ZnVuY3Rpb24oZSxpLG4pe3JldHVybiB0KFwiI1wiK2UuYXR0cihcImRhdGEtZXF1YWx0b1wiKSkudmFsKCk9PT1lLnZhbCgpfX19LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJBYmlkZVwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9aSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30sZS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiQWNjb3JkaW9uXCIpLEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoXCJBY2NvcmRpb25cIix7RU5URVI6XCJ0b2dnbGVcIixTUEFDRTpcInRvZ2dsZVwiLEFSUk9XX0RPV046XCJuZXh0XCIsQVJST1dfVVA6XCJwcmV2aW91c1wifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIiksdGhpcy4kdGFicz10aGlzLiRlbGVtZW50LmNoaWxkcmVuKFwibGksIFtkYXRhLWFjY29yZGlvbi1pdGVtXVwiKSx0aGlzLiR0YWJzLmVhY2goZnVuY3Rpb24oZSxpKXt2YXIgbj10KGkpLHM9bi5jaGlsZHJlbihcIltkYXRhLXRhYi1jb250ZW50XVwiKSxvPXNbMF0uaWR8fEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNixcImFjY29yZGlvblwiKSxhPWkuaWR8fG8rXCItbGFiZWxcIjtuLmZpbmQoXCJhOmZpcnN0XCIpLmF0dHIoe1wiYXJpYS1jb250cm9sc1wiOm8scm9sZTpcInRhYlwiLGlkOmEsXCJhcmlhLWV4cGFuZGVkXCI6ITEsXCJhcmlhLXNlbGVjdGVkXCI6ITF9KSxzLmF0dHIoe3JvbGU6XCJ0YWJwYW5lbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCI6YSxcImFyaWEtaGlkZGVuXCI6ITAsaWQ6b30pfSk7dmFyIGU9dGhpcy4kZWxlbWVudC5maW5kKFwiLmlzLWFjdGl2ZVwiKS5jaGlsZHJlbihcIltkYXRhLXRhYi1jb250ZW50XVwiKTtlLmxlbmd0aCYmdGhpcy5kb3duKGUsITApLHRoaXMuX2V2ZW50cygpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kdGFicy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKSxuPWkuY2hpbGRyZW4oXCJbZGF0YS10YWItY29udGVudF1cIik7bi5sZW5ndGgmJmkuY2hpbGRyZW4oXCJhXCIpLm9mZihcImNsaWNrLnpmLmFjY29yZGlvbiBrZXlkb3duLnpmLmFjY29yZGlvblwiKS5vbihcImNsaWNrLnpmLmFjY29yZGlvblwiLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxpLmhhc0NsYXNzKFwiaXMtYWN0aXZlXCIpPyhlLm9wdGlvbnMuYWxsb3dBbGxDbG9zZWR8fGkuc2libGluZ3MoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKSkmJmUudXAobik6ZS5kb3duKG4pfSkub24oXCJrZXlkb3duLnpmLmFjY29yZGlvblwiLGZ1bmN0aW9uKHQpe0ZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KHQsXCJBY2NvcmRpb25cIix7dG9nZ2xlOmZ1bmN0aW9uKCl7ZS50b2dnbGUobil9LG5leHQ6ZnVuY3Rpb24oKXt2YXIgdD1pLm5leHQoKS5maW5kKFwiYVwiKS5mb2N1cygpO2Uub3B0aW9ucy5tdWx0aUV4cGFuZHx8dC50cmlnZ2VyKFwiY2xpY2suemYuYWNjb3JkaW9uXCIpfSxwcmV2aW91czpmdW5jdGlvbigpe3ZhciB0PWkucHJldigpLmZpbmQoXCJhXCIpLmZvY3VzKCk7ZS5vcHRpb25zLm11bHRpRXhwYW5kfHx0LnRyaWdnZXIoXCJjbGljay56Zi5hY2NvcmRpb25cIil9LGhhbmRsZWQ6ZnVuY3Rpb24oKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKX19KX0pfSl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodC5wYXJlbnQoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKSl7aWYoIXRoaXMub3B0aW9ucy5hbGxvd0FsbENsb3NlZCYmIXQucGFyZW50KCkuc2libGluZ3MoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKSlyZXR1cm47dGhpcy51cCh0KX1lbHNlIHRoaXMuZG93bih0KX19LHtrZXk6XCJkb3duXCIsdmFsdWU6ZnVuY3Rpb24oZSxpKXt2YXIgbj10aGlzO2lmKCF0aGlzLm9wdGlvbnMubXVsdGlFeHBhbmQmJiFpKXt2YXIgcz10aGlzLiRlbGVtZW50LmNoaWxkcmVuKFwiLmlzLWFjdGl2ZVwiKS5jaGlsZHJlbihcIltkYXRhLXRhYi1jb250ZW50XVwiKTtzLmxlbmd0aCYmdGhpcy51cChzKX1lLmF0dHIoXCJhcmlhLWhpZGRlblwiLCExKS5wYXJlbnQoXCJbZGF0YS10YWItY29udGVudF1cIikuYWRkQmFjaygpLnBhcmVudCgpLmFkZENsYXNzKFwiaXMtYWN0aXZlXCIpLGUuc2xpZGVEb3duKHRoaXMub3B0aW9ucy5zbGlkZVNwZWVkLGZ1bmN0aW9uKCl7bi4kZWxlbWVudC50cmlnZ2VyKFwiZG93bi56Zi5hY2NvcmRpb25cIixbZV0pfSksdChcIiNcIitlLmF0dHIoXCJhcmlhLWxhYmVsbGVkYnlcIikpLmF0dHIoe1wiYXJpYS1leHBhbmRlZFwiOiEwLFwiYXJpYS1zZWxlY3RlZFwiOiEwfSl9fSx7a2V5OlwidXBcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgaT1lLnBhcmVudCgpLnNpYmxpbmdzKCksbj10aGlzLHM9dGhpcy5vcHRpb25zLm11bHRpRXhwYW5kP2kuaGFzQ2xhc3MoXCJpcy1hY3RpdmVcIik6ZS5wYXJlbnQoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKTsodGhpcy5vcHRpb25zLmFsbG93QWxsQ2xvc2VkfHxzKSYmKGUuc2xpZGVVcChuLm9wdGlvbnMuc2xpZGVTcGVlZCxmdW5jdGlvbigpe24uJGVsZW1lbnQudHJpZ2dlcihcInVwLnpmLmFjY29yZGlvblwiLFtlXSl9KSxlLmF0dHIoXCJhcmlhLWhpZGRlblwiLCEwKS5wYXJlbnQoKS5yZW1vdmVDbGFzcyhcImlzLWFjdGl2ZVwiKSx0KFwiI1wiK2UuYXR0cihcImFyaWEtbGFiZWxsZWRieVwiKSkuYXR0cih7XCJhcmlhLWV4cGFuZGVkXCI6ITEsXCJhcmlhLXNlbGVjdGVkXCI6ITF9KSl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtdGFiLWNvbnRlbn
6780RdXCIpLnNsaWRlVXAoMCkuY3NzKFwiZGlzcGxheVwiLFwiXCIpLHRoaXMuJGVsZW1lbnQuZmluZChcImFcIikub2ZmKFwiLnpmLmFjY29yZGlvblwiKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGV9KCk7ZS5kZWZhdWx0cz17c2xpZGVTcGVlZDoyNTAsbXVsdGlFeHBhbmQ6ITEsYWxsb3dBbGxDbG9zZWQ6ITF9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJBY2NvcmRpb25cIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSxuKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsdGhpcy4kZWxlbWVudC5kYXRhKCksbiksRm91bmRhdGlvbi5OZXN0LkZlYXRoZXIodGhpcy4kZWxlbWVudCxcImFjY29yZGlvblwiKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiQWNjb3JkaW9uTWVudVwiKSxGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKFwiQWNjb3JkaW9uTWVudVwiLHtFTlRFUjpcInRvZ2dsZVwiLFNQQUNFOlwidG9nZ2xlXCIsQVJST1dfUklHSFQ6XCJvcGVuXCIsQVJST1dfVVA6XCJ1cFwiLEFSUk9XX0RPV046XCJkb3duXCIsQVJST1dfTEVGVDpcImNsb3NlXCIsRVNDQVBFOlwiY2xvc2VBbGxcIixUQUI6XCJkb3duXCIsU0hJRlRfVEFCOlwidXBcIn0pfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1zdWJtZW51XVwiKS5ub3QoXCIuaXMtYWN0aXZlXCIpLnNsaWRlVXAoMCksdGhpcy4kZWxlbWVudC5hdHRyKHtyb2xlOlwidGFibGlzdFwiLFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjp0aGlzLm9wdGlvbnMubXVsdGlPcGVufSksdGhpcy4kbWVudUxpbmtzPXRoaXMuJGVsZW1lbnQuZmluZChcIi5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnRcIiksdGhpcy4kbWVudUxpbmtzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10aGlzLmlkfHxGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsXCJhY2MtbWVudS1saW5rXCIpLGk9dCh0aGlzKSxuPWkuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKSxzPW5bMF0uaWR8fEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNixcImFjYy1tZW51XCIpLG89bi5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKTtpLmF0dHIoe1wiYXJpYS1jb250cm9sc1wiOnMsXCJhcmlhLWV4cGFuZGVkXCI6byxyb2xlOlwidGFiXCIsaWQ6ZX0pLG4uYXR0cih7XCJhcmlhLWxhYmVsbGVkYnlcIjplLFwiYXJpYS1oaWRkZW5cIjohbyxyb2xlOlwidGFicGFuZWxcIixpZDpzfSl9KTt2YXIgZT10aGlzLiRlbGVtZW50LmZpbmQoXCIuaXMtYWN0aXZlXCIpO2lmKGUubGVuZ3RoKXt2YXIgaT10aGlzO2UuZWFjaChmdW5jdGlvbigpe2kuZG93bih0KHRoaXMpKX0pfXRoaXMuX2V2ZW50cygpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kZWxlbWVudC5maW5kKFwibGlcIikuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcykuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKTtpLmxlbmd0aCYmdCh0aGlzKS5jaGlsZHJlbihcImFcIikub2ZmKFwiY2xpY2suemYuYWNjb3JkaW9uTWVudVwiKS5vbihcImNsaWNrLnpmLmFjY29yZGlvbk1lbnVcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZS50b2dnbGUoaSl9KX0pLm9uKFwia2V5ZG93bi56Zi5hY2NvcmRpb25tZW51XCIsZnVuY3Rpb24oaSl7dmFyIG4scyxvPXQodGhpcyksYT1vLnBhcmVudChcInVsXCIpLmNoaWxkcmVuKFwibGlcIikscj1vLmNoaWxkcmVuKFwiW2RhdGEtc3VibWVudV1cIik7YS5lYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMpLmlzKG8pPyhuPWEuZXEoTWF0aC5tYXgoMCxlLTEpKS5maW5kKFwiYVwiKS5maXJzdCgpLHM9YS5lcShNYXRoLm1pbihlKzEsYS5sZW5ndGgtMSkpLmZpbmQoXCJhXCIpLmZpcnN0KCksdCh0aGlzKS5jaGlsZHJlbihcIltkYXRhLXN1Ym1lbnVdOnZpc2libGVcIikubGVuZ3RoJiYocz1vLmZpbmQoXCJsaTpmaXJzdC1jaGlsZFwiKS5maW5kKFwiYVwiKS5maXJzdCgpKSx0KHRoaXMpLmlzKFwiOmZpcnN0LWNoaWxkXCIpP249by5wYXJlbnRzKFwibGlcIikuZmlyc3QoKS5maW5kKFwiYVwiKS5maXJzdCgpOm4uY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XTp2aXNpYmxlXCIpLmxlbmd0aCYmKG49bi5maW5kKFwibGk6bGFzdC1jaGlsZFwiKS5maW5kKFwiYVwiKS5maXJzdCgpKSx2b2lkKHQodGhpcykuaXMoXCI6bGFzdC1jaGlsZFwiKSYmKHM9by5wYXJlbnRzKFwibGlcIikuZmlyc3QoKS5uZXh0KFwibGlcIikuZmluZChcImFcIikuZmlyc3QoKSkpKTp2b2lkIDA7XG59KSxGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiQWNjb3JkaW9uTWVudVwiLHtvcGVuOmZ1bmN0aW9uKCl7ci5pcyhcIjpoaWRkZW5cIikmJihlLmRvd24ociksci5maW5kKFwibGlcIikuZmlyc3QoKS5maW5kKFwiYVwiKS5maXJzdCgpLmZvY3VzKCkpfSxjbG9zZTpmdW5jdGlvbigpe3IubGVuZ3RoJiYhci5pcyhcIjpoaWRkZW5cIik/ZS51cChyKTpvLnBhcmVudChcIltkYXRhLXN1Ym1lbnVdXCIpLmxlbmd0aCYmKGUudXAoby5wYXJlbnQoXCJbZGF0YS1zdWJtZW51XVwiKSksby5wYXJlbnRzKFwibGlcIikuZmlyc3QoKS5maW5kKFwiYVwiKS5maXJzdCgpLmZvY3VzKCkpfSx1cDpmdW5jdGlvbigpe24uYXR0cihcInRhYmluZGV4XCIsLTEpLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpfSxkb3duOmZ1bmN0aW9uKCl7cy5hdHRyKFwidGFiaW5kZX
6780hcIiwtMSkuZm9jdXMoKSxpLnByZXZlbnREZWZhdWx0KCl9LHRvZ2dsZTpmdW5jdGlvbigpe28uY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKS5sZW5ndGgmJmUudG9nZ2xlKG8uY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKSl9LGNsb3NlQWxsOmZ1bmN0aW9uKCl7ZS5oaWRlQWxsKCl9LGhhbmRsZWQ6ZnVuY3Rpb24oKXtpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0pfSl9fSx7a2V5OlwiaGlkZUFsbFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtc3VibWVudV1cIikuc2xpZGVVcCh0aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dC5pcyhcIjphbmltYXRlZFwiKXx8KHQuaXMoXCI6aGlkZGVuXCIpP3RoaXMuZG93bih0KTp0aGlzLnVwKHQpKX19LHtrZXk6XCJkb3duXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLm9wdGlvbnMubXVsdGlPcGVufHx0aGlzLnVwKHRoaXMuJGVsZW1lbnQuZmluZChcIi5pcy1hY3RpdmVcIikubm90KHQucGFyZW50c1VudGlsKHRoaXMuJGVsZW1lbnQpLmFkZCh0KSkpLHQuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOiExfSkucGFyZW50KFwiLmlzLWFjY29yZGlvbi1zdWJtZW51LXBhcmVudFwiKS5hdHRyKHtcImFyaWEtZXhwYW5kZWRcIjohMH0pLEZvdW5kYXRpb24uTW92ZSh0aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCx0LGZ1bmN0aW9uKCl7dC5zbGlkZURvd24oZS5vcHRpb25zLnNsaWRlU3BlZWQsZnVuY3Rpb24oKXtlLiRlbGVtZW50LnRyaWdnZXIoXCJkb3duLnpmLmFjY29yZGlvbk1lbnVcIixbdF0pfSl9KX19LHtrZXk6XCJ1cFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7Rm91bmRhdGlvbi5Nb3ZlKHRoaXMub3B0aW9ucy5zbGlkZVNwZWVkLHQsZnVuY3Rpb24oKXt0LnNsaWRlVXAoZS5vcHRpb25zLnNsaWRlU3BlZWQsZnVuY3Rpb24oKXtlLiRlbGVtZW50LnRyaWdnZXIoXCJ1cC56Zi5hY2NvcmRpb25NZW51XCIsW3RdKX0pfSk7dmFyIGk9dC5maW5kKFwiW2RhdGEtc3VibWVudV1cIikuc2xpZGVVcCgwKS5hZGRCYWNrKCkuYXR0cihcImFyaWEtaGlkZGVuXCIsITApO2kucGFyZW50KFwiLmlzLWFjY29yZGlvbi1zdWJtZW51LXBhcmVudFwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCExKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1zdWJtZW51XVwiKS5zbGlkZURvd24oMCkuY3NzKFwiZGlzcGxheVwiLFwiXCIpLHRoaXMuJGVsZW1lbnQuZmluZChcImFcIikub2ZmKFwiY2xpY2suemYuYWNjb3JkaW9uTWVudVwiKSxGb3VuZGF0aW9uLk5lc3QuQnVybih0aGlzLiRlbGVtZW50LFwiYWNjb3JkaW9uXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtzbGlkZVNwZWVkOjI1MCxtdWx0aU9wZW46ITB9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJBY2NvcmRpb25NZW51XCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLEZvdW5kYXRpb24uTmVzdC5GZWF0aGVyKHRoaXMuJGVsZW1lbnQsXCJkcmlsbGRvd25cIiksdGhpcy5faW5pdCgpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIkRyaWxsZG93blwiKSxGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKFwiRHJpbGxkb3duXCIse0VOVEVSOlwib3BlblwiLFNQQUNFOlwib3BlblwiLEFSUk9XX1JJR0hUOlwibmV4dFwiLEFSUk9XX1VQOlwidXBcIixBUlJPV19ET1dOOlwiZG93blwiLEFSUk9XX0xFRlQ6XCJwcmV2aW91c1wiLEVTQ0FQRTpcImNsb3NlXCIsVEFCOlwiZG93blwiLFNISUZUX1RBQjpcInVwXCJ9KX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kc3VibWVudUFuY2hvcnM9dGhpcy4kZWxlbWVudC5maW5kKFwibGkuaXMtZHJpbGxkb3duLXN1Ym1lbnUtcGFyZW50XCIpLmNoaWxkcmVuKFwiYVwiKSx0aGlzLiRzdWJtZW51cz10aGlzLiRzdWJtZW51QW5jaG9ycy5wYXJlbnQoXCJsaVwiKS5jaGlsZHJlbihcIltkYXRhLXN1Ym1lbnVdXCIpLHRoaXMuJG1lbnVJdGVtcz10aGlzLiRlbGVtZW50LmZpbmQoXCJsaVwiKS5ub3QoXCIuanMtZHJpbGxkb3duLWJhY2tcIikuYXR0cihcInJvbGVcIixcIm1lbnVpdGVtXCIpLmZpbmQoXCJhXCIpLHRoaXMuX3ByZXBhcmVNZW51KCksdGhpcy5fa2V5Ym9hcmRFdmVudHMoKX19LHtrZXk6XCJfcHJlcGFyZU1lbnVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kc3VibWVudUFuY2hvcnMuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcyksbj1pLmZpbmQoXCJhOmZpcnN0XCIpO2Uub3B0aW9ucy5wYXJlbnRMaW5rJiZuLmNsb25lKCkucHJlcGVuZFRvKGkuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKSkud3JhcCgnPGxpIGNsYXNzPVwiaXMtc3VibWVudS1wYXJlbnQtaXRlbSBpcy1zdWJtZW51LWl0ZW0gaXMtZHJpbGxkb3duLXN1Ym1lbnUtaXRlbVwiIHJvbGU9XCJtZW51LWl0ZW1cIj48L2xpPicpLG4uZGF0YShcInNhdmVkSHJlZlwiLG4uYXR0cihcImhyZWZcIikpLnJlbW92ZUF0dHIoXCJocmVmXCIpLGkuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6ITAsdGFiaW5kZXg6MCxyb2xlOlwibWVudVwifSksZS5fZXZlbnRzKGkpfSksdGhpcy4kc3VibWVudXMuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcyksbj1pLmZpbmQoXCIuanMtZHJpbGxkb3duLWJhY2tcIik7bi5sZW5ndGh8fGkucHJlcGVuZChlLm9wdGlvbnMuYmFja0J1dHRvbiksZS5fYmFjayhpKX0pLHRoaXMuJGVsZW1lbnQucGFyZW50KCkuaGFzQ2xhc3MoXCJpcy1kcmlsbGRvd25cIil8fCh0aGlzLiR3cmFwcGVyPXQodGhpcy5vcHRpb25zLndyYXBwZXIpLmFkZENsYXNzKFwiaXMtZHJpbGxkb3duXCIpLmNzcyh0aGlzLl9nZXRNYXhEaW1zKCkpLHRoaXMuJGVsZW1lbnQud3JhcCh0aGlzLiR3cmFwcGVyKSl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXM7ZS5vZmYoXCJjbGljay56Zi5kcmlsbGRvd25cIikub24oXCJjbGljay56Zi5kcmlsbGRvd25cIixmdW5jdGlvbihuKXtpZih0KG4udGFyZ2V0KS5wYXJlbnRzVW50aWwoXCJ1bFwiLFwibGlcIikuaGFzQ2xhc3MoXCJpcy1kcmlsbGRvd24tc3VibWVudS1wYXJlbnRcIikmJihuLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLG4ucHJldmVudERlZmF1bHQoKSksaS5fc2hvdyhlLnBhcmVudChcImxpXCIpKSxpLm9wdGlvbnMuY2xvc2VPbkNsaWNrKXt2YXIgcz10KFwiYm9keVwiKS5ub3QoaS4kd3JhcHBlcik7cy5vZmYoXCIuemYuZHJpbGxkb3duXCIpLm9uKFwiY2xpY2suemYuZHJpbGxkb3duXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLGkuX2hpZGVBbGwoKSxzLm9mZihcIi56Zi5kcmlsbGRvd25cIil9KX19KX19LHtrZXk6XCJfa2V5Ym9hcmRFdmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXM7dGhpcy4kbWVudUl0ZW1zLmFkZCh0aGlzLiRlbGVtZW50LmZpbmQoXCIuanMtZHJpbGxkb3duLWJhY2sgPiBhXCIpKS5vbihcImtleWRvd24uemYuZHJpbGxkb3duXCIsZnVuY3Rpb24oaSl7dmFyIG4scyxvPXQodGhpcyksYT1vLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpLmNoaWxkcmVuKFwibGlcIikuY2hpbGRyZW4oXCJhXCIpO2EuZWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdCh0aGlzKS5pcyhvKT8obj1hLmVxKE1hdGgubWF4KDAsZS0xKSksdm9pZChzPWEuZXEoTWF0aC5taW4oZSsxLGEubGVuZ3RoLTEpKSkpOnZvaWQgMH0pLEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGksXCJEcmlsbGRvd25cIix7bmV4dDpmdW5jdGlvbigpe28uaXMoZS4kc3VibWVudUFuY2hvcnMpJiYoZS5fc2hvdyhvLnBhcmVudChcImxpXCIpKSxvLnBhcmVudChcImxpXCIpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQobyksZnVuY3Rpb24oKXtvLnBhcmVudChcImxpXCIpLmZpbmQoXCJ1bCBsaSBhXCIpLmZpbHRlcihlLiRtZW51SXRlbXMpLmZpcnN0KCkuZm9jdXMoKX0pLGkucHJldmVudERlZmF1bHQoKSl9LHByZXZpb3VzOmZ1bmN0aW9uKCl7ZS5faGlkZShvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpKSxvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQobyksZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5wYXJlbnQoXCJsaVwiKS5wYXJlbnQoXCJ1bFwiKS5wYXJlbnQoXCJsaVwiKS5jaGlsZHJlbihcImFcIikuZmlyc3QoKS5mb2N1cygpfSwxKX0pLGkucHJldmVudERlZmF1bHQoKX0sdXA6ZnVuY3Rpb24oKXtuLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpfSxkb3duOmZ1bmN0aW9uKCl7cy5mb2N1cygpLGkucHJldmVudERlZmF1bHQoKX0sY2xvc2U6ZnVuY3Rpb24oKXtlLl9iYWNrKCl9LG9wZW46ZnVuY3Rpb24oKXtvLmlzKGUuJG1lbnVJdGVtcyk/by5pcyhlLiRzdWJtZW51QW5jaG9ycykmJihlLl9zaG93KG8ucGFyZW50KFwibGlcIikpLG8ucGFyZW50KFwibGlcIikub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZChvKSxmdW5jdGlvbigpe28ucGFyZW50KFwibGlcIikuZmluZChcInVsIGxpIGFcIikuZmlsdGVyKGUuJG1lbnVJdGVtcykuZmlyc3QoKS5mb2N1cygpfSksaS5wcmV2ZW50RGVmYXVsdCgpKTooZS5faGlkZShvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpKSxvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQobyksZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5wYXJlbnQoXCJsaVwiKS5wYXJlbnQoXCJ1bFwiKS5wYXJlbnQoXCJsaVwiKS5jaGlsZHJlbihcImFcIikuZmlyc3QoKS5mb2N1cygpfSwxKX0pLGkucHJldmVudERlZmF1bHQoKSl9LGhhbmRsZWQ6ZnVuY3Rpb24oKXtpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0pfSl9fSx7a2V5OlwiX2hpZGVBbGxcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnQuZmluZChcIi5pcy1kcmlsbGRvd24tc3VibWVudS5pcy1hY3RpdmVcIikuYWRkQ2xhc3MoXCJpcy1jbG9zaW5nXCIpO3Qub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCh0KSxmdW5jdGlvbihlKXt0LnJlbW92ZUNsYXNzKFwiaXMtYWN0aXZlIGlzLWNsb3NpbmdcIil9KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJjbG9zZWQuemYuZHJpbGxkb3duXCIpfX0se2tleTpcIl9iYWNrXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0Lm9mZihcImNsaWNrLnpmLmRyaWxsZG93blwiKSx0LmNoaWxkcmVuKFwiLmpzLWRyaWxsZG93bi1iYWNrXCIpLm9uKFwiY2xpY2suemYuZHJpbGxkb3duXCIsZnVuY3Rpb24oaSl7aS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLl9oaWRlKHQpfSl9fSx7a2V5OlwiX21lbnVMaW5rRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJG1lbnVJdGVtcy5ub3QoXCIuaXMtZHJpbGxkb3duLXN1Ym1lbnUtcGFyZW50XCIpLm9mZihcImNsaWNrLnpmLmRyaWxsZG93blwiKS5vbihcImNsaWNrLnpmLmRyaWxsZG93blwiLGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll9oaWRlQWxsKCl9LDApfSl9fSx7a2V5OlwiX3Nob3dcIix2YWx1ZTpmdW5jdGlvbih0KXt0LmNoaWxkcmVuKFwiW2RhdGEtc3VibWVudV1cIikuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIiksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwib3Blbi56Zi5kcmlsbGRvd25cIixbdF0pfX0se2tleTpcIl9oaWRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dC5hZGRDbGFzcyhcImlzLWNsb3NpbmdcIikub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCh0KSxmdW5jdGlvbigpe3QucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmUgaXMtY2xvc2luZ1wiKSx0LmJsdXIoKX0pLHQudHJpZ2dlcihcImhpZGUuemYuZHJpbGxkb3duXCIsW3RdKX19LHtrZXk6XCJfZ2V0TWF4RGltc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9MCxpPXt9O3JldHVybiB0aGlzLiRzdWJtZW51cy5hZGQodGhpcy4kZWxlbWVudCkuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcykuY2hpbGRyZW4oXCJsaVwiKS5sZW5ndGg7ZT1pPmU/aTplfSksaVtcIm1pbi1oZWlnaHRcIl09ZSp0aGlzLiRtZW51SXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0K1wicHhcIixpW1wibWF4LXdpZHRoXCJdPXRoaXMuJGVsZW1lbnRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgrXCJweFwiLGl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGlkZUFsbCgpLEZvdW5kYXRpb24uTmVzdC5CdXJuKHRoaXMuJGVsZW1lbnQsXCJkcmlsbGRvd25cIiksdGhpcy4kZWxlbWVudC51bndyYXAoKS5maW5kKFwiLmpzLWRyaWxsZG93bi1iYWNrLCAuaXMtc3VibWVudS1wYXJlbnQtaXRlbVwiKS5yZW1vdmUoKS5lbmQoKS5maW5kKFwiLmlzLWFjdGl2ZSwgLmlzLWNsb3NpbmcsIC5pcy1kcmlsbGRvd24tc3VibWVudVwiKS5yZW1vdmVDbGFzcyhcImlzLWFjdGl2ZSBpcy1jbG9zaW5nIGlzLWRyaWxsZG93bi1zdWJtZW51XCIpLmVuZCgpLmZpbmQoXCJbZGF0YS1zdWJtZW51XVwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXggcm9sZVwiKS5vZmYoXCIuemYuZHJpbGxkb3duXCIpLmVuZCgpLm9mZihcInpmLmRyaWxsZG93blwiKSx0aGlzLiRlbGVtZW50LmZpbmQoXCJhXCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO2UuZGF0YShcInNhdmVkSHJlZlwiKSYmZS5hdHRyKFwiaHJlZlwiLGUuZGF0YShcInNhdmVkSHJlZlwiKSkucmVtb3ZlRGF0YShcInNhdmVkSHJlZlwiKX0pLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtiYWNrQnV0dG9uOic8bGkgY2xhc3M9XCJqcy1kcmlsbGRvd24tYmFja1wiPjxhIHRhYmluZGV4PVwiMFwiPkJhY2s8L2E+PC9saT4nLHdyYXBwZXI6XCI8ZGl2PjwvZGl2PlwiLHBhcmVudExpbms6ITEsY2xvc2VPbkNsaWNrOiExfSxGb3VuZGF0aW9uLnBsdWdpbihlLFwiRHJpbGxkb3duXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJEcm9wZG93blwiKSxGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKFwiRHJvcGRvd25cIix7RU5URVI6XCJvcGVuXCIsU1BBQ0U6XCJvcGVuXCIsRVNDQVBFOlwiY2xvc2VcIixUQUI6XCJ0YWJfZm9yd2FyZFwiLFNISUZUX1RBQjpcInRhYl9iYWNrd2FyZFwifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXMuJGVsZW1lbnQuYXR0cihcImlkXCIpO3RoaXMuJGFuY2hvcj10KCdbZGF0YS10b2dnbGU9XCInK2UrJ1wiXScpfHx0KCdbZGF0YS1vcGVuPVwiJytlKydcIl0nKSx0aGlzLiRhbmNob3IuYXR0cih7XCJhcmlhLWNvbnRyb2xzXCI6ZSxcImRhdGEtaXMtZm9jdXNcIjohMSxcImRhdGEteWV0aS1ib3hcIjplLFwiYXJpYS1oYXNwb3B1cFwiOiEwLFwiYXJpYS1leHBhbmRlZFwiOiExfSksdGhpcy5vcHRpb25zLnBvc2l0aW9uQ2xhc3M9dGhpcy5nZXRQb3NpdGlvbkNsYXNzKCksdGhpcy5jb3VudGVyPTQsdGhpcy51c2VkUG9zaXRpb25zPVtdLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLFwiZGF0YS15ZXRpLWJveFwiOmUsXCJkYXRhLXJlc2l6ZVwiOmUsXCJhcmlhLWxhYmVsbGVkYnlcIjp0aGlzLiRhbmNob3JbMF0uaWR8fEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNixcImRkLWFuY2hvclwiKX0pLHRoaXMuX2V2ZW50cygpfX0se2tleTpcImdldFBvc2l0aW9uQ2xhc3NcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnRbMF0uY2xhc3NOYW1lLm1hdGNoKC8odG9wfGxlZnR8cmlnaHR8Ym90dG9tKS9nKTt0PXQ/dFswXTpcIlwiO3ZhciBlPS9mbG9hdC0oLispXFxzLy5leGVjKHRoaXMuJGFuY2hvclswXS5jbGFzc05hbWUpO2U9ZT9lWzFdOlwiXCI7dmFyIGk9ZT9lK1wiIFwiK3Q6dDtyZXR1cm4gaX19LHtrZXk6XCJfcmVwb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMudXNlZFBvc2l0aW9ucy5wdXNoKHQ/dDpcImJvdHRvbVwiKSwhdCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJ0b3BcIik8MD90aGlzLiRlbGVtZW50LmFkZENsYXNzKFwidG9wXCIpOlwidG9wXCI9PT10JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImJvdHRvbVwiKTwwP3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModCk6XCJsZWZ0XCI9PT10JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcInJpZ2h0XCIpPDA/dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KS5hZGRDbGFzcyhcInJpZ2h0XCIpOlwicmlnaHRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwibGVmdFwiKTwwP3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModCkuYWRkQ2xhc3MoXCJsZWZ0XCIpOiF0JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcInRvcFwiKT4tMSYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJsZWZ0XCIpPDA/dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcImxlZnRcIik6XCJ0b3BcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPi0xJiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImxlZnRcIik8MD90aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHQpLmFkZENsYXNzKFwibGVmdFwiKTpcImxlZnRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwicmlnaHRcIik+LTEmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPDA/dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KTpcInJpZ2h0XCI9PT10JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImxlZnRcIik+LTEmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPDA/dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KTp0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHQpLHRoaXMuY2xhc3NDaGFuZ2VkPSEwLHRoaXMuY291bnRlci0tfX0se2tleTpcIl9zZXRQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJmYWxzZVwiPT09dGhpcy4kYW5jaG9yLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIpKXJldHVybiExO3ZhciB0PXRoaXMuZ2V0UG9zaXRpb25DbGFzcygpLGU9Rm91bmRhdGlvbi5Cb3guR2V0RGltZW5zaW9ucyh0aGlzLiRlbGVtZW50KSxpPShGb3VuZGF0aW9uLkJveC5HZXREaW1lbnNpb25zKHRoaXMuJGFuY2hvciksXCJsZWZ0XCI9PT10P1wibGVmdFwiOlwicmlnaHRcIj09PXQ/XCJsZWZ0XCI6XCJ0b3BcIiksbj1cInRvcFwiPT09aT9cImhlaWdodFwiOlwid2lkdGhcIjtcImhlaWdodFwiPT09bj90aGlzLm9wdGlvbnMudk9mZnNldDp0aGlzLm9wdGlvbnMuaE9mZnNldDtpZihlLndpZHRoPj1lLndpbmRvd0RpbXMud2lkdGh8fCF0aGlzLmNvdW50ZXImJiFGb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KHRoaXMuJGVsZW1lbnQpKXJldHVybiB0aGlzLiRlbGVtZW50Lm9mZnNldChGb3VuZGF0aW9uLkJveC5HZXRPZmZzZXRzKHRoaXMuJGVsZW1lbnQsdGhpcy4kYW5jaG9yLFwiY2VudGVyIGJvdHRvbVwiLHRoaXMub3B0aW9ucy52T2Zmc2V0LHRoaXMub3B0aW9ucy5oT2Zmc2V0LCEwKSkuY3NzKHt3aWR0aDplLndpbmRvd0RpbXMud2lkdGgtMip0aGlzLm9wdGlvbnMuaE9mZnNldCxoZWlnaHQ6XCJhdXRvXCJ9KSx0aGlzLmNsYXNzQ2hhbmdlZD0hMCwhMTtmb3IodGhpcy4kZWxlbWVudC5vZmZzZXQoRm91bmRhdGlvbi5Cb3guR2V0T2Zmc2V0cyh0aGlzLiRlbGVtZW50LHRoaXMuJGFuY2hvcix0LHRoaXMub3B0aW9ucy52T2Zmc2V0LHRoaXMub3B0aW9ucy5oT2Zmc2V0KSk7IUZvdW5kYXRpb24uQm94LkltTm90VG91Y2hpbmdZb3UodGhpcy4kZWxlbWVudCwhMSwhMCkmJnRoaXMuY291bnRlcjspdGhpcy5fcmVwb3NpdGlvbih0KSx0aGlzLl9zZXRQb3NpdGlvbigpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kZWxlbWVudC5vbih7XCJvcGVuLnpmLnRyaWdnZXJcIjp0aGlzLm9wZW4uYmluZCh0aGlzKSxcImNsb3NlLnpmLnRyaWdnZXJcIjp0aGlzLmNsb3NlLmJpbmQodGhpcyksXCJ0b2dnbGUuemYudHJpZ2dlclwiOnRoaXMudG9nZ2xlLmJpbmQodGhpcyksXCJyZXNpemVtZS56Zi50cmlnZ2VyXCI6dGhpcy5fc2V0UG9zaXRpb24uYmluZCh0aGlzKX0pLHRoaXMub3B0aW9ucy5ob3ZlciYmKHRoaXMuJGFuY2hvci5vZmYoXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duIG1vdXNlbGVhdmUuemYuZHJvcGRvd25cIikub24oXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duXCIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZS50aW1lb3V0KSxlLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2Uub3BlbigpLGUuJGFuY2hvci5kYXRhKFwiaG92ZXJc
6780IiwhMCl9LGUub3B0aW9ucy5ob3ZlckRlbGF5KX0pLm9uKFwibW91c2VsZWF2ZS56Zi5kcm9wZG93blwiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGUudGltZW91dCksZS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsb3NlKCksZS4kYW5jaG9yLmRhdGEoXCJob3ZlclwiLCExKX0sZS5vcHRpb25zLmhvdmVyRGVsYXkpfSksdGhpcy5vcHRpb25zLmhvdmVyUGFuZSYmdGhpcy4kZWxlbWVudC5vZmYoXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duIG1vdXNlbGVhdmUuemYuZHJvcGRvd25cIikub24oXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duXCIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZS50aW1lb3V0KX0pLm9uKFwibW91c2VsZWF2ZS56Zi5kcm9wZG93blwiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGUudGltZW91dCksZS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsb3NlKCksZS4kYW5jaG9yLmRhdGEoXCJob3ZlclwiLCExKX0sZS5vcHRpb25zLmhvdmVyRGVsYXkpfSkpLHRoaXMuJGFuY2hvci5hZGQodGhpcy4kZWxlbWVudCkub24oXCJrZXlkb3duLnpmLmRyb3Bkb3duXCIsZnVuY3Rpb24oaSl7dmFyIG49dCh0aGlzKSxzPUZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZShlLiRlbGVtZW50KTtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiRHJvcGRvd25cIix7dGFiX2ZvcndhcmQ6ZnVuY3Rpb24oKXtlLiRlbGVtZW50LmZpbmQoXCI6Zm9jdXNcIikuaXMocy5lcSgtMSkpJiYoZS5vcHRpb25zLnRyYXBGb2N1cz8ocy5lcSgwKS5mb2N1cygpLGkucHJldmVudERlZmF1bHQoKSk6ZS5jbG9zZSgpKX0sdGFiX2JhY2t3YXJkOmZ1bmN0aW9uKCl7KGUuJGVsZW1lbnQuZmluZChcIjpmb2N1c1wiKS5pcyhzLmVxKDApKXx8ZS4kZWxlbWVudC5pcyhcIjpmb2N1c1wiKSkmJihlLm9wdGlvbnMudHJhcEZvY3VzPyhzLmVxKC0xKS5mb2N1cygpLGkucHJldmVudERlZmF1bHQoKSk6ZS5jbG9zZSgpKX0sb3BlbjpmdW5jdGlvbigpe24uaXMoZS4kYW5jaG9yKSYmKGUub3BlbigpLGUuJGVsZW1lbnQuYXR0cihcInRhYmluZGV4XCIsLTEpLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpKX0sY2xvc2U6ZnVuY3Rpb24oKXtlLmNsb3NlKCksZS4kYW5jaG9yLmZvY3VzKCl9fSl9KX19LHtrZXk6XCJfYWRkQm9keUhhbmRsZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXQoZG9jdW1lbnQuYm9keSkubm90KHRoaXMuJGVsZW1lbnQpLGk9dGhpcztlLm9mZihcImNsaWNrLnpmLmRyb3Bkb3duXCIpLm9uKFwiY2xpY2suemYuZHJvcGRvd25cIixmdW5jdGlvbih0KXtpLiRhbmNob3IuaXModC50YXJnZXQpfHxpLiRhbmNob3IuZmluZCh0LnRhcmdldCkubGVuZ3RofHxpLiRlbGVtZW50LmZpbmQodC50YXJnZXQpLmxlbmd0aHx8KGkuY2xvc2UoKSxlLm9mZihcImNsaWNrLnpmLmRyb3Bkb3duXCIpKX0pfX0se2tleTpcIm9wZW5cIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImNsb3NlbWUuemYuZHJvcGRvd25cIix0aGlzLiRlbGVtZW50LmF0dHIoXCJpZFwiKSksdGhpcy4kYW5jaG9yLmFkZENsYXNzKFwiaG92ZXJcIikuYXR0cih7XCJhcmlhLWV4cGFuZGVkXCI6ITB9KSx0aGlzLl9zZXRQb3NpdGlvbigpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJpcy1vcGVuXCIpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjohMX0pLHRoaXMub3B0aW9ucy5hdXRvRm9jdXMpe3ZhciB0PUZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZSh0aGlzLiRlbGVtZW50KTt0Lmxlbmd0aCYmdC5lcSgwKS5mb2N1cygpfXRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuX2FkZEJvZHlIYW5kbGVyKCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwic2hvdy56Zi5kcm9wZG93blwiLFt0aGlzLiRlbGVtZW50XSl9fSx7a2V5OlwiY2xvc2VcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKSlyZXR1cm4hMTtpZih0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKFwiaXMtb3BlblwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6ITB9KSx0aGlzLiRhbmNob3IucmVtb3ZlQ2xhc3MoXCJob3ZlclwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCExKSx0aGlzLmNsYXNzQ2hhbmdlZCl7dmFyIHQ9dGhpcy5nZXRQb3NpdGlvbkNsYXNzKCk7dCYmdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KSx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5wb3NpdGlvbkNsYXNzKS5jc3Moe2hlaWdodDpcIlwiLHdpZHRoOlwiXCJ9KSx0aGlzLmNsYXNzQ2hhbmdlZD0hMSx0aGlzLmNvdW50ZXI9NCx0aGlzLnVzZWRQb3NpdGlvbnMubGVuZ3RoPTB9dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwiaGlkZS56Zi5kcm9wZG93blwiLFt0aGlzLiRlbGVtZW50XSl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKSl7aWYodGhpcy4kYW5jaG9yLmRhdGEoXCJob3ZlclwiKSlyZXR1cm47dGhpcy5jbG9zZSgpfWVsc2UgdGhpcy5vcGVuKCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5vZmYoXCIuemYudHJpZ2dlclwiKS5oaWRlKCksdGhpcy4kYW5jaG9yLm9mZihcIi56Zi5kcm9wZG93blwiKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGV9KCk7ZS5kZWZhdWx0cz17aG92ZXJEZWxheToyNTAsaG92ZXI6ITEsaG92ZXJQYW5lOiExLHZPZmZzZXQ6MSxoT2Zmc2V0OjEscG9zaXRpb25DbGFzczpcIlwiLHRyYXBGb2N1czohMSxhdXRvRm9jdXM6ITEsY2xvc2VPbkNsaWNrOiExfSxGb3VuZGF0aW9uLnBsdWdpbihlLFwiRHJvcGRvd25cIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybi
6780BmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSxuKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsdGhpcy4kZWxlbWVudC5kYXRhKCksbiksRm91bmRhdGlvbi5OZXN0LkZlYXRoZXIodGhpcy4kZWxlbWVudCxcImRyb3Bkb3duXCIpLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJEcm9wZG93bk1lbnVcIiksRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcihcIkRyb3Bkb3duTWVudVwiLHtFTlRFUjpcIm9wZW5cIixTUEFDRTpcIm9wZW5cIixBUlJPV19SSUdIVDpcIm5leHRcIixBUlJPV19VUDpcInVwXCIsQVJST1dfRE9XTjpcImRvd25cIixBUlJPV19MRUZUOlwicHJldmlvdXNcIixFU0NBUEU6XCJjbG9zZVwifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnQuZmluZChcImxpLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50XCIpO3RoaXMuJGVsZW1lbnQuY2hpbGRyZW4oXCIuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnRcIikuY2hpbGRyZW4oXCIuaXMtZHJvcGRvd24tc3VibWVudVwiKS5hZGRDbGFzcyhcImZpcnN0LXN1YlwiKSx0aGlzLiRtZW51SXRlbXM9dGhpcy4kZWxlbWVudC5maW5kKCdbcm9sZT1cIm1lbnVpdGVtXCJdJyksdGhpcy4kdGFicz10aGlzLiRlbGVtZW50LmNoaWxkcmVuKCdbcm9sZT1cIm1lbnVpdGVtXCJdJyksdGhpcy4kdGFicy5maW5kKFwidWwuaXMtZHJvcGRvd24tc3VibWVudVwiKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMudmVydGljYWxDbGFzcyksdGhpcy4kZWxlbWVudC5oYXNDbGFzcyh0aGlzLm9wdGlvbnMucmlnaHRDbGFzcyl8fFwicmlnaHRcIj09PXRoaXMub3B0aW9ucy5hbGlnbm1lbnR8fEZvdW5kYXRpb24ucnRsKCl8fHRoaXMuJGVsZW1lbnQucGFyZW50cyhcIi50b3AtYmFyLXJpZ2h0XCIpLmlzKFwiKlwiKT8odGhpcy5vcHRpb25zLmFsaWdubWVudD1cInJpZ2h0XCIsdC5hZGRDbGFzcyhcIm9wZW5zLWxlZnRcIikpOnQuYWRkQ2xhc3MoXCJvcGVucy1yaWdodFwiKSx0aGlzLmNoYW5nZWQ9ITEsdGhpcy5fZXZlbnRzKCl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxpPVwib250b3VjaHN0YXJ0XCJpbiB3aW5kb3d8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cub250b3VjaHN0YXJ0LG49XCJpcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudFwiOyh0aGlzLm9wdGlvbnMuY2xpY2tPcGVufHxpKSYmdGhpcy4kbWVudUl0ZW1zLm9uKFwiY2xpY2suemYuZHJvcGRvd25tZW51IHRvdWNoc3RhcnQuemYuZHJvcGRvd25tZW51XCIsZnVuY3Rpb24ocyl7dmFyIG89dChzLnRhcmdldCkucGFyZW50c1VudGlsKFwidWxcIixcIi5cIituKSxhPW8uaGFzQ2xhc3Mobikscj1cInRydWVcIj09PW8uYXR0cihcImRhdGEtaXMtY2xpY2tcIik7by5jaGlsZHJlbihcIi5pcy1kcm9wZG93bi1zdWJtZW51XCIpO2lmKGEpaWYocil7aWYoIWUub3B0aW9ucy5jbG9zZU9uQ2xpY2t8fCFlLm9wdGlvbnMuY2xpY2tPcGVuJiYhaXx8ZS5vcHRpb25zLmZvcmNlRm9sbG93JiZpKXJldHVybjtzLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHMucHJldmVudERlZmF1bHQoKSxlLl9oaWRlKG8pfWVsc2Ugcy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5fc2hvdyhvLmNoaWxkcmVuKFwiLmlzLWRyb3Bkb3duLXN1Ym1lbnVcIikpLG8uYWRkKG8ucGFyZW50c1VudGlsKGUuJGVsZW1lbnQsXCIuXCIrbikpLmF0dHIoXCJkYXRhLWlzLWNsaWNrXCIsITApfSksdGhpcy5vcHRpb25zLmRpc2FibGVIb3Zlcnx8dGhpcy4kbWVudUl0ZW1zLm9uKFwibW91c2VlbnRlci56Zi5kcm9wZG93bm1lbnVcIixmdW5jdGlvbihpKXtpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3ZhciBzPXQodGhpcyksbz1zLmhhc0NsYXNzKG4pO28mJihjbGVhclRpbWVvdXQoZS5kZWxheSksZS5kZWxheT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fc2hvdyhzLmNoaWxkcmVuKFwiLmlzLWRyb3Bkb3duLXN1Ym1lbnVcIikpfSxlLm9wdGlvbnMuaG92ZXJEZWxheSkpfSkub24oXCJtb3VzZWxlYXZlLnpmLmRyb3Bkb3dubWVudVwiLGZ1bmN0aW9uKGkpe3ZhciBzPXQodGhpcyksbz1zLmhhc0NsYXNzKG4pO2lmKG8mJmUub3B0aW9ucy5hdXRvY2xvc2Upe2lmKFwidHJ1ZVwiPT09cy5hdHRyKFwiZGF0YS1pcy1jbGlja1wiKSYmZS5vcHRpb25zLmNsaWNrT3BlbilyZXR1cm4hMTtjbGVhclRpbWVvdXQoZS5kZWxheSksZS5kZWxheT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5faGlkZShzKX0sZS5vcHRpb25zLmNsb3NpbmdUaW1lKX19KSx0aGlzLiRtZW51SXRlbXMub24oXCJrZXlkb3duLnpmLmRyb3Bkb3dubWVudVwiLGZ1bmN0aW9uKGkpe3ZhciBuLHMsbz10KGkudGFyZ2V0KS5wYXJlbnRzVW50aWwoXCJ1bFwiLCdbcm9sZT1cIm1lbnVpdGVtXCJdJyksYT1lLiR0YWJzLmluZGV4KG8pPi0xLHI9YT9lLiR0YWJzOm8uc2libGluZ3MoXCJsaVwiKS5hZGQobyk7ci5lYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMpLmlzKG8pPyhuPXIuZXEoZS0xKSx2b2lkKHM9ci5lcShlKzEpKSk6dm9pZCAwfSk7dmFyIGw9ZnVuY3Rpb24oKXtvLmlzKFwiOmxhc3QtY2hpbGRcIil8fHMuY2hpbGRyZW4oXCJhOmZpcnN0XCIpLmZvY3VzKCl9LHU9ZnVuY3Rpb24oKXtuLmNoaWxkcmVuKFwiYTpmaXJzdFwiKS5mb2N1cygpfSxkPWZ1bmN0aW9uKCl7dmFyIHQ9by5jaGlsZHJlbihcInVsLmlzLWRyb3Bkb3duLXN1Ym1lbnVcIik7dC5sZW5ndGgmJihlLl9zaG93KHQpLG8uZmluZChcImxpID4gYTpmaXJzdFwiKS5mb2N1cygpKX0saD1mdW5jdGlvbigpe3ZhciB0PW8ucGFyZW50KFwidWxcIikucGFyZW50KFwibGlcIik7dC5jaGlsZHJlbihcImE6Zmlyc3RcIikuZm9jdXMoKSxlLl9oaWRlKHQpfSxjPXtvcGVuOmQsY2xvc2U6ZnVuY3Rpb24oKXtlLl9oaWRlKGUuJGVsZW1lbnQpLGUuJG1lbnVJdGVtcy5maW5kKFwiYTpmaXJzdFwiKS5mb2N1cygpfSxoYW5kbGVkOmZ1bmN0aW9uKCl7aS5wcmV2ZW50RGVmYXVsdCgpLGkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9fTthP2UudmVydGljYWw/XCJ
6780sZWZ0XCI9PT1lLm9wdGlvbnMuYWxpZ25tZW50P3QuZXh0ZW5kKGMse2Rvd246bCx1cDp1LG5leHQ6ZCxwcmV2aW91czpofSk6dC5leHRlbmQoYyx7ZG93bjpsLHVwOnUsbmV4dDpoLHByZXZpb3VzOmR9KTp0LmV4dGVuZChjLHtuZXh0OmwscHJldmlvdXM6dSxkb3duOmQsdXA6aH0pOlwibGVmdFwiPT09ZS5vcHRpb25zLmFsaWdubWVudD90LmV4dGVuZChjLHtuZXh0OmQscHJldmlvdXM6aCxkb3duOmwsdXA6dX0pOnQuZXh0ZW5kKGMse25leHQ6aCxwcmV2aW91czpkLGRvd246bCx1cDp1fSksRm91bmRhdGlvbi5LZXlib2FyZC5oYW5kbGVLZXkoaSxcIkRyb3Bkb3duTWVudVwiLGMpfSl9fSx7a2V5OlwiX2FkZEJvZHlIYW5kbGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10KGRvY3VtZW50LmJvZHkpLGk9dGhpcztlLm9mZihcIm1vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudVwiKS5vbihcIm1vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudVwiLGZ1bmN0aW9uKHQpe3ZhciBuPWkuJGVsZW1lbnQuZmluZCh0LnRhcmdldCk7bi5sZW5ndGh8fChpLl9oaWRlKCksZS5vZmYoXCJtb3VzZXVwLnpmLmRyb3Bkb3dubWVudSB0b3VjaGVuZC56Zi5kcm9wZG93bm1lbnVcIikpfSl9fSx7a2V5OlwiX3Nob3dcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgaT10aGlzLiR0YWJzLmluZGV4KHRoaXMuJHRhYnMuZmlsdGVyKGZ1bmN0aW9uKGksbil7cmV0dXJuIHQobikuZmluZChlKS5sZW5ndGg+MH0pKSxuPWUucGFyZW50KFwibGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnRcIikuc2libGluZ3MoXCJsaS5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudFwiKTt0aGlzLl9oaWRlKG4saSksZS5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJoaWRkZW5cIikuYWRkQ2xhc3MoXCJqcy1kcm9wZG93bi1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOiExfSkucGFyZW50KFwibGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnRcIikuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWV4cGFuZGVkXCI6ITB9KTt2YXIgcz1Gb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KGUsbnVsbCwhMCk7aWYoIXMpe3ZhciBvPVwibGVmdFwiPT09dGhpcy5vcHRpb25zLmFsaWdubWVudD9cIi1yaWdodFwiOlwiLWxlZnRcIixhPWUucGFyZW50KFwiLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50XCIpO2EucmVtb3ZlQ2xhc3MoXCJvcGVuc1wiK28pLmFkZENsYXNzKFwib3BlbnMtXCIrdGhpcy5vcHRpb25zLmFsaWdubWVudCkscz1Gb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KGUsbnVsbCwhMCksc3x8YS5yZW1vdmVDbGFzcyhcIm9wZW5zLVwiK3RoaXMub3B0aW9ucy5hbGlnbm1lbnQpLmFkZENsYXNzKFwib3BlbnMtaW5uZXJcIiksdGhpcy5jaGFuZ2VkPSEwfWUuY3NzKFwidmlzaWJpbGl0eVwiLFwiXCIpLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuX2FkZEJvZHlIYW5kbGVyKCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwic2hvdy56Zi5kcm9wZG93bm1lbnVcIixbZV0pfX0se2tleTpcIl9oaWRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaTtpPXQmJnQubGVuZ3RoP3Q6dm9pZCAwIT09ZT90aGlzLiR0YWJzLm5vdChmdW5jdGlvbih0LGkpe3JldHVybiB0PT09ZX0pOnRoaXMuJGVsZW1lbnQ7dmFyIG49aS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKXx8aS5maW5kKFwiLmlzLWFjdGl2ZVwiKS5sZW5ndGg+MDtpZihuKXtpZihpLmZpbmQoXCJsaS5pcy1hY3RpdmVcIikuYWRkKGkpLmF0dHIoe1wiYXJpYS1leHBhbmRlZFwiOiExLFwiZGF0YS1pcy1jbGlja1wiOiExfSkucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmVcIiksaS5maW5kKFwidWwuanMtZHJvcGRvd24tYWN0aXZlXCIpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjohMH0pLnJlbW92ZUNsYXNzKFwianMtZHJvcGRvd24tYWN0aXZlXCIpLHRoaXMuY2hhbmdlZHx8aS5maW5kKFwib3BlbnMtaW5uZXJcIikubGVuZ3RoKXt2YXIgcz1cImxlZnRcIj09PXRoaXMub3B0aW9ucy5hbGlnbm1lbnQ/XCJyaWdodFwiOlwibGVmdFwiO2kuZmluZChcImxpLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50XCIpLmFkZChpKS5yZW1vdmVDbGFzcyhcIm9wZW5zLWlubmVyIG9wZW5zLVwiK3RoaXMub3B0aW9ucy5hbGlnbm1lbnQpLmFkZENsYXNzKFwib3BlbnMtXCIrcyksdGhpcy5jaGFuZ2VkPSExfXRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImhpZGUuemYuZHJvcGRvd25tZW51XCIsW2ldKX19fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kbWVudUl0ZW1zLm9mZihcIi56Zi5kcm9wZG93bm1lbnVcIikucmVtb3ZlQXR0cihcImRhdGEtaXMtY2xpY2tcIikucmVtb3ZlQ2xhc3MoXCJpcy1yaWdodC1hcnJvdyBpcy1sZWZ0LWFycm93IGlzLWRvd24tYXJyb3cgb3BlbnMtcmlnaHQgb3BlbnMtbGVmdCBvcGVucy1pbm5lclwiKSx0KGRvY3VtZW50LmJvZHkpLm9mZihcIi56Zi5kcm9wZG93bm1lbnVcIiksRm91bmRhdGlvbi5OZXN0LkJ1cm4odGhpcy4kZWxlbWVudCxcImRyb3Bkb3duXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtkaXNhYmxlSG92ZXI6ITEsYXV0b2Nsb3NlOiEwLGhvdmVyRGVsYXk6NTAsY2xpY2tPcGVuOiExLGNsb3NpbmdUaW1lOjUwMCxhbGlnbm1lbnQ6XCJsZWZ0XCIsY2xvc2VPbkNsaWNrOiEwLHZlcnRpY2FsQ2xhc3M6XCJ2ZXJ0aWNhbFwiLHJpZ2h0Q2xhc3M6XCJhbGlnbi1yaWdodFwiLGZvcmNlRm9sbG93OiEwfSxGb3VuZGF0aW9uLnBsdWdpbihlLFwiRHJvcGRvd25NZW51XCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJFcXVhbGl6ZXJcIil9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXMuJGVsZW1lbnQuYXR0cihcImRhdGEtZXF1YWxpemVyXCIpfHxcIlwiLGk9dGhpcy4kZWxlbWVudC5maW5kKCdbZGF0YS1lcXVhbGl6ZXItd2F0Y2g9XCInK2UrJ1wiXScpO3RoaXMuJHdhdGNoZWQ9aS5sZW5ndGg/aTp0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1lcXVhbGl6ZXItd2F0Y2hdXCIpLHRoaXMuJGVsZW1lbnQuYXR0cihcImRhdGEtcmVzaXplXCIsZXx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwiZXFcIikpLHRoaXMuaGFzTmVzdGVkPXRoaXMuJGVsZW1lbnQuZmluZChcIltkYXRhLWVxdWFsaXplcl1cIikubGVuZ3RoPjAsdGhpcy5pc05lc3RlZD10aGlzLiRlbGVtZW50LnBhcmVudHNVbnRpbChkb2N1bWVudC5ib2R5LFwiW2RhdGEtZXF1YWxpemVyXVwiKS5sZW5ndGg+MCx0aGlzLmlzT249ITE7dmFyIG4scz10aGlzLiRlbGVtZW50LmZpbmQoXCJpbWdcIik7dGhpcy5vcHRpb25zLmVxdWFsaXplT24/KG49dGhpcy5fY2hlY2tNUSgpLHQod2luZG93KS5vbihcImNoYW5nZWQuemYubWVkaWFxdWVyeVwiLHRoaXMuX2NoZWNrTVEuYmluZCh0aGlzKSkpOnRoaXMuX2V2ZW50cygpLCh2b2lkIDAhPT1uJiZuPT09ITF8fHZvaWQgMD09PW4pJiYocy5sZW5ndGg/Rm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZChzLHRoaXMuX3JlZmxvdy5iaW5kKHRoaXMpKTp0aGlzLl9yZWZsb3coKSl9fSx7a2V5OlwiX3BhdXNlRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmlzT249ITEsdGhpcy4kZWxlbWVudC5vZmYoXCIuemYuZXF1YWxpemVyIHJlc2l6ZW1lLnpmLnRyaWdnZXJcIil9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9wYXVzZUV2ZW50cygpLHRoaXMuaGFzTmVzdGVkP3RoaXMuJGVsZW1lbnQub24oXCJwb3N0ZXF1YWxpemVkLnpmLmVxdWFsaXplclwiLGZ1bmN0aW9uKGUpe2UudGFyZ2V0IT09dC4kZWxlbWVudFswXSYmdC5fcmVmbG93KCl9KTp0aGlzLiRlbGVtZW50Lm9uKFwicmVzaXplbWUuemYudHJpZ2dlclwiLHRoaXMuX3JlZmxvdy5iaW5kKHRoaXMpKSx0aGlzLmlzT249ITB9fSx7a2V5OlwiX2NoZWNrTVFcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuZXF1YWxpemVPbik7cmV0dXJuIHQ/dGhpcy5pc09uJiYodGhpcy5fcGF1c2VFdmVudHMoKSx0aGlzLiR3YXRjaGVkLmNzcyhcImhlaWdodFwiLFwiYXV0b1wiKSk6dGhpcy5pc09ufHx0aGlzLl9ldmVudHMoKSx0fX0se2tleTpcIl9raWxsc3dpdGNoXCIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OlwiX3JlZmxvd1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMub3B0aW9ucy5lcXVhbGl6ZU9uU3RhY2smJnRoaXMuX2lzU3RhY2tlZCgpPyh0aGlzLiR3YXRjaGVkLmNzcyhcImhlaWdodFwiLFwiYXV0b1wiKSwhMSk6dm9pZCh0aGlzLm9wdGlvbnMuZXF1YWxpemVCeVJvdz90aGlzLmdldEhlaWdodHNCeVJvdyh0aGlzLmFwcGx5SGVpZ2h0QnlSb3cuYmluZCh0aGlzKSk6dGhpcy5nZXRIZWlnaHRzKHRoaXMuYXBwbHlIZWlnaHQuYmluZCh0aGlzKSkpfX0se2tleTpcIl9pc1N0YWNrZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR3YXRjaGVkWzBdLm9mZnNldFRvcCE9PXRoaXMuJHdhdGNoZWRbMV0ub2Zmc2V0VG9wfX0se2tleTpcImdldEhlaWdodHNcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wLG49dGhpcy4kd2F0Y2hlZC5sZW5ndGg7bj5pO2krKyl0aGlzLiR3YXRjaGVkW2ldLnN0eWxlLmhlaWdodD1cImF1dG9cIixlLnB1c2godGhpcy4kd2F0Y2hlZFtpXS5vZmZzZXRIZWlnaHQpO3QoZSl9fSx7a2V5OlwiZ2V0SGVpZ2h0c0J5Um93XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy4kd2F0Y2hlZC5sZW5ndGg/dGhpcy4kd2F0Y2hlZC5maXJzdCgpLm9mZnNldCgpLnRvcDowLG49W10scz0wO25bc109W107Zm9yKHZhciBvPTAsYT10aGlzLiR3YXRjaGVkLmxlbmd0aDthPm87bysrKXt0aGlzLiR3YXRjaGVkW29dLnN0eWxlLmhlaWdodD1cImF1dG9cIjt2YXIgcj10KHRoaXMuJHdhdGNoZWRbb10pLm9mZnNldCgpLnRvcDtyIT1pJiYocysrLG5bc109W10saT1yKSxuW3NdLnB1c2goW3RoaXMuJHdhdGNoZWRbb10sdGhpcy4kd2F0Y2hlZFtvXS5vZmZzZXRIZWlnaHRdKX1mb3IodmFyIGw9MCx1PW4ubGVuZ3RoO3U+bDtsKyspe3ZhciBkPXQobltsXSkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbMV19KS5nZXQoKSxoPU1hdGgubWF4LmFwcGx5KG51bGwsZCk7bltsXS5wdXNoKGgpfWUobil9fSx7a2V5OlwiYXBwbHlIZWlnaHRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLm1heC5hcHBseShudWxsLHQpO3RoaXMuJGVsZW1lbnQudHJpZ2dlcihcInByZWVxdWFsaXplZC56Zi5lcXVhbGl6ZXJcIiksdGhpcy4kd2F0Y2hlZC5jc3MoXCJoZWlnaHRcIixlKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJwb3N0ZXF1YWxpemVkLnpmLmVxdWFsaXplclwiKX19LHtrZXk6XCJhcHBseUhlaWdodEJ5Um93XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwicHJlZXF1YWxpemVkLnpmLmVxdWFsaXplclwiKTtmb3IodmFyIGk9MCxuPWUubGVuZ3RoO24+aTtpKyspe3ZhciBzPWVbaV0ubGVuZ3RoLG89ZVtpXVtzLTFdO2lmKDI+PXMpdChlW2ldWzBdWzBdKS5jc3Moe2hlaWdodDpcImF1dG9cIn0pO2Vsc2V7dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwicHJlZXF1YWxpemVkcm93LnpmLmVxdWFsaXplclwiKTtmb3IodmFyIGE9MCxyPXMtMTtyPmE7YSsrKXQoZVtpXVthXVswXSkuY3NzKHtoZWlnaHQ6b30pO3RoaXMuJGVsZW1lbnQudHJpZ2dlcihcInBvc3RlcXVhbGl6ZWRyb3cuemYuZXF1YWxpemVyXCIpfX10aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJwb3N0ZXF1YWxpemVkLnpmLmVxdWFsaXplclwiKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZUV2ZW50cygpLHRoaXMuJHdhdGNoZWQuY3NzKFwiaGVpZ2h0XCIsXCJhdXRvXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtlcXVhbGl6ZU9uU3RhY2s6ITAsZXF1YWxpemVCeVJvdzohMSxlcXVhbGl6ZU9uOlwiXCJ9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJFcXVhbGl6ZXJcIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybi
6780BmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSxuKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsbiksdGhpcy5ydWxlcz1bXSx0aGlzLmN1cnJlbnRQYXRoPVwiXCIsdGhpcy5faW5pdCgpLHRoaXMuX2V2ZW50cygpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIkludGVyY2hhbmdlXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9hZGRCcmVha3BvaW50cygpLHRoaXMuX2dlbmVyYXRlUnVsZXMoKSx0aGlzLl9yZWZsb3coKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0KHdpbmRvdykub24oXCJyZXNpemUuemYuaW50ZXJjaGFuZ2VcIixGb3VuZGF0aW9uLnV0aWwudGhyb3R0bGUodGhpcy5fcmVmbG93LmJpbmQodGhpcyksNTApKX19LHtrZXk6XCJfcmVmbG93XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtmb3IodmFyIGUgaW4gdGhpcy5ydWxlcyl7dmFyIGk9dGhpcy5ydWxlc1tlXTt3aW5kb3cubWF0Y2hNZWRpYShpLnF1ZXJ5KS5tYXRjaGVzJiYodD1pKX10JiZ0aGlzLnJlcGxhY2UodC5wYXRoKX19LHtrZXk6XCJfYWRkQnJlYWtwb2ludHNcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBGb3VuZGF0aW9uLk1lZGlhUXVlcnkucXVlcmllcyl7dmFyIGk9Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LnF1ZXJpZXNbdF07ZS5TUEVDSUFMX1FVRVJJRVNbaS5uYW1lXT1pLnZhbHVlfX19LHtrZXk6XCJfZ2VuZXJhdGVSdWxlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBpLG49W107aT10aGlzLm9wdGlvbnMucnVsZXM/dGhpcy5vcHRpb25zLnJ1bGVzOnRoaXMuJGVsZW1lbnQuZGF0YShcImludGVyY2hhbmdlXCIpLm1hdGNoKC9cXFsuKj9cXF0vZyk7Zm9yKHZhciBzIGluIGkpe3ZhciBvPWlbc10uc2xpY2UoMSwtMSkuc3BsaXQoXCIsIFwiKSxhPW8uc2xpY2UoMCwtMSkuam9pbihcIlwiKSxyPW9bby5sZW5ndGgtMV07ZS5TUEVDSUFMX1FVRVJJRVNbcl0mJihyPWUuU1BFQ0lBTF9RVUVSSUVTW3JdKSxuLnB1c2goe3BhdGg6YSxxdWVyeTpyfSl9dGhpcy5ydWxlcz1ufX0se2tleTpcInJlcGxhY2VcIix2YWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLmN1cnJlbnRQYXRoIT09ZSl7dmFyIGk9dGhpcyxuPVwicmVwbGFjZWQuemYuaW50ZXJjaGFuZ2VcIjtcIklNR1wiPT09dGhpcy4kZWxlbWVudFswXS5ub2RlTmFtZT90aGlzLiRlbGVtZW50LmF0dHIoXCJzcmNcIixlKS5sb2FkKGZ1bmN0aW9uKCl7aS5jdXJyZW50UGF0aD1lfSkudHJpZ2dlcihuKTplLm1hdGNoKC9cXC4oZ2lmfGpwZ3xqcGVnfHBuZ3xzdmd8dGlmZikoWz8jXS4qKT8vaSk/dGhpcy4kZWxlbWVudC5jc3Moe1wiYmFja2dyb3VuZC1pbWFnZVwiOlwidXJsKFwiK2UrXCIpXCJ9KS50cmlnZ2VyKG4pOnQuZ2V0KGUsZnVuY3Rpb24ocyl7aS4kZWxlbWVudC5odG1sKHMpLnRyaWdnZXIobiksdChzKS5mb3VuZGF0aW9uKCksaS5jdXJyZW50UGF0aD1lfSl9fX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe319XSksZX0oKTtlLmRlZmF1bHRzPXtydWxlczpudWxsfSxlLlNQRUNJQUxfUVVFUklFUz17bGFuZHNjYXBlOlwic2NyZWVuIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSlcIixwb3J0cmFpdDpcInNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdClcIixyZXRpbmE6XCJvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgb25seSBzY3JlZW4gYW5kICgtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyLzEpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweClcIn0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIkludGVyY2hhbmdlXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJNYWdlbGxhblwiKX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudFswXS5pZHx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwibWFnZWxsYW5cIik7dGhpcy4kdGFyZ2V0cz10KFwiW2RhdGEtbWFnZWxsYW4tdGFyZ2V0XVwiKSx0aGlzLiRsaW5rcz10aGlzLiRlbGVtZW50LmZpbmQoXCJhXCIpLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJkYXRhLXJlc2l6ZVwiOmUsXCJkYXRhLXNjcm9sbFwiOmUsaWQ6ZX0pLHRoaXMuJGFjdGl2ZT10KCksdGhpcy5zY3JvbGxQb3M9cGFyc2VJbnQod2luZG93LnBhZ2VZT2Zmc2V0LDEwKSx0aGlzLl9ldmVudHMoKX19LHtrZXk6XCJjYWxjUG9pbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9ZG9jdW1lbnQuYm9keSxuPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDt0aGlzLnBvaW50cz1bXSx0aGlzLndpbkhlaWdodD1NYXRoLnJvdW5kKE1hdGgubWF4KHdpbmRvdy5pbm5lckhlaWdodCxuLmNsaWVudE
6780hlaWdodCkpLHRoaXMuZG9jSGVpZ2h0PU1hdGgucm91bmQoTWF0aC5tYXgoaS5zY3JvbGxIZWlnaHQsaS5vZmZzZXRIZWlnaHQsbi5jbGllbnRIZWlnaHQsbi5zY3JvbGxIZWlnaHQsbi5vZmZzZXRIZWlnaHQpKSx0aGlzLiR0YXJnZXRzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLG49TWF0aC5yb3VuZChpLm9mZnNldCgpLnRvcC1lLm9wdGlvbnMudGhyZXNob2xkKTtpLnRhcmdldFBvaW50PW4sZS5wb2ludHMucHVzaChuKX0pfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dChcImh0bWwsIGJvZHlcIikse2R1cmF0aW9uOmUub3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixlYXNpbmc6ZS5vcHRpb25zLmFuaW1hdGlvbkVhc2luZ307dCh3aW5kb3cpLm9uZShcImxvYWRcIixmdW5jdGlvbigpe2Uub3B0aW9ucy5kZWVwTGlua2luZyYmbG9jYXRpb24uaGFzaCYmZS5zY3JvbGxUb0xvYyhsb2NhdGlvbi5oYXNoKSxlLmNhbGNQb2ludHMoKSxlLl91cGRhdGVBY3RpdmUoKX0pLHRoaXMuJGVsZW1lbnQub24oe1wicmVzaXplbWUuemYudHJpZ2dlclwiOnRoaXMucmVmbG93LmJpbmQodGhpcyksXCJzY3JvbGxtZS56Zi50cmlnZ2VyXCI6dGhpcy5fdXBkYXRlQWN0aXZlLmJpbmQodGhpcyl9KS5vbihcImNsaWNrLnpmLm1hZ2VsbGFuXCIsJ2FbaHJlZl49XCIjXCJdJyxmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGk9dGhpcy5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO2Uuc2Nyb2xsVG9Mb2MoaSl9KX19LHtrZXk6XCJzY3JvbGxUb0xvY1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPU1hdGgucm91bmQodChlKS5vZmZzZXQoKS50b3AtdGhpcy5vcHRpb25zLnRocmVzaG9sZC8yLXRoaXMub3B0aW9ucy5iYXJPZmZzZXQpO3QoXCJodG1sLCBib2R5XCIpLnN0b3AoITApLmFuaW1hdGUoe3Njcm9sbFRvcDppfSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sdGhpcy5vcHRpb25zLmFuaW1hdGlvbkVhc2luZyl9fSx7a2V5OlwicmVmbG93XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNhbGNQb2ludHMoKSx0aGlzLl91cGRhdGVBY3RpdmUoKX19LHtrZXk6XCJfdXBkYXRlQWN0aXZlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlPXBhcnNlSW50KHdpbmRvdy5wYWdlWU9mZnNldCwxMCk7aWYoZSt0aGlzLndpbkhlaWdodD09PXRoaXMuZG9jSGVpZ2h0KXQ9dGhpcy5wb2ludHMubGVuZ3RoLTE7ZWxzZSBpZihlPHRoaXMucG9pbnRzWzBdKXQ9MDtlbHNle3ZhciBpPXRoaXMuc2Nyb2xsUG9zPGUsbj10aGlzLHM9dGhpcy5wb2ludHMuZmlsdGVyKGZ1bmN0aW9uKHQscyl7cmV0dXJuIGk/ZT49dDp0LW4ub3B0aW9ucy50aHJlc2hvbGQ8PWV9KTt0PXMubGVuZ3RoP3MubGVuZ3RoLTE6MH1pZih0aGlzLiRhY3RpdmUucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLiRhY3RpdmU9dGhpcy4kbGlua3MuZXEodCkuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLm9wdGlvbnMuZGVlcExpbmtpbmcpe3ZhciBvPXRoaXMuJGFjdGl2ZVswXS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO3dpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZT93aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCxudWxsLG8pOndpbmRvdy5sb2NhdGlvbi5oYXNoPW99dGhpcy5zY3JvbGxQb3M9ZSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJ1cGRhdGUuemYubWFnZWxsYW5cIixbdGhpcy4kYWN0aXZlXSl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy4kZWxlbWVudC5vZmYoXCIuemYudHJpZ2dlciAuemYubWFnZWxsYW5cIikuZmluZChcIi5cIit0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksdGhpcy5vcHRpb25zLmRlZXBMaW5raW5nKXt2YXIgdD10aGlzLiRhY3RpdmVbMF0uZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTt3aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKHQsXCJcIil9Rm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e2FuaW1hdGlvbkR1cmF0aW9uOjUwMCxhbmltYXRpb25FYXNpbmc6XCJsaW5lYXJcIix0aHJlc2hvbGQ6NTAsYWN0aXZlQ2xhc3M6XCJhY3RpdmVcIixkZWVwTGlua2luZzohMSxiYXJPZmZzZXQ6MH0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIk1hZ2VsbGFuXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuJGxhc3RUcmlnZ2VyPXQoKSx0aGlzLl9pbml0KCksdGhpcy5fZXZlbnRzKCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiT2ZmQ2FudmFzXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRlbGVtZW50LmF0dHIoXCJpZFwiKTtpZih0aGlzLiRlbGVtZW50LmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSx0KGRvY3VtZW50KS5maW5kKCdbZGF0YS1vcGVuPVwiJytlKydcIl0sIFtkYXRhLWNsb3NlPVwiJytlKydcIl0sIFtkYXRhLXRvZ2dsZT1cIicrZSsnXCJdJykuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcImZhbHNlXCIpLmF0dHIoXCJhcmlhLWNvbnRyb2xzXCIsZSksdGhpcy5vcHRpb25zLmNsb3NlT25DbGljaylpZih0KFwiLmpzLW9mZi1jYW52YXMtZXhpdFwiKS5sZW5ndGgpdGhpcy4kZXhpdGVyPXQoXCIuanMtb2ZmLWNhbnZhcy1leGl0XCIpO2Vsc2V7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtpLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsXCJqcy1vZmYtY2FudmFzLWV4aXRcIiksdChcIltkYXRhLW9mZi1jYW52YXMtY29udGVudF1cIikuYXBwZW5kKGkpLHRoaXMuJGV4aXRlcj10KGkpfXRoaXMub3B0aW9ucy5pc1JldmVhbGVkPXRoaXMub3B0aW9ucy5pc1JldmVhbGVkfHxuZXcgUmVnRXhwKHRoaXMub3B0aW9ucy5yZXZlYWxDbGFzcyxcImdcIikudGVzdCh0aGlzLiRlbGVtZW50WzBdLmNsYXNzTmFtZSksdGhpcy5vcHRpb25zLmlzUmV2ZWFsZWQmJih0aGlzLm9wdGlvbnMucmV2ZWFsT249dGh
6780pcy5vcHRpb25zLnJldmVhbE9ufHx0aGlzLiRlbGVtZW50WzBdLmNsYXNzTmFtZS5tYXRjaCgvKHJldmVhbC1mb3ItbWVkaXVtfHJldmVhbC1mb3ItbGFyZ2UpL2cpWzBdLnNwbGl0KFwiLVwiKVsyXSx0aGlzLl9zZXRNUUNoZWNrZXIoKSksdGhpcy5vcHRpb25zLnRyYW5zaXRpb25UaW1lfHwodGhpcy5vcHRpb25zLnRyYW5zaXRpb25UaW1lPTFlMypwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQoXCJbZGF0YS1vZmYtY2FudmFzLXdyYXBwZXJdXCIpWzBdKS50cmFuc2l0aW9uRHVyYXRpb24pKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9mZihcIi56Zi50cmlnZ2VyIC56Zi5vZmZjYW52YXNcIikub24oe1wib3Blbi56Zi50cmlnZ2VyXCI6dGhpcy5vcGVuLmJpbmQodGhpcyksXCJjbG9zZS56Zi50cmlnZ2VyXCI6dGhpcy5jbG9zZS5iaW5kKHRoaXMpLFwidG9nZ2xlLnpmLnRyaWdnZXJcIjp0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpLFwia2V5ZG93bi56Zi5vZmZjYW52YXNcIjp0aGlzLl9oYW5kbGVLZXlib2FyZC5iaW5kKHRoaXMpfSksdGhpcy5vcHRpb25zLmNsb3NlT25DbGljayYmdGhpcy4kZXhpdGVyLmxlbmd0aCYmdGhpcy4kZXhpdGVyLm9uKHtcImNsaWNrLnpmLm9mZmNhbnZhc1wiOnRoaXMuY2xvc2UuYmluZCh0aGlzKX0pfX0se2tleTpcIl9zZXRNUUNoZWNrZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dCh3aW5kb3cpLm9uKFwiY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5XCIsZnVuY3Rpb24oKXtGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdChlLm9wdGlvbnMucmV2ZWFsT24pP2UucmV2ZWFsKCEwKTplLnJldmVhbCghMSl9KS5vbmUoXCJsb2FkLnpmLm9mZmNhbnZhc1wiLGZ1bmN0aW9uKCl7Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QoZS5vcHRpb25zLnJldmVhbE9uKSYmZS5yZXZlYWwoITApfSl9fSx7a2V5OlwicmV2ZWFsXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtY2xvc2VdXCIpO3Q/KHRoaXMuY2xvc2UoKSx0aGlzLmlzUmV2ZWFsZWQ9ITAsdGhpcy4kZWxlbWVudC5vZmYoXCJvcGVuLnpmLnRyaWdnZXIgdG9nZ2xlLnpmLnRyaWdnZXJcIiksZS5sZW5ndGgmJmUuaGlkZSgpKToodGhpcy5pc1JldmVhbGVkPSExLHRoaXMuJGVsZW1lbnQub24oe1wib3Blbi56Zi50cmlnZ2VyXCI6dGhpcy5vcGVuLmJpbmQodGhpcyksXCJ0b2dnbGUuemYudHJpZ2dlclwiOnRoaXMudG9nZ2xlLmJpbmQodGhpcyl9KSxlLmxlbmd0aCYmZS5zaG93KCkpfX0se2tleTpcIm9wZW5cIix2YWx1ZTpmdW5jdGlvbihlLGkpe2lmKCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKSYmIXRoaXMuaXNSZXZlYWxlZCl7dmFyIG49dGhpczt0KGRvY3VtZW50LmJvZHkpO3RoaXMub3B0aW9ucy5mb3JjZVRvcCYmdChcImJvZHlcIikuc2Nyb2xsVG9wKDApLEZvdW5kYXRpb24uTW92ZSh0aGlzLm9wdGlvbnMudHJhbnNpdGlvblRpbWUsdGhpcy4kZWxlbWVudCxmdW5jdGlvbigpe3QoXCJbZGF0YS1vZmYtY2FudmFzLXdyYXBwZXJdXCIpLmFkZENsYXNzKFwiaXMtb2ZmLWNhbnZhcy1vcGVuIGlzLW9wZW4tXCIrbi5vcHRpb25zLnBvc2l0aW9uKSxcbm4uJGVsZW1lbnQuYWRkQ2xhc3MoXCJpcy1vcGVuXCIpfSksdGhpcy4kZWxlbWVudC5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpLnRyaWdnZXIoXCJvcGVuZWQuemYub2ZmY2FudmFzXCIpLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuJGV4aXRlci5hZGRDbGFzcyhcImlzLXZpc2libGVcIiksaSYmKHRoaXMuJGxhc3RUcmlnZ2VyPWkuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcInRydWVcIikpLHRoaXMub3B0aW9ucy5hdXRvRm9jdXMmJnRoaXMuJGVsZW1lbnQub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCh0aGlzLiRlbGVtZW50KSxmdW5jdGlvbigpe24uJGVsZW1lbnQuZmluZChcImEsIGJ1dHRvblwiKS5lcSgwKS5mb2N1cygpfSksdGhpcy5vcHRpb25zLnRyYXBGb2N1cyYmKHQoXCJbZGF0YS1vZmYtY2FudmFzLWNvbnRlbnRdXCIpLmF0dHIoXCJ0YWJpbmRleFwiLFwiLTFcIiksdGhpcy5fdHJhcEZvY3VzKCkpfX19LHtrZXk6XCJfdHJhcEZvY3VzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1Gb3VuZGF0aW9uLktleWJvYXJkLmZpbmRGb2N1c2FibGUodGhpcy4kZWxlbWVudCksZT10LmVxKDApLGk9dC5lcSgtMSk7dC5vZmYoXCIuemYub2ZmY2FudmFzXCIpLm9uKFwia2V5ZG93bi56Zi5vZmZjYW52YXNcIixmdW5jdGlvbih0KXs5IT09dC53aGljaCYmOSE9PXQua2V5Y29kZXx8KHQudGFyZ2V0IT09aVswXXx8dC5zaGlmdEtleXx8KHQucHJldmVudERlZmF1bHQoKSxlLmZvY3VzKCkpLHQudGFyZ2V0PT09ZVswXSYmdC5zaGlmdEtleSYmKHQucHJldmVudERlZmF1bHQoKSxpLmZvY3VzKCkpKX0pfX0se2tleTpcImNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy4kZWxlbWVudC5oYXNDbGFzcyhcImlzLW9wZW5cIikmJiF0aGlzLmlzUmV2ZWFsZWQpe3ZhciBpPXRoaXM7dChcIltkYXRhLW9mZi1jYW52YXMtd3JhcHBlcl1cIikucmVtb3ZlQ2xhc3MoXCJpcy1vZmYtY2FudmFzLW9wZW4gaXMtb3Blbi1cIitpLm9wdGlvbnMucG9zaXRpb24pLGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJpcy1vcGVuXCIpLHRoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLnRyaWdnZXIoXCJjbG9zZWQuemYub2ZmY2FudmFzXCIpLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuJGV4aXRlci5yZW1vdmVDbGFzcyhcImlzLXZpc2libGVcIiksdGhpcy4kbGFzdFRyaWdnZXIuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcImZhbHNlXCIpLHRoaXMub3B0aW9ucy50cmFwRm9jdXMmJnQoXCJbZGF0YS1vZmYtY2FudmFzLWNvbnRlbnRdXCIpLnJlbW92ZUF0dHIoXCJ0YWJpbmRleFwiKX19fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKT90aGlzLmNsb3NlKHQsZSk6dGhpcy5vcGVuKHQsZSl9fSx7a2V5OlwiX2hhbmRsZUtleWJvYXJkXCIsdmFsdWU6ZnVuY3Rpb24odCl7Mjc9PT10LndoaWNoJiYodC5zdG9wUHJvcGFnYXRpb24oKSx0LnByZXZlbn
6780REZWZhdWx0KCksdGhpcy5jbG9zZSgpLHRoaXMuJGxhc3RUcmlnZ2VyLmZvY3VzKCkpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2xvc2UoKSx0aGlzLiRlbGVtZW50Lm9mZihcIi56Zi50cmlnZ2VyIC56Zi5vZmZjYW52YXNcIiksdGhpcy4kZXhpdGVyLm9mZihcIi56Zi5vZmZjYW52YXNcIiksRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e2Nsb3NlT25DbGljazohMCx0cmFuc2l0aW9uVGltZTowLHBvc2l0aW9uOlwibGVmdFwiLGZvcmNlVG9wOiEwLGlzUmV2ZWFsZWQ6ITEscmV2ZWFsT246bnVsbCxhdXRvRm9jdXM6ITAscmV2ZWFsQ2xhc3M6XCJyZXZlYWwtZm9yLVwiLHRyYXBGb2N1czohMX0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIk9mZkNhbnZhc1wiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9aSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30sZS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiT3JiaXRcIiksRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcihcIk9yYml0XCIse2x0cjp7QVJST1dfUklHSFQ6XCJuZXh0XCIsQVJST1dfTEVGVDpcInByZXZpb3VzXCJ9LHJ0bDp7QVJST1dfTEVGVDpcIm5leHRcIixBUlJPV19SSUdIVDpcInByZXZpb3VzXCJ9fSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJHdyYXBwZXI9dGhpcy4kZWxlbWVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5jb250YWluZXJDbGFzcyksdGhpcy4kc2xpZGVzPXRoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMuc2xpZGVDbGFzcyk7dmFyIHQ9dGhpcy4kZWxlbWVudC5maW5kKFwiaW1nXCIpLGU9dGhpcy4kc2xpZGVzLmZpbHRlcihcIi5pcy1hY3RpdmVcIik7ZS5sZW5ndGh8fHRoaXMuJHNsaWRlcy5lcSgwKS5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKSx0aGlzLm9wdGlvbnMudXNlTVVJfHx0aGlzLiRzbGlkZXMuYWRkQ2xhc3MoXCJuby1tb3Rpb251aVwiKSx0Lmxlbmd0aD9Gb3VuZGF0aW9uLm9uSW1hZ2VzTG9h
6780ZGVkKHQsdGhpcy5fcHJlcGFyZUZvck9yYml0LmJpbmQodGhpcykpOnRoaXMuX3ByZXBhcmVGb3JPcmJpdCgpLHRoaXMub3B0aW9ucy5idWxsZXRzJiZ0aGlzLl9sb2FkQnVsbGV0cygpLHRoaXMuX2V2ZW50cygpLHRoaXMub3B0aW9ucy5hdXRvUGxheSYmdGhpcy4kc2xpZGVzLmxlbmd0aD4xJiZ0aGlzLmdlb1N5bmMoKSx0aGlzLm9wdGlvbnMuYWNjZXNzaWJsZSYmdGhpcy4kd3JhcHBlci5hdHRyKFwidGFiaW5kZXhcIiwwKX19LHtrZXk6XCJfbG9hZEJ1bGxldHNcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGJ1bGxldHM9dGhpcy4kZWxlbWVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5ib3hPZkJ1bGxldHMpLmZpbmQoXCJidXR0b25cIil9fSx7a2V5OlwiZ2VvU3luY1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLnRpbWVyPW5ldyBGb3VuZGF0aW9uLlRpbWVyKHRoaXMuJGVsZW1lbnQse2R1cmF0aW9uOnRoaXMub3B0aW9ucy50aW1lckRlbGF5LGluZmluaXRlOiExfSxmdW5jdGlvbigpe3QuY2hhbmdlU2xpZGUoITApfSksdGhpcy50aW1lci5zdGFydCgpfX0se2tleTpcIl9wcmVwYXJlRm9yT3JiaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc2V0V3JhcHBlckhlaWdodChmdW5jdGlvbihlKXt0Ll9zZXRTbGlkZUhlaWdodChlKX0pfX0se2tleTpcIl9zZXRXcmFwcGVySGVpZ2h0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGksbj0wLHM9MDt0aGlzLiRzbGlkZXMuZWFjaChmdW5jdGlvbigpe2k9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsdCh0aGlzKS5hdHRyKFwiZGF0YS1zbGlkZVwiLHMpLHMmJnQodGhpcykuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsZGlzcGxheTpcIm5vbmVcIn0pLG49aT5uP2k6bixzKyt9KSxzPT09dGhpcy4kc2xpZGVzLmxlbmd0aCYmKHRoaXMuJHdyYXBwZXIuY3NzKHtoZWlnaHQ6bn0pLGUobikpfX0se2tleTpcIl9zZXRTbGlkZUhlaWdodFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5jc3MoXCJtYXgtaGVpZ2h0XCIsZSl9KX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKHRoaXMuJHNsaWRlcy5sZW5ndGg+MSl7aWYodGhpcy5vcHRpb25zLnN3aXBlJiZ0aGlzLiRzbGlkZXMub2ZmKFwic3dpcGVsZWZ0LnpmLm9yYml0IHN3aXBlcmlnaHQuemYub3JiaXRcIikub24oXCJzd2lwZWxlZnQuemYub3JiaXRcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZS5jaGFuZ2VTbGlkZSghMCl9KS5vbihcInN3aXBlcmlnaHQuemYub3JiaXRcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZS5jaGFuZ2VTbGlkZSghMSl9KSx0aGlzLm9wdGlvbnMuYXV0b1BsYXkmJih0aGlzLiRzbGlkZXMub24oXCJjbGljay56Zi5vcmJpdFwiLGZ1bmN0aW9uKCl7ZS4kZWxlbWVudC5kYXRhKFwiY2xpY2tlZE9uXCIsIWUuJGVsZW1lbnQuZGF0YShcImNsaWNrZWRPblwiKSksZS50aW1lcltlLiRlbGVtZW50LmRhdGEoXCJjbGlja2VkT25cIik/XCJwYXVzZVwiOlwic3RhcnRcIl0oKX0pLHRoaXMub3B0aW9ucy5wYXVzZU9uSG92ZXImJnRoaXMuJGVsZW1lbnQub24oXCJtb3VzZWVudGVyLnpmLm9yYml0XCIsZnVuY3Rpb24oKXtlLnRpbWVyLnBhdXNlKCl9KS5vbihcIm1vdXNlbGVhdmUuemYub3JiaXRcIixmdW5jdGlvbigpe2UuJGVsZW1lbnQuZGF0YShcImNsaWNrZWRPblwiKXx8ZS50aW1lci5zdGFydCgpfSkpLHRoaXMub3B0aW9ucy5uYXZCdXR0b25zKXt2YXIgaT10aGlzLiRlbGVtZW50LmZpbmQoXCIuXCIrdGhpcy5vcHRpb25zLm5leHRDbGFzcytcIiwgLlwiK3RoaXMub3B0aW9ucy5wcmV2Q2xhc3MpO2kuYXR0cihcInRhYmluZGV4XCIsMCkub24oXCJjbGljay56Zi5vcmJpdCB0b3VjaGVuZC56Zi5vcmJpdFwiLGZ1bmN0aW9uKGkpe2kucHJldmVudERlZmF1bHQoKSxlLmNoYW5nZVNsaWRlKHQodGhpcykuaGFzQ2xhc3MoZS5vcHRpb25zLm5leHRDbGFzcykpfSl9dGhpcy5vcHRpb25zLmJ1bGxldHMmJnRoaXMuJGJ1bGxldHMub24oXCJjbGljay56Zi5vcmJpdCB0b3VjaGVuZC56Zi5vcmJpdFwiLGZ1bmN0aW9uKCl7aWYoL2lzLWFjdGl2ZS9nLnRlc3QodGhpcy5jbGFzc05hbWUpKXJldHVybiExO3ZhciBpPXQodGhpcykuZGF0YShcInNsaWRlXCIpLG49aT5lLiRzbGlkZXMuZmlsdGVyKFwiLmlzLWFjdGl2ZVwiKS5kYXRhKFwic2xpZGVcIikscz1lLiRzbGlkZXMuZXEoaSk7ZS5jaGFuZ2VTbGlkZShuLHMsaSl9KSx0aGlzLiR3cmFwcGVyLmFkZCh0aGlzLiRidWxsZXRzKS5vbihcImtleWRvd24uemYub3JiaXRcIixmdW5jdGlvbihpKXtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiT3JiaXRcIix7bmV4dDpmdW5jdGlvbigpe2UuY2hhbmdlU2xpZGUoITApfSxwcmV2aW91czpmdW5jdGlvbigpe2UuY2hhbmdlU2xpZGUoITEpfSxoYW5kbGVkOmZ1bmN0aW9uKCl7dChpLnRhcmdldCkuaXMoZS4kYnVsbGV0cykmJmUuJGJ1bGxldHMuZmlsdGVyKFwiLmlzLWFjdGl2ZVwiKS5mb2N1cygpfX0pfSl9fX0se2tleTpcImNoYW5nZVNsaWRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuJHNsaWRlcy5maWx0ZXIoXCIuaXMtYWN0aXZlXCIpLmVxKDApO2lmKC9tdWkvZy50ZXN0KG5bMF0uY2xhc3NOYW1lKSlyZXR1cm4hMTt2YXIgcyxvPXRoaXMuJHNsaWRlcy5maXJzdCgpLGE9dGhpcy4kc2xpZGVzLmxhc3QoKSxyPXQ/XCJSaWdodFwiOlwiTGVmdFwiLGw9dD9cIkxlZnRcIjpcIlJpZ2h0XCIsdT10aGlzO3M9ZT9lOnQ/dGhpcy5vcHRpb25zLmluZmluaXRlV3JhcD9uLm5leHQoXCIuXCIrdGhpcy5vcHRpb25zLnNsaWRlQ2xhc3MpLmxlbmd0aD9uLm5leHQoXCIuXCIrdGhpcy5vcHRpb25zLnNsaWRlQ2xhc3MpOm86bi5uZXh0KFwiLlwiK3RoaXMub3B0aW9ucy5zbGlkZUNsYXNzKTp0aGlzLm9wdGlvbnMuaW5maW5pdGVXcmFwP24ucHJldihcIi5cIit0aGlzLm9wdGlvbnMuc2xpZGVDbGFzcykubGVuZ3RoP24ucHJldihcIi5cIit0aGlzLm9wdGlvbnMuc2xpZGVDbGFzcyk6YTpuLnByZXYoXCIuXCIrdGh
6780pcy5vcHRpb25zLnNsaWRlQ2xhc3MpLHMubGVuZ3RoJiYodGhpcy5vcHRpb25zLmJ1bGxldHMmJihpPWl8fHRoaXMuJHNsaWRlcy5pbmRleChzKSx0aGlzLl91cGRhdGVCdWxsZXRzKGkpKSx0aGlzLm9wdGlvbnMudXNlTVVJPyhGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlSW4ocy5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKS5jc3Moe3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix0b3A6MH0pLHRoaXMub3B0aW9uc1tcImFuaW1JbkZyb21cIityXSxmdW5jdGlvbigpe3MuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsZGlzcGxheTpcImJsb2NrXCJ9KS5hdHRyKFwiYXJpYS1saXZlXCIsXCJwb2xpdGVcIil9KSxGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KG4ucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmVcIiksdGhpcy5vcHRpb25zW1wiYW5pbU91dFRvXCIrbF0sZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIoXCJhcmlhLWxpdmVcIiksdS5vcHRpb25zLmF1dG9QbGF5JiYhdS50aW1lci5pc1BhdXNlZCYmdS50aW1lci5yZXN0YXJ0KCl9KSk6KG4ucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmUgaXMtaW5cIikucmVtb3ZlQXR0cihcImFyaWEtbGl2ZVwiKS5oaWRlKCkscy5hZGRDbGFzcyhcImlzLWFjdGl2ZSBpcy1pblwiKS5hdHRyKFwiYXJpYS1saXZlXCIsXCJwb2xpdGVcIikuc2hvdygpLHRoaXMub3B0aW9ucy5hdXRvUGxheSYmIXRoaXMudGltZXIuaXNQYXVzZWQmJnRoaXMudGltZXIucmVzdGFydCgpKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJzbGlkZWNoYW5nZS56Zi5vcmJpdFwiLFtzXSkpfX0se2tleTpcIl91cGRhdGVCdWxsZXRzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kZWxlbWVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5ib3hPZkJ1bGxldHMpLmZpbmQoXCIuaXMtYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwiaXMtYWN0aXZlXCIpLmJsdXIoKSxpPWUuZmluZChcInNwYW46bGFzdFwiKS5kZXRhY2goKTt0aGlzLiRidWxsZXRzLmVxKHQpLmFkZENsYXNzKFwiaXMtYWN0aXZlXCIpLmFwcGVuZChpKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9mZihcIi56Zi5vcmJpdFwiKS5maW5kKFwiKlwiKS5vZmYoXCIuemYub3JiaXRcIikuZW5kKCkuaGlkZSgpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtidWxsZXRzOiEwLG5hdkJ1dHRvbnM6ITAsYW5pbUluRnJvbVJpZ2h0Olwic2xpZGUtaW4tcmlnaHRcIixhbmltT3V0VG9SaWdodDpcInNsaWRlLW91dC1yaWdodFwiLGFuaW1JbkZyb21MZWZ0Olwic2xpZGUtaW4tbGVmdFwiLGFuaW1PdXRUb0xlZnQ6XCJzbGlkZS1vdXQtbGVmdFwiLGF1dG9QbGF5OiEwLHRpbWVyRGVsYXk6NWUzLGluZmluaXRlV3JhcDohMCxzd2lwZTohMCxwYXVzZU9uSG92ZXI6ITAsYWNjZXNzaWJsZTohMCxjb250YWluZXJDbGFzczpcIm9yYml0LWNvbnRhaW5lclwiLHNsaWRlQ2xhc3M6XCJvcmJpdC1zbGlkZVwiLGJveE9mQnVsbGV0czpcIm9yYml0LWJ1bGxldHNcIixuZXh0Q2xhc3M6XCJvcmJpdC1uZXh0XCIscHJldkNsYXNzOlwib3JiaXQtcHJldmlvdXNcIix1c2VNVUk6ITB9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJPcmJpdFwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9dChpKSx0aGlzLnJ1bGVzPXRoaXMuJGVsZW1lbnQuZGF0YShcInJlc3BvbnNpdmUtbWVudVwiKSx0aGlzLmN1cnJlbnRNcT1udWxsLHRoaXMuY3VycmVudFBsdWdpbj1udWxsLHRoaXMuX2luaXQoKSx0aGlzLl9ldmVudHMoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJSZXNwb25zaXZlTWVudVwiKX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMucnVsZXMpe2Zvcih2YXIgZT17fSxuPXRoaXMucnVsZXMuc3BsaXQoXCIgXCIpLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIG89bltzXS5zcGxpdChcIi1cIiksYT1vLmxlbmd0aD4xP29bMF06XCJzbWFsbFwiLHI9by5sZW5ndGg+MT9vWzFdOm9bMF07bnVsbCE9PWlbcl0mJihlW2FdPWlbcl0pfXRoaXMucnVsZXM9ZX10LmlzRW1wdHlPYmplY3QodGhpcy5ydWxlcyl8fHRoaXMuX2NoZWNrTWVkaWFRdWVyaWVzKCl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0KHdpbmRvdykub24oXCJjaGFuZ2VkLnpmLm1lZGlhcXVlcnlcIixmdW5jdGlvbigpe2UuX2NoZWNrTWVkaWFRdWVyaWVzKCl9KX19LHtrZXk6XCJfY2hlY2tNZWRpYVF1ZXJpZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLG49dGhpczt0LmVhY2godGhpcy5ydWxlcyxmdW5jdGlvbih0KXtGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0KSYmKGU9dCl9KSxlJiYodGhpcy5jdXJyZW50UGx1Z2luIGluc3RhbmNlb2YgdGhpcy5ydWxlc1tlXS5wbHVnaW58fCh0LmVhY2goaSxmdW5jdGlvbih0LGUpe24uJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzcyl9KSx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMucnVsZXNbZV0uY3NzQ2xhc3MpLHRoaXMuY3VycmVudFBsdWdpbiYmdGhpcy5jdXJyZW50UGx1Z2luLmRlc3Ryb3koKSx0aGlzLmN1cnJlbnRQbHVnaW49bmV3IHRoaXMucnVsZXNbZV0ucGx1Z2luKHRoaXMuJGVsZW1lbnQse30pKSl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50UGx1Z2luLmRlc3Ryb3koKSx0KHdpbmRvdykub2ZmKFwiLnpmLlJlc3BvbnNpdmVNZW51XCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXt9O3ZhciBpPXtkcm9wZG93bjp7Y3NzQ2xhc3M6XCJkcm9wZG93blwiLHBsdWdpbjpGb3VuZGF0aW9uLl9wbHVnaW5zW1wiZHJvcGRvd24tbWVudVwiXXx8bnVsbH0sZHJpbGxkb3duOntjc3NDbGFzczpcImRyaWxsZG93blwiLHBsdWdpbjpGb3VuZGF0aW9uLl9wbHVnaW5zLmRyaWxsZG93bnx8bnVsbH0sYWNjb3JkaW9uOntjc3NDbGFzczpcImFjY29yZGlvbi1tZW51XCIscGx1Z2luOkZvdW5kYXRpb24uX3BsdWdpbnNbXCJhY2NvcmRpb24tbWVudVwiXXx8bnVsbH19O0ZvdW5kYXRpb24ucGx1Z2luKGUsXCJSZXNwb25zaXZlTWVudVwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9dChpKSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30sZS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksdGhpcy5fZXZlbnRzKCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiUmVzcG9uc2l2ZVRvZ2dsZVwiKX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudC5kYXRhKFwicmVzcG9uc2l2ZS10b2dnbGVcIik7ZXx8Y29uc29sZS5lcnJvcihcIllvdXIgdGFiIGJhciBuZWVkcyBhbiBJRCBvZiBhIE1lbnUgYXMgdGhlIHZhbHVlIG9mIGRhdGEtdGFiLWJhci5cIiksdGhpcy4kdGFyZ2V0TWVudT10KFwiI1wiK2UpLHRoaXMuJHRvZ2dsZXI9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtdG9nZ2xlXVwiKSx0aGlzLl91cGRhdGUoKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0KHdpbmRvdykub24oXCJjaGFuZ2VkLnpmLm1lZGlhcXVlcnlcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdGhpcy4kdG9nZ2xlci5vbihcImNsaWNrLnpmLnJlc3BvbnNpdmVUb2dnbGVcIix0aGlzLnRvZ2dsZU1lbnUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX3VwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QodGhpcy5vcHRpb25zLmhpZGVGb3IpPyh0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLiR0YXJnZXRNZW51LnNob3coKSk6KHRoaXMuJGVsZW1lbnQuc2hvdygpLHRoaXMuJHRhcmdldE1lbnUuaGlkZSgpKX19LHtrZXk6XCJ0b2dnbGVNZW51XCIsdmFsdWU6ZnVuY3Rpb24oKXtGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuaGl
6780kZUZvcil8fCh0aGlzLiR0YXJnZXRNZW51LnRvZ2dsZSgwKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJ0b2dnbGVkLnpmLnJlc3BvbnNpdmVUb2dnbGVcIikpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe319XSksZX0oKTtlLmRlZmF1bHRzPXtoaWRlRm9yOlwibWVkaXVtXCJ9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJSZXNwb25zaXZlVG9nZ2xlXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybi9pUChhZHxob25lfG9kKS4qT1MvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaShlLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGkpLHRoaXMuJGVsZW1lbnQ9ZSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30saS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiUmV2ZWFsXCIpLEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoXCJSZXZlYWxcIix7RU5URVI6XCJvcGVuXCIsU1BBQ0U6XCJvcGVuXCIsRVNDQVBFOlwiY2xvc2VcIixUQUI6XCJ0YWJfZm9yd2FyZFwiLFNISUZUX1RBQjpcInRhYl9iYWNrd2FyZFwifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhpLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuaWQ9dGhpcy4kZWxlbWVudC5hdHRyKFwiaWRcIiksdGhpcy5pc0FjdGl2ZT0hMSx0aGlzLmNhY2hlZD17bXE6Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnR9LHRoaXMuaXNpT1M9ZSgpLHRoaXMuaXNpT1MmJnRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJpcy1pb3NcIiksdGhpcy4kYW5jaG9yPXQodCgnW2RhdGEtb3Blbj1cIicrdGhpcy5pZCsnXCJdJykubGVuZ3RoPydbZGF0YS1vcGVuPVwiJyt0aGlzLmlkKydcIl0nOidbZGF0YS10b2dnbGU9XCInK3RoaXMuaWQrJ1wiXScpLHRoaXMuJGFuY2hvci5sZW5ndGgpe3ZhciBpPXRoaXMuJGFuY2hvclswXS5pZHx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwicmV2ZWFsXCIpO3RoaXMuJGFuY2hvci5hdHRyKHtcImFyaWEtY29udHJvbHNcIjp0aGlzLmlkLGlkOmksXCJhcmlhLWhhc3BvcHVwXCI6ITAsdGFiaW5kZXg6MH0pLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJhcmlhLWxhYmVsbGVkYnlcIjppfSl9KHRoaXMub3B0aW9ucy5mdWxsU2NyZWVufHx0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiZnVsbFwiKSkmJih0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbj0hMCx0aGlzLm9wdGlvbnMub3ZlcmxheT0hMSksdGhpcy5vcHRpb25zLm92ZXJsYXkmJiF0aGlzLiRvdmVybGF5JiYodGhpcy4kb3ZlcmxheT10aGlzLl9tYWtlT3ZlcmxheSh0aGlzLmlkKSksdGhpcy4kZWxlbWVudC5hdHRyKHtyb2xlOlwiZGlhbG9nXCIsXCJhcmlhLWhpZGRlblwiOiEwLFwiZGF0YS15ZXRpLWJveFwiOnRoaXMuaWQsXCJkYXRhLXJlc2l6ZVwiOnRoaXMuaWR9KSx0aGlzLiRvdmVybGF5P3RoaXMuJGVsZW1lbnQuZGV0YWNoKCkuYXBwZW5kVG8odGhpcy4kb3ZlcmxheSk6KHRoaXMuJGVsZW1lbnQuZGV0YWNoKCkuYXBwZW5kVG8odChcImJvZHlcIikpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJ3aXRob3V0LW92ZXJsYXlcIikpLHRoaXMuX2V2ZW50cygpLHRoaXMub3B0aW9ucy5kZWVwTGluayYmd2luZG93LmxvY2F0aW9uLmhhc2g9PT1cIiNcIit0aGlzLmlkJiZ0KHdpbmRvdykub25lKFwibG9hZC56Zi5yZXZlYWxcIix0aGlzLm9wZW4uYmluZCh0aGlzKSl9fSx7a2V5OlwiX21ha2VPdmVybGF5XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dChcIjxkaXY+PC9kaXY+XCIpLmFkZENsYXNzKFwicmV2ZWFsLW92ZXJsYXlcIikuYXR0cih7dGFiaW5kZXg6LTEsXCJhcmlhLWhpZGRlblwiOiEwfSkuYXBwZW5kVG8oXCJib2R5XCIpO3JldHVybiBpfX0se2tleTpcIl91cGRhdGVQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsaSxuPXRoaXMuJGVsZW1lbnQub3V0ZXJXaWR0aCgpLHM9dCh3aW5kb3cpLndpZHRoKCksbz10aGlzLiRlbGVtZW50Lm91dGVySGVpZ2h0KCksYT10KHdpbmRvdykuaGVpZ2h0KCk7ZT1cImF1dG9cIj09PXRoaXMub3B0aW9ucy5oT2Zmc2V0P3BhcnNlSW50KChzLW4pLzIsMTApOnBhcnNlSW50KHRoaXMub3B0aW9ucy5oT2Zmc2V0LDEwKSxpPVwiYXV0b1wiPT09dGhpcy5vcHRpb25zLnZPZmZzZXQ/bz5hP3BhcnNlSW50KE1hdGgubWluKDEwMCxhLzEwKSwxMCk6cGFyc2VJbnQoKGEtbykvNCwxMCk6cGFyc2VJbnQodGhpcy5vcHRpb25zLnZPZmZzZXQsMTApLHRoaXMuJGVsZW1lbnQuY3NzKHt0b3A6aStcInB4XCJ9KSx0aGlzLiRvdmVybGF5JiZcImF1dG9cIj09PXRoaXMub3B0aW9ucy5oT2Zmc2V0fHwodGhpcy4kZWxlbWVudC5jc3Moe2xlZnQ6ZStcInB4XCJ9KSx0aGlzLiRlbGVtZW50LmNzcyh7bWFyZ2luOlwiMHB4XCJ9KSl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRlbGVtZW50Lm9uKHtcIm9wZW4uemYudHJpZ2dlclwiOnRoaXMub3Blbi5iaW5kKHRoaXMpLFwiY2xvc2UuemYudHJpZ2dlclwiOnRoaXMuY2xvc2UuYmluZCh0aGlzKSxcInRvZ2dsZS56Zi50cmlnZ2VyXCI6dGhpcy50b2dnbGUuYmluZCh0aGlzKSxcInJlc2l6ZW1lLnpmLnRyaWdnZXJcIjpmdW5jdGlvbigpe2UuX3VwZGF0ZVBvc2l0aW9uKCl9fSksdGhpcy4kYW5jaG9yLmxlbmd0aCYmdGhpcy4kYW5jaG9yLm9uKFwia2V5ZG93bi56Zi5yZXZlYWxcIixmdW5jdGlvbih0KXsxMyE9PXQud2hpY2gmJjMyIT09dC53aGljaHx8KHQuc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLGUub3BlbigpKX0pLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMub3B0aW9ucy5vdmVybGF5JiZ0aGlzLiRvdmVybGF5Lm9mZihcIi56Zi5yZXZlYWxcIikub24oXCJjbGljay56Zi5yZXZlYWxcIixmdW5jdGlvbihpKXtpLnRhcmdldD09PWUuJGVsZW1lbnRbMF18fH
6780QuY29udGFpbnMoZS4kZWxlbWVudFswXSxpLnRhcmdldCl8fGUuY2xvc2UoKX0pLHRoaXMub3B0aW9ucy5kZWVwTGluayYmdCh3aW5kb3cpLm9uKFwicG9wc3RhdGUuemYucmV2ZWFsOlwiK3RoaXMuaWQsdGhpcy5faGFuZGxlU3RhdGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2hhbmRsZVN0YXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7d2luZG93LmxvY2F0aW9uLmhhc2ghPT1cIiNcIit0aGlzLmlkfHx0aGlzLmlzQWN0aXZlP3RoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX19LHtrZXk6XCJvcGVuXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKHRoaXMub3B0aW9ucy5kZWVwTGluayl7dmFyIGk9XCIjXCIrdGhpcy5pZDt3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU/d2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsbnVsbCxpKTp3aW5kb3cubG9jYXRpb24uaGFzaD1pfWlmKHRoaXMuaXNBY3RpdmU9ITAsdGhpcy4kZWxlbWVudC5jc3Moe3Zpc2liaWxpdHk6XCJoaWRkZW5cIn0pLnNob3coKS5zY3JvbGxUb3AoMCksdGhpcy5vcHRpb25zLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkuY3NzKHt2aXNpYmlsaXR5OlwiaGlkZGVuXCJ9KS5zaG93KCksdGhpcy5fdXBkYXRlUG9zaXRpb24oKSx0aGlzLiRlbGVtZW50LmhpZGUoKS5jc3Moe3Zpc2liaWxpdHk6XCJcIn0pLHRoaXMuJG92ZXJsYXkmJnRoaXMuJG92ZXJsYXkuY3NzKHt2aXNpYmlsaXR5OlwiXCJ9KS5oaWRlKCksdGhpcy5vcHRpb25zLm11bHRpcGxlT3BlbmVkfHx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJjbG9zZW1lLnpmLnJldmVhbFwiLHRoaXMuaWQpLHRoaXMub3B0aW9ucy5hbmltYXRpb25Jbj8odGhpcy5vcHRpb25zLm92ZXJsYXkmJkZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVJbih0aGlzLiRvdmVybGF5LFwiZmFkZS1pblwiKSxGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlSW4odGhpcy4kZWxlbWVudCx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uSW4sZnVuY3Rpb24oKXtlLmZvY3VzYWJsZUVsZW1lbnRzPUZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZShlLiRlbGVtZW50KX0pKToodGhpcy5vcHRpb25zLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkuc2hvdygwKSx0aGlzLiRlbGVtZW50LnNob3codGhpcy5vcHRpb25zLnNob3dEZWxheSkpLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJhcmlhLWhpZGRlblwiOiExLHRhYmluZGV4Oi0xfSkuZm9jdXMoKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJvcGVuLnpmLnJldmVhbFwiKSx0aGlzLmlzaU9TKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQ7dChcImh0bWwsIGJvZHlcIikuYWRkQ2xhc3MoXCJpcy1yZXZlYWwtb3BlblwiKS5zY3JvbGxUb3Aobil9ZWxzZSB0KFwiYm9keVwiKS5hZGRDbGFzcyhcImlzLXJldmVhbC1vcGVuXCIpO3QoXCJib2R5XCIpLmFkZENsYXNzKFwiaXMtcmV2ZWFsLW9wZW5cIikuYXR0cihcImFyaWEtaGlkZGVuXCIsISghdGhpcy5vcHRpb25zLm92ZXJsYXkmJiF0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbikpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9leHRyYUhhbmRsZXJzKCl9LDApfX0se2tleTpcIl9leHRyYUhhbmRsZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZm9jdXNhYmxlRWxlbWVudHM9Rm91bmRhdGlvbi5LZXlib2FyZC5maW5kRm9jdXNhYmxlKHRoaXMuJGVsZW1lbnQpLHRoaXMub3B0aW9ucy5vdmVybGF5fHwhdGhpcy5vcHRpb25zLmNsb3NlT25DbGlja3x8dGhpcy5vcHRpb25zLmZ1bGxTY3JlZW58fHQoXCJib2R5XCIpLm9uKFwiY2xpY2suemYucmV2ZWFsXCIsZnVuY3Rpb24oaSl7aS50YXJnZXQ9PT1lLiRlbGVtZW50WzBdfHx0LmNvbnRhaW5zKGUuJGVsZW1lbnRbMF0saS50YXJnZXQpfHxlLmNsb3NlKCl9KSx0aGlzLm9wdGlvbnMuY2xvc2VPbkVzYyYmdCh3aW5kb3cpLm9uKFwia2V5ZG93bi56Zi5yZXZlYWxcIixmdW5jdGlvbih0KXtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleSh0LFwiUmV2ZWFsXCIse2Nsb3NlOmZ1bmN0aW9uKCl7ZS5vcHRpb25zLmNsb3NlT25Fc2MmJihlLmNsb3NlKCksZS4kYW5jaG9yLmZvY3VzKCkpfX0pfSksdGhpcy4kZWxlbWVudC5vbihcImtleWRvd24uemYucmV2ZWFsXCIsZnVuY3Rpb24oaSl7dmFyIG49dCh0aGlzKTtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiUmV2ZWFsXCIse3RhYl9mb3J3YXJkOmZ1bmN0aW9uKCl7ZS4kZWxlbWVudC5maW5kKFwiOmZvY3VzXCIpLmlzKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoLTEpKSYmKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoMCkuZm9jdXMoKSxpLnByZXZlbnREZWZhdWx0KCkpLDA9PT1lLmZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCYmaS5wcmV2ZW50RGVmYXVsdCgpfSx0YWJfYmFja3dhcmQ6ZnVuY3Rpb24oKXsoZS4kZWxlbWVudC5maW5kKFwiOmZvY3VzXCIpLmlzKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoMCkpfHxlLiRlbGVtZW50LmlzKFwiOmZvY3VzXCIpKSYmKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoLTEpLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpKSwwPT09ZS5mb2N1c2FibGVFbGVtZW50cy5sZW5ndGgmJmkucHJldmVudERlZmF1bHQoKX0sb3BlbjpmdW5jdGlvbigpe2UuJGVsZW1lbnQuZmluZChcIjpmb2N1c1wiKS5pcyhlLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1jbG9zZV1cIikpP3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLiRhbmNob3IuZm9jdXMoKX0sMSk6bi5pcyhlLmZvY3VzYWJsZUVsZW1lbnRzKSYmZS5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7ZS5vcHRpb25zLmNsb3NlT25Fc2MmJihlLmNsb3NlKCksZS4kYW5jaG9yLmZvY3VzKCkpfX0pfSl9fSx7a2V5OlwiY2xvc2VcIix2YWx1ZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpLmlzaU9TP3QoXCJodG1sLCBib2R5XCIpLnJlbW92ZUNsYXNzKFwiaXMtcmV2ZWFsLW9wZW5cIik6dChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJpcy1yZXZlYWwtb3BlblwiKSx0KFwiYm9keVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6ITEsdGFiaW5kZXg6XCJcIn0pLGkuJGVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsITApLGkuJGVsZW1lbnQudHJpZ2dlcihcImNsb3NlZC56Zi5yZXZlYWxcIil9aWYoIXRoaXMuaXNBY3RpdmV8fCF0aGlzLiRlbGVtZW50LmlzKFwiOnZpc2libGVcIikpcmV0dXJuITE7dmFyIGk9dGhpczt0aGlzLm9wdGlvbnMuYW5pbWF0aW9uT3V0Pyh0aGlzLm9wdGlvbnMub3ZlcmxheT9Gb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJG92ZXJsYXksXCJmYWRlLW91dFwiLGUpOmUoKSxGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJGVsZW1lbnQsdGhpcy5vcHRpb25zLmFuaW1hdGlvbk91dCkpOih0aGlzLm9wdGlvbnMub3ZlcmxheT90aGlzLiRvdmVybGF5LmhpZGUoMCxlKTplKCksdGhpcy4kZWxlbWVudC5oaWRlKHRoaXMub3B0aW9ucy5oaWRlRGVsYXkpKSx0aGlzLm9wdGlvbnMuY2xvc2VPbkVzYyYmdCh3aW5kb3cpLm9mZihcImtleWRvd24uemYucmV2ZWFsXCIpLCF0aGlzLm9wdGlvbnMub3ZlcmxheSYmdGhpcy5vcHRpb25zLmNsb3NlT25DbGljayYmdChcImJvZHlcIikub2ZmKFwiY2xpY2suemYucmV2ZWFsXCIpLHRoaXMuJGVsZW1lbnQub2ZmKFwia2V5ZG93bi56Zi5yZXZlYWxcIiksdGhpcy5vcHRpb25zLnJlc2V0T25DbG9zZSYmdGhpcy4kZWxlbWVudC5odG1sKHRoaXMuJGVsZW1lbnQuaHRtbCgpKSx0aGlzLmlzQWN0aXZlPSExLGkub3B0aW9ucy5kZWVwTGluayYmKHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZT93aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoXCJcIixkb2
6780N1bWVudC50aXRsZSx3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpOndpbmRvdy5sb2NhdGlvbi5oYXNoPVwiXCIpfX0se2tleTpcInRvZ2dsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2ZT90aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm92ZXJsYXkmJih0aGlzLiRlbGVtZW50LmFwcGVuZFRvKHQoXCJib2R5XCIpKSx0aGlzLiRvdmVybGF5LmhpZGUoKS5vZmYoKS5yZW1vdmUoKSksdGhpcy4kZWxlbWVudC5oaWRlKCkub2ZmKCksdGhpcy4kYW5jaG9yLm9mZihcIi56ZlwiKSx0KHdpbmRvdykub2ZmKFwiLnpmLnJldmVhbDpcIit0aGlzLmlkKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGl9KCk7aS5kZWZhdWx0cz17YW5pbWF0aW9uSW46XCJcIixhbmltYXRpb25PdXQ6XCJcIixzaG93RGVsYXk6MCxoaWRlRGVsYXk6MCxjbG9zZU9uQ2xpY2s6ITAsY2xvc2VPbkVzYzohMCxtdWx0aXBsZU9wZW5lZDohMSx2T2Zmc2V0OlwiYXV0b1wiLGhPZmZzZXQ6XCJhdXRvXCIsZnVsbFNjcmVlbjohMSxidG1PZmZzZXRQY3Q6MTAsb3ZlcmxheTohMCxyZXNldE9uQ2xvc2U6ITEsZGVlcExpbms6ITF9LEZvdW5kYXRpb24ucGx1Z2luKGksXCJSZXZlYWxcIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIHQvZX1mdW5jdGlvbiBpKHQsZSxpLG4pe3JldHVybiBNYXRoLmFicyh0LnBvc2l0aW9uKClbZV0rdFtuXSgpLzItaSl9dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUsaSl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsbiksdGhpcy4kZWxlbWVudD1lLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxuLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLGkpLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJTbGlkZXJcIiksRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcihcIlNsaWRlclwiLHtsdHI6e0FSUk9XX1JJR0hUOlwiaW5jcmVhc2VcIixBUlJPV19VUDpcImluY3JlYXNlXCIsQVJST1dfRE9XTjpcImRlY3JlYXNlXCIsQVJST1dfTEVGVDpcImRlY3JlYXNlXCIsU0hJRlRfQVJST1dfUklHSFQ6XCJpbmNyZWFzZV9mYXN0XCIsU0hJRlRfQVJST1dfVVA6XCJpbmNyZWFzZV9mYXN0XCIsU0hJRlRfQVJST1dfRE9XTjpcImRlY3JlYXNlX2Zhc3RcIixTSElGVF9BUlJPV19MRUZUOlwiZGVjcmVhc2VfZmFzdFwifSxydGw6e0FSUk9XX0xFRlQ6XCJpbmNyZWFzZVwiLEFSUk9XX1JJR0hUOlwiZGVjcmVhc2VcIixTSElGVF9BUlJPV19MRUZUOlwiaW5jcmVhc2VfZmFzdFwiLFNISUZUX0FSUk9XX1JJR0hUOlwiZGVjcmVhc2VfZmFzdFwifX0pfXJldHVybiBfY3JlYXRlQ2xhc3Mobixbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmlucHV0cz10aGlzLiRlbGVtZW50LmZpbmQoXCJpbnB1dFwiKSx0aGlzLmhhbmRsZXM9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtc2xpZGVyLWhhbmRsZV1cIiksdGhpcy4kaGFuZGxlPXRoaXMuaGFuZGxlcy5lcSgwKSx0aGlzLiRpbnB1dD10aGlzLmlucHV0cy5sZW5ndGg/dGhpcy5pbnB1dHMuZXEoMCk6dChcIiNcIit0aGlzLiRoYW5kbGUuYXR0cihcImFyaWEtY29udHJvbHNcIikpLHRoaXMuJGZpbGw9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtc2xpZGVyLWZpbGxdXCIpLmNzcyh0aGlzLm9wdGlvbnMudmVydGljYWw/XCJoZWlnaHRcIjpcIndpZHRoXCIsMCk7dmFyIGU9ITEsaT10aGlzOyh0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3ModGhpcy5vcHRpb25zLmRpc2FibGVkQ2xhc3MpKSYmKHRoaXMub3B0aW9ucy5kaXNhYmxlZD0hMCx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5kaXNhYmxlZENsYXNzKSksdGhpcy5pbnB1dHMubGVuZ3RofHwodGhpcy5pbnB1dHM9dCgpLmFkZCh0aGlzLiRpbnB1dCksdGhpcy5vcHRpb25zLmJpbmRpbmc9ITApLHRoaXMuX3NldEluaXRBdHRyKDApLHRoaXMuX2V2ZW50cyh0aGlzLiRoYW5kbGUpLHRoaXMuaGFuZGxlc1sxXSYmKHRoaXMub3B0aW9ucy5kb3VibGVTaWRlZD0hMCx0aGlzLiRoYW5kbGUyPXRoaXMuaGFuZGxlcy5lcSgxKSx0aGlzLiRpbnB1dDI9dGhpcy5pbnB1dHMubGVuZ3RoPjE/dGhpcy5pbnB1dHMuZXEoMSk6dChcIiNcIit0aGlzLiRoYW5kbGUyLmF0dHIoXCJhcmlhLWNvbnRyb2xzXCIpKSx0aGlzLmlucHV0c1sxXXx8KHRoaXMuaW5wdXRzPXRoaXMuaW5wdXRzLmFkZCh0aGlzLiRpbnB1dDIpKSxlPSEwLHRoaXMuX3NldEhhbmRsZVBvcyh0aGlzLiRoYW5kbGUsdGhpcy5vcHRpb25zLmluaXRpYWxTdGFydCwhMCxmdW5jdGlvbigpe2kuX3NldEhhbmRsZVBvcyhpLiRoYW5kbGUyLGkub3B0aW9ucy5pbml0aWFsRW5kLCEwKX0pLHRoaXMuX3NldEluaXRBdHRyKDEpLHRoaXMuX2V2ZW50cyh0aGlzLiRoYW5kbGUyKSksZXx8dGhpcy5fc2V0SGFuZGxlUG9zKHRoaXMuJGhhbmRsZSx0aGlzLm9wdGlvbnMuaW5pdGlhbFN0YXJ0LCEwKX19LHtrZXk6XCJfc2V0SGFuZGxlUG9zXCIsdmFsdWU6ZnVuY3Rpb24odCxpLG4scyl7aT1wYXJzZUZsb2F0KGkpLGk8dGhpcy5vcHRpb25zLnN0YXJ0P2k9dGhpcy5vcHRpb25zLnN0YXJ0Omk+dGhpcy5vcHRpb25zLmVuZCYmKGk9dGhpcy5vcHRpb25zLmVuZCk7dmFyIG89dGhpcy5vcHRpb25zLmRvdWJsZVNpZGVkO2lmKG8paWYoMD09PXRoaXMuaGFuZGxlcy5pbmRleCh0KSl7dmFyIGE9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGUyLmF0dHIoXCJhcmlhLXZhbHVlbm93XCIpKTtpPWk+PWE/YS10aGlzLm9wdGlvbnMuc3RlcDppfWVsc2V7dmFyIHI9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGUuYXR0cihcImFyaWEtdmFsdWVub3dcIikpO2k9cj49aT9yK3RoaXMub3B0aW9ucy5zdGVwOml9dGhpcy5vcHRpb25zLnZlcnRpY2FsJiYhbiYmKGk9dGhpcy5vcHRpb25zLmVuZC1pKTt2YXIgbD10aGlzLHU9dGhpcy5vcHRpb25zLnZlcnRpY2FsLGQ9dT9cImhlaWdodFwiOlwid2lkdGhcIixoPXU/XCJ0b3BcIjpcImxlZnRcIixjPXRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0sZj10aGlzLiRlbGVtZW50WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHA9ZShpLXRoaXMub3B0aW9ucy5zdGFydCx0aGlzLm9wdGlvbnMuZW5kLXRoaXMub3B0aW9ucy5zdGFydCkudG9GaXhlZCgyKSxtPShmLWMpKnAsdj0oMTAwKmUobSxmKSkudG9GaXhlZCh0aGlzLm9wdGlvbnMuZGVjaW1hbCk7aT1wYXJzZU
6780Zsb2F0KGkudG9GaXhlZCh0aGlzLm9wdGlvbnMuZGVjaW1hbCkpO3ZhciBnPXt9O2lmKHRoaXMuX3NldFZhbHVlcyh0LGkpLG8pe3ZhciB3LHk9MD09PXRoaXMuaGFuZGxlcy5pbmRleCh0KSxiPX5+KDEwMCplKGMsZikpO2lmKHkpZ1toXT12K1wiJVwiLHc9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGUyWzBdLnN0eWxlW2hdKS12K2IscyYmXCJmdW5jdGlvblwiPT10eXBlb2YgcyYmcygpO2Vsc2V7dmFyICQ9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGVbMF0uc3R5bGVbaF0pO3c9di0oaXNOYU4oJCk/dGhpcy5vcHRpb25zLmluaXRpYWxTdGFydC8oKHRoaXMub3B0aW9ucy5lbmQtdGhpcy5vcHRpb25zLnN0YXJ0KS8xMDApOiQpK2J9Z1tcIm1pbi1cIitkXT13K1wiJVwifXRoaXMuJGVsZW1lbnQub25lKFwiZmluaXNoZWQuemYuYW5pbWF0ZVwiLGZ1bmN0aW9uKCl7bC4kZWxlbWVudC50cmlnZ2VyKFwibW92ZWQuemYuc2xpZGVyXCIsW3RdKX0pO3ZhciBDPXRoaXMuJGVsZW1lbnQuZGF0YShcImRyYWdnaW5nXCIpPzFlMy82MDp0aGlzLm9wdGlvbnMubW92ZVRpbWU7Rm91bmRhdGlvbi5Nb3ZlKEMsdCxmdW5jdGlvbigpe3QuY3NzKGgsditcIiVcIiksbC5vcHRpb25zLmRvdWJsZVNpZGVkP2wuJGZpbGwuY3NzKGcpOmwuJGZpbGwuY3NzKGQsMTAwKnArXCIlXCIpfSksY2xlYXJUaW1lb3V0KGwudGltZW91dCksbC50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLiRlbGVtZW50LnRyaWdnZXIoXCJjaGFuZ2VkLnpmLnNsaWRlclwiLFt0XSl9LGwub3B0aW9ucy5jaGFuZ2VkRGVsYXkpfX0se2tleTpcIl9zZXRJbml0QXR0clwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5wdXRzLmVxKHQpLmF0dHIoXCJpZFwiKXx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwic2xpZGVyXCIpO3RoaXMuaW5wdXRzLmVxKHQpLmF0dHIoe2lkOmUsbWF4OnRoaXMub3B0aW9ucy5lbmQsbWluOnRoaXMub3B0aW9ucy5zdGFydCxzdGVwOnRoaXMub3B0aW9ucy5zdGVwfSksdGhpcy5oYW5kbGVzLmVxKHQpLmF0dHIoe3JvbGU6XCJzbGlkZXJcIixcImFyaWEtY29udHJvbHNcIjplLFwiYXJpYS12YWx1ZW1heFwiOnRoaXMub3B0aW9ucy5lbmQsXCJhcmlhLXZhbHVlbWluXCI6dGhpcy5vcHRpb25zLnN0YXJ0LFwiYXJpYS12YWx1ZW5vd1wiOjA9PT10P3RoaXMub3B0aW9ucy5pbml0aWFsU3RhcnQ6dGhpcy5vcHRpb25zLmluaXRpYWxFbmQsXCJhcmlhLW9yaWVudGF0aW9uXCI6dGhpcy5vcHRpb25zLnZlcnRpY2FsP1widmVydGljYWxcIjpcImhvcml6b250YWxcIix0YWJpbmRleDowfSl9fSx7a2V5OlwiX3NldFZhbHVlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb25zLmRvdWJsZVNpZGVkP3RoaXMuaGFuZGxlcy5pbmRleCh0KTowO3RoaXMuaW5wdXRzLmVxKGkpLnZhbChlKSx0LmF0dHIoXCJhcmlhLXZhbHVlbm93XCIsZSl9fSx7a2V5OlwiX2hhbmRsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxuLHMpe3ZhciBvLGE7aWYocylvPXRoaXMuX2FkanVzdFZhbHVlKG51bGwscyksYT0hMDtlbHNle3QucHJldmVudERlZmF1bHQoKTt2YXIgcj10aGlzLGw9dGhpcy5vcHRpb25zLnZlcnRpY2FsLHU9bD9cImhlaWdodFwiOlwid2lkdGhcIixkPWw/XCJ0b3BcIjpcImxlZnRcIixoPWw/dC5wYWdlWTp0LnBhZ2VYLGM9dGhpcy4kaGFuZGxlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3VdLzIsZj10aGlzLiRlbGVtZW50WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3VdLHA9dGhpcy4kZWxlbWVudC5vZmZzZXQoKVtkXS1oLG09cD4wPy1jOi1mPnAtYz9mOk1hdGguYWJzKHApLHY9ZShtLGYpO2lmKG89KHRoaXMub3B0aW9ucy5lbmQtdGhpcy5vcHRpb25zLnN0YXJ0KSp2K3RoaXMub3B0aW9ucy5zdGFydCxGb3VuZGF0aW9uLnJ0bCgpJiYhdGhpcy5vcHRpb25zLnZlcnRpY2FsJiYobz10aGlzLm9wdGlvbnMuZW5kLW8pLG89ci5fYWRqdXN0VmFsdWUobnVsbCxvKSxhPSExLCFuKXt2YXIgZz1pKHRoaXMuJGhhbmRsZSxkLG0sdSksdz1pKHRoaXMuJGhhbmRsZTIsZCxtLHUpO249dz49Zz90aGlzLiRoYW5kbGU6dGhpcy4kaGFuZGxlMn19dGhpcy5fc2V0SGFuZGxlUG9zKG4sbyxhKX19LHtrZXk6XCJfYWRqdXN0VmFsdWVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpLG4scyxvLGE9dGhpcy5vcHRpb25zLnN0ZXAscj1wYXJzZUZsb2F0KGEvMik7cmV0dXJuIGk9dD9wYXJzZUZsb2F0KHQuYXR0cihcImFyaWEtdmFsdWVub3dcIikpOmUsbj1pJWEscz1pLW4sbz1zK2EsMD09PW4/aTppPWk+PXMrcj9vOnN9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZClyZXR1cm4hMTt2YXIgaSxuPXRoaXM7aWYodGhpcy5pbnB1dHMub2ZmKFwiY2hhbmdlLnpmLnNsaWRlclwiKS5vbihcImNoYW5nZS56Zi5zbGlkZXJcIixmdW5jdGlvbihlKXt2YXIgaT1uLmlucHV0cy5pbmRleCh0KHRoaXMpKTtuLl9oYW5kbGVFdmVudChlLG4uaGFuZGxlcy5lcShpKSx0KHRoaXMpLnZhbCgpKX0pLHRoaXMub3B0aW9ucy5jbGlja1NlbGVjdCYmdGhpcy4kZWxlbWVudC5vZmYoXCJjbGljay56Zi5zbGlkZXJcIikub24oXCJjbGljay56Zi5zbGlkZXJcIixmdW5jdGlvbihlKXtyZXR1cm4gbi4kZWxlbWVudC5kYXRhKFwiZHJhZ2dpbmdcIik/ITE6dm9pZCh0KGUudGFyZ2V0KS5pcyhcIltkYXRhLXNsaWRlci1oYW5kbGVdXCIpfHwobi5vcHRpb25zLmRvdWJsZVNpZGVkP24uX2hhbmRsZUV2ZW50KGUpOm4uX2hhbmRsZUV2ZW50KGUsbi4kaGFuZGxlKSkpfSksdGhpcy5vcHRpb25zLmRyYWdnYWJsZSl7dGhpcy5oYW5kbGVzLmFkZFRvdWNoKCk7dmFyIHM9dChcImJvZHlcIik7ZS5vZmYoXCJtb3VzZWRvd24uemYuc2xpZGVyXCIpLm9uKFwibW91c2Vkb3duLnpmLnNsaWRlclwiLGZ1bmN0aW9uKG8pe2UuYWRkQ2xhc3MoXCJpcy1kcmFnZ2luZ1wiKSxuLiRmaWxsLmFkZENsYXNzKFwiaXMtZHJhZ2dpbmdcIiksbi4kZWxlbWVudC5kYXRhKFwiZHJhZ2dpbmdcIiwhMCksaT10KG8uY3VycmVudFRhcmdldCkscy5vbihcIm1vdXNlbW92ZS56Zi5zbGlkZXJcIixmdW5jdGlvbih0KXt0LnByZXZlbn
6780REZWZhdWx0KCksbi5faGFuZGxlRXZlbnQodCxpKX0pLm9uKFwibW91c2V1cC56Zi5zbGlkZXJcIixmdW5jdGlvbih0KXtuLl9oYW5kbGVFdmVudCh0LGkpLGUucmVtb3ZlQ2xhc3MoXCJpcy1kcmFnZ2luZ1wiKSxuLiRmaWxsLnJlbW92ZUNsYXNzKFwiaXMtZHJhZ2dpbmdcIiksbi4kZWxlbWVudC5kYXRhKFwiZHJhZ2dpbmdcIiwhMSkscy5vZmYoXCJtb3VzZW1vdmUuemYuc2xpZGVyIG1vdXNldXAuemYuc2xpZGVyXCIpfSl9KX1lLm9mZihcImtleWRvd24uemYuc2xpZGVyXCIpLm9uKFwia2V5ZG93bi56Zi5zbGlkZXJcIixmdW5jdGlvbihlKXt2YXIgaSxzPXQodGhpcyksbz1uLm9wdGlvbnMuZG91YmxlU2lkZWQ/bi5oYW5kbGVzLmluZGV4KHMpOjAsYT1wYXJzZUZsb2F0KG4uaW5wdXRzLmVxKG8pLnZhbCgpKTtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLFwiU2xpZGVyXCIse2RlY3JlYXNlOmZ1bmN0aW9uKCl7aT1hLW4ub3B0aW9ucy5zdGVwfSxpbmNyZWFzZTpmdW5jdGlvbigpe2k9YStuLm9wdGlvbnMuc3RlcH0sZGVjcmVhc2VfZmFzdDpmdW5jdGlvbigpe2k9YS0xMCpuLm9wdGlvbnMuc3RlcH0saW5jcmVhc2VfZmFzdDpmdW5jdGlvbigpe2k9YSsxMCpuLm9wdGlvbnMuc3RlcH0saGFuZGxlZDpmdW5jdGlvbigpe2UucHJldmVudERlZmF1bHQoKSxuLl9zZXRIYW5kbGVQb3MocyxpLCEwKX19KX0pfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlcy5vZmYoXCIuemYuc2xpZGVyXCIpLHRoaXMuaW5wdXRzLm9mZihcIi56Zi5zbGlkZXJcIiksdGhpcy4kZWxlbWVudC5vZmYoXCIuemYuc2xpZGVyXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksbn0oKTtuLmRlZmF1bHRzPXtzdGFydDowLGVuZDoxMDAsc3RlcDoxLGluaXRpYWxTdGFydDowLGluaXRpYWxFbmQ6MTAwLGJpbmRpbmc6ITEsY2xpY2tTZWxlY3Q6ITAsdmVydGljYWw6ITEsZHJhZ2dhYmxlOiEwLGRpc2FibGVkOiExLGRvdWJsZVNpZGVkOiExLGRlY2ltYWw6Mixtb3ZlVGltZToyMDAsZGlzYWJsZWRDbGFzczpcImRpc2FibGVkXCIsaW52ZXJ0VmVydGljYWw6ITEsY2hhbmdlZERlbGF5OjUwMH0sRm91bmRhdGlvbi5wbHVnaW4obixcIlNsaWRlclwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksbnVsbCkuZm9udFNpemUsMTApKnR9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKGUsbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsaSksdGhpcy4kZWxlbWVudD1lLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxpLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJTdGlja3lcIil9cmV0dXJuIF9jcmVhdGVDbGFzcyhpLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJGVsZW1lbnQucGFyZW50KFwiW2RhdGEtc3RpY2t5LWNvbnRhaW5lcl1cIiksaT10aGlzLiRlbGVtZW50WzBdLmlkfHxGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsXCJzdGlja3lcIiksbj10aGlzO2UubGVuZ3RofHwodGhpcy53YXNXcmFwcGVkPSEwKSx0aGlzLiRjb250YWluZXI9ZS5sZW5ndGg/ZTp0KHRoaXMub3B0aW9ucy5jb250YWluZXIpLndyYXBJbm5lcih0aGlzLiRlbGVtZW50KSx0aGlzLiRjb250YWluZXIuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmNvbnRhaW5lckNsYXNzKSx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5zdGlja3lDbGFzcykuYXR0cih7XCJkYXRhLXJlc2l6ZVwiOml9KSx0aGlzLnNjcm9sbENvdW50PXRoaXMub3B0aW9ucy5jaGVja0V2ZXJ5LHRoaXMuaXNTdHVjaz0hMSx0KHdpbmRvdykub25lKFwibG9hZC56Zi5zdGlja3lcIixmdW5jdGlvbigpe1wiXCIhPT1uLm9wdGlvbnMuYW5jaG9yP24uJGFuY2hvcj10KFwiI1wiK24ub3B0aW9ucy5hbmNob3IpOm4uX3BhcnNlUG9pbnRzKCksbi5fc2V0U2l6ZXMoZnVuY3Rpb24oKXtuLl9jYWxjKCExKX0pLG4uX2V2ZW50cyhpLnNwbGl0KFwiLVwiKS5yZXZlcnNlKCkuam9pbihcIi1cIikpfSl9fSx7a2V5OlwiX3BhcnNlUG9pbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMudG9wQW5jaG9yLGk9dGhpcy5vcHRpb25zLmJ0bUFuY2hvcixuPVtlLGldLHM9e307aWYoZSYmaSlmb3IodmFyIG89MCxhPW4ubGVuZ3RoO2E+byYmbltvXTtvKyspe3ZhciByO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBuW29dKXI9bltvXTtlbHNle3ZhciBsPW5bb10uc3BsaXQoXCI6XCIpLHU9dChcIiNcIitsWzBdKTtyPXUub2Zmc2V0KCkudG9wLGxbMV0mJlwiYm90dG9tXCI9PT1sWzFdLnRvTG93ZXJDYXNlKCkmJihyKz11WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCl9c1tvXT1yfWVsc2Ugcz17MDoxLDE6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodH07dGhpcy5wb2ludHM9c319LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcyxuPXRoaXMuc2Nyb2xsTGlzdGVuZXI9XCJzY3JvbGwuemYuXCIrZTt0aGlzLmlzT258fCh0aGlzLmNhblN0aWNrJiYodGhpcy5pc09uPSEwLHQod2luZG93KS5vZmYobikub24obixmdW5jdGlvbih0KXswPT09aS5zY3JvbGxDb3VudD8oaS5zY3JvbGxDb3VudD1pLm9wdGlvbnMuY2hlY2tFdmVyeSxpLl9zZXRTaXplcyhmdW5jdGlvbigpe2kuX2NhbGMoITEsd2luZG93LnBhZ2VZT2Zmc2V0KX0pKTooaS5zY3JvbGxDb3VudC0tLGkuX2NhbGMoITEsd2luZG93LnBhZ2VZT2Zmc2V0KSl9KSksdGhpcy4kZWxlbWVudC5vZmYoXCJyZXNpemVtZS56Zi50cmlnZ2VyXCIpLm9uKFwicmVzaXplbWUuemYudHJpZ2dlclwiLGZ1bmN0aW9uKHQscyl7aS5fc2V0U2l6ZXMoZnVuY3Rpb24oKXtpLl9jYWxjKCExKSxpLmNhblN0aWNrP2kuaXNPbnx8aS5fZXZlbnRzKGUpOmkuaXNPbiYmaS5fcGF1c2VMaXN0ZW5lcnMobil9KX0pKX19LHtrZXk6XCJfcGF1c2VMaXN0ZW5lcnNcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmlzT249ITEsdCh3aW5kb3cpLm9mZihlKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJwYXVzZS56Zi5zdGlja3lcIil9fSx7a2V5OlwiX2NhbGNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0aGlzLl9zZXRTaXplcygpLHRoaXMuY2FuU3RpY2s/KGV8fChlPXdpbmRvdy5wYWdlWU9mZnNldCksdm9pZChlPj10aGlzLnRvcFBvaW50P2U8PXRoaXMuYm90dG9tUG9pbnQ/dGhpcy5pc1N0dWNrfHx0aGlzLl9zZXRTdGlja3koKTp0aGlzLmlzU3R1Y2smJnRoaXMuX3JlbW92ZVN0aWNreSghMSk6dGhpcy5pc1N0dWNrJiZ0aGlzLl9yZW1vdmVTdGlja3koITApKSk6KHRoaXMuaXNTdHVjayYmdGhpcy5fcmVtb3ZlU3RpY2t5KCEwKSwhMSl9fSx7a2V5OlwiX3NldFN0aWNreVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnN0aWNrVG8sZT1cInRvcFwiPT09dD9cIm1hcmdpblRvcFwiOlwibWFyZ2luQm90dG9tXCIsaT1cInRvcFwiPT09dD9cImJvdHRvbVwiOlwidG9wXCIsbj17fTtuW2VdPXRoaXMub3B0aW9uc1tlXStcImVtXCIsblt0XT0wLG5baV09XCJhdXRvXCIsbi5sZWZ0PXRoaXMuJGNvbnRhaW5lci5vZmZzZXQoKS5sZWZ0K3BhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuJGNvbnRhaW5lclswXSlbXCJwYWRkaW5nLWxlZnRcIl0sMTApLHRoaXMuaXNTdHVjaz0hMCx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKFwiaXMtYW5jaG9yZWQgaXMtYXQtXCIraSkuYWRk
6780Q2xhc3MoXCJpcy1zdHVjayBpcy1hdC1cIit0KS5jc3MobikudHJpZ2dlcihcInN0aWNreS56Zi5zdHVja3RvOlwiK3QpfX0se2tleTpcIl9yZW1vdmVTdGlja3lcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuc3RpY2tUbyxpPVwidG9wXCI9PT1lLG49e30scz0odGhpcy5wb2ludHM/dGhpcy5wb2ludHNbMV0tdGhpcy5wb2ludHNbMF06dGhpcy5hbmNob3JIZWlnaHQpLXRoaXMuZWxlbUhlaWdodCxvPWk/XCJtYXJnaW5Ub3BcIjpcIm1hcmdpbkJvdHRvbVwiLGE9aT9cImJvdHRvbVwiOlwidG9wXCIscj10P1widG9wXCI6XCJib3R0b21cIjtuW29dPTAsdCYmIWl8fGkmJiF0PyhuW2VdPXMsblthXT0wKToobltlXT0wLG5bYV09cyksbi5sZWZ0PVwiXCIsdGhpcy5pc1N0dWNrPSExLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJpcy1zdHVjayBpcy1hdC1cIitlKS5hZGRDbGFzcyhcImlzLWFuY2hvcmVkIGlzLWF0LVwiK3IpLmNzcyhuKS50cmlnZ2VyKFwic3RpY2t5LnpmLnVuc3R1Y2tmcm9tOlwiK3IpfX0se2tleTpcIl9zZXRTaXplc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY2FuU3RpY2s9Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QodGhpcy5vcHRpb25zLnN0aWNreU9uKSx0aGlzLmNhblN0aWNrfHx0KCk7dmFyIGU9dGhpcy4kY29udGFpbmVyWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy4kY29udGFpbmVyWzBdKSxuPXBhcnNlSW50KGlbXCJwYWRkaW5nLXJpZ2h0XCJdLDEwKTt0aGlzLiRhbmNob3ImJnRoaXMuJGFuY2hvci5sZW5ndGg/dGhpcy5hbmNob3JIZWlnaHQ9dGhpcy4kYW5jaG9yWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDp0aGlzLl9wYXJzZVBvaW50cygpLHRoaXMuJGVsZW1lbnQuY3NzKHtcIm1heC13aWR0aFwiOmUtbitcInB4XCJ9KTt2YXIgcz10aGlzLiRlbGVtZW50WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodHx8dGhpcy5jb250YWluZXJIZWlnaHQ7dGhpcy5jb250YWluZXJIZWlnaHQ9cyx0aGlzLiRjb250YWluZXIuY3NzKHtoZWlnaHQ6c30pLHRoaXMuZWxlbUhlaWdodD1zLHRoaXMuaXNTdHVjayYmdGhpcy4kZWxlbWVudC5jc3Moe2xlZnQ6dGhpcy4kY29udGFpbmVyLm9mZnNldCgpLmxlZnQrcGFyc2VJbnQoaVtcInBhZGRpbmctbGVmdFwiXSwxMCl9KSx0aGlzLl9zZXRCcmVha1BvaW50cyhzLGZ1bmN0aW9uKCl7dCYmdCgpfSl9fSx7a2V5OlwiX3NldEJyZWFrUG9pbnRzXCIsdmFsdWU6ZnVuY3Rpb24odCxpKXtpZighdGhpcy5jYW5TdGljayl7aWYoIWkpcmV0dXJuITE7aSgpfXZhciBuPWUodGhpcy5vcHRpb25zLm1hcmdpblRvcCkscz1lKHRoaXMub3B0aW9ucy5tYXJnaW5Cb3R0b20pLG89dGhpcy5wb2ludHM/dGhpcy5wb2ludHNbMF06dGhpcy4kYW5jaG9yLm9mZnNldCgpLnRvcCxhPXRoaXMucG9pbnRzP3RoaXMucG9pbnRzWzFdOm8rdGhpcy5hbmNob3JIZWlnaHQscj13aW5kb3cuaW5uZXJIZWlnaHQ7XCJ0b3BcIj09PXRoaXMub3B0aW9ucy5zdGlja1RvPyhvLT1uLGEtPXQrbik6XCJib3R0b21cIj09PXRoaXMub3B0aW9ucy5zdGlja1RvJiYoby09ci0odCtzKSxhLT1yLXMpLHRoaXMudG9wUG9pbnQ9byx0aGlzLmJvdHRvbVBvaW50PWEsaSYmaSgpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZVN0aWNreSghMCksdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuc3RpY2t5Q2xhc3MrXCIgaXMtYW5jaG9yZWQgaXMtYXQtdG9wXCIpLmNzcyh7aGVpZ2h0OlwiXCIsdG9wOlwiXCIsYm90dG9tOlwiXCIsXCJtYXgtd2lkdGhcIjpcIlwifSkub2ZmKFwicmVzaXplbWUuemYudHJpZ2dlclwiKSx0aGlzLiRhbmNob3Iub2ZmKFwiY2hhbmdlLnpmLnN0aWNreVwiKSx0KHdpbmRvdykub2ZmKHRoaXMuc2Nyb2xsTGlzdGVuZXIpLHRoaXMud2FzV3JhcHBlZD90aGlzLiRlbGVtZW50LnVud3JhcCgpOnRoaXMuJGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuY29udGFpbmVyQ2xhc3MpLmNzcyh7aGVpZ2h0OlwiXCJ9KSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGl9KCk7aS5kZWZhdWx0cz17Y29udGFpbmVyOlwiPGRpdiBkYXRhLXN0aWNreS1jb250YWluZXI+PC9kaXY+XCIsc3RpY2tUbzpcInRvcFwiLGFuY2hvcjpcIlwiLHRvcEFuY2hvcjpcIlwiLGJ0bUFuY2hvcjpcIlwiLG1hcmdpblRvcDoxLG1hcmdpbkJvdHRvbToxLHN0aWNreU9uOlwibWVkaXVtXCIsc3RpY2t5Q2xhc3M6XCJzdGlja3lcIixjb250YWluZXJDbGFzczpcInN0aWNreS1jb250YWluZXJcIixjaGVja0V2ZXJ5Oi0xfSxGb3VuZGF0aW9uLnBsdWdpbihpLFwiU3RpY2t5XCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJUYWJzXCIpLEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoXCJUYWJzXCIse0VOVEVSOlwib3BlblwiLFNQQUNFOlwib3BlblwiLEFSUk9XX1JJR0hUOlwibmV4dFwiLEFSUk9XX1VQOlwicHJldmlvdXNcIixBUlJPV19ET1dOOlwibmV4dFwiLEFSUk9XX0xFRlQ6XCJwcmV2aW91c1wifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXM7aWYodGhpcy4kdGFiVGl0bGVzPXRoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMubGlua0NsYXNzKSx0aGlzLiR0YWJDb250ZW50PXQoJ1tkYXRhLXRhYnMtY29udGVudD1cIicrdGhpcy4kZWxlbWVudFswXS5pZCsnXCJdJyksdGhpcy4kdGFiVGl0bGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLG49aS5maW5kKFwiYVwiKSxzPWkuaGFzQ2xhc3MoXCJpcy1hY3RpdmVcIiksbz1uWzBdLmhhc2guc2xpY2UoMSksYT1uWzBdLmlkP25bMF0uaWQ6bytcIi1sYWJlbFwiLHI9dChcIiNcIitvKTtpLmF0dHIoe3JvbGU6XCJwcmVzZW50YXRpb25cIn0pLG4uYXR0cih7cm9sZTpcInRhYlwiLFwiYXJpYS1jb250cm9sc1wiOm8sXCJhcmlhLXNlbGVjdGVkXCI6cyxpZDphfSksci5hdHRyKHtyb2xlOlwidGFicGFuZWxcIixcImFyaWEtaGlkZGVuXCI6IXMsXCJhcmlhLWxhYmVsbGVkYnlcIjphfSkscyYmZS5vcHRpb25zLmF1dG9Gb2N1cyYmbi5mb2N1cygpfSksdGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0KXt2YXIgaT10aGlzLiR0YWJDb250ZW50LmZpbmQoXCJpbWdcIik7aS5sZW5ndGg/Rm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZChpLHRoaXMuX3NldEhlaWdodC5iaW5kKHRoaXMpKTp0aGlzLl9zZXRIZWlnaHQoKX10aGlzLl9ldmVudHMoKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9hZGRLZXlIYW5kbGVyKCksdGhpcy5fYWRkQ2xpY2tIYW5kbGVyKCksdGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0JiZ0KHdpbmRvdykub24oXCJjaGFuZ2VkLnpmLm1lZGlhcXVlcnlcIix0aGlzLl9zZXRIZWlnaHQuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2FkZENsaWNrSGFuZGxlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRlbGVtZW50Lm9mZihcImNsaWNrLnpmLnRhYnNcIikub24oXCJjbGljay56Zi50YWJzXCIsXCIuXCIrdGh
6780pcy5vcHRpb25zLmxpbmtDbGFzcyxmdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCksaS5zdG9wUHJvcGFnYXRpb24oKSx0KHRoaXMpLmhhc0NsYXNzKFwiaXMtYWN0aXZlXCIpfHxlLl9oYW5kbGVUYWJDaGFuZ2UodCh0aGlzKSl9KX19LHtrZXk6XCJfYWRkS2V5SGFuZGxlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLiRlbGVtZW50LmZpbmQoXCJsaTpmaXJzdC1vZi10eXBlXCIpLGUuJGVsZW1lbnQuZmluZChcImxpOmxhc3Qtb2YtdHlwZVwiKTt0aGlzLiR0YWJUaXRsZXMub2ZmKFwia2V5ZG93bi56Zi50YWJzXCIpLm9uKFwia2V5ZG93bi56Zi50YWJzXCIsZnVuY3Rpb24oaSl7aWYoOSE9PWkud2hpY2gpe2kuc3RvcFByb3BhZ2F0aW9uKCksaS5wcmV2ZW50RGVmYXVsdCgpO1xudmFyIG4scyxvPXQodGhpcyksYT1vLnBhcmVudChcInVsXCIpLmNoaWxkcmVuKFwibGlcIik7YS5lYWNoKGZ1bmN0aW9uKGkpe3JldHVybiB0KHRoaXMpLmlzKG8pP3ZvaWQoZS5vcHRpb25zLndyYXBPbktleXM/KG49MD09PWk/YS5sYXN0KCk6YS5lcShpLTEpLHM9aT09PWEubGVuZ3RoLTE/YS5maXJzdCgpOmEuZXEoaSsxKSk6KG49YS5lcShNYXRoLm1heCgwLGktMSkpLHM9YS5lcShNYXRoLm1pbihpKzEsYS5sZW5ndGgtMSkpKSk6dm9pZCAwfSksRm91bmRhdGlvbi5LZXlib2FyZC5oYW5kbGVLZXkoaSxcIlRhYnNcIix7b3BlbjpmdW5jdGlvbigpe28uZmluZCgnW3JvbGU9XCJ0YWJcIl0nKS5mb2N1cygpLGUuX2hhbmRsZVRhYkNoYW5nZShvKX0scHJldmlvdXM6ZnVuY3Rpb24oKXtuLmZpbmQoJ1tyb2xlPVwidGFiXCJdJykuZm9jdXMoKSxlLl9oYW5kbGVUYWJDaGFuZ2Uobil9LG5leHQ6ZnVuY3Rpb24oKXtzLmZpbmQoJ1tyb2xlPVwidGFiXCJdJykuZm9jdXMoKSxlLl9oYW5kbGVUYWJDaGFuZ2Uocyl9fSl9fSl9fSx7a2V5OlwiX2hhbmRsZVRhYkNoYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPWUuZmluZCgnW3JvbGU9XCJ0YWJcIl0nKSxuPWlbMF0uaGFzaCxzPXRoaXMuJHRhYkNvbnRlbnQuZmluZChuKSxvPXRoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMubGlua0NsYXNzK1wiLmlzLWFjdGl2ZVwiKS5yZW1vdmVDbGFzcyhcImlzLWFjdGl2ZVwiKS5maW5kKCdbcm9sZT1cInRhYlwiXScpLmF0dHIoe1wiYXJpYS1zZWxlY3RlZFwiOlwiZmFsc2VcIn0pO3QoXCIjXCIrby5hdHRyKFwiYXJpYS1jb250cm9sc1wiKSkucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwifSksZS5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKSxpLmF0dHIoe1wiYXJpYS1zZWxlY3RlZFwiOlwidHJ1ZVwifSkscy5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwiY2hhbmdlLnpmLnRhYnNcIixbZV0pfX0se2tleTpcInNlbGVjdFRhYlwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlO2U9XCJvYmplY3RcIj09dHlwZW9mIHQ/dFswXS5pZDp0LGUuaW5kZXhPZihcIiNcIik8MCYmKGU9XCIjXCIrZSk7dmFyIGk9dGhpcy4kdGFiVGl0bGVzLmZpbmQoJ1tocmVmPVwiJytlKydcIl0nKS5wYXJlbnQoXCIuXCIrdGhpcy5vcHRpb25zLmxpbmtDbGFzcyk7dGhpcy5faGFuZGxlVGFiQ2hhbmdlKGkpfX0se2tleTpcIl9zZXRIZWlnaHRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPTA7dGhpcy4kdGFiQ29udGVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5wYW5lbENsYXNzKS5jc3MoXCJoZWlnaHRcIixcIlwiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKSxuPWkuaGFzQ2xhc3MoXCJpcy1hY3RpdmVcIik7bnx8aS5jc3Moe3Zpc2liaWxpdHk6XCJoaWRkZW5cIixkaXNwbGF5OlwiYmxvY2tcIn0pO3ZhciBzPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O258fGkuY3NzKHt2aXNpYmlsaXR5OlwiXCIsZGlzcGxheTpcIlwifSksZT1zPmU/czplfSkuY3NzKFwiaGVpZ2h0XCIsZStcInB4XCIpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMubGlua0NsYXNzKS5vZmYoXCIuemYudGFic1wiKS5oaWRlKCkuZW5kKCkuZmluZChcIi5cIit0aGlzLm9wdGlvbnMucGFuZWxDbGFzcykuaGlkZSgpLHRoaXMub3B0aW9ucy5tYXRjaEhlaWdodCYmdCh3aW5kb3cpLm9mZihcImNoYW5nZWQuemYubWVkaWFxdWVyeVwiKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGV9KCk7ZS5kZWZhdWx0cz17YXV0b0ZvY3VzOiExLHdyYXBPbktleXM6ITAsbWF0Y2hIZWlnaHQ6ITEsbGlua0NsYXNzOlwidGFicy10aXRsZVwiLHBhbmVsQ2xhc3M6XCJ0YWJzLXBhbmVsXCJ9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJUYWJzXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLGkuZGF0YSgpLG4pLHRoaXMuY2xhc3NOYW1lPVwiXCIsdGhpcy5faW5pdCgpLHRoaXMuX2V2ZW50cygpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIlRvZ2dsZXJcIil9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO3RoaXMub3B0aW9ucy5hbmltYXRlPyhlPXRoaXMub3B0aW9ucy5hbmltYXRlLnNwbGl0KFwiIFwiKSx0aGlzLmFuaW1hdGlvbkluPWVbMF0sdGhpcy5hbmltYXRpb25PdXQ9ZVsxXXx8bnVsbCk6KGU9dGhpcy4kZWxlbWVudC5kYXRhKFwidG9nZ2xlclwiKSx0aGlzLmNsYXNzTmFtZT1cIi5cIj09PWVbMF0/ZS5zbGljZSgxKTplKTt2YXIgaT10aGlzLiRlbGVtZW50WzBdLmlkO3QoJ1tkYXRhLW9wZW49XCInK2krJ1wiXSwgW2RhdGEtY2xvc2U9XCInK2krJ1wiXSwgW2RhdGEtdG9nZ2xlPVwiJytpKydcIl0nKS5hdHRyKFwiYXJpYS1jb250cm9sc1wiLGkpLHRoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtZXhwYW5kZWRcIiwhdGhpcy4kZWxlbWVudC5pcyhcIjpoaWRkZW5cIikpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQub2ZmKFwidG9nZ2xlLnpmLnRyaWdnZXJcIikub24oXCJ0b2dnbGUuemYudHJpZ2dlclwiLHRoaXMudG9nZ2xlLmJpbmQodGhpcykpfX0se2tleTpcInRvZ2dsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpc1t0aGlzLm9wdGlvbnMuYW5pbWF0ZT9cIl90b2dnbGVBbmltYXRlXCI6XCJfdG9nZ2xlQ2xhc3NcIl0oKX19LHtrZXk6XCJfdG9nZ2xlQ2xhc3NcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc05hbWUpO3ZhciB0PXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3ModGhpcy5jbGFzc05hbWUpO3Q/dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwib24uemYudG9nZ2xlclwiKTp0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJvZmYuemYudG9nZ2xlclwiKSx0aGlzLl91cGRhdGVBUklBKHQpfX0se2tleTpcIl90b2dnbGVBbmltYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJGVsZW1lbnQuaXMoXCI6aGlkZGVuXCIpP0ZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVJbih0aGlzLiRlbGVtZW50LHRoaXMuYW5pbWF0aW9uSW4
6780sZnVuY3Rpb24oKXt0Ll91cGRhdGVBUklBKCEwKSx0aGlzLnRyaWdnZXIoXCJvbi56Zi50b2dnbGVyXCIpfSk6Rm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZU91dCh0aGlzLiRlbGVtZW50LHRoaXMuYW5pbWF0aW9uT3V0LGZ1bmN0aW9uKCl7dC5fdXBkYXRlQVJJQSghMSksdGhpcy50cmlnZ2VyKFwib2ZmLnpmLnRvZ2dsZXJcIil9KX19LHtrZXk6XCJfdXBkYXRlQVJJQVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtZXhwYW5kZWRcIiwhIXQpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQub2ZmKFwiLnpmLnRvZ2dsZXJcIiksRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e2FuaW1hdGU6ITF9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJUb2dnbGVyXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuaXNBY3RpdmU9ITEsdGhpcy5pc0NsaWNrPSExLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJUb29sdGlwXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRlbGVtZW50LmF0dHIoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpfHxGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsXCJ0b29sdGlwXCIpO3RoaXMub3B0aW9ucy5wb3NpdGlvbkNsYXNzPXRoaXMuX2dldFBvc2l0aW9uQ2xhc3ModGhpcy4kZWxlbWVudCksdGhpcy5vcHRpb25zLnRpcFRleHQ9dGhpcy5vcHRpb25zLnRpcFRleHR8fHRoaXMuJGVsZW1lbnQuYXR0cihcInRpdGxlXCIpLHRoaXMudGVtcGxhdGU9dGhpcy5vcHRpb25zLnRlbXBsYXRlP3QodGhpcy5vcHRpb25zLnRlbXBsYXRlKTp0aGlzLl9idWlsZFRlbXBsYXRlKGUpLHRoaXMudGVtcGxhdGUuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkudGV4dCh0aGlzLm9wdGlvbnMudGlwVGV4dCkuaGlkZSgpLHRoaXMuJGVsZW1lbnQuYXR0cih7dGl0bGU6XCJcIixcImFyaWEtZGVzY3JpYmVkYnlcIjplLFwiZGF0YS15ZXRpLWJveFwiOmUsXCJkYXRhLXRvZ2dsZVwiOmUsXCJkYXRhLXJlc2l6ZVwiOmV9KS5hZGRDbGFzcyh0aGlzLnRyaWdnZXJDbGFzcyksdGhpcy51c2VkUG9zaXRpb25zPVtdLHRoaXMuY291bnRlcj00LHRoaXMuY2xhc3NDaGFuZ2VkPSExLHRoaXMuX2V2ZW50cygpfX0se2tleTpcIl9nZXRQb3NpdGlvbkNsYXNzXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuXCJcIjt2YXIgZT10WzBdLmNsYXNzTmFtZS5tYXRjaCgvXFxiKHRvcHxsZWZ0fHJpZ2h0KVxcYi9nKTtyZXR1cm4gZT1lP2VbMF06XCJcIn19LHtrZXk6XCJfYnVpbGRUZW1wbGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPSh0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzK1wiIFwiK3RoaXMub3B0aW9ucy5wb3NpdGlvbkNsYXNzK1wiIFwiK3RoaXMub3B0aW9ucy50ZW1wbGF0ZUNsYXNzZXMpLnRyaW0oKSxuPXQoXCI8ZGl2PjwvZGl2PlwiKS5hZGRDbGFzcyhpKS5hdHRyKHtyb2xlOlwidG9vbHRpcFwiLFwiYXJpYS1oaWRkZW5cIjohMCxcImRhdGEtaXMtYWN0aXZlXCI6ITEsXCJkYXRhLWlzLWZvY3VzXCI6ITEsaWQ6ZX0pO3JldHVybiBufX0se2tleTpcIl9yZXBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy51c2VkUG9zaXRpb25zLnB1c2godD90OlwiYm90dG9tXCIpLCF0JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcInRvcFwiKTwwP3RoaXMudGVtcGxhdGUuYWRkQ2xhc3MoXCJ0b3BcIik6XCJ0b3BcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPDA/dGhpcy50ZW1wbGF0ZS5yZW1vdmVDbGFzcyh0KTpcImxlZnRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwicmlnaHRcIik8MD90aGlzLnRlbXBsYXRlLnJlbW92ZUNsYXNzKHQpLmFkZENsYXNzKFwicmlnaHRcIik6XCJyaWdodFwiPT09dCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJsZWZ0XCIpPDA/dGhpcy50ZW1wbGF0ZS5yZW1vdmVDbGFzcyh0KS5hZGRDbGFzcyhcImxlZnRcIik6IXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwidG9wXCIpPi0xJiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImxlZnRcIik8MD90aGlzLnRlbXBsYXRlLmFkZENsYXNzKFwibGVmdFwiKTpcInRvcFwiPT09dCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJib3R0b21cIik+LTEmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwibGVmdFwiKTwwP3RoaXMudGVtcGxhdGUucmVtb3ZlQ2xhc3ModCkuYWRkQ2xhc3MoXCJsZWZ0XCIpOlwibGVmdFwiPT09dCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJyaWdodFwiKT4tMSYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJib3R0b21cIik8MD90aGlzLnRlbXBsYXRlLnJlbW92ZUNsYXNzKHQpOlwicmlnaHRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwibGVmdFwiKT4tMSYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJib3R0b21cIik8MD90aGlzLnRlbXBsYXRlLnJlbW92ZUNsYXNzKHQpOnRoaXMudGVtcGxhdGUucmVtb3ZlQ2xhc3ModCksdGhpcy5jbGFzc0NoYW5nZWQ9ITAsdGhpcy5jb3VudGVyLS19fSx7a2V5OlwiX3NldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRQb3NpdGlvbkNsYXNzKHRoaXMudGVtcGxhdGUpLGU9Rm91bmRhdGlvbi5Cb3guR2V0RGltZW5zaW9ucyh0aGlzLnRlbXBsYXRlKSxpPUZvdW5kYXRpb24uQm94LkdldERpbWVuc2lvbnModGhpcy4kZWxlbWVudCksbj1cImxlZnRcIj09PXQ/XCJsZWZ0XCI6XCJyaWdodFwiPT09dD9cImxlZnRcIjpcInRvcFwiLHM9XCJ0b3BcIj09PW4/XCJoZWlnaHRcIjpcIndpZHRoXCI7XCJoZWlnaHRcIj09PXM/dGhpcy5vcHRpb25zLnZPZmZzZXQ6dGhpcy5vcHRpb25zLmhPZmZzZXQ7aWYoZS53aWR0aD49ZS53aW5kb3dEaW1zLndpZHRofHwhdGhpcy5jb3VudGVyJiYhRm91bmRhdGlvbi5Cb3guSW1Ob3RUb3VjaGluZ1lvdSh0aGlzLnRlbXBsYXRlKSlyZXR1cm4gdGhpcy50ZW1wbGF0ZS5vZmZzZXQoRm91bmRhdGlvbi5Cb3guR2V0T2Zmc2V0cyh0aGlzLnRlbXBsYXRlLHRoaXMuJGVsZW1lbnQsXCJjZW50ZXIgYm90dG9tXCIsdGhpcy5vcHRpb25zLnZPZmZzZXQsdGhpcy5vcHRpb25zLmhPZmZzZXQsITApKS5jc3Moe3dpZHRoOmkud2luZG93RGltcy53aWR0aC0yKnRoaXMub3B0aW9ucy5oT2Zmc2V0LGhlaWdodDpcImF1dG9cIn0pLCExO2Zvcih0aGlzLnRlbXBsYXRlLm9mZnNldChGb3VuZGF0aW9uLkJveC5HZXRPZmZzZXRzKHRoaXMudGVtcGxhdGUsdGhpcy4kZWxlbWVudCxcImNlbnRlciBcIisodHx8XCJib3R0b21cIiksdGhpcy5vcHRpb25zLnZPZmZzZXQsdGhpcy5vcHRpb25zLmhPZmZzZXQpKTshRm91bmRhdGlvbi5Cb3guSW1Ob3RUb3VjaGluZ1lvdSh0aGlzLnRlbXBsYXRlKSYmdGhpcy5jb3VudGVyOyl0aGlzLl9yZXBvc2l0aW9uKHQpLHRoaXMuX3NldFBvc2l0aW9uKCl9fSx7a2V5Olwic2hvd1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJhbGxcIiE9PXRoaXMub3B0aW9ucy5zaG93T24mJiFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuc2hvd09uKSlyZXR1cm4hMTt2YXIgdD10aGlzO3RoaXMudGVtcGxhdGUuY3NzKFwidmlzaWJpbGl0eVwiLFwiaGlkZGVuXCIpLnNob3coKSx0aGlzLl9zZXRQb3NpdGlvbigpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImNsb3NlbWUuemYudG9vbHRpcFwiLHRoaXMudGVtcGxhdGUuYXR0cihcImlkXCIpKSx0aGlzLnRlbXBsYXRlLmF0dHIoe1wiZGF0YS1pcy1hY3RpdmVcIjohMCxcImFyaWEtaGlkZGVuXCI6ITF9KSx0LmlzQWN0aXZlPSEwLHRoaXMudGVtcGxhdGUuc3RvcCgpLmhpZGUoKS5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJcIikuZmFkZUluKHRoaXMub3B0aW9ucy5mYWRlSW5EdXJhdGlvbixmdW5jdGlvbigpe30pLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcInNob3cuemYudG9vbHRpcFwiKX19LHtrZXk6XCJoaWRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMudGVtcGxhdGUuc3RvcCgpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjohMCxcImRhdGEtaXMtYWN0aXZlXCI6ITF9KS5mYWRlT3V0KHRoaXMub3B0aW9ucy5mYWRlT3V0RHVyYXRpb24sZnVuY3Rpb24oKXt0LmlzQWN0aXZlPSExLHQuaXNDbGljaz0hMSx0LmNsYXNzQ2hhbmdlZCYmKHQudGVtcGxhdGUucmVtb3ZlQ2xhc3ModC5fZ2V0UG9zaXRpb25DbGFzcyh0LnRlbXBsYXRlKSkuYWRkQ2xhc3ModC5vcHRpb25zLnBvc2l0aW9uQ2xhc3MpLHQudXNlZFBvc2l0aW9ucz1bXSx0LmNvdW50ZXI9NCx0LmNsYXNzQ2hhbmdlZD0hMSl9KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJoaWRlLnpmLnRvb2x0aXBcIil9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPSh0aGlzLnRlbXBsYXRlLCExKTt0aGlzLm9wdGlvbnMuZGlzYWJsZUhvdmVyfHx0aGlzLiRlbGVtZW50Lm9uKFwibW91c2VlbnRlci56
6780Zi50b29sdGlwXCIsZnVuY3Rpb24oZSl7dC5pc0FjdGl2ZXx8KHQudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zaG93KCl9LHQub3B0aW9ucy5ob3ZlckRlbGF5KSl9KS5vbihcIm1vdXNlbGVhdmUuemYudG9vbHRpcFwiLGZ1bmN0aW9uKGkpe2NsZWFyVGltZW91dCh0LnRpbWVvdXQpLCghZXx8IXQuaXNDbGljayYmdC5vcHRpb25zLmNsaWNrT3BlbikmJnQuaGlkZSgpfSksdGhpcy5vcHRpb25zLmNsaWNrT3BlbiYmdGhpcy4kZWxlbWVudC5vbihcIm1vdXNlZG93bi56Zi50b29sdGlwXCIsZnVuY3Rpb24oZSl7ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0LmlzQ2xpY2s/dC5oaWRlKCk6KHQuaXNDbGljaz0hMCwhdC5vcHRpb25zLmRpc2FibGVIb3ZlciYmdC4kZWxlbWVudC5hdHRyKFwidGFiaW5kZXhcIil8fHQuaXNBY3RpdmV8fHQuc2hvdygpKX0pLHRoaXMub3B0aW9ucy5kaXNhYmxlRm9yVG91Y2h8fHRoaXMuJGVsZW1lbnQub24oXCJ0YXAuemYudG9vbHRpcCB0b3VjaGVuZC56Zi50b29sdGlwXCIsZnVuY3Rpb24oZSl7dC5pc0FjdGl2ZT90LmhpZGUoKTp0LnNob3coKX0pLHRoaXMuJGVsZW1lbnQub24oe1wiY2xvc2UuemYudHJpZ2dlclwiOnRoaXMuaGlkZS5iaW5kKHRoaXMpfSksdGhpcy4kZWxlbWVudC5vbihcImZvY3VzLnpmLnRvb2x0aXBcIixmdW5jdGlvbihpKXtyZXR1cm4gZT0hMCx0LmlzQ2xpY2s/ITE6dm9pZCB0LnNob3coKX0pLm9uKFwiZm9jdXNvdXQuemYudG9vbHRpcFwiLGZ1bmN0aW9uKGkpe2U9ITEsdC5pc0NsaWNrPSExLHQuaGlkZSgpfSkub24oXCJyZXNpemVtZS56Zi50cmlnZ2VyXCIsZnVuY3Rpb24oKXt0LmlzQWN0aXZlJiZ0Ll9zZXRQb3NpdGlvbigpfSl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlP3RoaXMuaGlkZSgpOnRoaXMuc2hvdygpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuYXR0cihcInRpdGxlXCIsdGhpcy50ZW1wbGF0ZS50ZXh0KCkpLm9mZihcIi56Zi50cmlnZ2VyIC56Zi50b290aXBcIikucmVtb3ZlQXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIikucmVtb3ZlQXR0cihcImRhdGEteWV0aS1ib3hcIikucmVtb3ZlQXR0cihcImRhdGEtdG9nZ2xlXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXJlc2l6ZVwiKSx0aGlzLnRlbXBsYXRlLnJlbW92ZSgpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtkaXNhYmxlRm9yVG91Y2g6ITEsaG92ZXJEZWxheToyMDAsZmFkZUluRHVyYXRpb246MTUwLGZhZGVPdXREdXJhdGlvbjoxNTAsZGlzYWJsZUhvdmVyOiExLHRlbXBsYXRlQ2xhc3NlczpcIlwiLHRvb2x0aXBDbGFzczpcInRvb2x0aXBcIix0cmlnZ2VyQ2xhc3M6XCJoYXMtdGlwXCIsc2hvd09uOlwic21hbGxcIix0ZW1wbGF0ZTpcIlwiLHRpcFRleHQ6XCJcIix0b3VjaENsb3NlVGV4dDpcIlRhcCB0byBjbG9zZS5cIixjbGlja09wZW46ITAscG9zaXRpb25DbGFzczpcIlwiLHZPZmZzZXQ6MTAsaE9mZnNldDoxMn0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIlRvb2x0aXBcIil9KGpRdWVyeSk7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBQb2x5ZmlsbCBmb3IgcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4oZnVuY3Rpb24oKSB7XG4gIGlmICghRGF0ZS5ub3cpXG4gICAgRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9O1xuXG4gIHZhciB2ZW5kb3JzID0gWyd3ZWJraXQnLCAnbW96J107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsraSkge1xuICAgICAgdmFyIHZwID0gdmVuZG9yc1tpXTtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdnArJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvd1t2cCsnQ2FuY2VsQW5pbWF0aW9uRnJhbWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2luZG93W3ZwKydDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXSk7XG4gIH1cbiAgaWYgKC9pUChhZHxob25lfG9kKS4qT1MgNi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudClcbiAgICB8fCAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAhd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgdmFyIGxhc3RUaW1lID0gMDtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZhciBuZXh0VGltZSA9IE1hdGgubWF4KGxhc3RUaW1lICsgMTYsIG5vdyk7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhsYXN0VGltZSA9IG5leHRUaW1lKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgLSBub3cpO1xuICAgIH07XG4gICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gY2xlYXJUaW1lb3V0O1xuICB9XG59KSgpO1xuXG52YXIgaW5pdENsYXNzZXMgICA9IFsnbXVpLWVudGVyJywgJ211aS1sZWF2ZSddO1xudmFyIGFjdGl2ZUNsYXNzZXMgPSBbJ211aS1lbnRlci1hY3RpdmUnLCAnbXVpLWxlYXZlLWFjdGl2ZSddO1xuXG4vLyBGaW5kIHRoZSByaWdodCBcInRyYW5zaXRpb25lbmRcIiBldmVudCBmb3IgdGhpcyBicm93c2VyXG52YXIgZW5kRXZlbnQgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB0cmFuc2l0aW9ucyA9IHtcbiAgICAndHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAnV2Via2l0VHJhbnNpdGlvbic6ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAnTW96VHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAnT1RyYW5zaXRpb24nOiAnb3RyYW5zaXRpb25lbmQnXG4gIH1cbiAgdmFyIGVsZW0gPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgZm9yICh2YXIgdCBpbiB0cmFuc2l0aW9ucykge1xuICAgIGlmICh0eXBlb2YgZWxlbS5zdHlsZVt0XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybi
6780B0cmFuc2l0aW9uc1t0XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0pKCk7XG5cbmZ1bmN0aW9uIGFuaW1hdGUoaXNJbiwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYikge1xuICBlbGVtZW50ID0gJChlbGVtZW50KS5lcSgwKTtcblxuICBpZiAoIWVsZW1lbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgaWYgKGVuZEV2ZW50ID09PSBudWxsKSB7XG4gICAgaXNJbiA/IGVsZW1lbnQuc2hvdygpIDogZWxlbWVudC5oaWRlKCk7XG4gICAgY2IoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaW5pdENsYXNzID0gaXNJbiA/IGluaXRDbGFzc2VzWzBdIDogaW5pdENsYXNzZXNbMV07XG4gIHZhciBhY3RpdmVDbGFzcyA9IGlzSW4gPyBhY3RpdmVDbGFzc2VzWzBdIDogYWN0aXZlQ2xhc3Nlc1sxXTtcblxuICAvLyBTZXQgdXAgdGhlIGFuaW1hdGlvblxuICByZXNldCgpO1xuICBlbGVtZW50LmFkZENsYXNzKGFuaW1hdGlvbik7XG4gIGVsZW1lbnQuY3NzKCd0cmFuc2l0aW9uJywgJ25vbmUnKTtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgIGVsZW1lbnQuYWRkQ2xhc3MoaW5pdENsYXNzKTtcbiAgICBpZiAoaXNJbikgZWxlbWVudC5zaG93KCk7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGg7XG4gICAgZWxlbWVudC5jc3MoJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhhY3RpdmVDbGFzcyk7XG4gIH0pO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBhbmltYXRpb24gd2hlbiBpdCBmaW5pc2hlc1xuICBlbGVtZW50Lm9uZSgndHJhbnNpdGlvbmVuZCcsIGZpbmlzaCk7XG5cbiAgLy8gSGlkZXMgdGhlIGVsZW1lbnQgKGZvciBvdXQgYW5pbWF0aW9ucyksIHJlc2V0cyB0aGUgZWxlbWVudCwgYW5kIHJ1bnMgYSBjYWxsYmFja1xuICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgaWYgKCFpc0luKSBlbGVtZW50LmhpZGUoKTtcbiAgICByZXNldCgpO1xuICAgIGlmIChjYikgY2IuYXBwbHkoZWxlbWVudCk7XG4gIH1cblxuICAvLyBSZXNldHMgdHJhbnNpdGlvbnMgYW5kIHJlbW92ZXMgbW90aW9uLXNwZWNpZmljIGNsYXNzZXNcbiAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgZWxlbWVudFswXS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAwO1xuICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoaW5pdENsYXNzICsgJyAnICsgYWN0aXZlQ2xhc3MgKyAnICcgKyBhbmltYXRpb24pO1xuICB9XG59XG5cbnZhciBNb3Rpb25VSSA9IHtcbiAgYW5pbWF0ZUluOiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZSh0cnVlLCBlbGVtZW50LCBhbmltYXRpb24sIGNiKTtcbiAgfSxcblxuICBhbmltYXRlT3V0OiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZShmYWxzZSwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYik7XG4gIH1cbn1cbiIsIndpbmRvdy53aGF0SW5wdXQgPSAoZnVuY3Rpb24oKSB7XG5cbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICAgdmFyaWFibGVzXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICovXG5cbiAgLy8gYXJyYXkgb2YgYWN0aXZlbHkgcHJlc3NlZCBrZXlzXG4gIHZhciBhY3RpdmVLZXlzID0gW107XG5cbiAgLy8gY2FjaGUgZG9jdW1lbnQuYm9keVxuICB2YXIgYm9keTtcblxuICAvLyBib29sZWFuOiB0cnVlIGlmIHRvdWNoIGJ1ZmZlciB0aW1lciBpcyBydW5uaW5nXG4gIHZhciBidWZmZXIgPSBmYWxzZTtcblxuICAvLyB0aGUgbGFzdCB1c2VkIGlucHV0IHR5cGVcbiAgdmFyIGN1cnJlbnRJbnB1dCA9IG51bGw7XG5cbiAgLy8gYGlucHV0YCB0eXBlcyB0aGF0IGRvbid0IGFjY2VwdCB0ZXh0XG4gIHZhciBub25UeXBpbmdJbnB1dHMgPSBbXG4gICAgJ2J1dHRvbicsXG4gICAgJ2NoZWNrYm94Jy
6780xcbiAgICAnZmlsZScsXG4gICAgJ2ltYWdlJyxcbiAgICAncmFkaW8nLFxuICAgICdyZXNldCcsXG4gICAgJ3N1Ym1pdCdcbiAgXTtcblxuICAvLyBkZXRlY3QgdmVyc2lvbiBvZiBtb3VzZSB3aGVlbCBldmVudCB0byB1c2VcbiAgLy8gdmlhIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy93aGVlbFxuICB2YXIgbW91c2VXaGVlbCA9IGRldGVjdFdoZWVsKCk7XG5cbiAgLy8gbGlzdCBvZiBtb2RpZmllciBrZXlzIGNvbW1vbmx5IHVzZWQgd2l0aCB0aGUgbW91c2UgYW5kXG4gIC8vIGNhbiBiZSBzYWZlbHkgaWdub3JlZCB0byBwcmV2ZW50IGZhbHNlIGtleWJvYXJkIGRldGVjdGlvblxuICB2YXIgaWdub3JlTWFwID0gW1xuICAgIDE2LCAvLyBzaGlmdFxuICAgIDE3LCAvLyBjb250cm9sXG4gICAgMTgsIC8vIGFsdFxuICAgIDkxLCAvLyBXaW5kb3dzIGtleSAvIGxlZnQgQXBwbGUgY21kXG4gICAgOTMgIC8vIFdpbmRvd3MgbWVudSAvIHJpZ2h0IEFwcGxlIGNtZFxuICBdO1xuXG4gIC8vIG1hcHBpbmcgb2YgZXZlbnRzIHRvIGlucHV0IHR5cGVzXG4gIHZhciBpbnB1dE1hcCA9IHtcbiAgICAna2V5ZG93bic6ICdrZXlib2FyZCcsXG4gICAgJ2tleXVwJzogJ2tleWJvYXJkJyxcbiAgICAnbW91c2Vkb3duJzogJ21vdXNlJyxcbiAgICAnbW91c2Vtb3ZlJzogJ21vdXNlJyxcbiAgICAnTVNQb2ludGVyRG93bic6ICdwb2ludGVyJyxcbiAgICAnTVNQb2ludGVyTW92ZSc6ICdwb2ludGVyJyxcbiAgICAncG9pbnRlcmRvd24nOiAncG9pbnRlcicsXG4gICAgJ3BvaW50ZXJtb3ZlJzogJ3BvaW50ZXInLFxuICAgICd0b3VjaHN0YXJ0JzogJ3RvdWNoJ1xuICB9O1xuXG4gIC8vIGFkZCBjb3JyZWN0IG1vdXNlIHdoZWVsIGV2ZW50IG1hcHBpbmcgdG8gYGlucHV0TWFwYFxuICBpbnB1dE1hcFtkZXRlY3RXaGVlbCgpXSA9ICdtb3VzZSc7XG5cbiAgLy8gYXJyYXkgb2YgYWxsIHVzZWQgaW5wdXQgdHlwZXNcbiAgdmFyIGlucHV0VHlwZXMgPSBbXTtcblxuICAvLyBtYXBwaW5nIG9mIGtleSBjb2RlcyB0byBhIGNvbW1vbiBuYW1lXG4gIHZhciBrZXlNYXAgPSB7XG4gICAgOTogJ3RhYicsXG4gICAgMTM6ICdlbnRlcicsXG4gICAgMTY6ICdzaGlmdCcsXG4gICAgMjc6ICdlc2MnLFxuICAgIDMyOiAnc3BhY2UnLFxuICAgIDM3OiAnbGVmdCcsXG4gICAgMzg6ICd1cCcsXG4gICAgMzk6ICdyaWdodCcsXG4gICAgNDA6ICdkb3duJ1xuICB9O1xuXG4gIC8vIG1hcCBvZiBJRSAxMCBwb2ludGVyIGV2ZW50c1xuICB2YXIgcG9pbnRlck1hcCA9IHtcbiAgICAyOiAndG91Y2gnLFxuICAgIDM6ICd0b3VjaCcsIC8vIHRyZWF0IHBlbiBsaWtlIHRvdWNoXG4gICAgNDogJ21vdXNlJ1xuICB9O1xuXG4gIC8vIHRvdWNoIGJ1ZmZlciB0aW1lclxuICB2YXIgdGltZXI7XG5cblxuICAvKlxuICAgIC0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uc1xuICAgIC0tLS0tLS0tLS0tLS0tLVxuICAqL1xuXG4gIC8vIGFsbG93cyBldmVudHMgdGhhdCBhcmUgYWxzbyB0cmlnZ2VyZWQgdG8gYmUgZmlsdGVyZWQgb3V0IGZvciBgdG91Y2hzdGFydGBcbiAgZnVuY3Rpb24gZXZlbnRCdWZmZXIoKSB7XG4gICAgY2xlYXJUaW1lcigpO1xuICAgIHNldElucHV0KGV2ZW50KTtcblxuICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGJ1ZmZlciA9IGZhbHNlO1xuICAgIH0sIDY1MCk7XG4gIH1cblxuICBmdW5jdGlvbiBidWZmZXJlZEV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKCFidWZmZXIpIHNldElucHV0KGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuQnVmZmVyZWRFdmVudChldmVudCkge1xuICAgIGNsZWFyVGltZXIoKTtcbiAgICBzZXRJbnB1dChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhclRpbWVyKCkge1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0SW5wdXQoZXZlbnQpIHtcbiAgICB2YXIgZXZlbnRLZXkgPSBrZXkoZXZlbnQpO1xuICAgIHZhciB2YWx1ZSA9IGlucHV0TWFwW2V2ZW50LnR5cGVdO1xuICAgIGlmICh2YWx1ZSA9PT0gJ3BvaW50ZXInKSB2YWx1ZSA9IHBvaW50ZXJUeXBlKGV2ZW50KTtcblxuICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBpbnB1dCB0eXBlIGFscmVhZHkgc2V0XG4gICAgaWYgKGN1cnJlbnRJbnB1dCAhPT0gdmFsdWUpIHtcbiAgICAgIHZhciBldmVudFRhcmdldCA9IHRhcmdldChldmVudCk7XG4gICAgICB2Y
6780XIgZXZlbnRUYXJnZXROb2RlID0gZXZlbnRUYXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBldmVudFRhcmdldFR5cGUgPSAoZXZlbnRUYXJnZXROb2RlID09PSAnaW5wdXQnKSA/IGV2ZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgndHlwZScpIDogbnVsbDtcblxuICAgICAgaWYgKFxuICAgICAgICAoLy8gb25seSBpZiB0aGUgdXNlciBmbGFnIHRvIGFsbG93IHR5cGluZyBpbiBmb3JtIGZpZWxkcyBpc24ndCBzZXRcbiAgICAgICAgIWJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLXdoYXRpbnB1dC1mb3JtdHlwaW5nJykgJiZcblxuICAgICAgICAvLyBvbmx5IGlmIGN1cnJlbnRJbnB1dCBoYXMgYSB2YWx1ZVxuICAgICAgICBjdXJyZW50SW5wdXQgJiZcblxuICAgICAgICAvLyBvbmx5IGlmIHRoZSBpbnB1dCBpcyBga2V5Ym9hcmRgXG4gICAgICAgIHZhbHVlID09PSAna2V5Ym9hcmQnICYmXG5cbiAgICAgICAgLy8gbm90IGlmIHRoZSBrZXkgaXMgYFRBQmBcbiAgICAgICAga2V5TWFwW2V2ZW50S2V5XSAhPT0gJ3RhYicgJiZcblxuICAgICAgICAvLyBvbmx5IGlmIHRoZSB0YXJnZXQgaXMgYSBmb3JtIGlucHV0IHRoYXQgYWNjZXB0cyB0ZXh0XG4gICAgICAgIChcbiAgICAgICAgICAgZXZlbnRUYXJnZXROb2RlID09PSAndGV4dGFyZWEnIHx8XG4gICAgICAgICAgIGV2ZW50VGFyZ2V0Tm9kZSA9PT0gJ3NlbGVjdCcgfHxcbiAgICAgICAgICAgKGV2ZW50VGFyZ2V0Tm9kZSA9PT0gJ2lucHV0JyAmJiBub25UeXBpbmdJbnB1dHMuaW5kZXhPZihldmVudFRhcmdldFR5cGUpIDwgMClcbiAgICAgICAgKSkgfHwgKFxuICAgICAgICAgIC8vIGlnbm9yZSBtb2RpZmllciBrZXlzXG4gICAgICAgICAgaWdub3JlTWFwLmluZGV4T2YoZXZlbnRLZXkpID4gLTFcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGlnbm9yZSBrZXlib2FyZCB0eXBpbmdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaElucHV0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICdrZXlib2FyZCcpIGxvZ0tleXMoZXZlbnRLZXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3dpdGNoSW5wdXQoc3RyaW5nKSB7XG4gICAgY3VycmVudElucHV0ID0gc3RyaW5nO1xuICAgIGJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLXdoYXRpbnB1dCcsIGN1cnJlbnRJbnB1dCk7XG5cbiAgICBpZiAoaW5wdXRUeXBlcy5pbmRleE9mKGN1cnJlbnRJbnB1dCkgPT09IC0xKSBpbnB1dFR5cGVzLnB1c2goY3VycmVudElucHV0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtleShldmVudCkge1xuICAgIHJldHVybiAoZXZlbnQua2V5Q29kZSkgPyBldmVudC5rZXlDb2RlIDogZXZlbnQud2hpY2g7XG4gIH1cblxuICBmdW5jdGlvbiB0YXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBwb2ludGVyVHlwZShldmVudCkge1xuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlclR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcG9pbnRlck1hcFtldmVudC5wb2ludGVyVHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoZXZlbnQucG9pbnRlclR5cGUgPT09ICdwZW4nKSA/ICd0b3VjaCcgOiBldmVudC5wb2ludGVyVHlwZTsgLy8gdHJlYXQgcGVuIGxpa2UgdG91Y2hcbiAgICB9XG4gIH1cblxuICAvLyBrZXlib2FyZCBsb2dnaW5nXG4gIGZ1bmN0aW9uIGxvZ0tleXMoZXZlbnRLZXkpIHtcbiAgICBpZiAoYWN0aXZlS2V5cy5pbmRleE9mKGtleU1hcFtldmVudEtleV0pID09PSAtMSAmJiBrZXlNYXBbZXZlbnRLZXldKSBhY3RpdmVLZXlzLnB1c2goa2V5TWFwW2V2ZW50S2V5XSk7XG4gIH1cblxuICBmdW5jdGlvbiB1bkxvZ0tleXMoZXZlbnQpIHtcbiAgICB2YXIgZXZlbnRLZXkgPSBrZXkoZXZlbnQpO1xuICAgIHZhciBhcnJheVBvcyA9IGFjdGl2ZUtleXMuaW5kZXhPZihrZXlNYXBbZXZlbnRLZXldKTtcblxuICAgIGlmIChhcnJheVBvcyAhPT0gLTEpIGFjdGl2ZUtleXMuc3BsaWNlKGFycmF5UG9zLCAxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7XG4gICAgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cbiAgICAvLyBwb2ludGVyIGV2ZW50cyAobW91c2UsIHBlbiwgdG91Y2gpXG4gICAgaWYgKHdpbmRvdy5Qb2ludGVyRXZlbnQpIHtcbiAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBidWZmZXJlZEV2ZW50KTtcbiAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBidWZmZXJlZEV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5NU1BvaW50ZXJFdmVudCkge1xuICAgICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdNU1BvaW50ZXJEb3duJywgYnVmZmVyZWRFdmVudCk7XG4gICAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ01TUG9pbnRlck1vdmUnLCBidWZmZXJlZEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICAvLyBtb3VzZSBldmVudHNcbiAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgYnVmZmVyZWRFdmVudCk7XG4gICAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGJ1ZmZlcmVkRXZlbnQpO1xuXG4gICAgICAvLyB0b3VjaCBldmVudHNcbiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpIHtcbiAgICAgICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZXZlbnRCdWZmZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1vdXNlIHdoZWVsXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKG1vdXNlV2hlZWwsIGJ1ZmZlcmVkRXZlbnQpO1xuXG4gICAgLy8ga2V5Ym9hcmQgZXZlbnRzXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdW5CdWZmZXJlZEV2ZW50KTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdW5CdWZmZXJlZEV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVuTG9nS2V5cyk7XG4gIH1cblxuXG4gIC8qXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICAgdXRpbGl0aWVzXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICovXG5cbiAgLy8gZGV0ZWN0IHZlcnNpb24gb2YgbW91c2Ugd2hlZWwgZXZlbnQgdG8gdXNlXG4gIC8vIHZpYSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvd2hlZWxcbiAgZnVuY3Rpb24gZGV0ZWN0V2hlZWwoKSB7XG4gICAgcmV0dXJuIG1vdXNlV2hlZWwgPSAnb253aGVlbCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgP1xuICAgICAgJ3doZWVsJyA6IC8vIE1vZGVybiBicm93c2VycyBzdXBwb3J0IFwid2hlZWxcIlxuXG4gICAgICBkb2
6780N1bWVudC5vbm1vdXNld2hlZWwgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICdtb3VzZXdoZWVsJyA6IC8vIFdlYmtpdCBhbmQgSUUgc3VwcG9ydCBhdCBsZWFzdCBcIm1vdXNld2hlZWxcIlxuICAgICAgICAnRE9NTW91c2VTY3JvbGwnOyAvLyBsZXQncyBhc3N1bWUgdGhhdCByZW1haW5pbmcgYnJvd3NlcnMgYXJlIG9sZGVyIEZpcmVmb3hcbiAgfVxuXG5cbiAgLypcbiAgICAtLS0tLS0tLS0tLS0tLS1cbiAgICBpbml0XG5cbiAgICBkb24ndCBzdGFydCBzY3JpcHQgdW5sZXNzIGJyb3dzZXIgY3V0cyB0aGUgbXVzdGFyZCxcbiAgICBhbHNvIHBhc3NlcyBpZiBwb2x5ZmlsbHMgYXJlIHVzZWRcbiAgICAtLS0tLS0tLS0tLS0tLS1cbiAgKi9cblxuICBpZiAoXG4gICAgJ2FkZEV2ZW50TGlzdGVuZXInIGluIHdpbmRvdyAmJlxuICAgIEFycmF5LnByb3RvdHlwZS5pbmRleE9mXG4gICkge1xuXG4gICAgLy8gaWYgdGhlIGRvbSBpcyBhbHJlYWR5IHJlYWR5IGFscmVhZHkgKHNjcmlwdCB3YXMgcGxhY2VkIGF0IGJvdHRvbSBvZiA8Ym9keT4pXG4gICAgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGJpbmRFdmVudHMoKTtcblxuICAgIC8vIG90aGVyd2lzZSB3YWl0IGZvciB0aGUgZG9tIHRvIGxvYWQgKHNjcmlwdCB3YXMgcGxhY2VkIGluIHRoZSA8aGVhZD4pXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBiaW5kRXZlbnRzKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICAgYXBpXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICovXG5cbiAgcmV0dXJuIHtcblxuICAgIC8vIHJldHVybnMgc3RyaW5nOiB0aGUgY3VycmVudCBpbnB1dCB0eXBlXG4gICAgYXNrOiBmdW5jdGlvbigpIHsgcmV0dXJuIGN1cnJlbnRJbnB1dDsgfSxcblxuICAgIC8vIHJldHVybnMgYXJyYXk6IGN1cnJlbnRseSBwcmVzc2VkIGtleXNcbiAgICBrZXlzOiBmdW5jdGlvbigpIHsgcmV0dXJuIGFjdGl2ZUtleXM7IH0sXG5cbiAgICAvLyByZXR1cm5zIGFycmF5OiBhbGwgdGhlIGRldGVjdGVkIGlucHV0IHR5cGVzXG4gICAgdHlwZXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gaW5wdXRUeXBlczsgfSxcblxuICAgIC8vIGFjY2VwdHMgc3RyaW5nOiBtYW51YWxseSBzZXQgdGhlIGlucHV0IHR5cGVcbiAgICBzZXQ6IHN3aXRjaElucHV0XG4gIH07XG5cbn0oKSk7XG4iLCIvKlxuICAgICBfIF8gICAgICBfICAgICAgIF9cbiBfX198IChfKSBfX198IHwgX18gIChfKV9fX1xuLyBfX3wgfCB8LyBfX3wgfC8gLyAgfCAvIF9ffFxuXFxfXyBcXCB8IHwgKF9ffCAgIDwgXyB8IFxcX18gXFxcbnxfX18vX3xffFxcX19ffF98XFxfKF8pLyB8X19fL1xuICAgICAgICAgICAgICAgICAgIHxfXy9cblxuIFZlcnNpb246IDEuNS45XG4gIEF1dGhvcjogS2VuIFdoZWVsZXJcbiBXZWJzaXRlOiBodHRwOi8va2Vud2hlZWxlci5naXRodWIuaW9cbiAgICBEb2NzOiBodHRwOi8va2Vud2hlZWxlci5naXRodWIuaW8vc2xpY2tcbiAgICBSZXBvOiBodHRwOi8vZ2l0aHViLmNvbS9rZW53aGVlbGVyL3NsaWNrXG4gIElzc3VlczogaHR0cDovL2dpdGh1Yi5jb20va2Vud2hlZWxlci9zbGljay9pc3N1ZXNcblxuICovXG4hZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sYSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YShyZXF1aXJlKFwianF1ZXJ5XCIpKTphKGpRdWVyeSl9KGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPXdpbmRvdy5TbGlja3x8e307Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIGMoYyxkKXt2YXIgZixlPXRoaXM7ZS5kZWZhdWx0cz17YWNjZXNzaWJpbGl0eTohMCxhZGFwdGl2ZUhlaWdodDohMSxhcHBlbmRBcnJvd3M6YShjKSxhcHBlbmREb3RzOmEoYyksYXJyb3dzOiEwLGFzTmF2Rm9yOm51bGwscHJldkFycm93Oic8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXJvbGU9XCJub25lXCIgY2x
6780hc3M9XCJzbGljay1wcmV2XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiPlByZXZpb3VzPC9idXR0b24+JyxuZXh0QXJyb3c6JzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcm9sZT1cIm5vbmVcIiBjbGFzcz1cInNsaWNrLW5leHRcIiBhcmlhLWxhYmVsPVwiTmV4dFwiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJidXR0b25cIj5OZXh0PC9idXR0b24+JyxhdXRvcGxheTohMSxhdXRvcGxheVNwZWVkOjNlMyxjZW50ZXJNb2RlOiExLGNlbnRlclBhZGRpbmc6XCI1MHB4XCIsY3NzRWFzZTpcImVhc2VcIixjdXN0b21QYWdpbmc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4nPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1yb2xlPVwibm9uZVwiIHJvbGU9XCJidXR0b25cIiBhcmlhLXJlcXVpcmVkPVwiZmFsc2VcIiB0YWJpbmRleD1cIjBcIj4nKyhiKzEpK1wiPC9idXR0b24+XCJ9LGRvdHM6ITEsZG90c0NsYXNzOlwic2xpY2stZG90c1wiLGRyYWdnYWJsZTohMCxlYXNpbmc6XCJsaW5lYXJcIixlZGdlRnJpY3Rpb246LjM1LGZhZGU6ITEsZm9jdXNPblNlbGVjdDohMSxpbmZpbml0ZTohMCxpbml0aWFsU2xpZGU6MCxsYXp5TG9hZDpcIm9uZGVtYW5kXCIsbW9iaWxlRmlyc3Q6ITEscGF1c2VPbkhvdmVyOiEwLHBhdXNlT25Eb3RzSG92ZXI6ITEscmVzcG9uZFRvOlwid2luZG93XCIscmVzcG9uc2l2ZTpudWxsLHJvd3M6MSxydGw6ITEsc2xpZGU6XCJcIixzbGlkZXNQZXJSb3c6MSxzbGlkZXNUb1Nob3c6MSxzbGlkZXNUb1Njcm9sbDoxLHNwZWVkOjUwMCxzd2lwZTohMCxzd2lwZVRvU2xpZGU6ITEsdG91Y2hNb3ZlOiEwLHRvdWNoVGhyZXNob2xkOjUsdXNlQ1NTOiEwLHVzZVRyYW5zZm9ybTohMSx2YXJpYWJsZVdpZHRoOiExLHZlcnRpY2FsOiExLHZlcnRpY2FsU3dpcGluZzohMSx3YWl0Rm9yQW5pbWF0ZTohMCx6SW5kZXg6MWUzfSxlLmluaXRpYWxzPXthbmltYXRpbmc6ITEsZHJhZ2dpbmc6ITEsYXV0b1BsYXlUaW1lcjpudWxsLGN1cnJlbnREaXJlY3Rpb246MCxjdXJyZW50TGVmdDpudWxsLGN1cnJlbnRTbGlkZTowLGRpcmVjdGlvbjoxLCRkb3RzOm51bGwsbGlzdFdpZHRoOm51bGwsbGlzdEhlaWdodDpudWxsLGxvYWRJbmRleDowLCRuZXh0QXJyb3c6bnVsbCwkcHJldkFycm93Om51bGwsc2xpZGVDb3VudDpudWxsLHNsaWRlV2lkdGg6bnVsbCwkc2xpZGVUcmFjazpudWxsLCRzbGlkZXM6bnVsbCxzbGlkaW5nOiExLHNsaWRlT2Zmc2V0OjAsc3dpcGVMZWZ0Om51bGwsJGxpc3Q6bnVsbCx0b3VjaE9iamVjdDp7fSx0cmFuc2Zvcm1zRW5hYmxlZDohMSx1bnNsaWNrZWQ6ITF9LGEuZXh0ZW5kKGUsZS5pbml0aWFscyksZS5hY3RpdmVCcmVha3BvaW50PW51bGwsZS5hbmltVHlwZT1udWxsLGUuYW5pbVByb3A9bnVsbCxlLmJyZWFrcG9pbnRzPVtdLGUuYnJlYWtwb2ludFNldHRpbmdzPVtdLGUuY3NzVHJhbnNpdGlvbnM9ITEsZS5oaWRkZW49XCJoaWRkZW5cIixlLnBhdXNlZD0hMSxlLnBvc2l0aW9uUHJvcD1udWxsLGUucmVzcG9uZFRvPW51bGwsZS5yb3dDb3VudD0xLGUuc2hvdWxkQ2xpY2s9ITAsZS4kc2xpZGVyPWEoYyksZS4kc2xpZGVzQ2FjaGU9bnVsbCxlLnRyYW5zZm9ybVR5cGU9bnVsbCxlLnRyYW5zaXRpb25UeXBlPW51bGwsZS52aXNpYmlsaXR5Q2hhbmdlPVwidmlzaWJpbGl0eWNoYW5nZVwiLGUud2luZG93V2lkdGg9MCxlLndpbmRvd1RpbWVyPW51bGwsZj1hKGMpLmRhdGEoXCJzbGlja1wiKXx8e30sZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsZixkKSxlLmN1cnJlbnRTbGlkZT1lLm9wdGlvbnMuaW5pdGlhbFNsaWRlLGUub3JpZ2luYWxTZXR0aW5ncz1lLm9wdGlvbnMsXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50Lm1vekhpZGRlbj8oZS5oaWRkZW49XCJtb3pIaWRkZW5cIixlLnZpc2liaWxpdHlDaGFuZ2U9XCJtb3p2aXNpYmlsaXR5Y2hhbmdlXCIpOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudC53ZWJraXRIaWRkZW4mJihlLmhpZGRlbj1cIndlYmtpdEhpZGRlblwiLGUudmlzaWJpbGl0eUNoYW5nZT1cIndlYmtpdHZpc2liaWxpdHljaGFuZ2VcIiksZS5hdXRvUGxheT1hLnByb3h5KGUuYXV0b1BsYXksZSksZS5hdXRvUGxheUNsZWFyPWEucHJveHkoZS5hdXRvUGxheUNsZWFyLGUpLGUuY2hhbmdlU2xpZGU9YS5wcm94eShlLmNoYW5nZVNsaWRlLGUpLGUuY2xpY2tIYW5kbGVyPWEucHJveHkoZS5jbGlja0hhbmRsZXIsZSksZS5zZWxlY3RIYW5kbGVyPWEucHJveHkoZS5zZWxlY3RIYW5kbGVyLGUpLGUuc2V0UG9zaXRpb249YS5wcm94eShlLnNldFBvc2l0aW9uLGUpLGUuc3dpcGVIYW5kbGVyPWEucHJveHkoZS5zd2lwZUhhbmRsZXIsZSksZS5kcmFnSGFuZGxlcj1hLnByb3h5KGUuZHJhZ0hhbmRsZXIsZSksZS5rZXlIYW5kbGVyPWEucHJveHkoZS5rZXlIYW5kbGVyLGUpLGUuYXV0b1BsYXlJdGVyYXRvcj1hLnByb3h5KGUuYXV0b1BsYXlJdGVyYXRvcixlKSxlLmluc3RhbmNlVWlkPWIrKyxlLmh0bWxFeHByPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKikkLyxlLnJlZ2lzdGVyQnJlYWtwb2ludHMoKSxlLmluaXQoITApLGUuY2hlY2tSZXNwb25zaXZlKCEwKX12YXIgYj0wO3JldHVybiBjfSgpLGIucHJvdG90eXBlLmFkZFNsaWRlPWIucHJvdG90eXBlLnNsaWNrQWRkPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT10aGlzO2lmKFwiYm9vbGVhblwiPT10eXBlb2YgYylkPWMsYz1udWxsO2Vsc2UgaWYoMD5jfHxjPj1lLnNsaWRlQ291bnQpcmV0dXJuITE7ZS51bmxvYWQoKSxcIm51bWJlclwiPT10eXBlb2YgYz8wPT09YyYmMD09PWUuJHNsaWRlcy5sZW5ndGg/YShiKS5hcHBlbmRUbyhlLiRzbGlkZVRyYWNrKTpkP2EoYikuaW5zZXJ0QmVmb3JlKGUuJHNsaWRlcy5lcShjKSk6YShiKS5pbnNlcnRBZnRlcihlLiRzbGlkZXMuZXEoYykpOmQ9PT0hMD9hKGIpLnByZXBlbmRUbyhlLiRzbGlkZVRyYWNrKTphKGIpLmFwcGVuZFRvKGUuJHNsaWRlVHJhY2spLGUuJHNsaWRlcz1lLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSksZS4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLGUuJHNsaWRlVHJhY2suYXBwZW5kKGUuJHNsaWRlcyksZS4kc2xpZGVzLmVhY2goZnVuY3Rpb24oYixjKXthKGMpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsYil9KSxlLiRzbGlkZXNDYWNoZT1lLiRzbGlkZXMsZS5yZWluaXQoKX0sYi5wcm90b3R5cGUuYW5pbWF0ZUhlaWdodD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoMT09PWEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmEub3B0aW9ucy5hZGFwdGl2ZUhlaWdodD09PSEwJiZhLm9wdGlvbnMudmVydGljYWw9PT0hMSl7dmFyIGI9YS4kc2xpZGVzLmVxKGEuY3VycmVudFNsaWRlKS5vdXRlckhlaWdodCghMCk7YS4kbGlzdC5hbmltYXRlKHtoZWlnaHQ6Yn0sYS5vcHRpb25zLnNwZWVkKX19LGIucHJvdG90eXBlLmFuaW1hdGVTbGlkZT1mdW5jdGlvbihiLGMpe3ZhciBkPXt9LGU9dGhpcztlLmFuaW1hdGVIZWlnaHQoKSxlLm9wdGlvbnMucnRsPT09ITAmJmUub3B0aW9ucy52ZXJ0aWNhbD09PSExJiYoYj0tYiksZS50cmFuc2Zvcm1zRW5hYmxlZD09PSExP2Uub3B0aW9ucy52ZXJ0aWNhbD09PSExP2UuJHNsaWRlVHJhY2suYW5pbWF0ZSh7bGVmdDpifSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyxjKTplLiRzbGlkZVRyYWNrLmFuaW1hdGUoe3RvcDpifSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyxjKTplLmNzc1RyYW5zaXRpb25zPT09ITE/KGUub3B0aW9ucy5ydGw9PT0hMCYmKGUuY3VycmVudExlZnQ9LWUuY3VycmVudExlZnQpLGEoe2FuaW1TdGFydDplLmN1cnJlbnRMZWZ0fSkuYW5pbWF0ZSh7YW5pbVN0YXJ0OmJ9LHtkdXJhdGlvbjplLm9wdGlvbnMuc3BlZWQsZWFzaW5nOmUub3B0aW9ucy5lYXNpbmcsc3RlcDpmdW5jdGlvbihhKXthPU1hdGguY2VpbChhKSxlLm9wdGlvbnMudmVydGljYWw9PT0hMT8oZFtlLmFuaW1UeXBlXT1cInRyYW5zbGF0ZShcIithK1wicHgsIDBweClcIixlLiRzbGlkZVRyYWNrLmNzcyhkKSk6KGRbZS5hbmltVHlwZV09XCJ0cmFuc2xhdGUoMHB4LFwiK2ErXCJweClcIixlLiRzbGlkZVRyYWNrLmNzcyhkKSl9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7YyYmYy5jYWxsKCl9fSkpOihlLmFwcGx5VHJhbnNpdGlvbigpLGI9TWF0aC5jZWlsKGIpLGUub3B0aW9ucy52ZXJ0aWNhbD09PSExP2RbZS5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZChcIitiK1wicHgsIDBweCwgMHB4KVwiOmRbZS5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZCgwc
6780HgsXCIrYitcInB4LCAwcHgpXCIsZS4kc2xpZGVUcmFjay5jc3MoZCksYyYmc2V0VGltZW91dChmdW5jdGlvbigpe2UuZGlzYWJsZVRyYW5zaXRpb24oKSxjLmNhbGwoKX0sZS5vcHRpb25zLnNwZWVkKSl9LGIucHJvdG90eXBlLmFzTmF2Rm9yPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD1jLm9wdGlvbnMuYXNOYXZGb3I7ZCYmbnVsbCE9PWQmJihkPWEoZCkubm90KGMuJHNsaWRlcikpLG51bGwhPT1kJiZcIm9iamVjdFwiPT10eXBlb2YgZCYmZC5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKS5zbGljayhcImdldFNsaWNrXCIpO2MudW5zbGlja2VkfHxjLnNsaWRlSGFuZGxlcihiLCEwKX0pfSxiLnByb3RvdHlwZS5hcHBseVRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXt9O2Iub3B0aW9ucy5mYWRlPT09ITE/Y1tiLnRyYW5zaXRpb25UeXBlXT1iLnRyYW5zZm9ybVR5cGUrXCIgXCIrYi5vcHRpb25zLnNwZWVkK1wibXMgXCIrYi5vcHRpb25zLmNzc0Vhc2U6Y1tiLnRyYW5zaXRpb25UeXBlXT1cIm9wYWNpdHkgXCIrYi5vcHRpb25zLnNwZWVkK1wibXMgXCIrYi5vcHRpb25zLmNzc0Vhc2UsYi5vcHRpb25zLmZhZGU9PT0hMT9iLiRzbGlkZVRyYWNrLmNzcyhjKTpiLiRzbGlkZXMuZXEoYSkuY3NzKGMpfSxiLnByb3RvdHlwZS5hdXRvUGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5hdXRvUGxheVRpbWVyJiZjbGVhckludGVydmFsKGEuYXV0b1BsYXlUaW1lciksYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmEucGF1c2VkIT09ITAmJihhLmF1dG9QbGF5VGltZXI9c2V0SW50ZXJ2YWwoYS5hdXRvUGxheUl0ZXJhdG9yLGEub3B0aW9ucy5hdXRvcGxheVNwZWVkKSl9LGIucHJvdG90eXBlLmF1dG9QbGF5Q2xlYXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuYXV0b1BsYXlUaW1lciYmY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5VGltZXIpfSxiLnByb3RvdHlwZS5hdXRvUGxheUl0ZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLm9wdGlvbnMuaW5maW5pdGU9PT0hMT8xPT09YS5kaXJlY3Rpb24/KGEuY3VycmVudFNsaWRlKzE9PT1hLnNsaWRlQ291bnQtMSYmKGEuZGlyZWN0aW9uPTApLGEuc2xpZGVIYW5kbGVyKGEuY3VycmVudFNsaWRlK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpOihhLmN1cnJlbnRTbGlkZS0xPT09MCYmKGEuZGlyZWN0aW9uPTEpLGEuc2xpZGVIYW5kbGVyKGEuY3VycmVudFNsaWRlLWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpOmEuc2xpZGVIYW5kbGVyKGEuY3VycmVudFNsaWRlK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCl9LGIucHJvdG90eXBlLmJ1aWxkQXJyb3dzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLm9wdGlvbnMuYXJyb3dzPT09ITAmJihiLiRwcmV2QXJyb3c9YShiLm9wdGlvbnMucHJldkFycm93KS5hZGRDbGFzcyhcInNsaWNrLWFycm93XCIpLGIuJG5leHRBcnJvdz1hKGIub3B0aW9ucy5uZXh0QXJyb3cpLmFkZENsYXNzKFwic2xpY2stYXJyb3dcIiksYi5zbGlkZUNvdW50PmIub3B0aW9ucy5zbGlkZXNUb1Nob3c/KGIuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXhcIiksYi4kbmV4dEFycm93LnJlbW92ZUNsYXNzKFwic2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiB0YWJpbmRleFwiKSxiLmh0bWxFeHByLnRlc3QoYi5vcHRpb25zLnByZXZBcnJvdykmJmIuJHByZXZBcnJvdy5wcmVwZW5kVG8oYi5vcHRpb25zLmFwcGVuZEFycm93cyksYi5odG1sRXhwci50ZXN0KGIub3B0aW9ucy5uZXh0QXJyb3cpJiZiLiRuZXh0QXJyb3cuYXBwZW5kVG8oYi5vcHRpb25zLmFwcGVuZEFycm93cyksYi5vcHRpb25zLmluZmluaXRlIT09ITAmJmIuJHByZXZBcnJvdy5hZGRDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJ0cnVlXCIpKTpiLiRwcmV2QXJyb3cuYWRkKGIuJG5leHRBcnJvdykuYWRkQ2xhc3MoXCJzbGljay1oaWRkZW5cIikuYXR0cih7XCJhcmlhLWRpc2FibGVkXCI6XCJ0cnVlXCIsdGFiaW5kZXg6XCItMVwifSkpfSxiLnByb3RvdHlwZS5idWlsZERvdHM9ZnVuY3Rpb24oKXt2YXIgYyxkLGI9dGhpcztpZihiLm9wdGlvbnMuZG90cz09PSEwJiZiLnNsaWRlQ291bnQ+Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyl7Zm9yKGQ9Jzx1bCBjbGFzcz1cIicrYi5vcHRpb25zLmRvdHNDbGFzcysnXCI+JyxjPTA7Yzw9Yi5nZXREb3RDb3VudCgpO2MrPTEpZCs9XCI8bGk+XCIrYi5vcHRpb25zLmN1c3RvbVBhZ2luZy5jYWxsKHRoaXMsYixjKStcIjwvbGk+XCI7ZCs9XCI8L3VsPlwiLGIuJGRvdHM9YShkKS5hcHBlbmRUbyhiLm9wdGlvbnMuYXBwZW5kRG90cyksYi4kZG90cy5maW5kKFwibGlcIikuZmlyc3QoKS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpfX0sYi5wcm90b3R5cGUuYnVpbGRPdXQ9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2IuJHNsaWRlcz1iLiRzbGlkZXIuY2hpbGRyZW4oYi5vcHRpb25zLnNsaWRlK1wiOm5vdCguc2xpY2stY2xvbmVkKVwiKS5hZGRDbGFzcyhcInNsaWNrLXNsaWRlXCIpLGIuc2xpZGVDb3VudD1iLiRzbGlkZXMubGVuZ3RoLGIuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGIsYyl7YShjKS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLGIpLmRhdGEoXCJvcmlnaW5hbFN0eWxpbmdcIixhKGMpLmF0dHIoXCJzdHlsZVwiKXx8XCJcIil9KSxiLiRzbGlkZXIuYWRkQ2xhc3MoXCJzbGljay1zbGlkZXJcIiksYi4kc2xpZGVUcmFjaz0wPT09Yi5zbGlkZUNvdW50P2EoJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5hcHBlbmRUbyhiLiRzbGlkZXIpOmIuJHNsaWRlcy53cmFwQWxsKCc8ZGl2IGNsYXNzPVwic2xpY2stdHJhY2tcIi8+JykucGFyZW50KCksYi4kbGlzdD1iLiRzbGlkZVRyYWNrLndyYXAoJzxkaXYgYXJpYS1saXZlPVwicG9saXRlXCIgY2xhc3M9XCJzbGljay1saXN0XCIvPicpLnBhcmVudCgpLGIuJHNsaWRlVHJhY2suY3NzKFwib3BhY2l0eVwiLDApLChiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwfHxiLm9wdGlvbnMuc3dpcGVUb1NsaWRlPT09ITApJiYoYi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPTEpLGEoXCJpbWdbZGF0YS1sYXp5XVwiLGIuJHNsaWRlcikubm90KFwiW3NyY11cIikuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLGIuc2V0dXBJbmZpbml0ZSgpLGIuYnVpbGRBcnJvd3MoKSxiLmJ1aWxkRG90cygpLGIudXBkYXRlRG90cygpLGIuc2V0U2xpZGVDbGFzc2VzKFwibnVtYmVyXCI9PXR5cGVvZiBiLmN1cnJlbnRTbGlkZT9iLmN1cnJlbnRTbGlkZTowKSxiLm9wdGlvbnMuZHJhZ2dhYmxlPT09ITAmJmIuJGxpc3QuYWRkQ2xhc3MoXCJkcmFnZ2FibGVcIil9LGIucHJvdG90eXBlLmJ1aWxkUm93cz1mdW5jdGlvbigpe3ZhciBiLGMsZCxlLGYsZyxoLGE9dGhpcztpZihlPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxnPWEuJHNsaWRlci5jaGlsZHJlbigpLGEub3B0aW9ucy5yb3dzPjEpe2ZvcihoPWEub3B0aW9ucy5zbGlkZXNQZXJSb3cqYS5vcHRpb25zLnJvd3MsZj1NYXRoLmNlaWwoZy5sZW5ndGgvaCksYj0wO2Y+YjtiKyspe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKGM9MDtjPGEub3B0aW9ucy5yb3dzO2MrKyl7dmFyIGo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmb3IoZD0wO2Q8YS5vcHRpb25zLnNsaWRlc1BlclJvdztkKyspe3ZhciBrPWIqaCsoYyphLm9wdGlvbnMuc2xpZGVzUGVyUm93K2QpO2cuZ2V0KGspJiZqLmFwcGVuZENoaWxkKGcuZ2V0KGspKX1pLmFwcGVuZENoaWxkKGopfWUuYXBwZW5kQ2hpbGQoaSl9YS4kc2xpZGVyLmh0bWwoZSksYS4
6780kc2xpZGVyLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5jaGlsZHJlbigpLmNzcyh7d2lkdGg6MTAwL2Eub3B0aW9ucy5zbGlkZXNQZXJSb3crXCIlXCIsZGlzcGxheTpcImlubGluZS1ibG9ja1wifSl9fSxiLnByb3RvdHlwZS5jaGVja1Jlc3BvbnNpdmU9ZnVuY3Rpb24oYixjKXt2YXIgZSxmLGcsZD10aGlzLGg9ITEsaT1kLiRzbGlkZXIud2lkdGgoKSxqPXdpbmRvdy5pbm5lcldpZHRofHxhKHdpbmRvdykud2lkdGgoKTtpZihcIndpbmRvd1wiPT09ZC5yZXNwb25kVG8/Zz1qOlwic2xpZGVyXCI9PT1kLnJlc3BvbmRUbz9nPWk6XCJtaW5cIj09PWQucmVzcG9uZFRvJiYoZz1NYXRoLm1pbihqLGkpKSxkLm9wdGlvbnMucmVzcG9uc2l2ZSYmZC5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoJiZudWxsIT09ZC5vcHRpb25zLnJlc3BvbnNpdmUpe2Y9bnVsbDtmb3IoZSBpbiBkLmJyZWFrcG9pbnRzKWQuYnJlYWtwb2ludHMuaGFzT3duUHJvcGVydHkoZSkmJihkLm9yaWdpbmFsU2V0dGluZ3MubW9iaWxlRmlyc3Q9PT0hMT9nPGQuYnJlYWtwb2ludHNbZV0mJihmPWQuYnJlYWtwb2ludHNbZV0pOmc+ZC5icmVha3BvaW50c1tlXSYmKGY9ZC5icmVha3BvaW50c1tlXSkpO251bGwhPT1mP251bGwhPT1kLmFjdGl2ZUJyZWFrcG9pbnQ/KGYhPT1kLmFjdGl2ZUJyZWFrcG9pbnR8fGMpJiYoZC5hY3RpdmVCcmVha3BvaW50PWYsXCJ1bnNsaWNrXCI9PT1kLmJyZWFrcG9pbnRTZXR0aW5nc1tmXT9kLnVuc2xpY2soZik6KGQub3B0aW9ucz1hLmV4dGVuZCh7fSxkLm9yaWdpbmFsU2V0dGluZ3MsZC5icmVha3BvaW50U2V0dGluZ3NbZl0pLGI9PT0hMCYmKGQuY3VycmVudFNsaWRlPWQub3B0aW9ucy5pbml0aWFsU2xpZGUpLGQucmVmcmVzaChiKSksaD1mKTooZC5hY3RpdmVCcmVha3BvaW50PWYsXCJ1bnNsaWNrXCI9PT1kLmJyZWFrcG9pbnRTZXR0aW5nc1tmXT9kLnVuc2xpY2soZik6KGQub3B0aW9ucz1hLmV4dGVuZCh7fSxkLm9yaWdpbmFsU2V0dGluZ3MsZC5icmVha3BvaW50U2V0dGluZ3NbZl0pLGI9PT0hMCYmKGQuY3VycmVudFNsaWRlPWQub3B0aW9ucy5pbml0aWFsU2xpZGUpLGQucmVmcmVzaChiKSksaD1mKTpudWxsIT09ZC5hY3RpdmVCcmVha3BvaW50JiYoZC5hY3RpdmVCcmVha3BvaW50PW51bGwsZC5vcHRpb25zPWQub3JpZ2luYWxTZXR0aW5ncyxiPT09ITAmJihkLmN1cnJlbnRTbGlkZT1kLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxkLnJlZnJlc2goYiksaD1mKSxifHxoPT09ITF8fGQuJHNsaWRlci50cmlnZ2VyKFwiYnJlYWtwb2ludFwiLFtkLGhdKX19LGIucHJvdG90eXBlLmNoYW5nZVNsaWRlPWZ1bmN0aW9uKGIsYyl7dmFyIGYsZyxoLGQ9dGhpcyxlPWEoYi50YXJnZXQpO3N3aXRjaC
6780hlLmlzKFwiYVwiKSYmYi5wcmV2ZW50RGVmYXVsdCgpLGUuaXMoXCJsaVwiKXx8KGU9ZS5jbG9zZXN0KFwibGlcIikpLGg9ZC5zbGlkZUNvdW50JWQub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCE9PTAsZj1oPzA6KGQuc2xpZGVDb3VudC1kLmN1cnJlbnRTbGlkZSklZC5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLGIuZGF0YS5tZXNzYWdlKXtjYXNlXCJwcmV2aW91c1wiOmc9MD09PWY/ZC5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmQub3B0aW9ucy5zbGlkZXNUb1Nob3ctZixkLnNsaWRlQ291bnQ+ZC5vcHRpb25zLnNsaWRlc1RvU2hvdyYmZC5zbGlkZUhhbmRsZXIoZC5jdXJyZW50U2xpZGUtZywhMSxjKTticmVhaztjYXNlXCJuZXh0XCI6Zz0wPT09Zj9kLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6ZixkLnNsaWRlQ291bnQ+ZC5vcHRpb25zLnNsaWRlc1RvU2hvdyYmZC5zbGlkZUhhbmRsZXIoZC5jdXJyZW50U2xpZGUrZywhMSxjKTticmVhaztjYXNlXCJpbmRleFwiOnZhciBpPTA9PT1iLmRhdGEuaW5kZXg/MDpiLmRhdGEuaW5kZXh8fGUuaW5kZXgoKSpkLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7ZC5zbGlkZUhhbmRsZXIoZC5jaGVja05hdmlnYWJsZShpKSwhMSxjKSxlLmNoaWxkcmVuKCkudHJpZ2dlcihcImZvY3VzXCIpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX0sYi5wcm90b3R5cGUuY2hlY2tOYXZpZ2FibGU9ZnVuY3Rpb24oYSl7dmFyIGMsZCxiPXRoaXM7aWYoYz1iLmdldE5hdmlnYWJsZUluZGV4ZXMoKSxkPTAsYT5jW2MubGVuZ3RoLTFdKWE9Y1tjLmxlbmd0aC0xXTtlbHNlIGZvcih2YXIgZSBpbiBjKXtpZihhPGNbZV0pe2E9ZDticmVha31kPWNbZV19cmV0dXJuIGF9LGIucHJvdG90eXBlLmNsZWFuVXBFdmVudHM9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2Iub3B0aW9ucy5kb3RzJiZudWxsIT09Yi4kZG90cyYmKGEoXCJsaVwiLGIuJGRvdHMpLm9mZihcImNsaWNrLnNsaWNrXCIsYi5jaGFuZ2VTbGlkZSksYi5vcHRpb25zLnBhdXNlT25Eb3RzSG92ZXI9PT0hMCYmYi5vcHRpb25zLmF1dG9wbGF5PT09ITAmJmEoXCJsaVwiLGIuJGRvdHMpLm9mZihcIm1vdXNlZW50ZXIuc2xpY2tcIixhLnByb3h5KGIuc2V0UGF1c2VkLGIsITApKS5vZmYoXCJtb3VzZWxlYXZlLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCExKSkpLGIub3B0aW9ucy5hcnJvd3M9PT0hMCYmYi5zbGlkZUNvdW50PmIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihiLiRwcmV2QXJyb3cmJmIuJHByZXZBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiLGIuY2hhbmdlU2xpZGUpLGIuJG5leHRBcnJvdyYmYi4kbmV4dEFycm93Lm9mZihcImNsaWNrLnNsaWNrXCIsYi5jaGFuZ2VTbGlkZSkpLGIuJGxpc3Qub2ZmKFwidG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2tcIixiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vZmYoXCJ0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrXCIsYi5zd2lwZUhhbmRsZXIpLGIuJGxpc3Qub2ZmKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLGIuc3dpcGVIYW5kbGVyKSxiLiRsaXN0Lm9mZihcInRvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2tcIixiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vZmYoXCJjbGljay5zbGlja1wiLGIuY2xpY2tIYW5kbGVyKSxhKGRvY3VtZW50KS5vZmYoYi52aXNpYmlsaXR5Q2hhbmdlLGIudmlzaWJpbGl0eSksYi4kbGlzdC5vZmYoXCJtb3VzZWVudGVyLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCEwKSksYi4kbGlzdC5vZmYoXCJtb3VzZWxlYXZlLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCExKSksYi5vcHRpb25zLmFjY2Vzc2liaWxpdHk9PT0hMCYmYi4kbGlzdC5vZmYoXCJrZXlkb3duLnNsaWNrXCIsYi5rZXlIYW5kbGVyKSxiLm9wdGlvbnMuZm9jdXNPblNlbGVjdD09PSEwJiZhKGIuJHNsaWRlVHJhY2spLmNoaWxkcmVuKCkub2ZmKFwiY2xpY2suc2xpY2tcIixiLnNlbGVjdEhhbmRsZXIpLGEod2luZG93KS5vZmYoXCJvcmllbnRhdGlvbmNoYW5nZS5zbGljay5zbGljay1cIitiLmluc3RhbmNlVWlkLGIub3JpZW50YXRpb25DaGFuZ2UpLGEod2luZG93KS5vZmYoXCJyZXNpemUuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxiLnJlc2l6ZSksYShcIltkcmFnZ2FibGUhPXRydWVdXCIsYi4kc2xpZGVUcmFjaykub2ZmKFwiZHJhZ3N0YXJ0XCIsYi5wcmV2ZW50RGVmYXVsdCksYSh3aW5kb3cpLm9mZihcImxvYWQuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxiLnNldFBvc2l0aW9uKSxhKGRvY3VtZW50KS5vZmYoXCJyZWFkeS5zbGljay5zbGljay1cIitiLmluc3RhbmNlVWlkLGIuc2V0UG9zaXRpb24pfSxiLnByb3RvdHlwZS5jbGVhblVwUm93cz1mdW5jdGlvbigpe3ZhciBiLGE9dGhpczthLm9wdGlvbnMucm93cz4xJiYoYj1hLiRzbGlkZXMuY2hpbGRyZW4oKS5jaGlsZHJlbigpLGIucmVtb3ZlQXR0cihcInN0eWxlXCIpLGEuJHNsaWRlci5odG1sKGIpKX0sYi5wcm90b3R5cGUuY2xpY2tIYW5kbGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7Yi5zaG91bGRDbGljaz09PSExJiYoYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxhLnN0b3BQcm9wYWdhdGlvbigpLGEucHJldmVudERlZmF1bHQoKSl9LGIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcztjLmF1dG9QbGF5Q2xlYXIoKSxjLnRvdWNoT2JqZWN0PXt9LGMuY2xlYW5VcEV2ZW50cygpLGEoXCIuc2xpY2stY2xvbmVkXCIsYy4kc2xpZGVyKS5kZXRhY2goKSxjLiRkb3RzJiZjLiRkb3RzLnJlbW92ZSgpLGMuJHByZXZBcnJvdyYmYy4kcHJldkFycm93Lmxlbmd0aCYmKGMuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkIHNsaWNrLWFycm93IHNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gYXJpYS1kaXNhYmxlZCB0YWJpbmRleFwiKS5jc3MoXCJkaXNwbGF5XCIsXCJcIiksYy5odG1sRXhwci50ZXN0KGMub3B0aW9ucy5wcmV2QXJyb3cpJiZjLiRwcmV2QXJyb3cucmVtb3ZlKCkpLGMuJG5leHRBcnJvdyYmYy4kbmV4dEFycm93Lmxlbmd0aCYmKGMuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkIHNsaWNrLWFycm93IHNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gYXJpYS1kaXNhYmxlZCB0YWJpbmRleFwiKS5jc3MoXCJkaXNwbGF5XCIsXCJcIiksYy5odG1sRXhwci50ZXN0KGMub3B0aW9ucy5uZXh0QXJyb3cpJiZjLiRuZXh0QXJyb3cucmVtb3ZlKCkpLGMuJHNsaWRlcyYmKGMuJHNsaWRlcy5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlIHNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stdmlzaWJsZSBzbGljay1jdXJyZW50XCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiZGF0YS1zbGljay1pbmRleFwiKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5hdHRyKFwic3R5bGVcIixhKHRoaXMpLmRhdGEoXCJvcmlnaW5hbFN0eWxpbmdcIikpfSksYy4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLGMuJHNsaWRlVHJhY2suZGV0YWNoKCksYy4kbGlzdC5kZXRhY2goKSxjLiRzbGlkZXIuYXBwZW5kKGMuJHNsaWRlcykpLGMuY2xlYW5VcFJvd3MoKSxjLiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1zbGlkZXJcIiksYy4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2staW5pdGlhbGl6ZWRcIiksYy51bnNsaWNrZWQ9ITAsYnx8Yy4kc2xpZGVyLnRyaWdnZXIoXCJkZXN0cm95XCIsW2NdKX0sYi5wcm90b3R5cGUuZGlzYWJsZVRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXt9O2NbYi50cmFuc2l0aW9uVHlwZV09XCJcIixiLm9wdGlvbnMuZmFkZT09PSExP2IuJHNsaWRlVHJhY2suY3NzKGMpOmIuJHNsaWRlcy5lcShhKS5jc3MoYyl9LGIucHJvdG90eXBlLmZhZGVTbGlkZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7Yy5jc3NUcmFuc2l0aW9ucz09PSExPyhjLiRzbGlkZXMuZXEoYSkuY3NzKHt6SW5kZXg6Yy5vcHRpb25zLnpJbmRleH0pLGMuJHNsaWRlcy5lcShhKS5hbmltYXRlKHtvcGFjaXR5OjF9LGMub3B0aW9ucy5zcGVlZCxjLm9wdGlvbnMuZWFzaW5nLGIpKTooYy5hcHBseVRyYW5zaXRpb24oYSksYy4kc2xpZGVzLmVxKGEpLmNzcyh7b3BhY2l0eToxLHpJbmRleDpjLm9wdGlvbnMuekluZGV4f
6780SksYiYmc2V0VGltZW91dChmdW5jdGlvbigpe2MuZGlzYWJsZVRyYW5zaXRpb24oYSksYi5jYWxsKCl9LGMub3B0aW9ucy5zcGVlZCkpfSxiLnByb3RvdHlwZS5mYWRlU2xpZGVPdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLmNzc1RyYW5zaXRpb25zPT09ITE/Yi4kc2xpZGVzLmVxKGEpLmFuaW1hdGUoe29wYWNpdHk6MCx6SW5kZXg6Yi5vcHRpb25zLnpJbmRleC0yfSxiLm9wdGlvbnMuc3BlZWQsYi5vcHRpb25zLmVhc2luZyk6KGIuYXBwbHlUcmFuc2l0aW9uKGEpLGIuJHNsaWRlcy5lcShhKS5jc3Moe29wYWNpdHk6MCx6SW5kZXg6Yi5vcHRpb25zLnpJbmRleC0yfSkpfSxiLnByb3RvdHlwZS5maWx0ZXJTbGlkZXM9Yi5wcm90b3R5cGUuc2xpY2tGaWx0ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztudWxsIT09YSYmKGIuJHNsaWRlc0NhY2hlPWIuJHNsaWRlcyxiLnVubG9hZCgpLGIuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxiLiRzbGlkZXNDYWNoZS5maWx0ZXIoYSkuYXBwZW5kVG8oYi4kc2xpZGVUcmFjayksYi5yZWluaXQoKSl9LGIucHJvdG90eXBlLmdldEN1cnJlbnQ9Yi5wcm90b3R5cGUuc2xpY2tDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBhLmN1cnJlbnRTbGlkZX0sYi5wcm90b3R5cGUuZ2V0RG90Q291bnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9MCxjPTAsZD0wO2lmKGEub3B0aW9ucy5pbmZpbml0ZT09PSEwKWZvcig7YjxhLnNsaWRlQ291bnQ7KSsrZCxiPWMrYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLGMrPWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDw9YS5vcHRpb25zLnNsaWRlc1RvU2hvdz9hLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6YS5vcHRpb25zLnNsaWRlc1RvU2hvdztlbHNlIGlmKGEub3B0aW9ucy5jZW50ZXJNb2RlPT09ITApZD1hLnNsaWRlQ291bnQ7ZWxzZSBmb3IoO2I8YS5zbGlkZUNvdW50OykrK2QsYj1jK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxjKz1hLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWEub3B0aW9ucy5zbGlkZXNUb1Nob3c/YS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmEub3B0aW9ucy5zbGlkZXNUb1Nob3c7cmV0dXJuIGQtMX0sYi5wcm90b3R5cGUuZ2V0TGVmdD1mdW5jdGlvbihhKXt2YXIgYyxkLGYsYj10aGlzLGU9MDtyZXR1cm4gYi5zbGlkZU9mZnNldD0wLGQ9Yi4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApLGIub3B0aW9ucy5pbmZpbml0ZT09PSEwPyhiLnNsaWRlQ291bnQ+Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGIuc2xpZGVPZmZzZXQ9Yi5zbGlkZVdpZHRoKmIub3B0aW9ucy5zbGlkZXNUb1Nob3cqLTEsZT1kKmIub3B0aW9ucy5zbGlkZXNUb1Nob3cqLTEpLGIuc2xpZGVDb3VudCViLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPT0wJiZhK2Iub3B0aW9ucy5zbGlkZXNUb1Njcm9sbD5iLnNsaWRlQ291bnQmJmIuc2xpZGVDb3VudD5iLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoYT5iLnNsaWRlQ291bnQ/KGIuc2xpZGVPZmZzZXQ9KGIub3B0aW9ucy5zbGlkZXNUb1Nob3ctKGEtYi5zbGlkZUNvdW50KSkqYi5zbGlkZVdpZHRoKi0xLGU9KGIub3B0aW9ucy5zbGlkZXNUb1Nob3ctKGEtYi5zbGlkZUNvdW50KSkqZCotMSk6KGIuc2xpZGVPZmZzZXQ9Yi5zbGlkZUNvdW50JWIub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCpiLnNsaWRlV2lkdGgqLTEsZT1iLnNsaWRlQ291bnQlYi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKmQqLTEpKSk6YStiLm9wdGlvbnMuc2xpZGVzVG9TaG93PmIuc2xpZGVDb3VudCYmKGIuc2xpZGVPZmZzZXQ9KGErYi5vcHRpb25zLnNsaWRlc1RvU2hvdy1iLnNsaWRlQ291bnQpKmIuc2xpZGVXaWR0aCxlPShhK2Iub3B0aW9ucy5zbGlkZXNUb1Nob3ctYi5zbGlkZUNvdW50KSpkKSxiLnNsaWRlQ291bnQ8PWIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihiLnNsaWRlT2Zmc2V0PTAsZT0wKSxiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiZiLm9wdGlvbnMuaW5maW5pdGU9PT0hMD9iLnNsaWRlT2Zmc2V0Kz1iLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihiLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpLWIuc2xpZGVXaWR0aDpiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiYoYi5zbGlkZU9mZnNldD0wLGIuc2xpZGVPZmZzZXQrPWIuc2xpZGVXaWR0aCpNYXRoLmZsb29yKGIub3B0aW9ucy5zbGlkZXNUb1Nob3cvMikpLGM9Yi5vcHRpb25zLnZlcnRpY2FsPT09ITE/YSpiLnNsaWRlV2lkdGgqLTErYi5zbGlkZU9mZnNldDphKmQqLTErZSxiLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSEwJiYoZj1iLnNsaWRlQ291bnQ8PWIub3B0aW9ucy5zbGlkZXNUb1Nob3d8fGIub3B0aW9ucy5pbmZpbml0ZT09PSExP2IuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoYSk6Yi4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5lcShhK2Iub3B0aW9ucy5zbGlkZXNUb1Nob3cpLGM9Yi5vcHRpb25zLnJ0bD09PSEwP2ZbMF0/LTEqKGIuJHNsaWRlVHJhY2sud2lkdGgoKS1mWzBdLm9mZnNldExlZnQtZi53aWR0aCgpKTowOmZbMF0/LTEqZlswXS5vZmZzZXRMZWZ0OjAsYi5vcHRpb25zLmNlbnRlck1vZGU9PT0hMCYmKGY9Yi5zbGlkZUNvdW50PD1iLm9wdGlvbnMuc2xpZGVzVG9TaG93fHxiLm9wdGlvbnMuaW5maW5pdGU9PT0hMT9iLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGEpOmIuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoYStiLm9wdGlvbnMuc2xpZGVzVG9TaG93KzEpLGM9Yi5vcHRpb25zLnJ0bD09PSEwP2ZbMF0/LTEqKGIuJHNsaWRlVHJhY2sud2lkdGgoKS1mWzBdLm9mZnNldExlZnQtZi53aWR0aCgpKTowOmZbMF0/LTEqZlswXS5vZmZzZXRMZWZ0OjAsYys9KGIuJGxpc3Qud2lkdGgoKS1mLm91dGVyV2lkdGgoKSkvMikpLGN9LGIucHJvdG90eXBlLmdldE9wdGlvbj1iLnByb3RvdHlwZS5zbGlja0dldE9wdGlvbj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3JldHVybiBiLm9wdGlvbnNbYV19LGIucHJvdG90eXBlLmdldE5hdmlnYWJsZUluZGV4ZXM9ZnVuY3Rpb24oKXt2YXIgZSxhPXRoaXMsYj0wLGM9MCxkPVtdO2ZvcihhLm9wdGlvbnMuaW5maW5pdGU9PT0hMT9lPWEuc2xpZGVDb3VudDooYj0tMSphLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsYz0tMSphLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsZT0yKmEuc2xpZGVDb3VudCk7ZT5iOylkLnB1c2goYiksYj1jK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxjKz1hLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWEub3B0aW9ucy5zbGlkZXNUb1Nob3c/YS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmEub3B0aW9ucy5zbGlkZXNUb1Nob3c7cmV0dXJuIGR9LGIucHJvdG90eXBlLmdldFNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGIucHJvdG90eXBlLmdldFNsaWRlQ291bnQ9ZnVuY3Rpb24oKXt2YXIgYyxkLGUsYj10aGlzO3JldHVybiBlPWIub3B0aW9ucy5jZW50ZXJNb2RlPT09ITA/Yi5zbGlkZVdpZHRoKk1hdGguZmxvb3IoYi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKTowLGIub3B0aW9ucy5zd2lwZVRvU2xpZGU9PT0hMD8oYi4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLmVhY2goZnVuY3Rpb24oYyxmKXtyZXR1cm4gZi5vZmZzZXRMZWZ0LWUrYShmKS5vdXRlcldpZHRoKCkvMj4tMSpiLnN3aXBlTGVmdD8oZD1mLCExKTp2b2lkIDB9KSxjPU1hdGguYWJzKGEoZCkuYXR0cihcImRhdGEtc2xpY2staW5kZXhcIiktYi5jdXJyZW50U2xpZGUpfHwxKTpiLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGx9LGIucHJvdG90eXBlLmdvVG89Yi5wcm90b3R5cGUuc2xpY2tHb1RvPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztjLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDpwYXJzZUludChhKX19LGIpfSxiLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7YShjLiRzbGlkZXIpLmhhc0NsYXNzKFwic2xpY2staW5pdGlhbGl6ZWRcIil8fChhKGMuJHNsaWRlcikuYWRkQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKSxjLmJ1aWxkUm93cygpLGMuYnVpbGRPdXQoKSxjLnNldFByb3BzKCksYy5zdGFydExvYWQoKSxjLmxvYWRTbGlkZXIoKSxjLmluaXRpYWxpemVFdmVudHMoKSxjLnVwZGF0ZUFycm93cygpLGMudXBkYXRlRG90cygpKSxiJiZjLiRzbGlkZXIudHJpZ2dlcihcImluaXRcIixbY10pLGMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJmMuaW5pdEFEQSgpfSxiLnByb3RvdHlwZS5pbml0QXJyb3dFdmVudHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2Eub3B0aW9ucy5hcnJvd3M9PT0hMCYmYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihhLiRwcmV2QXJyb3cub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwicHJldmlvdXNcIn0sYS5jaGFuZ2VTbGlkZSksYS4
6780kbmV4dEFycm93Lm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcIm5leHRcIn0sYS5jaGFuZ2VTbGlkZSkpfSxiLnByb3RvdHlwZS5pbml0RG90RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLm9wdGlvbnMuZG90cz09PSEwJiZiLnNsaWRlQ291bnQ+Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmYShcImxpXCIsYi4kZG90cykub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwiaW5kZXhcIn0sYi5jaGFuZ2VTbGlkZSksYi5vcHRpb25zLmRvdHM9PT0hMCYmYi5vcHRpb25zLnBhdXNlT25Eb3RzSG92ZXI9PT0hMCYmYi5vcHRpb25zLmF1dG9wbGF5PT09ITAmJmEoXCJsaVwiLGIuJGRvdHMpLm9uKFwibW91c2VlbnRlci5zbGlja1wiLGEucHJveHkoYi5zZXRQYXVzZWQsYiwhMCkpLm9uKFwibW91c2VsZWF2ZS5zbGlja1wiLGEucHJveHkoYi5zZXRQYXVzZWQsYiwhMSkpfSxiLnByb3RvdHlwZS5pbml0aWFsaXplRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLmluaXRBcnJvd0V2ZW50cygpLGIuaW5pdERvdEV2ZW50cygpLGIuJGxpc3Qub24oXCJ0b3VjaHN0YXJ0LnNsaWNrIG1vdXNlZG93bi5zbGlja1wiLHthY3Rpb246XCJzdGFydFwifSxiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vbihcInRvdWNobW92ZS5zbGljayBtb3VzZW1vdmUuc2xpY2tcIix7YWN0aW9uOlwibW92ZVwifSxiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vbihcInRvdWNoZW5kLnNsaWNrIG1vdXNldXAuc2xpY2tcIix7YWN0aW9uOlwiZW5kXCJ9LGIuc3dpcGVIYW5kbGVyKSxiLiRsaXN0Lm9uKFwidG91Y2hjYW5jZWwuc2xpY2sgbW91c2VsZWF2ZS5zbGlja1wiLHthY3Rpb246XCJlbmRcIn0sYi5zd2lwZUhhbmRsZXIpLGIuJGxpc3Qub24oXCJjbGljay5zbGlja1wiLGIuY2xpY2tIYW5kbGVyKSxhKGRvY3VtZW50KS5vbihiLnZpc2liaWxpdHlDaGFuZ2UsYS5wcm94eShiLnZpc2liaWxpdHksYikpLGIuJGxpc3Qub24oXCJtb3VzZWVudGVyLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCEwKSksYi4kbGlzdC5vbihcIm1vdXNlbGVhdmUuc2xpY2tcIixhLnByb3h5KGIuc2V0UGF1c2VkLGIsITEpKSxiLm9wdGlvbnMuYWNjZXNzaWJpbGl0eT09PSEwJiZiLiRsaXN0Lm9uKFwia2V5ZG93bi5zbGlja1wiLGIua2V5SGFuZGxlciksYi5vcHRpb25zLmZvY3VzT25TZWxlY3Q9PT0hMCYmYShiLiRzbGlkZVRyYWNrKS5jaGlsZHJlbigpLm9uKFwiY2xpY2suc2xpY2tcIixiLnNlbGVjdEhhbmRsZXIpLGEod2luZG93KS5vbihcIm9yaWVudGF0aW9uY2hhbmdlLnNsaWNrLnNsaWNrLVwiK2IuaW5zdGFuY2VVaWQsYS5wcm94eShiLm9yaWVudGF0aW9uQ2hhbmdlLGIpKSxhKHdpbmRvdykub24oXCJyZXNpemUuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxhLnByb3h5KGIucmVzaXplLGIpKSxhKFwiW2RyYWdnYWJsZSE9dHJ1ZV1cIixiLiRzbGlkZVRyYWNrKS5vbihcImRyYWdzdGFydFwiLGIucHJldmVudERlZmF1bHQpLGEod2luZG93KS5vbihcImxvYWQuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxiLnNldFBvc2l0aW9uKSxhKGRvY3VtZW50KS5vbihcInJlYWR5LnNsaWNrLnNsaWNrLVwiK2IuaW5zdGFuY2VVaWQsYi5zZXRQb3NpdGlvbil9LGIucHJvdG90eXBlLmluaXRVST1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5vcHRpb25zLmFycm93cz09PSEwJiZhLnNsaWRlQ291bnQ+YS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGEuJHByZXZBcnJvdy5zaG93KCksYS4kbmV4dEFycm93LnNob3coKSksYS5vcHRpb25zLmRvdHM9PT0hMCYmYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmEuJGRvdHMuc2hvdygpLGEub3B0aW9ucy5hdXRvcGxheT09PSEwJiZhLmF1dG9QbGF5KCl9LGIucHJvdG90eXBlLmtleUhhbmRsZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthLnRhcmdldC50YWdOYW1lLm1hdGNoKFwiVEVYVEFSRUF8SU5QVVR8U0VMRUNUXCIpfHwoMzc9PT1hLmtleUNvZGUmJmIub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITA/Yi5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTpcInByZXZpb3VzXCJ9fSk6Mzk9PT1hLmtleUNvZGUmJmIub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJmIuY2hhbmdlU2xpZGUoe2R
6780hdGE6e21lc3NhZ2U6XCJuZXh0XCJ9fSkpfSxiLnByb3RvdHlwZS5sYXp5TG9hZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGcoYil7YShcImltZ1tkYXRhLWxhenldXCIsYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyksYz1hKHRoaXMpLmF0dHIoXCJkYXRhLWxhenlcIiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO2Qub25sb2FkPWZ1bmN0aW9uKCl7Yi5hbmltYXRlKHtvcGFjaXR5OjB9LDEwMCxmdW5jdGlvbigpe2IuYXR0cihcInNyY1wiLGMpLmFuaW1hdGUoe29wYWNpdHk6MX0sMjAwLGZ1bmN0aW9uKCl7Yi5yZW1vdmVBdHRyKFwiZGF0YS1sYXp5XCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0pfSl9LGQuc3JjPWN9KX12YXIgYyxkLGUsZixiPXRoaXM7Yi5vcHRpb25zLmNlbnRlck1vZGU9PT0hMD9iLm9wdGlvbnMuaW5maW5pdGU9PT0hMD8oZT1iLmN1cnJlbnRTbGlkZSsoYi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKzEpLGY9ZStiLm9wdGlvbnMuc2xpZGVzVG9TaG93KzIpOihlPU1hdGgubWF4KDAsYi5jdXJyZW50U2xpZGUtKGIub3B0aW9ucy5zbGlkZXNUb1Nob3cvMisxKSksZj0yKyhiLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkrYi5jdXJyZW50U2xpZGUpOihlPWIub3B0aW9ucy5pbmZpbml0ZT9iLm9wdGlvbnMuc2xpZGVzVG9TaG93K2IuY3VycmVudFNsaWRlOmIuY3VycmVudFNsaWRlLGY9ZStiLm9wdGlvbnMuc2xpZGVzVG9TaG93LGIub3B0aW9ucy5mYWRlPT09ITAmJihlPjAmJmUtLSxmPD1iLnNsaWRlQ291bnQmJmYrKykpLGM9Yi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stc2xpZGVcIikuc2xpY2UoZSxmKSxnKGMpLGIuc2xpZGVDb3VudDw9Yi5vcHRpb25zLnNsaWRlc1RvU2hvdz8oZD1iLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKSxnKGQpKTpiLmN1cnJlbnRTbGlkZT49Yi5zbGlkZUNvdW50LWIub3B0aW9ucy5zbGlkZXNUb1Nob3c/KGQ9Yi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stY2xvbmVkXCIpLnNsaWNlKDAsYi5vcHRpb25zLnNsaWRlc1RvU2hvdyksZyhkKSk6MD09PWIuY3VycmVudFNsaWRlJiYoZD1iLiRzbGlkZXIuZmluZChcIi5zbGljay1jbG9uZWRcIikuc2xpY2UoLTEqYi5vcHRpb25zLnNsaWRlc1RvU2hvdyksZyhkKSl9LGIucHJvdG90eXBlLmxvYWRTbGlkZXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2Euc2V0UG9zaXRpb24oKSxhLiRzbGlkZVRyYWNrLmNzcyh7b3BhY2l0eToxfSksYS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSxhLmluaXRVSSgpLFwicHJvZ3Jlc3NpdmVcIj09PWEub3B0aW9ucy5sYXp5TG9hZCYmYS5wcm9ncmVzc2l2ZUxhenlMb2FkKCl9LGIucHJvdG90eXBlLm5leHQ9Yi5wcm90b3R5cGUuc2xpY2tOZXh0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwibmV4dFwifX0pfSxiLnByb3RvdHlwZS5vcmllbnRhdGlvbkNoYW5nZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5jaGVja1Jlc3BvbnNpdmUoKSxhLnNldFBvc2l0aW9uKCl9LGIucHJvdG90eXBlLnBhdXNlPWIucHJvdG90eXBlLnNsaWNrUGF1c2U9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuYXV0b1BsYXlDbGVhcigpLGEucGF1c2VkPSEwfSxiLnByb3RvdHlwZS5wbGF5PWIucHJvdG90eXBlLnNsaWNrUGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5wYXVzZWQ9ITEsYS5hdXRvUGxheSgpfSxiLnByb3RvdHlwZS5wb3N0U2xpZGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLiRzbGlkZXIudHJpZ2dlcihcImFmdGVyQ2hhbmdlXCIsW2IsYV0pLGIuYW5pbWF0aW5nPSExLGIuc2V0UG9zaXRpb24oKSxiLnN3aXBlTGVmdD1udWxsLGIub3B0aW9ucy5hdXRvcGxheT09PSEwJiZiLnBhdXNlZD09PSExJiZiLmF1dG9QbGF5KCksYi5vcHRpb25zLmFjY2Vzc2liaWxpdHk9PT0hMCYmYi5pbml0QURBKCl9LGIucHJvdG90eXBlLnByZXY9Yi5wcm90b3R5cGUuc2xpY2tQcmV2PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwicHJldmlvdXNcIn19KX0sYi5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSxiLnByb3RvdHlwZS5wcm9ncmVzc2l2ZUxhenlMb2FkPWZ1bmN0aW9uKCl7dmFyIGMsZCxiPXRoaXM7Yz1hKFwiaW1nW2RhdGEtbGF6eV1cIixiLiRzbGlkZXIpLmxlbmd0aCxjPjAmJihkPWEoXCJpbWdbZGF0YS1sYXp5XVwiLGIuJHNsaWRlcikuZmlyc3QoKSxkLmF0dHIoXCJzcmNcIixudWxsKSxkLmF0dHIoXCJzcmNcIixkLmF0dHIoXCJkYXRhLWxhenlcIikpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKS5sb2FkKGZ1bmN0aW9uKCl7ZC5yZW1vdmVBdHRyKFwiZGF0YS1sYXp5XCIpLGIucHJvZ3Jlc3NpdmVMYXp5TG9hZCgpLGIub3B0aW9ucy5hZGFwdGl2ZUhlaWdodD09PSEwJiZiLnNldFBvc2l0aW9uKCl9KS5lcnJvcihmdW5jdGlvbigpe2QucmVtb3ZlQXR0cihcImRhdGEtbGF6eVwiKSxiLnByb2dyZXNzaXZlTGF6eUxvYWQoKX0pKX0sYi5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbihiKXt2YXIgZCxlLGM9dGhpcztlPWMuc2xpZGVDb3VudC1jLm9wdGlvbnMuc2xpZGVzVG9TaG93LGMub3B0aW9ucy5pbmZpbml0ZXx8KGMuc2xpZGVDb3VudDw9Yy5vcHRpb25zLnNsaWRlc1RvU2hvdz9jLmN1cnJlbnRTbGlkZT0wOmMuY3VycmVudFNsaWRlPmUmJihjLmN1cnJlbnRTbGlkZT1lKSksZD1jLmN1cnJlbnRTbGlkZSxjLmRlc3Ryb3koITApLGEuZXh0ZW5kKGMsYy5pbml0aWFscyx7Y3VycmVudFNsaWRlOmR9KSxjLmluaXQoKSxifHxjLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDpkfX0sITEpfSxiLnByb3RvdHlwZS5yZWdpc3RlckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIGMsZCxlLGI9dGhpcyxmPWIub3B0aW9ucy5yZXNwb25zaXZlfHxudWxsO2lmKFwiYXJyYXlcIj09PWEudHlwZShmKSYmZi5sZW5ndGgpe2IucmVzcG9uZFRvPWIub3B0aW9ucy5yZXNwb25kVG98fFwid2luZG93XCI7Zm9yKGMgaW4gZilpZihlPWIuYnJlYWtwb2ludHMubGVuZ3RoLTEsZD1mW2NdLmJyZWFrcG9pbnQsZi5oYXNPd25Qcm9wZXJ0eShjKSl7Zm9yKDtlPj0wOyliLmJyZWFrcG9pbnRzW2VdJiZiLmJyZWFrcG9pbnRzW2VdPT09ZCYmYi5icmVha3BvaW50cy5zcGxpY2UoZSwxKSxlLS07Yi5icmVha3BvaW50cy5wdXNoKGQpLGIuYnJlYWtwb2ludFNldHRpbmdzW2RdPWZbY10uc2V0dGluZ3N9Yi5icmVha3BvaW50cy5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGIub3B0aW9ucy5tb2JpbGVGaXJzdD9hLWM6Yy1hfSl9fSxiLnByb3RvdHlwZS5yZWluaXQ9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2IuJHNsaWRlcz1iLiRzbGlkZVRyYWNrLmNoaWxkcmVuKGIub3B0aW9ucy5zbGlkZSkuYWRkQ2xhc3MoXCJzbGljay1zbGlkZVwiKSxiLnNsaWRlQ291bnQ9Yi4kc2xpZGVzLmxlbmd0aCxiLmN1cnJlbnRTbGlkZT49Yi5zbGlkZUNvdW50JiYwIT09Yi5jdXJyZW50U2xpZGUmJihiLmN1cnJlbnRTbGlkZT1iLmN1cnJlbnRTbGlkZS1iLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwpLGIuc2xpZGVDb3VudDw9Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGIuY3VycmVudFNsaWRlPTApLGIucmVnaXN0ZXJCcmVha3BvaW50cygpLGIuc2V0UHJvcHMoKSxiLnNldHVwSW5maW5pdGUoKSxiLmJ1aWxkQXJyb3dzKCksYi51cGRhdGVBcnJvd3MoKSxiLmluaXRBcnJvd0V2ZW50cygpLGIuYnVpbGREb3RzKCksYi51cGRhdGVEb3RzKCksYi5pbml0RG90RXZlbnRzKCksYi5jaGVja1Jlc3BvbnNpdmUoITEsITApLGIub3B0aW9ucy5mb2N1c09uU2VsZWN0PT09ITAmJmEoYi4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vbihcImNsaWNrLnNsaWNrXCIsYi5zZWxlY3RIYW5kbGVyKSxiLnNldFNsaWRlQ2xhc3NlcygwKSxiLnNldFBvc2l0aW9uKCksYi4kc2xpZGVyLnRyaWdnZXIoXCJyZUluaXRcIixbYl0pLGIub3B0aW9ucy5hdXRvcGxheT09PSEwJiZiLmZvY3VzSGFuZGxlcigpfSxiLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2Eod2luZG93KS53aWR0aCgpIT09Yi53aW5kb3dXaWR0aCYmKGNsZWFyVGltZW91dChiLndpbmRvd0RlbGF5KSxiLndpbmRvd0RlbGF5PXdpbmRvdy5zZXRUaW
67801lb3V0KGZ1bmN0aW9uKCl7Yi53aW5kb3dXaWR0aD1hKHdpbmRvdykud2lkdGgoKSxiLmNoZWNrUmVzcG9uc2l2ZSgpLGIudW5zbGlja2VkfHxiLnNldFBvc2l0aW9uKCl9LDUwKSl9LGIucHJvdG90eXBlLnJlbW92ZVNsaWRlPWIucHJvdG90eXBlLnNsaWNrUmVtb3ZlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzO3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgYT8oYj1hLGE9Yj09PSEwPzA6ZC5zbGlkZUNvdW50LTEpOmE9Yj09PSEwPy0tYTphLGQuc2xpZGVDb3VudDwxfHwwPmF8fGE+ZC5zbGlkZUNvdW50LTE/ITE6KGQudW5sb2FkKCksYz09PSEwP2QuJHNsaWRlVHJhY2suY2hpbGRyZW4oKS5yZW1vdmUoKTpkLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZXEoYSkucmVtb3ZlKCksZC4kc2xpZGVzPWQuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKSxkLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksZC4kc2xpZGVUcmFjay5hcHBlbmQoZC4kc2xpZGVzKSxkLiRzbGlkZXNDYWNoZT1kLiRzbGlkZXMsdm9pZCBkLnJlaW5pdCgpKX0sYi5wcm90b3R5cGUuc2V0Q1NTPWZ1bmN0aW9uKGEpe3ZhciBkLGUsYj10aGlzLGM9e307Yi5vcHRpb25zLnJ0bD09PSEwJiYoYT0tYSksZD1cImxlZnRcIj09Yi5wb3NpdGlvblByb3A/TWF0aC5jZWlsKGEpK1wicHhcIjpcIjBweFwiLGU9XCJ0b3BcIj09Yi5wb3NpdGlvblByb3A/TWF0aC5jZWlsKGEpK1wicHhcIjpcIjBweFwiLGNbYi5wb3NpdGlvblByb3BdPWEsYi50cmFuc2Zvcm1zRW5hYmxlZD09PSExP2IuJHNsaWRlVHJhY2suY3NzKGMpOihjPXt9LGIuY3NzVHJhbnNpdGlvbnM9PT0hMT8oY1tiLmFuaW1UeXBlXT1cInRyYW5zbGF0ZShcIitkK1wiLCBcIitlK1wiKVwiLGIuJHNsaWRlVHJhY2suY3NzKGMpKTooY1tiLmFuaW1UeXBlXT1cInRyYW5zbGF0ZTNkKFwiK2QrXCIsIFwiK2UrXCIsIDBweClcIixiLiRzbGlkZVRyYWNrLmNzcyhjKSkpfSxiLnByb3RvdHlwZS5zZXREaW1lbnNpb25zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLm9wdGlvbnMudmVydGljYWw9PT0hMT9hLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiZhLiRsaXN0LmNzcyh7cGFkZGluZzpcIjBweCBcIithLm9wdGlvbnMuY2VudGVyUGFkZGluZ30pOihhLiRsaXN0LmhlaWdodChhLiRzbGlkZXMuZmlyc3QoKS5vdXRlckhlaWdodCghMCkqYS5vcHRpb25zLnNsaWRlc1RvU2hvdyksYS5vcHRpb25zLmNlbnRlck1vZGU9PT0hMCYmYS4kbGlzdC5jc3Moe3BhZGRpbmc6YS5vcHRpb25zLmNlbnRlclBhZGRpbmcrXCIgMHB4XCJ9KSksYS5saXN0V2lkdGg9YS4kbGlzdC53aWR0aCgpLGEubGlzdEhlaWdodD1hLiRsaXN0LmhlaWdodCgpLGEub3B0aW9ucy52ZXJ0aWNhbD09PSExJiZhLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSExPyhhLnNsaWRlV2lkdGg9TWF0aC5jZWlsKGEubGlzdFdpZHRoL2Eub3B0aW9ucy5zbGlkZXNUb1Nob3cpLGEuJHNsaWRlVHJhY2sud2lkdGgoTWF0aC5jZWlsKGEuc2xpZGVXaWR0aCphLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmxlbmd0aCkpKTphLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSEwP2EuJHNsaWRlVHJhY2sud2lkdGgoNWUzKmEuc2xpZGVDb3VudCk6KGEuc2xpZGVXaWR0aD1NYXRoLmNlaWwoYS5saXN0V2lkdGgpLGEuJHNsaWRlVHJhY2suaGVpZ2h0KE1hdGguY2VpbChhLiRzbGlkZXMuZmlyc3QoKS5vdXRlckhlaWdodCghMCkqYS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5sZW5ndGgpKSk7dmFyIGI9YS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJXaWR0aCghMCktYS4kc2xpZGVzLmZpcnN0KCkud2lkdGgoKTthLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSExJiZhLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLndpZHRoKGEuc2xpZGVXaWR0aC1iKX0sYi5wcm90b3R5cGUuc2V0RmFkZT1mdW5jdGlvbigpe3ZhciBjLGI9dGhpcztiLiRzbGlkZXMuZWFjaChmdW5jdGlvbihkLGUpe2M9Yi5zbGlkZVdpZHRoKmQqLTEsYi5vcHRpb25zLnJ0bD09PSEwP2EoZSkuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIscmlnaHQ6Yyx0b3A6MCx6SW5kZXg6Yi5vcHRpb25zLnpJbmRleC0yLG9wYWNpdHk6MH0pOmEoZSkuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsbGVmdDpjLHRvcDowLHpJbmRleDpiLm9wdGlvbnMuekluZGV4LTIsb3BhY2l0eTowfSl9KSxiLiRzbGlkZXMuZXEoYi5jdXJyZW50U2xpZGUpLmNzcyh7ekluZGV4OmIub3B0aW9ucy56SW5kZXgtMSxvcGFjaXR5OjF9KX0sYi5wcm90b3R5cGUuc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZigxPT09YS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmYS5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0PT09ITAmJmEub3B0aW9ucy52ZXJ0aWNhbD09PSExKXt2YXIgYj1hLiRzbGlkZXMuZXEoYS5jdXJyZW50U2xpZGUpLm91dGVySGVpZ2h0KCEwKTthLiRsaXN0LmNzcyhcImhlaWdodFwiLGIpfX0sYi5wcm90b3R5cGUuc2V0T3B0aW9uPWIucHJvdG90eXBlLnNsaWNrU2V0T3B0aW9uPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZixnLGU9dGhpcztpZihcInJlc3BvbnNpdmVcIj09PWImJlwiYXJyYXlcIj09PWEudHlwZShjKSlmb3IoZyBpbiBjKWlmKFwiYXJyYXlcIiE9PWEudHlwZShlLm9wdGlvbnMucmVzcG9uc2l2ZSkpZS5vcHRpb25zLnJlc3BvbnNpdmU9W2NbZ11dO2Vsc2V7Zm9yKGY9ZS5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoLTE7Zj49MDspZS5vcHRpb25zLnJlc3BvbnNpdmVbZl0uYnJlYWtwb2ludD09PWNbZ10uYnJlYWtwb2ludCYmZS5vcHRpb25zLnJlc3BvbnNpdmUuc3BsaWNlKGYsMSksZi0tO2Uub3B0aW9ucy5yZXNwb25zaXZlLnB1c2goY1tnXSl9ZWxzZSBlLm9wdGlvbnNbYl09YztkPT09ITAmJihlLnVubG9hZCgpLGUucmVpbml0KCkpfSxiLnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5zZXREaW1lbnNpb25zKCksYS5zZXRIZWlnaHQoKSxhLm9wdGlvbnMuZmFkZT09PSExP2Euc2V0Q1NTKGEuZ2V0TGVmdChhLmN1cnJlbnRTbGlkZSkpOmEuc2V0RmFkZSgpLGEuJHNsaWRlci50cmlnZ2VyKFwic2V0UG9zaXRpb25cIixbYV0pfSxiLnByb3RvdHlwZS5zZXRQcm9wcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1kb2N1bWVudC5ib2R5LnN0eWxlO2EucG9zaXRpb25Qcm9wPWEub3B0aW9ucy52ZXJ0aWNhbD09PSEwP1widG9wXCI6XCJsZWZ0XCIsXCJ0b3BcIj09PWEucG9zaXRpb25Qcm9wP2EuJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLXZlcnRpY2FsXCIpOmEuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLXZlcnRpY2FsXCIpLCh2b2lkIDAhPT1iLldlYmtpdFRyYW5zaXRpb258fHZvaWQgMCE9PWIuTW96VHJhbnNpdGlvbnx8dm9pZCAwIT09Yi5tc1RyYW5zaXRpb24pJiZhLm9wdGlvbnMudXNlQ1NTPT09ITAmJihhLmNzc1RyYW5zaXRpb25zPSEwKSxhLm9wdGlvbnMuZmFkZSYmKFwibnVtYmVyXCI9PXR5cGVvZiBhLm9wdGlvbnMuekluZGV4P2Eub3B0aW9ucy56SW5kZXg8MyYmKGEub3B0aW9ucy56SW5kZXg9Myk6YS5vcHRpb25zLnpJbmRleD1hLmRlZmF1bHRzLnpJbmRleCksdm9pZCAwIT09Yi5PVHJhbnNmb3JtJiYoYS5hbmltVHlwZT1cIk9UcmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCItby10cmFuc2Zvcm1cIixhLnRyYW5zaXRpb25UeXBlPVwiT1RyYW5zaXRpb25cIix2b2lkIDA9PT1iLnBlcnNwZWN0aXZlUHJvcGVydHkmJnZvaWQgMD09PWIud2Via2l0UGVyc3BlY3RpdmUmJihhLmFuaW1UeXBlPSExKSksdm9pZCAwIT09Yi5Nb3pUcmFuc2Zvcm0mJihhLmFuaW1UeXBlPVwiTW96VHJhbnNmb3JtXCIsYS50cmFuc2Zvcm1UeXBlPVwiLW1vei10cmFuc2Zvcm1cIixhLnRyYW5zaXRpb25UeXBlPVwiTW96VHJhbnNpdGlvblwiLHZvaWQgMD09PWIucGVyc3BlY3RpdmVQcm9wZXJ0eSYmdm9pZCAwPT09Yi5Nb3pQZXJzcGVjdGl2ZSYmKGEuYW5pbVR5cGU9ITEpKSx2b2lkIDAhPT1iLndlYmtpdFRyYW5zZm9ybSYmKGEuYW5pbVR5cGU9XCJ3ZWJraXRUcmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCItd2Via2l0LXRyYW5zZm9ybVwiLGEudHJhbnNpdGlvblR5cGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCIsdm9pZCAwPT09Yi5wZXJzcGVjdGl2ZVByb3BlcnR5JiZ2b2lkIDA9PT1iLndlYmtpdFBlcnNwZWN0aXZlJiYoYS5hbmltVHlwZT0hMSkpLHZvaWQgMCE9PWIubXNUcmFuc2Zvcm0mJihhLmFuaW1UeXBlPVwibXNUcmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCItbXMtdHJhbnNmb3JtXCIsYS50cmFuc2l0aW9uVHlwZT1cIm1zVHJhbnNpdGlvblwiLHZvaWQgMD09PWIubXNUcmFuc2Zvcm0mJihhLmFuaW1UeXBlPSExKSksdm9pZCAwIT09Yi50cmFuc2Zvcm0mJmEuYW5pbVR5cGUhPT0hMSYmKGEuYW5pbVR5cGU9XCJ0cmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCJ0cmFuc2Zvcm1cIixhLnRyYW5zaXRpb25UeXBlPVwidHJhbnNpdGlvblwiKSxhLnRyYW5zZm9ybXNFbmFibGVkPWEub3B0aW9ucy51c2VUcmFuc2Zvcm0mJm51bGwhPT1hLmFuaW1UeXBlJiZhLmFuaW1UeXBlIT09ITF9LGIucHJvdG90eXBlLnNldFNsaWRlQ2xhc3Nlcz1mdW5jdGlvbihhKXt2YXIgYyxkLGUsZixiPXRoaXM7ZD1iLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksYi4kc2xpZGVzLmVxKGEpLmFkZENsYXNzKFwic2xpY2stY3VycmVudFwiKSxiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwPyhjPU1hdGguZmxvb3IoYi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKSxiLm9wdGlvbnMuaW5maW5pdGU9PT0hMCYmKGE+PWMmJmE8PWIuc2xpZGVDb3VudC0xLWM/Yi4kc2xpZGVzLnNsaWNlKGEtYyxhK2MrMSkuYWRk
6780Q2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKTooZT1iLm9wdGlvbnMuc2xpZGVzVG9TaG93K2EsZC5zbGljZShlLWMrMSxlK2MrMikuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksMD09PWE/ZC5lcShkLmxlbmd0aC0xLWIub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpOmE9PT1iLnNsaWRlQ291bnQtMSYmZC5lcShiLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKSksYi4kc2xpZGVzLmVxKGEpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpKTphPj0wJiZhPD1iLnNsaWRlQ291bnQtYi5vcHRpb25zLnNsaWRlc1RvU2hvdz9iLiRzbGlkZXMuc2xpY2UoYSxhK2Iub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6ZC5sZW5ndGg8PWIub3B0aW9ucy5zbGlkZXNUb1Nob3c/ZC5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOihmPWIuc2xpZGVDb3VudCViLm9wdGlvbnMuc2xpZGVzVG9TaG93LGU9Yi5vcHRpb25zLmluZmluaXRlPT09ITA/Yi5vcHRpb25zLnNsaWRlc1RvU2hvdythOmEsYi5vcHRpb25zLnNsaWRlc1RvU2hvdz09Yi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsJiZiLnNsaWRlQ291bnQtYTxiLm9wdGlvbnMuc2xpZGVzVG9TaG93P2Quc2xpY2UoZS0oYi5vcHRpb25zLnNsaWRlc1RvU2hvdy1mKSxlK2YpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6ZC5zbGljZShlLGUrYi5vcHRpb25zLnNsaWRlc1RvU2hvdykuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksXCJvbmRlbWFuZFwiPT09Yi5vcHRpb25zLmxhenlMb2FkJiZiLmxhenlMb2FkKCl9LGIucHJvdG90eXBlLnNldHVwSW5maW5pdGU9ZnVuY3Rpb24oKXt2YXIgYyxkLGUsYj10aGlzO2lmKGIub3B0aW9ucy5mYWRlPT09ITAmJihiLm9wdGlvbnMuY2VudGVyTW9kZT0hMSksYi5vcHRpb25zLmluZmluaXRlPT09ITAmJmIub3B0aW9ucy5mYWRlPT09ITEmJihkPW51bGwsYi5zbGlkZUNvdW50PmIub3B0aW9ucy5zbGlkZXNUb1Nob3cpKXtmb3IoZT1iLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwP2Iub3B0aW9ucy5zbGlkZXNUb1Nob3crMTpiLm9wdGlvbnMuc2xpZGVzVG9TaG93LGM9Yi5zbGlkZUNvdW50O2M+Yi5zbGlkZUNvdW50LWU7Yy09MSlkPWMtMSxhKGIuJHNsaWRlc1tkXSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZC1iLnNsaWRlQ291bnQpLnByZXBlbmRUbyhiLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtmb3IoYz0wO2U+YztjKz0xKWQ9YyxhKGIuJHNsaWRlc1tkXSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZCtiLnNsaWRlQ291bnQpLmFwcGVuZFRvKGIuJHNsaWRlVHJhY2spLmFkZENsYXNzKFwic2xpY2stY2xvbmVkXCIpO2IuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikuZmluZChcIltpZF1cIikuZWFjaChmdW5jdGlvbigpe2EodGhpcykuYXR0cihcImlkXCIsXCJcIil9KX19LGIucHJvdG90eXBlLnNldFBhdXNlZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2Iub3B0aW9ucy5hdXRvcGxheT09PSEwJiZiLm9wdGlvbnMucGF1c2VPbkhvdmVyPT09ITAmJihiLnBhdXNlZD1hLGE/Yi5hdXRvUGxheUNsZWFyKCk6Yi5hdXRvUGxheSgpKX0sYi5wcm90b3R5cGUuc2VsZWN0SGFuZGxlcj1mdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9YShiLnRhcmdldCkuaXMoXCIuc2xpY2stc2xpZGVcIik/YShiLnRhcmdldCk6YShiLnRhcmdldCkucGFyZW50cyhcIi5zbGljay1zbGlkZVwiKSxlPXBhcnNlSW50KGQuYXR0cihcImRhdGEtc2xpY2staW5kZXhcIikpO3JldHVybiBlfHwoZT0wKSxjLnNsaWRlQ291bnQ8PWMub3B0aW9ucy5zbGlkZXNUb1Nob3c/KGMuc2V0U2xpZGVDbGFzc2VzKGUpLHZvaWQgYy5hc05hdkZvcihlKSk6dm9pZCBjLnNsaWRlSGFuZGxlcihlKX0sYi5wcm90b3R5cGUuc2xpZGVIYW5kbGVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPW51bGwsaT10aGlzO3JldHVybiBiPWJ8fCExLGkuYW5pbWF0aW5nPT09ITAmJmkub3B0aW9ucy53YWl0Rm9yQW5pbWF0ZT09PSEwfHxpLm9wdGlvbnMuZmFkZT09PSEwJiZpLmN1cnJlbnRTbGlkZT09PWF8fGkuc2xpZGVDb3VudDw9aS5vcHRpb25zLnNsaWRlc1RvU2hvdz92b2lkIDA6KGI9PT0hMSYmaS5hc05hdkZvcihhKSxkPWEsaD1pLmdldExlZnQoZCksZz1pLmdldExlZnQoaS5jdXJyZW50U2xpZGUpLGkuY3VycmVudExlZnQ9bnVsbD09PWkuc3dpcGVMZWZ0P2c6aS5zd2lwZUxlZnQsaS5vcHRpb25zLmluZmluaXRlPT09ITEmJmkub3B0aW9ucy5jZW50ZXJNb2RlPT09ITEmJigwPmF8fGE+aS5nZXREb3RDb3VudCgpKmkub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCk/dm9pZChpLm9wdGlvbnMuZmFkZT09PSExJiYoZD1pLmN1cnJlbnRTbGlkZSxjIT09ITA/aS5hbmltYXRlU2xpZGUoZyxmdW5jdGlvbigpe2kucG9zdFNsaWRlKGQpO1xufSk6aS5wb3N0U2xpZGUoZCkpKTppLm9wdGlvbnMuaW5maW5pdGU9PT0hMSYmaS5vcHRpb25zLmNlbnRlck1vZGU9PT0hMCYmKDA+YXx8YT5pLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKT92b2lkKGkub3B0aW9ucy5mYWRlPT09ITEmJihkPWkuY3VycmVudFNsaWRlLGMhPT0hMD9pLmFuaW1hdGVTbGlkZShnLGZ1bmN0aW9uKCl7aS5wb3N0U2xpZGUoZCl9KTppLnBvc3RTbGlkZShkKSkpOihpLm9wdGlvbnMuYXV0b3BsYXk9PT0hMCYmY2xlYXJJbnRlcnZhbChpLmF1dG9QbGF5VGltZXIpLGU9MD5kP2kuc2xpZGVDb3VudCVpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPT0wP2kuc2xpZGVDb3VudC1pLnNsaWRlQ291bnQlaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmkuc2xpZGVDb3VudCtkOmQ+PWkuc2xpZGVDb3VudD9pLnNsaWRlQ291bnQlaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIT09MD8wOmQtaS5zbGlkZUNvdW50OmQsaS5hbmltYXRpbmc9ITAsaS4kc2xpZGVyLnRyaWdnZXIoXCJiZWZvcmVDaGFuZ2VcIixbaSxpLmN1cnJlbnRTbGlkZSxlXSksZj1pLmN1cnJlbnRTbGlkZSxpLmN1cnJlbnRTbGlkZT1lLGkuc2V0U2xpZGVDbGFzc2VzKGkuY3VycmVudFNsaWRlKSxpLnVwZGF0ZURvdHMoKSxpLnVwZGF0ZUFycm93cygpLGkub3B0aW9ucy5mYWRlPT09ITA/KGMhPT0hMD8oaS5mYWRlU2xpZGVPdXQoZiksaS5mYWRlU2xpZGUoZSxmdW5jdGlvbigpe2kucG9zdFNsaWRlKGUpfSkpOmkucG9zdFNsaWRlKGUpLHZvaWQgaS5hbmltYXRlSGVpZ2h0KCkpOnZvaWQoYyE9PSEwP2kuYW5pbWF0ZVNsaWRlKGgsZnVuY3Rpb24oKXtpLnBvc3RTbGlkZShlKX0pOmkucG9zdFNsaWRlKGUpKSkpfSxiLnByb3RvdHlwZS5zdGFydExvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2Eub3B0aW9ucy5hcnJvd3M9PT0hMCYmYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihhLiRwcmV2QXJyb3cuaGl
6780kZSgpLGEuJG5leHRBcnJvdy5oaWRlKCkpLGEub3B0aW9ucy5kb3RzPT09ITAmJmEuc2xpZGVDb3VudD5hLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZhLiRkb3RzLmhpZGUoKSxhLiRzbGlkZXIuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpfSxiLnByb3RvdHlwZS5zd2lwZURpcmVjdGlvbj1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9dGhpcztyZXR1cm4gYT1lLnRvdWNoT2JqZWN0LnN0YXJ0WC1lLnRvdWNoT2JqZWN0LmN1clgsYj1lLnRvdWNoT2JqZWN0LnN0YXJ0WS1lLnRvdWNoT2JqZWN0LmN1clksYz1NYXRoLmF0YW4yKGIsYSksZD1NYXRoLnJvdW5kKDE4MCpjL01hdGguUEkpLDA+ZCYmKGQ9MzYwLU1hdGguYWJzKGQpKSw0NT49ZCYmZD49MD9lLm9wdGlvbnMucnRsPT09ITE/XCJsZWZ0XCI6XCJyaWdodFwiOjM2MD49ZCYmZD49MzE1P2Uub3B0aW9ucy5ydGw9PT0hMT9cImxlZnRcIjpcInJpZ2h0XCI6ZD49MTM1JiYyMjU+PWQ/ZS5vcHRpb25zLnJ0bD09PSExP1wicmlnaHRcIjpcImxlZnRcIjplLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITA/ZD49MzUmJjEzNT49ZD9cImxlZnRcIjpcInJpZ2h0XCI6XCJ2ZXJ0aWNhbFwifSxiLnByb3RvdHlwZS5zd2lwZUVuZD1mdW5jdGlvbihhKXt2YXIgYyxiPXRoaXM7aWYoYi5kcmFnZ2luZz0hMSxiLnNob3VsZENsaWNrPWIudG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+MTA/ITE6ITAsdm9pZCAwPT09Yi50b3VjaE9iamVjdC5jdXJYKXJldHVybiExO2lmKGIudG91Y2hPYmplY3QuZWRnZUhpdD09PSEwJiZiLiRzbGlkZXIudHJpZ2dlcihcImVkZ2VcIixbYixiLnN3aXBlRGlyZWN0aW9uKCldKSxiLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPj1iLnRvdWNoT2JqZWN0Lm1pblN3aXBlKXN3aXRjaChiLnN3aXBlRGlyZWN0aW9uKCkpe2Nhc2VcImxlZnRcIjpjPWIub3B0aW9ucy5zd2lwZVRvU2xpZGU/Yi5jaGVja05hdmlnYWJsZShiLmN1cnJlbnRTbGlkZStiLmdldFNsaWRlQ291bnQoKSk6Yi5jdXJyZW50U2xpZGUrYi5nZXRTbGlkZUNvdW50KCksYi5zbGlkZUhhbmRsZXIoYyksYi5jdXJyZW50RGlyZWN0aW9uPTAsYi50b3VjaE9iamVjdD17fSxiLiRzbGlkZXIudHJpZ2dlcihcInN3aXBlXCIsW2IsXCJsZWZ0XCJdKTticmVhaztjYXNlXCJyaWdodFwiOmM9Yi5vcHRpb25zLnN3aXBlVG9TbGlkZT9iLmNoZWNrTmF2aWdhYmxlKGIuY3VycmVudFNsaWRlLWIuZ2V0U2xpZGVDb3VudCgpKTpiLmN1cnJlbnRTbGlkZS1iLmdldFNsaWRlQ291bnQoKSxiLnNsaWRlSGFuZGxlcihjKSxiLmN1cnJlbnREaXJlY3Rpb249MSxiLnRvdWNoT2JqZWN0PXt9LGIuJHNsaWRlci50cmlnZ2VyKFwic3dpcGVcIixbYixcInJpZ2h0XCJdKX1lbHNlIGIudG91Y2hPYmplY3Quc3RhcnRYIT09Yi50b3VjaE9iamVjdC5jdXJYJiYoYi5zbGlkZUhhbmRsZXIoYi5jdXJyZW50U2xpZGUpLGIudG91Y2hPYmplY3Q9e30pfSxiLnByb3RvdHlwZS5zd2lwZUhhbmRsZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZighKGIub3B0aW9ucy5zd2lwZT09PSExfHxcIm9udG91Y2hlbmRcImluIGRvY3VtZW50JiZiLm9wdGlvbnMuc3dpcGU9PT0hMXx8Yi5vcHRpb25zLmRyYWdnYWJsZT09PSExJiYtMSE9PWEudHlwZS5pbmRleE9mKFwibW91c2VcIikpKXN3aXRjaChiLnRvdWNoT2JqZWN0LmZpbmdlckNvdW50PWEub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM/YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RoOjEsYi50b3VjaE9iamVjdC5taW5Td2lwZT1iLmxpc3RXaWR0aC9iLm9wdGlvbnMudG91Y2hUaHJlc2hvbGQsYi5vcHRpb25zLnZlcnRpY2FsU3dpcGluZz09PSEwJiYoYi50b3VjaE9iamVjdC5taW5Td2lwZT1iLmxpc3RIZWlnaHQvYi5vcHRpb25zLnRvdWNoVGhyZXNob2xkKSxhLmRhdGEuYWN0aW9uKXtjYXNlXCJzdGFydFwiOmIuc3dpcGVTdGFydChhKTticmVhaztjYXNlXCJtb3ZlXCI6Yi5zd2lwZU1vdmUoYSk7YnJlYWs7Y2FzZVwiZW5kXCI6Yi5zd2lwZUVuZChhKX19LGIucHJvdG90eXBlLnN3aXBlTW92ZT1mdW5jdGlvbihhKXt2YXIgZCxlLGYsZyxoLGI9dGhpcztyZXR1cm4gaD12b2lkIDAhPT1hLm9yaWdpbmFsRXZlbnQ/YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM6bnVsbCwhYi5kcmFnZ2luZ3x8aCYmMSE9PWgubGVuZ3RoPyExOihkPWIuZ2V0TGVmdChiLmN1cnJlbnRTbGlkZSksYi50b3VjaE9iamVjdC5jdXJYPXZvaWQgMCE9PWg/aFswXS5wYWdlWDphLmNsaWVudFgsYi50b3VjaE9iamVjdC5jdXJZPXZvaWQgMCE9PWg/aFswXS5wYWdlWTphLmNsaWVudFksYi50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD1NYXRoLnJvdW5kKE1hdGguc3FydChNYXRoLnBvdyhiLnRvdWNoT2JqZWN0LmN1clgtYi50b3VjaE9iamVjdC5zdGFydFgsMikpKSxiLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITAmJihiLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPU1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGIudG91Y2hPYmplY3QuY3VyWS1iLnRvdWNoT2JqZWN0LnN0YXJ0WSwyKSkpKSxlPWIuc3dpcGVEaXJlY3Rpb24oKSxcInZlcnRpY2FsXCIhPT1lPyh2b2lkIDAhPT1hLm9yaWdpbmFsRXZlbnQmJmIudG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+NCYmYS5wcmV2ZW50RGVmYXVsdCgpLGc9KGIub3B0aW9ucy5ydGw9PT0hMT8xOi0xKSooYi50b3VjaE9iamVjdC5jdXJYPmIudG91Y2hPYmplY3Quc3RhcnRYPzE6LTEpLGIub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmc9PT0hMCYmKGc9Yi50b3VjaE9iamVjdC5jdXJZPmIudG91Y2hPYmplY3Quc3RhcnRZPzE6LTEpLGY9Yi50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCxiLnRvdWNoT2JqZWN0LmVkZ2VIaXQ9ITEsYi5vcHRpb25zLmluZmluaXRlPT09ITEmJigwPT09Yi5jdXJyZW50U2xpZGUmJlwicmlnaHRcIj09PWV8fGIuY3VycmVudFNsaWRlPj1iLmdldERvdENvdW50KCkmJlwibGVmdFwiPT09ZSkmJihmPWIudG91Y2hPYmplY3Quc3dpcGVMZW5ndGgqYi5vcHRpb25zLmVkZ2VGcmljdGlvbixiLnRvdWNoT2JqZWN0LmVkZ2VIaXQ9ITApLGIub3B0aW9ucy52ZXJ0aWNhbD09PSExP2Iuc3dpcGVMZWZ0PWQrZipnOmIuc3dpcGVMZWZ0PWQrZiooYi4kbGlzdC5oZWlnaHQoKS9iLmxpc3RXaWR0aCkqZyxiLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITAmJihiLnN3aXBlTGVmdD1kK2YqZyksYi5vcHRpb25zLmZhZGU9PT0hMHx8Yi5vcHRpb25zLnRvdWNoTW92ZT09PSExPyExOmIuYW5pbWF0aW5nPT09ITA/KGIuc3dpcGVMZWZ0PW51bGwsITEpOnZvaWQgYi5zZXRDU1MoYi5zd2lwZUxlZnQpKTp2b2lkIDApfSxiLnByb3RvdHlwZS5zd2lwZVN0YXJ0PWZ1bmN0aW9uKGEpe3ZhciBjLGI9dGhpcztyZXR1cm4gMSE9PWIudG91Y2hPYmplY3QuZmluZ2VyQ291bnR8fGIuc2xpZGVDb3VudDw9Yi5vcHRpb25zLnNsaWRlc1RvU2hvdz8oYi50b3VjaE9iamVjdD17fSwhMSk6KHZvaWQgMCE9PWEub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJihjPWEub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSxiLnRvdWNoT2JqZWN0LnN0YXJ0WD1iLnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09Yz9jLnBhZ2VYOmEuY2xpZW50WCxiLnRvdWNoT2JqZWN0LnN0YXJ0WT1iLnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09Yz9jLnBhZ2VZOmEuY2xpZW50WSx2b2lkKGIuZHJhZ2dpbmc9ITApKX0sYi5wcm90b3R5cGUudW5maWx0ZXJTbGlkZXM9Yi5wcm90b3R5cGUuc2xpY2tVbmZpbHRlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bnVsbCE9PWEuJHNsaWRlc0NhY2hlJiYoYS51bmxvYWQoKSxhLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksYS4kc2xpZGVzQ2FjaGUuYXBwZW5kVG8oYS4kc2xpZGVUcmFjayksYS5yZWluaXQoKSl9LGIucHJvdG90eXBlLnVubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXM7YShcIi5zbGljay1jbG9uZWRcIixiLiRzbGlkZXIpLnJlbW92ZSgpLGIuJGRvdHMmJmIuJGRvdHMucmVtb3ZlKCksYi4kcHJldkFycm93JiZiLmh0bWxFeHByLnRlc3QoYi5vcHRpb25zLnByZXZBcnJvdykmJmIuJHByZXZBcnJvdy5yZW1vdmUoKSxiLiRuZXh0QXJyb3cmJmIuaHRtbEV4cHIudGVzdChiLm9wdGlvbnMubmV4dEFycm93KSYmYi4kbmV4dEFycm93LnJlbW92ZSgpLGIuJHNsaWRlcy5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlIHNsaWNrLWFjdGl2ZSBzbGljay12aXNpYmxlIHNsaWNrLWN1cnJlbnRcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLmNzcyhcIndpZHRoXCIsXCJcIil9LGIucHJvdG90eXBlLnVuc2xpY2s9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLiRzbGlkZXIudHJpZ2dlcihcInVuc2xpY2tcIixbYixhXSksYi5kZXN0cm95KCl9LGIucHJvdG90eXBlLnVwZGF0ZUFycm93cz1mdW5jdGlvbigpe3ZhciBiLGE9dGhpcztiPU1hdGguZmxvb3IoYS5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKSxhLm9wdGlvbnMuYXJyb3dzPT09ITAmJmEuc2xpZGVDb3VudD5hLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYhYS5vcHRpb25zLmluZmluaXRlJiYoYS4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcImZhbHNlXCIpLGEuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSwwPT09YS5jdXJyZW50U2xpZGU/KGEuJHByZXZBcnJvdy5hZGRDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJ0cnVlXCIpLGEuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSk6YS5jdXJyZW50U2xpZGU+PWEuc2xpZGVDb3VudC1hLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZhLm9wdGlvbnMuY2VudGVyTW9kZT09PSExPyhhLiRuZXh0QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxhLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpOmEuY3VycmVudFNsaWRlPj1hLnNsaWRlQ291bnQtMSYmYS5vcHRpb25zLmNlbn
6780Rlck1vZGU9PT0hMCYmKGEuJG5leHRBcnJvdy5hZGRDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJ0cnVlXCIpLGEuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSkpfSxiLnByb3RvdHlwZS51cGRhdGVEb3RzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztudWxsIT09YS4kZG90cyYmKGEuJGRvdHMuZmluZChcImxpXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSxhLiRkb3RzLmZpbmQoXCJsaVwiKS5lcShNYXRoLmZsb29yKGEuY3VycmVudFNsaWRlL2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpfSxiLnByb3RvdHlwZS52aXNpYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztkb2N1bWVudFthLmhpZGRlbl0/KGEucGF1c2VkPSEwLGEuYXV0b1BsYXlDbGVhcigpKTphLm9wdGlvbnMuYXV0b3BsYXk9PT0hMCYmKGEucGF1c2VkPSExLGEuYXV0b1BsYXkoKSl9LGIucHJvdG90eXBlLmluaXRBREE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2IuJHNsaWRlcy5hZGQoYi4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWNsb25lZFwiKSkuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCItMVwifSksYi4kc2xpZGVUcmFjay5hdHRyKFwicm9sZVwiLFwibGlzdGJveFwiKSxiLiRzbGlkZXMubm90KGIuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikpLmVhY2goZnVuY3Rpb24oYyl7YSh0aGlzKS5hdHRyKHtyb2xlOlwib3B0aW9uXCIsXCJhcmlhLWRlc2NyaWJlZGJ5XCI6XCJzbGljay1zbGlkZVwiK2IuaW5zdGFuY2VVaWQrY30pfSksbnVsbCE9PWIuJGRvdHMmJmIuJGRvdHMuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIikuZmluZChcImxpXCIpLmVhY2goZnVuY3Rpb24oYyl7YSh0aGlzKS5hdHRyKHtyb2xlOlwicHJlc2VudGF0aW9uXCIsXCJhcmlhLXNlbGVjdGVkXCI6XCJmYWxzZVwiLFwiYXJpYS1jb250cm9sc1wiOlwibmF2aWdhdGlvblwiK2IuaW5zdGFuY2VVaWQrYyxpZDpcInNsaWNrLXNsaWRlXCIrYi5pbnN0YW5jZVVpZCtjfSl9KS5maXJzdCgpLmF0dHIoXCJhcmlhLXNlbGVjdGVkXCIsXCJ0cnVlXCIpLmVuZCgpLmZpbmQoXCJidXR0b25cIikuYXR0cihcInJvbGVcIixcImJ1dHRvblwiKS5lbmQoKS5jbG9zZXN0KFwiZGl2XCIpLmF0dHIoXCJyb2xlXCIsXCJ0b29sYmFyXCIpLGIuYWN0aXZhdGVBREEoKX0sYi5wcm90b3R5cGUuYWN0aXZhdGVBREE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCIwXCJ9KX0sYi5wcm90b3R5cGUuZm9jdXNIYW5kbGVyPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLiRzbGlkZXIub24oXCJmb2N1cy5zbGljayBibHVyLnNsaWNrXCIsXCIqXCIsZnVuY3Rpb24oYyl7Yy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTt2YXIgZD1hKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtiLmlzUGxheSYmKGQuaXMoXCI6Zm9jdXNcIik/KGIuYXV0b1BsYXlDbGVhcigpLGIucGF1c2VkPSEwKTooYi5wYXVzZWQ9ITEsYi5hdXRvUGxheSgpKSl9LDApfSl9LGEuZm4uc2xpY2s9ZnVuY3Rpb24oKXt2YXIgZixnLGE9dGhpcyxjPWFyZ3VtZW50c1swXSxkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxlPWEubGVuZ3RoO2ZvcihmPTA7ZT5mO2YrKylpZihcIm9iamVjdFwiPT10eXBlb2YgY3x8XCJ1bmRlZmluZWRcIj09dHlwZW9mIGM/YVtmXS5zbGljaz1uZXcgYihhW2ZdLGMpOmc9YVtmXS5zbGlja1tjXS5hcHBseShhW2ZdLnNsaWNrLGQpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBnKXJldHVybiBnO3JldHVybiBhfX0pOyIsIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBmYW5jeUJveCB2My41Ljdcbi8vXG4vLyBMaWNlbnNlZCBHUEx2MyBmb3Igb3BlbiBzb3VyY2UgdXNlXG4vLyBvciBmYW5jeUJveCBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlXG4vL1xuLy8gaHR0cDovL2ZhbmN5YXBwcy5jb20vZmFuY3lib3gvXG4vLyBDb3B5cmlnaHQgMjAxOSBmYW5jeUFwcHNcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkLCB1bmRlZmluZWQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0d2luZG93LmNvbnNvbGUgPSB3aW5kb3cuY29uc29sZSB8fCB7XG5cdFx0aW5mbzogZnVuY3Rpb24gKHN0dWZmKSB7fVxuXHR9O1xuXG5cdC8vIElmIHRoZXJlJ3Mgbm8galF1ZXJ5LCBmYW5jeUJveCBjYW4ndCB3b3JrXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0aWYgKCEkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgZmFuY3lCb3ggaXMgYWxyZWFkeSBpbml0aWFsaXplZFxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0aWYgKCQuZm4uZmFuY3lib3gpIHtcblx0XHRjb25zb2xlLmluZm8oXCJmYW5jeUJveCBhbHJlYWR5IGluaXRpYWxpemVkXCIpO1xuXG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUHJpdmF0ZSBkZWZhdWx0IHNldHRpbmdzXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHQvLyBDbG9zZSBleGlzdGluZyBtb2RhbHNcblx0XHQvLyBTZXQgdGhpcyB0byBmYWxzZSBpZiB5b3UgZG8gbm90IG5lZWQgdG8gc3RhY2sgbXVsdGlwbGUgaW5zdGFuY2VzXG5cdFx0Y2xvc2VFeGlzdGluZzogZmFsc2UsXG5cblx0XHQvLyBFbmFibGUgaW5maW5pdGUgZ2FsbGVyeSBuYXZpZ2F0aW9uXG5cdFx0bG9vcDogZmFsc2UsXG5cblx0XHQvLyBIb3Jpem9udGFsIHNwYWNlIGJldHdlZW4gc2xpZGVzXG5cdFx0Z3V0dG
6780VyOiA1MCxcblxuXHRcdC8vIEVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG5cdFx0a2V5Ym9hcmQ6IHRydWUsXG5cblx0XHQvLyBTaG91bGQgYWxsb3cgY2FwdGlvbiB0byBvdmVybGFwIHRoZSBjb250ZW50XG5cdFx0cHJldmVudENhcHRpb25PdmVybGFwOiB0cnVlLFxuXG5cdFx0Ly8gU2hvdWxkIGRpc3BsYXkgbmF2aWdhdGlvbiBhcnJvd3MgYXQgdGhlIHNjcmVlbiBlZGdlc1xuXHRcdGFycm93czogdHJ1ZSxcblxuXHRcdC8vIFNob3VsZCBkaXNwbGF5IGNvdW50ZXIgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lclxuXHRcdGluZm9iYXI6IHRydWUsXG5cblx0XHQvLyBTaG91bGQgZGlzcGxheSBjbG9zZSBidXR0b24gKHVzaW5nIGBidG5UcGwuc21hbGxCdG5gIHRlbXBsYXRlKSBvdmVyIHRoZSBjb250ZW50XG5cdFx0Ly8gQ2FuIGJlIHRydWUsIGZhbHNlLCBcImF1dG9cIlxuXHRcdC8vIElmIFwiYXV0b1wiIC0gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgZm9yIFwiaHRtbFwiLCBcImlubGluZVwiIG9yIFwiYWpheFwiIGl0ZW1zXG5cdFx0c21hbGxCdG46IFwiYXV0b1wiLFxuXG5cdFx0Ly8gU2hvdWxkIGRpc3BsYXkgdG9vbGJhciAoYnV0dG9ucyBhdCB0aGUgdG9wKVxuXHRcdC8vIENhbiBiZSB0cnVlLCBmYWxzZSwgXCJhdXRvXCJcblx0XHQvLyBJZiBcImF1dG9cIiAtIHdpbGwgYmUgYXV0b21hdGljYWxseSBoaWRkZW4gaWYgXCJzbWFsbEJ0blwiIGlzIGVuYWJsZWRcblx0XHR0b29sYmFyOiBcImF1dG9cIixcblxuXHRcdC8vIFdoYXQgYnV0dG9ucyBzaG91bGQgYXBwZWFyIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyLlxuXHRcdC8vIEJ1dHRvbnMgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRlbXBsYXRlcyBmcm9tIGBidG5UcGxgIG9wdGlvblxuXHRcdC8vIGFuZCB0aGV5IHdpbGwgYmUgcGxhY2VkIGludG8gdG9vbGJhciAoY2xhc3M9XCJmYW5jeWJveC10b29sYmFyXCJgIGVsZW1lbnQpXG5cdFx0YnV0dG9uczogW1xuXHRcdFx0XCJ6b29tXCIsXG5cdFx0XHQvL1wic2hhcmVcIixcblx0XHRcdFwic2xpZGVTaG93XCIsXG5cdFx0XHQvL1wiZnVsbFNjcmVlblwiLFxuXHRcdFx0Ly9cImRvd25sb2FkXCIsXG5cdFx0XHRcInRodW1ic1wiLFxuXHRcdFx0XCJjbG9zZVwiXG5cdFx0XSxcblxuXHRcdC8vIERldGVjdCBcImlkbGVcIiB0aW1lIGluIHNlY29uZHNcblx0XHRpZGxlVGltZTogMyxcblxuXHRcdC8vIERpc2FibGUgcmlnaHQtY2xpY2sgYW5kIHVzZSBzaW1wbGUgaW1hZ2UgcHJvdGVjdGlvbiBmb3IgaW1hZ2VzXG5cdFx0cHJvdGVjdDogZmFsc2UsXG5cblx0XHQvLyBTaG9ydGN1dCB0byBtYWtlIGNvbnRlbnQgXCJtb2RhbFwiIC0gZGlzYWJsZSBrZXlib2FyZCBuYXZpZ3Rpb24sIGhpZGUgYnV0dG9ucywgZXRjXG5cdFx0bW9kYWw6IGZhbHNlLFxuXG5cdFx0aW1hZ2U6IHtcblx0XHRcdC8vIFdhaXQgZm9yIGltYWdlcyB0byBsb2FkIGJlZm9yZSBkaXNwbGF5aW5nXG5cdFx0XHQvLyAgIHRydWUgIC0gd2FpdCBmb3IgaW1hZ2UgdG8gbG9hZCBhbmQgdGhlbiBkaXNwbGF5O1xuXHRcdFx0Ly8gICBmYWxzZSAtIGRpc3BsYXkgdGh1bWJuYWlsIGFuZCBsb2FkIHRoZSBmdWxsLXNpemVkIGltYWdlIG92ZXIgdG9wLFxuXHRcdFx0Ly8gICAgICAgICAgIHJlcXVpcmVzIHByZWRlZmluZWQgaW1hZ2UgZGltZW5zaW9ucyAoYGRhdGEtd2lkdGhgIGFuZCBgZGF0YS1oZWlnaHRgIGF0dHJpYnV0ZXMpXG5cdFx0XHRwcmVsb2FkOiBmYWxzZVxuXHRcdH0sXG5cblx0XHRhamF4OiB7XG5cdFx0XHQvLyBPYmplY3QgY29udGFpbmluZyBzZXR0aW5ncyBmb3IgYWpheCByZXF1ZXN0XG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHQvLyBUaGlzIGhlbHBzIHRvIGluZGljYXRlIHRoYXQgcmVxdWVzdCBjb21lcyBmcm9tIHRoZSBtb2RhbFxuXHRcdFx0XHQvLyBGZWVsIGZyZWUgdG8gY2hhbmdlIG5hbWluZ1xuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0ZmFuY3lib3g6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRpZnJhbWU6IHtcblx0XHRcdC8vIElmcmFtZSB0ZW1wbGF0ZVxuXHRcdFx0dHBsOiAnPGlmcmFtZSBpZD1cImZhbmN5Ym94LWZyYW1le3JuZH1cIiBuYW1lPVwiZmFuY3lib3gtZnJhbWV7cm5kfVwiIGNsYXNzPVwiZmFuY3lib3gtaWZyYW1lXCIgYWxsb3dmdWxsc2NyZWVuPVwiYWxsb3dmdWxsc2NyZWVuXCIgYWxsb3c9XCJhdXRvcGxheTsgZnVsbHNjcmVlblwiIHNyYz1cIlwiPjwvaWZyYW1lPicsXG5cblx0XHRcdC8vIFByZWxvYWQgaWZyYW1lIGJlZm9yZSBkaXNwbGF5aW5nIGl0XG5cdFx0XHQvLyBUaGlzIGFsbG93cyB0byBjYWxjdWxhdGUgaWZyYW1lIGNvbnRlbnQgd2lkdGggYW5kIGhlaWdodFxuXHRcdFx0Ly8gKG5vdGU6IER1ZSB0byBcIlNhbWUgT3JpZ2luIFBvbGljeVwiLCB5b3UgY2FuJ3QgZ2V0IGNyb3NzIGRvbWFpbiBkYXRhKS5cblx0XHRcdHByZWxvYWQ6IHRydWUsXG5cblx0XHRcdC8vIEN1c3RvbSBDU1Mgc3R5bGluZyBmb3IgaWZyYW1lIHdyYXBwaW5nIGVsZW1lbnRcblx0XHRcdC8vIFlvdSBjYW4gdXNlIHRoaXMgdG8gc2V0IGN1c3RvbSBpZnJhbWUgZGltZW5zaW9uc1xuXHRcdFx0Y3NzOiB7fSxcblxuXHRcdFx0Ly8gSWZyYW1lIHRhZyBhdHRyaWJ1dGVzXG5cdFx0XHRhdHRyOiB7XG5cdFx0XHRcdHNjcm9sbGluZzogXCJhdXRvXCJcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gRm9yIEhUTUw1IHZpZGVvIG9ubHlcblx0XHR2aWRlbzoge1xuXHRcdFx0dHBsOiAnPHZpZGVvIGNsYXNzPVwiZmFuY3lib3gtdmlkZW9cIiBjb250cm9scyBjb250cm9sc0xpc3Q9XCJub2Rvd25sb2FkXCIgcG9zdGVyPVwie3twb3N0ZXJ9fVwiPicgK1xuXHRcdFx0XHQnPHNvdXJjZSBzcmM9XCJ7e3NyY319XCIgdHlwZT1cInt7Zm9ybWF0fX1cIiAvPicgK1xuXHRcdFx0XHQnU29ycnksIHlvdXIgYnJvd3NlciBkb2VzblxcJ3Qgc3VwcG9ydCBlbWJlZGRlZCB2aWRlb3MsIDxhIGhyZWY9XCJ7e3NyY319XCI+ZG93bmxvYWQ8L2E+IGFuZCB3YXRjaCB3aXRoIHlvdXIgZmF2b3JpdGUgdmlkZW8gcGxheWVyIScgK1xuXHRcdFx0XHRcIjwvdmlkZW8+XCIsXG5cdFx0XHRmb3JtYXQ6IFwiXCIsIC8vIGN1c3RvbSB2aWRlbyBmb3JtYXRcblx0XHRcdGF1dG9TdGFydDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvLyBEZWZhdWx0IGNvbnRlbnQgdHlwZSBpZiBjYW5ub3QgYmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseVxuXHRcdGRlZmF1bHRUeXBlOiBcImltYWdlXCIsXG5cblx0XHQvLyBPcGVuL2Nsb3NlIGFuaW1hdGlvbiB0eXBlXG5cdFx0Ly8gUG9zc2libGUgdmFsdWVzOlxuXHRcdC8vICAgZmFsc2UgICAgICAgICAgICAtIGRpc2FibGVcblx0XHQvLyAgIFwiem9vbVwiICAgICAgICAgICAtIHpvb20gaW1hZ2VzIGZyb20vdG8gdGh1bWJuYWlsXG5cdFx0Ly8gICBcImZhZGVcIlxuXHRcdC8vICAgXCJ6b29tLWluLW91dFwiXG5cdFx0Ly9cblx0XHRhbmltYXRpb25FZmZlY3Q6IFwiem9vbVwiLFxuXG5cdFx0Ly8gRHVyYXRpb24gaW4gbXMgZm9yIG9wZW4vY2xvc2UgYW5pbWF0aW9uXG5cdFx0YW5pbWF0aW9uRHVyYXRpb246IDM2NixcblxuXHRcdC8vIFNob3VsZCBpbWFnZSBjaGFuZ2Ugb3BhY2l0eSB3aGlsZSB6b29taW5nXG5cdFx0Ly8gSWYgb3BhY2l0eSBpcyBcImF1dG9cIiwgdGhlbiBvcGFjaXR5IHdpbGwgYmUgY2hhbmdlZCBpZiBpbWFnZSBhbmQgdGh1bWJuYWlsIGhhdmUgZGlmZmVyZW50IGFzcGVjdCByYXRpb3Ncblx0XHR6b29tT3BhY2l0eTogXCJhdXRvXCIsXG5cblx0XHQvLyBUcmFuc2l0aW9uIGVmZmVjdCBiZXR3ZWVuIHNsaWRlc1xuXHRcdC8vXG5cdFx0Ly8gUG9zc2libGUgdmFsdWVzOlxuXHRcdC8vICAgZmFsc2UgICAgICAgICAgICAtIGRpc2FibGVcblx0XHQvLyAgIFwiZmFkZSdcblx0XHQvLyAgIFwic2xpZGUnXG5cdFx0Ly8gICBcImNpcmN1bGFyJ1xuXHRcdC8vICAgXCJ0dWJlJ1xuXHRcdC8vICAgXCJ6b29tLWluLW91dCdcblx0XHQvLyAgIFwicm90YXRlJ1xuXHRcdC8vXG5cdFx0dHJhbnNpdGlvbkVmZmVjd
6780DogXCJmYWRlXCIsXG5cblx0XHQvLyBEdXJhdGlvbiBpbiBtcyBmb3IgdHJhbnNpdGlvbiBhbmltYXRpb25cblx0XHR0cmFuc2l0aW9uRHVyYXRpb246IDM2NixcblxuXHRcdC8vIEN1c3RvbSBDU1MgY2xhc3MgZm9yIHNsaWRlIGVsZW1lbnRcblx0XHRzbGlkZUNsYXNzOiBcIlwiLFxuXG5cdFx0Ly8gQ3VzdG9tIENTUyBjbGFzcyBmb3IgbGF5b3V0XG5cdFx0YmFzZUNsYXNzOiBcIlwiLFxuXG5cdFx0Ly8gQmFzZSB0ZW1wbGF0ZSBmb3IgbGF5b3V0XG5cdFx0YmFzZVRwbDogJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1jb250YWluZXJcIiByb2xlPVwiZGlhbG9nXCIgdGFiaW5kZXg9XCItMVwiPicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC1iZ1wiPjwvZGl2PicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC1pbm5lclwiPicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC1pbmZvYmFyXCI+PHNwYW4gZGF0YS1mYW5jeWJveC1pbmRleD48L3NwYW4+Jm5ic3A7LyZuYnNwOzxzcGFuIGRhdGEtZmFuY3lib3gtY291bnQ+PC9zcGFuPjwvZGl2PicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC10b29sYmFyXCI+e3tidXR0b25zfX08L2Rpdj4nICtcblx0XHRcdCc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtbmF2aWdhdGlvblwiPnt7YXJyb3dzfX08L2Rpdj4nICtcblx0XHRcdCc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtc3RhZ2VcIj48L2Rpdj4nICtcblx0XHRcdCc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtY2FwdGlvblwiPjxkaXYgY2xhc3M9XCJmYW5jeWJveC1jYXB0aW9uX19ib2R5XCI+PC9kaXY+PC9kaXY+JyArXG5cdFx0XHRcIjwvZGl2PlwiICtcblx0XHRcdFwiPC9kaXY+XCIsXG5cblx0XHQvLyBMb2FkaW5nIGluZGljYXRvciB0ZW1wbGF0ZVxuXHRcdHNwaW5uZXJUcGw6ICc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtbG9hZGluZ1wiPjwvZGl2PicsXG5cblx0XHQvLyBFcnJvciBtZXNzYWdlIHRlbXBsYXRlXG5cdFx0ZXJyb3JUcGw6ICc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtZXJyb3JcIj48cD57e0VSUk9SfX08L3A+PC9kaXY+JyxcblxuXHRcdGJ0blRwbDoge1xuXHRcdFx0ZG93bmxvYWQ6ICc8YSBkb3dubG9hZCBkYXRhLWZhbmN5Ym94LWRvd25sb2FkIGNsYXNzPVwiZmFuY3lib3gtYnV0dG9uIGZhbmN5Ym94LWJ1dHRvbi0tZG93bmxvYWRcIiB0aXRsZT1cInt7RE9XTkxPQUR9fVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIj4nICtcblx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTE4LjYyIDE3LjA5VjE5SDUuMzh2LTEuOTF6bS0yLjk3LTYuOTZMMTcgMTEuNDVsLTUgNC44Ny01LTQuODcgMS4zNi0xLjMyIDIuNjggMi42NFY1aDEuOTJ2Ny43N3pcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9hPlwiLFxuXG5cdFx0XHR6b29tOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LXpvb20gY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS16b29tXCIgdGl0bGU9XCJ7e1pPT019fVwiPicgK1xuXHRcdFx0XHQnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTguNyAxNy4zbC0zLTNhNS45IDUuOSAwIDAgMC0uNi03LjYgNS45IDUuOSAwIDAgMC04LjQgMCA1LjkgNS45IDAgMCAwIDAgOC40IDUuOSA1LjkgMCAwIDAgNy43LjdsMyAzYTEgMSAwIDAgMCAxLjMgMGMuNC0uNS40LTEgMC0xLjV6TTguMSAxMy44YTQgNCAwIDAgMSAwLTUuNyA0IDQgMCAwIDEgNS43IDAgNCA0IDAgMCAxIDAgNS43IDQgNCAwIDAgMS01LjcgMHpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCIsXG5cblx0XHRcdGNsb3NlOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LWNsb3NlIGNsYXNzPVwiZmFuY3lib3gtYnV0dG9uIGZhbmN5Ym94LWJ1dHRvbi0tY2xvc2VcIiB0aXRsZT1cInt7Q0xPU0V9fVwiPicgK1xuXHRcdFx0XHQnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTIgMTAuNkw2LjYgNS4yIDUuMiA2LjZsNS40IDUuNC01LjQgNS40IDEuNCAxLjQgNS40LTUuNCA1LjQgNS40IDEuNC0xLjQtNS40LTUuNCA1LjQtNS40LTEuNC0xLjQtNS40IDUuNHpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCIsXG5cblx0XHRcdC8vIEFycm93c1xuXHRcdFx0YXJyb3dMZWZ0OiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LXByZXYgY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS1hcnJvd19sZWZ0XCIgdGl0bGU9XCJ7e1BSRVZ9fVwiPicgK1xuXHRcdFx0XHQnPGRpdj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMS4yOCAxNS43bC0xLjM0IDEuMzdMNSAxMmw0Ljk0LTUuMDcgMS4zNCAxLjM4LTIuNjggMi43MkgxOXYxLjk0SDguNnpcIi8+PC9zdmc+PC9kaXY+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCIsXG5cblx0XHRcdGFycm93UmlnaHQ6ICc8YnV0dG9uIGRhdGEtZmFuY3lib3gtbmV4dCBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1idXR0b24tLWFycm93X3JpZ2h0XCIgdGl0bGU9XCJ7e05FWFR9fVwiPicgK1xuXHRcdFx0XHQnPGRpdj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNS40IDEyLjk3bC0yLjY4IDIuNzIgMS4zNCAxLjM4TDE5IDEybC00Ljk0LTUuMDctMS4zNCAxLjM4IDIuNjggMi43Mkg1djEuOTR6XCIvPjwvc3ZnPjwvZGl2PicgK1xuXHRcdFx0XHRcIjwvYnV0dG9uPlwiLFxuXG5cdFx0XHQvLyBUaGlzIHNtYWxsIGNsb3NlIGJ1dHRvbiB3aWxsIGJlIGFwcGVuZGVkIHRvIHlvdXIgaHRtbC9pbmxpbmUvYWpheCBjb250ZW50IGJ5IGRlZmF1bHQsXG5cdFx0XHQvLyBpZiBcInNtYWxsQnRuXCIgb3B0aW9uIGlzIG5vdCBzZXQgdG8gZmFsc2Vcblx0XHRcdHNtYWxsQnRuOiAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1mYW5jeWJveC1jbG9zZSBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1jbG9zZS1zbWFsbFwiIHRpdGxlPVwie3tDTE9TRX19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2ZXJzaW9uPVwiMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTEzIDEybDUtNS0xLTEtNSA1LTUtNS0xIDEgNSA1LTUgNSAxIDEgNS01IDUgNSAxLTF6XCIvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjwvYnV0dG9uPlwiXG5cdFx0fSxcblxuXHRcdC8vIENvbnRhaW5lciBpcyBpbmplY3RlZCBpbnRvIHRoaXMgZWxlbWVudFxuXHRcdHBhcmVudEVsOiBcImJvZHlcIixcblxuXHRcdC8vIEhpZGUgYnJvd3NlciB2ZXJ0aWNhbCBzY3JvbGxiYXJzOyB1c2UgYXQgeW91ciBvd24gcmlza1xuXHRcdGhpZGVTY3JvbGxiYXI6IHRydWUsXG5cblx0XHQvLyBGb2N1cyBoYW5kbGluZ1xuXHRcdC8vID09PT09PT09PT09PT09XG5cblx0XHQvLyBUcnkgdG8gZm9jdXMgb24gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IGFmdGVyIG9wZW5pbmdcblx0XHRhdXRvRm9jdXM6IHRydWUsXG5cblx0XHQvLyBQdXQgZm9jdXMgYmFjayB0byBhY3RpdmUgZWxlbWVudCBhZnRlciBjbG9zaW5nXG5cdFx0YmFja0ZvY3VzOiB0cnVlLFxuXG5cdFx0Ly8gRG8gbm90IGxldCB1c2VyIHRvIGZvY3VzIG9uIGVsZW1lbnQgb3V0c2lkZSBtb2RhbCBjb250ZW50XG5cdFx0dHJhcEZvY3VzOiB0cnVlLFxuXG5cdFx0Ly8gTW9kdWxlIHNwZWNpZmljIG9wdGlvbnNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0ZnVsbFNjcmVlbjoge1xuXHRcdFx0YXV0b1N0YXJ0Oi
6780BmYWxzZVxuXHRcdH0sXG5cblx0XHQvLyBTZXQgYHRvdWNoOiBmYWxzZWAgdG8gZGlzYWJsZSBwYW5uaW5nL3N3aXBpbmdcblx0XHR0b3VjaDoge1xuXHRcdFx0dmVydGljYWw6IHRydWUsIC8vIEFsbG93IHRvIGRyYWcgY29udGVudCB2ZXJ0aWNhbGx5XG5cdFx0XHRtb21lbnR1bTogdHJ1ZSAvLyBDb250aW51ZSBtb3ZlbWVudCBhZnRlciByZWxlYXNpbmcgbW91c2UvdG91Y2ggd2hlbiBwYW5uaW5nXG5cdFx0fSxcblxuXHRcdC8vIEhhc2ggdmFsdWUgd2hlbiBpbml0aWFsaXppbmcgbWFudWFsbHksXG5cdFx0Ly8gc2V0IGBmYWxzZWAgdG8gZGlzYWJsZSBoYXNoIGNoYW5nZVxuXHRcdGhhc2g6IG51bGwsXG5cblx0XHQvLyBDdXN0b21pemUgb3IgYWRkIG5ldyBtZWRpYSB0eXBlc1xuXHRcdC8vIEV4YW1wbGU6XG5cdFx0LypcbiAgICAgIG1lZGlhIDoge1xuICAgICAgICB5b3V0dWJlIDoge1xuICAgICAgICAgIHBhcmFtcyA6IHtcbiAgICAgICAgICAgIGF1dG9wbGF5IDogMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICovXG5cdFx0bWVkaWE6IHt9LFxuXG5cdFx0c2xpZGVTaG93OiB7XG5cdFx0XHRhdXRvU3RhcnQ6IGZhbHNlLFxuXHRcdFx0c3BlZWQ6IDMwMDBcblx0XHR9LFxuXG5cdFx0dGh1bWJzOiB7XG5cdFx0XHRhdXRvU3RhcnQ6IGZhbHNlLCAvLyBEaXNwbGF5IHRodW1ibmFpbHMgb24gb3BlbmluZ1xuXHRcdFx0aGlkZU9uQ2xvc2U6IHRydWUsIC8vIEhpZGUgdGh1bWJuYWlsIGdyaWQgd2hlbiBjbG9zaW5nIGFuaW1hdGlvbiBzdGFydHNcblx0XHRcdHBhcmVudEVsOiBcIi5mYW5jeWJveC1jb250YWluZXJcIiwgLy8gQ29udGFpbmVyIGlzIGluamVjdGVkIGludG8gdGhpcyBlbGVtZW50XG5cdFx0XHRheGlzOiBcInlcIiAvLyBWZXJ0aWNhbCAoeSkgb3IgaG9yaXpvbnRhbCAoeCkgc2Nyb2xsaW5nXG5cdFx0fSxcblxuXHRcdC8vIFVzZSBtb3VzZXdoZWVsIHRvIG5hdmlnYXRlIGdhbGxlcnlcblx0XHQvLyBJZiAnYXV0bycgLSBlbmFibGVkIGZvciBpbWFnZXMgb25seVxuXHRcdHdoZWVsOiBcImF1dG9cIixcblxuXHRcdC8vIENhbGxiYWNrc1xuXHRcdC8vPT09PT09PT09PVxuXG5cdFx0Ly8gU2VlIERvY3VtZW50YXRpb24vQVBJL0V2ZW50cyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHRcdC8vIEV4YW1wbGU6XG5cdFx0LypcbiAgICAgIGFmdGVyU2hvdzogZnVuY3Rpb24oIGluc3RhbmNlLCBjdXJyZW50ICkge1xuICAgICAgICBjb25zb2xlLmluZm8oICdDbGlja2VkIGVsZW1lbnQ6JyApO1xuICAgICAgICBjb25zb2xlLmluZm8oIGN1cnJlbnQub3B0cy4kb3JpZyApO1xuICAgICAgfVxuICAgICovXG5cblx0XHRvbkluaXQ6ICQubm9vcCwgLy8gV2hlbiBpbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZFxuXG5cdFx0YmVmb3JlTG9hZDogJC5ub29wLCAvLyBCZWZvcmUgdGhlIGNvbnRlbnQgb2YgYSBzbGlkZSBpcyBiZWluZyBsb2FkZWRcblx0XHRhZnRlckxvYWQ6ICQubm9vcCwgLy8gV2hlbiB0aGUgY29udGVudCBvZiBhIHNsaWRlIGlzIGRvbmUgbG9hZGluZ1xuXG5cdFx0YmVmb3JlU2hvdzogJC5ub29wLCAvLyBCZWZvcmUgb3BlbiBhbmltYXRpb24gc3RhcnRzXG5cdFx0YWZ0ZXJTaG93OiAkLm5vb3AsIC8vIFdoZW4gY29udGVudCBpcyBkb25lIGxvYWRpbmcgYW5kIGFuaW1hdGluZ1xuXG5cdFx0YmVmb3JlQ2xvc2U6ICQubm9vcCwgLy8gQmVmb3JlIHRoZSBpbnN0YW5jZSBhdHRlbXB0cyB0byBjbG9zZS4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbCB0aGUgY2xvc2UuXG5cdFx0YWZ0ZXJDbG9zZTogJC5ub29wLCAvLyBBZnRlciBpbnN0YW5jZSBoYXMgYmVlbiBjbG9zZWRcblxuXHRcdG9uQWN0aXZhdGU6ICQubm9vcCwgLy8gV2hlbiBpbnN0YW5jZSBpcyBicm91Z2h0IHRvIGZyb250XG5cdFx0b25EZWFjdGl2YXRlOiAkLm5vb3AsIC8vIFdoZW4gb3RoZXIgaW5zdGFuY2UgaGFzIGJlZW4gYWN0aXZhdGVkXG5cblx0XHQvLyBJbnRlcmFjdGlvblxuXHRcdC8vID09PT09PT09PT09XG5cblx0XHQvLyBVc2Ugb3B0aW9ucyBiZWxvdyB0byBjdXN0b21pemUgdGFrZW4gYWN0aW9uIHdoZW4gdXNlciBjbGlja3Mgb3IgZG91YmxlIGNsaWNrcyBvbiB0aGUgZmFuY3lCb3ggYXJlYSxcblx0XHQvLyBlYWNoIG9wdGlvbiBjYW4gYmUgc3RyaW5nIG9yIG1ldGhvZCB0aGF0IHJldHVybnMgdmFsdWUuXG5cdFx0Ly9cblx0XHQvLyBQb3NzaWJsZSB2YWx1ZXM6XG5cdFx0Ly8gICBcImNsb3NlXCIgICAgICAgICAgIC0gY2xvc2UgaW5zdGFuY2Vcblx0XHQvLyAgIFwibmV4dFwiICAgICAgICAgICAgLSBtb3ZlIHRvIG5leHQgZ2FsbGVyeSBpdGVtXG5cdFx0Ly8gICBcIm5leHRPckNsb3NlXCIgICAgIC0gbW92ZSB0byBuZXh0IGdhbGxlcnkgaXRlbSBvciBjbG9zZSBpZiBnYWxsZXJ5IGhhcyBvbmx5IG9uZSBpdGVtXG5cdFx0Ly8gICBcInRvZ2dsZUNvbnRyb2xzXCIgIC0gc2hvdy9oaWRlIGNvbnRyb2xzXG5cdFx0Ly8gICBcInpvb21cIiAgICAgICAgICAgIC0gem9vbSBpbWFnZSAoaWYgbG9hZGVkKVxuXHRcdC8vICAgZmFsc2UgICAgICAgICAgICAgLSBkbyBub3RoaW5nXG5cblx0XHQvLyBDbGlja2VkIG9uIHRoZSBjb250ZW50XG5cdFx0Y2xpY2tDb250ZW50OiBmdW5jdGlvbiAoY3VycmVudCwgZXZlbnQpIHtcblx0XHRcdHJldHVybiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiem9vbVwiIDogZmFsc2U7XG5cdFx0fSxcblxuXHRcdC8vIENsaWNrZWQgb24gdGhlIHNsaWRlXG5cdFx0Y2xpY2tTbGlkZTogXCJjbG9zZVwiLFxuXG5cdFx0Ly8gQ2xpY2tlZCBvbiB0aGUgYmFja2dyb3VuZCAoYmFja2Ryb3ApIGVsZW1lbnQ7XG5cdFx0Ly8gaWYgeW91IGhhdmUgbm90IGNoYW5nZWQgdGhlIGxheW91dCwgdGhlbiBtb3N0IGxpa2VseSB5b3UgbmVlZCB0byB1c2UgYGNsaWNrU2xpZGVgIG9wdGlvblxuXHRcdGNsaWNrT3V0c2lkZTogXCJjbG9zZVwiLFxuXG5cdFx0Ly8gU2FtZSBhcyBwcmV2aW91cyB0d28sIGJ1dCBmb3IgZG91YmxlIGNsaWNrXG5cdFx0ZGJsY2xpY2tDb250ZW50OiBmYWxzZSxcblx0XHRkYmxjbGlja1NsaWRlOiBmYWxzZSxcblx0XHRkYmxjbGlja091dHNpZGU6IGZhbHNlLFxuXG5cdFx0Ly8gQ3VzdG9tIG9wdGlvbnMgd2hlbiBtb2JpbGUgZGV2aWNlIGlzIGRldGVjdGVkXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRtb2JpbGU6IHtcblx0XHRcdHByZXZlbn
6780RDYXB0aW9uT3ZlcmxhcDogZmFsc2UsXG5cdFx0XHRpZGxlVGltZTogZmFsc2UsXG5cdFx0XHRjbGlja0NvbnRlbnQ6IGZ1bmN0aW9uIChjdXJyZW50LCBldmVudCkge1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudC50eXBlID09PSBcImltYWdlXCIgPyBcInRvZ2dsZUNvbnRyb2xzXCIgOiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRjbGlja1NsaWRlOiBmdW5jdGlvbiAoY3VycmVudCwgZXZlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnQudHlwZSA9PT0gXCJpbWFnZVwiID8gXCJ0b2dnbGVDb250cm9sc1wiIDogXCJjbG9zZVwiO1xuXHRcdFx0fSxcblx0XHRcdGRibGNsaWNrQ29udGVudDogZnVuY3Rpb24gKGN1cnJlbnQsIGV2ZW50KSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiem9vbVwiIDogZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0ZGJsY2xpY2tTbGlkZTogZnVuY3Rpb24gKGN1cnJlbnQsIGV2ZW50KSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiem9vbVwiIDogZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEludGVybmF0aW9uYWxpemF0aW9uXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGxhbmc6IFwiZW5cIixcblx0XHRpMThuOiB7XG5cdFx0XHRlbjoge1xuXHRcdFx0XHRDTE9TRTogXCJDbG9zZVwiLFxuXHRcdFx0XHRORVhUOiBcIk5leHRcIixcblx0XHRcdFx0UFJFVjogXCJQcmV2aW91c1wiLFxuXHRcdFx0XHRFUlJPUjogXCJUaGUgcmVxdWVzdGVkIGNvbnRlbnQgY2Fubm90IGJlIGxvYWRlZC4gPGJyLz4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIixcblx0XHRcdFx0UExBWV9TVEFSVDogXCJTdGFydCBzbGlkZXNob3dcIixcblx0XHRcdFx0UExBWV9TVE9QOiBcIlBhdXNlIHNsaWRlc2hvd1wiLFxuXHRcdFx0XHRGVUxMX1NDUkVFTjogXCJGdWxsIHNjcmVlblwiLFxuXHRcdFx0XHRUSFVNQlM6IFwiVGh1bWJuYWlsc1wiLFxuXHRcdFx0XHRET1dOTE9BRDogXCJEb3dubG9hZFwiLFxuXHRcdFx0XHRTSEFSRTogXCJTaGFyZVwiLFxuXHRcdFx0XHRaT09NOiBcIlpvb21cIlxuXHRcdFx0fSxcblx0XHRcdGRlOiB7XG5cdFx0XHRcdENMT1NFOiBcIlNjaGxpZSZzemxpZztlblwiLFxuXHRcdFx0XHRORVhUOiBcIldlaXRlclwiLFxuXHRcdFx0XHRQUkVWOiBcIlp1ciZ1dW1sO2NrXCIsXG5cdFx0XHRcdEVSUk9SOiBcIkRpZSBhbmdlZm9yZGVydGVuIERhdGVuIGtvbm50ZW4gbmljaHQgZ2VsYWRlbiB3ZXJkZW4uIDxici8+IEJpdHRlIHZlcnN1Y2hlbiBTaWUgZXMgc3AmYXVtbDt0ZXIgbm9jaG1hbC5cIixcblx0XHRcdFx0UExBWV9TVEFSVDogXCJEaWFzY2hhdSBzdGFydGVuXCIsXG5cdFx0XHRcdFBMQVlfU1RPUDogXCJEaWFzY2hhdSBiZWVuZGVuXCIsXG5cdFx0XHRcdEZVTExfU0NSRUVOOiBcIlZvbGxiaWxkXCIsXG5cdFx0XHRcdFRIVU1CUzogXCJWb3JzY2hhdWJpbGRlclwiLFxuXHRcdFx0XHRET1dOTE9BRDogXCJIZXJ1bnRlcmxhZGVuXCIsXG5cdFx0XHRcdFNIQVJFOiBcIlRlaWxlblwiLFxuXHRcdFx0XHRaT09NOiBcIlZlcmdyJm91bWw7JnN6bGlnO2VyblwiXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIEZldyB1c2VmdWwgdmFyaWFibGVzIGFuZCBtZXRob2RzXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0dmFyICRXID0gJCh3aW5kb3cpO1xuXHR2YXIgJEQgPSAkKGRvY3VtZW50KTtcblxuXHR2YXIgY2FsbGVkID0gMDtcblxuXHQvLyBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBqUXVlcnkgb2JqZWN0IGFuZCBub3QgYSBuYXRpdmUgSmF2YVNjcmlwdCBvYmplY3Rcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBpc1F1ZXJ5ID0gZnVuY3Rpb24gKG9iaikge1xuXHRcdHJldHVybiBvYmogJiYgb2JqLmhhc093blByb3BlcnR5ICYmIG9iaiBpbnN0YW5jZW9mICQ7XG5cdH07XG5cblx0Ly8gSGFuZGxlIG11bHRpcGxlIGJyb3dzZXJzIGZvciBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiIGFuZCBcImNhbmNlbEFuaW1hdGlvbkZyYW1lXCJcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHR2YXIgcmVxdWVzdEFGcmFtZSA9IChmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHQvLyBpZiBhbGwgZWxzZSBmYWlscywgdXNlIHNldFRpbWVvdXRcblx0XHRcdGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHRcdFx0XHRyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG5cdFx0XHR9XG5cdFx0KTtcblx0fSkoKTtcblxuXHR2YXIgY2FuY2VsQUZyYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm9DYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0ZnVuY3Rpb24gKGlkKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoaWQpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH0pKCk7XG5cblx0Ly8gRGV0ZWN0IHRoZSBzdXBwb3J0ZWQgdHJhbnNpdGlvbi1lbmQgZXZlbnQgcHJvcGVydHkgbmFtZVxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciB0cmFuc2l0aW9uRW5kID0gKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmFrZWVsZW1lbnRcIiksXG5cdFx0XHR0O1xuXG5cdFx0dmFyIHRyYW5zaXRpb25zID0ge1xuXHRcdFx0dHJhbnNpdGlvbjogXCJ0cmFuc2l0aW9uZW5kXCIsXG5cdFx0XHRPVHJhbnNpdGlvbjogXCJvVHJhbnNpdGlvbkVuZFwiLFxuXHRcdFx0TW96VHJhbnNpdGlvbjogXCJ0cmFuc2l0aW9uZW5kXCIsXG5cdFx0XHRXZWJraXRUcmFuc2l0aW9uOiBcIndlYmtpdFRyYW5zaXRpb25FbmRcIlxuXHRcdH07XG5cblx0XHRmb3IgKHQgaW4gdHJhbnNpdGlvbnMpIHtcblx0XHRcdGlmIChlbC5zdHlsZVt0XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybi
6780B0cmFuc2l0aW9uc1t0XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gXCJ0cmFuc2l0aW9uZW5kXCI7XG5cdH0pKCk7XG5cblx0Ly8gRm9yY2UgcmVkcmF3IG9uIGFuIGVsZW1lbnQuXG5cdC8vIFRoaXMgaGVscHMgaW4gY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIgZG9lc24ndCByZWRyYXcgYW4gdXBkYXRlZCBlbGVtZW50IHByb3Blcmx5XG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBmb3JjZVJlZHJhdyA9IGZ1bmN0aW9uICgkZWwpIHtcblx0XHRyZXR1cm4gJGVsICYmICRlbC5sZW5ndGggJiYgJGVsWzBdLm9mZnNldEhlaWdodDtcblx0fTtcblxuXHQvLyBFeGNsdWRlIGFycmF5IChgYnV0dG9uc2ApIG9wdGlvbnMgZnJvbSBkZWVwIG1lcmdpbmdcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBtZXJnZU9wdHMgPSBmdW5jdGlvbiAob3B0czEsIG9wdHMyKSB7XG5cdFx0dmFyIHJleiA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzMSwgb3B0czIpO1xuXG5cdFx0JC5lYWNoKG9wdHMyLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCQuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0cmV6W2tleV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiByZXo7XG5cdH07XG5cblx0Ly8gSG93IG11Y2ggb2YgYW4gZWxlbWVudCBpcyB2aXNpYmxlIGluIHZpZXdwb3J0XG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZhciBpblZpZXdwb3J0ID0gZnVuY3Rpb24gKGVsZW0pIHtcblx0XHR2YXIgZWxlbUNlbnRlciwgcmV6O1xuXG5cdFx0aWYgKCFlbGVtIHx8IGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQkKFwiLmZhbmN5Ym94LWNvbnRhaW5lclwiKS5jc3MoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIik7XG5cblx0XHRlbGVtQ2VudGVyID0ge1xuXHRcdFx0eDogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgZWxlbS5vZmZzZXRXaWR0aCAvIDIsXG5cdFx0XHR5OiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIGVsZW0ub2Zmc2V0SGVpZ2h0IC8gMlxuXHRcdH07XG5cblx0XHRyZXogPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGVsZW1DZW50ZXIueCwgZWxlbUNlbnRlci55KSA9PT0gZWxlbTtcblxuXHRcdCQoXCIuZmFuY3lib3gtY29udGFpbmVyXCIpLmNzcyhcInBvaW50ZXItZXZlbnRzXCIsIFwiXCIpO1xuXG5cdFx0cmV0dXJuIHJlejtcblx0fTtcblxuXHQvLyBDbGFzcyBkZWZpbml0aW9uXG5cdC8vID09PT09PT09PT09PT09PT1cblxuXHR2YXIgRmFuY3lCb3ggPSBmdW5jdGlvbiAoY29udGVudCwgb3B0cywgaW5kZXgpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRzZWxmLm9wdHMgPSBtZXJnZU9wdHMoe1xuXHRcdFx0aW5kZXg6IGluZGV4XG5cdFx0fSwgJC5mYW5jeWJveC5kZWZhdWx0cyk7XG5cblx0XHRpZiAoJC5pc1BsYWluT2JqZWN0KG9wdHMpKSB7XG5cdFx0XHRzZWxmLm9wdHMgPSBtZXJnZU9wdHMoc2VsZi5vcHRzLCBvcHRzKTtcblx0XHR9XG5cblx0XHRpZiAoJC5mYW5jeWJveC5pc01vYmlsZSkge1xuXHRcdFx0c2VsZi5vcHRzID0gbWVyZ2VPcHRzKHNlbGYub3B0cywgc2VsZi5vcHRzLm1vYmlsZSk7XG5cdFx0fVxuXG5cdFx0c2VsZi5pZCA9IHNlbGYub3B0cy5pZCB8fCArK2NhbGxlZDtcblxuXHRcdHNlbGYuY3VyckluZGV4ID0gcGFyc2VJbnQoc2VsZi5vcHRzLmluZGV4LCAxMCkgfHwgMDtcblx0XHRzZWxmLnByZXZJbmRleCA9IG51bGw7XG5cblx0XHRzZWxmLnByZXZQb3MgPSBudWxsO1xuXHRcdHNlbGYuY3VyclBvcyA9IDA7XG5cblx0XHRzZWxmLmZpcnN0UnVuID0gdHJ1ZTtcblxuXHRcdC8vIEFsbCBncm91cCBpdGVtc1xuXHRcdHNlbGYuZ3JvdXAgPSBbXTtcblxuXHRcdC8vIEV4aXN0aW5nIHNsaWRlcyAoZm9yIGN1cnJlbnQsIG5leHQgYW5kIHByZXZpb3VzIGdhbGxlcnkgaXRlbXMpXG5cdFx0c2VsZi5zbGlkZXMgPSB7fTtcblxuXHRcdC8vIENyZWF0ZSBncm91cCBlbGVtZW50c1xuXHRcdHNlbGYuYWRkQ29udGVudChjb250ZW50KTtcblxuXHRcdGlmICghc2VsZi5ncm91cC5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzZWxmLmluaXQoKTtcblx0fTtcblxuXHQkLmV4dGVuZChGYW5jeUJveC5wcm90b3R5cGUsIHtcblx0XHQvLyBDcmVhdGUgRE9NIHN0cnVjdHVyZVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09XG5cblx0XHRpbml0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGZpcnN0SXRlbSA9IHNlbGYuZ3JvdXBbc2VsZi5jdXJySW5kZXhdLFxuXHRcdFx0XHRmaXJzdEl0ZW1PcHRzID0gZmlyc3RJdGVtLm9wdHMsXG5cdFx0XHRcdCRjb250YWluZXIsXG5cdFx0XHRcdGJ1dHRvblN0cjtcblxuXHRcdFx0aWYgKGZpcnN0SXRlbU9wdHMuY2xvc2VFeGlzdGluZykge1xuXHRcdFx0XHQkLmZhbmN5Ym94LmNsb3NlKHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIaWRlIHNjcm9sbGJhcnNcblx0XHRcdC8vID09PT09PT09PT09PT09PVxuXG5cdFx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImZhbmN5Ym94LWFjdGl2ZVwiKTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpICYmXG5cdFx0XHRcdGZpcnN0SXRlbU9wdHMuaGlkZVNjcm9sbGJhciAhPT0gZmFsc2UgJiZcblx0XHRcdFx0ISQuZmFuY3lib3guaXNNb2JpbGUgJiZcblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHRcblx0XHRcdCkge1xuXHRcdFx0XHQkKFwiaGVhZFwiKS5hcHBlbmQoXG5cdFx0XHRcdFx0JzxzdHlsZSBpZD1cImZhbmN5Ym94LXN0eWxlLW5vc2Nyb2xsXCIgdHlwZT1cInRleHQvY3NzXCI+LmNvbXBlbnNhdGUtZm9yLXNjcm9sbGJhcnttYXJnaW4tcmlnaHQ6JyArXG5cdFx0XHRcdFx0KHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSArXG5cdFx0XHRcdFx0XCJweDt9PC9zdHlsZT5cIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwiY29tcGVuc2F0ZS1mb3Itc2Nyb2xsYmFyXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdWlsZCBodG1sIG1hcmt1cCBhbmQgc2V0IHJlZmVyZW5jZXNcblx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHQvLyBCdWlsZCBodG1sIGNvZGUgZm9yIGJ1dHRvbnMgYW5kIGluc2VydCBpbnRvIG1haW4gdGVtcGxhdGVcblx0XHRcdGJ1dHRvblN0ciA9IFwiXCI7XG5cblx0XHRcdCQuZWFjaChmaXJzdEl0ZW1PcHRzLmJ1dHRvbnMsIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcblx0XHRcdFx0YnV0dG9uU3RyICs9IGZpcnN0SXRlbU9wdHMuYnRuVHBsW3ZhbHVlXSB8fCBcIlwiO
67801xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENyZWF0ZSBtYXJrdXAgZnJvbSBiYXNlIHRlbXBsYXRlLCBpdCB3aWxsIGJlIGluaXRpYWxseSBoaWRkZW4gdG9cblx0XHRcdC8vIGF2b2lkIHVubmVjZXNzYXJ5IHdvcmsgbGlrZSBwYWludGluZyB3aGlsZSBpbml0aWFsaXppbmcgaXMgbm90IGNvbXBsZXRlXG5cdFx0XHQkY29udGFpbmVyID0gJChcblx0XHRcdFx0c2VsZi50cmFuc2xhdGUoXG5cdFx0XHRcdFx0c2VsZixcblx0XHRcdFx0XHRmaXJzdEl0ZW1PcHRzLmJhc2VUcGxcblx0XHRcdFx0XHRcdC5yZXBsYWNlKFwie3tidXR0b25zfX1cIiwgYnV0dG9uU3RyKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7e2Fycm93c319XCIsIGZpcnN0SXRlbU9wdHMuYnRuVHBsLmFycm93TGVmdCArIGZpcnN0SXRlbU9wdHMuYnRuVHBsLmFycm93UmlnaHQpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHRcdFx0LmF0dHIoXCJpZFwiLCBcImZhbmN5Ym94LWNvbnRhaW5lci1cIiArIHNlbGYuaWQpXG5cdFx0XHRcdC5hZGRDbGFzcyhmaXJzdEl0ZW1PcHRzLmJhc2VDbGFzcylcblx0XHRcdFx0LmRhdGEoXCJGYW5jeUJveFwiLCBzZWxmKVxuXHRcdFx0XHQuYXBwZW5kVG8oZmlyc3RJdGVtT3B0cy5wYXJlbnRFbCk7XG5cblx0XHRcdC8vIENyZWF0ZSBvYmplY3QgaG9sZGluZyByZWZlcmVuY2VzIHRvIGpRdWVyeSB3cmFwcGVkIG5vZGVzXG5cdFx0XHRzZWxmLiRyZWZzID0ge1xuXHRcdFx0XHRjb250YWluZXI6ICRjb250YWluZXJcblx0XHRcdH07XG5cblx0XHRcdFtcImJnXCIsIFwiaW5uZXJcIiwgXCJpbmZvYmFyXCIsIFwidG9vbGJhclwiLCBcInN0YWdlXCIsIFwiY2FwdGlvblwiLCBcIm5hdmlnYXRpb25cIl0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRzZWxmLiRyZWZzW2l0ZW1dID0gJGNvbnRhaW5lci5maW5kKFwiLmZhbmN5Ym94LVwiICsgaXRlbSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0c2VsZi50cmlnZ2VyKFwib25Jbml0XCIpO1xuXG5cdFx0XHQvLyBFbmFibGUgZXZlbnRzLCBkZWFjdGl2ZSBwcmV2aW91cyBpbnN0YW5jZXNcblx0XHRcdHNlbGYuYWN0aXZhdGUoKTtcblxuXHRcdFx0Ly8gQnVpbGQgc2xpZGVzLCBsb2FkIGFuZCByZXZlYWwgY29udGVudFxuXHRcdFx0c2VsZi5qdW1wVG8oc2VsZi5jdXJySW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBTaW1wbGUgaTE4biBzdXBwb3J0IC0gcmVwbGFjZXMgb2JqZWN0IGtleXMgZm91bmQgaW4gdGVtcGxhdGVcblx0XHQvLyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHR0cmFuc2xhdGU6IGZ1bmN0aW9uIChvYmosIHN0cikge1xuXHRcdFx0dmFyIGFyciA9IG9iai5vcHRzLmkxOG5bb2JqLm9wdHMubGFuZ10gfHwgb2JqLm9wdHMuaTE4bi5lbjtcblxuXHRcdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHtcXHsoXFx3KylcXH1cXH0vZywgZnVuY3Rpb24gKG1hdGNoLCBuKSB7XG5cdFx0XHRcdHJldHVybiBhcnJbbl0gPT09IHVuZGVmaW5lZCA/IG1hdGNoIDogYXJyW25dO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdC8vIFBvcHVsYXRlIGN1cnJlbnQgZ3JvdXAgd2l0aCBmcmVzaCBjb250ZW50XG5cdFx0Ly8gQ2hlY2sgaWYgZWFjaCBvYmplY3QgaGFzIHZhbGlkIHR5cGUgYW5kIGNvbnRlbnRcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0YWRkQ29udGVudDogZnVuY3Rpb24gKGNvbnRlbnQpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aXRlbXMgPSAkLm1ha2VBcnJheShjb250ZW50KSxcblx0XHRcdFx0dGh1bWJzO1xuXG5cdFx0XHQkLmVhY2goaXRlbXMsIGZ1bmN0aW9uIChpLCBpdGVtKSB7XG5cdFx0XHRcdHZhciBvYmogPSB7fSxcblx0XHRcdFx0XHRvcHRzID0ge30sXG5cdFx0XHRcdFx0JGl0ZW0sXG5cdFx0XHRcdFx0dHlwZSxcblx0XHRcdFx0XHRmb3VuZCxcblx0XHRcdFx0XHRzcmMsXG5cdFx0XHRcdFx0c3JjUGFydHM7XG5cblx0XHRcdFx0Ly8gU3RlcCAxIC0gTWFrZSBzdXJlIHdlIGhhdmUgYW4gb2JqZWN0XG5cdFx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHRcdGlmICgkLmlzUGxhaW5PYmplY3QoaXRlbSkpIHtcblx0XHRcdFx0XHQvLyBXZSBwcm9iYWJseSBoYXZlIG1hbnVhbCB1c2FnZSBoZXJlLCBzb21ldGhpbmcgbGlrZVxuXHRcdFx0XHRcdC8vICQuZmFuY3lib3gub3BlbiggWyB7IHNyYyA6IFwiaW1hZ2UuanBnXCIsIHR5cGUgOiBcImltYWdlXCIgfSBdIClcblxuXHRcdFx0XHRcdG9iaiA9IGl0ZW07XG5cdFx0XHRcdFx0b3B0cyA9IGl0ZW0ub3B0cyB8fCBpdGVtO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCQudHlwZShpdGVtKSA9PT0gXCJvYmplY3RcIiAmJiAkKGl0ZW0pLmxlbmd0aCkge1xuXHRcdFx0XHRcdC8vIEhlcmUgd2UgcHJvYmFibHkgaGF2ZSBqUXVlcnkgY29sbGVjdGlvbiByZXR1cm5lZCBieSBzb21lIHNlbGVjdG9yXG5cdFx0XHRcdFx0JGl0ZW0gPSAkKGl0ZW0pO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydCBhdHRyaWJ1dGVzIGxpa2UgYGRhdGEtb3B0aW9ucz0ne1widG91Y2hcIiA6IGZhbHNlfSdgIGFuZCBgZGF0YS10b3VjaD0nZmFsc2UnYFxuXHRcdFx0XHRcdG9wdHMgPSAkaXRlbS5kYXRhKCkgfHwge307XG5cdFx0XHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLCBvcHRzLm9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBzdG9yZSBjbGlja2VkIGVsZW1lbnRcblx0XHRcdFx0XHRvcHRzLiRvcmlnID0gJGl0ZW07XG5cblx0XHRcdFx0XHRvYmouc3JjID0gc2VsZi5vcHRzLnNyYyB8fCBvcHRzLnNyYyB8fCAkaXRlbS5hdHRyKFwiaHJlZlwiKTtcblxuXHRcdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHNpbXBsZSBzeW50YXggaXMgdXNlZCwgZm9yIGV4YW1wbGU6XG5cdFx0XHRcdFx0Ly8gICBgJC5mYW5jeWJveC5vcGVuKCAkKFwiI3Rlc3RcIiksIHt9ICk7YFxuXHRcdFx0XHRcdGlmICghb2JqLnR5cGUgJiYgIW9iai5zcmMpIHtcblx0XHRcdFx0XHRcdG9iai50eXBlID0gXCJpbmxpbmVcIjtcblx0XHRcdFx0XHRcdG9iai5zcmMgPSBpdGVtO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBc3N1bWUgd2UgaGF2ZSBhIHNpbXBsZSBodG1sIGNvZGUsIGZvciBleGFtcGxlOlxuXHRcdFx0XHRcdC8vICAgJC5mYW5jeWJveC5vcGVuKCAnPGRpdj48aDE+SGkhPC9oMT48L2Rpdj4nICk7XG5cdFx0XHRcdFx0b2JqID0ge1xuXHRcdFx0XHRcdFx0dHlwZTogXCJodG1sXCIsXG5cdFx0XHRcdFx0XHRzcmM6IGl0ZW0gKyBcIlwiXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEVhY2ggZ2FsbGVyeSBvYmplY3QgaGFzIGZ1bGwgY29sbGVjdGlvbiBvZiBvcHRpb25zXG5cdFx0XHRcdG9iai5vcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIHNlbGYub3B0cywgb3B0cyk7XG5cblx0XHRcdFx0Ly8gRG8gbm90IG1lcmdlIGJ1dHRvbnMgYXJyYXlcblx0XHRcdFx0aWYgKCQuaXNBcnJheShvcHRzLmJ1dHRvbnMpKSB7XG5cdFx0XHRcdFx0b2JqLm9wdHMuYnV0dG9ucyA9IG9wdHMuYnV0dG9ucztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICgkLmZhbmN5Ym94LmlzTW9iaWxlICYmIG9iai5vcHRzLm1vYmlsZSkge1xuXHRcdFx0XHRcdG9iai5vcHRzID0gbWVyZ2VPcHRzKG9iai5vcHRzLCBvYmoub3B0cy5tb2JpbGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3RlcCAyIC0gTWFrZSBzdXJlIHdlIGhhdmUgY29udGVudCB0eX
6780BlLCBpZiBub3QgLSB0cnkgdG8gZ3Vlc3Ncblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdFx0XHR0eXBlID0gb2JqLnR5cGUgfHwgb2JqLm9wdHMudHlwZTtcblx0XHRcdFx0c3JjID0gb2JqLnNyYyB8fCBcIlwiO1xuXG5cdFx0XHRcdGlmICghdHlwZSAmJiBzcmMpIHtcblx0XHRcdFx0XHRpZiAoKGZvdW5kID0gc3JjLm1hdGNoKC9cXC4obXA0fG1vdnxvZ3Z8d2VibSkoKFxcP3wjKS4qKT8kL2kpKSkge1xuXHRcdFx0XHRcdFx0dHlwZSA9IFwidmlkZW9cIjtcblxuXHRcdFx0XHRcdFx0aWYgKCFvYmoub3B0cy52aWRlby5mb3JtYXQpIHtcblx0XHRcdFx0XHRcdFx0b2JqLm9wdHMudmlkZW8uZm9ybWF0ID0gXCJ2aWRlby9cIiArIChmb3VuZFsxXSA9PT0gXCJvZ3ZcIiA/IFwib2dnXCIgOiBmb3VuZFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzcmMubWF0Y2goLyheZGF0YTppbWFnZVxcL1thLXowLTkrXFwvPV0qLCl8KFxcLihqcChlfGd8ZWcpfGdpZnxwbmd8Ym1wfHdlYnB8c3ZnfGljbykoKFxcP3wjKS4qKT8kKS9pKSkge1xuXHRcdFx0XHRcdFx0dHlwZSA9IFwiaW1hZ2VcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNyYy5tYXRjaCgvXFwuKHBkZikoKFxcP3wjKS4qKT8kL2kpKSB7XG5cdFx0XHRcdFx0XHR0eXBlID0gXCJpZnJhbWVcIjtcblx0XHRcdFx0XHRcdG9iaiA9ICQuZXh0ZW5kKHRydWUsIG9iaiwge1xuXHRcdFx0XHRcdFx0XHRjb250ZW50VHlwZTogXCJwZGZcIixcblx0XHRcdFx0XHRcdFx0b3B0czoge1xuXHRcdFx0XHRcdFx0XHRcdGlmcmFtZToge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJlbG9hZDogZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3JjLmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcblx0XHRcdFx0XHRcdHR5cGUgPSBcImlubGluZVwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlKSB7XG5cdFx0XHRcdFx0b2JqLnR5cGUgPSB0eXBlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYudHJpZ2dlcihcIm9iamVjdE5lZWRzVHlwZVwiLCBvYmopO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFvYmouY29udGVudFR5cGUpIHtcblx0XHRcdFx0XHRvYmouY29udGVudFR5cGUgPSAkLmluQXJyYXkob2JqLnR5cGUsIFtcImh0bWxcIiwgXCJpbmxpbmVcIiwgXCJhamF4XCJdKSA+IC0xID8gXCJodG1sXCIgOiBvYmoudHlwZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN0ZXAgMyAtIFNvbWUgYWRqdXN0bWVudHNcblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHRcdG9iai5pbmRleCA9IHNlbGYuZ3JvdXAubGVuZ3RoO1xuXG5cdFx0XHRcdGlmIChvYmoub3B0cy5zbWFsbEJ0biA9PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9iai5vcHRzLnNtYWxsQnRuID0gJC5pbkFycmF5KG9iai50eXBlLCBbXCJodG1sXCIsIFwiaW5saW5lXCIsIFwiYWpheFwiXSkgPiAtMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvYmoub3B0cy50b29sYmFyID09PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9iai5vcHRzLnRvb2xiYXIgPSAhb2JqLm9wdHMuc21hbGxCdG47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGaW5kIHRodW1ibmFpbCBpbWFnZSwgY2hlY2sgaWYgZXhpc3RzIGFuZCBpZiBpcyBpbiB0aGUgdmlld3BvcnRcblx0XHRcdFx0b2JqLiR0aHVtYiA9IG9iai5vcHRzLiR0aHVtYiB8fCBudWxsO1xuXG5cdFx0XHRcdGlmIChvYmoub3B0cy4kdHJpZ2dlciAmJiBvYmouaW5kZXggPT09IHNlbGYub3B0cy5pbmRleCkge1xuXHRcdFx0XHRcdG9iai4kdGh1bWIgPSBvYmoub3B0cy4kdHJpZ2dlci5maW5kKFwiaW1nOmZpcnN0XCIpO1xuXG5cdFx0XHRcdFx0aWYgKG9iai4kdGh1bWIubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvYmoub3B0cy4kb3JpZyA9IG9iai5vcHRzLiR0cmlnZ2VyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghKG9iai4kdGh1bWIgJiYgb2JqLiR0aHVtYi5sZW5ndGgpICYmIG9iai5vcHRzLiRvcmlnKSB7XG5cdFx0XHRcdFx0b2JqLiR0aHVtYiA9IG9iai5vcHRzLiRvcmlnLmZpbmQoXCJpbWc6Zmlyc3RcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob2JqLiR0aHVtYiAmJiAhb2JqLiR0aHVtYi5sZW5ndGgpIHtcblx0XHRcdFx0XHRvYmouJHRodW1iID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9iai50aHVtYiA9IG9iai5vcHRzLnRodW1iIHx8IChvYmouJHRodW1iID8gb2JqLiR0aHVtYlswXS5zcmMgOiBudWxsKTtcblxuXHRcdFx0XHQvLyBcImNhcHRpb25cIiBpcyBhIFwic3BlY2lhbFwiIG9wdGlvbiwgaXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIGNhcHRpb24gcGVyIGdhbGxlcnkgaXRlbVxuXHRcdFx0XHRpZiAoJC50eXBlKG9iai5vcHRzLmNhcHRpb24pID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRvYmoub3B0cy5jYXB0aW9uID0gb2JqLm9wdHMuY2FwdGlvbi5hcHBseShpdGVtLCBbc2VsZiwgb2JqXSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJC50eXBlKHNlbGYub3B0cy5jYXB0aW9uKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0b2JqLm9wdHMuY2FwdGlvbiA9IHNlbGYub3B0cy5jYXB0aW9uLmFwcGx5KGl0ZW0sIFtzZWxmLCBvYmpdKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGNhcHRpb24gYXMgYSBzdHJpbmcgb3IgalF1ZXJ5IG9iamVjdFxuXHRcdFx0XHRpZiAoIShvYmoub3B0cy5jYXB0aW9uIGluc3RhbmNlb2YgJCkpIHtcblx0XHRcdFx0XHRvYmoub3B0cy5jYXB0aW9uID0gb2JqLm9wdHMuY2FwdGlvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IG9iai5vcHRzLmNhcHRpb24gKyBcIlwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdXJsIGNvbnRhaW5zIFwiZmlsdGVyXCIgdXNlZCB0byBmaWx0ZXIgdGhlIGNvbnRlbn
6780Rcblx0XHRcdFx0Ly8gRXhhbXBsZTogXCJhamF4Lmh0bWwgI3NvbWV0aGluZ1wiXG5cdFx0XHRcdGlmIChvYmoudHlwZSA9PT0gXCJhamF4XCIpIHtcblx0XHRcdFx0XHRzcmNQYXJ0cyA9IHNyYy5zcGxpdCgvXFxzKy8sIDIpO1xuXG5cdFx0XHRcdFx0aWYgKHNyY1BhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdG9iai5zcmMgPSBzcmNQYXJ0cy5zaGlmdCgpO1xuXG5cdFx0XHRcdFx0XHRvYmoub3B0cy5maWx0ZXIgPSBzcmNQYXJ0cy5zaGlmdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhpZGUgYWxsIGJ1dHRvbnMgYW5kIGRpc2FibGUgaW50ZXJhY3Rpdml0eSBmb3IgbW9kYWwgaXRlbXNcblx0XHRcdFx0aWYgKG9iai5vcHRzLm1vZGFsKSB7XG5cdFx0XHRcdFx0b2JqLm9wdHMgPSAkLmV4dGVuZCh0cnVlLCBvYmoub3B0cywge1xuXHRcdFx0XHRcdFx0dHJhcEZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGJ1dHRvbnNcblx0XHRcdFx0XHRcdGluZm9iYXI6IDAsXG5cdFx0XHRcdFx0XHR0b29sYmFyOiAwLFxuXG5cdFx0XHRcdFx0XHRzbWFsbEJ0bjogMCxcblxuXHRcdFx0XHRcdFx0Ly8gRGlzYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0XHRrZXlib2FyZDogMCxcblxuXHRcdFx0XHRcdFx0Ly8gRGlzYWJsZSBzb21lIG1vZHVsZXNcblx0XHRcdFx0XHRcdHNsaWRlU2hvdzogMCxcblx0XHRcdFx0XHRcdGZ1bGxTY3JlZW46IDAsXG5cdFx0XHRcdFx0XHR0aHVtYnM6IDAsXG5cdFx0XHRcdFx0XHR0b3VjaDogMCxcblxuXHRcdFx0XHRcdFx0Ly8gRGlzYWJsZSBjbGljayBldmVudCBoYW5kbGVyc1xuXHRcdFx0XHRcdFx0Y2xpY2tDb250ZW50OiBmYWxzZSxcblx0XHRcdFx0XHRcdGNsaWNrU2xpZGU6IGZhbHNlLFxuXHRcdFx0XHRcdFx0Y2xpY2tPdXRzaWRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGRibGNsaWNrQ29udGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkYmxjbGlja1NsaWRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGRibGNsaWNrT3V0c2lkZTogZmFsc2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN0ZXAgNCAtIEFkZCBwcm9jZXNzZWQgb2JqZWN0IHRvIGdyb3VwXG5cdFx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdFx0c2VsZi5ncm91cC5wdXNoKG9iaik7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gVXBkYXRlIGNvbnRyb2xzIGlmIGdhbGxlcnkgaXMgYWxyZWFkeSBvcGVuZWRcblx0XHRcdGlmIChPYmplY3Qua2V5cyhzZWxmLnNsaWRlcykubGVuZ3RoKSB7XG5cdFx0XHRcdHNlbGYudXBkYXRlQ29udHJvbHMoKTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgdGh1bWJuYWlscywgaWYgbmVlZGVkXG5cdFx0XHRcdHRodW1icyA9IHNlbGYuVGh1bWJzO1xuXG5cdFx0XHRcdGlmICh0aHVtYnMgJiYgdGh1bWJzLmlzQWN0aXZlKSB7XG5cdFx0XHRcdFx0dGh1bWJzLmNyZWF0ZSgpO1xuXG5cdFx0XHRcdFx0dGh1bWJzLmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQXR0YWNoIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvcjpcblx0XHQvLyAgIC0gbmF2aWdhdGlvbiBidXR0b25zXG5cdFx0Ly8gICAtIGJyb3dzZXIgc2Nyb2xsaW5nLCByZXNpemluZztcblx0XHQvLyAgIC0gZm9jdXNpbmdcblx0XHQvLyAgIC0ga2V5Ym9hcmRcblx0XHQvLyAgIC0gZGV0ZWN0aW5nIGluYWN0aXZpdHlcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0YWRkRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdHNlbGYucmVtb3ZlRXZlbnRzKCk7XG5cblx0XHRcdC8vIE1ha2UgbmF2aWdhdGlvbiBlbGVtZW50cyBjbGlja2FibGVcblx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXJcblx0XHRcdFx0Lm9uKFwiY2xpY2suZmItY2xvc2VcIiwgXCJbZGF0YS1mYW5jeWJveC1jbG9zZV1cIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdHNlbGYuY2xvc2UoZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5vbihcInRvdWNoc3RhcnQuZmItcHJldiBjbGljay5mYi1wcmV2XCIsIFwiW2Rh
6780dGEtZmFuY3lib3gtcHJldl1cIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdHNlbGYucHJldmlvdXMoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0Lm9uKFwidG91Y2hzdGFydC5mYi1uZXh0IGNsaWNrLmZiLW5leHRcIiwgXCJbZGF0YS1mYW5jeWJveC1uZXh0XVwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0c2VsZi5uZXh0KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5vbihcImNsaWNrLmZiXCIsIFwiW2RhdGEtZmFuY3lib3gtem9vbV1cIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHQvLyBDbGljayBoYW5kbGVyIGZvciB6b29tIGJ1dHRvblxuXHRcdFx0XHRcdHNlbGZbc2VsZi5pc1NjYWxlZERvd24oKSA/IFwic2NhbGVUb0FjdHVhbFwiIDogXCJzY2FsZVRvRml0XCJdKCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHQvLyBIYW5kbGUgcGFnZSBzY3JvbGxpbmcgYW5kIGJyb3dzZXIgcmVzaXppbmdcblx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHQkVy5vbihcIm9yaWVudGF0aW9uY2hhbmdlLmZiIHJlc2l6ZS5mYlwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRpZiAoZSAmJiBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LnR5cGUgPT09IFwicmVzaXplXCIpIHtcblx0XHRcdFx0XHRpZiAoc2VsZi5yZXF1ZXN0SWQpIHtcblx0XHRcdFx0XHRcdGNhbmNlbEFGcmFtZShzZWxmLnJlcXVlc3RJZCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VsZi5yZXF1ZXN0SWQgPSByZXF1ZXN0QUZyYW1lKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHNlbGYudXBkYXRlKGUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChzZWxmLmN1cnJlbnQgJiYgc2VsZi5jdXJyZW50LnR5cGUgPT09IFwiaWZyYW1lXCIpIHtcblx0XHRcdFx0XHRcdHNlbGYuJHJlZnMuc3RhZ2UuaGlkZSgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNldFRpbWVvdXQoXG5cdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGYuJHJlZnMuc3RhZ2Uuc2hvdygpO1xuXG5cdFx0XHRcdFx0XHRcdHNlbGYudXBkYXRlKGUpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCQuZmFuY3lib3guaXNNb2JpbGUgPyA2MDAgOiAyNTBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0JEQub24oXCJrZXlkb3duLmZiXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZmFuY3lib3ggPyAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCkgOiBudWxsLFxuXHRcdFx0XHRcdGN1cnJlbnQgPSBpbnN0YW5jZS5jdXJyZW50LFxuXHRcdFx0XHRcdGtleWNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcblxuXHRcdFx0XHQvLyBUcmFwIGtleWJvYXJkIGZvY3VzIGluc2lkZSBvZiB0aGUgbW9kYWxcblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdFx0aWYgKGtleWNvZGUgPT0gOSkge1xuXHRcdFx0XHRcdGlmIChjdXJyZW50Lm9wdHMudHJhcEZvY3VzKSB7XG5cdFx0XHRcdFx0XHRzZWxmLmZvY3VzKGUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG5cdFx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdFx0aWYgKCFjdXJyZW50Lm9wdHMua2V5Ym9hcmQgfHwgZS5jdHJsS2V5IHx8IGUuYWx0S2V5IHx8IGUuc2hpZnRLZXkgfHwgJChlLnRhcmdldCkuaXMoXCJpbnB1dCx0ZXh0YXJlYSx2aWRlbyxhdWRpbyxzZWxlY3RcIikpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBCYWNrc3BhY2UgYW5kIEVzYyBrZXlzXG5cdFx0XHRcdGlmIChrZXljb2RlID09PSA4IHx8IGtleWNvZGUgPT09IDI3KSB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0c2VsZi5jbG9zZShlKTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExlZnQgYXJyb3cgYW5kIFVwIGFycm93XG5cdFx0XHRcdGlmIChrZXljb2RlID09PSAzNyB8fCBrZXljb2RlID09PSAzOCkge1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdHNlbGYucHJldmlvdXMoKTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJpZ2ggYXJyb3cgYW5kIERvd24gYXJyb3dcblx0XHRcdFx0aWYgKGtleWNvZGUgPT09IDM5IHx8IGtleWNvZGUgPT09IDQwKSB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0c2VsZi5uZXh0KCk7XG5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZWxmLnRyaWdnZXIoXCJhZnRlcktleWRvd25cIiwgZSwga2V5Y29kZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gSGlkZSBjb250cm9scyBhZnRlciBzb21lIGluYWN0aXZpdHkgcGVyaW9kXG5cdFx0XHRpZiAoc2VsZi5ncm91cFtzZWxmLmN1cnJJbmRleF0ub3B0cy5pZGxlVGltZSkge1xuXHRcdFx0XHRzZWxmLmlkbGVTZWNvbmRzQ291bnRlciA9IDA7XG5cblx0XHRcdFx0JEQub24oXG5cdFx0XHRcdFx0XCJtb3VzZW1vdmUuZmItaWRsZSBtb3VzZWxlYXZlLmZiLWlkbGUgbW91c2Vkb3duLmZiLWlkbGUgdG91Y2hzdGFydC5mYi1pZGxlIHRvdWNobW92ZS5mYi1pZGxlIHNjcm9sbC5mYi1pZGxlIGtleWRvd24uZmItaWRsZVwiLFxuXHRcdFx0XHRcdGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRzZWxmLmlkbGVTZWNvbmRzQ291bnRlciA9IDA7XG5cblx0XHRcdFx0XHRcdGlmIChzZWxmLmlzSWRsZSkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNob3dDb250cm9scygpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzZWxmLmlzSWRsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzZWxmLmlkbGVJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi5pZGxlU2Vjb25kc0NvdW50ZXIrKztcblxuXHRcdFx0XHRcdGlmIChzZWxmLmlkbGVTZWNvbmRzQ291bnRlciA+PSBzZWxmLmdyb3VwW3NlbGYuY3VyckluZGV4XS5vcHRzLmlkbGVUaW
67801lICYmICFzZWxmLmlzRHJhZ2dpbmcpIHtcblx0XHRcdFx0XHRcdHNlbGYuaXNJZGxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHNlbGYuaWRsZVNlY29uZHNDb3VudGVyID0gMDtcblxuXHRcdFx0XHRcdFx0c2VsZi5oaWRlQ29udHJvbHMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIDEwMDApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBSZW1vdmUgZXZlbnRzIGFkZGVkIGJ5IHRoZSBjb3JlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0cmVtb3ZlRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdCRXLm9mZihcIm9yaWVudGF0aW9uY2hhbmdlLmZiIHJlc2l6ZS5mYlwiKTtcblx0XHRcdCRELm9mZihcImtleWRvd24uZmIgLmZiLWlkbGVcIik7XG5cblx0XHRcdHRoaXMuJHJlZnMuY29udGFpbmVyLm9mZihcIi5mYi1jbG9zZSAuZmItcHJldiAuZmItbmV4dFwiKTtcblxuXHRcdFx0aWYgKHNlbGYuaWRsZUludGVydmFsKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhckludGVydmFsKHNlbGYuaWRsZUludGVydmFsKTtcblxuXHRcdFx0XHRzZWxmLmlkbGVJbnRlcnZhbCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIENoYW5nZSB0byBwcmV2aW91cyBnYWxsZXJ5IGl0ZW1cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRwcmV2aW91czogZnVuY3Rpb24gKGR1cmF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5qdW1wVG8odGhpcy5jdXJyUG9zIC0gMSwgZHVyYXRpb24pO1xuXHRcdH0sXG5cblx0XHQvLyBDaGFuZ2UgdG8gbmV4dCBnYWxsZXJ5IGl0ZW1cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdG5leHQ6IGZ1bmN0aW9uIChkdXJhdGlvbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuanVtcFRvKHRoaXMuY3VyclBvcyArIDEsIGR1cmF0aW9uKTtcblx0XHR9LFxuXG5cdFx0Ly8gU3dpdGNoIHRvIHNlbGVjdGVkIGdhbGxlcnkgaXRlbVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGp1bXBUbzogZnVuY3Rpb24gKHBvcywgZHVyYXRpb24pIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Z3JvdXBMZW4gPSBzZWxmLmdyb3VwLmxlbmd0aCxcblx0XHRcdFx0Zmlyc3RSdW4sXG5cdFx0XHRcdGlzTW92ZWQsXG5cdFx0XHRcdGxvb3AsXG5cdFx0XHRcdGN1cnJlbnQsXG5cdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRzbGlkZVBvcyxcblx0XHRcdFx0c3RhZ2VQb3MsXG5cdFx0XHRcdHByb3AsXG5cdFx0XHRcdGRpZmY7XG5cblx0XHRcdGlmIChzZWxmLmlzRHJhZ2dpbmcgfHwgc2VsZi5pc0Nsb3NpbmcgfHwgKHNlbGYuaXNBbmltYXRpbmcgJiYgc2VsZi5maXJzdFJ1bikpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG91bGQgbG9vcD9cblx0XHRcdHBvcyA9IHBhcnNlSW50KHBvcywgMTApO1xuXHRcdFx0bG9vcCA9IHNlbGYuY3VycmVudCA/IHNlbGYuY3VycmVudC5vcHRzLmxvb3AgOiBzZWxmLm9wdHMubG9vcDtcblxuXHRcdFx0aWYgKCFsb29wICYmIChwb3MgPCAwIHx8IHBvcyA+PSBncm91cExlbikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiBvcGVuaW5nIGZvciB0aGUgZmlyc3QgdGltZTsgdGhpcyBoZWxwcyB0byBzcGVlZCB0aGluZ3MgdXBcblx0XHRcdGZpcnN0UnVuID0gc2VsZi5maXJzdFJ1biA9ICFPYmplY3Qua2V5cyhzZWxmLnNsaWRlcykubGVuZ3RoO1xuXG5cdFx0XHQvLyBDcmVhdGUgc2xpZGVzXG5cdFx0XHRwcmV2aW91cyA9IHNlbGYuY3VycmVudDtcblxuXHRcdFx0c2VsZi5wcmV2SW5kZXggPSBzZWxmLmN1cnJJbmRleDtcblx0XHRcdHNlbGYucHJldlBvcyA9IHNlbGYuY3VyclBvcztcblxuXHRcdFx0Y3VycmVudCA9IHNlbGYuY3JlYXRlU2xpZGUocG9zKTtcblxuXHRcdFx0aWYgKGdyb3VwTGVuID4gMSkge1xuXHRcdFx0XHRpZiAobG9vcCB8fCBjdXJyZW50LmluZGV4IDwgZ3JvdXBMZW4gLSAxKSB7XG5cdFx0XHRcdFx0c2VsZi5jcmVhdGVTbGlkZShwb3MgKyAxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChsb29wIHx8IGN1cnJlbnQuaW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0c2VsZi5jcmVhdGVTbGlkZShwb3MgLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmN1cnJlbnQgPSBjdXJyZW50O1xuXHRcdFx0c2VsZi5jdXJySW5kZXggPSBjdXJyZW50LmluZGV4O1xuXHRcdFx0c2VsZi5jdXJyUG9zID0gY3VycmVudC5wb3M7XG5cblx0XHRcdHNlbGYudHJpZ2dlcihcImJlZm9yZVNob3dcIiwgZmlyc3RSdW4pO1xuXG5cdFx0XHRzZWxmLnVwZGF0ZUNvbnRyb2xzKCk7XG5cblx0XHRcdC8vIFZhbGlkYXRlIGR1cmF0aW9uIGxlbmd0aFxuXHRcdFx0Y3VycmVudC5mb3JjZWREdXJhdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCQuaXNOdW1lcmljKGR1cmF0aW9uKSkge1xuXHRcdFx0XHRjdXJyZW50LmZvcmNlZER1cmF0aW9uID0gZHVyYXRpb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkdXJhdGlvbiA9IGN1cnJlbnQub3B0c1tmaXJzdFJ1biA/IFwiYW5pbWF0aW9uRHVyYXRpb25cIiA6IFwidHJhbnNpdGlvbkR1cmF0aW9uXCJdO1xuXHRcdFx0fVxuXG5cdFx0XHRkdXJhdGlvbiA9IHBhcnNlSW50KGR1cmF0aW9uLCAxMCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHVzZXIgaGFzIHN3aXBlZCB0aGUgc2xpZGVzIG9yIGlmIHN0aWxsIGFuaW1hdGluZ1xuXHRcdFx0aXNNb3ZlZCA9IHNlbGYuaXNNb3ZlZChjdXJyZW50KTtcblxuXHRcdFx0Ly8gTWFrZSBzdXJlIGN1cnJlbnQgc2xpZGUgaXMgdmlzaWJsZVxuXHRcdFx0Y3VycmVudC4kc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tY3VycmVudFwiKTtcblxuXHRcdFx0Ly8gRnJlc2ggc3RhcnQgLSByZXZlYWwgY29udGFpbmVyLCBjdXJyZW50IHNsaWRlIGFuZCBzdGFydCBsb2FkaW5nIGNvbnRlbnRcblx0XHRcdGlmIChmaXJzdFJ1bikge1xuXHRcdFx0XHRpZiAoY3VycmVudC5vcHRzLmFuaW1hdGlvbkVmZmVjdCAmJi
6780BkdXJhdGlvbikge1xuXHRcdFx0XHRcdHNlbGYuJHJlZnMuY29udGFpbmVyLmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgZHVyYXRpb24gKyBcIm1zXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXIuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1vcGVuXCIpLnRyaWdnZXIoXCJmb2N1c1wiKTtcblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGxvYWQgY29udGVudCBpbnRvIHNsaWRlXG5cdFx0XHRcdC8vIFRoaXMgd2lsbCBsYXRlciBjYWxsIGBhZnRlckxvYWRgIC0+IGByZXZlYWxDb250ZW50YFxuXHRcdFx0XHRzZWxmLmxvYWRTbGlkZShjdXJyZW50KTtcblxuXHRcdFx0XHRzZWxmLnByZWxvYWQoXCJpbWFnZVwiKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEdldCBhY3R1YWwgc2xpZGUvc3RhZ2UgcG9zaXRpb25zIChiZWZvcmUgY2xlYW5pbmcgdXApXG5cdFx0XHRzbGlkZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHByZXZpb3VzLiRzbGlkZSk7XG5cdFx0XHRzdGFnZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHNlbGYuJHJlZnMuc3RhZ2UpO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBhbGwgc2xpZGVzXG5cdFx0XHQkLmVhY2goc2VsZi5zbGlkZXMsIGZ1bmN0aW9uIChpbmRleCwgc2xpZGUpIHtcblx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKHNsaWRlLiRzbGlkZSwgdHJ1ZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHByZXZpb3VzLnBvcyAhPT0gY3VycmVudC5wb3MpIHtcblx0XHRcdFx0cHJldmlvdXMuaXNDb21wbGV0ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmV2aW91cy4kc2xpZGUucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tY29tcGxldGUgZmFuY3lib3gtc2xpZGUtLWN1cnJlbnRcIik7XG5cblx0XHRcdC8vIElmIHNsaWRlcyBhcmUgb3V0IG9mIHBsYWNlLCB0aGVuIGFuaW1hdGUgdGhlbSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cdFx0XHRpZiAoaXNNb3ZlZCkge1xuXHRcdFx0XHQvLyBDYWxjdWxhdGUgaG9yaXpvbnRhbCBzd2lwZSBkaXN0YW5jZVxuXHRcdFx0XHRkaWZmID0gc2xpZGVQb3MubGVmdCAtIChwcmV2aW91cy5wb3MgKiBzbGlkZVBvcy53aWR0aCArIHByZXZpb3VzLnBvcyAqIHByZXZpb3VzLm9wdHMuZ3V0dGVyKTtcblxuXHRcdFx0XHQkLmVhY2goc2VsZi5zbGlkZXMsIGZ1bmN0aW9uIChpbmRleCwgc2xpZGUpIHtcblx0XHRcdFx0XHRzbGlkZS4kc2xpZGUucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1hbmltYXRlZFwiKS5yZW1vdmVDbGFzcyhmdW5jdGlvbiAoaW5kZXgsIGNsYXNzTmFtZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChjbGFzc05hbWUubWF0Y2goLyhefFxccylmYW5jeWJveC1meC1cXFMrL2cpIHx8IFtdKS5qb2luKFwiIFwiKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGVhY2ggc2xpZGUgaXMgaW4gZXF1YWwgZGlzdGFuY2Vcblx0XHRcdFx0XHQvLyBUaGlzIGlzIG1vc3RseSBuZWVkZWQgZm9yIGZyZXNobHkgYWRkZWQgc2xpZGVzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCB5ZXQgcG9zaXRpb25lZFxuXHRcdFx0XHRcdHZhciBsZWZ0UG9zID0gc2xpZGUucG9zICogc2xpZGVQb3Mud2lkdGggKyBzbGlkZS5wb3MgKiBzbGlkZS5vcHRzLmd1dHRlcjtcblxuXHRcdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKHNsaWRlLiRzbGlkZSwge1xuXHRcdFx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRcdFx0bGVmdDogbGVmdFBvcyAtIHN0YWdlUG9zLmxlZnQgKyBkaWZmXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoc2xpZGUucG9zICE9PSBjdXJyZW50LnBvcykge1xuXHRcdFx0XHRcdFx0c2xpZGUuJHNsaWRlLmFkZENsYXNzKFwiZmFuY3lib3gtc2xpZGUtLVwiICsgKHNsaWRlLnBvcyA+IGN1cnJlbnQucG9zID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCIpKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBSZWRyYXcgdG8gbWFrZSBzdXJlIHRoYXQgdHJhbnNpdGlvbiB3aWxsIHN0YXJ0XG5cdFx0XHRcdFx0Zm9yY2VSZWRyYXcoc2xpZGUuJHNsaWRlKTtcblxuXHRcdFx0XHRcdC8vIEFuaW1hdGUgdGhlIHNsaWRlXG5cdFx0XHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKFxuXHRcdFx0XHRcdFx0c2xpZGUuJHNsaWRlLCB7XG5cdFx0XHRcdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0XHRcdFx0bGVmdDogKHNsaWRlLnBvcyAtIGN1cnJlbnQucG9zKSAqIHNsaWRlUG9zLndpZHRoICsgKHNsaWRlLnBvcyAtIGN1cnJlbnQucG9zKSAqIHNsaWRlLm9wdHMuZ3V0dGVyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZHVyYXRpb24sXG5cdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHNsaWRlLiRzbGlkZVxuXHRcdFx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtOiBcIlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b3BhY2l0eTogXCJcIlxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLW5leHQgZmFuY3lib3gtc2xpZGUtLXByZXZpb3VzXCIpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRcdFx0XHRcdHNlbGYuY29tcGxldGUoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChkdXJhdGlvbiAmJiBjdXJyZW50Lm9wdHMudHJhbnNpdGlvbkVmZmVjdCkge1xuXHRcdFx0XHQvLyBTZXQgdHJhbnNpdGlvbiBlZmZlY3QgZm9yIHByZXZpb3VzbHkgYWN0aXZlIHNsaWRlXG5cdFx0XHRcdHByb3AgPSBcImZhbmN5Ym94LWFuaW1hdGVkIGZhbmN5Ym94LWZ4LVwiICsgY3VycmVudC5vcHRzLnRyYW5zaXRpb25FZmZlY3Q7XG5cblx0XHRcdFx0cHJldmlvdXMuJHNsaWRlLmFkZENsYXNzKFwiZmFuY3lib3gtc2xpZGUtLVwiICsgKHByZXZpb3VzLnBvcyA+IGN1cnJlbnQucG9zID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCIpKTtcblxuXHRcdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoXG5cdFx0XHRcdFx0cHJldmlvdXMuJHNsaWRlLFxuXHRcdFx0XHRcdHByb3AsXG5cdFx0XHRcdFx0ZHVyYXRpb24sXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cHJldmlvdXMuJHNsaWRlLnJlbW92ZUNsYXNzKHByb3ApLnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLW5leHQgZmFuY3lib3gtc2xpZGUtLXByZXZpb3VzXCIpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGN1cnJlbnQuaXNMb2FkZWQpIHtcblx0XHRcdFx0c2VsZi5yZXZlYWxDb250ZW50KGN1cnJlbnQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5sb2FkU2xpZGUoY3VycmVudCk7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYucHJlbG9hZChcImltYWdlXCIpO1xuXHRcdH0sXG5cblx0XHQvLyBDcmVhdGUgbmV3IFwic2xpZGVcIiBlbGVtZW50XG5cdFx0Ly8gVGhlc2UgYXJlIGdhbGxlcnkgaXRlbXMgIHRoYXQgYXJlIGFjdHVhbGx5IGFkZGVkIHRvIERPTVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNyZWF0ZVNsaWRlOiBmdW5jdGlvbiAocG9zKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRzbGlkZSxcblx0XHRcdFx0aW5kZXg7XG5cblx0XHRcdGluZGV4ID0gcG9zICUgc2VsZi5ncm91cC5sZW5ndGg7XG5cdFx0XHRpbmRleCA9IGluZGV4IDwgMCA/IHNlbGYuZ3JvdXAubGVuZ3RoICsgaW5kZXggOiBpbmRleDtcblxuXHRcdFx0aWYgKCFzZWxmLnNsaWRlc1twb3NdICYmIHNlbGYuZ3JvdXBbaW5kZXhdKSB7XG5cdFx0XHRcdCRzbGlkZSA9ICQoJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1zbGlkZVwiPjwvZGl2PicpLmFwcGVuZFRvKHNlbGYuJHJlZnMuc3RhZ2UpO1xuXG5cdFx0XHRcdHNlbGYuc2xpZGVzW3Bvc10gPSAkLmV4dGVuZCh0cnVlLCB7fSwgc2VsZi5ncm91cFtpbmRleF0sIHtcblx0XHRcdFx0XHRwb3M6IHBvcyxcblx0XHRcdFx0XHQkc2xpZGU6ICRzbGlkZSxcblx0XHRcdFx0XHRpc0xvYWRlZDogZmFsc2Vcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi51cGRhdGVTbGlkZShzZWxmLnNsaWRlc1twb3NdKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNlbGYuc2xpZGVzW3Bvc107XG5cdFx0fSxcblxuXHRcdC8vIFNjYWxlIGltYWdlIHRvIH
6780RoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgaW1hZ2U7XG5cdFx0Ly8geCBhbmQgeSB2YWx1ZXMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBzbGlkZVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHNjYWxlVG9BY3R1YWw6IGZ1bmN0aW9uICh4LCB5LCBkdXJhdGlvbikge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHQkY29udGVudCA9IGN1cnJlbnQuJGNvbnRlbnQsXG5cdFx0XHRcdGNhbnZhc1dpZHRoID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoY3VycmVudC4kc2xpZGUpLndpZHRoLFxuXHRcdFx0XHRjYW52YXNIZWlnaHQgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShjdXJyZW50LiRzbGlkZSkuaGVpZ2h0LFxuXHRcdFx0XHRuZXdJbWdXaWR0aCA9IGN1cnJlbnQud2lkdGgsXG5cdFx0XHRcdG5ld0ltZ0hlaWdodCA9IGN1cnJlbnQuaGVpZ2h0LFxuXHRcdFx0XHRpbWdQb3MsXG5cdFx0XHRcdHBvc1gsXG5cdFx0XHRcdHBvc1ksXG5cdFx0XHRcdHNjYWxlWCxcblx0XHRcdFx0c2NhbGVZO1xuXG5cdFx0XHRpZiAoc2VsZi5pc0FuaW1hdGluZyB8fCBzZWxmLmlzTW92ZWQoKSB8fCAhJGNvbnRlbnQgfHwgIShjdXJyZW50LnR5cGUgPT0gXCJpbWFnZVwiICYmIGN1cnJlbnQuaXNMb2FkZWQgJiYgIWN1cnJlbnQuaGFzRXJyb3IpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0c2VsZi5pc0FuaW1hdGluZyA9IHRydWU7XG5cblx0XHRcdCQuZmFuY3lib3guc3RvcCgkY29udGVudCk7XG5cblx0XHRcdHggPSB4ID09PSB1bmRlZmluZWQgPyBjYW52YXNXaWR0aCAqIDAuNSA6IHg7XG5cdFx0XHR5ID0geSA9PT0gdW5kZWZpbmVkID8gY2FudmFzSGVpZ2h0ICogMC41IDogeTtcblxuXHRcdFx0aW1nUG9zID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoJGNvbnRlbnQpO1xuXG5cdFx0XHRpbWdQb3MudG9wIC09ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKGN1cnJlbnQuJHNsaWRlKS50b3A7XG5cdFx0XHRpbWdQb3MubGVmdCAtPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShjdXJyZW50LiRzbGlkZSkubGVmdDtcblxuXHRcdFx0c2NhbGVYID0gbmV3SW1nV2lkdGggLyBpbWdQb3Mud2lkdGg7XG5cdFx0XHRzY2FsZVkgPSBuZXdJbWdIZWlnaHQgLyBpbWdQb3MuaGVpZ2h0O1xuXG5cdFx0XHQvLyBHZXQgY2VudGVyIHBvc2l0aW9uIGZvciBvcmlnaW5hbCBpbWFnZVxuXHRcdFx0cG9zWCA9IGNhbnZhc1dpZHRoICogMC41IC0gbmV3SW1nV2lkdGggKiAwLjU7XG5cdFx0XHRwb3NZID0gY2FudmFzSGVpZ2h0ICogMC41IC0gbmV3SW1nSGVpZ2h0ICogMC41O1xuXG5cdFx0XHQvLyBNYWtlIHN1cmUgaW1hZ2UgZG9lcyBub3QgbW92ZSBhd2F5IGZyb20gZWRnZXNcblx0XHRcdGlmIChuZXdJbWdXaWR0aCA+IGNhbnZhc1dpZHRoKSB7XG5cdFx0XHRcdHBvc1ggPSBpbWdQb3MubGVmdCAqIHNjYWxlWCAtICh4ICogc2NhbGVYIC0geCk7XG5cblx0XHRcdFx0aWYgKHBvc1ggPiAwKSB7XG5cdFx0XHRcdFx0cG9zWCA9IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocG9zWCA8IGNhbnZhc1dpZHRoIC0gbmV3SW1nV2lkdGgpIHtcblx0XHRcdFx0XHRwb3NYID0gY2FudmFzV2lkdGggLSBuZXdJbWdXaWR0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3SW1nSGVpZ2h0ID4gY2FudmFzSGVpZ2h0KSB7XG5cdFx0XHRcdHBvc1kgPSBpbWdQb3MudG9wICogc2NhbGVZIC0gKHkgKiBzY2FsZVkgLSB5KTtcblxuXHRcdFx0XHRpZiAocG9zWSA+IDApIHtcblx0XHRcdFx0XHRwb3NZID0gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwb3NZIDwgY2FudmFzSGVpZ2h0IC0gbmV3SW1nSGVpZ2h0KSB7XG5cdFx0XHRcdFx0cG9zWSA9IGNhbnZhc0hlaWdodCAtIG5ld0ltZ0hlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnVwZGF0ZUN1cnNvcihuZXdJbWdXaWR0aCwgbmV3SW1nSGVpZ2h0KTtcblxuXHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKFxuXHRcdFx0XHQkY29udGVudCwge1xuXHRcdFx0XHRcdHRvcDogcG9zWSxcblx0XHRcdFx0XHRsZWZ0OiBwb3NYLFxuXHRcdFx0XHRcdHNjYWxlWDogc2NhbGVYLFxuXHRcdFx0XHRcdHNjYWxlWTogc2NhbGVZXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGR1cmF0aW9uIHx8IDM2Nixcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gU3RvcCBzbGlkZXNob3dcblx0XHRcdGlmIChzZWxmLlNsaWRlU2hvdyAmJiBzZWxmLlNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0XHRzZWxmLlNsaWRlU2hvdy5zdG9wKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFNjYWxlIGltYWdlIHRvIGZpdCBpbnNpZGUgcGFyZW50IGVsZW1lbnRcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRzY2FsZVRvRml0OiBmdW5jdGlvbiAoZHVyYXRpb24pIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Y3VycmVudCA9IHNlbGYuY3VycmVudCxcblx0XHRcdFx0JGNvbnRlbnQgPSBjdXJyZW50LiRjb250ZW50LFxuXHRcdFx0XHRlbmQ7XG5cblx0XHRcdGlmIChzZWxmLmlzQW5pbWF0aW5nIHx8IHNlbGYuaXNNb3ZlZCgpIHx8ICEkY29udGVudCB8fCAhKGN1cnJlbnQudHlwZSA9PSBcImltYWdlXCIgJiYgY3VycmVudC5pc0xvYWRlZCAmJiAhY3VycmVudC5oYXNFcnJvcikpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblxuXHRcdFx0JC5mYW5jeWJveC5zdG9wKCRjb250ZW50KTtcblxuXHRcdFx0ZW5kID0gc2VsZi5nZXRGaXRQb3MoY3VycmVudCk7XG5cblx0XHRcdHNlbGYudXBkYXRlQ3Vyc29yKGVuZC53aWR0aCwgZW5kLmhlaWdodCk7XG5cblx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShcblx0XHRcdFx0JGNvbnRlbnQsIHtcblx0XHRcdFx0XHR0b3A6IGVuZC50b3AsXG5cdFx0XHRcdFx0bGVmdDogZW5kLmxlZnQsXG5cdFx0XHRcdFx0c2NhbGVYOiBlbmQud2lkdGggLyAkY29udGVudC53aWR0aCgpLFxuXHRcdFx0XHRcdHNjYWxlWTogZW5kLmhlaWdodCAvICRjb250ZW50LmhlaWdodCgpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGR1cmF0aW9uIHx8IDM2Nixcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9LFxuXG5cdFx0Ly8gQ2FsY3VsYXRlIGltYWdlIHNpemUgdG8gZml0IGluc2lkZSB2aWV3cG9ydFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGdldEZpdFBvczogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRjb250ZW50ID0gc2xpZGUuJGNvbnRlbnQsXG5cdFx0XHRcdCRzbGlkZSA9IHNsaWRlLiRzbGlkZSxcblx0XHRcdFx0d2lkdGggPSBzbGlkZS53aWR0aCB8fCBzbGlkZS5vcHRzLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQgPSBzbGlkZS5oZWlnaHQgfHwgc2xpZGUub3B0cy5oZWlnaHQsXG5cdFx0XHRcdG1heFdpZHRoLFxuXHRcdFx0XHRtYXhIZWlnaHQsXG5cdFx0XHRcdG1pblJhdGlvLFxuXHRcdFx0XHRhc3BlY3RSYXRpbyxcblx0XHRcdFx0cmV6ID0ge307XG5cblx0XHRcdGlmICghc2xpZGUuaXNMb2FkZWQgfHwgISRjb250ZW50IHx8ICEkY29udGVudC5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRtYXhXaWR0aCA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHNlbGYuJHJlZnMuc3RhZ2UpLndpZHRoO1xuXHRcdFx0bWF4SGVpZ2h0ID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoc2VsZi4kcmVmcy5zdGFnZSkuaGVpZ2h0O1xuXG5cdFx0XHRtYXhXaWR0aCAtPVxuXHRcdFx0XHRwYXJzZU
6780Zsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nTGVmdFwiKSkgK1xuXHRcdFx0XHRwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nUmlnaHRcIikpICtcblx0XHRcdFx0cGFyc2VGbG9hdCgkY29udGVudC5jc3MoXCJtYXJnaW5MZWZ0XCIpKSArXG5cdFx0XHRcdHBhcnNlRmxvYXQoJGNvbnRlbnQuY3NzKFwibWFyZ2luUmlnaHRcIikpO1xuXG5cdFx0XHRtYXhIZWlnaHQgLT1cblx0XHRcdFx0cGFyc2VGbG9hdCgkc2xpZGUuY3NzKFwicGFkZGluZ1RvcFwiKSkgK1xuXHRcdFx0XHRwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nQm90dG9tXCIpKSArXG5cdFx0XHRcdHBhcnNlRmxvYXQoJGNvbnRlbnQuY3NzKFwibWFyZ2luVG9wXCIpKSArXG5cdFx0XHRcdHBhcnNlRmxvYXQoJGNvbnRlbnQuY3NzKFwibWFyZ2luQm90dG9tXCIpKTtcblxuXHRcdFx0aWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7XG5cdFx0XHRcdHdpZHRoID0gbWF4V2lkdGg7XG5cdFx0XHRcdGhlaWdodCA9IG1heEhlaWdodDtcblx0XHRcdH1cblxuXHRcdFx0bWluUmF0aW8gPSBNYXRoLm1pbigxLCBtYXhXaWR0aCAvIHdpZHRoLCBtYXhIZWlnaHQgLyBoZWlnaHQpO1xuXG5cdFx0XHR3aWR0aCA9IG1pblJhdGlvICogd2lkdGg7XG5cdFx0XHRoZWlnaHQgPSBtaW5SYXRpbyAqIGhlaWdodDtcblxuXHRcdFx0Ly8gQWRqdXN0IHdpZHRoL2hlaWdodCB0byBwcmVjaXNlbHkgZml0IGludG8gY29udGFpbmVyXG5cdFx0XHRpZiAod2lkdGggPiBtYXhXaWR0aCAtIDAuNSkge1xuXHRcdFx0XHR3aWR0aCA9IG1heFdpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0IC0gMC41KSB7XG5cdFx0XHRcdGhlaWdodCA9IG1heEhlaWdodDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNsaWRlLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuXHRcdFx0XHRyZXoudG9wID0gTWF0aC5mbG9vcigobWF4SGVpZ2h0IC0gaGVpZ2h0KSAqIDAuNSkgKyBwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nVG9wXCIpKTtcblx0XHRcdFx0cmV6LmxlZnQgPSBNYXRoLmZsb29yKChtYXhXaWR0aCAtIHdpZHRoKSAqIDAuNSkgKyBwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nTGVmdFwiKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHNsaWRlLmNvbnRlbnRUeXBlID09PSBcInZpZGVvXCIpIHtcblx0XHRcdFx0Ly8gRm9yY2UgYXNwZWN0IHJhdGlvIGZvciB0aGUgdmlkZW9cblx0XHRcdFx0Ly8gXCJJIHNheSB0aGUgd2hvbGUgd29ybGQgbXVzdCBsZWFybiBvZiBvdXIgcGVhY2VmdWwgd2F5c+KApiBieSBmb3JjZSFcIlxuXHRcdFx0XHRhc3BlY3RSYXRpbyA9IHNsaWRlLm9wdHMud2lkdGggJiYgc2xpZGUub3B0cy5oZWlnaHQgPyB3aWR0aCAvIGhlaWdodCA6IHNsaWRlLm9wdHMucmF0aW8gfHwgMTYgLyA5O1xuXG5cdFx0XHRcdGlmIChoZWlnaHQgPiB3aWR0aCAvIGFzcGVjdFJhdGlvKSB7XG5cdFx0XHRcdFx0aGVpZ2h0ID0gd2lkdGggLyBhc3BlY3RSYXRpbztcblx0XHRcdFx0fSBlbHNlIGlmICh3aWR0aCA+IGhlaWdodCAqIGFzcGVjdFJhdGlvKSB7XG5cdFx0XHRcdFx0d2lkdGggPSBoZWlnaHQgKiBhc3BlY3RSYXRpbztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXoud2lkdGggPSB3aWR0aDtcblx0XHRcdHJlei5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdHJldHVybiByZXo7XG5cdFx0fSxcblxuXHRcdC8vIFVwZGF0ZSBjb250ZW50IHNpemUgYW5kIHBvc2l0aW9uIGZvciBhbGwgc2xpZGVzXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dXBkYXRlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHQkLmVhY2goc2VsZi5zbGlkZXMsIGZ1bmN0aW9uIChrZXksIHNsaWRlKSB7XG5cdFx0XHRcdHNlbGYudXBkYXRlU2xpZGUoc2xpZGUsIGUpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdC8vIFVwZGF0ZSBzbGlkZSBjb250ZW50IHBvc2l0aW9uIGFuZCBzaXplXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHVwZGF0ZVNsaWRlOiBmdW5jdGlvbiAoc2xpZGUsIGUpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0JGNvbnRlbnQgPSBzbGlkZSAmJiBzbGlkZS4kY29udGVudCxcblx0XHRcdFx0d2lkdGggPSBzbGlkZS53aWR0aCB8fCBzbGlkZS5vcHRzLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQgPSBzbGlkZS5oZWlnaHQgfHwgc2xpZGUub3B0cy5oZWlnaHQsXG5cdFx0XHRcdCRzbGlkZSA9IHNsaWRlLiRzbGlkZTtcblxuXHRcdFx0Ly8gRmlyc3QsIHByZXZlbnQgY2FwdGlvbiBvdmVybGFwLCBpZiBuZWVkZWRcblx0XHRcdHNlbGYuYWRqdXN0Q2FwdGlvbihzbGlkZSk7XG5cblx0XHRcdC8vIFRoZW4gcmVzaXplIGNvbnRlbnQgdG8gZml0IGluc2lkZSB0aGUgc2xpZGVcblx0XHRcdGlmICgkY29udGVudCAmJiAod2lkdGggfHwgaGVpZ2h0IHx8IHNsaWRlLmNvbnRlbnRUeXBlID09PSBcInZpZGVvXCIpICYmICFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHQkLmZhbmN5Ym94LnN0b3AoJGNvbnRlbnQpO1xuXG5cdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKCRjb250ZW50LCBzZWxmLmdldEZpdFBvcyhzbGlkZSkpO1xuXG5cdFx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHNlbGYudXBkYXRlQ3Vyc29yKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiBzb21lIGFkanVzdG1lbnRzXG5cdFx0XHRzZWxmLmFkanVzdExheW91dChzbGlkZSk7XG5cblx0XHRcdGlmICgkc2xpZGUubGVuZ3RoKSB7XG5cdFx0XHRcdCRzbGlkZS50cmlnZ2VyKFwicmVmcmVzaFwiKTtcblxuXHRcdFx0XHRpZiAoc2xpZGUucG9zID09PSBzZWxmLmN1cnJQb3MpIHtcblx0XHRcdFx0XHRzZWxmLiRyZWZzLnRvb2xiYXJcblx0XHRcdFx0XHRcdC5hZGQoc2VsZi4kcmVmcy5uYXZpZ2F0aW9uLmZpbmQoXCIuZmFuY3lib3gtYnV0dG9uLS1hcnJvd19yaWdodFwiKSlcblx0XHRcdFx0XHRcdC50b2dnbGVDbGFzcyhcImNvbXBlbnNhdGUtZm9yLXNjcm9sbGJhclwiLCAkc2xpZGUuZ2V0KDApLnNjcm9sbEhlaWdodCA+ICRzbGlkZS5nZXQoMCkuY2xpZW50SGVpZ2h0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnRyaWdnZXIoXCJvblVwZGF0ZVwiLCBzbGlkZSwgZSk7XG5cdFx0fSxcblxuXHRcdC8vIEhvcml6b250YWxseSBjZW50ZXIgc2xpZGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRjZW50ZXJTbGlkZTogZnVuY3Rpb24gKGR1cmF0aW9uKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdCRzbGlkZSA9IGN1cnJlbnQuJHNsaWRlO1xuXG5cdFx0XHRpZiAoc2VsZi5pc0Nsb3NpbmcgfHwgIWN1cnJlbnQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQkc2xpZGUuc2libGluZ3MoKS5jc3Moe1xuXHRcdFx0XHR0cmFuc2Zvcm06IFwiXCIsXG5cdFx0XHRcdG9wYWNpdHk6IFwiXCJcblx0XHRcdH0pO1xuXG5cdFx0XHQkc2xpZGVcblx0XHRcdFx0LnBhcmVudCgpXG5cdFx0XHRcdC5jaGlsZHJlbigpXG5cdFx0XHRcdC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LXNsaWRlLS1wcmV2aW91cyBmYW5jeWJveC1zbGlkZS0tbmV4dFwiKTtcblxuXHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKFxuXHRcdFx0XHQkc2xpZGUsIHtcblx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGR1cmF0aW9uID09PSB1bmRlZmluZWQgPyAwIDogZHVyYXRpb24sXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBDbGVhbiB1cFxuXHRcdFx0XHRcdCRzbGlkZS5jc3Moe1xuXHRcdFx0XHRcdFx0dHJhbnNmb3JtOiBcIlwiLFxuXHRcdFx0XHRcdFx0b3BhY2l0eTogXCJcIlxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKCFjdXJyZW50LmlzQ29tcGxldGUpIHtcblx0XHRcdFx0XHRcdHNlbGYuY29tcGxldGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdH0sXG5cblx0XHQvLyBDaGVjayBpZiBjdXJyZW50IHNsaWRlIGlzIG1vdmVkIChzd2lwZWQpXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aXNNb3ZlZDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgY3VycmVudCA9IHNsaWRlIHx8IHRoaXMuY3VycmVudCxcblx0XHRcdFx0c2xpZGVQb3MsXG5cdFx0XHRcdHN0YWdlUG9zO1xuXG5cdFx0XHRpZiAoIWN1cnJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRzdGFnZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHRoaXMuJHJlZnMuc3RhZ2UpO1xuXHRcdFx0c2xpZGVQb3MgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShjdXJyZW50LiRzbGlkZSk7XG5cblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdCFjdXJyZW50LiRzbGlkZS5oYXNDbGFzcyhcImZhbmN5Ym94LWFuaW1hdGVkXCIpICYmXG5cdFx0XHRcdChNYXRoLmFicyhzbGlkZVBvcy50b3AgLSBzdGFnZVBvcy50b3ApID4gMC41IHx8IE1hdGguYWJzKHNsaWRlUG9zLmxlZnQgLSBzdGFnZVBvcy5sZWZ0KSA+IDAuNSlcblx0XHRcdCk7XG5cdFx0fSxcblxuXHRcdC8vIFVwZGF0ZSBjdXJzb3Igc3R5bGUgZGVwZW5kaW5nIGlmIGNvbnRlbnQgY2FuIGJlIHpvb21lZFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dXBkYXRlQ3Vyc29yOiBmdW5jdGlvbiAobmV4dFdpZHRoLCBuZXh0SGVpZ2h0KSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdCRjb250YWluZXIgPSBzZWxmLiRyZWZzLmNvbn
6780RhaW5lcixcblx0XHRcdFx0Y2FuUGFuLFxuXHRcdFx0XHRpc1pvb21hYmxlO1xuXG5cdFx0XHRpZiAoIWN1cnJlbnQgfHwgc2VsZi5pc0Nsb3NpbmcgfHwgIXNlbGYuR3Vlc3R1cmVzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0JGNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWlzLXpvb21hYmxlIGZhbmN5Ym94LWNhbi16b29tSW4gZmFuY3lib3gtY2FuLXpvb21PdXQgZmFuY3lib3gtY2FuLXN3aXBlIGZhbmN5Ym94LWNhbi1wYW5cIik7XG5cblx0XHRcdGNhblBhbiA9IHNlbGYuY2FuUGFuKG5leHRXaWR0aCwgbmV4dEhlaWdodCk7XG5cblx0XHRcdGlzWm9vbWFibGUgPSBjYW5QYW4gPyB0cnVlIDogc2VsZi5pc1pvb21hYmxlKCk7XG5cblx0XHRcdCRjb250YWluZXIudG9nZ2xlQ2xhc3MoXCJmYW5jeWJveC1pcy16b29tYWJsZVwiLCBpc1pvb21hYmxlKTtcblxuXHRcdFx0JChcIltkYXRhLWZhbmN5Ym94LXpvb21dXCIpLnByb3AoXCJkaXNhYmxlZFwiLCAhaXNab29tYWJsZSk7XG5cblx0XHRcdGlmIChjYW5QYW4pIHtcblx0XHRcdFx0JGNvbnRhaW5lci5hZGRDbGFzcyhcImZhbmN5Ym94LWNhbi1wYW5cIik7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRpc1pvb21hYmxlICYmXG5cdFx0XHRcdChjdXJyZW50Lm9wdHMuY2xpY2tDb250ZW50ID09PSBcInpvb21cIiB8fCAoJC5pc0Z1bmN0aW9uKGN1cnJlbnQub3B0cy5jbGlja0NvbnRlbnQpICYmIGN1cnJlbnQub3B0cy5jbGlja0NvbnRlbnQoY3VycmVudCkgPT0gXCJ6b29tXCIpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdCRjb250YWluZXIuYWRkQ2xhc3MoXCJmYW5jeWJveC1jYW4tem9vbUluXCIpO1xuXHRcdFx0fSBlbHNlIGlmIChjdXJyZW50Lm9wdHMudG91Y2ggJiYgKGN1cnJlbnQub3B0cy50b3VjaC52ZXJ0aWNhbCB8fCBzZWxmLmdyb3VwLmxlbmd0aCA+IDEpICYmIGN1cnJlbnQuY29udGVudFR5cGUgIT09IFwidmlkZW9cIikge1xuXHRcdFx0XHQkY29udGFpbmVyLmFkZENsYXNzKFwiZmFuY3lib3gtY2FuLXN3aXBlXCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDaGVjayBpZiBjdXJyZW50IHNsaWRlIGlzIHpvb21hYmxlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aXNab29tYWJsZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRmaXRQb3M7XG5cblx0XHRcdC8vIEFzc3VtZSB0aGF0IHNsaWRlIGlzIHpvb21hYmxlIGlmOlxuXHRcdFx0Ly8gICAtIGltYWdlIGlzIHN0aWxsIGxvYWRpbmdcblx0XHRcdC8vICAgLSBhY3R1YWwgc2l6ZSBvZiB0aGUgaW1hZ2UgaXMgc21hbGxlciB0aGFuIGF2YWlsYWJsZSBhcmVhXG5cdFx0XHRpZiAoY3VycmVudCAmJiAhc2VsZi5pc0Nsb3NpbmcgJiYgY3VycmVudC50eXBlID09PSBcImltYWdlXCIgJiYgIWN1cnJlbnQuaGFzRXJyb3IpIHtcblx0XHRcdFx0aWYgKCFjdXJyZW50LmlzTG9hZGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmaXRQb3MgPSBzZWxmLmdldEZpdFBvcyhjdXJyZW50KTtcblxuXHRcdFx0XHRpZiAoZml0UG9zICYmIChjdXJyZW50LndpZHRoID4gZml0UG9zLndpZHRoIHx8IGN1cnJlbnQuaGVpZ2h0ID4gZml0UG9zLmhlaWdodCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblxuXHRcdC8vIENoZWNrIGlmIGN1cnJlbnQgaW1hZ2UgZGltZW5zaW9ucyBhcmUgc21hbGxlciB0aGFuIGFjdHVhbFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aXNTY2FsZWREb3duOiBmdW5jdGlvbiAobmV4dFdpZHRoLCBuZXh0SGVpZ2h0KSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdHJleiA9IGZhbHNlLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHQkY29udGVudCA9IGN1cnJlbnQuJGNvbnRlbnQ7XG5cblx0XHRcdGlmIChuZXh0V2lkdGggIT09IHVuZGVmaW5lZCAmJiBuZXh0SGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV6ID0gbmV4dFdpZHRoIDwgY3VycmVudC53aWR0aCAmJi
6780BuZXh0SGVpZ2h0IDwgY3VycmVudC5oZWlnaHQ7XG5cdFx0XHR9IGVsc2UgaWYgKCRjb250ZW50KSB7XG5cdFx0XHRcdHJleiA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKCRjb250ZW50KTtcblx0XHRcdFx0cmV6ID0gcmV6LndpZHRoIDwgY3VycmVudC53aWR0aCAmJiByZXouaGVpZ2h0IDwgY3VycmVudC5oZWlnaHQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXo7XG5cdFx0fSxcblxuXHRcdC8vIENoZWNrIGlmIGltYWdlIGRpbWVuc2lvbnMgZXhjZWVkIHBhcmVudCBlbGVtZW50XG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNhblBhbjogZnVuY3Rpb24gKG5leHRXaWR0aCwgbmV4dEhlaWdodCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRwb3MgPSBudWxsLFxuXHRcdFx0XHRyZXogPSBmYWxzZTtcblxuXHRcdFx0aWYgKGN1cnJlbnQudHlwZSA9PT0gXCJpbWFnZVwiICYmIChjdXJyZW50LmlzQ29tcGxldGUgfHwgKG5leHRXaWR0aCAmJiBuZXh0SGVpZ2h0KSkgJiYgIWN1cnJlbnQuaGFzRXJyb3IpIHtcblx0XHRcdFx0cmV6ID0gc2VsZi5nZXRGaXRQb3MoY3VycmVudCk7XG5cblx0XHRcdFx0aWYgKG5leHRXaWR0aCAhPT0gdW5kZWZpbmVkICYmIG5leHRIZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHBvcyA9IHtcblx0XHRcdFx0XHRcdHdpZHRoOiBuZXh0V2lkdGgsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IG5leHRIZWlnaHRcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGN1cnJlbnQuaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdHBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKGN1cnJlbnQuJGNvbnRlbnQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHBvcyAmJiByZXopIHtcblx0XHRcdFx0XHRyZXogPSBNYXRoLmFicyhwb3Mud2lkdGggLSByZXoud2lkdGgpID4gMS41IHx8IE1hdGguYWJzKHBvcy5oZWlnaHQgLSByZXouaGVpZ2h0KSA+IDEuNTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmV6O1xuXHRcdH0sXG5cblx0XHQvLyBMb2FkIGNvbnRlbnQgaW50byB0aGUgc2xpZGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGxvYWRTbGlkZTogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdCRzbGlkZSxcblx0XHRcdFx0YWpheExvYWQ7XG5cblx0XHRcdGlmIChzbGlkZS5pc0xvYWRpbmcgfHwgc2xpZGUuaXNMb2FkZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzbGlkZS5pc0xvYWRpbmcgPSB0cnVlO1xuXG5cdFx0XHRpZiAoc2VsZi50cmlnZ2VyKFwiYmVmb3JlTG9hZFwiLCBzbGlkZSkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHNsaWRlLmlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0dHlwZSA9IHNsaWRlLnR5cGU7XG5cdFx0XHQkc2xpZGUgPSBzbGlkZS4kc2xpZGU7XG5cblx0XHRcdCRzbGlkZVxuXHRcdFx0XHQub2ZmKFwicmVmcmVzaFwiKVxuXHRcdFx0XHQudHJpZ2dlcihcIm9uUmVzZXRcIilcblx0XHRcdFx0LmFkZENsYXNzKHNsaWRlLm9wdHMuc2xpZGVDbGFzcyk7XG5cblx0XHRcdC8vIENyZWF0ZSBjb250ZW50IGRlcGVuZGluZyBvbiB0aGUgdHlwZVxuXHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJpbWFnZVwiOlxuXHRcdFx0XHRcdHNlbGYuc2V0SW1hZ2Uoc2xpZGUpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImlmcmFtZVwiOlxuXHRcdFx0XHRcdHNlbGYuc2V0SWZyYW1lKHNsaWRlKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJodG1sXCI6XG5cdFx0XHRcdFx0c2VsZi5zZXRDb250ZW50KHNsaWRlLCBzbGlkZS5zcmMgfHwgc2xpZGUuY29udGVudCk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwidmlkZW9cIjpcblx0XHRcdFx0XHRzZWxmLnNldENvbnRlbnQoXG5cdFx0XHRcdFx0XHRzbGlkZSxcblx0XHRcdFx0XHRcdHNsaWRlLm9wdHMudmlkZW8udHBsXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXHtcXHtzcmNcXH1cXH0vZ2ksIHNsaWRlLnNyYylcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7e2Zvcm1hdH19XCIsIHNsaWRlLm9wdHMudmlkZW9Gb3JtYXQgfHwgc2xpZGUub3B0cy52aWRlby5mb3JtYXQgfHwgXCJcIilcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7e3Bvc3Rlcn19XCIsIHNsaWRlLnRodW1iIHx8IFwiXCIpXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJpbmxpbmVcIjpcblx0XHRcdFx0XHRpZiAoJChzbGlkZS5zcmMpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZXRDb250ZW50KHNsaWRlLCAkKHNsaWRlLnNyYykpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLnNldEVycm9yKHNsaWRlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYWpheFwiOlxuXHRcdFx0XHRcdHNlbGYuc2hvd0xvYWRpbmcoc2xpZGUpO1xuXG5cdFx0XHRcdFx0YWpheExvYWQgPSAkLmFqYXgoXG5cdFx0XHRcdFx0XHQkLmV4dGVuZCh7fSwgc2xpZGUub3B0cy5hamF4LnNldHRpbmdzLCB7XG5cdFx0XHRcdFx0XHRcdHVybDogc2xpZGUuc3JjLFxuXHRcdFx0XHRcdFx0XHRzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cykge1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0ZXh0U3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2VsZi5zZXRDb250ZW50KHNsaWRlLCBkYXRhKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGVycm9yOiBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoanFYSFIgJiYgdGV4dFN0YXR1cyAhPT0gXCJhYm9ydFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzZWxmLnNldEVycm9yKHNsaWRlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdCRzbGlkZS5vbmUoXCJvblJlc2V0XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFqYXhMb2FkLmFib3J0KCk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNlbGYuc2V0RXJyb3Ioc2xpZGUpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
6780B0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBVc2UgdGh1bWJuYWlsIGltYWdlLCBpZiBwb3NzaWJsZVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRzZXRJbWFnZTogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGdob3N0O1xuXG5cdFx0XHQvLyBDaGVjayBpZiBuZWVkIHRvIHNob3cgbG9hZGluZyBpY29uXG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyICRpbWcgPSBzbGlkZS4kaW1hZ2U7XG5cblx0XHRcdFx0aWYgKCFzZWxmLmlzQ2xvc2luZyAmJiBzbGlkZS5pc0xvYWRpbmcgJiYgKCEkaW1nIHx8ICEkaW1nLmxlbmd0aCB8fCAhJGltZ1swXS5jb21wbGV0ZSkgJiYgIXNsaWRlLmhhc0Vycm9yKSB7XG5cdFx0XHRcdFx0c2VsZi5zaG93TG9hZGluZyhzbGlkZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIDUwKTtcblxuXHRcdFx0Ly9DaGVjayBpZiBpbWFnZSBoYXMgc3Jjc2V0XG5cdFx0XHRzZWxmLmNoZWNrU3Jjc2V0KHNsaWRlKTtcblxuXHRcdFx0Ly8gVGhpcyB3aWxsIGJlIHdyYXBwZXIgY29udGFpbmluZyBib3RoIGdob3N0IGFuZCBhY3R1YWwgaW1hZ2Vcblx0XHRcdHNsaWRlLiRjb250ZW50ID0gJCgnPGRpdiBjbGFzcz1cImZhbmN5Ym94LWNvbnRlbnRcIj48L2Rpdj4nKVxuXHRcdFx0XHQuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1oaWRkZW5cIilcblx0XHRcdFx0LmFwcGVuZFRvKHNsaWRlLiRzbGlkZS5hZGRDbGFzcyhcImZhbmN5Ym94LXNsaWRlLS1pbWFnZVwiKSk7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgYSB0aHVtYm5haWwsIHdlIGNhbiBkaXNwbGF5IGl0IHdoaWxlIGFjdHVhbCBpbWFnZSBpcyBsb2FkaW5nXG5cdFx0XHQvLyBVc2VycyB3aWxsIG5vdCBzdGFyZSBhdCBibGFjayBzY3JlZW4gYW5kIGFjdHVhbCBpbWFnZSB3aWxsIGFwcGVhciBncmFkdWFsbHlcblx0XHRcdGlmIChzbGlkZS5vcHRzLnByZWxvYWQgIT09IGZhbHNlICYmIHNsaWRlLm9wdHMud2lkdGggJiYgc2xpZGUub3B0cy5oZWlnaHQgJiYgc2xpZGUudGh1bWIpIHtcblx0XHRcdFx0c2xpZGUud2lkdGggPSBzbGlkZS5vcHRzLndpZHRoO1xuXHRcdFx0XHRzbGlkZS5oZWlnaHQgPSBzbGlkZS5vcHRzLmhlaWdodDtcblxuXHRcdFx0XHRnaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5cblx0XHRcdFx0Z2hvc3Qub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkKHRoaXMpLnJlbW92ZSgpO1xuXG5cdFx0XHRcdFx0c2xpZGUuJGdob3N0ID0gbnVsbDtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRnaG9zdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi5hZnRlckxvYWQoc2xpZGUpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHNsaWRlLiRnaG9zdCA9ICQoZ2hvc3QpXG5cdFx0XHRcdFx0LmFkZENsYXNzKFwiZmFuY3lib3gtaW1hZ2VcIilcblx0XHRcdFx0XHQuYXBwZW5kVG8oc2xpZGUuJGNvbnRlbnQpXG5cdFx0XHRcdFx0LmF0dHIoXCJzcmNcIiwgc2xpZGUudGh1bWIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCBsb2FkaW5nIGFjdHVhbCBpbWFnZVxuXHRcdFx0c2VsZi5zZXRCaWdJbWFnZShzbGlkZSk7XG5cdFx0fSxcblxuXHRcdC8vIENoZWNrIGlmIGltYWdlIGhhcyBzcmNzZXQgYW5kIGdldCB0aGUgc291cmNlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRjaGVja1NyY3NldDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc3Jjc2V0ID0gc2xpZGUub3B0cy5zcmNzZXQgfHwgc2xpZGUub3B0cy5pbWFnZS5zcmNzZXQsXG5cdFx0XHRcdGZvdW5kLFxuXHRcdFx0XHR0ZW1wLFxuXHRcdFx0XHRweFJhdGlvLFxuXHRcdFx0XHR3aW5kb3dXaWR0aDtcblxuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBcInNyY3NldFwiLCB0aGVuIHdlIG5lZWQgdG8gZmluZCBmaXJzdCBtYXRjaGluZyBcInNyY1wiIHZhbHVlLlxuXHRcdFx0Ly8gVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2Ugd2hlbiB5b3Ugc2V0IGFuIHNyYyBhdHRyaWJ1dGUsIHRoZSBicm93c2VyIHdpbGwgcHJlbG9hZCB0aGUgaW1hZ2Vcblx0XHRcdC8vIGJlZm9yZSBhbnkgamF2YXNjcmlwdCBvciBldmVuIENTUyBpcyBhcHBsaWVkLlxuXHRcdFx0aWYgKHNyY3NldCkge1xuXHRcdFx0XHRweFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblx0XHRcdFx0d2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAqIHB4UmF0aW87XG5cblx0XHRcdFx0dGVtcCA9IHNyY3NldC5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uIChlbCkge1xuXHRcdFx0XHRcdHZhciByZXQgPSB7fTtcblxuXHRcdFx0XHRcdGVsLnRyaW0oKVxuXHRcdFx0XHRcdFx0LnNwbGl0KC9cXHMrLylcblx0XHRcdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSBwYXJzZUludChlbC5zdWJzdHJpbmcoMCwgZWwubGVuZ3RoIC0gMSksIDEwKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAocmV0LnVybCA9IGVsKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldC52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdHJldC5wb3N0Zml4ID0gZWxbZWwubGVuZ3RoIC0gMV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gU29ydCBieSB2YWx1ZVxuXHRcdFx0XHR0ZW1wLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdFx0XHRyZXR1cm4gYS52YWx1ZSAtIGIudmFsdWU7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIE9rLCBub3cgd2UgaGF2ZSBhbiBhcnJheSBvZiBhbGwgc3Jjc2V0IHZhbHVlc1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRlbXAubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHR2YXIgZWwgPSB0ZW1wW2pdO1xuXG5cdFx0XHRcdFx0aWYgKChlbC5wb3N0Zml4ID09PSBcIndcIiAmJiBlbC52YWx1ZSA+PSB3aW5kb3dXaWR0aCkgfHwgKGVsLnBvc3RmaXggPT09IFwieFwiICYmIGVsLnZhbHVlID49IHB4UmF0aW8pKSB7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IGVsO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgbm90IGZvdW5kLCB0YWtlIHRoZSBsYXN0IG9uZVxuXHRcdFx0XHRpZiAoIWZvdW5kICYmIHRlbXAubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Zm91bmQgPSB0ZW1wW3RlbXAubGVuZ3RoIC0gMV07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZm91bmQpIHtcblx0XHRcdFx0XHRzbGlkZS5zcmMgPSBmb3VuZC51cmw7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRlZmF1bHQgd2lkdGgvaGVpZ2h0IHZhbHVlcywgd2UgY2FuIGNhbGN1bGF0ZSBoZWlnaHQgZm9yIG1hdGNoaW5nIHNvdXJjZVxuXHRcdFx0XHRcdGlmIChzbGlkZS53aWR0aCAmJi
6780BzbGlkZS5oZWlnaHQgJiYgZm91bmQucG9zdGZpeCA9PSBcIndcIikge1xuXHRcdFx0XHRcdFx0c2xpZGUuaGVpZ2h0ID0gKHNsaWRlLndpZHRoIC8gc2xpZGUuaGVpZ2h0KSAqIGZvdW5kLnZhbHVlO1xuXHRcdFx0XHRcdFx0c2xpZGUud2lkdGggPSBmb3VuZC52YWx1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzbGlkZS5vcHRzLnNyY3NldCA9IHNyY3NldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDcmVhdGUgZnVsbC1zaXplIGltYWdlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0c2V0QmlnSW1hZ2U6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLFxuXHRcdFx0XHQkaW1nID0gJChpbWcpO1xuXG5cdFx0XHRzbGlkZS4kaW1hZ2UgPSAkaW1nXG5cdFx0XHRcdC5vbmUoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi5zZXRFcnJvcihzbGlkZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5vbmUoXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgc2l6ZXM7XG5cblx0XHRcdFx0XHRpZiAoIXNsaWRlLiRnaG9zdCkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZXNvbHZlSW1hZ2VTbGlkZVNpemUoc2xpZGUsIHRoaXMubmF0dXJhbFdpZHRoLCB0aGlzLm5hdHVyYWxIZWlnaHQpO1xuXG5cdFx0XHRcdFx0XHRzZWxmLmFmdGVyTG9hZChzbGlkZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHNlbGYuaXNDbG9zaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHNsaWRlLm9wdHMuc3Jjc2V0KSB7XG5cdFx0XHRcdFx0XHRzaXplcyA9IHNsaWRlLm9wdHMuc2l6ZXM7XG5cblx0XHRcdFx0XHRcdGlmICghc2l6ZXMgfHwgc2l6ZXMgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHNpemVzID1cblx0XHRcdFx0XHRcdFx0XHQoc2xpZGUud2lkdGggLyBzbGlkZS5oZWlnaHQgPiAxICYmICRXLndpZHRoKCkgLyAkVy5oZWlnaHQoKSA+IDEgPyBcIjEwMFwiIDogTWF0aC5yb3VuZCgoc2xpZGUud2lkdGggLyBzbGlkZS5oZWlnaHQpICogMTAwKSkgK1xuXHRcdFx0XHRcdFx0XHRcdFwidndcIjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0JGltZy5hdHRyKFwic2l6ZXNcIiwgc2l6ZXMpLmF0dHIoXCJzcmNzZXRcIiwgc2xpZGUub3B0cy5zcmNzZXQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEhpZGUgdGVtcG9yYXJ5IGltYWdlIGFmdGVyIHNvbWUgZGVsYXlcblx0XHRcdFx0XHRpZiAoc2xpZGUuJGdob3N0KSB7XG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHNsaWRlLiRnaG9zdCAmJiAhc2VsZi5pc0Nsb3NpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRzbGlkZS4kZ2hvc3QuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCBNYXRoLm1pbigzMDAsIE1hdGgubWF4KDEwMDAsIHNsaWRlLmhlaWdodCAvIDE2MDApKSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VsZi5oaWRlTG9hZGluZyhzbGlkZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LWltYWdlXCIpXG5cdFx0XHRcdC5hdHRyKFwic3JjXCIsIHNsaWRlLnNyYylcblx0XHRcdFx0LmFwcGVuZFRvKHNsaWRlLiRjb250ZW50KTtcblxuXHRcdFx0aWYgKChpbWcuY29tcGxldGUgfHwgaW1nLnJlYWR5U3RhdGUgPT0gXCJjb21wbGV0ZVwiKSAmJiAkaW1nLm5hdHVyYWxXaWR0aCAmJiAkaW1nLm5hdHVyYWxIZWlnaHQpIHtcblx0XHRcdFx0JGltZy50cmlnZ2VyKFwibG9hZFwiKTtcblx0XHRcdH0gZWxzZSBpZiAoaW1nLmVycm9yKSB7XG5cdFx0XHRcdCRpbWcudHJpZ2dlcihcImVycm9yXCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDb21wdXRlcyB0aGUgc2xpZGUgc2l6ZSBmcm9tIGltYWdlIHNpemUgYW5kIG1heFdpZHRoL21heEhlaWdodFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRyZXNvbHZlSW1hZ2VTbGlkZVNpemU6IGZ1bmN0aW9uIChzbGlkZSwgaW1nV2lkdGgsIGltZ0hlaWdodCkge1xuXHRcdFx0dmFyIG1heFdpZHRoID0gcGFyc2VJbnQoc2xpZGUub3B0cy53aWR0aCwgMTApLFxuXHRcdFx0XHRtYXhIZWlnaHQgPSBwYXJzZUludChzbGlkZS5vcHRzLmhlaWdodCwgMTApO1xuXG5cdFx0XHQvLyBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBpbWFnZVxuXHRcdFx0c2xpZGUud2lkdGggPSBpbWdXaWR0aDtcblx0XHRcdHNsaWRlLmhlaWdodCA9IGltZ0hlaWdodDtcblxuXHRcdFx0aWYgKG1heFdpZHRoID4gMCkge1xuXHRcdFx0XHRzbGlkZS53aWR0aCA9IG1heFdpZHRoO1xuXHRcdFx0XHRzbGlkZS5oZWlnaHQgPSBNYXRoLmZsb29yKChtYXhXaWR0aCAqIGltZ0hlaWdodCkgLyBpbWdXaWR0aCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtYXhIZWlnaHQgPiAwKSB7XG5cdFx0XHRcdHNsaWRlLndpZHRoID0gTWF0aC5mbG9vcigobWF4SGVpZ2h0ICogaW1nV2lkdGgpIC8gaW1nSGVpZ2h0KTtcblx0XHRcdFx0c2xpZGUuaGVpZ2h0ID0gbWF4SGVpZ2h0O1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDcmVhdGUgaWZyYW1lIHdyYXBwZXIsIGlmcmFtZSBhbmQgYmluZGluZ3Ncblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHNldElmcmFtZTogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdG9wdHMgPSBzbGlkZS5vcHRzLmlmcmFtZSxcblx0XHRcdFx0JHNsaWRlID0gc2xpZGUuJHNsaWRlLFxuXHRcdFx0XHQkaWZyYW1lO1xuXG5cdFx0XHRzbGlkZS4kY29udGVudCA9ICQoJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1jb250ZW50JyArIChvcHRzLnByZWxvYWQgPyBcIiBmYW5jeWJveC1pcy1oaWRkZW5cIiA6IFwiXCIpICsgJ1wiPjwvZGl2PicpXG5cdFx0XHRcdC5jc3Mob3B0cy5jc3MpXG5cdFx0XHRcdC5hcHBlbmRUbygkc2xpZGUpO1xuXG5cdFx0XHQkc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tXCIgKyBzbGlkZS5jb250ZW50VHlwZSk7XG5cblx0XHRcdHNsaWRlLiRpZnJhbWUgPSAkaWZyYW1lID0gJChvcHRzLnRwb
6780C5yZXBsYWNlKC9cXHtybmRcXH0vZywgbmV3IERhdGUoKS5nZXRUaW1lKCkpKVxuXHRcdFx0XHQuYXR0cihvcHRzLmF0dHIpXG5cdFx0XHRcdC5hcHBlbmRUbyhzbGlkZS4kY29udGVudCk7XG5cblx0XHRcdGlmIChvcHRzLnByZWxvYWQpIHtcblx0XHRcdFx0c2VsZi5zaG93TG9hZGluZyhzbGlkZSk7XG5cblx0XHRcdFx0Ly8gVW5mb3J0dW5hdGVseSwgaXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYgaWZyYW1lIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWRcblx0XHRcdFx0Ly8gKGR1ZSB0byBicm93c2VyIHNlY3VyaXR5IHBvbGljeSlcblxuXHRcdFx0XHQkaWZyYW1lLm9uKFwibG9hZC5mYiBlcnJvci5mYlwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdHRoaXMuaXNSZWFkeSA9IDE7XG5cblx0XHRcdFx0XHRzbGlkZS4kc2xpZGUudHJpZ2dlcihcInJlZnJlc2hcIik7XG5cblx0XHRcdFx0XHRzZWxmLmFmdGVyTG9hZChzbGlkZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIFJlY2FsY3VsYXRlIGlmcmFtZSBjb250ZW50IHNpemVcblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHRcdCRzbGlkZS5vbihcInJlZnJlc2guZmJcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciAkY29udGVudCA9IHNsaWRlLiRjb250ZW50LFxuXHRcdFx0XHRcdFx0ZnJhbWVXaWR0aCA9IG9wdHMuY3NzLndpZHRoLFxuXHRcdFx0XHRcdFx0ZnJhbWVIZWlnaHQgPSBvcHRzLmNzcy5oZWlnaHQsXG5cdFx0XHRcdFx0XHQkY29udGVudHMsXG5cdFx0XHRcdFx0XHQkYm9keTtcblxuXHRcdFx0XHRcdGlmICgkaWZyYW1lWzBdLmlzUmVhZHkgIT09IDEpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0JGNvbnRlbnRzID0gJGlmcmFtZS5jb250ZW50cygpO1xuXHRcdFx0XHRcdFx0JGJvZHkgPSAkY29udGVudHMuZmluZChcImJvZHlcIik7XG5cdFx0XHRcdFx0fSBjYXRjaCAoaWdub3JlKSB7fVxuXG5cdFx0XHRcdFx0Ly8gQ2FsY3VsYXRlIGNvbnRlbnQgZGltZW5zaW9ucywgaWYgaXQgaXMgYWNjZXNzaWJsZVxuXHRcdFx0XHRcdGlmICgkYm9keSAmJiAkYm9keS5sZW5ndGggJiYgJGJvZHkuY2hpbGRyZW4oKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIEF2b2lkIHNjcm9sbGluZyB0byB0b3AgKGlmIG11bHRpcGxlIGluc3RhbmNlcylcblx0XHRcdFx0XHRcdCRzbGlkZS5jc3MoXCJvdmVyZmxvd1wiLCBcInZpc2libGVcIik7XG5cblx0XHRcdFx0XHRcdCRjb250ZW50LmNzcyh7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdFx0XCJtYXgtd2lkdGhcIjogXCIxMDAlXCIsXG5cdFx0XHRcdFx0XHRcdGhlaWdodDogXCI5OTk5cHhcIlxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdGlmIChmcmFtZVdpZHRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0ZnJhbWVXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heCgkYm9keVswXS5jbGllbnRXaWR0aCwgJGJvZHkub3V0ZXJXaWR0aCh0cnVlKSkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQkY29udGVudC5jc3MoXCJ3aWR0aFwiLCBmcmFtZVdpZHRoID8gZnJhbWVXaWR0aCA6IFwiXCIpLmNzcyhcIm1heC13aWR0aFwiLCBcIlwiKTtcblxuXHRcdFx0XHRcdFx0aWYgKGZyYW1lSGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0ZnJhbWVIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoJGJvZHlbMF0uY2xpZW50SGVpZ2h0LCAkYm9keS5vdXRlckhlaWdodCh0cnVlKSkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQkY29udGVudC5jc3MoXCJoZWlnaHRcIiwgZnJhbWVIZWlnaHQgPyBmcmFtZUhlaWdodCA6IFwiXCIpO1xuXG5cdFx0XHRcdFx0XHQkc2xpZGUuY3NzKFwib3ZlcmZsb3dcIiwgXCJhdXRvXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCRjb250ZW50LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtaXMtaGlkZGVuXCIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYWZ0ZXJMb2FkKHNsaWRlKTtcblx0XHRcdH1cblxuXHRcdFx0JGlmcmFtZS5hdHRyKFwic3JjXCIsIHNsaWRlLnNyYyk7XG5cblx0XHRcdC8vIFJlbW92ZSBpZnJhbWUgaWYgY2xvc2luZyBvciBjaGFuZ2luZyBnYWxsZXJ5IGl0ZW1cblx0XHRcdCRzbGlkZS5vbmUoXCJvblJlc2V0XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gVGhpcyBoZWxwcyBJRSBub3QgdG8gdGhyb3cgZXJyb3JzIHdoZW4gY2xvc2luZ1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdCQodGhpcylcblx0XHRcdFx0XHRcdC5maW5kKFwiaWZyYW1lXCIpXG5cdFx0XHRcdFx0XHQuaGlkZSgpXG5cdFx0XHRcdFx0XHQudW5iaW5kKClcblx0XHRcdFx0XHRcdC5hdHRyKFwic3JjXCIsIFwiLy9hYm91dDpibGFua1wiKTtcblx0XHRcdFx0fSBjYXRjaCAoaWdub3JlKSB7fVxuXG5cdFx0XHRcdCQodGhpcylcblx0XHRcdFx0XHQub2ZmKFwicmVmcmVzaC5mYlwiKVxuXHRcdFx0XHRcdC5lbXB0eSgpO1xuXG5cdFx0XHRcdHNsaWRlLmlzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdHNsaWRlLmlzUmV2ZWFsZWQgPSBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHQvLyBXcmFwIGFuZCBhcHBlbmQgY29udGVudCB0byB0aGUgc2xpZGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0c2V0Q29udGVudDogZnVuY3Rpb24gKHNsaWRlLCBjb250ZW50KSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuaGlkZUxvYWRpbmcoc2xpZGUpO1xuXG5cdFx0XHRpZiAoc2xpZGUuJGNvbnRlbnQpIHtcblx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKHNsaWRlLiRjb250ZW50KTtcblx0XHRcdH1cblxuXHRcdFx0c2xpZGUuJHNsaWRlLmVtcHR5KCk7XG5cblx0XHRcdC8vIElmIGNvbnRlbnQgaXMgYSBqUXVlcnkgb2JqZWN0LCB0aGVuIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIHNsaWRlLlxuXHRcdFx0Ly8gVGhlIHBsYWNlaG9sZG
6780VyIGlzIGNyZWF0ZWQgc28gd2Ugd2lsbCBrbm93IHdoZXJlIHRvIHB1dCBpdCBiYWNrLlxuXHRcdFx0aWYgKGlzUXVlcnkoY29udGVudCkgJiYgY29udGVudC5wYXJlbnQoKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gTWFrZSBzdXJlIGNvbnRlbnQgaXMgbm90IGFscmVhZHkgbW92ZWQgdG8gZmFuY3lCb3hcblx0XHRcdFx0aWYgKGNvbnRlbnQuaGFzQ2xhc3MoXCJmYW5jeWJveC1jb250ZW50XCIpIHx8IGNvbnRlbnQucGFyZW50KCkuaGFzQ2xhc3MoXCJmYW5jeWJveC1jb250ZW50XCIpKSB7XG5cdFx0XHRcdFx0Y29udGVudC5wYXJlbnRzKFwiLmZhbmN5Ym94LXNsaWRlXCIpLnRyaWdnZXIoXCJvblJlc2V0XCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRlbXBvcmFyeSBlbGVtZW50IG1hcmtpbmcgb3JpZ2luYWwgcGxhY2Ugb2YgdGhlIGNvbnRlbnRcblx0XHRcdFx0c2xpZGUuJHBsYWNlaG9sZGVyID0gJChcIjxkaXY+XCIpXG5cdFx0XHRcdFx0LmhpZGUoKVxuXHRcdFx0XHRcdC5pbnNlcnRBZnRlcihjb250ZW50KTtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgY29udGVudCBpcyB2aXNpYmxlXG5cdFx0XHRcdGNvbnRlbnQuY3NzKFwiZGlzcGxheVwiLCBcImlubGluZS1ibG9ja1wiKTtcblx0XHRcdH0gZWxzZSBpZiAoIXNsaWRlLmhhc0Vycm9yKSB7XG5cdFx0XHRcdC8vIElmIGNvbnRlbnQgaXMganVzdCBhIHBsYWluIHRleHQsIHRyeSB0byBjb252ZXJ0IGl0IHRvIGh0bWxcblx0XHRcdFx0aWYgKCQudHlwZShjb250ZW50KSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdGNvbnRlbnQgPSAkKFwiPGRpdj5cIilcblx0XHRcdFx0XHRcdC5hcHBlbmQoJC50cmltKGNvbnRlbnQpKVxuXHRcdFx0XHRcdFx0LmNvbnRlbnRzKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiBcImZpbHRlclwiIG9wdGlvbiBpcyBwcm92aWRlZCwgdGhlbiBmaWx0ZXIgY29udGVudFxuXHRcdFx0XHRpZiAoc2xpZGUub3B0cy5maWx0ZXIpIHtcblx0XHRcdFx0XHRjb250ZW50ID0gJChcIjxkaXY+XCIpXG5cdFx0XHRcdFx0XHQuaHRtbChjb250ZW50KVxuXHRcdFx0XHRcdFx0LmZpbmQoc2xpZGUub3B0cy5maWx0ZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHNsaWRlLiRzbGlkZS5vbmUoXCJvblJlc2V0XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gUGF1c2UgYWxsIGh0bWw1IHZpZGVvL2F1ZGlvXG5cdFx0XHRcdCQodGhpcylcblx0XHRcdFx0XHQuZmluZChcInZpZGVvLGF1ZGlvXCIpXG5cdFx0XHRcdFx0LnRyaWdnZXIoXCJwYXVzZVwiKTtcblxuXHRcdFx0XHQvLyBQdXQgY29udGVudCBiYWNrXG5cdFx0XHRcdGlmIChzbGlkZS4kcGxhY2Vob2xkZXIpIHtcblx0XHRcdFx0XHRzbGlkZS4kcGxhY2Vob2xkZXIuYWZ0ZXIoY29udGVudC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWNvbnRlbnRcIikuaGlkZSgpKS5yZW1vdmUoKTtcblxuXHRcdFx0XHRcdHNsaWRlLiRwbGFjZWhvbGRlciA9IG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZW1vdmUgY3VzdG9tIGNsb3NlIGJ1dHRvblxuXHRcdFx0XHRpZiAoc2xpZGUuJHNtYWxsQnRuKSB7XG5cdFx0XHRcdFx0c2xpZGUuJHNtYWxsQnRuLnJlbW92ZSgpO1xuXG5cdFx0XHRcdFx0c2xpZGUuJHNtYWxsQnRuID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlbW92ZSBjb250ZW50IGFuZCBtYXJrIHNsaWRlIGFzIG5vdCBsb2FkZWRcblx0XHRcdFx0aWYgKCFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHRcdCQodGhpcykuZW1wdHkoKTtcblxuXHRcdFx0XHRcdHNsaWRlLmlzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0c2xpZGUuaXNSZXZlYWxlZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0JChjb250ZW50KS5hcHBlbmRUbyhzbGlkZS4kc2xpZGUpO1xuXG5cdFx0XHRpZiAoJChjb250ZW50KS5pcyhcInZpZGVvLGF1ZGlvXCIpKSB7XG5cdFx0XHRcdCQoY29udGVudCkuYWRkQ2xhc3MoXCJmYW5jeWJveC12aWRlb1wiKTtcblxuXHRcdFx0XHQkKGNvbnRlbnQpLndyYXAoXCI8ZGl2PjwvZGl2PlwiKTtcblxuXHRcdFx0XHRzbGlkZS5jb250ZW50VHlwZSA9IFwidmlkZW9cIjtcblxuXHRcdFx0XHRzbGlkZS5vcHRzLndpZHRoID0gc2xpZGUub3B0cy53aWR0aCB8fCAkKGNvbnRlbnQpLmF0dHIoXCJ3aWR0aFwiKTtcblx0XHRcdFx0c2xpZGUub3B0cy5oZWlnaHQgPSBzbGlkZS5vcHRzLmhlaWdodCB8fCAkKGNvbnRlbnQpLmF0dHIoXCJoZWlnaHRcIik7XG5cdFx0XHR9XG5cblx0XHRcdHNsaWRlLiRjb250ZW50ID0gc2xpZGUuJHNsaWRlXG5cdFx0XHRcdC5jaGlsZHJlbigpXG5cdFx0XHRcdC5maWx0ZXIoXCJkaXYsZm9ybSxtYWluLHZpZGVvLGF1ZGlvLGFydGljbGUsLmZhbmN5Ym94LWNvbnRlbnRcIilcblx0XHRcdFx0LmZpcnN0KCk7XG5cblx0XHRcdHNsaWRlLiRjb250ZW50LnNpYmxpbmdzKCkuaGlkZSgpO1xuXG5cdFx0XHQvLyBSZS1jaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIGNvbnRlbnRcblx0XHRcdC8vIChpbiBzb21lIGNhc2VzLCBhamF4IHJlc3BvbnNlIGNhbiBjb250YWluIHZhcmlvdXMgZWxlbWVudHMgb3IgcGxhaW4gdGV4dClcblx0XHRcdGlmICghc2xpZGUuJGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHRcdHNsaWRlLiRjb250ZW50ID0gc2xpZGUuJHNsaWRlXG5cdFx0XHRcdFx0LndyYXBJbm5lcihcIjxkaXY+PC9kaXY+XCIpXG5cdFx0XHRcdFx0LmNoaWxkcmVuKClcblx0XHRcdFx0XHQuZmlyc3QoKTtcblx0XHRcdH1cblxuXHRcdFx0c2xpZGUuJGNvbnRlbnQuYWRkQ2xhc3MoXCJmYW5jeWJveC1jb250ZW50XCIpO1xuXG5cdFx0XHRzbGlkZS4kc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tXCIgKyBzbGlkZS5jb250ZW50VHlwZSk7XG5cblx0XHRcdHNlbGYuYWZ0ZXJMb2FkKHNsaWRlKTtcblx0XHR9LFxuXG5cdFx0Ly8gRGlzcGxheSBlcnJvciBtZXNzYWdlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRzZXRFcnJvcjogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHRzbGlkZS5oYXNFcnJvciA9IHRydWU7XG5cblx0XHRcdHNsaWRlLiRzbGlkZVxuXHRcdFx0XHQudHJpZ2dlcihcIm9uUmVzZXRcIilcblx0XHRcdFx0LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLVwiICsgc2xpZGUuY29udGVudFR5cGUpXG5cdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LXNsaWRlLS1lcnJvclwiKTtcblxuXHRcdFx0c2xpZGUuY29udGVudFR5cGUgPSBcImh0bWxcIjtcblxuXHRcdFx0dGhpcy5zZXRDb250ZW50KHNsaWRlLCB0aGlzLnRyYW5zbGF0ZShzbGlkZSwgc2xpZGUub3B0cy5lcnJvclRwbCkpO1xuXG5cdFx0XHRpZiAoc2xpZGUucG9zID09PSB0aGlzLmN1cnJQb3MpIHtcblx0XHRcdFx0dGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBTaG93IGxvYWRpbmcgaWNvbiBpbnNpZGUgdGhlIHNsaWRlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0c2hvd0xvYWRpbmc6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHRzbGlkZSA9IHNsaWRlIHx8IHNlbGYuY3VycmVudDtcblxuXHRcdFx0aWYgKHNsaWRlICYmICFzbGlkZS4kc3Bpbm5lcikge1xuXHRcdFx0XHRzbGlkZS4kc3Bpbm5lciA9ICQoc2VsZi50cmFuc2xhdGUoc2VsZiwgc2VsZi5vcHRzLnNwaW5uZXJUcGwpKVxuXHRcdFx0XHRcdC5hcHBlbmRUbyhzbGlkZS4kc2xpZGUpXG5cdFx0XHRcdFx0LmhpZGUoKVxuXHRcdFx0XHRcdC5mYWRlSW4oXCJmYXN0XCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBSZW1vdmUgbG9hZGluZyBpY29uIGZyb20gdGhlIHNsaWRlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aGlkZUxvYWRpbmc6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHRzbGlkZSA9IHNsaWRlIHx8IHNlbGYuY3VycmVudDtcblxuXHRcdFx0aWYgKHNsaWRlICYmIHNsaWRlLiRzcGlubmVyKSB7XG5cdFx0XHRcdHNsaWRlLiRzcGlubmVyLnN0b3AoKS5yZW1vdmUoKTtcblxuXHRcdFx0XHRkZWxldGUgc2xpZGUuJHNwaW5uZXI7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFkanVzdG1lbnRzIGFmdGVyIHNsaWRlIGNvbnRlbnQgaGFzIGJlZW4gbG9hZGVkXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGFmdGVyTG9hZDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHNsaWRlLmlzTG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0c2xpZGUuaXNMb2FkZWQgPSB0cnVlO1xuXG5cdFx0XHRzZWxmLnRyaWdnZXIoXCJhZnRlckxvYWRcIiwgc2xpZGUpO1xuXG5cdFx0XHRzZWxmLmhpZGVMb2FkaW5nKHNsaWRlKTtcblxuXHRcdFx0Ly8gQWRkIHNtYWxsIGNsb3NlIGJ1dHRvblxuXHRcdFx0aWYgKHNsaWRlLm9wdHMuc21hbGxCdG4gJiYgKCFzbGlkZS4kc21hbGxCdG4gfHwgIXNsaWRlLiRzbWFsbEJ0bi5sZW5ndGgpKSB7XG5cdFx0XHRcdHNsaWRlLiRzbWFsbEJ0biA9ICQoc2VsZi50cmFuc2xhdGUoc2xpZGUsIHNsaWRlLm9wdHMuYnRuVHBsLnNtYWxsQnRuKSkuYXBwZW5kVG8oc2xpZGUuJGNvbnRlbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEaXNhYmxlIHJpZ2h0IGNsaWNrXG5cdFx0XHRpZiAoc2xpZGUub3B0cy5wcm90ZWN0ICYmIHNsaWRlLiRjb250ZW50ICYmICFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHRzbGlkZS4kY29udGVudC5vbihcImNvbnRleHRtZW51LmZiXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0aWYgKGUuYnV0dG9uID09IDIpIHtcblx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIGZha2UgZWxlbWVudCBvbiB0b3Agb2YgdGhlIGltYWdlXG5cdFx0XHRcdC8vIFRoaXMgbWFrZXMgYSBiaXQgaGFyZGVyIGZvciB1c2VyIHRvIHNlbGVjdCBpbWFnZVxuXHRcdFx0XHRpZiAoc2xpZGUudHlwZSA9PT0gXCJpbWFnZVwiKSB7XG5cdFx0XHRcdFx0JCgnPGRpdiBjbGFzcz1cImZhbmN5Ym94LXNwYWNlYmFsbFwiPjwvZGl2PicpLmFwcGVuZFRvKHNsaWRlLiRjb250ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmFkanVzdENhcHRpb24oc2xpZGUpO1xuXG5cdFx0XHRzZWxmLmFkanVzdExheW91dChzbGlkZSk7XG5cblx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRzZWxmLnVwZGF0ZUN1cnNvcigpO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnJldmVhbENvbnRlbnQoc2xpZGUpO1xuXHRcdH0sXG5cblx0XHQvLyBQcmV2ZW50IGNhcHRpb24gb3ZlcmxhcCxcblx0XHQvLyBmaXggY3NzIGluY29uc2lzdGVuY3kgYW
6780Nyb3NzIGJyb3dzZXJzXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0YWRqdXN0Q2FwdGlvbjogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzbGlkZSB8fCBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdGNhcHRpb24gPSBjdXJyZW50Lm9wdHMuY2FwdGlvbixcblx0XHRcdFx0cHJldmVudE92ZXJsYXAgPSBjdXJyZW50Lm9wdHMucHJldmVudENhcHRpb25PdmVybGFwLFxuXHRcdFx0XHQkY2FwdGlvbiA9IHNlbGYuJHJlZnMuY2FwdGlvbixcblx0XHRcdFx0JGNsb25lLFxuXHRcdFx0XHRjYXB0aW9uSCA9IGZhbHNlO1xuXG5cdFx0XHQkY2FwdGlvbi50b2dnbGVDbGFzcyhcImZhbmN5Ym94LWNhcHRpb24tLXNlcGFyYXRlXCIsIHByZXZlbnRPdmVybGFwKTtcblxuXHRcdFx0aWYgKHByZXZlbnRPdmVybGFwICYmIGNhcHRpb24gJiYgY2FwdGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0aWYgKGN1cnJlbnQucG9zICE9PSBzZWxmLmN1cnJQb3MpIHtcblx0XHRcdFx0XHQkY2xvbmUgPSAkY2FwdGlvbi5jbG9uZSgpLmFwcGVuZFRvKCRjYXB0aW9uLnBhcmVudCgpKTtcblxuXHRcdFx0XHRcdCRjbG9uZVxuXHRcdFx0XHRcdFx0LmNoaWxkcmVuKClcblx0XHRcdFx0XHRcdC5lcSgwKVxuXHRcdFx0XHRcdFx0LmVtcHR5KClcblx0XHRcdFx0XHRcdC5odG1sKGNhcHRpb24pO1xuXG5cdFx0XHRcdFx0Y2FwdGlvbkggPSAkY2xvbmUub3V0ZXJIZWlnaHQodHJ1ZSk7XG5cblx0XHRcdFx0XHQkY2xvbmUuZW1wdHkoKS5yZW1vdmUoKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzZWxmLiRjYXB0aW9uKSB7XG5cdFx0XHRcdFx0Y2FwdGlvbkggPSBzZWxmLiRjYXB0aW9uLm91dGVySGVpZ2h0KHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudC4kc2xpZGUuY3NzKFwicGFkZGluZy1ib3R0b21cIiwgY2FwdGlvbkggfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFNpbXBsZSBoYWNrIHRvIGZpeCBpbmNvbnNpc3RlbmN5IGFjcm9zcyBicm93c2VycywgZGVzY3JpYmVkIGhlcmUgKGFmZmVjdHMgRWRnZSwgdG9vKTpcblx0XHQvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03NDg1MThcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGFkanVzdExheW91dDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzbGlkZSB8fCBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdHNjcm9sbEhlaWdodCxcblx0XHRcdFx0bWFyZ2luQm90dG9tLFxuXHRcdFx0XHRpbmxpbmVQYWRkaW5nLFxuXHRcdFx0XHRhY3R1YWxQYWRkaW5nO1xuXG5cdFx0XHRpZiAoY3VycmVudC5pc0xvYWRlZCAmJiBjdXJyZW50Lm9wdHMuZGlzYWJsZUxheW91dEZpeCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRjdXJyZW50LiRjb250ZW50LmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgXCJcIik7XG5cblx0XHRcdFx0Ly8gSWYgd2Ugd291bGQgYWx3YXlzIHNldCBtYXJnaW4tYm90dG9tIGZvciB0aGUgY29udGVudCxcblx0XHRcdFx0Ly8gdGhlbiBpdCB3b3VsZCBwb3RlbnRpYWxseSBicmVhayB2ZXJ0aWNhbCBhbGlnblxuXHRcdFx0XHRpZiAoY3VycmVudC4kY29udGVudC5vdXRlckhlaWdodCgpID4gY3VycmVudC4kc2xpZGUuaGVpZ2h0KCkgKyAwLjUpIHtcblx0XHRcdFx0XHRpbmxpbmVQYWRkaW5nID0gY3VycmVudC4kc2xpZGVbMF0uc3R5bGVbXCJwYWRkaW5nLWJvdHRvbVwiXTtcblx0XHRcdFx0XHRhY3R1YWxQYWRkaW5nID0gY3VycmVudC4kc2xpZGUuY3NzKFwicGFkZGluZy1ib3R0b21cIik7XG5cblx0XHRcdFx0XHRpZiAocGFyc2VGbG9hdChhY3R1YWxQYWRkaW5nKSA+IDApIHtcblx0XHRcdFx0XHRcdHNjcm9sbEhlaWdodCA9IGN1cnJlbnQuJHNsaWRlWzBdLnNjcm9sbEhlaWdodDtcblxuXHRcdFx0XHRcdFx0Y3VycmVudC4kc2xpZGUuY3NzKFwicGFkZGluZy1ib3R0b21cIiwgMCk7XG5cblx0XHRcdFx0XHRcdGlmIChNYXRoLmFicyhzY3JvbGxIZWlnaHQgLSBjdXJyZW50LiRzbGlkZVswXS5zY3JvbGxIZWlnaHQpIDwgMSkge1xuXHRcdFx0XHRcdFx0XHRtYXJnaW5Cb3R0b20gPSBhY3R1YWxQYWRkaW5nO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjdXJyZW50LiRzbGlkZS5jc3MoXCJwYWRkaW5nLWJvdHRvbVwiLCBpbmxpbmVQYWRkaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50LiRjb250ZW50LmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgbWFyZ2luQm90dG9tKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gTWFrZSBjb250ZW50IHZpc2libGVcblx0XHQvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgY29udGVudCBoYXMgYmVlbiBsb2FkZWQgb3Jcblx0XHQvLyB1c2VyIG5hdmlnYXRlcyBnYWxsZXJ5IGFuZCB0cmFuc2l0aW9uIHNob3VsZCBzdGFydFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0cmV2ZWFsQ29udGVudDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRzbGlkZSA9IHNsaWRlLiRzbGlkZSxcblx0XHRcdFx0ZW5kID0gZmFsc2UsXG5cdFx0XHRcdHN0YXJ0ID0gZmFsc2UsXG5cdFx0XHRcdGlzTW92ZWQgPSBzZWxmLmlzTW92ZWQoc2xpZGUpLFxuXHRcdFx0XHRpc1JldmVhbGVkID0gc2xpZGUuaXNSZXZlYWxlZCxcblx0XHRcdFx0ZWZmZWN0LFxuXHRcdFx0XHRlZmZlY3RDbGFzc05hbWUsXG5cdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHRvcGFjaXR5O1xuXG5cdFx0XHRzbGlkZS5pc1JldmVhbGVkID0gdHJ1ZTtcblxuXHRcdFx0ZWZmZWN0ID0gc2xpZGUub3B0c1tzZWxmLmZpcnN0UnVuID8gXCJhbmltYXRpb25FZmZlY3RcIiA6IFwidHJhbnNpdGlvbkVmZmVjdFwiXTtcblx0XHRcdGR1cmF0aW9uID0gc2xpZGUub3B0c1tzZWxmLmZpcnN0UnVuID8gXCJhbmltYXRpb25EdXJhdGlvblwiIDogXCJ0cmFuc2l0aW9uRHVyYXRpb25cIl07XG5cblx0XHRcdGR1cmF0aW9uID0gcGFyc2VJbnQoc2xpZGUuZm9yY2VkRHVyYXRpb24gPT09IHVuZGVmaW5lZCA/IGR1cmF0aW9uIDogc2xpZGUuZm9yY2VkRHVyYXRpb24sIDEwKTtcblxuXHRcdFx0aWYgKGlzTW92ZWQgfHwgc2xpZGUucG9zICE9PSBzZWxmLmN1cnJQb3MgfHwgIWR1cmF0aW9uKSB7XG5cdFx0XHRcdGVmZmVjdCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiBjYW4gem9vbVxuXHRcdFx0aWYgKGVmZmVjdCA9PT0gXCJ6b29tXCIpIHtcblx0XHRcdFx0aWYgKHNsaWRlLnBvcyA9PT0gc2VsZi5jdXJyUG9zICYmIGR1cmF0aW9uICYmIHNsaWRlLnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAhc2xpZGUuaGFzRXJyb3IgJiYgKHN0YXJ0ID0gc2VsZi5nZXRUaHVtYlBvcyhzbGlkZSkpKSB7XG5cdFx0XHRcdFx0ZW5kID0gc2VsZi5nZXRGaXRQb3Moc2xpZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVmZmVjdCA9IFwiZmFkZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFpvb20gYW5pbWF0aW9uXG5cdFx0XHQvLyA9PT09PT09PT09PT09PVxuXHRcdFx0aWYgKGVmZmVjdCA9PT0gXCJ6b29tXCIpIHtcblx0XHRcdFx0c2VsZi5pc0FuaW1hdGluZyA9IHRydWU7XG5cblx0XHRcdFx0ZW5kLnNjYWxlWCA9IGVuZC53aWR0aCAvIHN0YXJ0LndpZHRoO1xuXHRcdFx0XHRlbmQuc2NhbGVZID0gZW5kLmhlaWdodCAvIHN0YXJ0LmhlaWdodDtcblxuXHRcdFx0XHQvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGFuaW1hdGUgb3BhY2l0eVxuXHRcdFx0XHRvcGFjaXR5ID0gc2xpZGUub3B0cy56b29tT3BhY2l0eTtcblxuXHRcdFx0XHRpZiAob3BhY2l0eSA9PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9wYWNpdHkgPSBNYXRoLmFicyhzbGlkZS53aWR0aCAvIHNsaWRlLmhlaWdodCAtIHN0YXJ0LndpZHRoIC8gc3RhcnQuaGVpZ2h0KSA+IDAuMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvcGFjaXR5KSB7XG5cdFx0XHRcdFx0c3RhcnQub3BhY2l0eSA9IDAuMTtcblx0XHRcdFx0XHRlbmQub3BhY2l0eSA9IDE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBEcmF3IGltYWdlIGF0IHN0YXJ0IHBvc2l0aW9uXG5cdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKHNsaWRlLiRjb250ZW50LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtaXMtaGlkZGVuXCIpLCBzdGFydCk7XG5cblx0XHRcdFx0Zm9yY2VSZWRyYXcoc2xpZGUuJGNvbnRlbnQpO1xuXG5cdFx0XHRcdC8vIFN0YXJ0IGFuaW1hdGlvblxuXHRcdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoc2xpZGUuJGNvbnRlbnQsIGVuZCwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzZWxmLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0XHRzZWxmLmNvbXBsZXRlKCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0c2VsZi51cGRhdGVTbGlkZShzbGlkZSk7XG5cblx0XHRcdC8vIFNpbXBseSBzaG93IGNvbnRlbnQgaWYgbm8gZWZmZWN0XG5cdFx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFx0aWYgKCFlZmZlY3QpIHtcblx0XHRcdFx0c2xpZGUuJGNvbnRlbnQucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1pcy1oaWRkZW5cIik7XG5cblx0XHRcdFx0aWYgKCFpc1JldmVhbGVkICYmIGlzTW92ZWQgJiYgc2xpZGUudHlwZSA9PT0gXCJpbWFnZVwiICYmICFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHRcdHNsaWRlLiRjb250ZW50LmhpZGUoKS5mYWRlSW4oXCJmYXN0XCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNsaWRlLnBvcyA9PT0gc2VsZi5jdXJyUG9zKSB7XG5cdFx0XHRcdFx0c2VsZi5jb21wbGV0ZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQcmVwYXJlIGZvciBDU1MgdHJhbnNpdG9uXG5cdFx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0XHQkLmZhbmN5Ym94LnN0b3AoJHNsaWRlKTtcblxuXHRcdFx0Ly9lZmZlY3RDbGFzc05hbWUgPSBcImZhbmN5Ym94LWFuaW1hdGVkIGZhbmN5Ym94LXNsaWRlLS1cIiArIChzbGlkZS5wb3MgPj0gc2VsZi5wcmV2UG9zID8gXCJuZXh0XCIgOiBcInByZX
6780Zpb3VzXCIpICsgXCIgZmFuY3lib3gtZngtXCIgKyBlZmZlY3Q7XG5cdFx0XHRlZmZlY3RDbGFzc05hbWUgPSBcImZhbmN5Ym94LXNsaWRlLS1cIiArIChzbGlkZS5wb3MgPj0gc2VsZi5wcmV2UG9zID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCIpICsgXCIgZmFuY3lib3gtYW5pbWF0ZWQgZmFuY3lib3gtZngtXCIgKyBlZmZlY3Q7XG5cblx0XHRcdCRzbGlkZS5hZGRDbGFzcyhlZmZlY3RDbGFzc05hbWUpLnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWN1cnJlbnRcIik7IC8vLmFkZENsYXNzKGVmZmVjdENsYXNzTmFtZSk7XG5cblx0XHRcdHNsaWRlLiRjb250ZW50LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtaXMtaGlkZGVuXCIpO1xuXG5cdFx0XHQvLyBGb3JjZSByZWZsb3dcblx0XHRcdGZvcmNlUmVkcmF3KCRzbGlkZSk7XG5cblx0XHRcdGlmIChzbGlkZS50eXBlICE9PSBcImltYWdlXCIpIHtcblx0XHRcdFx0c2xpZGUuJGNvbnRlbnQuaGlkZSgpLnNob3coMCk7XG5cdFx0XHR9XG5cblx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShcblx0XHRcdFx0JHNsaWRlLFxuXHRcdFx0XHRcImZhbmN5Ym94LXNsaWRlLS1jdXJyZW50XCIsXG5cdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JHNsaWRlLnJlbW92ZUNsYXNzKGVmZmVjdENsYXNzTmFtZSkuY3NzKHtcblx0XHRcdFx0XHRcdHRyYW5zZm9ybTogXCJcIixcblx0XHRcdFx0XHRcdG9wYWNpdHk6IFwiXCJcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRcdFx0c2VsZi5jb21wbGV0ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KTtcblx0XHR9LFxuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UgY2FuIGFuZCBoYXZlIHRvIHpvb20gZnJvbSB0aHVtYm5haWxcblx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0Z2V0VGh1bWJQb3M6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHJleiA9IGZhbHNlLFxuXHRcdFx0XHQkdGh1bWIgPSBzbGlkZS4kdGh1bWIsXG5cdFx0XHRcdHRodW1iUG9zLFxuXHRcdFx0XHRidHcsXG5cdFx0XHRcdGJydyxcblx0XHRcdFx0YmJ3LFxuXHRcdFx0XHRibHc7XG5cblx0XHRcdGlmICghJHRodW1iIHx8ICFpblZpZXdwb3J0KCR0aHVtYlswXSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHVtYlBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKCR0aHVtYik7XG5cblx0XHRcdGJ0dyA9IHBhcnNlRmxvYXQoJHRodW1iLmNzcyhcImJvcmRlci10b3Atd2lkdGhcIikgfHwgMCk7XG5cdFx0XHRicncgPSBwYXJzZUZsb2F0KCR0aHVtYi5jc3MoXCJib3JkZXItcmlnaHQtd2lkdGhcIikgfHwgMCk7XG5cdFx0XHRiYncgPSBwYXJzZUZsb2F0KCR0aHVtYi5jc3MoXCJib3JkZXItYm90dG9tLXdpZHRoXCIpIHx8IDApO1xuXHRcdFx0Ymx3ID0gcGFyc2VGbG9hdCgkdGh1bWIuY3NzKFwiYm9yZGVyLWxlZnQtd2lkdGhcIikgfHwgMCk7XG5cblx0XHRcdHJleiA9IHtcblx0XHRcdFx0dG9wOiB0aHVtYlBvcy50b3AgKyBidHcsXG5cdFx0XHRcdGxlZnQ6IHRodW1iUG9zLmxlZnQgKyBibHcsXG5cdFx0XHRcdHdpZHRoOiB0aHVtYlBvcy53aWR0aCAtIGJydyAtIGJsdyxcblx0XHRcdFx0aGVpZ2h0OiB0aHVtYlBvcy5oZWlnaHQgLSBidHcgLSBiYncsXG5cdFx0XHRcdHNjYWxlWDogMSxcblx0XHRcdFx0c2NhbGVZOiAxXG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gdGh1bWJQb3Mud2lkdGggPiAwICYmIHRodW1iUG9zLmhlaWdodCA+IDAgPyByZXogOiBmYWxzZTtcblx0XHR9LFxuXG5cdFx0Ly8gRmluYWwgYWRqdXN0bWVudHMgYWZ0ZXIgY3VycmVudCBnYWxsZXJ5IGl0ZW0gaXMgbW92ZWQgdG8gcG9zaXRpb25cblx0XHQvLyBhbmQgaXRgcyBjb250ZW50IGlzIGxvYWRlZFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0Y29tcGxldGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Y3VycmVudCA9IHNlbGYuY3VycmVudCxcblx0XHRcdFx0c2xpZGVzID0ge30sXG5cdFx0XHRcdCRlbDtcblxuXHRcdFx0aWYgKHNlbGYuaXNNb3ZlZCgpIHx8ICFjdXJyZW50LmlzTG9hZGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFjdXJyZW50LmlzQ29tcGxldGUpIHtcblx0XHRcdFx0Y3VycmVudC5pc0NvbXBsZXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRjdXJyZW50LiRzbGlkZS5zaWJsaW5ncygpLnRyaWdnZXIoXCJvblJlc2V0XCIpO1xuXG5cdFx0XHRcdHNlbGYucHJlbG9hZChcImlubGluZVwiKTtcblxuXHRcdFx0XHQvLyBUcmlnZ2VyIGFueSBDU1MgdHJhbnNpdG9uIGluc2lkZSB0aGUgc2xpZGVcblx0XHRcdFx0Zm9yY2VSZWRyYXcoY3VycmVudC4kc2xpZGUpO1xuXG5cdFx0XHRcdGN1cnJlbnQuJHNsaWRlLmFkZENsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWNvbXBsZXRlXCIpO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSB1bm5lY2Vzc2FyeSBzbGlkZXNcblx0XHRcdFx0JC5lYWNoKHNlbGYuc2xpZGVzLCBmdW5jdGlvbiAoa2V5LCBzbGlkZSkge1xuXHRcdFx0XHRcdGlmIChzbGlkZS5wb3MgPj0gc2VsZi5jdXJyUG9zIC0gMSAmJiBzbGlkZS5wb3MgPD0gc2VsZi5jdXJyUG9zICsgMSkge1xuXHRcdFx0XHRcdFx0c2xpZGVzW3NsaWRlLnBvc10gPSBzbGlkZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNsaWRlKSB7XG5cdFx0XHRcdFx0XHQkLmZhbmN5Ym94LnN0b3Aoc2xpZGUuJHNsaWRlKTtcblxuXHRcdFx0XHRcdFx0c2xpZGUuJHNsaWRlLm9mZigpLnJlbW92ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi5zbGlkZXMgPSBzbGlkZXM7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHRcdFx0c2VsZi51cGRhdGVDdXJzb3IoKTtcblxuXHRcdFx0c2VsZi50cmlnZ2VyKFwiYWZ0ZXJTaG93XCIpO1xuXG5cdFx0XHQvLyBBdXRvcGxheSBmaXJzdCBodG1sNSB2aWRlby9hdWRpb1xuXHRcdFx0aWYgKCEhY3VycmVudC5vcHRzLnZpZGVvLmF1dG9TdGFydCkge1xuXHRcdFx0XHRjdXJyZW50LiRzbGlkZVxuXHRcdFx0XHRcdC5maW5kKFwidmlkZW8sYXVkaW9cIilcblx0XHRcdFx0XHQuZmlsdGVyKFwiOnZpc2libGU6Zmlyc3RcIilcblx0XHRcdFx0XHQudHJpZ2dlcihcInBsYXlcIilcblx0XHRcdFx0XHQub25lKFwiZW5kZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKERvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XG5cdFx0XHRcdFx0XHRcdERvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcblx0XHRcdFx0XHRcdFx0dGhpcy53ZWJraXRFeGl0
6780RnVsbHNjcmVlbigpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzZWxmLm5leHQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJ5IHRvIGZvY3VzIG9uIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudFxuXHRcdFx0aWYgKGN1cnJlbnQub3B0cy5hdXRvRm9jdXMgJiYgY3VycmVudC5jb250ZW50VHlwZSA9PT0gXCJodG1sXCIpIHtcblx0XHRcdFx0Ly8gTG9vayBmb3IgdGhlIGZpcnN0IGlucHV0IHdpdGggYXV0b2ZvY3VzIGF0dHJpYnV0ZVxuXHRcdFx0XHQkZWwgPSBjdXJyZW50LiRjb250ZW50LmZpbmQoXCJpbnB1dFthdXRvZm9jdXNdOmVuYWJsZWQ6dmlzaWJsZTpmaXJzdFwiKTtcblxuXHRcdFx0XHRpZiAoJGVsLmxlbmd0aCkge1xuXHRcdFx0XHRcdCRlbC50cmlnZ2VyKFwiZm9jdXNcIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2VsZi5mb2N1cyhudWxsLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdm9pZCBqdW1waW5nXG5cdFx0XHRjdXJyZW50LiRzbGlkZS5zY3JvbGxUb3AoMCkuc2Nyb2xsTGVmdCgwKTtcblx0XHR9LFxuXG5cdFx0Ly8gUHJlbG9hZCBuZXh0IGFuZCBwcmV2aW91cyBzbGlkZXNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0cHJlbG9hZDogZnVuY3Rpb24gKHR5cGUpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0cHJldixcblx0XHRcdFx0bmV4dDtcblxuXHRcdFx0aWYgKHNlbGYuZ3JvdXAubGVuZ3RoIDwgMikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdG5leHQgPSBzZWxmLnNsaWRlc1tzZWxmLmN1cnJQb3MgKyAxXTtcblx0XHRcdHByZXYgPSBzZWxmLnNsaWRlc1tzZWxmLmN1cnJQb3MgLSAxXTtcblxuXHRcdFx0aWYgKHByZXYgJiYgcHJldi50eXBlID09PSB0eXBlKSB7XG5cdFx0XHRcdHNlbGYubG9hZFNsaWRlKHByZXYpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV4dCAmJiBuZXh0LnR5cGUgPT09IHR5cGUpIHtcblx0XHRcdFx0c2VsZi5sb2FkU2xpZGUobmV4dCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFRyeSB0byBmaW5kIGFuZCBmb2N1cyBvbiB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnRcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRmb2N1czogZnVuY3Rpb24gKGUsIGZpcnN0UnVuKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGZvY3VzYWJsZVN0ciA9IFtcblx0XHRcdFx0XHRcImFbaHJlZl1cIixcblx0XHRcdFx0XHRcImFyZWFbaHJlZl1cIixcblx0XHRcdFx0XHQnaW5wdXQ6bm90KFtkaXNhYmxlZF0pOm5vdChbdHlwZT1cImhpZGRlblwiXSk6bm90KFthcmlhLWhpZGRlbl0pJyxcblx0XHRcdFx0XHRcInNlbGVjdDpub3QoW2Rpc2FibGVkXSk6bm90KFthcmlhLWhpZGRlbl0pXCIsXG5cdFx0XHRcdFx0XCJ0ZXh0YXJlYTpub3QoW2Rpc2FibGVkXSk6bm90KFthcmlhLWhpZGRlbl0pXCIsXG5cdFx0XHRcdFx0XCJidXR0b246bm90KFtkaXNhYmxlZF0pOm5vdChbYXJpYS1oaWRkZW5dKVwiLFxuXHRcdFx0XHRcdFwiaWZyYW1lXCIsXG5cdFx0XHRcdFx0XCJvYmplY3RcIixcblx0XHRcdFx0XHRcImVtYmVkXCIsXG5cdFx0XHRcdFx0XCJ2aWRlb1wiLFxuXHRcdFx0XHRcdFwiYXVkaW9cIixcblx0XHRcdFx0XHRcIltjb250ZW50ZWRpdGFibGVdXCIsXG5cdFx0XHRcdFx0J1t0YWJpbmRleF06bm90KFt0YWJpbmRleF49XCItXCJdKSdcblx0XHRcdFx0XS5qb2luKFwiLFwiKSxcblx0XHRcdFx0Zm9jdXNhYmxlSXRlbXMsXG5cdFx0XHRcdGZvY3VzZWRJdGVtSW5kZXg7XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlIHx8ICFzZWxmLmN1cnJlbnQgfHwgIXNlbGYuY3VycmVudC5pc0NvbXBsZXRlKSB7XG5cdFx0XHRcdC8vIEZvY3VzIG9uIGFueSBlbGVtZW50IGluc2lkZSBmYW5jeWJveFxuXHRcdFx0XHRmb2N1c2FibGVJdGVtcyA9IHNlbGYuJHJlZnMuY29udGFpbmVyLmZpbmQoXCIqOnZpc2libGVcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBGb2N1cyBpbnNpZGUgY3VycmVudCBzbGlkZVxuXHRcdFx0XHRmb2N1c2FibGVJdGVtcyA9IHNlbGYuY3VycmVudC4kc2xpZGUuZmluZChcIio6dmlzaWJsZVwiICsgKGZpcnN0UnVuID8gXCI6bm90KC5mYW5jeWJveC1jbG9zZS1zbWFsbClcIiA6IFwiXCIpKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9jdXNhYmxlSXRlbXMgPSBmb2N1c2FibGVJdGVtcy5maWx0ZXIoZm9jdXNhYmxlU3RyKS5maWx0ZXIoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gJCh0aGlzKS5jc3MoXCJ2aXNpYmlsaXR5XCIpICE9PSBcImhpZGRlblwiICYmICEkKHRoaXMpLmhhc0NsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGZvY3VzYWJsZUl0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHRmb2N1c2VkSXRlbUluZGV4ID0gZm9jdXNhYmxlSXRlbXMuaW5kZXgoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG5cblx0XHRcdFx0aWYgKGUgJiYgZS5zaGlmdEtleSkge1xuXHRcdFx0XHRcdC8vIEJhY2sgdGFiXG5cdFx0XHRcdFx0aWYgKGZvY3VzZWRJdGVtSW5kZXggPCAwIHx8IGZvY3VzZWRJdGVtSW5kZXggPT0gMCkge1xuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0XHRmb2N1c2FibGVJdGVtcy5lcShmb2N1c2FibGVJdGVtcy5sZW5ndGggLSAxKS50cmlnZ2VyKFwiZm9jdXNcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE91dHNpZGUgb3IgRm9yd2FyZCB0YWJcblx0XHRcdFx0XHRpZiAoZm9jdXNlZEl0ZW1JbmRleCA8IDAgfHwgZm9jdXNlZEl0ZW1JbmRleCA9PSBmb2N1c2FibGVJdGVtcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRpZiAoZSkge1xuXHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGZvY3VzYWJsZUl0ZW1zLmVxKDApLnRyaWdnZXIoXCJmb2N1c1wiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuJHJlZnMuY29udGFpbmVyLnRyaWdnZXIoXCJmb2N1c1wiKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0aXZhdGVzIGN1cnJlbnQgaW5zdGFuY2UgLSBicmluZ3MgY29udGFpbmVyIHRvIHRoZSBmcm9udCBhbmQgZW5hYmxlcyBrZXlib2FyZCxcblx0XHQvLyBub3RpZmllcyBvdGhlciBpbnN0YW5jZXMgYWJvdXQgZGVhY3RpdmF0aW5nXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRhY3RpdmF0ZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHQvLyBEZWFjdGl2YXRlIGFsbCBpbnN0YW5jZXNcblx0XHRcdCQoXCIuZmFuY3lib3gtY29udGFpbmVyXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgaW5zdGFuY2UgPSAkKHRoaXMpLmRhdGEoXCJGYW5jeUJveFwiKTtcblxuXHRcdFx0XHQvLyBTa2lwIHNlbGYgYW5kIGNsb3NpbmcgaW5zdGFuY2VzXG5cdFx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5pZCAhPT0gc2VsZi5pZCAmJiAhaW5zdGFuY2UuaXNDbG9zaW5nKSB7XG5cdFx0XHRcdFx0aW5zdGFuY2UudHJpZ2dlcihcIm9uRGVhY3RpdmF0ZVwiKTtcblxuXHRcdFx0XHRcdGluc3RhbmNlLnJlbW92ZUV2ZW50cygpO1xuXG5cdFx0XHRcdFx0aW5zdGFuY2UuaXNWaXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRzZWxmLmlzVmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdGlmIChzZWxmLmN1cnJlbnQgfHwgc2VsZi5pc0lkbGUpIHtcblx0XHRcdFx0c2VsZi51cGRhdGUoKTtcblxuXHRcdFx0XHRzZWxmLnVwZGF0ZUNvbnRyb2xzKCk7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYudHJpZ2dlcihcIm9uQWN0aXZhdGVcIik7XG5cblx0XHRcdHNlbGYuYWRkRXZlbnRzKCk7XG5cdFx0fSxcblxuXHRcdC8vIFN0YXJ0IGNsb3NpbmcgcHJvY2VkdXJlXG5cdFx0Ly8gVGhpcyB3aWxsIHN0YXJ0IFwiem9vbS1vdXRcIiBhbmltYXRpb24gaWYgbmVlZGVkIGFuZCBjbGVhbiBldmVyeXRoaW5nIHVwIGFmdGVyd2FyZHNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNsb3NlOiBmdW5jdGlvbiAoZSwgZCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRlZmZlY3QsXG5cdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHQkY29udGVudCxcblx0XHRcdFx0ZG9tUmVjdCxcblx0XHRcdFx0b3BhY2l0eSxcblx0XHRcdFx0c3RhcnQsXG5cdFx0XHRcdGVuZDtcblxuXHRcdFx0dmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuY2xlYW5VcChlKTtcblx0XHRcdH07XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuaXNDbG9zaW5nID0gdHJ1ZTtcblxuXHRcdFx0Ly8gSWYgYmVmb3JlQ2xvc2UgY2FsbGJhY2sgcHJldmVudHMgY2xvc2luZywgbWFrZSBzdXJlIGNvbnRlbnQgaXMgY2VudGVyZWRcblx0XHRcdGlmIChzZWxmLnRyaWdnZXIoXCJiZWZvcmVDbG9zZVwiLCBlKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0c2VsZi5pc0Nsb3NpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRyZXF1
6780ZXN0QUZyYW1lKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzZWxmLnVwZGF0ZSgpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgZXZlbnRzXG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaW5zdGFuY2VzLCB0aGV5IHdpbGwgYmUgc2V0IGFnYWluIGJ5IFwiYWN0aXZhdGVcIiBtZXRob2Rcblx0XHRcdHNlbGYucmVtb3ZlRXZlbnRzKCk7XG5cblx0XHRcdCRjb250ZW50ID0gY3VycmVudC4kY29udGVudDtcblx0XHRcdGVmZmVjdCA9IGN1cnJlbnQub3B0cy5hbmltYXRpb25FZmZlY3Q7XG5cdFx0XHRkdXJhdGlvbiA9ICQuaXNOdW1lcmljKGQpID8gZCA6IGVmZmVjdCA/IGN1cnJlbnQub3B0cy5hbmltYXRpb25EdXJhdGlvbiA6IDA7XG5cblx0XHRcdGN1cnJlbnQuJHNsaWRlLnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWNvbXBsZXRlIGZhbmN5Ym94LXNsaWRlLS1uZXh0IGZhbmN5Ym94LXNsaWRlLS1wcmV2aW91cyBmYW5jeWJveC1hbmltYXRlZFwiKTtcblxuXHRcdFx0aWYgKGUgIT09IHRydWUpIHtcblx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKGN1cnJlbnQuJHNsaWRlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVmZmVjdCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgb3RoZXIgc2xpZGVzXG5cdFx0XHRjdXJyZW50LiRzbGlkZVxuXHRcdFx0XHQuc2libGluZ3MoKVxuXHRcdFx0XHQudHJpZ2dlcihcIm9uUmVzZXRcIilcblx0XHRcdFx0LnJlbW92ZSgpO1xuXG5cdFx0XHQvLyBUcmlnZ2VyIGFuaW1hdGlvbnNcblx0XHRcdGlmIChkdXJhdGlvbikge1xuXHRcdFx0XHRzZWxmLiRyZWZzLmNvbnRhaW5lclxuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWlzLW9wZW5cIilcblx0XHRcdFx0XHQuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1jbG9zaW5nXCIpXG5cdFx0XHRcdFx0LmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgZHVyYXRpb24gKyBcIm1zXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhbiB1cFxuXHRcdFx0c2VsZi5oaWRlTG9hZGluZyhjdXJyZW50KTtcblxuXHRcdFx0c2VsZi5oaWRlQ29udHJvbHModHJ1ZSk7XG5cblx0XHRcdHNlbGYudXBkYXRlQ3Vyc29yKCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHBvc3NpYmxlIHRvIHpvb20tb3V0XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGVmZmVjdCA9PT0gXCJ6b29tXCIgJiZcblx0XHRcdFx0ISgkY29udGVudCAmJiBkdXJhdGlvbiAmJiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAhc2VsZi5pc01vdmVkKCkgJiYgIWN1cnJlbnQuaGFzRXJyb3IgJiYgKGVuZCA9IHNlbGYuZ2V0VGh1bWJQb3MoY3VycmVudCkpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGVmZmVjdCA9IFwiZmFkZVwiO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZWZmZWN0ID09PSBcInpvb21cIikge1xuXHRcdFx0XHQkLmZhbmN5Ym94LnN0b3AoJGNvbnRlbnQpO1xuXG5cdFx0XHRcdGRvbVJlY3QgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZSgkY29udGVudCk7XG5cblx0XHRcdFx0c3RhcnQgPSB7XG5cdFx0XHRcdFx0dG9wOiBkb21SZWN0LnRvcCxcblx0XHRcdFx0XHRsZWZ0OiBkb21SZWN0LmxlZnQsXG5cdFx0XHRcdFx0c2NhbGVYOiBkb21SZWN0LndpZHRoIC8gZW5kLndpZHRoLFxuXHRcdFx0XHRcdHNjYWxlWTogZG9tUmVjdC5oZWlnaHQgLyBlbmQuaGVpZ2h0LFxuXHRcdFx0XHRcdHdpZHRoOiBlbmQud2lkdGgsXG5cdFx0XHRcdFx0aGVpZ2h0OiBlbmQuaGVpZ2h0XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgd2UgbmVlZCB0byBhbmltYXRlIG9wYWNpdHlcblx0XHRcdFx0b3BhY2l0eSA9IGN1cnJlbnQub3B0cy56b29tT3BhY2l0eTtcblxuXHRcdFx0XHRpZiAob3BhY2l0eSA9PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9wYWNpdHkgPSBNYXRoLmFicyhjdXJyZW50LndpZHRoIC8gY3VycmVudC5oZWlnaHQgLSBlbmQud2lkdGggLyBlbmQuaGVpZ2h0KSA+IDAuMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvcGFjaXR5KSB7XG5cdFx0XHRcdFx0ZW5kLm9wYWNpdHkgPSAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JC5mYW5jeWJveC5zZXRUcmFuc2xhdGUoJGNvbnRlbnQsIHN0YXJ0KTtcblxuXHRcdFx0XHRmb3JjZVJlZHJhdygkY29udGVudCk7XG5cblx0XHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKCRjb250ZW50LCBlbmQsIGR1cmF0aW9uLCBkb25lKTtcblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVmZmVjdCAmJiBkdXJhdGlvbikge1xuXHRcdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoXG5cdFx0XHRcdFx0Y3VycmVudC4kc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tcHJldmlvdXNcIikucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tY3VycmVudFwiKSxcblx0XHRcdFx0XHRcImZhbmN5Ym94LWFuaW1hdGVkIGZhbmN5Ym94LWZ4LVwiICsgZWZmZWN0LFxuXHRcdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHRcdGRvbmVcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIElmIHNraXAgYW5pbWF0aW9uXG5cdFx0XHRcdGlmIChlID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChkb25lLCBkdXJhdGlvbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZG9uZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBGaW5hbCBhZGp1c3RtZW50cyBhZnRlciByZW1vdmluZyB0aGUgaW5zdGFuY2Vcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNsZWFuVXA6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGluc3RhbmNlLFxuXHRcdFx0XHQkZm9jdXMgPSBzZWxmLmN1cnJlbnQub3B0cy4kb3JpZyxcblx0XHRcdFx0eCxcblx0XHRcdFx0eTtcblxuXHRcdFx0c2VsZi5jdXJyZW50LiRzbGlkZS50cmlnZ2VyKFwib25SZXNldFwiKTtcblxuXHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXIuZW1wdHkoKS5yZW1vdmUoKTtcblxuXHRcdFx0c2VsZi50cmlnZ2VyKFwiYWZ0ZXJDbG9zZVwiLCBlKTtcblxuXHRcdFx0Ly8gUGxhY2UgYmFjayBmb2N1c1xuXHRcdFx0aWYgKCEhc2VsZi5jdXJyZW50Lm9wdHMuYmFja0ZvY3VzKSB7XG5cdFx0XHRcdGlmICghJGZvY3VzIHx8ICEkZm9jdXMubGVuZ3RoIHx8ICEkZm9jdXMuaXMoXCI6dmlzaWJsZVwiKSkge1xuXHRcdFx0XHRcdCRmb2N1cyA9IHNlbGYuJHRyaWdnZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJGZvY3VzICYmICRmb2N1cy5sZW5ndGgpIHtcblx0XHRcdFx0XHR4ID0gd2luZG93LnNjcm9sbFg7XG5cdFx0XHRcdFx0eSA9IHdpbmRvdy5zY3JvbGxZO1xuXG5cdFx0XHRcdFx0JGZvY3VzLnRyaWdnZXIoXCJmb2N1c1wiKTtcblxuXHRcdFx0XHRcdCQoXCJodG1sLCBib2R5XCIpXG5cdFx0XHRcdFx0XHQuc2Nyb2xsVG9wKHkpXG5cdFx0XHRcdFx0XHQuc2Nyb2xsTGVmdCh4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmN1cnJlbnQgPSBudWxsO1xuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBhcmUgb3RoZXIgaW5zdGFuY2VzXG5cdFx0XHRpbnN0YW5jZSA9ICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRcdGluc3RhbmNlLmFjdGl2YXRlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWFjdGl2ZSBjb21wZW5zYXRlLWZvci1zY3JvbGxiYXJcIik7XG5cblx0XHRcdFx0JChcIiNmYW5jeWJveC1zdHlsZS1ub3Njcm9sbFwiKS5yZW1vdmUoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQ2FsbCBjYWxsYmFjayBhbmQgdHJpZ2dlciBhbiBldmVudFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHRyaWdnZXI6IGZ1bmN0aW9uIChuYW1lLCBzbGlkZSkge1xuXHRcdFx0dmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0b2JqID0gc2xpZGUgJiYgc2xpZGUub3B0cyA/IHNsaWRlIDogc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRyZXo7XG5cblx0XHRcdGlmIChvYmopIHtcblx0XHRcdFx0YXJncy51bnNoaWZ0KG9iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvYmogPSBzZWxmO1xuXHRcdFx0fVxuXG5cdFx0XHRhcmdzLnVuc2hpZnQoc2VsZik7XG5cblx0XHRcdGlmICgkLmlzRnVuY3Rpb24ob2JqLm9wdHNbbmFtZV0pKSB7XG5cdFx0XHRcdHJleiA9IG9iai5vcHRzW25hbWVdLmFwcGx5KG9iaiwgYXJncyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXogPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybi
6780ByZXo7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuYW1lID09PSBcImFmdGVyQ2xvc2VcIiB8fCAhc2VsZi4kcmVmcykge1xuXHRcdFx0XHQkRC50cmlnZ2VyKG5hbWUgKyBcIi5mYlwiLCBhcmdzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuJHJlZnMuY29udGFpbmVyLnRyaWdnZXIobmFtZSArIFwiLmZiXCIsIGFyZ3MpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBVcGRhdGUgaW5mb2JhciB2YWx1ZXMsIG5hdmlnYXRpb24gYnV0dG9uIHN0YXRlcyBhbmQgcmV2ZWFsIGNhcHRpb25cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHVwZGF0ZUNvbnRyb2xzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdGluZGV4ID0gY3VycmVudC5pbmRleCxcblx0XHRcdFx0JGNvbnRhaW5lciA9IHNlbGYuJHJlZnMuY29udGFpbmVyLFxuXHRcdFx0XHQkY2FwdGlvbiA9IHNlbGYuJHJlZnMuY2FwdGlvbixcblx0XHRcdFx0Y2FwdGlvbiA9IGN1cnJlbnQub3B0cy5jYXB0aW9uO1xuXG5cdFx0XHQvLyBSZWNhbGN1bGF0ZSBjb250ZW50IGRpbWVuc2lvbnNcblx0XHRcdGN1cnJlbnQuJHNsaWRlLnRyaWdnZXIoXCJyZWZyZXNoXCIpO1xuXG5cdFx0XHQvLyBTZXQgY2FwdGlvblxuXHRcdFx0aWYgKGNhcHRpb24gJiYgY2FwdGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0c2VsZi4kY2FwdGlvbiA9ICRjYXB0aW9uO1xuXG5cdFx0XHRcdCRjYXB0aW9uXG5cdFx0XHRcdFx0LmNoaWxkcmVuKClcblx0XHRcdFx0XHQuZXEoMClcblx0XHRcdFx0XHQuaHRtbChjYXB0aW9uKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuJGNhcHRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXNlbGYuaGFzSGlkZGVuQ29udHJvbHMgJiYgIXNlbGYuaXNJZGxlKSB7XG5cdFx0XHRcdHNlbGYuc2hvd0NvbnRyb2xzKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSBpbmZvIGFuZCBuYXZpZ2F0aW9uIGVsZW1lbnRzXG5cdFx0XHQkY29udGFpbmVyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1jb3VudF1cIikuaHRtbChzZWxmLmdyb3VwLmxlbmd0aCk7XG5cdFx0XHQkY29udGFpbmVyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1pbmRleF1cIikuaHRtbChpbmRleCArIDEpO1xuXG5cdFx0XHQkY29udGFpbmVyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1wcmV2XVwiKS5wcm9wKFwiZGlzYWJsZWRcIiwgIWN1cnJlbnQub3B0cy5sb29wICYmIGluZGV4IDw9IDApO1xuXHRcdFx0JGNvbnRhaW5lci5maW5kKFwiW2RhdGEtZmFuY3lib3gtbmV4dF1cIikucHJvcChcImRpc2FibGVkXCIsICFjdXJyZW50Lm9wdHMubG9vcCAmJiBpbmRleCA+PSBzZWxmLmdyb3VwLmxlbmd0aCAtIDEpO1xuXG5cdFx0XHRpZiAoY3VycmVudC50eXBlID09PSBcImltYWdlXCIpIHtcblx0XHRcdFx0Ly8gUmUtZW5hYmxlIGJ1dHRvbnM7IHVwZGF0ZSBkb3dubG9hZCBidXR0b24gc291cmNlXG5cdFx0XHRcdCRjb250YWluZXJcblx0XHRcdFx0XHQuZmluZChcIltkYXRhLWZhbmN5Ym94LXpvb21dXCIpXG5cdFx0XHRcdFx0LnNob3coKVxuXHRcdFx0XHRcdC5lbmQoKVxuXHRcdFx0XHRcdC5maW5kKFwiW2RhdGEtZmFuY3lib3gtZG93bmxvYWRdXCIpXG5cdFx0XHRcdFx0LmF0dHIoXCJocmVmXCIsIGN1cnJlbnQub3B0cy5pbWFnZS5zcmMgfHwgY3VycmVudC5zcmMpXG5cdFx0XHRcdFx0LnNob3coKTtcblx0XHRcdH0gZWxzZSBpZiAoY3VycmVudC5vcHRzLnRvb2xiYXIpIHtcblx0XHRcdFx0JGNvbnRhaW5lci5maW5kKFwiW2RhdGEtZmFuY3lib3gtZG93bmxvYWRdLFtkYXRhLWZhbmN5Ym94LXpvb21dXCIpLmhpZGUoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIGZvY3VzIGlzIG5vdCBvbiBkaXNhYmxlZCBidXR0b24vZWxlbWVudFxuXHRcdFx0aWYgKCQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuaXMoXCI6aGlkZGVuLFtkaXNhYmxlZF1cIikpIHtcblx0XHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXIudHJpZ2dlcihcImZvY3VzXCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBIaWRlIHRvb2xiYXIgYW5kIGNhcHRpb25cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGhpZGVDb250cm9sczogZnVuY3Rpb24gKGFuZENhcHRpb24pIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0YXJyID0gW1wiaW5mb2JhclwiLCBcInRvb2xiYXJcIiwgXCJuYXZcIl07XG5cblx0XHRcdGlmIChhbmRDYXB0aW9uIHx8ICFzZWxmLmN1cnJlbnQub3B0cy5wcmV2ZW50Q2FwdGlvbk92ZXJsYXApIHtcblx0XHRcdFx0YXJyLnB1c2goXCJjYXB0aW9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLiRyZWZzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcblx0XHRcdFx0YXJyXG5cdFx0XHRcdFx0Lm1hcChmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFwiZmFuY3lib3gtc2hvdy1cIiArIGk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuam9pbihcIiBcIilcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMuaGFzSGlkZGVuQ29udHJvbHMgPSB0cnVlO1xuXHRcdH0sXG5cblx0XHRzaG93Q29udHJvbHM6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0b3B0cyA9IHNlbGYuY3VycmVudCA/IHNlbGYuY3VycmVudC5vcHRzIDogc2VsZi5vcHRzLFxuXHRcdFx0XHQkY29udGFpbmVyID0gc2VsZi4kcmVmcy5jb250YWluZXI7XG5cblx0XHRcdHNlbGYuaGFzSGlkZGVuQ29udHJvbHMgPSBmYWxzZTtcblx0XHRcdHNlbGYuaWRsZVNlY29uZHNDb3VudGVyID0gMDtcblxuXHRcdFx0JGNvbnRhaW5lclxuXHRcdFx0XHQudG9nZ2xlQ2xhc3MoXCJmYW5jeWJveC1zaG93LXRvb2xiYXJcIiwgISEob3B0cy50b29sYmFyICYmIG9wdHMuYnV0dG9ucykpXG5cdFx0XHRcdC50b2dnbGVDbGFzcyhcImZhbmN5Ym94LXNob3ctaW5mb2JhclwiLCAhIShvcHRzLmluZm9iYXIgJiYgc2VsZi5ncm91cC5sZW5ndGggPiAxKSlcblx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtc2hvdy1jYXB0aW9uXCIsICEhc2VsZi4kY2FwdGlvbilcblx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtc2hvdy1uYXZcIiwgISEob3B0cy5hcnJvd3MgJiYgc2VsZi5ncm91cC5sZW5ndGggPiAxKSlcblx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtaXMtbW9kYWxcIiwgISFvcHRzLm1vZGFsKTtcblx0XHR9LFxuXG5cdFx0Ly8gVG9nZ2xlIHRvb2xiYXIgYW5kIGNhcHRpb25cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dG9nZ2xlQ29udHJvbHM6IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICh0aGlzLmhhc0hpZGRlbkNvbnRyb2xzKSB7XG5cdFx0XHRcdHRoaXMuc2hvd0NvbnRyb2xzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmhpZGVDb250cm9scygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0JC5mYW5jeWJveCA9IHtcblx0XHR2ZXJzaW9uOiBcIjMuNS43XCIsXG5cdFx0ZGVmYXVsdHM6IGRlZmF1bHRzLFxuXG5cdFx0Ly8gR2V0IGN1cnJlbnQgaW5zdGFuY2UgYW5kIGV4ZWN1dGUgYSBjb21tYW5kLlxuXHRcdC8vXG5cdFx0Ly8gRXhhbXBsZXMgb2YgdXNhZ2U6XG5cdFx0Ly9cblx0XHQvLyAgICRpbnN0YW5jZSA9ICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKTtcblx0XHQvLyAgICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKS5qdW1wVG8oIDEgKTtcblx0XHQvLyAgICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoICdqdW1wVG8nLCAxICk7XG5cdFx0Ly8gICAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCBmdW5jdGlvbigpIHtcblx0XHQvLyAgICAgICBjb25zb2xlLmluZm8oIHRoaXMuY3VyckluZGV4ICk7XG5cdFx0Ly8gICB9KTtcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGdldEluc3RhbmNlOiBmdW5jdGlvbiAoY29tbWFuZCkge1xuXHRcdFx0dmFyIGluc3RhbmNlID0gJCgnLmZhbmN5Ym94LWNvbnRhaW5lcjpub3QoXCIuZmFuY3lib3gtaXMtY2xvc2luZ1wiKTpsYXN0JykuZGF0YShcIkZhbmN5Qm94XCIpLFxuXHRcdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRmFuY3lCb3gpIHtcblx0XHRcdFx0aWYgKCQudHlwZShjb21tYW5kKSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdGluc3RhbmNlW2NvbW1hbmRdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcblx0XHRcdFx0fSBlbHNlIGlmICgkLnR5cGUoY29tbWFuZCkgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdGNvbW1hbmQuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGluc3RhbmNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblxuXHRcdC8vIENyZWF0ZSBuZXcgaW5zdGFuY2Vcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09XG5cblx0XHRvcGVuOiBmdW5jdGlvbiAoaXRlbXMsIG9wdHMsIGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gbmV3IEZhbmN5Qm94KGl0ZW1zLCBvcHRzLCBpbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIENsb3NlIGN1cnJlbnQgb3IgYWxsIGluc3RhbmNlc1xuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0Y2xvc2U6IGZ1bmN0aW9uIChhbGwpIHtcblx0XHRcdHZhciBpbnN0YW5jZSA9IHRoaXMuZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRcdGluc3RhbmNlLmNsb3NlKCk7XG5cblx0XHRcdFx0Ly8gVHJ5IHRvIGZpbmQgYW5kIGNsb3NlIG5leHQgaW5zdGFuY2Vcblx0XHRcdFx0aWYgKGFsbCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuY2xvc2UoYWxsKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDbG9zZSBhbGwgaW5zdGFuY2VzIGFuZCB1bmJpbmQgYWxsIGV2ZW50c1xuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmNsb3NlKHRydWUpO1xuXG5cdFx0XHQkRC5hZGQoXCJib2R5XCIpLm9mZihcImNsaWNrLmZiLXN0YXJ0XCIsIFwiKipcIik7XG5cdFx0fSxcblxuXHRcdC8vIFRyeSB0byBkZXRlY3QgbW9iaWxlIGRldmljZXNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRpc01vYmlsZTogL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLFxuXG5cdFx0Ly8gRGV0ZWN0IGlmICd0cmFuc2xhdGUzZCcgc3VwcG9ydCBpcyBhdmFpbGFibGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dXNlM2Q6IChmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0d2luZG93LmdldENvbXB1dGVkU3R5bGUgJiZcblx0XHRcdFx0d2luZG93LmdldENvbXB1dGVkU3R5bGUoZGl2KSAmJlxuXHRcdFx0XHR3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkaXYpLmdldFByb3BlcnR5VmFsdWUoXCJ0cmFuc2Zvcm1cIikgJiZcblx0XHRcdFx0IShkb2N1bWVudC5kb2N1bWVudE1vZGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgMTEpXG5cdFx0XHQpO1xuXHRcdH0pKCksXG5cblx0XHQvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGN1cnJlbnQgdmlzdWFsIHN0YXRlIG9mIGFuIGVsZW1lbnRcblx0XHQvLyByZXR1cm5zIGFycmF5WyB0b3AsIGxlZnQsIGhvcml6b250YWwtc2NhbGUsIHZlcnRpY2FsLXNjYWxlLCBvcGFjaXR5IF1cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGdldFRyYW5zbGF0ZTogZnVuY3Rpb24gKCRlbCkge1xuXHRcdFx0dmFyIGRvbVJlY3Q7XG5cblx0XHRcdGlmICghJGVsIHx8ICEkZWwubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybi
6780BmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZG9tUmVjdCA9ICRlbFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dG9wOiBkb21SZWN0LnRvcCB8fCAwLFxuXHRcdFx0XHRsZWZ0OiBkb21SZWN0LmxlZnQgfHwgMCxcblx0XHRcdFx0d2lkdGg6IGRvbVJlY3Qud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogZG9tUmVjdC5oZWlnaHQsXG5cdFx0XHRcdG9wYWNpdHk6IHBhcnNlRmxvYXQoJGVsLmNzcyhcIm9wYWNpdHlcIikpXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvLyBTaG9ydGN1dCBmb3Igc2V0dGluZyBcInRyYW5zbGF0ZTNkXCIgcHJvcGVydGllcyBmb3IgZWxlbWVudFxuXHRcdC8vIENhbiBzZXQgYmUgdXNlZCB0byBzZXQgb3BhY2l0eSwgdG9vXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gKCRlbCwgcHJvcHMpIHtcblx0XHRcdHZhciBzdHIgPSBcIlwiLFxuXHRcdFx0XHRjc3MgPSB7fTtcblxuXHRcdFx0aWYgKCEkZWwgfHwgIXByb3BzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BzLmxlZnQgIT09IHVuZGVmaW5lZCB8fCBwcm9wcy50b3AgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzdHIgPVxuXHRcdFx0XHRcdChwcm9wcy5sZWZ0ID09PSB1bmRlZmluZWQgPyAkZWwucG9zaXRpb24oKS5sZWZ0IDogcHJvcHMubGVmdCkgK1xuXHRcdFx0XHRcdFwicHgsIFwiICtcblx0XHRcdFx0XHQocHJvcHMudG9wID09PSB1bmRlZmluZWQgPyAkZWwucG9zaXRpb24oKS50b3AgOiBwcm9wcy50b3ApICtcblx0XHRcdFx0XHRcInB4XCI7XG5cblx0XHRcdFx0aWYgKHRoaXMudXNlM2QpIHtcblx0XHRcdFx0XHRzdHIgPSBcInRyYW5zbGF0ZTNkKFwiICsgc3RyICsgXCIsIDBweClcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHIgPSBcInRyYW5zbGF0ZShcIiArIHN0ciArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcm9wcy5zY2FsZVggIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zY2FsZVkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzdHIgKz0gXCIgc2NhbGUoXCIgKyBwcm9wcy5zY2FsZVggKyBcIiwgXCIgKyBwcm9wcy5zY2FsZVkgKyBcIilcIjtcblx0XHRcdH0gZWxzZSBpZiAocHJvcHMuc2NhbGVYICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0c3RyICs9IFwiIHNjYWxlWChcIiArIHByb3BzLnNjYWxlWCArIFwiKVwiO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3RyLmxlbmd0aCkge1xuXHRcdFx0XHRjc3MudHJhbnNmb3JtID0gc3RyO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHJvcHMub3BhY2l0eSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNzcy5vcGFjaXR5ID0gcHJvcHMub3BhY2l0eTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BzLndpZHRoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y3NzLndpZHRoID0gcHJvcHMud2lkdGg7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcm9wcy5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjc3MuaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gJGVsLmNzcyhjc3MpO1xuXHRcdH0sXG5cblx0XHQvLyBTaW1wbGUgQ1NTIHRyYW5zaXRpb24gaGFuZGxlclxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRhbmltYXRlOiBmdW5jdGlvbiAoJGVsLCB0bywgZHVyYXRpb24sIGNhbGxiYWNrLCBsZWF2ZUFuaW1hdGlvbk5hbWUpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0ZnJvbTtcblxuXHRcdFx0aWYgKCQuaXNGdW5jdGlvbihkdXJhdGlvbikpIHtcblx0XHRcdFx0Y2FsbGJhY2sgPSBkdXJhdGlvbjtcblx0XHRcdFx0ZHVyYXRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnN0b3AoJGVsKTtcblxuXHRcdFx0ZnJvbSA9IHNlbGYuZ2V0VHJhbnNsYXRlKCRlbCk7XG5cblx0XHRcdCRlbC5vbih0cmFuc2l0aW9uRW5kLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHQvLyBTa2lwIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIGFuZCB6LWluZGV4IGNoYW5nZVxuXHRcdFx0XHRpZiAoZSAmJiBlLm9yaWdpbmFsRXZlbnQgJiYgKCEkZWwuaXMoZS5vcmlnaW5hbEV2ZW50LnRhcmdldCkgfHwgZS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZSA9PSBcInotaW5kZXhcIikpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZWxmLnN0b3AoJGVsKTtcblxuXHRcdFx0XHRpZiAoJC5pc051bWVyaWMoZHVyYXRpb24pKSB7XG5cdFx0XHRcdFx0JGVsLmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgXCJcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJC5pc1BsYWluT2JqZWN0KHRvKSkge1xuXHRcdFx0XHRcdGlmICh0by5zY2FsZVggIT09IHVuZGVmaW5lZCAmJiB0by5zY2FsZVkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZXRUcmFuc2xhdGUoJGVsLCB7XG5cdFx0XHRcdFx0XHRcdHRvcDogdG8udG9wLFxuXHRcdFx0XHRcdFx0XHRsZWZ0OiB0by5sZWZ0LFxuXHRcdFx0XHRcdFx0XHR3aWR0aDogZnJvbS53aWR0aCAqIHRvLnNjYWxlWCxcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBmcm9tLmhlaWdodCAqIHRvLnNjYWxlWSxcblx0XHRcdFx0XHRcdFx0c2NhbGVYOiAxLFxuXHRcdFx0XHRcdFx0XHRzY2FsZVk6IDFcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChsZWF2ZUFuaW1hdGlvbk5hbWUgIT09IHRydWUpIHtcblx0XHRcdFx0XHQkZWwucmVtb3ZlQ2xhc3ModG8pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCQuaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcblx0XHRcdFx0XHRjYWxsYmFjayhlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmICgkLmlzTnVtZXJpYyhkdXJhdGlvbikpIHtcblx0XHRcdFx0JGVsLmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgZHVyYXRpb24gKyBcIm1zXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCBhbmltYXRpb24gYnkgY2hhbmdpbmcgQ1NTIHByb3BlcnRpZXMgb3IgY2xhc3MgbmFtZVxuXHRcdFx0aWYgKCQuaXNQbGFpbk9iamVjdCh0bykpIHtcblx0XHRcdFx0aWYgKHRvLnNjYWxlWCAhPT0gdW5kZWZpbmVkICYmIHRvLnNjYWxlWSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRvLndpZHRoO1xuXHRcdFx0XHRcdGRlbGV0ZSB0by5oZWlnaHQ7XG5cblx0XHRcdFx0XHRpZiAoJGVsLnBhcmVudCgpLmhhc0NsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWltYWdlXCIpKSB7XG5cdFx0XHRcdFx0XHQkZWwucGFyZW50KCkuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1zY2FsaW5nXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKCRlbCwgdG8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGVsLmFkZENsYXNzKHRvKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgYHRyYW5zaXRpb25lbmRgIGNhbGxiYWNrIGdldHMgZmlyZWRcblx0XHRcdCRlbC5kYXRhKFxuXHRcdFx0XHRcInRpbWVyXCIsXG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRlbC50cmlnZ2VyKHRyYW5zaXRpb25FbmQpO1xuXHRcdFx0XHR9LCBkdXJhdGlvbiArIDMzKVxuXHRcdFx0KTtcblx0XHR9LFxuXG5cdFx0c3RvcDogZnVuY3Rpb24gKCRlbCwgY2FsbENhbGxiYWNrKSB7XG5cdFx0XHRpZiAoJGVsICYmICRlbC5sZW5ndGgpIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCRlbC5kYXRhKFwidGltZXJcIikpO1xuXG5cdFx0XHRcdGlmIChjYWxsQ2FsbGJhY2spIHtcblx0XHRcdFx0XHQkZWwudHJpZ2dlcih0cmFuc2l0aW9uRW5kKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCRlbC5vZmYodHJhbnNpdGlvbkVuZCkuY3NzKFwidHJhbnNpdGlvbi1kdXJhdGlvblwiLCBcIlwiKTtcblxuXHRcdFx0XHQkZWwucGFyZW50KCkucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1pcy1zY2FsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvLyBEZWZhdWx0IGNsaWNrIGhhbmRsZXIgZm9yIFwiZmFuY3lib3hlZFwiIGxpbmtzXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0ZnVuY3Rpb24gX3J1bihlLCBvcHRzKSB7XG5cdFx0dmFyIGl0ZW1zID0gW10sXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHQkdGFyZ2V0LFxuXHRcdFx0dmFsdWUsXG5cdFx0XHRpbnN0YW5jZTtcblxuXHRcdC8vIEF2b2lkIG9wZW5pbmcgbXVsdGlwbGUgdGltZXNcblx0XHRpZiAoZSAmJiBlLmlzRGVmYXVsdFByZXZlbn
6780RlZCgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHRpZiAoZSAmJiBlLmRhdGEpIHtcblx0XHRcdG9wdHMgPSBtZXJnZU9wdHMoZS5kYXRhLm9wdGlvbnMsIG9wdHMpO1xuXHRcdH1cblxuXHRcdCR0YXJnZXQgPSBvcHRzLiR0YXJnZXQgfHwgJChlLmN1cnJlbnRUYXJnZXQpLnRyaWdnZXIoXCJibHVyXCIpO1xuXHRcdGluc3RhbmNlID0gJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLiR0cmlnZ2VyICYmIGluc3RhbmNlLiR0cmlnZ2VyLmlzKCR0YXJnZXQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG9wdHMuc2VsZWN0b3IpIHtcblx0XHRcdGl0ZW1zID0gJChvcHRzLnNlbGVjdG9yKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gR2V0IGFsbCByZWxhdGVkIGl0ZW1zIGFuZCBmaW5kIGluZGV4IGZvciBjbGlja2VkIG9uZVxuXHRcdFx0dmFsdWUgPSAkdGFyZ2V0LmF0dHIoXCJkYXRhLWZhbmN5Ym94XCIpIHx8IFwiXCI7XG5cblx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRpdGVtcyA9IGUuZGF0YSA/IGUuZGF0YS5pdGVtcyA6IFtdO1xuXHRcdFx0XHRpdGVtcyA9IGl0ZW1zLmxlbmd0aCA/IGl0ZW1zLmZpbHRlcignW2RhdGEtZmFuY3lib3g9XCInICsgdmFsdWUgKyAnXCJdJykgOiAkKCdbZGF0YS1mYW5jeWJveD1cIicgKyB2YWx1ZSArICdcIl0nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGl0ZW1zID0gWyR0YXJnZXRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGluZGV4ID0gJChpdGVtcykuaW5kZXgoJHRhcmdldCk7XG5cblx0XHQvLyBTb21ldGltZXMgY3VycmVudCBpdGVtIGNhbiBub3QgYmUgZm91bmRcblx0XHRpZiAoaW5kZXggPCAwKSB7XG5cdFx0XHRpbmRleCA9IDA7XG5cdFx0fVxuXG5cdFx0aW5zdGFuY2UgPSAkLmZhbmN5Ym94Lm9wZW4oaXRlbXMsIG9wdHMsIGluZGV4KTtcblxuXHRcdC8vIFNhdmUgbGFzdCBhY3RpdmUgZWxlbWVudFxuXHRcdGluc3RhbmNlLiR0cmlnZ2VyID0gJHRhcmdldDtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIGpRdWVyeSBwbHVnaW5cblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCQuZm4uZmFuY3lib3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHRcdHZhciBzZWxlY3RvcjtcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdHNlbGVjdG9yID0gb3B0aW9ucy5zZWxlY3RvciB8fCBmYWxzZTtcblxuXHRcdGlmIChzZWxlY3Rvcikge1xuXHRcdFx0Ly8gVXNlIGJvZHkgZWxlbWVudCBpbnN0ZWFkIG9mIGRvY3VtZW50IHNvIGl0IGV4ZWN1dGVzIGZpcnN0XG5cdFx0XHQkKFwiYm9keVwiKVxuXHRcdFx0XHQub2ZmKFwiY2xpY2suZmItc3RhcnRcIiwgc2VsZWN0b3IpXG5cdFx0XHRcdC5vbihcImNsaWNrLmZiLXN0YXJ0XCIsIHNlbGVjdG9yLCB7XG5cdFx0XHRcdFx0b3B0aW9uczogb3B0aW9uc1xuXHRcdFx0XHR9LCBfcnVuKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5vZmYoXCJjbGljay5mYi1zdGFydFwiKS5vbihcblx0XHRcdFx0XCJjbGljay5mYi1zdGFydFwiLCB7XG5cdFx0XHRcdFx0aXRlbXM6IHRoaXMsXG5cdFx0XHRcdFx0b3B0aW9uczogb3B0aW9uc1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRfcnVuXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdC8vIFNlbGYgaW5pdGlhbGl6aW5nIHBsdWdpbiBmb3IgYWxsIGVsZW1lbnRzIGhhdmluZyBgZGF0YS1mYW5jeWJveGAgYXR0cmlidXRlXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0JEQub24oXCJjbGljay5mYi1zdGFydFwiLCBcIltkYXRhLWZhbmN5Ym94XVwiLCBfcnVuKTtcblxuXHQvLyBFbmFibGUgXCJ0cmlnZ2VyIGVsZW1lbnRzXCJcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCRELm9uKFwiY2xpY2suZmItc3RhcnRcIiwgXCJbZGF0YS1mYW5jeWJveC10cmlnZ2VyXVwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdCQoJ1tkYXRhLWZhbmN5Ym94PVwiJyArICQodGhpcykuYXR0cihcImRhdGEtZmFuY3lib3gtdHJpZ2dlclwiKSArICdcIl0nKVxuXHRcdFx0LmVxKCQodGhpcykuYXR0cihcImRhdGEtZmFuY3lib3gtaW5kZXhcIikgfHwgMClcblx0XHRcdC50cmlnZ2VyKFwiY2xpY2suZmItc3RhcnRcIiwge1xuXHRcdFx0XHQkdHJpZ2dlcjogJCh0aGlzKVxuXHRcdFx0fSk7XG5cdH0pO1xuXG5cdC8vIFRyYWNrIGZvY3VzIGV2ZW50IGZvciBiZXR0ZXIgYWNjZXNzaWJpbGl0eSBzdHlsaW5nXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGJ1dHRvblN0ciA9IFwiLmZhbmN5Ym94LWJ1dHRvblwiLFxuXHRcdFx0Zm9jdXNTdHIgPSBcImZhbmN5Ym94LWZvY3VzXCIsXG5cdFx0XHQkcHJlc3NlZCA9IG51bGw7XG5cblx0XHQkRC5vbihcIm1vdXNlZG93biBtb3VzZXVwIGZvY3VzIGJsdXJcIiwgYnV0dG9uU3RyLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0c3dpdGNoIChlLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIm1vdXNlZG93blwiOlxuXHRcdFx0XHRcdCRwcmVzc2VkID0gJCh0aGlzKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1vdXNldXBcIjpcblx0XHRcdFx0XHQkcHJlc3NlZCA9IG51bGw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJmb2N1c2luXCI6XG5cdFx0XHRcdFx0JChidXR0b25TdHIpLnJlbW92ZUNsYXNzKGZvY3VzU3RyKTtcblxuXHRcdFx0XHRcdGlmICghJCh0aGlzKS5pcygkcHJlc3NlZCkgJiYgISQodGhpcykuaXMoXCJbZGlzYWJsZWRdXCIpKSB7XG5cdFx0XHRcdFx0XHQkKHRoaXMpLmFkZENsYXNzKGZvY3VzU3RyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJmb2N1c291dFwiOlxuXHRcdFx0XHRcdCQoYnV0dG9uU3RyKS5yZW1vdmVDbGFzcyhmb2N1c1N0cik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pKCk7XG59KSh3aW5kb3csIGRvY3VtZW50LCBqUXVlcnkpO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyBNZWRpYVxuLy8gQWRkcyBhZGRpdGlvbmFsIG1lZGlhIHR5cGUgc3VwcG9ydFxuLy9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4oZnVuY3Rpb24gKCQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0Ly8gT2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBmb3IgZWFjaCBtZWRpYSB0eXBlXG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHR5b3V0dWJlOiB7XG5cdFx0XHRtYXRjaGVyOiAvKHlvdXR1YmVcXC5jb218eW91dHVcXC5iZXx5b3V0dWJlXFwtbm9jb29raWVcXC5jb20pXFwvKHdhdGNoXFw/KC4qJik/dj18dlxcL3x1XFwvfGVtYmVkXFwvPyk/KHZpZGVvc2VyaWVzXFw/bGlzdD0oLiopfFtcXHctXXsxMX18XFw/bGlzdFR5cGU9KC4qKSZsaXN0PSguKikpKC4qKS9pLFxuXHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdGF1dG9wbGF5OiAxLFxuXHRcdFx0XHRhdXRvaGl
6780kZTogMSxcblx0XHRcdFx0ZnM6IDEsXG5cdFx0XHRcdHJlbDogMCxcblx0XHRcdFx0aGQ6IDEsXG5cdFx0XHRcdHdtb2RlOiBcInRyYW5zcGFyZW50XCIsXG5cdFx0XHRcdGVuYWJsZWpzYXBpOiAxLFxuXHRcdFx0XHRodG1sNTogMVxuXHRcdFx0fSxcblx0XHRcdHBhcmFtUGxhY2U6IDgsXG5cdFx0XHR0eXBlOiBcImlmcmFtZVwiLFxuXHRcdFx0dXJsOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tL2VtYmVkLyQ0XCIsXG5cdFx0XHR0aHVtYjogXCJodHRwczovL2ltZy55b3V0dWJlLmNvbS92aS8kNC9ocWRlZmF1bHQuanBnXCJcblx0XHR9LFxuXG5cdFx0dmltZW86IHtcblx0XHRcdG1hdGNoZXI6IC9eLit2aW1lby5jb21cXC8oLipcXC8pPyhbXFxkXSspKC4qKT8vLFxuXHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdGF1dG9wbGF5OiAxLFxuXHRcdFx0XHRoZDogMSxcblx0XHRcdFx0c2hvd190aXRsZTogMSxcblx0XHRcdFx0c2hvd19ieWxpbmU6IDEsXG5cdFx0XHRcdHNob3dfcG9ydHJhaXQ6IDAsXG5cdFx0XHRcdGZ1bGxzY3JlZW46IDFcblx0XHRcdH0sXG5cdFx0XHRwYXJhbVBsYWNlOiAzLFxuXHRcdFx0dHlwZTogXCJpZnJhbWVcIixcblx0XHRcdHVybDogXCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vJDJcIlxuXHRcdH0sXG5cblx0XHRpbnN0YWdyYW06IHtcblx0XHRcdG1hdGNoZXI6IC8oaW5zdGFnclxcLmFtfGluc3RhZ3JhbVxcLmNvbSlcXC9wXFwvKFthLXpBLVowLTlfXFwtXSspXFwvPy9pLFxuXHRcdFx0dHlwZTogXCJpbWFnZVwiLFxuXHRcdFx0dXJsOiBcIi8vJDEvcC8kMi9tZWRpYS8/c2l6ZT1sXCJcblx0XHR9LFxuXG5cdFx0Ly8gRXhhbXBsZXM6XG5cdFx0Ly8gaHR0cDovL21hcHMuZ29vZ2xlLmNvbS8/bGw9NDguODU3OTk1LDIuMjk0Mjk3JnNwbj0wLjAwNzY2NiwwLjAyMTEzNiZ0PW0mej0xNlxuXHRcdC8vIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9AMzcuNzg1MjAwNiwtMTIyLjQxNDYzNTUsMTQuNjV6XG5cdFx0Ly8gaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL0A1Mi4yMTExMTIzLDIuOTIzNzU0Miw2LjYxej9obD1lblxuXHRcdC8vIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9wbGFjZS9Hb29nbGVwbGV4L0AzNy40MjIwMDQxLC0xMjIuMDgzMzQ5NCwxN3ovZGF0YT0hNG01ITNtNCExczB4MDoweDZjMjk2YzY2NjE5MzY3ZTAhOG0yITNkMzcuNDIxOTk5OCE0ZC0xMjIuMDg0MDU3MlxuXHRcdGdtYXBfcGxhY2U6IHtcblx0XHRcdG1hdGNoZXI6IC8obWFwc1xcLik/Z29vZ2xlXFwuKFthLXpdezIsM30oXFwuW2Etel17Mn0pPylcXC8oKChtYXBzXFwvKHBsYWNlXFwvKC4qKVxcLyk/XFxAKC4qKSwoXFxkKy4/XFxkKz8peikpfChcXD9sbD0pKSguKik/L2ksXG5cdFx0XHR0eXBlOiBcImlmcmFtZVwiLFxuXHRcdFx0dXJsOiBmdW5jdGlvbiAocmV6KSB7XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XCIvL21hcHMuZ29vZ2xlLlwiICtcblx0XHRcdFx0XHRyZXpbMl0gK1xuXHRcdFx0XHRcdFwiLz9sbD1cIiArXG5cdFx0XHRcdFx0KHJlels5XSA/IHJlels5XSArIFwiJno9XCIgKyBNYXRoLmZsb29yKHJlelsxMF0pICsgKHJlelsxMl0gPyByZXpbMTJdLnJlcGxhY2UoL15cXC8vLCBcIiZcIikgOiBcIlwiKSA6IHJlelsxMl0gKyBcIlwiKS5yZXBsYWNlKC9cXD8vLCBcIiZcIikgK1xuXHRcdFx0XHRcdFwiJm91dHB1dD1cIiArXG5cdFx0XHRcdFx0KHJlelsxMl0gJiYgcmV6WzEyXS5pbmRleE9mKFwibGF5ZXI9Y1wiKSA+IDAgPyBcInN2ZW1iZWRcIiA6IFwiZW1iZWRcIilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gRXhhbXBsZXM6XG5cdFx0Ly8gaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3NlYXJjaC9FbXBpcmUrU3RhdGUrQnVpbGRpbmcvXG5cdFx0Ly8gaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3NlYXJjaC8/YXBpPTEmcXVlcnk9Y2VudHVyeWxpbmsrZmllbGRcblx0XHQvLyBodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMvc2VhcmNoLz9hcGk9MSZxdWVyeT00Ny41OTUxNTE4LC0xMjIuMzMxNjM5M1xuXHRcdGdtYXBfc2VhcmNoOiB7XG5cdFx0XHRtYXRjaGVyOiAvKG1hcHNcXC4pP2dvb2dsZVxcLihbYS16XXsyLDN9KFxcLlthLXpdezJ9KT8pXFwvKG1hcHNcXC9zZWFyY2hcXC8pKC4qKS9pLFxuXHRcdFx0dHlwZTogXCJpZnJhbWVcIixcblx0XHRcdHVybDogZnVuY3Rpb24gKHJleikge1xuXHRcdFx0XHRyZXR1cm4gXCIvL21hcHMuZ29vZ2xlLlwiICsgcmV6WzJdICsgXCIvbWFwcz9xPVwiICsgcmV6WzVdLnJlcGxhY2UoXCJxdWVyeT1cIiwgXCJxPVwiKS5yZXBsYWNlKFwiYXBpPTFcIiwgXCJcIikgKyBcIiZvdXRwdXQ9ZW1iZWRcIjtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Ly8gRm9ybWF0cyBtYXRjaGluZyB1cmwgdG8gZmluYWwgZm9ybVxuXHR2YXIgZm9ybWF0ID0gZnVuY3Rpb24gKHVybCwgcmV6LCBwYXJhbXMpIHtcblx0XHRpZiAoIXVybCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHBhcmFtcyA9IHBhcmFtcyB8fCBcIlwiO1xuXG5cdFx0aWYgKCQudHlwZShwYXJhbXMpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwYXJhbXMgPSAkLnBhcmFtKHBhcmFtcywgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKHJleiwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdHVybCA9IHVybC5yZXBsYWNlKFwiJFwiICsga2V5LCB2YWx1ZSB8fCBcIlwiKTtcblx0XHR9KTtcblxuXHRcdGlmIChwYXJhbXMubGVuZ3RoKSB7XG5cdFx0XHR1cmwgKz0gKHVybC5pbmRleE9mKFwiP1wiKSA+IDAgPyBcIiZcIiA6IFwiP1wiKSArIHBhcmFtcztcblx0XHR9XG5cblx0XHRyZXR1cm4gdXJsO1xuXHR9O1xuXG5cdCQoZG9jdW1lbnQpLm9uKFwib2JqZWN0TmVlZHNUeXBlLmZiXCIsIGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgaXRlbSkge1xuXHRcdHZhciB1cmwgPSBpdGVtLnNyYyB8fCBcIlwiLFxuXHRcdFx0dHlwZSA9IGZhbHNlLFxuXHRcdFx0bWVkaWEsXG5cdFx0XHR0aHVtYixcblx0XHRcdHJleixcblx0XHRcdHBhcmFtcyxcblx0XHRcdHVybFBhcmFtcyxcblx0XHRcdHBhcmFtT2JqLFxuXHRcdFx0cHJvdmlkZXI7XG5cblx0XHRtZWRpYSA9ICQuZXh0ZW5kKHRydWUsIHt9LCBkZWZhdWx0cywgaXRlbS5vcHRzLm1lZGlhKTtcblxuXHRcdC8vIExvb2sgZm9yIGFueSBtYXRjaGluZyBtZWRpYSB0eXBlXG5cdFx0JC5lYWNoKG1lZGlhLCBmdW5jdGlvbiAocHJvdmlkZXJOYW1lLCBwcm92aWRlck9wdHMpIHtcblx0XHRcdHJleiA9IHVybC5tYXRjaChwcm92aWRlck9wdHMubWF0Y2hlcik7XG5cblx0XHRcdGlmICghcmV6KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dHlwZSA9IHByb3ZpZGVyT3B0cy50eXBlO1xuXHRcdFx0cHJvdmlkZXIgPSBwcm92aWRlck5hbWU7XG5cdFx0XHRwYXJhbU9iaiA9IHt9O1xuXG5cdFx0XHRpZiAocHJvdmlkZXJPcHRzLnBhcmFtUGxhY2UgJiYgcmV6W3Byb3ZpZGVyT3B0cy5wYXJhbVBsYWNlXSkge1xuXHRcdFx0XHR1cmxQYXJhbXMgPSByZXpbcHJvdmlkZXJPcHRzLnBhcmFtUGxhY2VdO1xuXG5cdFx0XHRcdGlmICh1cmxQYXJhbXNbMF0gPT0gXCI/XCIpIHtcblx0XHRcdFx0XHR1cmxQYXJhbXMgPSB1cmxQYXJhbXMuc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dXJsUGFyYW1zID0gdXJsUGFyYW1zLnNwbGl0KFwiJlwiKTtcblxuXHRcdFx0XHRmb3IgKHZhciBtID0gMDsgbSA8IHVybFBhcmFtcy5sZW5ndGg7ICsrbSkge1xuXHRcdFx0XHRcdHZhciBwID0gdXJsUGFyYW1zW21dLnNwbGl0KFwiPVwiLCAyKTtcblxuXHRcdFx0XHRcdGlmIChwLmxlbmd0aCA9PSAyKSB7XG5cdFx0XHRcdFx0XHRwYXJhbU9ialtwWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChwWzFdLnJlcGxhY2UoL1xcKy9nLCBcIiBcIikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRwYXJhbXMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgcHJvdmlkZXJPcHRzLnBhcmFtcywgaXRlbS5vcHRzW3Byb3Z
6780pZGVyTmFtZV0sIHBhcmFtT2JqKTtcblxuXHRcdFx0dXJsID1cblx0XHRcdFx0JC50eXBlKHByb3ZpZGVyT3B0cy51cmwpID09PSBcImZ1bmN0aW9uXCIgPyBwcm92aWRlck9wdHMudXJsLmNhbGwodGhpcywgcmV6LCBwYXJhbXMsIGl0ZW0pIDogZm9ybWF0KHByb3ZpZGVyT3B0cy51cmwsIHJleiwgcGFyYW1zKTtcblxuXHRcdFx0dGh1bWIgPVxuXHRcdFx0XHQkLnR5cGUocHJvdmlkZXJPcHRzLnRodW1iKSA9PT0gXCJmdW5jdGlvblwiID8gcHJvdmlkZXJPcHRzLnRodW1iLmNhbGwodGhpcywgcmV6LCBwYXJhbXMsIGl0ZW0pIDogZm9ybWF0KHByb3ZpZGVyT3B0cy50aHVtYiwgcmV6KTtcblxuXHRcdFx0aWYgKHByb3ZpZGVyTmFtZSA9PT0gXCJ5b3V0dWJlXCIpIHtcblx0XHRcdFx0dXJsID0gdXJsLnJlcGxhY2UoLyZ0PSgoXFxkKyltKT8oXFxkKylzLywgZnVuY3Rpb24gKG1hdGNoLCBwMSwgbSwgcykge1xuXHRcdFx0XHRcdHJldHVybiBcIiZzdGFydD1cIiArICgobSA/IHBhcnNlSW50KG0sIDEwKSAqIDYwIDogMCkgKyBwYXJzZUludChzLCAxMCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAocHJvdmlkZXJOYW1lID09PSBcInZpbWVvXCIpIHtcblx0XHRcdFx0dXJsID0gdXJsLnJlcGxhY2UoXCImJTIzXCIsIFwiI1wiKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXG5cdFx0Ly8gSWYgaXQgaXMgZm91bmQsIHRoZW4gY2hhbmdlIGNvbnRlbnQgdHlwZSBhbmQgdXBkYXRlIHRoZSB1cmxcblxuXHRcdGlmICh0eXBlKSB7XG5cdFx0XHRpZiAoIWl0ZW0ub3B0cy50aHVtYiAmJiAhKGl0ZW0ub3B0cy4kdGh1bWIgJiYgaXRlbS5vcHRzLiR0aHVtYi5sZW5ndGgpKSB7XG5cdFx0XHRcdGl0ZW0ub3B0cy50aHVtYiA9IHRodW1iO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZSA9PT0gXCJpZnJhbWVcIikge1xuXHRcdFx0XHRpdGVtLm9wdHMgPSAkLmV4dGVuZCh0cnVlLCBpdGVtLm9wdHMsIHtcblx0XHRcdFx0XHRpZnJhbWU6IHtcblx0XHRcdFx0XHRcdHByZWxvYWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0YXR0cjoge1xuXHRcdFx0XHRcdFx0XHRzY3JvbGxpbmc6IFwibm9cIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdCQuZXh0ZW5kKGl0ZW0sIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0c3JjOiB1cmwsXG5cdFx0XHRcdG9yaWdTcmM6IGl0ZW0uc3JjLFxuXHRcdFx0XHRjb250ZW50U291cmNlOiBwcm92aWRlcixcblx0XHRcdFx0Y29udGVudFR5cGU6IHR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiaW1hZ2VcIiA6IHByb3ZpZGVyID09IFwiZ21hcF9wbGFjZVwiIHx8IHByb3ZpZGVyID09IFwiZ21hcF9zZWFyY2hcIiA/IFwibWFwXCIgOiBcInZpZGVvXCJcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAodXJsKSB7XG5cdFx0XHRpdGVtLnR5cGUgPSBpdGVtLm9wdHMuZGVmYXVsdFR5cGU7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBMb2FkIFlvdVR1YmUvVmlkZW8gQVBJIG9uIHJlcXVlc3QgdG8gZGV0ZWN0IHdoZW4gdmlkZW8gZmluaXNoZWQgcGxheWluZ1xuXHR2YXIgVmlkZW9BUElMb2FkZXIgPSB7XG5cdFx0eW91dHViZToge1xuXHRcdFx0c3JjOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGlcIixcblx0XHRcdGNsYXNzOiBcIllUXCIsXG5cdFx0XHRsb2FkaW5nOiBmYWxzZSxcblx0XHRcdGxvYWRlZDogZmFsc2Vcblx0XHR9LFxuXG5cdFx0dmltZW86IHtcblx0XHRcdHNyYzogXCJodHRwczovL3BsYXllci52aW1lby5jb20vYXBpL3BsYXllci5qc1wiLFxuXHRcdFx0Y2xhc3M6IFwiVmltZW9cIixcblx0XHRcdGxvYWRpbmc6IGZhbHNlLFxuXHRcdFx0bG9hZGVkOiBmYWxzZVxuXHRcdH0sXG5cblx0XHRsb2FkOiBmdW5jdGlvbiAodmVuZG9yKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzLFxuXHRcdFx0XHRzY3JpcHQ7XG5cblx0XHRcdGlmICh0aGlzW3ZlbmRvcl0ubG9hZGVkKSB7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdF90aGlzLmRvbmUodmVuZG9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXNbdmVuZG9yXS5sb2FkaW5nKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpc1t2ZW5kb3JdLmxvYWRpbmcgPSB0cnVlO1xuXG5cdFx0XHRzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuXHRcdFx0c2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xuXHRcdFx0c2NyaXB0LnNyYyA9IHRoaXNbdmVuZG9yXS5zcmM7XG5cblx0XHRcdGlmICh2ZW5kb3IgPT09IFwieW91dHViZVwiKSB7XG5cdFx0XHRcdHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRfdGhpc1t2ZW5kb3JdLmxvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0X3RoaXMuZG9uZSh2ZW5kb3IpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRfdGhpc1t2ZW5kb3JdLmxvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0X3RoaXMuZG9uZSh2ZW5kb3IpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cdFx0fSxcblx0XHRkb25lOiBmdW5jdGlvbiAodmVuZG9yKSB7XG5cdFx0XHR2YXIgaW5zdGFuY2UsICRlbCwgcGxheWVyO1xuXG5cdFx0XHRpZiAodmVuZG9yID09PSBcInlvdXR1YmVcIikge1xuXHRcdFx0XHRkZWxldGUgd2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5O1xuXHRcdFx0fVxuXG5cdFx0XHRpbnN0YW5jZSA9ICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRcdCRlbCA9IGluc3RhbmNlLmN1cnJlbnQuJGNvbnRlbnQuZmluZChcImlmcmFtZVwiKTtcblxuXHRcdFx0XHRpZiAodmVuZG9yID09PSBcInlvdXR1YmVcIiAmJiBZVCAhPT0gdW5kZWZpbmVkICYmIFlUKSB7XG5cdFx0XHRcdFx0cGxheWVyID0gbmV3IFlULlBsYXllcigkZWwuYXR0cihcImlkXCIpLCB7XG5cdFx0XHRcdFx0XHRldmVudHM6IHtcblx0XHRcdFx0XHRcdFx0b25TdGF0ZUNoYW5nZTogZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZS5kYXRhID09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGluc3RhbmNlLm5leHQoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmICh2ZW5kb3IgPT09IFwidmltZW9cIiAmJiBWaW1lbyAhPT0gdW5kZWZpbmVkICYmIFZpbWVvKSB7XG5cdFx0XHRcdFx0cGxheWVyID0gbmV3IFZpbWVvLlBsYXllcigkZWwpO1xuXG5cdFx0XHRcdFx0cGxheWVyLm9uKFwiZW5kZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aW5zdGFuY2UubmV4dCgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdCQoZG9jdW1lbnQpLm9uKHtcblx0XHRcImFmdGVyU2hvdy5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UsIGN1cnJlbnQpIHtcblx0XHRcdGlmIChpbnN0YW5jZS5ncm91cC5sZW5ndGggPiAxICYmIChjdXJyZW50LmNvbnRlbn
6780RTb3VyY2UgPT09IFwieW91dHViZVwiIHx8IGN1cnJlbnQuY29udGVudFNvdXJjZSA9PT0gXCJ2aW1lb1wiKSkge1xuXHRcdFx0XHRWaWRlb0FQSUxvYWRlci5sb2FkKGN1cnJlbnQuY29udGVudFNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn0pKGpRdWVyeSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEd1ZXN0dXJlc1xuLy8gQWRkcyB0b3VjaCBndWVzdHVyZXMsIGhhbmRsZXMgY2xpY2sgYW5kIHRhcCBldmVudHNcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciByZXF1ZXN0QUZyYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdC8vIGlmIGFsbCBlbHNlIGZhaWxzLCB1c2Ugc2V0VGltZW91dFxuXHRcdFx0ZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdFx0XHRcdHJldHVybiB3aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDYwKTtcblx0XHRcdH1cblx0XHQpO1xuXHR9KSgpO1xuXG5cdHZhciBjYW5jZWxBRnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHR3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cub0NhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHRmdW5jdGlvbiAoaWQpIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dChpZCk7XG5cdFx0XHR9XG5cdFx0KTtcblx0fSkoKTtcblxuXHR2YXIgZ2V0UG9pbnRlclhZID0gZnVuY3Rpb24gKGUpIHtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cblx0XHRlID0gZS5vcmlnaW5hbEV2ZW50IHx8IGUgfHwgd2luZG93LmU7XG5cdFx0ZSA9IGUudG91Y2hlcyAmJiBlLnRvdWNoZXMubGVuZ3RoID8gZS50b3VjaGVzIDogZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/IGUuY2hhbmdlZFRvdWNoZXMgOiBbZV07XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZSkge1xuXHRcdFx0aWYgKGVba2V5XS5wYWdlWCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdFx0eDogZVtrZXldLnBhZ2VYLFxuXHRcdFx0XHRcdHk6IGVba2V5XS5wYWdlWVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoZVtrZXldLmNsaWVudFgpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goe1xuXHRcdFx0XHRcdHg6IGVba2V5XS5jbGllbnRYLFxuXHRcdFx0XHRcdHk6IGVba2V5XS5jbGllbnRZXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0dmFyIGRpc3RhbmNlID0gZnVuY3Rpb24gKHBvaW50MiwgcG9pbnQxLCB3aGF0KSB7XG5cdFx0aWYgKCFwb2ludDEgfHwgIXBvaW50Mikge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0aWYgKHdoYXQgPT09IFwieFwiKSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQyLnggLSBwb2ludDEueDtcblx0XHR9IGVsc2UgaWYgKHdoYXQgPT09IFwieVwiKSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQyLnkgLSBwb2ludDEueTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHBvaW50Mi54IC0gcG9pbnQxLngsIDIpICsgTWF0aC5wb3cocG9pbnQyLnkgLSBwb2ludDEueSwgMikpO1xuXHR9O1xuXG5cdHZhciBpc0NsaWNrYWJsZSA9IGZ1bmN0aW9uICgkZWwpIHtcblx0XHRpZiAoXG5cdFx0XHQkZWwuaXMoJ2EsYXJlYSxidXR0b24sW3JvbGU9XCJidXR0b25cIl0saW5wdXQsbGFiZWwsc2VsZWN0LHN1bW1hcnksdGV4dGFyZWEsdmlkZW8sYXVkaW8saWZyYW1lJykgfHxcblx0XHRcdCQuaXNGdW5jdGlvbigkZWwuZ2V0KDApLm9uY2xpY2spIHx8XG5cdFx0XHQkZWwuZGF0YShcInNlbGVjdGFibGVcIilcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBhdHRyaWJ1dGVzIGxpa2UgZGF0YS1mYW5jeWJveC1uZXh0IG9yIGRhdGEtZmFuY3lib3gtY2xvc2Vcblx0XHRmb3IgKHZhciBpID0gMCwgYXR0cyA9ICRlbFswXS5hdHRyaWJ1dGVzLCBuID0gYXR0cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGlmIChhdHRzW2ldLm5vZGVOYW1lLnN1YnN0cigwLCAxNCkgPT09IFwiZGF0YS1mYW5jeWJveC1cIikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0dmFyIGhhc1Njcm9sbGJhcnMgPSBmdW5jdGlvbiAoZWwpIHtcblx0XHR2YXIgb3ZlcmZsb3dZID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpW1wib3ZlcmZsb3cteVwiXSxcblx0XHRcdG92ZXJmbG93WCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVtcIm92ZXJmbG93LXhcIl0sXG5cdFx0XHR2ZXJ0aWNhbCA9IChvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dZID09PSBcImF1dG9cIikgJiYgZWwuc2Nyb2xsSGVpZ2h0ID4gZWwuY2xpZW50SGVpZ2h0LFxuXHRcdFx0aG9yaXpvbnRhbCA9IChvdmVyZmxvd1ggPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dYID09PSBcImF1dG9cIikgJiYgZWwuc2Nyb2xsV2lkdGggPiBlbC5jbGllbnRXaWR0aDtcblxuXHRcdHJldHVybiB2ZXJ0aWNhbCB8fCBob3Jpem9udGFsO1xuXHR9O1xuXG5cdHZhciBpc1Njcm9sbGFibGUgPSBmdW5jdGlvbiAoJGVsKSB7XG5cdFx0dmFyIHJleiA9IGZhbHNlO1xuXG5cdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdHJleiA9IGhhc1Njcm9sbGJhcnMoJGVsLmdldCgwKSk7XG5cblx0XHRcdGlmIChyZXopIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdCRlbCA9ICRlbC5wYXJlbnQoKTtcblxuXHRcdFx0aWYgKCEkZWwubGVuZ3RoIHx8ICRlbC5oYXNDbGFzcyhcImZhbmN5Ym94LXN0YWdlXCIpIHx8ICRlbC5pcyhcImJvZHlcIikpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlejtcblx0fTtcblxuXHR2YXIgR3Vlc3R1cmVzID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0c2VsZi5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG5cdFx0c2VsZi4kYmcgPSBpbnN0YW5jZS4kcmVmcy5iZztcblx0XHRzZWxmLiRzdGFnZSA9IGluc3RhbmNlLiRyZWZzLnN0YWdlO1xuXHRcdHNlbGYuJGNvbn
6780RhaW5lciA9IGluc3RhbmNlLiRyZWZzLmNvbnRhaW5lcjtcblxuXHRcdHNlbGYuZGVzdHJveSgpO1xuXG5cdFx0c2VsZi4kY29udGFpbmVyLm9uKFwidG91Y2hzdGFydC5mYi50b3VjaCBtb3VzZWRvd24uZmIudG91Y2hcIiwgJC5wcm94eShzZWxmLCBcIm9udG91Y2hzdGFydFwiKSk7XG5cdH07XG5cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHNlbGYuJGNvbnRhaW5lci5vZmYoXCIuZmIudG91Y2hcIik7XG5cblx0XHQkKGRvY3VtZW50KS5vZmYoXCIuZmIudG91Y2hcIik7XG5cblx0XHRpZiAoc2VsZi5yZXF1ZXN0SWQpIHtcblx0XHRcdGNhbmNlbEFGcmFtZShzZWxmLnJlcXVlc3RJZCk7XG5cdFx0XHRzZWxmLnJlcXVlc3RJZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHNlbGYudGFwcGVkKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQoc2VsZi50YXBwZWQpO1xuXHRcdFx0c2VsZi50YXBwZWQgPSBudWxsO1xuXHRcdH1cblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9udG91Y2hzdGFydCA9IGZ1bmN0aW9uIChlKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0JHRhcmdldCA9ICQoZS50YXJnZXQpLFxuXHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0Y3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQsXG5cdFx0XHQkc2xpZGUgPSBjdXJyZW50LiRzbGlkZSxcblx0XHRcdCRjb250ZW50ID0gY3VycmVudC4kY29udGVudCxcblx0XHRcdGlzVG91Y2hEZXZpY2UgPSBlLnR5cGUgPT0gXCJ0b3VjaHN0YXJ0XCI7XG5cblx0XHQvLyBEbyBub3QgcmVzcG9uZCB0byBib3RoICh0b3VjaCBhbmQgbW91c2UpIGV2ZW50c1xuXHRcdGlmIChpc1RvdWNoRGV2aWNlKSB7XG5cdFx0XHRzZWxmLiRjb250YWluZXIub2ZmKFwibW91c2Vkb3duLmZiLnRvdWNoXCIpO1xuXHRcdH1cblxuXHRcdC8vIElnbm9yZSByaWdodCBjbGlja1xuXHRcdGlmIChlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmJ1dHRvbiA9PSAyKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWdub3JlIHRhcGluZyBvbiBsaW5rcywgYnV0dG9ucywgaW5wdXQgZWxlbWVudHNcblx0XHRpZiAoISRzbGlkZS5sZW5ndGggfHwgISR0YXJnZXQubGVuZ3RoIHx8IGlzQ2xpY2thYmxlKCR0YXJnZXQpIHx8IGlzQ2xpY2thYmxlKCR0YXJnZXQucGFyZW50KCkpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIElnbm9yZSBjbGlja3Mgb24gdGhlIHNjcm9sbGJhclxuXHRcdGlmICghJHRhcmdldC5pcyhcImltZ1wiKSAmJiBlLm9yaWdpbmFsRXZlbnQuY2xpZW50WCA+ICR0YXJnZXRbMF0uY2xpZW50V2lkdGggKyAkdGFyZ2V0Lm9mZnNldCgpLmxlZnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgY2xpY2tzIHdoaWxlIHpvb21pbmcgb3IgY2xvc2luZ1xuXHRcdGlmICghY3VycmVudCB8fCBpbnN0YW5jZS5pc0FuaW1hdGluZyB8fCBjdXJyZW50LiRzbGlkZS5oYXNDbGFzcyhcImZhbmN5Ym94LWFuaW1hdGVkXCIpKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0c2VsZi5yZWFsUG9pbnRzID0gc2VsZi5zdGFydFBvaW50cyA9IGdldFBvaW50ZXJYWShlKTtcblxuXHRcdGlmICghc2VsZi5zdGFydFBvaW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBvdGhlciBzY3JpcHRzIHRvIGNhdGNoIHRvdWNoIGV2ZW50IGlmIFwidG91Y2hcIiBpcyBzZXQgdG8gZmFsc2Vcblx0XHRpZiAoY3VycmVudC50b3VjaCkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHRzZWxmLnN0YXJ0RXZlbnQgPSBlO1xuXG5cdFx0c2VsZi5jYW5UYXAgPSB0cnVlO1xuXHRcdHNlbGYuJHRhcmdldCA9ICR0YXJnZXQ7XG5cdFx0c2VsZi4kY29udGVudCA9ICRjb250ZW50O1xuXHRcdHNlbGYub3B0cyA9IGN1cnJlbnQub3B0cy50b3VjaDtcblxuXHRcdHNlbGYuaXNQYW5uaW5nID0gZmFsc2U7XG5cdFx0c2VsZi5pc1N3aXBpbmcgPSBmYWxzZTtcblx0XHRzZWxmLmlzWm9vbWluZyA9IGZhbHNlO1xuXHRcdHNlbGYuaXNTY3JvbGxpbmcgPSBmYWxzZTtcblx0XHRzZWxmLmNhblBhbiA9IGluc3RhbmNlLmNhblBhbigpO1xuXG5cdFx0c2VsZi5zdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0XHRzZWxmLmRpc3RhbmNlWCA9IHNlbGYuZGlzdGFuY2VZID0gc2VsZi5kaXN0YW5jZSA9IDA7XG5cblx0XHRzZWxmLmNhbnZhc1dpZHRoID0gTWF0aC5yb3VuZCgkc2xpZGVbMF0uY2xpZW50V2lkdGgpO1xuXHRcdHNlbGYuY2FudmFzSGVpZ2h0ID0gTWF0aC5yb3VuZCgkc2xpZGVbMF0uY2xpZW50SGVpZ2h0KTtcblxuXHRcdHNlbGYuY29udGVudExhc3RQb3MgPSBudWxsO1xuXHRcdHNlbGYuY29udGVudFN0YXJ0UG9zID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoc2VsZi4kY29udGVudCkgfHwge1xuXHRcdFx0dG9wOiAwLFxuXHRcdFx0bGVmdDogMFxuXHRcdH07XG5cdFx0c2VsZi5zbGlkZXJTdGFydFBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKCRzbGlkZSk7XG5cblx0XHQvLyBTaW5jZSBwb3NpdGlvbiB3aWxsIGJlIGFic29sdXRlLCBidXQgd2UgbmVlZCB0byBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBzdGFnZVxuXHRcdHNlbGYuc3RhZ2VQb3MgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShpbnN0YW5jZS4kcmVmcy5zdGFnZSk7XG5cblx0XHRzZWxmLnNsaWRlclN0YXJ0UG9zLnRvcCAtPSBzZWxmLnN0YWdlUG9zLnRvcDtcblx0XHRzZWxmLnNsaWRlclN0YXJ0UG9zLmxlZnQgLT0gc2VsZi5zdGFnZVBvcy5sZWZ0O1xuXG5cdFx0c2VsZi5jb250ZW50U3RhcnRQb3MudG9wIC09IHNlbGYuc3RhZ2VQb3MudG9wO1xuXHRcdHNlbGYuY29udGVudFN0YXJ0UG9zLmxlZnQgLT0gc2VsZi5zdGFnZVBvcy5sZWZ0O1xuXG5cdFx0JChkb2N1bWVudClcblx0XHRcdC5vZmYoXCIuZmIudG91Y2hcIilcblx0XHRcdC5vbihpc1RvdWNoRGV2aWNlID8gXCJ0b3VjaGVuZC5mYi50b3VjaCB0b3VjaGNhbmNlbC5mYi50b3VjaFwiIDogXCJtb3VzZXVwLmZiLnRvdWNoIG1vdXNlbGVhdmUuZmIudG91Y2hcIiwgJC5wcm94eShzZWxmLCBcIm9udG91Y2hlbmRcIikpXG5cdFx0XHQub24oaXNUb3VjaERldmljZSA/IFwidG91Y2htb3ZlLmZiLnRvdWNoXCIgOiBcIm1vdXNlbW92ZS5mYi50b3VjaFwiLCAkLnByb3h5KHNlbGYsIFwib250b3VjaG1vdmVcIikpO1xuXG5cdFx0aWYgKCQuZmFuY3lib3guaXNNb2JpbGUpIHtcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgc2VsZi5vbnNjcm9sbCwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2tpcCBpZiBjbGlja2VkIG91dHNpZGUgdGhlIHNsaWRpbmcgYXJlYVxuXHRcdGlmICghKHNlbGYub3B0cyB8fCBzZWxmLmNhblBhbikgfHwgISgkdGFyZ2V0LmlzKHNlbGYuJHN0YWdlKSB8fCBzZWxmLiRzdGFnZS5maW5kKCR0YXJnZXQpLmxlbmd0aCkpIHtcblx0XHRcdGlmICgk
6780dGFyZ2V0LmlzKFwiLmZhbmN5Ym94LWltYWdlXCIpKSB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCEoJC5mYW5jeWJveC5pc01vYmlsZSAmJiAkdGFyZ2V0LnBhcmVudHMoXCIuZmFuY3lib3gtY2FwdGlvblwiKS5sZW5ndGgpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRzZWxmLmlzU2Nyb2xsYWJsZSA9IGlzU2Nyb2xsYWJsZSgkdGFyZ2V0KSB8fCBpc1Njcm9sbGFibGUoJHRhcmdldC5wYXJlbnQoKSk7XG5cblx0XHQvLyBDaGVjayBpZiBlbGVtZW50IGlzIHNjcm9sbGFibGUgYW5kIHRyeSB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgKHNjcm9sbGluZylcblx0XHRpZiAoISgkLmZhbmN5Ym94LmlzTW9iaWxlICYmIHNlbGYuaXNTY3JvbGxhYmxlKSkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblxuXHRcdC8vIE9uZSBmaW5nZXIgb3IgbW91c2UgY2xpY2sgLSBzd2lwZSBvciBwYW4gYW4gaW1hZ2Vcblx0XHRpZiAoc2VsZi5zdGFydFBvaW50cy5sZW5ndGggPT09IDEgfHwgY3VycmVudC5oYXNFcnJvcikge1xuXHRcdFx0aWYgKHNlbGYuY2FuUGFuKSB7XG5cdFx0XHRcdCQuZmFuY3lib3guc3RvcChzZWxmLiRjb250ZW50KTtcblxuXHRcdFx0XHRzZWxmLmlzUGFubmluZyA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmlzU3dpcGluZyA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuJGNvbnRhaW5lci5hZGRDbGFzcyhcImZhbmN5Ym94LWlzLWdyYWJiaW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIFR3byBmaW5nZXJzIC0gem9vbSBpbWFnZVxuXHRcdGlmIChzZWxmLnN0YXJ0UG9pbnRzLmxlbmd0aCA9PT0gMiAmJiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAoY3VycmVudC5pc0xvYWRlZCB8fCBjdXJyZW50LiRnaG9zdCkpIHtcblx0XHRcdHNlbGYuY2FuVGFwID0gZmFsc2U7XG5cdFx0XHRzZWxmLmlzU3dpcGluZyA9IGZhbHNlO1xuXHRcdFx0c2VsZi5pc1Bhbm5pbmcgPSBmYWxzZTtcblxuXHRcdFx0c2VsZi5pc1pvb21pbmcgPSB0cnVlO1xuXG5cdFx0XHQkLmZhbmN5Ym94LnN0b3Aoc2VsZi4kY29udGVudCk7XG5cblx0XHRcdHNlbGYuY2VudGVyUG9pbnRTdGFydFggPSAoc2VsZi5zdGFydFBvaW50c1swXS54ICsgc2VsZi5zdGFydFBvaW50c1sxXS54KSAqIDAuNSAtICQod2luZG93KS5zY3JvbGxMZWZ0KCk7XG5cdFx0XHRzZWxmLmNlbnRlclBvaW50U3RhcnRZID0gKHNlbGYuc3RhcnRQb2ludHNbMF0ueSArIHNlbGYuc3RhcnRQb2ludHNbMV0ueSkgKiAwLjUgLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG5cblx0XHRcdHNlbGYucGVyY2VudGFnZU9mSW1hZ2VBdFBpbmNoUG9pbnRYID0gKHNlbGYuY2VudGVyUG9pbnRTdGFydFggLSBzZWxmLmNvbnRlbnRTdGFydFBvcy5sZWZ0KSAvIHNlbGYuY29udGVudFN0YXJ0UG9zLndpZHRoO1xuXHRcdFx0c2VsZi5wZXJjZW50YWdlT2ZJbWFnZUF0UGluY2hQb2ludFkgPSAoc2VsZi5jZW50ZXJQb2ludFN0YXJ0WSAtIHNlbGYuY29udGVudFN0YXJ0UG9zLnRvcCkgLyBzZWxmLmNvbnRlbnRTdGFydFBvcy5oZWlnaHQ7XG5cblx0XHRcdHNlbGYuc3RhcnREaXN0YW5jZUJldHdlZW5GaW5nZXJzID0gZGlzdGFuY2Uoc2VsZi5zdGFydFBvaW50c1swXSwgc2VsZi5zdGFydFBvaW50c1sxXSk7XG5cdFx0fVxuXHR9O1xuXG5cdEd1ZXN0dXJlcy5wcm90b3R5cGUub25zY3JvbGwgPSBmdW5jdGlvbiAoZSkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHNlbGYuaXNTY3JvbGxpbmcgPSB0cnVlO1xuXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBzZWxmLm9uc2Nyb2xsLCB0cnVlKTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9udG91Y2htb3ZlID0gZnVuY3Rpb24gKGUpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHQvLyBNYWtlIHN1cmUgdXNlciBoYXMgbm90IHJlbGVhc2VkIG92ZXIgaWZyYW1lIG9yIGRpc2FibGVkIGVsZW1lbnRcblx0XHRpZiAoZS5vcmlnaW5hbEV2ZW50LmJ1dHRvbnMgIT09IHVuZGVmaW5lZCAmJiBlLm9yaWdpbmFsRXZlbnQuYnV0dG9ucyA9PT0gMCkge1xuXHRcdFx0c2VsZi5vbnRvdWNoZW5kKGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChzZWxmLmlzU2Nyb2xsaW5nKSB7XG5cdFx0XHRzZWxmLmNhblRhcCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHNlbGYubmV3UG9pbnRzID0gZ2V0UG9pbnRlclhZKGUpO1xuXG5cdFx0aWYgKCEoc2VsZi5vcHRzIHx8IHNlbGYuY2FuUGFuKSB8fCAhc2VsZi5uZXdQb2ludHMubGVuZ3RoIHx8ICFzZWxmLm5ld1BvaW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIShzZWxmLmlzU3dpcGluZyAmJiBzZWxmLmlzU3dpcGluZyA9PT0gdHJ1ZSkpIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cblx0XHRzZWxmLmRpc3RhbmNlWCA9IGRpc3RhbmNlKHNlbGYubmV3UG9pbnRzWzBdLCBzZWxmLnN0YXJ0UG9pbnRzWzBdLCBcInhcIik7XG5cdFx0c2VsZi5kaXN0YW5jZVkgPSBkaXN0YW5jZShzZWxmLm5ld1BvaW50c1swXSwgc2VsZi5zdGFydFBvaW50c1swXSwgXCJ5XCIpO1xuXG5cdFx0c2VsZi5kaXN0YW5jZSA9IGRpc3RhbmNlKHNlbGYubmV3UG9pbnRzWzBdLCBzZWxmLnN0YXJ0UG9pbnRzWzBdKTtcblxuXHRcdC8vIFNraXAgZmFsc2Ugb250b3VjaG1vdmUgZXZlbnRzIChDaHJvbWUpXG5cdFx0aWYgKHNlbGYuZGlzdGFuY2UgPiAwKSB7XG5cdFx0XHRpZiAoc2VsZi5pc1N3aXBpbmcpIHtcblx0XHRcdFx0c2VsZi5vblN3aXBlKGUpO1xuXHRcdFx0fSBlbHNlIGlmIChzZWxmLmlzUGFubmluZykge1xuXHRcdFx0XHRzZWxmLm9uUGFuKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHNlbGYuaXNab29taW5nKSB7XG5cdFx0XHRcdHNlbGYub25ab29tKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdEd1ZXN0dXJlcy5wcm90b3R5cGUub25Td2lwZSA9IGZ1bmN0aW9uIChlKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0c3dpcGluZyA9IHNlbGYuaXNTd2lwaW5nLFxuXHRcdFx0bGVmdCA9IHNlbGYuc2xpZGVyU3RhcnRQb3MubGVmdCB8fCAwLFxuXHRcdFx0YW5nbGU7XG5cblx0XHQvLyBJZiBkaXJlY3Rpb24gaXMgbm90IHlldCBkZXRlcm1pbmVkXG5cdFx0aWYgKHN3aXBpbmcgPT09IHRydWUpIHtcblx0XHRcdC8vIFdlIG5lZWQgYXQgbGVhc3QgMTBweCBkaXN0YW5jZSB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIGFuIGFuZ2xlXG5cdFx0XHRpZiAoTWF0aC5hYnMoc2VsZi5kaXN0YW5jZSkgPiAxMCkge1xuXHRcdFx0XHRzZWxmLmNhblRhcCA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChpbnN0YW5jZS5ncm91cC5sZW5ndGggPCAyICYmIHNlbGYub3B0cy52ZXJ0aWNhbCkge1xuXHRcdFx0XHRcdHNlbGYuaXNTd2lwaW5nID0gXCJ5XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaW5zdGFuY2UuaXNEcmFnZ2luZyB8fCBzZWxmLm9wdHMudmVydGljYWwgPT09IGZhbHNlIHx8IChzZWxmLm9wdHMudmVydGljYWwgPT09IFwiYXV0b1wiICYmICQod2luZG93KS53aWR0aCgpID4gODAwKSkge1xuXHRcdFx0XHRcdHNlbGYuaXNTd2lwaW5nID0gXCJ4XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YW5nbGUgPSBNYXRoLmFicygoTWF0aC5hdGFuMihzZWxmLmRpc3RhbmNlWSwgc2VsZi5kaXN0YW5jZVgpICogMTgwKSAvIE1hdGguUEkpO1xuXG5cdFx0XHRcdFx0c2VsZi5pc1N3aXBpbmcgPSBhbmdsZSA+IDQ1ICYmIGFuZ2xlIDwgMTM1ID8gXCJ5XCIgOiBcInhcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzZWxmLmlzU3dpcGluZyA9PT0gXCJ5XCIgJiYgJC5mYW5jeWJveC5pc01vYmlsZSAmJiBzZWxmLmlzU2Nyb2xsYWJsZSkge1xuXHRcdFx0XHRcdHNlbGYuaXNTY3JvbGxpbmcgPSB0cnVlO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW5zdGFuY2UuaXNEcmFnZ2luZyA9IHNlbGYuaXNTd2lwaW5nO1xuXG5cdFx0XHRcdC8vIFJlc2V0IHBvaW50cyB0byBhdm9pZCBqdW1waW5nLCBiZWNhdXNlIHdlIGRyb3BwZWQgZmlyc3Qgc3dpcGVzIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGVcblx0XHRcdFx0c2VsZi5zdGFydFBvaW50cyA9IHNlbGYubmV3UG9pbnRzO1xuXG5cdFx0XHRcdCQuZWFjaChpbnN0YW5jZS5zbGlkZXMsIGZ1bmN0aW9uIChpbmRleCwgc2xpZGUpIHtcblx0XHRcdFx0XHR2YXIgc2xpZGVQb3MsIHN0YWdlUG9zO1xuXG5cdFx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKHNsaWRlLiRzbGlkZSk7XG5cblx0XHRcdFx0XHRzbGlkZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHNsaWRlLiRzbGlkZSk7XG5cdFx0XHRcdFx0c3RhZ2VQb3MgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShpbnN0YW5jZS4kcmVmcy5zdGFnZSk7XG5cblx0XHRcdFx0XHRzbGlkZS4kc2xpZGVcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm06IFwiXCIsXG5cdFx0XHRcdFx0XHRcdG9wYWNpdHk6IFwiXCIsXG5cdFx0XHRcdFx0XHRcdFwidHJhbnNpdGlvbi1kdXJhdGlvblwiOiBcIlwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtYW5pbWF0ZWRcIilcblx0XHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhmdW5jdGlvbiAoaW5kZXgsIGNsYXNzTmFtZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKGNsYXNzTmFtZS5tYXRjaCgvKF58XFxzKWZhbmN5Ym94LWZ4LVxcUysvZykgfHwgW10pLmpvaW4oXCIgXCIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoc2xpZGUucG9zID09PSBpbnN0YW5jZS5jdXJyZW50LnBvcykge1xuXHRcdFx0XHRcdFx0c2VsZi5zbGlkZXJTdGFydFBvcy50b3AgPSBzbGlkZVBvcy50b3AgLSBzdGFnZVBvcy50b3A7XG5cdFx0XHRcdFx0XHRzZWxmLnNsaWRlclN0YXJ0UG9zLmxlZnQgPSBzbGlkZVBvcy5sZWZ0IC0gc3RhZ2
6780VQb3MubGVmdDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkLmZhbmN5Ym94LnNldFRyYW5zbGF0ZShzbGlkZS4kc2xpZGUsIHtcblx0XHRcdFx0XHRcdHRvcDogc2xpZGVQb3MudG9wIC0gc3RhZ2VQb3MudG9wLFxuXHRcdFx0XHRcdFx0bGVmdDogc2xpZGVQb3MubGVmdCAtIHN0YWdlUG9zLmxlZnRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gU3RvcCBzbGlkZXNob3dcblx0XHRcdFx0aWYgKGluc3RhbmNlLlNsaWRlU2hvdyAmJiBpbnN0YW5jZS5TbGlkZVNob3cuaXNBY3RpdmUpIHtcblx0XHRcdFx0XHRpbnN0YW5jZS5TbGlkZVNob3cuc3RvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTdGlja3kgZWRnZXNcblx0XHRpZiAoc3dpcGluZyA9PSBcInhcIikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRzZWxmLmRpc3RhbmNlWCA+IDAgJiZcblx0XHRcdFx0KHNlbGYuaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIDwgMiB8fCAoc2VsZi5pbnN0YW5jZS5jdXJyZW50LmluZGV4ID09PSAwICYmICFzZWxmLmluc3RhbmNlLmN1cnJlbnQub3B0cy5sb29wKSlcblx0XHRcdCkge1xuXHRcdFx0XHRsZWZ0ID0gbGVmdCArIE1hdGgucG93KHNlbGYuZGlzdGFuY2VYLCAwLjgpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0c2VsZi5kaXN0YW5jZVggPCAwICYmXG5cdFx0XHRcdChzZWxmLmluc3RhbmNlLmdyb3VwLmxlbmd0aCA8IDIgfHxcblx0XHRcdFx0XHQoc2VsZi5pbnN0YW5jZS5jdXJyZW50LmluZGV4ID09PSBzZWxmLmluc3RhbmNlLmdyb3VwLmxlbmd0aCAtIDEgJiYgIXNlbGYuaW5zdGFuY2UuY3VycmVudC5vcHRzLmxvb3ApKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxlZnQgPSBsZWZ0IC0gTWF0aC5wb3coLXNlbGYuZGlzdGFuY2VYLCAwLjgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGVmdCA9IGxlZnQgKyBzZWxmLmRpc3RhbmNlWDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRzZWxmLnNsaWRlckxhc3RQb3MgPSB7XG5cdFx0XHR0b3A6IHN3aXBpbmcgPT0gXCJ4XCIgPyAwIDogc2VsZi5zbGlkZXJTdGFydFBvcy50b3AgKyBzZWxmLmRpc3RhbmNlWSxcblx0XHRcdGxlZnQ6IGxlZnRcblx0XHR9O1xuXG5cdFx0aWYgKHNlbGYucmVxdWVzdElkKSB7XG5cdFx0XHRjYW5jZWxBRnJhbWUoc2VsZi5yZXF1ZXN0SWQpO1xuXG5cdFx0XHRzZWxmLnJlcXVlc3RJZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0c2VsZi5yZXF1ZXN0SWQgPSByZXF1ZXN0QUZyYW1lKGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChzZWxmLnNsaWRlckxhc3RQb3MpIHtcblx0XHRcdFx0JC5lYWNoKHNlbGYuaW5zdGFuY2Uuc2xpZGVzLCBmdW5jdGlvbiAoaW5kZXgsIHNsaWRlKSB7XG5cdFx0XHRcdFx0dmFyIHBvcyA9IHNsaWRlLnBvcyAtIHNlbGYuaW5zdGFuY2UuY3VyclBvcztcblxuXHRcdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKHNsaWRlLiRzbGlkZSwge1xuXHRcdFx0XHRcdFx0dG9wOiBzZWxmLnNsaWRlckxhc3RQb3MudG9wLFxuXHRcdFx0XHRcdFx0bGVmdDogc2VsZi5zbGlkZXJMYXN0UG9zLmxlZnQgKyBwb3MgKiBzZWxmLmNhbnZhc1dpZHRoICsgcG9zICogc2xpZGUub3B0cy5ndXR0ZXJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi4kY29udGFpbmVyLmFkZENsYXNzKFwiZmFuY3lib3gtaXMtc2xpZGluZ1wiKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9uUGFuID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdC8vIFByZXZlbnQgYWNjaWRlbnRhbCBtb3ZlbWVudCAoc29tZXRpbWVzLCB3aGVuIHRhcHBpbmcgY2FzdWFsbHksIGZpbmdlciBjYW4gbW92ZSBhIGJpdClcblx0XHRpZiAoZGlzdGFuY2Uoc2VsZi5uZXdQb2ludHNbMF0sIHNlbGYucmVhbFBvaW50c1swXSkgPCAoJC5mYW5jeWJveC5pc01vYmlsZSA/IDEwIDogNSkpIHtcblx0XHRcdHNlbGYuc3RhcnRQb2ludHMgPSBzZWxmLm5ld1BvaW50cztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzZWxmLmNhblRhcCA9IGZhbHNlO1xuXG5cdFx0c2VsZi5jb250ZW50TGFzdFBvcyA9IHNlbGYubGltaXRNb3ZlbWVudCgpO1xuXG5cdFx0aWYgKHNlbGYucmVxdWVzdElkKSB7XG5cdFx0XHRjYW5jZWxBRnJhbWUoc2VsZi5yZXF1ZXN0SWQpO1xuXHRcdH1cblxuXHRcdHNlbGYucmVxdWVzdElkID0gcmVxdWVzdEFGcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHQkLmZhbmN5Ym94LnNldFRyYW5zbGF0ZShzZWxmLiRjb250ZW50LCBzZWxmLmNvbnRlbnRMYXN0UG9zKTtcblx0XHR9KTtcblx0fTtcblxuXHQvLyBNYWtlIHBhbm5pbmcgc3RpY2t5IHRvIHRoZSBlZGdlc1xuXHRHdWVzdHVyZXMucHJvdG90eXBlLmxpbWl0TW92ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0dmFyIGNhbnZhc1dpZHRoID0gc2VsZi5jYW52YXNXaWR0aDtcblx0XHR2YXIgY2FudmFzSGVpZ2h0ID0gc2VsZi5jYW52YXNIZWlnaHQ7XG5cblx0XHR2YXIgZGlzdGFuY2VYID0gc2VsZi5kaXN0YW5jZVg7XG5cdFx0dmFyIGRpc3RhbmNlWSA9IHNlbGYuZGlzdGFuY2VZO1xuXG5cdFx0dmFyIGNvbnRlbnRTdGFydFBvcyA9IHNlbGYuY29udGVudFN0YXJ0UG9zO1xuXG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRYID0gY29udGVudFN0YXJ0UG9zLmxlZnQ7XG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRZID0gY29udGVudFN0YXJ0UG9zLnRvcDtcblxuXHRcdHZhciBjdXJyZW50V2lkdGggPSBjb250ZW50U3RhcnRQb3Mud2lkdGg7XG5cdFx0dmFyIGN1cnJlbnRIZWlnaHQgPSBjb250ZW50U3RhcnRQb3MuaGVpZ2h0O1xuXG5cdFx0dmFyIG1pblRyYW5zbGF0ZVgsIG1pblRyYW5zbGF0ZVksIG1heFRyYW5zbGF0ZVgsIG1heFRyYW5zbGF0ZVksIG5ld09mZnNldFgsIG5ld09mZnNldFk7XG5cblx0XHRpZiAoY3VycmVudFdpZHRoID4gY2FudmFzV2lkdGgpIHtcblx0XHRcdG5ld09mZnNldFggPSBjdXJyZW50T2Zmc2V0WCArIGRpc3RhbmNlWDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV3T2Zmc2V0WCA9IGN1cnJlbnRPZmZzZXRYO1xuXHRcdH1cblxuXHRcdG5ld09mZnNldFkgPSBjdXJyZW50T2Zmc2V0WSArIGRpc3RhbmNlWTtcblxuXHRcdC8vIFNsb3cgZG93biBwcm9wb3J0aW9uYWxseSB0byB0cmF2ZWxlZCBkaXN0YW5jZVxuXHRcdG1pblRyYW5zbGF0ZVggPSBNYXRoLm1heCgwLCBjYW52YXNXaWR0aCAqIDAuNSAtIGN1cnJlbnRXaWR0aCAqIDAuNSk7XG5cdFx0bWluVHJhbnNsYXRlWSA9IE1hdGgubWF4KDAsIGNhbnZhc0hlaWdodCAqIDAuNSAtIGN1cnJlbnRIZWlnaHQgKiAwLjUpO1xuXG5cdFx0bWF4VHJhbnNsYXRlWCA9IE1hdGgubWluKGNhbnZhc1dpZHRoIC0gY3VycmVudFdpZHRoLCBjYW52YXNXaWR0aCAqIDAuNSAtIGN1cnJlbnRXaWR0aCAqIDAuNSk7XG5cdFx0bWF4VHJhbnNsYXRlWSA9IE1hdGgubWluKGNhbnZhc0hlaWdodCAtIGN1cnJlbnRIZWlnaHQsIGNhbnZhc0hlaWdodCAqIDAuNSAtIGN1cnJlbnRIZWlnaHQgKiAwLjUpO1xuXG5cdFx0Ly8gICAtPlxuXHRcdGlmIChkaXN0YW5jZVggPiAwICYmIG5ld09mZnNldFggPiBtaW5UcmFuc2xhdGVYKSB7XG5cdFx0XHRuZXdPZmZzZXRYID0gbWluVHJhbnNsYXRlWCAtIDEgKyBNYXRoLnBvdygtbWluVHJhbnNsYXRlWCArIGN1cnJlbnRPZmZzZXRYICsgZGlzdGFuY2VYLCAwLjgpIHx8IDA7XG5cdFx0fVxuXG5cdFx0Ly8gICAgPC1cblx0XHRpZiAoZGlzdGFuY2VYIDwgMCAmJiBuZXdPZmZzZXRYIDwgbWF4VHJhbnNsYXRlWCkge1xuXHRcdFx0bmV3T2Zmc2V0WCA9IG1heFRyYW5zbGF0ZVggKyAxIC0gTWF0aC5wb3cobWF4VHJhbnNsYXRlWCAtIGN1cnJlbnRPZmZzZXRYIC0gZGlzdGFuY2VYLCAwLjgpIHx8IDA7XG5cdFx0fVxuXG5cdFx0Ly8gICBcXC9cblx0XHRpZiAoZGlzdGFuY2VZID4gMCAmJiBuZXdPZmZzZXRZID4gbWluVHJhbnNsYXRlWSkge1xuXHRcdFx0bmV3T2Zmc2V0WSA9IG1pblRyYW5zbGF0ZVkgLSAxICsgTWF0aC5wb3coLW1pblRyYW5zbGF0ZVkgKyBjdXJyZW50T2Zmc2V0WSArIGRpc3RhbmNlWSwgMC44KSB8fCAwO1xuXHRcdH1cblxuXHRcdC8vICAgL1xcXG5cdFx0aWYgKGRpc3RhbmNlWSA8IDAgJiYgbmV3T2Zmc2V0WSA8IG1heFRyYW5zbGF0ZVkpIHtcblx0XHRcdG5ld09mZnNldFkgPSBtYXhUcmFuc2xhdGVZICsgMSAtIE1hdGgucG93KG1heFRyYW5zbGF0ZVkgLSBjdXJyZW50T2Zmc2V0WSAtIGRpc3RhbmNlWSwgMC44KSB8fCAwO1xuXHRcdH1cblxuXHRcdHJldHVybi
6780B7XG5cdFx0XHR0b3A6IG5ld09mZnNldFksXG5cdFx0XHRsZWZ0OiBuZXdPZmZzZXRYXG5cdFx0fTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLmxpbWl0UG9zaXRpb24gPSBmdW5jdGlvbiAobmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgbmV3V2lkdGgsIG5ld0hlaWdodCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHZhciBjYW52YXNXaWR0aCA9IHNlbGYuY2FudmFzV2lkdGg7XG5cdFx0dmFyIGNhbnZhc0hlaWdodCA9IHNlbGYuY2FudmFzSGVpZ2h0O1xuXG5cdFx0aWYgKG5ld1dpZHRoID4gY2FudmFzV2lkdGgpIHtcblx0XHRcdG5ld09mZnNldFggPSBuZXdPZmZzZXRYID4gMCA/IDAgOiBuZXdPZmZzZXRYO1xuXHRcdFx0bmV3T2Zmc2V0WCA9IG5ld09mZnNldFggPCBjYW52YXNXaWR0aCAtIG5ld1dpZHRoID8gY2FudmFzV2lkdGggLSBuZXdXaWR0aCA6IG5ld09mZnNldFg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENlbnRlciBob3Jpem9udGFsbHlcblx0XHRcdG5ld09mZnNldFggPSBNYXRoLm1heCgwLCBjYW52YXNXaWR0aCAvIDIgLSBuZXdXaWR0aCAvIDIpO1xuXHRcdH1cblxuXHRcdGlmIChuZXdIZWlnaHQgPiBjYW52YXNIZWlnaHQpIHtcblx0XHRcdG5ld09mZnNldFkgPSBuZXdPZmZzZXRZID4gMCA/IDAgOiBuZXdPZmZzZXRZO1xuXHRcdFx0bmV3T2Zmc2V0WSA9IG5ld09mZnNldFkgPCBjYW52YXNIZWlnaHQgLSBuZXdIZWlnaHQgPyBjYW52YXNIZWlnaHQgLSBuZXdIZWlnaHQgOiBuZXdPZmZzZXRZO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDZW50ZXIgdmVydGljYWxseVxuXHRcdFx0bmV3T2Zmc2V0WSA9IE1hdGgubWF4KDAsIGNhbnZhc0hlaWdodCAvIDIgLSBuZXdIZWlnaHQgLyAyKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBuZXdPZmZzZXRZLFxuXHRcdFx0bGVmdDogbmV3T2Zmc2V0WFxuXHRcdH07XG5cdH07XG5cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5vblpvb20gPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsY3VsYXRlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMgdG8gZ2V0IHBpbmNoIHJhdGlvIGFuZCBuZXcgd2lkdGggYW5kIGhlaWdodFxuXHRcdHZhciBjb250ZW50U3RhcnRQb3MgPSBzZWxmLmNvbnRlbnRTdGFydFBvcztcblxuXHRcdHZhciBjdXJyZW50V2lkdGggPSBjb250ZW50U3RhcnRQb3Mud2lkdGg7XG5cdFx0dmFyIGN1cnJlbnRIZWlnaHQgPSBjb250ZW50U3RhcnRQb3MuaGVpZ2h0O1xuXG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRYID0gY29udGVudFN0YXJ0UG9zLmxlZnQ7XG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRZID0gY29udGVudFN0YXJ0UG9zLnRvcDtcblxuXHRcdHZhciBlbmREaXN0YW5jZUJldHdlZW5GaW5nZXJzID0gZGlzdGFuY2Uoc2VsZi5uZXdQb2ludHNbMF0sIHNlbGYubmV3UG9pbnRzWzFdKTtcblxuXHRcdHZhciBwaW5jaFJhdGlvID0gZW5kRGlzdGFuY2VCZXR3ZWVuRmluZ2VycyAvIHNlbGYuc3RhcnREaXN0YW5jZUJldHdlZW5GaW5nZXJzO1xuXG5cdFx0dmFyIG5ld1dpZHRoID0gTWF0aC5mbG9vcihjdXJyZW50V2lkdGggKiBwaW5jaFJhdGlvKTtcblx0XHR2YXIgbmV3SGVpZ2h0ID0gTWF0aC5mbG9vcihjdXJyZW50SGVpZ2h0ICogcGluY2hSYXRpbyk7XG5cblx0XHQvLyBUaGlzIGlzIHRoZSB0cmFuc2xhdGlvbiBkdWUgdG8gcGluY2gtem9vbWluZ1xuXHRcdHZhciB0cmFuc2xhdGVGcm9tWm9vbWluZ1ggPSAoY3VycmVudFdpZHRoIC0gbmV3V2lkdGgpICogc2VsZi5wZXJjZW50YWdlT2ZJbWFnZUF0UGluY2hQb2ludFg7XG5cdFx0dmFyIHRyYW5zbGF0ZUZyb21ab29taW5nWSA9IChjdXJyZW50SGVpZ2h0IC0gbmV3SGVpZ2h0KSAqIHNlbGYucGVyY2VudGFnZU9mSW1hZ2VBdFBpbmNoUG9pbnRZO1xuXG5cdFx0Ly8gUG9pbnQgYmV0d2VlbiB0aGUgdHdvIHRvdWNoZXNcblx0XHR2YXIgY2VudGVyUG9pbnRFbmRYID0gKHNlbGYubmV3UG9pbnRzWzBdLnggKyBzZWxmLm5ld1BvaW50c1sxXS54KSAvIDIgLSAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpO1xuXHRcdHZhciBjZW50ZXJQb2ludEVuZFkgPSAoc2VsZi5uZXdQb2ludHNbMF0ueSArIHNlbGYubmV3UG9pbnRzWzFdLnkpIC8gMiAtICQod2luZG93KS5zY3JvbGxUb3AoKTtcblxuXHRcdC8vIEFuZCB0aGlzIGlzIHRoZSB0cmFuc2xhdGlvbiBkdWUgdG8gdHJhbnNsYXRpb24gb2YgdGhlIGNlbnRlcnBvaW50XG5cdFx0Ly8gYmV0d2VlbiB0aGUgdHdvIGZpbmdlcnNcblx0XHR2YXIgdHJhbnNsYXRlRnJvbVRyYW5zbGF0aW5nWCA9IGNlbnRlclBvaW50RW5kWCAtIHNlbGYuY2VudGVyUG9pbnRTdGFydFg7XG5cdFx0dmFyIHRyYW5zbGF0ZUZyb21UcmFuc2xhdGluZ1kgPSBjZW50ZXJQb2ludEVuZFkgLSBzZWxmLmNlbnRlclBvaW50U3RhcnRZO1xuXG5cdFx0Ly8gVGhlIG5ldyBvZmZzZXQgaXMgdGhlIG9sZC9jdXJyZW50IG9uZSBwbHVzIHRoZSB0b3RhbCB0cmFuc2xhdGlvblxuXHRcdHZhciBuZXdPZmZzZXRYID0gY3VycmVudE9mZnNldFggKyAodHJhbnNsYXRlRnJvbVpvb21pbmdYICsgdHJhbnNsYXRlRnJvbVRyYW5zbGF0aW5nWCk7XG5cdFx0dmFyIG5ld09mZnNldFkgPSBjdXJyZW50T2Zmc2V0WSArICh0cmFuc2xhdGVGcm9tWm9vbWluZ1kgKyB0cmFuc2xhdGVGcm9tVHJhbnNsYXRpbmdZKTtcblxuXHRcdHZhciBuZXdQb3MgPSB7XG5cdFx0XHR0b3A6IG5ld09mZnNldFksXG5cdFx0XHRsZWZ0OiBuZXdPZmZzZXRYLFxuXHRcdFx0c2NhbGVYOiBwaW5jaFJhdGlvLFxuXHRcdFx0c2NhbGVZOiBwaW5jaFJhdGlvXG5cdFx0fTtcblxuXHRcdHNlbGYuY2FuVGFwID0gZmFsc2U7XG5cblx0XHRzZWxmLm5ld1dpZHRoID0gbmV3V2lkdGg7XG5cdFx0c2VsZi5uZXdIZWlnaHQgPSBuZXdIZWlnaHQ7XG5cblx0XHRzZWxmLmNvbnRlbnRMYXN0UG9zID0gbmV3UG9zO1xuXG5cdFx0aWYgKHNlbGYucmVxdWVzdElkKSB7XG5cdFx0XHRjYW5jZWxBRnJhbWUoc2VsZi5yZXF1ZXN0SWQpO1xuXHRcdH1cblxuXHRcdHNlbGYucmVxdWVzdElkID0gcmVxdWVzdEFGcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHQkLmZhbmN5Ym94LnNldFRyYW5zbGF0ZShzZWxmLiRjb250ZW50LCBzZWxmLmNvbnRlbn
6780RMYXN0UG9zKTtcblx0XHR9KTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9udG91Y2hlbmQgPSBmdW5jdGlvbiAoZSkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHZhciBzd2lwaW5nID0gc2VsZi5pc1N3aXBpbmc7XG5cdFx0dmFyIHBhbm5pbmcgPSBzZWxmLmlzUGFubmluZztcblx0XHR2YXIgem9vbWluZyA9IHNlbGYuaXNab29taW5nO1xuXHRcdHZhciBzY3JvbGxpbmcgPSBzZWxmLmlzU2Nyb2xsaW5nO1xuXG5cdFx0c2VsZi5lbmRQb2ludHMgPSBnZXRQb2ludGVyWFkoZSk7XG5cdFx0c2VsZi5kTXMgPSBNYXRoLm1heChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHNlbGYuc3RhcnRUaW1lLCAxKTtcblxuXHRcdHNlbGYuJGNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWlzLWdyYWJiaW5nXCIpO1xuXG5cdFx0JChkb2N1bWVudCkub2ZmKFwiLmZiLnRvdWNoXCIpO1xuXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBzZWxmLm9uc2Nyb2xsLCB0cnVlKTtcblxuXHRcdGlmIChzZWxmLnJlcXVlc3RJZCkge1xuXHRcdFx0Y2FuY2VsQUZyYW1lKHNlbGYucmVxdWVzdElkKTtcblxuXHRcdFx0c2VsZi5yZXF1ZXN0SWQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHNlbGYuaXNTd2lwaW5nID0gZmFsc2U7XG5cdFx0c2VsZi5pc1Bhbm5pbmcgPSBmYWxzZTtcblx0XHRzZWxmLmlzWm9vbWluZyA9IGZhbHNlO1xuXHRcdHNlbGYuaXNTY3JvbGxpbmcgPSBmYWxzZTtcblxuXHRcdHNlbGYuaW5zdGFuY2UuaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG5cdFx0aWYgKHNlbGYuY2FuVGFwKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5vblRhcChlKTtcblx0XHR9XG5cblx0XHRzZWxmLnNwZWVkID0gMTAwO1xuXG5cdFx0Ly8gU3BlZWQgaW4gcHgvbXNcblx0XHRzZWxmLnZlbG9jaXR5WCA9IChzZWxmLmRpc3RhbmNlWCAvIHNlbGYuZE1zKSAqIDAuNTtcblx0XHRzZWxmLnZlbG9jaXR5WSA9IChzZWxmLmRpc3RhbmNlWSAvIHNlbGYuZE1zKSAqIDAuNTtcblxuXHRcdGlmIChwYW5uaW5nKSB7XG5cdFx0XHRzZWxmLmVuZFBhbm5pbmcoKTtcblx0XHR9IGVsc2UgaWYgKHpvb21pbmcpIHtcblx0XHRcdHNlbGYuZW5kWm9vbWluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxmLmVuZFN3aXBpbmcoc3dpcGluZywgc2Nyb2xsaW5nKTtcblx0XHR9XG5cblx0XHRyZXR1cm47XG5cdH07XG5cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5lbmRTd2lwaW5nID0gZnVuY3Rpb24gKHN3aXBpbmcsIHNjcm9sbGluZykge1xuXHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdHJldCA9IGZhbHNlLFxuXHRcdFx0bGVuID0gc2VsZi5pbnN0YW5jZS5ncm91cC5sZW5ndGgsXG5cdFx0XHRkaXN0YW5jZVggPSBNYXRoLmFicyhzZWxmLmRpc3RhbmNlWCksXG5cdFx0XHRjYW5BZHZhbmNlID0gc3dpcGluZyA9PSBcInhcIiAmJiBsZW4gPiAxICYmICgoc2VsZi5kTXMgPiAxMzAgJiYgZGlzdGFuY2VYID4gMTApIHx8IGRpc3RhbmNlWCA+IDUwKSxcblx0XHRcdHNwZWVkWCA9IDMwMDtcblxuXHRcdHNlbGYuc2xpZGVyTGFzdFBvcyA9IG51bGw7XG5cblx0XHQvLyBDbG9zZSBpZiBzd2lwZWQgdmVydGljYWxseSAvIG5hdmlnYXRlIGlmIGhvcml6b250YWxseVxuXHRcdGlmIChzd2lwaW5nID09IFwieVwiICYmICFzY3JvbGxpbmcgJiYgTWF0aC5hYnMoc2VsZi5kaXN0YW5jZVkpID4gNTApIHtcblx0XHRcdC8vIENvbnRpbnVlIHZlcnRpY2FsIG1vdmVtZW50XG5cdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoXG5cdFx0XHRcdHNlbGYuaW5zdGFuY2UuY3VycmVudC4kc2xpZGUsIHtcblx0XHRcdFx0XHR0b3A6IHNlbGYuc2xpZGVyU3RhcnRQb3MudG9wICsgc2VsZi5kaXN0YW5jZVkgKyBzZWxmLnZlbG9jaXR5WSAqIDE1MCxcblx0XHRcdFx0XHRvcGFjaXR5OiAwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdDIwMFxuXHRcdFx0KTtcblx0XHRcdHJldCA9IHNlbGYuaW5zdGFuY2UuY2xvc2UodHJ1ZSwgMjUwKTtcblx0XHR9IGVsc2UgaWYgKGNhbkFkdmFuY2UgJiYgc2VsZi5kaXN0YW5jZVggPiAwKSB7XG5cdFx0XHRyZXQgPSBzZWxmLmluc3RhbmNlLnByZXZpb3VzKHNwZWVkWCk7XG5cdFx0fSBlbHNlIGlmIChjYW5BZHZhbmNlICYmIHNlbGYuZGlzdGFuY2VYIDwgMCkge1xuXHRcdFx0cmV0ID0gc2VsZi5pbnN0YW5jZS5uZXh0KHNwZWVkWCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJldCA9PT0gZmFsc2UgJiYgKHN3aXBpbmcgPT0gXCJ4XCIgfHwgc3dpcGluZyA9PSBcInlcIikpIHtcblx0XHRcdHNlbGYuaW5zdGFuY2UuY2VudGVyU2xpZGUoMjAwKTtcblx0XHR9XG5cblx0XHRzZWxmLiRjb250YWluZXIucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1pcy1zbGlkaW5nXCIpO1xuXHR9O1xuXG5cdC8vIExpbWl0IHBhbm5pbmcgZnJvbSBlZGdlc1xuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT1cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5lbmRQYW5uaW5nID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdG5ld09mZnNldFgsXG5cdFx0XHRuZXdPZmZzZXRZLFxuXHRcdFx0bmV3UG9zO1xuXG5cdFx0aWYgKCFzZWxmLmNvbnRlbnRMYXN0UG9zKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHNlbGYub3B0cy5tb21lbnR1bSA9PT0gZmFsc2UgfHwgc2VsZi5kTXMgPiAzNTApIHtcblx0XHRcdG5ld09mZnNldFggPSBzZWxmLmNvbnRlbnRMYXN0UG9zLmxlZnQ7XG5cdFx0XHRuZXdPZmZzZXRZID0gc2VsZi5jb250ZW50TGFzdFBvcy50b3A7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENvbnRpbnVlIG1vdmVtZW50XG5cdFx0XHRuZXdPZmZzZXRYID0gc2VsZi5jb250ZW50TGFzdFBvcy5sZWZ0ICsgc2VsZi52ZWxvY2l0eVggKiA1MDA7XG5cdFx0XHRuZXdPZmZzZXRZID0gc2VsZi5jb250ZW50TGFzdFBvcy50b3AgKyBzZWxmLnZlbG9jaXR5WSAqIDUwMDtcblx0XHR9XG5cblx0XHRuZXdQb3MgPSBzZWxmLmxpbWl0UG9zaXRpb24obmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgc2VsZi5jb250ZW50U3RhcnRQb3Mud2lkdGgsIHNlbGYuY29udGVudFN0YXJ0UG9zLmhlaWdodCk7XG5cblx0XHRuZXdQb3Mud2lkdGggPSBzZWxmLmNvbnRlbn
6780RTdGFydFBvcy53aWR0aDtcblx0XHRuZXdQb3MuaGVpZ2h0ID0gc2VsZi5jb250ZW50U3RhcnRQb3MuaGVpZ2h0O1xuXG5cdFx0JC5mYW5jeWJveC5hbmltYXRlKHNlbGYuJGNvbnRlbnQsIG5ld1BvcywgMzY2KTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLmVuZFpvb21pbmcgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0dmFyIGN1cnJlbnQgPSBzZWxmLmluc3RhbmNlLmN1cnJlbnQ7XG5cblx0XHR2YXIgbmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgbmV3UG9zLCByZXNldDtcblxuXHRcdHZhciBuZXdXaWR0aCA9IHNlbGYubmV3V2lkdGg7XG5cdFx0dmFyIG5ld0hlaWdodCA9IHNlbGYubmV3SGVpZ2h0O1xuXG5cdFx0aWYgKCFzZWxmLmNvbnRlbnRMYXN0UG9zKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bmV3T2Zmc2V0WCA9IHNlbGYuY29udGVudExhc3RQb3MubGVmdDtcblx0XHRuZXdPZmZzZXRZID0gc2VsZi5jb250ZW50TGFzdFBvcy50b3A7XG5cblx0XHRyZXNldCA9IHtcblx0XHRcdHRvcDogbmV3T2Zmc2V0WSxcblx0XHRcdGxlZnQ6IG5ld09mZnNldFgsXG5cdFx0XHR3aWR0aDogbmV3V2lkdGgsXG5cdFx0XHRoZWlnaHQ6IG5ld0hlaWdodCxcblx0XHRcdHNjYWxlWDogMSxcblx0XHRcdHNjYWxlWTogMVxuXHRcdH07XG5cblx0XHQvLyBSZXNldCBzY2FsZXgvc2NhbGVZIHZhbHVlczsgdGhpcyBoZWxwcyBmb3IgcGVyZm9tYW5jZSBhbmQgZG9lcyBub3QgYnJlYWsgYW5pbWF0aW9uXG5cdFx0JC5mYW5jeWJveC5zZXRUcmFuc2xhdGUoc2VsZi4kY29udGVudCwgcmVzZXQpO1xuXG5cdFx0aWYgKG5ld1dpZHRoIDwgc2VsZi5jYW52YXNXaWR0aCAmJiBuZXdIZWlnaHQgPCBzZWxmLmNhbnZhc0hlaWdodCkge1xuXHRcdFx0c2VsZi5pbnN0YW5jZS5zY2FsZVRvRml0KDE1MCk7XG5cdFx0fSBlbHNlIGlmIChuZXdXaWR0aCA+IGN1cnJlbnQud2lkdGggfHwgbmV3SGVpZ2h0ID4gY3VycmVudC5oZWlnaHQpIHtcblx0XHRcdHNlbGYuaW5zdGFuY2Uuc2NhbGVUb0FjdHVhbChzZWxmLmNlbnRlclBvaW50U3RhcnRYLCBzZWxmLmNlbnRlclBvaW50U3RhcnRZLCAxNTApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXdQb3MgPSBzZWxmLmxpbWl0UG9zaXRpb24obmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG5cblx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShzZWxmLiRjb250ZW50LCBuZXdQb3MsIDE1MCk7XG5cdFx0fVxuXHR9O1xuXG5cdEd1ZXN0dXJlcy5wcm90b3R5cGUub25UYXAgPSBmdW5jdGlvbiAoZSkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHR2YXIgJHRhcmdldCA9ICQoZS50YXJnZXQpO1xuXG5cdFx0dmFyIGluc3RhbmNlID0gc2VsZi5pbnN0YW5jZTtcblx0XHR2YXIgY3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQ7XG5cblx0XHR2YXIgZW5kUG9pbnRzID0gKGUgJiYgZ2V0UG9pbnRlclhZKGUpKSB8fCBzZWxmLnN0YXJ0UG9pbnRzO1xuXG5cdFx0dmFyIHRhcFggPSBlbmRQb2ludHNbMF0gPyBlbmRQb2ludHNbMF0ueCAtICQod2luZG93KS5zY3JvbGxMZWZ0KCkgLSBzZWxmLnN0YWdlUG9zLmxlZnQgOiAwO1xuXHRcdHZhciB0YXBZID0gZW5kUG9pbnRzWzBdID8gZW5kUG9pbnRzWzBdLnkgLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSBzZWxmLnN0YWdlUG9zLnRvcCA6IDA7XG5cblx0XHR2YXIgd2hlcmU7XG5cblx0XHR2YXIgcHJvY2VzcyA9IGZ1bmN0aW9uIChwcmVmaXgpIHtcblx0XHRcdHZhciBhY3Rpb24gPSBjdXJyZW50Lm9wdHNbcHJlZml4XTtcblxuXHRcdFx0aWYgKCQuaXNGdW5jdGlvbihhY3Rpb24pKSB7XG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbi5hcHBseShpbnN0YW5jZSwgW2N1cnJlbnQsIGVdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhY3Rpb24pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzd2l0Y2ggKGFjdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiY2xvc2VcIjpcblx0XHRcdFx0XHRpbnN0YW5jZS5jbG9zZShzZWxmLnN0YXJ0RXZlbnQpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcInRvZ2dsZUNvbnRyb2xzXCI6XG5cdFx0XHRcdFx0aW5zdGFuY2UudG9nZ2xlQ29udHJvbHMoKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJuZXh0XCI6XG5cdFx0XHRcdFx0aW5zdGFuY2UubmV4dCgpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIm5leHRPckNsb3NlXCI6XG5cdFx0XHRcdFx0aWYgKGluc3RhbmNlLmdyb3VwLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdGluc3RhbmNlLm5leHQoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aW5zdGFuY2UuY2xvc2Uoc2VsZi5zdGFydEV2ZW50KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiem9vbVwiOlxuXHRcdFx0XHRcdGlmIChjdXJyZW50LnR5cGUgPT0gXCJpbWFnZVwiICYmIChjdXJyZW50LmlzTG9hZGVkIHx8IGN1cnJlbnQuJGdob3N0KSkge1xuXHRcdFx0XHRcdFx0aWYgKGluc3RhbmNlLmNhblBhbigpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbmNlLnNjYWxlVG9GaXQoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5zdGFuY2UuaXNTY2FsZWREb3duKCkpIHtcblx0XHRcdFx0XHRcdFx0aW5zdGFuY2Uuc2NhbGVUb0FjdHVhbCh0YXBYLCB0YXBZKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIDwgMikge1xuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5jbG9zZShzZWxmLnN0YXJ0RXZlbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBJZ25vcmUgcmlnaHQgY2xpY2tcblx0XHRpZiAoZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5idXR0b24gPT0gMikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFNraXAgaWYgY2xpY2tlZCBvbiB0aGUgc2Nyb2xsYmFyXG5cdFx0aWYgKCEkdGFyZ2V0LmlzKFwiaW1nXCIpICYmIHRhcFggPiAkdGFyZ2V0WzBdLmNsaWVudFdpZHRoICsgJHRhcmdldC5vZmZzZXQoKS5sZWZ0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgd2hlcmUgaXMgY2xpY2tlZFxuXHRcdGlmICgk
6780dGFyZ2V0LmlzKFwiLmZhbmN5Ym94LWJnLC5mYW5jeWJveC1pbm5lciwuZmFuY3lib3gtb3V0ZXIsLmZhbmN5Ym94LWNvbnRhaW5lclwiKSkge1xuXHRcdFx0d2hlcmUgPSBcIk91dHNpZGVcIjtcblx0XHR9IGVsc2UgaWYgKCR0YXJnZXQuaXMoXCIuZmFuY3lib3gtc2xpZGVcIikpIHtcblx0XHRcdHdoZXJlID0gXCJTbGlkZVwiO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRpbnN0YW5jZS5jdXJyZW50LiRjb250ZW50ICYmXG5cdFx0XHRpbnN0YW5jZS5jdXJyZW50LiRjb250ZW50XG5cdFx0XHRcdC5maW5kKCR0YXJnZXQpXG5cdFx0XHRcdC5hZGRCYWNrKClcblx0XHRcdFx0LmZpbHRlcigkdGFyZ2V0KS5sZW5ndGhcblx0XHQpIHtcblx0XHRcdHdoZXJlID0gXCJDb250ZW50XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGEgZG91YmxlIHRhcFxuXHRcdGlmIChzZWxmLnRhcHBlZCkge1xuXHRcdFx0Ly8gU3RvcCBwcmV2aW91c2x5IGNyZWF0ZWQgc2luZ2xlIHRhcFxuXHRcdFx0Y2xlYXJUaW1lb3V0KHNlbGYudGFwcGVkKTtcblx0XHRcdHNlbGYudGFwcGVkID0gbnVsbDtcblxuXHRcdFx0Ly8gU2tpcCBpZiBkaXN0YW5jZSBiZXR3ZWVuIHRhcHMgaXMgdG9vIGJpZ1xuXHRcdFx0aWYgKE1hdGguYWJzKHRhcFggLSBzZWxmLnRhcFgpID4gNTAgfHwgTWF0aC5hYnModGFwWSAtIHNlbGYudGFwWSkgPiA1MCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblxuXHRcdFx0Ly8gT0ssIG5vdyB3ZSBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgZG91YmxlLXRhcFxuXHRcdFx0cHJvY2VzcyhcImRibGNsaWNrXCIgKyB3aGVyZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFNpbmdsZSB0YXAgd2lsbCBiZSBwcm9jZXNzZWQgaWYgdXNlciBoYXMgbm90IGNsaWNrZWQgc2Vjb25kIHRpbWUgd2l0aGluIDMwMG1zXG5cdFx0XHQvLyBvciB0aGVyZSBpcyBubyBuZWVkIHRvIH
6780dhaXQgZm9yIGRvdWJsZS10YXBcblx0XHRcdHNlbGYudGFwWCA9IHRhcFg7XG5cdFx0XHRzZWxmLnRhcFkgPSB0YXBZO1xuXG5cdFx0XHRpZiAoY3VycmVudC5vcHRzW1wiZGJsY2xpY2tcIiArIHdoZXJlXSAmJiBjdXJyZW50Lm9wdHNbXCJkYmxjbGlja1wiICsgd2hlcmVdICE9PSBjdXJyZW50Lm9wdHNbXCJjbGlja1wiICsgd2hlcmVdKSB7XG5cdFx0XHRcdHNlbGYudGFwcGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi50YXBwZWQgPSBudWxsO1xuXG5cdFx0XHRcdFx0aWYgKCFpbnN0YW5jZS5pc0FuaW1hdGluZykge1xuXHRcdFx0XHRcdFx0cHJvY2VzcyhcImNsaWNrXCIgKyB3aGVyZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LCA1MDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJvY2VzcyhcImNsaWNrXCIgKyB3aGVyZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0JChkb2N1bWVudClcblx0XHQub24oXCJvbkFjdGl2YXRlLmZiXCIsIGZ1bmN0aW9uIChlLCBpbnN0YW5jZSkge1xuXHRcdFx0aWYgKGluc3RhbmNlICYmICFpbnN0YW5jZS5HdWVzdHVyZXMpIHtcblx0XHRcdFx0aW5zdGFuY2UuR3Vlc3R1cmVzID0gbmV3IEd1ZXN0dXJlcyhpbnN0YW5jZSk7XG5cdFx0XHR9XG5cdFx0fSlcblx0XHQub24oXCJiZWZvcmVDbG9zZS5mYlwiLCBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5HdWVzdHVyZXMpIHtcblx0XHRcdFx0aW5zdGFuY2UuR3Vlc3R1cmVzLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9KTtcbn0pKHdpbmRvdywgZG9jdW1lbnQsIGpRdWVyeSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIFNsaWRlU2hvd1xuLy8gRW5hYmxlcyBzbGlkZXNob3cgZnVuY3Rpb25hbGl0eVxuLy9cbi8vIEV4YW1wbGUgb2YgdXNhZ2U6XG4vLyAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCkuU2xpZGVTaG93LnN0YXJ0KClcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uIChkb2N1bWVudCwgJCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHQkLmV4dGVuZCh0cnVlLCAkLmZhbmN5Ym94LmRlZmF1bHRzLCB7XG5cdFx0YnRuVHBsOiB7XG5cdFx0XHRzbGlkZVNob3c6ICc8YnV0dG9uIGRhdGEtZmFuY3lib3gtcGxheSBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1idXR0b24tLXBsYXlcIiB0aXRsZT1cInt7UExBWV9TVEFSVH19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk02LjUgNS40djEzLjJsMTEtNi42elwiLz48L3N2Zz4nICtcblx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTguMzMgNS43NWgyLjJ2MTIuNWgtMi4yVjUuNzV6bTUuMTUgMGgyLjJ2MTIuNWgtMi4yVjUuNzV6XCIvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjwvYnV0dG9uPlwiXG5cdFx0fSxcblx0XHRzbGlkZVNob3c6IHtcblx0XHRcdGF1dG9TdGFydDogZmFsc2UsXG5cdFx0XHRzcGVlZDogMzAwMCxcblx0XHRcdHByb2dyZXNzOiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHR2YXIgU2xpZGVTaG93ID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG5cdFx0dGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9O1xuXG5cdCQuZXh0ZW5kKFNsaWRlU2hvdy5wcm90b3R5cGUsIHtcblx0XHR0aW1lcjogbnVsbCxcblx0XHRpc0FjdGl2ZTogZmFsc2UsXG5cdFx0JGJ1dHRvbjogbnVsbCxcblxuXHRcdGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0XHRvcHRzID0gaW5zdGFuY2UuZ3JvdXBbaW5zdGFuY2UuY3VyckluZGV4XS5vcHRzLnNsaWRlU2hvdztcblxuXHRcdFx0c2VsZi4kYnV0dG9uID0gaW5zdGFuY2UuJHJlZnMudG9vbGJhci5maW5kKFwiW2RhdGEtZmFuY3lib3gtcGxheV1cIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYudG9nZ2xlKCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGluc3RhbmNlLmdyb3VwLmxlbmd0aCA8IDIgfHwgIW9wdHMpIHtcblx0XHRcdFx0c2VsZi4kYnV0dG9uLmhpZGUoKTtcblx0XHRcdH0gZWxzZSBpZiAob3B0cy5wcm9ncmVzcykge1xuXHRcdFx0XHRzZWxmLiRwcm9ncmVzcyA9ICQoJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1wcm9ncmVzc1wiPjwvZGl2PicpLmFwcGVuZFRvKGluc3RhbmNlLiRyZWZzLmlubmVyKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoZm9yY2UpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0XHRjdXJyZW50ID0gaW5zdGFuY2UuY3VycmVudDtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgcmVhY2hlZCBsYXN0IGVsZW1lbnRcblx0XHRcdGlmIChjdXJyZW50ICYmIChmb3JjZSA9PT0gdHJ1ZSB8fCBjdXJyZW50Lm9wdHMubG9vcCB8fCBpbnN0YW5jZS5jdXJySW5kZXggPCBpbnN0YW5jZS5ncm91cC5sZW5ndGggLSAxKSkge1xuXHRcdFx0XHRpZiAoc2VsZi5pc0FjdGl2ZSAmJiBjdXJyZW50LmNvbnRlbn
6780RUeXBlICE9PSBcInZpZGVvXCIpIHtcblx0XHRcdFx0XHRpZiAoc2VsZi4kcHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShzZWxmLiRwcm9ncmVzcy5zaG93KCksIHtcblx0XHRcdFx0XHRcdFx0c2NhbGVYOiAxXG5cdFx0XHRcdFx0XHR9LCBjdXJyZW50Lm9wdHMuc2xpZGVTaG93LnNwZWVkKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzZWxmLnRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWluc3RhbmNlLmN1cnJlbnQub3B0cy5sb29wICYmIGluc3RhbmNlLmN1cnJlbnQuaW5kZXggPT0gaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5qdW1wVG8oMCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5uZXh0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSwgY3VycmVudC5vcHRzLnNsaWRlU2hvdy5zcGVlZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuc3RvcCgpO1xuXHRcdFx0XHRpbnN0YW5jZS5pZGxlU2Vjb25kc0NvdW50ZXIgPSAwO1xuXHRcdFx0XHRpbnN0YW5jZS5zaG93Q29udHJvbHMoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdFx0Y2xlYXJUaW1lb3V0KHNlbGYudGltZXIpO1xuXG5cdFx0XHRzZWxmLnRpbWVyID0gbnVsbDtcblxuXHRcdFx0aWYgKHNlbGYuJHByb2dyZXNzKSB7XG5cdFx0XHRcdHNlbGYuJHByb2dyZXNzLnJlbW92ZUF0dHIoXCJzdHlsZVwiKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmluc3RhbmNlLmN1cnJlbnQ7XG5cblx0XHRcdGlmIChjdXJyZW50KSB7XG5cdFx0XHRcdHNlbGYuJGJ1dHRvblxuXHRcdFx0XHRcdC5hdHRyKFwidGl0bGVcIiwgKGN1cnJlbnQub3B0cy5pMThuW2N1cnJlbnQub3B0cy5sYW5nXSB8fCBjdXJyZW50Lm9wdHMuaTE4bi5lbikuUExBWV9TVE9QKVxuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWJ1dHRvbi0tcGxheVwiKVxuXHRcdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LWJ1dHRvbi0tcGF1c2VcIik7XG5cblx0XHRcdFx0c2VsZi5pc0FjdGl2ZSA9IHRydWU7XG5cblx0XHRcdFx0aWYgKGN1cnJlbnQuaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdHNlbGYuc2V0KHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2VsZi5pbnN0YW5jZS50cmlnZ2VyKFwib25TbGlkZVNob3dDaGFuZ2VcIiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHN0b3A6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Y3VycmVudCA9IHNlbGYuaW5zdGFuY2UuY3VycmVudDtcblxuXHRcdFx0c2VsZi5jbGVhcigpO1xuXG5cdFx0XHRzZWxmLiRidXR0b25cblx0XHRcdFx0LmF0dHIoXCJ0aXRsZVwiLCAoY3VycmVudC5vcHRzLmkxOG5bY3VycmVudC5vcHRzLmxhbmddIHx8IGN1cnJlbnQub3B0cy5pMThuLmVuKS5QTEFZX1NUQVJUKVxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1idXR0b24tLXBhdXNlXCIpXG5cdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LWJ1dHRvbi0tcGxheVwiKTtcblxuXHRcdFx0c2VsZi5pc0FjdGl2ZSA9IGZhbHNlO1xuXG5cdFx0XHRzZWxmLmluc3RhbmNlLnRyaWdnZXIoXCJvblNsaWRlU2hvd0NoYW5nZVwiLCBmYWxzZSk7XG5cblx0XHRcdGlmIChzZWxmLiRwcm9ncmVzcykge1xuXHRcdFx0XHRzZWxmLiRwcm9ncmVzcy5yZW1vdmVBdHRyKFwic3R5bGVcIikuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHR0b2dnbGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdFx0aWYgKHNlbGYuaXNBY3RpdmUpIHtcblx0XHRcdFx0c2VsZi5zdG9wKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLnN0YXJ0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHQkKGRvY3VtZW50KS5vbih7XG5cdFx0XCJvbkluaXQuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlKSB7XG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgIWluc3RhbmNlLlNsaWRlU2hvdykge1xuXHRcdFx0XHRpbnN0YW5jZS5TbGlkZVNob3cgPSBuZXcgU2xpZGVTaG93KGluc3RhbmNlKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0XCJiZWZvcmVTaG93LmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwgZmlyc3RSdW4pIHtcblx0XHRcdHZhciBTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRcdGlmIChmaXJzdFJ1bikge1xuXHRcdFx0XHRpZiAoU2xpZGVTaG93ICYmIGN1cnJlbnQub3B0cy5zbGlkZVNob3cuYXV0b1N0YXJ0KSB7XG5cdFx0XHRcdFx0U2xpZGVTaG93LnN0YXJ0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoU2xpZGVTaG93ICYmIFNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0XHRTbGlkZVNob3cuY2xlYXIoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0XCJhZnRlclNob3cuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlLCBjdXJyZW50KSB7XG5cdFx0XHR2YXIgU2xpZGVTaG93ID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuU2xpZGVTaG93O1xuXG5cdFx0XHRpZiAoU2xpZGVTaG93ICYmIFNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0XHRTbGlkZVNob3cuc2V0KCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYWZ0ZXJLZXlkb3duLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwga2V5cHJlc3MsIGtleWNvZGUpIHtcblx0XHRcdHZhciBTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRcdC8vIFwiUFwiIG9yIFNwYWNlYmFyXG5cdFx0XHRpZiAoU2xpZGVTaG93ICYmIGN1cnJlbnQub3B0cy5zbGlkZVNob3cgJiYgKGtleWNvZGUgPT09IDgwIHx8IGtleWNvZGUgPT09IDMyKSAmJiAhJChkb2
6780N1bWVudC5hY3RpdmVFbGVtZW50KS5pcyhcImJ1dHRvbixhLGlucHV0XCIpKSB7XG5cdFx0XHRcdGtleXByZXNzLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0U2xpZGVTaG93LnRvZ2dsZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRcImJlZm9yZUNsb3NlLmZiIG9uRGVhY3RpdmF0ZS5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciBTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRcdGlmIChTbGlkZVNob3cpIHtcblx0XHRcdFx0U2xpZGVTaG93LnN0b3AoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFBhZ2UgVmlzaWJpbGl0eSBBUEkgdG8gcGF1c2Ugc2xpZGVzaG93IHdoZW4gd2luZG93IGlzIG5vdCBhY3RpdmVcblx0JChkb2N1bWVudCkub24oXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgaW5zdGFuY2UgPSAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCksXG5cdFx0XHRTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRpZiAoU2xpZGVTaG93ICYmIFNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0aWYgKGRvY3VtZW50LmhpZGRlbikge1xuXHRcdFx0XHRTbGlkZVNob3cuY2xlYXIoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFNsaWRlU2hvdy5zZXQoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufSkoZG9jdW1lbnQsIGpRdWVyeSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEZ1bGxTY3JlZW5cbi8vIEFkZHMgZnVsbHNjcmVlbiBmdW5jdGlvbmFsaXR5XG4vL1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbihmdW5jdGlvbiAoZG9jdW1lbnQsICQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0Ly8gQ29sbGVjdGlvbiBvZiBtZXRob2RzIHN1cHBvcnRlZCBieSB1c2VyIGJyb3dzZXJcblx0dmFyIGZuID0gKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgZm5NYXAgPSBbXG5cdFx0XHRbXCJyZXF1ZXN0RnVsbHNjcmVlblwiLCBcImV4aXRGdWxsc2NyZWVuXCIsIFwiZnVsbHNjcmVlbkVsZW1lbnRcIiwgXCJmdWxsc2NyZWVuRW5hYmxlZFwiLCBcImZ1bGxzY3JlZW5jaGFuZ2VcIiwgXCJmdWxsc2NyZWVuZXJyb3JcIl0sXG5cdFx0XHQvLyBuZXcgV2ViS2l0XG5cdFx0XHRbXG5cdFx0XHRcdFwid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFx0XCJ3ZWJraXRFeGl0RnVsbHNjcmVlblwiLFxuXHRcdFx0XHRcIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50XCIsXG5cdFx0XHRcdFwid2Via2l0RnVsbHNjcmVlbkVuYWJsZWRcIixcblx0XHRcdFx0XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFx0XHRcdFwid2Via2l0ZnVsbHNjcmVlbmVycm9yXCJcblx0XHRcdF0sXG5cdFx0XHQvLyBvbGQgV2ViS2l0IChTYWZhcmkgNS4xKVxuXHRcdFx0W1xuXHRcdFx0XHRcIndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuXCIsXG5cdFx0XHRcdFwid2Via2l0Q2FuY2VsRnVsbFNjcmVlblwiLFxuXHRcdFx0XHRcIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudFwiLFxuXHRcdFx0XHRcIndlYmtpdENhbmNlbEZ1bGxTY3JlZW5cIixcblx0XHRcdFx0XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFx0XHRcdFwid2Via2l0ZnVsbHNjcmVlbmVycm9yXCJcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdFwibW96UmVxdWVzdEZ1bGxTY3JlZW5cIixcblx0XHRcdFx0XCJtb3pDYW5jZWxGdWxsU2NyZWVuXCIsXG5cdFx0XHRcdFwibW96RnVsbFNjcmVlbkVsZW1lbnRcIixcblx0XHRcdFx0XCJtb3pGdWxsU2NyZWVuRW5hYmxlZFwiLFxuXHRcdFx0XHRcIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XHRcdFx0XCJtb3pmdWxsc2NyZWVuZXJyb3JcIlxuXHRcdFx0XSxcblx0XHRcdFtcIm1zUmVxdWVzdEZ1bGxzY3JlZW5cIiwgXCJtc0V4aXRGdWxsc2NyZWVuXCIsIFwibXNGdWxsc2NyZWVuRWxlbWVudFwiLCBcIm1zRnVsbHNjcmVlbkVuYWJsZWRcIiwgXCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIiwgXCJNU0Z1bGxzY3JlZW5FcnJvclwiXVxuXHRcdF07XG5cblx0XHR2YXIgcmV0ID0ge307XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGZuTWFwLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdmFsID0gZm5NYXBbaV07XG5cblx0XHRcdGlmICh2YWwgJiYgdmFsWzFdIGluIGRvY3VtZW50KSB7XG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdmFsLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0cmV0W2ZuTWFwWzBdW2pdXSA9IHZhbFtqXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KSgpO1xuXG5cdGlmIChmbikge1xuXHRcdHZhciBGdWxsU2NyZWVuID0ge1xuXHRcdFx0cmVxdWVzdDogZnVuY3Rpb24gKGVsZW0pIHtcblx0XHRcdFx0ZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdGVsZW1bZm4ucmVxdWVzdEZ1bGxzY3JlZW5dKGVsZW0uQUxMT1dfS0VZQk9BUkRfSU5QVVQpO1xuXHRcdFx0fSxcblx0XHRcdGV4aXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0ZG9jdW1lbnRbZm4uZXhpdEZ1bGxzY3JlZW5dKCk7XG5cdFx0XHR9LFxuXHRcdFx0dG9nZ2xlOiBmdW5jdGlvbiAoZWxlbSkge1xuXHRcdFx0XHRlbGVtID0gZWxlbSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0aWYgKHRoaXMuaXNGdWxsc2NyZWVuKCkpIHtcblx0XHRcdFx0XHR0aGlzLmV4aXQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QoZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRpc0Z1bGxzY3JlZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIEJvb2xlYW4oZG9jdW1lbnRbZm4uZnVsbHNjcmVlbkVsZW1lbnRdKTtcblx0XHRcdH0sXG5cdFx0XHRlbmFibGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybi
6780BCb29sZWFuKGRvY3VtZW50W2ZuLmZ1bGxzY3JlZW5FbmFibGVkXSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdCQuZXh0ZW5kKHRydWUsICQuZmFuY3lib3guZGVmYXVsdHMsIHtcblx0XHRcdGJ0blRwbDoge1xuXHRcdFx0XHRmdWxsU2NyZWVuOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LWZ1bGxzY3JlZW4gY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS1mc2VudGVyXCIgdGl0bGU9XCJ7e0ZVTExfU0NSRUVOfX1cIj4nICtcblx0XHRcdFx0XHQnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTUgMTZoM3YzaDJ2LTVINXptMy04SDV2Mmg1VjVIOHptNiAxMWgydi0zaDN2LTJoLTV6bTItMTFWNWgtMnY1aDVWOHpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFx0XCI8L2J1dHRvbj5cIlxuXHRcdFx0fSxcblx0XHRcdGZ1bGxTY3JlZW46IHtcblx0XHRcdFx0YXV0b1N0YXJ0OiBmYWxzZVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0JChkb2N1bWVudCkub24oZm4uZnVsbHNjcmVlbmNoYW5nZSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIGlzRnVsbHNjcmVlbiA9IEZ1bGxTY3JlZW4uaXNGdWxsc2NyZWVuKCksXG5cdFx0XHRcdGluc3RhbmNlID0gJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0XHRpZiAoaW5zdGFuY2UpIHtcblx0XHRcdFx0Ly8gSWYgaW1hZ2UgaXMgem9vbWluZywgdGhlbiBmb3JjZSB0byBzdG9wIGFuZCByZXBvc2l0aW9uIHByb3Blcmx5XG5cdFx0XHRcdGlmIChpbnN0YW5jZS5jdXJyZW50ICYmIGluc3RhbmNlLmN1cnJlbnQudHlwZSA9PT0gXCJpbWFnZVwiICYmIGluc3RhbmNlLmlzQW5pbWF0aW5nKSB7XG5cdFx0XHRcdFx0aW5zdGFuY2UuaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGluc3RhbmNlLnVwZGF0ZSh0cnVlLCB0cnVlLCAwKTtcblxuXHRcdFx0XHRcdGlmICghaW5zdGFuY2UuaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdFx0aW5zdGFuY2UuY29tcGxldGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnN0YW5jZS50cmlnZ2VyKFwib25GdWxsc2NyZWVuQ2hhbmdlXCIsIGlzRnVsbHNjcmVlbik7XG5cblx0XHRcdFx0aW5zdGFuY2UuJHJlZnMuY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtaXMtZnVsbHNjcmVlblwiLCBpc0Z1bGxzY3JlZW4pO1xuXG5cdFx0XHRcdGluc3RhbmNlLiRyZWZzLnRvb2xiYXJcblx0XHRcdFx0XHQuZmluZChcIltkYXRhLWZhbmN5Ym94LWZ1bGxzY3JlZW5dXCIpXG5cdFx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtYnV0dG9uLS1mc2VudGVyXCIsICFpc0Z1bGxzY3JlZW4pXG5cdFx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtYnV0dG9uLS1mc2V4aXRcIiwgaXNGdWxsc2NyZWVuKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdCQoZG9jdW1lbnQpLm9uKHtcblx0XHRcIm9uSW5pdC5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciAkY29udGFpbmVyO1xuXG5cdFx0XHRpZiAoIWZuKSB7XG5cdFx0XHRcdGluc3RhbmNlLiRyZWZzLnRvb2xiYXIuZmluZChcIltkYXRhLWZhbmN5Ym94LWZ1bGxzY3JlZW5dXCIpLnJlbW92ZSgpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmdyb3VwW2luc3RhbmNlLmN1cnJJbmRleF0ub3B0cy5mdWxsU2NyZWVuKSB7XG5cdFx0XHRcdCRjb250YWluZXIgPSBpbnN0YW5jZS4kcmVmcy5jb250YWluZXI7XG5cblx0XHRcdFx0JGNvbnRhaW5lci5vbihcImNsaWNrLmZiLWZ1bGxzY3JlZW5cIiwgXCJbZGF0YS1mYW5jeWJveC1mdWxsc2NyZWVuXVwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0RnVsbFNjcmVlbi50b2dnbGUoKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGluc3RhbmNlLm9wdHMuZnVsbFNjcmVlbiAmJiBpbnN0YW5jZS5vcHRzLmZ1bGxTY3JlZW4uYXV0b1N0YXJ0ID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0RnVsbFNjcmVlbi5yZXF1ZXN0KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFeHBvc2UgQVBJXG5cdFx0XHRcdGluc3RhbmNlLkZ1bGxTY3JlZW4gPSBGdWxsU2NyZWVuO1xuXHRcdFx0fSBlbHNlIGlmIChpbnN0YW5jZSkge1xuXHRcdFx0XHRpbnN0YW5jZS4kcmVmcy50b29sYmFyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1mdWxsc2NyZWVuXVwiKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYWZ0ZXJLZXlkb3duLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwga2V5cHJlc3MsIGtleWNvZGUpIHtcblx0XHRcdC8vIFwiRlwiXG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuRnVsbFNjcmVlbiAmJiBrZXljb2RlID09PSA3MCkge1xuXHRcdFx0XHRrZXlwcmVzcy5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdGluc3RhbmNlLkZ1bGxTY3JlZW4udG9nZ2xlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYmVmb3JlQ2xvc2UuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlKSB7XG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuRnVsbFNjcmVlbiAmJiBpbnN0YW5jZS4kcmVmcy5jb250YWluZXIuaGFzQ2xhc3MoXCJmYW5jeWJveC1pcy1mdWxsc2NyZWVuXCIpKSB7XG5cdFx0XHRcdEZ1bGxTY3JlZW4uZXhpdCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59KShkb2N1bWVudCwgalF1ZXJ5KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gVGh1bWJzXG4vLyBEaXNwbGF5cyB0aHVtYm5haWxzIGluIGEgZ3JpZFxuLy9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4oZnVuY3Rpb24gKGRvY3VtZW50LCAkKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciBDTEFTUyA9IFwiZmFuY3lib3gtdGh1bWJzXCIsXG5cdFx0Q0xBU1NfQUNUSVZF
6780ID0gQ0xBU1MgKyBcIi1hY3RpdmVcIjtcblxuXHQvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIGRlZmF1bHQgdmFsdWVzXG5cdCQuZmFuY3lib3guZGVmYXVsdHMgPSAkLmV4dGVuZChcblx0XHR0cnVlLCB7XG5cdFx0XHRidG5UcGw6IHtcblx0XHRcdFx0dGh1bWJzOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LXRodW1icyBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1idXR0b24tLXRodW1ic1wiIHRpdGxlPVwie3tUSFVNQlN9fVwiPicgK1xuXHRcdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNC41OSAxNC41OWgzLjc2djMuNzZoLTMuNzZ2LTMuNzZ6bS00LjQ3IDBoMy43NnYzLjc2aC0zLjc2di0zLjc2em0tNC40NyAwaDMuNzZ2My43Nkg1LjY1di0zLjc2em04Ljk0LTQuNDdoMy43NnYzLjc2aC0zLjc2di0zLjc2em0tNC40NyAwaDMuNzZ2My43NmgtMy43NnYtMy43NnptLTQuNDcgMGgzLjc2djMuNzZINS42NXYtMy43NnptOC45NC00LjQ3aDMuNzZ2My43NmgtMy43NlY1LjY1em0tNC40NyAwaDMuNzZ2My43NmgtMy43NlY1LjY1em0tNC40NyAwaDMuNzZ2My43Nkg1LjY1VjUuNjV6XCIvPjwvc3ZnPicgK1xuXHRcdFx0XHRcdFwiPC9idXR0b24+XCJcblx0XHRcdH0sXG5cdFx0XHR0aHVtYnM6IHtcblx0XHRcdFx0YXV0b1N0YXJ0OiBmYWxzZSwgLy8gRGlzcGxheSB0aHVtYm5haWxzIG9uIG9wZW5pbmdcblx0XHRcdFx0aGlkZU9uQ2xvc2U6IHRydWUsIC8vIEhpZGUgdGh1bWJuYWlsIGdyaWQgd2hlbiBjbG9zaW5nIGFuaW1hdGlvbiBzdGFydHNcblx0XHRcdFx0cGFyZW50RWw6IFwiLmZhbmN5Ym94LWNvbnRhaW5lclwiLCAvLyBDb250YWluZXIgaXMgaW5qZWN0ZWQgaW50byB0aGlzIGVsZW1lbnRcblx0XHRcdFx0YXhpczogXCJ5XCIgLy8gVmVydGljYWwgKHkpIG9yIGhvcml6b250YWwgKHgpIHNjcm9sbGluZ1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0JC5mYW5jeWJveC5kZWZhdWx0c1xuXHQpO1xuXG5cdHZhciBGYW5jeVRodW1icyA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuXHRcdHRoaXMuaW5pdChpbnN0YW5jZSk7XG5cdH07XG5cblx0JC5leHRlbmQoRmFuY3lUaHVtYnMucHJvdG90eXBlLCB7XG5cdFx0JGJ1dHRvbjogbnVsbCxcblx0XHQkZ3JpZDogbnVsbCxcblx0XHQkbGlzdDogbnVsbCxcblx0XHRpc1Zpc2libGU6IGZhbHNlLFxuXHRcdGlzQWN0aXZlOiBmYWxzZSxcblxuXHRcdGluaXQ6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRncm91cCA9IGluc3RhbmNlLmdyb3VwLFxuXHRcdFx0XHRlbmFibGVkID0gMDtcblxuXHRcdFx0c2VsZi5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXHRcdFx0c2VsZi5vcHRzID0gZ3JvdXBbaW5zdGFuY2UuY3VyckluZGV4XS5vcHRzLnRodW1icztcblxuXHRcdFx0aW5zdGFuY2UuVGh1bWJzID0gc2VsZjtcblxuXHRcdFx0c2VsZi4kYnV0dG9uID0gaW5zdGFuY2UuJHJlZnMudG9vbGJhci5maW5kKFwiW2RhdGEtZmFuY3lib3gtdGh1bWJzXVwiKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHRodW1icyBpZiBhdCBsZWFzdCB0d28gZ3JvdXAgaXRlbXMgaGF2ZSB0aHVtYm5haWxzXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0aWYgKGdyb3VwW2ldLnRodW1iKSB7XG5cdFx0XHRcdFx0ZW5hYmxlZCsrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVuYWJsZWQgPiAxKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGVuYWJsZWQgPiAxICYmICEhc2VsZi5vcHRzKSB7XG5cdFx0XHRcdHNlbGYuJGJ1dHRvbi5yZW1vdmVBdHRyKFwic3R5bGVcIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi50b2dnbGUoKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi5pc0FjdGl2ZSA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLiRidXR0b24uaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0XHRwYXJlbnRFbCA9IHNlbGYub3B0cy5wYXJlbnRFbCxcblx0XHRcdFx0bGlzdCA9IFtdLFxuXHRcdFx0XHRzcmM7XG5cblx0XHRcdGlmICghc2VsZi4kZ3JpZCkge1xuXHRcdFx0XHQvLyBDcmVhdGUgbWFpbiBlbGVtZW50XG5cdFx0XHRcdHNlbGYuJGdyaWQgPSAkKCc8ZGl2IGNsYXNzPVwiJyArIENMQVNTICsgXCIgXCIgKyBDTEFTUyArIFwiLVwiICsgc2VsZi5vcHRzLmF4aXMgKyAnXCI+PC9kaXY+JykuYXBwZW5kVG8oXG5cdFx0XHRcdFx0aW5zdGFuY2UuJHJlZnMuY29udGFpbmVyXG5cdFx0XHRcdFx0XHQuZmluZChwYXJlbnRFbClcblx0XHRcdFx0XHRcdC5hZGRCYWNrKClcblx0XHRcdFx0XHRcdC5maWx0ZXIocGFyZW50RWwpXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQWRkIFwiY2xpY2tcIiBldmVudCB0aGF0IHBlcmZvcm1zIGdhbGxlcnkgbmF2aWdhdGlvblxuXHRcdFx0XHRzZWxmLiRncmlkLm9uKFwiY2xpY2tcIiwgXCJhXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpbnN0YW5jZS5qdW1wVG8oJCh0aGlzKS5hdHRyKFwiZGF0YS1pbmRleFwiKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdWlsZCB0aGUgbGlzdFxuXHRcdFx0aWYgKCFzZWxmLiRsaXN0KSB7XG5cdFx0XHRcdHNlbGYuJGxpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiJyArIENMQVNTICsgJ19fbGlzdFwiPicpLmFwcGVuZFRvKHNlbGYuJGdyaWQpO1xuXHRcdFx0fVxuXG5cdFx0XHQkLmVhY2goaW5zdGFuY2UuZ3JvdXAsIGZ1bmN0aW9uIChpLCBpdGVtKSB7XG5cdFx0XHRcdHNyYyA9IGl0ZW0udGh1bWI7XG5cblx0XHRcdFx0aWYgKCFzcmMgJiYgaXRlbS50eXBlID09PSBcImltYWdlXCIpIHtcblx0XHRcdFx0XHRzcmMgPSBpdGVtLnNyYztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxpc3QucHVzaChcblx0XHRcdFx0XHQnPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtaW5kZXg9XCInICtcblx0XHRcdFx0XHRpICtcblx0XHRcdFx0XHQnXCInICtcblx0XHRcdFx0XHQoc3JjICYmIHNyYy5sZW5ndGggPyAnIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTp1cmwoJyArIHNyYyArICcpXCInIDogJ2NsYXNzPVwiZmFuY3lib3gtdGh1bWJzLW1pc3NpbmdcIicpICtcblx0XHRcdFx0XHRcIj48L2E+XCJcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRzZWxmLiRsaXN0WzBdLmlubmVySFRNTCA9IGxpc3Quam9pbihcIlwiKTtcblxuXHRcdFx0aWYgKHNlbGYub3B0cy5heGlzID09PSBcInhcIikge1xuXHRcdFx0XHQvLyBTZXQgZml4ZWQgd2lkdGggZm9yIGxpc3QgZWxlbWVudCB0byBlbmFibGUgaG9yaXpvbn
6780RhbCBzY3JvbGxpbmdcblx0XHRcdFx0c2VsZi4kbGlzdC53aWR0aChcblx0XHRcdFx0XHRwYXJzZUludChzZWxmLiRncmlkLmNzcyhcInBhZGRpbmctcmlnaHRcIiksIDEwKSArXG5cdFx0XHRcdFx0aW5zdGFuY2UuZ3JvdXAubGVuZ3RoICpcblx0XHRcdFx0XHRzZWxmLiRsaXN0XG5cdFx0XHRcdFx0XHQuY2hpbGRyZW4oKVxuXHRcdFx0XHRcdFx0LmVxKDApXG5cdFx0XHRcdFx0XHQub3V0ZXJXaWR0aCh0cnVlKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRmb2N1czogZnVuY3Rpb24gKGR1cmF0aW9uKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRsaXN0ID0gc2VsZi4kbGlzdCxcblx0XHRcdFx0JGdyaWQgPSBzZWxmLiRncmlkLFxuXHRcdFx0XHR0aHVtYixcblx0XHRcdFx0dGh1bWJQb3M7XG5cblx0XHRcdGlmICghc2VsZi5pbnN0YW5jZS5jdXJyZW50KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGh1bWIgPSAkbGlzdFxuXHRcdFx0XHQuY2hpbGRyZW4oKVxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoQ0xBU1NfQUNUSVZFKVxuXHRcdFx0XHQuZmlsdGVyKCdbZGF0YS1pbmRleD1cIicgKyBzZWxmLmluc3RhbmNlLmN1cnJlbnQuaW5kZXggKyAnXCJdJylcblx0XHRcdFx0LmFkZENsYXNzKENMQVNTX0FDVElWRSk7XG5cblx0XHRcdHRodW1iUG9zID0gdGh1bWIucG9zaXRpb24oKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgbmVlZCB0byBzY3JvbGwgdG8gbWFrZSBjdXJyZW50IHRodW1iIHZpc2libGVcblx0XHRcdGlmIChzZWxmLm9wdHMuYXhpcyA9PT0gXCJ5XCIgJiYgKHRodW1iUG9zLnRvcCA8IDAgfHwgdGh1bWJQb3MudG9wID4gJGxpc3QuaGVpZ2h0KCkgLSB0aHVtYi5vdXRlckhlaWdodCgpKSkge1xuXHRcdFx0XHQkbGlzdC5zdG9wKCkuYW5pbWF0ZSh7XG5cdFx0XHRcdFx0XHRzY3JvbGxUb3A6ICRsaXN0LnNjcm9sbFRvcCgpICsgdGh1bWJQb3MudG9wXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkdXJhdGlvblxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0c2VsZi5vcHRzLmF4aXMgPT09IFwieFwiICYmXG5cdFx0XHRcdCh0aHVtYlBvcy5sZWZ0IDwgJGdyaWQuc2Nyb2xsTGVmdCgpIHx8IHRodW1iUG9zLmxlZnQgPiAkZ3JpZC5zY3JvbGxMZWZ0KCkgKyAoJGdyaWQud2lkdGgoKSAtIHRodW1iLm91dGVyV2lkdGgoKSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0JGxpc3Rcblx0XHRcdFx0XHQucGFyZW50KClcblx0XHRcdFx0XHQuc3RvcCgpXG5cdFx0XHRcdFx0LmFuaW1hdGUoe1xuXHRcdFx0XHRcdFx0XHRzY3JvbGxMZWZ0OiB0aHVtYlBvcy5sZWZ0XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZHVyYXRpb25cblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciB0aGF0ID0gdGhpcztcblx0XHRcdHRoYXQuaW5zdGFuY2UuJHJlZnMuY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtc2hvdy10aHVtYnNcIiwgdGhpcy5pc1Zpc2libGUpO1xuXG5cdFx0XHRpZiAodGhhdC5pc1Zpc2libGUpIHtcblx0XHRcdFx0aWYgKCF0aGF0LiRncmlkKSB7XG5cdFx0XHRcdFx0dGhhdC5jcmVhdGUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoYXQuaW5zdGFuY2UudHJpZ2dlcihcIm9uVGh1bWJzU2hvd1wiKTtcblxuXHRcdFx0XHR0aGF0LmZvY3VzKDApO1xuXHRcdFx0fSBlbHNlIGlmICh0aGF0LiRncmlkKSB7XG5cdFx0XHRcdHRoYXQuaW5zdGFuY2UudHJpZ2dlcihcIm9uVGh1bWJzSGlkZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIGNvbnRlbnQgcG9zaXRpb25cblx0XHRcdHRoYXQuaW5zdGFuY2UudXBkYXRlKCk7XG5cdFx0fSxcblxuXHRcdGhpZGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdH0sXG5cblx0XHRzaG93OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmlzVmlzaWJsZSA9IHRydWU7XG5cdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdH0sXG5cblx0XHR0b2dnbGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuaXNWaXNpYmxlID0gIXRoaXMuaXNWaXNpYmxlO1xuXHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHR9XG5cdH0pO1xuXG5cdCQoZG9jdW1lbnQpLm9uKHtcblx0XHRcIm9uSW5pdC5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciBUaHVtYnM7XG5cblx0XHRcdGlmIChpbnN0YW5jZSAmJiAhaW5zdGFuY2UuVGh1bWJzKSB7XG5cdFx0XHRcdFRodW1icyA9IG5ldyBGYW5jeVRodW1icyhpbnN0YW5jZSk7XG5cblx0XHRcdFx0aWYgKFRodW1icy5pc0FjdGl2ZSAmJiBUaHVtYnMub3B0cy5hdXRvU3RhcnQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRUaHVtYnMuc2hvdygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYmVmb3JlU2hvdy5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UsIGl0ZW0sIGZpcnN0UnVuKSB7XG5cdFx0XHR2YXIgVGh1bWJzID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuVGh1bWJzO1xuXG5cdFx0XHRpZiAoVGh1bWJzICYmIFRodW1icy5pc1Zpc2libGUpIHtcblx0XHRcdFx0VGh1bWJzLmZvY3VzKGZpcnN0UnVuID8gMCA6IDI1MCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYWZ0ZXJLZXlkb3duLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwga2V5cHJlc3MsIGtleWNvZGUpIHtcblx0XHRcdHZhciBUaHVtYnMgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5UaHVtYnM7XG5cblx0XHRcdC8vIFwiR1wiXG5cdFx0XHRpZiAoVGh1bWJzICYmIFRodW1icy5pc0FjdGl2ZSAmJiBrZXljb2RlID09PSA3MSkge1xuXHRcdFx0XHRrZXlwcmVzcy5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFRodW1icy50b2dnbGUoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0XCJiZWZvcmVDbG9zZS5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciBUaHVtYnMgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5UaHVtYnM7XG5cblx0XHRcdGlmIChUaHVtYnMgJiYgVGh1bWJzLmlzVmlzaWJsZSAmJiBUaHVtYnMub3B0cy5oaWRlT25DbG9zZSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0VGh1bWJzLiRncmlkLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufSkoZG9jdW1lbnQsIGpRdWVyeSk7XG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gU2hhcmVcbi8vIERpc3BsYXlzIHNpbXBsZSBmb3JtIGZvciBzaGFyaW5nIGN1cnJlbnQgdXJ
6780sXG4vL1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbihmdW5jdGlvbiAoZG9jdW1lbnQsICQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0JC5leHRlbmQodHJ1ZSwgJC5mYW5jeWJveC5kZWZhdWx0cywge1xuXHRcdGJ0blRwbDoge1xuXHRcdFx0c2hhcmU6ICc8YnV0dG9uIGRhdGEtZmFuY3lib3gtc2hhcmUgY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS1zaGFyZVwiIHRpdGxlPVwie3tTSEFSRX19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0yLjU1IDE5YzEuNC04LjQgOS4xLTkuOCAxMS45LTkuOFY1bDcgNy03IDYuM3YtMy41Yy0yLjggMC0xMC41IDIuMS0xMS45IDQuMnpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCJcblx0XHR9LFxuXHRcdHNoYXJlOiB7XG5cdFx0XHR1cmw6IGZ1bmN0aW9uIChpbnN0YW5jZSwgaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdCghaW5zdGFuY2UuY3VycmVudEhhc2ggJiYgIShpdGVtLnR5cGUgPT09IFwiaW5saW5lXCIgfHwgaXRlbS50eXBlID09PSBcImh0bWxcIikgPyBpdGVtLm9yaWdTcmMgfHwgaXRlbS5zcmMgOiBmYWxzZSkgfHwgd2luZG93LmxvY2F0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdFx0dHBsOiAnPGRpdiBjbGFzcz1cImZhbmN5Ym94LXNoYXJlXCI+JyArXG5cdFx0XHRcdFwiPGgxPnt7U0hBUkV9fTwvaDE+XCIgK1xuXHRcdFx0XHRcIjxwPlwiICtcblx0XHRcdFx0JzxhIGNsYXNzPVwiZmFuY3lib3gtc2hhcmVfX2J1dHRvbiBmYW5jeWJveC1zaGFyZV9fYnV0dG9uLS1mYlwiIGhyZWY9XCJodHRwczovL3d3dy5mYWNlYm9vay5jb20vc2hhcmVyL3NoYXJlci5waHA/dT17e3VybH19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwibTI4NyA0NTZ2LTI5OWMwLTIxIDYtMzUgMzUtMzVoMzh2LTYzYy03LTEtMjktMy01NS0zLTU0IDAtOTEgMzMtOTEgOTR2MzA2bTE0My0yNTRoLTIwNXY3MmgxOTZcIiAvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjxzcGFuPkZhY2Vib29rPC9zcGFuPlwiICtcblx0XHRcdFx0XCI8L2E+XCIgK1xuXHRcdFx0XHQnPGEgY2xhc3M9XCJmYW5jeWJveC1zaGFyZV9fYnV0dG9uIGZhbmN5Ym94LXNoYXJlX19idXR0b24tLXR3XCIgaHJlZj1cImh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3VybD17e3VybH19JnRleHQ9e3tkZXNjcn19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwibTQ1NiAxMzNjLTE0IDctMzEgMTEtNDcgMTMgMTctMTAgMzAtMjcgMzctNDYtMTUgMTAtMzQgMTYtNTIgMjAtNjEtNjItMTU3LTctMTQxIDc1LTY4LTMtMTI5LTM1LTE2OS04NS0yMiAzNy0xMSA4NiAyNiAxMDktMTMgMC0yNi00LTM3LTkgMCAzOSAyOCA3MiA2NSA4MC0xMiAzLTI1IDQtMzcgMiAxMCAzMyA0MSA1NyA3NyA1Ny00MiAzMC03NyAzOC0xMjIgMzQgMTcwIDExMSAzNzgtMzIgMzU5LTIwOCAxNi0xMSAzMC0yNSA0MS00MnpcIiAvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjxzcGFuPlR3aXR0ZXI8L3NwYW4+XCIgK1xuXHRcdFx0XHRcIjwvYT5cIiArXG5cdFx0XHRcdCc8YSBjbGFzcz1cImZhbmN5Ym94LXNoYXJlX19idXR0b24gZmFuY3lib3gtc2hhcmVfX2J1dHRvbi0tcHRcIiBocmVmPVwiaHR0cHM6Ly93d3cucGludGVyZXN0LmNvbS9waW4vY3JlYXRlL2J1dHRvbi8/dXJsPXt7dXJsfX0mZGVzY3JpcHRpb249e3tkZXNjcn19Jm1lZGlhPXt7bWVkaWF9fVwiPicgK1xuXHRcdFx0XHQnPHN2ZyB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIm0yNjUgNTZjLTEwOSAwLTE2NCA3OC0xNjQgMTQ0IDAgMzkgMTUgNzQgNDcgODcgNSAyIDEwIDAgMTItNWw0LTE5YzItNiAxLTgtMy0xMy05LTExLTE1LTI1LTE1LTQ1IDAtNTggNDMtMTEwIDExMy0xMTAgNjIgMCA5NiAzOCA5NiA4OCAwIDY3LTMwIDEyMi03MyAxMjItMjQgMC00Mi0xOS0zNi00NCA2LTI5IDIwLTYwIDIwLTgxIDAtMTktMTAtMzUtMzEtMzUtMjUgMC00NCAyNi00NCA2MCAwIDIxIDcgMzYgNyAzNmwtMzAgMTI1Yy04IDM3LTEgODMgMCA4NyAwIDMgNCA0IDUgMiAyLTMgMzItMzkgNDItNzVsMTYtNjRjOCAxNiAzMSAyOSA1NiAyOSA3NCAwIDEyNC02NyAxMjQtMTU3IDAtNjktNTgtMTMyLTE0Ni0xMzJ6XCIgZmlsbD1cIiNmZmZcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPHNwYW4+UGludGVyZXN0PC9zcGFuPlwiICtcblx0XHRcdFx0XCI8L2E+XCIgK1xuXHRcdFx0XHRcIjwvcD5cIiArXG5cdFx0XHRcdCc8cD48aW5wdXQgY2xhc3M9XCJmYW5jeWJveC1zaGFyZV9faW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwie3t1cmxfcmF3fX1cIiBvbmNsaWNrPVwic2VsZWN0KClcIiAvPjwvcD4nICtcblx0XHRcdFx0XCI8L2Rpdj5cIlxuXHRcdH1cblx0fSk7XG5cblx0ZnVuY3Rpb24gZXNjYXBlSHRtbChzdHJpbmcpIHtcblx0XHR2YXIgZW50aXR5TWFwID0ge1xuXHRcdFx0XCImXCI6IFwiJmFtcDtcIixcblx0XHRcdFwiPFwiOiBcIiZsdDtcIixcblx0XHRcdFwiPlwiOiBcIiZndDtcIixcblx0XHRcdCdcIic6IFwiJnF1b3Q7XCIsXG5cdFx0XHRcIidcIjogXCImIzM5O1wiLFxuXHRcdFx0XCIvXCI6IFwiJiN4MkY7XCIsXG5cdFx0XHRcImBcIjogXCImI3g2MDtcIixcblx0XHRcdFwiPVwiOiBcIiYjeDNEO1wiXG5cdFx0fTtcblxuXHRcdHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKC9bJjw+XCInYD1cXC9dL2csIGZ1bmN0aW9uIChzKSB7XG5cdFx0XHRyZXR1cm4gZW50aXR5TWFwW3NdO1xuXHRcdH0pO1xuXHR9XG5cblx0JChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIltkYXRhLWZhbmN5Ym94LXNoYXJlXVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGluc3RhbmNlID0gJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpLFxuXHRcdFx0Y3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQgfHwgbnVsbCxcblx0XHRcdHVybCxcblx0XHRcdHRwbDtcblxuXHRcdGlmICghY3VycmVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgkLnR5cGUoY3VycmVudC5vcHRzLnNoYXJlLnVybCkgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0dXJsID0gY3VycmVudC5vcHRzLnNoYXJlLnVybC5hcHBseShjdXJyZW50LCBbaW5zdGFuY2UsIGN1cnJlbnRdKTtcblx0XHR9XG5cblx0XHR0cGwgPSBjdXJyZW50Lm9wdHMuc2hhcmUudHBsXG5cdFx0XHQucmVwbGFjZSgvXFx7XFx7bWVkaWFcXH1cXH0vZywgY3VycmVudC50eXBlID09PSBcImltYWdlXCIgPyBlbmNvZGVVUklDb21wb25lbnQoY3VycmVudC5zcmMpIDogXCJcIilcblx0XHRcdC5yZXBsYWNlKC9cXHtcXHt1cmxcXH1cXH0vZywgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpXG5cdFx0XHQucmVwbGFjZSgvXFx7XFx7dXJsX3Jhd1xcfVxcfS9nLCBlc2NhcGVIdG1sKHVybCkpXG5cdFx0XHQucmVwbGFjZSgvXFx7XFx7ZGVzY3JcXH1cXH0vZywgaW5zdGFuY2UuJGNhcHRpb24gPyBlbmNvZGVVUklDb21wb25lbnQoaW5zdGFuY2UuJGNhcHRpb24udGV4dCgpKSA6IFwiXCIpO1xuXG5cdFx0JC5mYW5jeWJveC5vcGVuKHtcblx0XHRcdHNyYzogaW5zdGFuY2UudHJhbnNsYXRlKGluc3RhbmNlLCB0cGwpLFxuXHRcdFx0dHlwZTogXCJodG1sXCIsXG5cdFx0XHRvcHRzOiB7XG5cdFx0XHRcdHRvdWNoOiBmYWxzZSxcblx0XHRcdFx0YW5pbWF0aW9uRWZmZWN0OiBmYWxzZSxcblx0XHRcdFx0YWZ0ZXJMb2FkOiBmdW5jdGlvbiAoc2hhcmVJbnN0YW5jZSwgc2hhcmVDdXJyZW50KSB7XG5cdFx0XHRcdFx0Ly8gQ2xvc2Ugc2VsZiBpZiBwYXJlbnQgaW5zdGFuY2UgaXMgY2xvc2luZ1xuXHRcdFx0XHRcdGluc3RhbmNlLiRyZWZzLmNvbn
6780RhaW5lci5vbmUoXCJiZWZvcmVDbG9zZS5mYlwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRzaGFyZUluc3RhbmNlLmNsb3NlKG51bGwsIDApO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gT3BlbmluZyBsaW5rcyBpbiBhIHBvcHVwIHdpbmRvd1xuXHRcdFx0XHRcdHNoYXJlQ3VycmVudC4kY29udGVudC5maW5kKFwiLmZhbmN5Ym94LXNoYXJlX19idXR0b25cIikuY2xpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0d2luZG93Lm9wZW4odGhpcy5ocmVmLCBcIlNoYXJlXCIsIFwid2lkdGg9NTUwLCBoZWlnaHQ9NDUwXCIpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRtb2JpbGU6IHtcblx0XHRcdFx0XHRhdXRvRm9jdXM6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59KShkb2N1bWVudCwgalF1ZXJ5KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gSGFzaFxuLy8gRW5hYmxlcyBsaW5raW5nIHRvIGVhY2ggbW9kYWxcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdC8vIFNpbXBsZSAkLmVzY2FwZVNlbGVjdG9yIHBvbHlmaWxsIChmb3IgalF1ZXJ5IHByaW9yIHYzKVxuXHRpZiAoISQuZXNjYXBlU2VsZWN0b3IpIHtcblx0XHQkLmVzY2FwZVNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbCkge1xuXHRcdFx0dmFyIHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXHg4MC1cXHVGRkZGXFx3LV0vZztcblx0XHRcdHZhciBmY3NzZXNjYXBlID0gZnVuY3Rpb24gKGNoLCBhc0NvZGVQb2ludCkge1xuXHRcdFx0XHRpZiAoYXNDb2RlUG9pbnQpIHtcblx0XHRcdFx0XHQvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVJcblx0XHRcdFx0XHRpZiAoY2ggPT09IFwiXFwwXCIpIHtcblx0XHRcdFx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdFx0XHRcdHJldHVybiBjaC5zbGljZSgwLCAtMSkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoY2gubGVuZ3RoIC0gMSkudG9TdHJpbmcoMTYpICsgXCIgXCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdFx0XHRcdHJldHVybiBcIlxcXFxcIiArIGNoO1xuXHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuIChzZWwgKyBcIlwiKS5yZXBsYWNlKHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUpO1xuXHRcdH07XG5cdH1cblxuXHQvLyBHZXQgaW5mbyBhYm91dCBnYWxsZXJ5IG5hbWUgYW5kIGN1cnJlbnQgaW5kZXggZnJvbSB1cmxcblx0ZnVuY3Rpb24gcGFyc2VVcmwoKSB7XG5cdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHIoMSksXG5cdFx0XHRyZXogPSBoYXNoLnNwbGl0KFwiLVwiKSxcblx0XHRcdGluZGV4ID0gcmV6Lmxlbmd0aCA+IDEgJiYgL15cXCs/XFxkKyQvLnRlc3QocmV6W3Jlei5sZW5ndGggLSAxXSkgPyBwYXJzZUludChyZXoucG9wKC0xKSwgMTApIHx8IDEgOiAxLFxuXHRcdFx0Z2FsbGVyeSA9IHJlei5qb2luKFwiLVwiKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNoOiBoYXNoLFxuXHRcdFx0LyogSW5kZXggaXMgc3RhcnRpbmcgZnJvbSAxICovXG5cdFx0XHRpbmRleDogaW5kZXggPCAxID8gMSA6IGluZGV4LFxuXHRcdFx0Z2FsbGVyeTogZ2FsbGVyeVxuXHRcdH07XG5cdH1cblxuXHQvLyBUcmlnZ2VyIGNsaWNrIGV2bnQgb24gbGlua3MgdG8gb3BlbiBuZXcgZmFuY3lCb3ggaW5zdGFuY2Vcblx0ZnVuY3Rpb24gdHJpZ2dlckZyb21VcmwodXJsKSB7XG5cdFx0aWYgKHVybC5nYWxsZXJ5ICE9PSBcIlwiKSB7XG5cdFx0XHQvLyBJZiB3ZSBjYW4gZmluZCBlbGVtZW50IG1hdGNoaW5nICdkYXRhLWZhbmN5Ym94JyBhdHJpYnV0ZSxcblx0XHRcdC8vIHRoZW4gdHJpZ2dlcmluZyBjbGljayBldmVudCBzaG91bGQgc3RhcnQgZmFuY3lCb3hcblx0XHRcdCQoXCJbZGF0YS1mYW5jeWJveD0nXCIgKyAkLmVzY2FwZVNlbGVjdG9yKHVybC5nYWxsZXJ5KSArIFwiJ11cIilcblx0XHRcdFx0LmVxKHVybC5pbmRleCAtIDEpXG5cdFx0XHRcdC5mb2N1cygpXG5cdFx0XHRcdC50cmlnZ2VyKFwiY2xpY2suZmItc3RhcnRcIik7XG5cdFx0fVxuXHR9XG5cblx0Ly8gR2V0IGdhbGxlcnkgbmFtZSBmcm9tIGN1cnJlbnQgaW5zdGFuY2Vcblx0ZnVuY3Rpb24gZ2V0R2FsbGVyeUlEKGluc3RhbmNlKSB7XG5cdFx0dmFyIG9wdHMsIHJldDtcblxuXHRcdGlmICghaW5zdGFuY2UpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRvcHRzID0gaW5zdGFuY2UuY3VycmVudCA/IGluc3RhbmNlLmN1cnJlbnQub3B0cyA6IGluc3RhbmNlLm9wdHM7XG5cdFx0cmV0ID0gb3B0cy5oYXNoIHx8IChvcHRzLiRvcmlnID8gb3B0cy4kb3JpZy5kYXRhKFwiZmFuY3lib3hcIikgfHwgb3B0cy4kb3JpZy5kYXRhKFwiZmFuY3lib3gtdHJpZ2dlclwiKSA6IFwiXCIpO1xuXG5cdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IGZhbHNlIDogcmV0O1xuXHR9XG5cblx0Ly8gU3RhcnQgd2hlbiBET00gYmVjb21lcyByZWFkeVxuXHQkKGZ1bmN0aW9uICgpIHtcblx0XHQvLyBDaGVjayBpZiB1c2VyIGhhcyBkaXNhYmxlZCB0aGlzIG1vZHVsZVxuXHRcdGlmICgkLmZhbmN5Ym94LmRlZmF1bHRzLmhhc2ggPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIGhhc2ggd2hlbiBvcGVuaW5nL2Nsb3NpbmcgZmFuY3lCb3hcblx0XHQkKGRvY3VtZW50KS5vbih7XG5cdFx0XHRcIm9uSW5pdC5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdFx0dmFyIHVybCwgZ2FsbGVyeTtcblxuXHRcdFx0XHRpZiAoaW5zdGFuY2UuZ3JvdXBbaW5zdGFuY2UuY3VyckluZGV4XS5vcHRzLmhhc2ggPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dXJsID0gcGFyc2VVcmwoKTtcblx0XHRcdFx0Z2FsbGVyeSA9IGdldEdhbGxlcnlJRChpbnN0YW5jZSk7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIGdhbGxlcnkgc3RhcnQgaW5kZXggbWF0Y2hlcyBpbmRleCBmcm9tIGhhc2hcblx0XHRcdFx0aWYgKGdhbGxlcnkgJiYgdXJsLmdhbGxlcnkgJiYgZ2FsbGVyeSA9PSB1cmwuZ2FsbGVyeSkge1xuXHRcdFx0XHRcdGluc3RhbmNlLmN1cnJJbmRleCA9IHVybC5pbmRleCAtIDE7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdFwiYmVmb3JlU2hvdy5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UsIGN1cnJlbnQsIGZpcnN0UnVuKSB7XG5cdFx0XHRcdHZhciBnYWxsZXJ5O1xuXG5cdFx0XHRcdGlmICghY3VycmVudCB8fCBjdXJyZW50Lm9wdHMuaGFzaCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBuZWVkIHRvIHVwZGF0ZSB3aW5kb3cgaGFzaFxuXHRcdFx0XHRnYWxsZXJ5ID0gZ2V0R2FsbGVyeUlEKGluc3RhbmNlKTtcblxuXHRcdFx0XHRpZiAoIWdhbGxlcnkpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBWYXJpYWJsZSBjb250YWluaW5nIGxhc3QgaGFzaCB2YWx1ZSBzZXQgYnkgZmFuY3lCb3hcblx0XHRcdFx0Ly8gSXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBmYW5jeUJveCBuZWVkcyB0byBjbG9zZSBhZnRlciBoYXNoIGNoYW5nZSBpcyBkZXRlY3RlZFxuXHRcdFx0XHRpbnN0YW5jZS5jdXJyZW50SGFzaCA9IGdhbGxlcnkgKyAoaW5zdGFuY2UuZ3JvdXAubGVuZ3RoID4gMSA/IFwiLVwiICsgKGN1cnJlbnQuaW5kZXggKyAxKSA6IFwiXCIpO1xuXG5cdFx0XHRcdC8vIElmIGN1cnJlbnQgaGFzaCBpcyB0aGUgc2FtZSAodGhpcyBpbnN0YW5jZSBtb3N0IGxpa2VseSBpcyBvcGVuZWQgYnkgaGFzaGNoYW5nZSksIHRoZW4gZG8gbm90aGluZ1xuXHRcdFx0XHRpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggPT09IFwiI1wiICsgaW5zdGFuY2UuY3VycmVudEhhc2gpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZmlyc3RSdW4gJiYgIWluc3RhbmNlLm9yaWdIYXNoKSB7XG5cdFx0XHRcdFx0aW5zdGFuY2Uub3JpZ0hhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpbnN0YW5jZS5oYXNoVGltZXIpIHtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQoaW5zdGFuY2UuaGFzaFRpbWVyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVwZGF0ZSBoYXNoXG5cdFx0XHRcdGluc3RhbmNlLmhhc2hUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChcInJlcGxhY2VTdGF0ZVwiIGluIHdpbmRvdy5oaXN0b3J5KSB7XG5cdFx0XHRcdFx0XHR3aW5kb3cuaGlzdG9yeVtmaXJzdFJ1biA/IFwicHVzaFN0YXRlXCIgOiBcInJlcGxhY2VTdGF0ZVwiXSh7fSxcblx0XHRcdFx0XHRcdFx0ZG9jdW1lbnQudGl0bGUsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyBcIiNcIiArIGluc3RhbmNlLmN1cnJlbnRIYXNoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlyc3RSdW4pIHtcblx0XHRcdFx0XHRcdFx0aW5zdGFuY2UuaGFzQ3JlYXRlZEhpc3RvcnkgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaGFzaCA9IGluc3RhbmNlLmN1cnJlbnRIYXNoO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGluc3RhbmNlLmhhc2hUaW1lciA9IG51bGw7XG5cdFx0XHRcdH0sIDMwMCk7XG5cdFx0XHR9LFxuXG5cdFx0XHRcImJlZm9yZUNsb3NlLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCkge1xuXHRcdFx0XHRpZiAoIWN1cnJlbnQgfHwgY3VycmVudC5vcHRzLmhhc2ggPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2xlYXJUaW1lb3V0KGluc3RhbmNlLmhhc2hUaW1lcik7XG5cblx0XHRcdFx0Ly8gR290byBwcmV2aW91cyBoaXN0b3J5IGVudHJ5XG5cdFx0XHRcdGlmIChpbnN0YW5jZS5jdXJyZW50SGFzaCAmJiBpbnN0YW5jZS5oYXNDcmVhdGVkSGlzdG9yeSkge1xuXHRcdFx0XHRcdHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpbnN0YW5jZS5jdXJyZW50SGFzaCkge1xuXHRcdFx0XHRcdGlmIChcInJlcGxhY2VTdGF0ZVwiIGluIHdpbmRvdy5oaXN0b3J5KSB7XG5cdFx0XHRcdFx0XHR3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgKGluc3RhbmNlLm9yaWdIYXNoIHx8IFwiXCIpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhhc2ggPSBpbnN0YW5jZS5vcmlnSGFzaDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnN0YW5jZS5jdXJyZW50SGFzaCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBDaGVjayBpZiBuZWVkIHRvIHN0YXJ0L2Nsb3NlIGFmdGVyIHVybCBoYXMgY2hhbmdlZFxuXHRcdCQod2luZG93KS5vbihcImhhc2hjaGFuZ2UuZmJcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHVybCA9IHBhcnNlVXJsKCksXG5cdFx0XHRcdGZiID0gbnVsbDtcblxuXHRcdFx0Ly8gRmluZCBsYXN0IGZhbmN5Qm94IGluc3RhbmNlIHRoYXQgaGFzIFwiaGFzaFwiXG5cdFx0XHQkLmVhY2goXG5cdFx0XHRcdCQoXCIuZmFuY3lib3gtY29udGFpbmVyXCIpXG5cdFx0XHRcdFx0LmdldCgpXG5cdFx0XHRcdFx0LnJldmVyc2UoKSxcblx0XHRcdFx0ZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuXHRcdFx0XHRcdHZhciB0bXAgPSAkKHZhbHVlKS5kYXRhKFwiRmFuY3lCb3hcIik7XG5cblx0XHRcdFx0XHRpZiAodG1wICYmIHRtcC5jdXJyZW50SGFzaCkge1xuXHRcdFx0XHRcdFx0ZmIgPSB0bXA7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZmIpIHtcblx0XHRcdFx0Ly8gTm93LCBjb21wYXJlIGhhc2ggdmFsdWVzXG5cdFx0XHRcdGlmIChmYi5jdXJyZW50SGFzaCAhPT0gdXJsLmdhbGxlcnkgKyBcIi1cIiArIHVybC5pbmRleCAmJiAhKHVybC5pbmRleCA9PT0gMSAmJi
6780BmYi5jdXJyZW50SGFzaCA9PSB1cmwuZ2FsbGVyeSkpIHtcblx0XHRcdFx0XHRmYi5jdXJyZW50SGFzaCA9IG51bGw7XG5cblx0XHRcdFx0XHRmYi5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHVybC5nYWxsZXJ5ICE9PSBcIlwiKSB7XG5cdFx0XHRcdHRyaWdnZXJGcm9tVXJsKHVybCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBDaGVjayBjdXJyZW50IGhhc2ggYW5kIHRyaWdnZXIgY2xpY2sgZXZlbnQgb24gbWF0Y2hpbmcgZWxlbWVudCB0byBzdGFydCBmYW5jeUJveCwgaWYgbmVlZGVkXG5cdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoISQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKSkge1xuXHRcdFx0XHR0cmlnZ2VyRnJvbVVybChwYXJzZVVybCgpKTtcblx0XHRcdH1cblx0XHR9LCA1MCk7XG5cdH0pO1xufSkod2luZG93LCBkb2N1bWVudCwgalF1ZXJ5KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gV2hlZWxcbi8vIEJhc2ljIG1vdXNlIHdlaGVlbCBzdXBwb3J0IGZvciBnYWxsZXJ5IG5hdmlnYXRpb25cbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uIChkb2N1bWVudCwgJCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgcHJldlRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuXHQkKGRvY3VtZW50KS5vbih7XG5cdFx0XCJvbkluaXQuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlLCBjdXJyZW50KSB7XG5cdFx0XHRpbnN0YW5jZS4kcmVmcy5zdGFnZS5vbihcIm1vdXNld2hlZWwgRE9NTW91c2VTY3JvbGwgd2hlZWwgTW96TW91c2VQaXhlbFNjcm9sbFwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHR2YXIgY3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQsXG5cdFx0XHRcdFx0Y3VyclRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuXHRcdFx0XHRpZiAoaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIDwgMiB8fCBjdXJyZW50Lm9wdHMud2hlZWwgPT09IGZhbHNlIHx8IChjdXJyZW50Lm9wdHMud2hlZWwgPT09IFwiYXV0b1wiICYmIGN1cnJlbnQudHlwZSAhPT0gXCJpbWFnZVwiKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0XHRpZiAoY3VycmVudC4kc2xpZGUuaGFzQ2xhc3MoXCJmYW5jeWJveC1hbmltYXRlZFwiKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGUgPSBlLm9yaWdpbmFsRXZlbnQgfHwgZTtcblxuXHRcdFx0XHRpZiAoY3VyclRpbWUgLSBwcmV2VGltZSA8IDI1MCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHRcdFx0aW5zdGFuY2VbKC1lLmRlbHRhWSB8fCAtZS5kZWx0YVggfHwgZS53aGVlbERlbHRhIHx8IC1lLmRldGFpbCkgPCAwID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCJdKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xufSkoZG9jdW1lbnQsIGpRdWVyeSk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNFxuXG4vKiogQHByZXNlcnZlIE92ZXJsYXBwaW5nTWFya2VyU3BpZGVyZmllclxuaHR0cHM6Ly9naXRodWIuY29tL2phd2ovT3ZlcmxhcHBpbmdNYXJrZXJTcGlkZXJmaWVyXG5Db3B5cmlnaHQgKGMpIDIwMTEgLSAyMDEzIEdlb3JnZSBNYWNLZXJyb25cblJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZTogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG5Ob3RlOiBUaGUgR29vZ2xlIE1hcHMgQVBJIHYzIG11c3QgYmUgaW5jbHVkZWQgKmJlZm9yZSogdGhpcyBjb2RlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICB2YXIgcmVmLFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgICBzbGljZSA9IFtdLnNsaWNlO1xuXG4gIGlmICgoKHJlZiA9IHRoaXNbJ2dvb2dsZSddKSAhPSBudWxsID8gcmVmWydtYXBzJ10gOiB2b2lkIDApID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzWydPdmVybGFwcGluZ01hcmtlclNwaWRlcmZpZXInXSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2UsIGdtLCBqLCBsY0gsIGxjVSwgbGVuLCBtdCwgcCwgcmVmMSwgdHdvUGksIHg7XG5cbiAgICBwID0gX0NsYXNzLnByb3RvdHlwZTtcblxuICAgIHJlZjEgPSBbX0NsYXNzLCBwXTtcbiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB4ID0gcmVmMVtqXTtcbiAgICAgIHhbJ1ZFUlNJT04nXSA9ICcwLjMuMyc7XG4gICAgfVxuXG4gICAgZ20gPSBnb29nbGUubWFwcztcblxuICAgIGdlID0gZ20uZXZlbnQ7XG5cbiAgICBtdCA9IGdtLk1hcFR5cGVJZDtcblxuICAgIHR3b1BpID0gTWF0aC5QSSAqIDI7XG5cbiAgICBwWydrZWVwU3BpZGVyZmllZCddID0gZmFsc2U7XG5cbiAgICBwWydtYXJrZXJzV29udEhpZGUnXSA9IGZhbHNlO1xuXG4gICAgcFsnbWFya2Vyc1dvbnRNb3ZlJ10gPSBmYWxzZTtcblxuICAgIHBbJ25lYXJieURpc3RhbmNlJ10gPSAyMDtcblxuICAgIHBbJ2NpcmNsZVNwaXJhbFN3aXRjaG92ZXInXSA9IDk7XG5cbiAgICBwWydjaXJjbGVGb290U2VwYXJhdGlvbiddID0gMjM7XG5cbiAgICBwWydjaXJjbGVTdGFydEFuZ2xlJ10gPSB0d29QaSAvIDEyO1xuXG4gICAgcFsnc3BpcmFsRm9vdFNlcGFyYXRpb24nXSA9IDI2O1xuXG4gICAgcFsnc3BpcmFsTGVuZ3RoU3RhcnQnXSA9IDExO1xuXG4gICAgcFsnc3BpcmFsTGVuZ3RoRmFjdG9yJ10gPSA0O1xuXG4gICAgcFsnc3BpZGVyZmllZFpJbmRleCddID0gMTAwMDtcblxuICAgIHBbJ3VzdWFsTGVnWkluZGV4J10gPSAxMDtcblxuICAgIHBbJ2hpZ2hsaWdodGVkTGVnWkluZGV4J10gPSAyMDtcblxuICAgIHBbJ2xlZ1dlaWdodCddID0gMS41O1xuXG4gICAgcFsnbGVnQ29sb3JzJ10gPSB7XG4gICAgICAndXN1YWwnOiB7fSxcbiAgICAgICdoaWdobGlnaHRlZCc6IHt9XG4gICAgfTtcblxuICAgIGxjVSA9IHBbJ2xlZ0NvbG9ycyddWyd1c3VhbCddO1xuXG4gICAgbGNIID0gcFsnbGVnQ29sb3JzJ11bJ2hpZ2hsaWdodGVkJ107XG5cbiAgICBsY1VbbXQuSFlCUklEXSA9IGxjVVttdC5TQVRFTExJVEVdID0gJyNmZmYnO1xuXG4gICAgbGNIW210LkhZQlJJRF0gPSBsY0hbbXQuU0FURUxMSVRFXSA9ICcjZjAwJztcblxuICAgIGxjVVttdC5URVJSQUlOXSA9IGxjVVttdC5ST0FETUFQXSA9ICcjNDQ0JztcblxuICAgIGxjSFttdC5URVJSQUlOXSA9IGxjSFttdC5ST0FETUFQXSA9ICcjZjAwJztcblxuICAgIGZ1bmN0aW9uIF9DbGFzcyhtYXAxLCBvcHRzKSB7XG4gICAgICB2Y
6780XIgZSwgaywgbCwgbGVuMSwgcmVmMiwgdjtcbiAgICAgIHRoaXMubWFwID0gbWFwMTtcbiAgICAgIGlmIChvcHRzID09IG51bGwpIHtcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgfVxuICAgICAgZm9yIChrIGluIG9wdHMpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwob3B0cywgaykpIGNvbnRpbnVlO1xuICAgICAgICB2ID0gb3B0c1trXTtcbiAgICAgICAgdGhpc1trXSA9IHY7XG4gICAgICB9XG4gICAgICB0aGlzLnByb2pIZWxwZXIgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvci5Qcm9qSGVscGVyKHRoaXMubWFwKTtcbiAgICAgIHRoaXMuaW5pdE1hcmtlckFycmF5cygpO1xuICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICAgIHJlZjIgPSBbJ2NsaWNrJywgJ3pvb21fY2hhbmdlZCcsICdtYXB0eXBlaWRfY2hhbmdlZCddO1xuICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHJlZjIubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgIGUgPSByZWYyW2xdO1xuICAgICAgICBnZS5hZGRMaXN0ZW5lcih0aGlzLm1hcCwgZSwgKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzWyd1bnNwaWRlcmZ5J10oKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KSh0aGlzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcC5pbml0TWFya2VyQXJyYXlzID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgIHJldHVybiB0aGlzLm1hcmtlckxpc3RlbmVyUmVmcyA9IFtdO1xuICAgIH07XG5cbiAgICBwWydhZGRNYXJrZXInXSA9IGZ1bmN0aW9uKG1hcmtlcikge1xuICAgICAgdmFyIGxpc3RlbmVyUmVmcztcbiAgICAgIGlmIChtYXJrZXJbJ19vbXMnXSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgbWFya2VyWydfb21zJ10gPSB0cnVlO1xuICAgICAgbGlzdGVuZXJSZWZzID0gW1xuICAgICAgICBnZS5hZGRMaXN0ZW5lcihtYXJrZXIsICdjbGljaycsIChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNwaWRlckxpc3RlbmVyKG1hcmtlciwgZXZlbnQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pKHRoaXMpKVxuICAgICAgXTtcbiAgICAgIGlmICghdGhpc1snbWFya2Vyc1dvbnRIaWRlJ10pIHtcbiAgICAgICAgbGlzdGVuZXJSZWZzLnB1c2goZ2UuYWRkTGlzdGVuZXIobWFya2VyLCAndmlzaWJsZV9jaGFuZ2VkJywgKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm1hcmtlckNoYW5nZUxpc3RlbmVyKG1hcmtlciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pKHRoaXMpKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXNbJ21hcmtlcnNXb250TW92ZSddKSB7XG4gICAgICAgIGxpc3RlbmVyUmVmcy5wdXNoKGdlLmFkZExpc3RlbmVyKG1hcmtlciwgJ3Bvc2l0aW9uX2NoYW5nZWQnLCAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMubWFya2VyQ2hhbmdlTGlzdGVuZXIobWFya2VyLCB0cnVlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KSh0aGlzKSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXJrZXJMaXN0ZW5lclJlZnMucHVzaChsaXN0ZW5lclJlZnMpO1xuICAgICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBwLm1hcmtlckNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24obWFya2VyLCBwb3NpdGlvbkNoYW5nZWQpIHtcbiAgICAgIGlmICgobWFya2VyWydfb21zRGF0YSddICE9IG51bGwpICYmIChwb3NpdGlvbkNoYW5nZWQgfHwgIW1hcmtlci5nZXRWaXNpYmxlKCkpICYmICEoKHRoaXMuc3BpZGVyZnlpbmcgIT0gbnVsbCkgfHwgKHRoaXMudW5zcGlkZXJmeWluZyAhPSBudWxsKSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbJ3Vuc3BpZGVyZnknXShwb3NpdGlvbkNoYW5nZWQgPyBtYXJrZXIgOiBudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcFsnZ2V0TWFya2VycyddID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXJrZXJzLnNsaWNlKDApO1xuICAgIH07XG5cbiAgICBwWydyZW1vdmVNYXJrZXInXSA9IGZ1bmN0aW9uKG1hcmtlcikge1xuICAgICAgdmFyIGksIGwsIGxlbjEsIGxpc3RlbmVyUmVmLCBsaXN0ZW5lclJlZnM7XG4gICAgICBpZiAobWFya2VyWydfb21zRGF0YSddICE9IG51bGwpIHtcbiAgICAgICAgdGhpc1sndW5zcGlkZXJmeSddKCk7XG4gICAgICB9XG4gICAgICBpID0gdGhpcy5hcnJJbmRleE9mKHRoaXMubWFya2VycywgbWFya2VyKTtcbiAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyUmVmcyA9IHRoaXMubWFya2VyTGlzdGVuZXJSZWZzLnNwbGljZShpLCAxKVswXTtcbiAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBsaXN0ZW5lclJlZnMubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgIGxpc3RlbmVyUmVmID0gbGlzdGVuZXJSZWZzW2xdO1xuICAgICAgICBnZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lclJlZik7XG4gICAgICB9XG4gICAgICBkZWxldGUgbWFya2VyWydfb21zJ107XG4gICAgICB0aGlzLm1hcmtlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHBbJ2NsZWFyTWFya2VycyddID0gZnVuY3Rpb24oKSB7XG4gICAgICB2Y
6780XIgaSwgbCwgbGVuMSwgbGVuMiwgbGlzdGVuZXJSZWYsIGxpc3RlbmVyUmVmcywgbWFya2VyLCBuLCByZWYyO1xuICAgICAgdGhpc1sndW5zcGlkZXJmeSddKCk7XG4gICAgICByZWYyID0gdGhpcy5tYXJrZXJzO1xuICAgICAgZm9yIChpID0gbCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGkgPSArK2wpIHtcbiAgICAgICAgbWFya2VyID0gcmVmMltpXTtcbiAgICAgICAgbGlzdGVuZXJSZWZzID0gdGhpcy5tYXJrZXJMaXN0ZW5lclJlZnNbaV07XG4gICAgICAgIGZvciAobiA9IDAsIGxlbjIgPSBsaXN0ZW5lclJlZnMubGVuZ3RoOyBuIDwgbGVuMjsgbisrKSB7XG4gICAgICAgICAgbGlzdGVuZXJSZWYgPSBsaXN0ZW5lclJlZnNbbl07XG4gICAgICAgICAgZ2UucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJSZWYpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBtYXJrZXJbJ19vbXMnXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdE1hcmtlckFycmF5cygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHBbJ2FkZExpc3RlbmVyJ10gPSBmdW5jdGlvbihldmVudCwgZnVuYykge1xuICAgICAgdmFyIGJhc2U7XG4gICAgICAoKGJhc2UgPSB0aGlzLmxpc3RlbmVycylbZXZlbnRdICE9IG51bGwgPyBiYXNlW2V2ZW50XSA6IGJhc2VbZXZlbnRdID0gW10pLnB1c2goZnVuYyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgcFsncmVtb3ZlTGlzdGVuZXInXSA9IGZ1bmN0aW9uKGV2ZW50LCBmdW5jKSB7XG4gICAgICB2Y
6780XIgaTtcbiAgICAgIGkgPSB0aGlzLmFyckluZGV4T2YodGhpcy5saXN0ZW5lcnNbZXZlbnRdLCBmdW5jKTtcbiAgICAgIGlmICghKGkgPCAwKSkge1xuICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudF0uc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHBbJ2NsZWFyTGlzdGVuZXJzJ10gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRdID0gW107XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgcC50cmlnZ2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncywgZXZlbnQsIGZ1bmMsIGwsIGxlbjEsIHJlZjIsIHJlZjMsIHJlc3VsdHM7XG4gICAgICBldmVudCA9IGFyZ3VtZW50c1swXSwgYXJncyA9IDIgPD0gYXJndW1lbnRzLmxlbmd0aCA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSA6IFtdO1xuICAgICAgcmVmMyA9IChyZWYyID0gdGhpcy5saXN0ZW5lcnNbZXZlbnRdKSAhPSBudWxsID8gcmVmMiA6IFtdO1xuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHJlZjMubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgIGZ1bmMgPSByZWYzW2xdO1xuICAgICAgICByZXN1bHRzLnB1c2goZnVuYy5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuXG4gICAgcC5nZW5lcmF0ZVB0c0NpcmNsZSA9IGZ1bmN0aW9uKGNvdW50LCBjZW50ZXJQdCkge1xuICAgICAgdmFyIGFuZ2xlLCBhbmdsZVN0ZXAsIGNpcmN1bWZlcmVuY2UsIGksIGwsIGxlZ0xlbmd0aCwgcmVmMiwgcmVzdWx0cztcbiAgICAgIGNpcmN1bWZlcmVuY2UgPSB0aGlzWydjaXJjbGVGb290U2VwYXJhdGlvbiddICogKDIgKyBjb3VudCk7XG4gICAgICBsZWdMZW5ndGggPSBjaXJjdW1mZXJlbmNlIC8gdHdvUGk7XG4gICAgICBhbmdsZVN0ZXAgPSB0d29QaSAvIGNvdW50O1xuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yIChpID0gbCA9IDAsIHJlZjIgPSBjb3VudDsgMCA8PSByZWYyID8gbCA8IHJlZjIgOiBsID4gcmVmMjsgaSA9IDAgPD0gcmVmMiA/ICsrbCA6IC0tbCkge1xuICAgICAgICBhbmdsZSA9IHRoaXNbJ2NpcmNsZVN0YXJ0QW5nbGUnXSArIGkgKiBhbmdsZVN0ZXA7XG4gICAgICAgIHJlc3VsdHMucHVzaChuZXcgZ20uUG9pbnQoY2VudGVyUHQueCArIGxlZ0xlbmd0aCAqIE1hdGguY29zKGFuZ2xlKSwgY2VudGVyUHQueSArIGxlZ0xlbmd0aCAqIE1hdGguc2luKGFuZ2xlKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfTtcblxuICAgIHAuZ2VuZXJhdGVQdHNTcGlyYWwgPSBmdW5jdGlvbihjb3VudCwgY2VudGVyUHQpIHtcbiAgICAgIHZhciBhbmdsZSwgaSwgbCwgbGVnTGVuZ3RoLCBwdCwgcmVmMiwgcmVzdWx0cztcbiAgICAgIGxlZ0xlbmd0aCA9IHRoaXNbJ3NwaXJhbExlbmd0aFN0YXJ0J107XG4gICAgICBhbmdsZSA9IDA7XG4gICAgICByZXN1bHRzID0gW107XG4gICAgICBmb3IgKGkgPSBsID0gMCwgcmVmMiA9IGNvdW50OyAwIDw9IHJlZjIgPyBsIDwgcmVmMiA6IGwgPiByZWYyOyBpID0gMCA8PSByZWYyID8gKytsIDogLS1sKSB7XG4gICAgICAgIGFuZ2xlICs9IHRoaXNbJ3NwaXJhbEZvb3RTZXBhcmF0aW9uJ10gLyBsZWdMZW5ndGggKyBpICogMC4wMDA1O1xuICAgICAgICBwdCA9IG5ldyBnbS5Qb2ludChjZW50ZXJQdC54ICsgbGVnTGVuZ3RoICogTWF0aC5jb3MoYW5nbGUpLCBjZW50ZXJQdC55ICsgbGVnTGVuZ3RoICogTWF0aC5zaW4oYW5nbGUpKTtcbiAgICAgICAgbGVnTGVuZ3RoICs9IHR3b1BpICogdGhpc1snc3BpcmFsTGVuZ3RoRmFjdG9yJ10gLyBhbmdsZTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHB0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICBwLnNwaWRlckxpc3RlbmVyID0gZnVuY3Rpb24obWFya2VyLCBldmVudCkge1xuICAgICAgdmFyIGwsIGxlbjEsIG0sIG1QdCwgbWFya2VyUHQsIG1hcmtlclNwaWRlcmZpZWQsIG5EaXN0LCBuZWFyYnlNYXJrZXJEYXRhLCBub25OZWFyYnlNYXJrZXJzLCBweFNxLCByZWYyO1xuICAgICAgbWFya2VyU3BpZGVyZmllZCA9IG1hcmtlclsnX29tc0RhdGEnXSAhPSBudWxsO1xuICAgICAgaWYgKCEobWFya2VyU3BpZGVyZmllZCAmJiB0aGlzWydrZWVwU3BpZGVyZmllZCddKSkge1xuICAgICAgICB0aGlzWyd1bnNwaWRlcmZ5J10oKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXJrZXJTcGlkZXJmaWVkIHx8IHRoaXMubWFwLmdldFN0cmVldFZpZXcoKS5nZXRWaXNpYmxlKCkgfHwgdGhpcy5tYXAuZ2V0TWFwVHlwZUlkKCkgPT09ICdHb29nbGVFYXJ0aEFQSScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignY2xpY2snLCBtYXJrZXIsIGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXJieU1hcmtlckRhdGEgPSBbXTtcbiAgICAgICAgbm9uTmVhcmJ5TWFya2VycyA9IFtdO1xuICAgICAgICBuRGlzdCA9IHRoaXNbJ25lYXJieURpc3RhbmNlJ107XG4gICAgICAgIHB4U3EgPSBuRGlzdCAqIG5EaXN0O1xuICAgICAgICBtYXJrZXJQdCA9IHRoaXMubGxUb1B0KG1hcmtlci5wb3NpdGlvbik7XG4gICAgICAgIHJlZjIgPSB0aGlzLm1hcmtlcnM7XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIG0gPSByZWYyW2xdO1xuICAgICAgICAgIGlmICghKChtLm1hcCAhPSBudWxsKSAmJiBtLmdldFZpc2libGUoKSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtUHQgPSB0aGlzLmxsVG9QdChtLnBvc2l0aW9uKTtcbiAgICAgICAgICBpZiAodGhpcy5wdERpc3RhbmNlU3EobVB0LCBtYXJrZXJQdCkgPCBweFNxKSB7XG4gICAgICAgICAgICBuZWFyYnlNYXJrZXJEYXRhLnB1c2goe1xuICAgICAgICAgICAgICBtYXJrZXI6IG0sXG4gICAgICAgICAgICAgIG1hcmtlclB0OiBtUHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub25OZWFyYnlNYXJrZXJzLnB1c2gobSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZWFyYnlNYXJrZXJEYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgI
6780HJldHVybiB0aGlzLnRyaWdnZXIoJ2NsaWNrJywgbWFya2VyLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3BpZGVyZnkobmVhcmJ5TWFya2VyRGF0YSwgbm9uTmVhcmJ5TWFya2Vycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcFsnbWFya2Vyc05lYXJNYXJrZXInXSA9IGZ1bmN0aW9uKG1hcmtlciwgZmlyc3RPbmx5KSB7XG4gICAgICB2YXIgbCwgbGVuMSwgbSwgbVB0LCBtYXJrZXJQdCwgbWFya2VycywgbkRpc3QsIHB4U3EsIHJlZjIsIHJlZjMsIHJlZjQ7XG4gICAgICBpZiAoZmlyc3RPbmx5ID09IG51bGwpIHtcbiAgICAgICAgZmlyc3RPbmx5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9qSGVscGVyLmdldFByb2plY3Rpb24oKSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IFwiTXVzdCB3YWl0IGZvciAnaWRsZScgZXZlbnQgb24gbWFwIGJlZm9yZSBjYWxsaW5nIG1hcmtlcnNOZWFyTWFya2VyXCI7XG4gICAgICB9XG4gICAgICBuRGlzdCA9IHRoaXNbJ25lYXJieURpc3RhbmNlJ107XG4gICAgICBweFNxID0gbkRpc3QgKiBuRGlzdDtcbiAgICAgIG1hcmtlclB0ID0gdGhpcy5sbFRvUHQobWFya2VyLnBvc2l0aW9uKTtcbiAgICAgIG1hcmtlcnMgPSBbXTtcbiAgICAgIHJlZjIgPSB0aGlzLm1hcmtlcnM7XG4gICAgICBmb3IgKGwgPSAwLCBsZW4xID0gcmVmMi5sZW5ndGg7IGwgPCBsZW4xOyBsKyspIHtcbiAgICAgICAgbSA9IHJlZjJbbF07XG4gICAgICAgIGlmIChtID09PSBtYXJrZXIgfHwgKG0ubWFwID09IG51bGwpIHx8ICFtLmdldFZpc2libGUoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1QdCA9IHRoaXMubGxUb1B0KChyZWYzID0gKHJlZjQgPSBtWydfb21zRGF0YSddKSAhPSBudWxsID8gcmVmNC51c3VhbFBvc2l0aW9uIDogdm9pZCAwKSAhPSBudWxsID8gcmVmMyA6IG0ucG9zaXRpb24pO1xuICAgICAgICBpZiAodGhpcy5wdERpc3RhbmNlU3EobVB0LCBtYXJrZXJQdCkgPCBweFNxKSB7XG4gICAgICAgICAgbWFya2Vycy5wdXNoKG0pO1xuICAgICAgICAgIGlmIChmaXJzdE9ubHkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcmtlcnM7XG4gICAgfTtcblxuICAgIHBbJ21hcmtlcnNOZWFyQW55T3RoZXJNYXJrZXInXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGksIGkxLCBpMiwgbCwgbGVuMSwgbGVuMiwgbGVuMywgbSwgbTEsIG0xRGF0YSwgbTIsIG0yRGF0YSwgbURhdGEsIG4sIG5EaXN0LCBweFNxLCBxLCByZWYyLCByZWYzLCByZWY0LCByZXN1bHRzO1xuICAgICAgaWYgKHRoaXMucHJvakhlbHBlci5nZXRQcm9qZWN0aW9uKCkgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBcIk11c3Qgd2FpdCBmb3IgJ2lkbGUnIGV2ZW50IG9uIG1hcCBiZWZvcmUgY2FsbGluZyBtYXJrZXJzTmVhckFueU90aGVyTWFya2VyXCI7XG4gICAgICB9XG4gICAgICBuRGlzdCA9IHRoaXNbJ25lYXJieURpc3RhbmNlJ107XG4gICAgICBweFNxID0gbkRpc3QgKiBuRGlzdDtcbiAgICAgIG1EYXRhID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICB2Y
6780XIgbCwgbGVuMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVzdWx0cztcbiAgICAgICAgcmVmMiA9IHRoaXMubWFya2VycztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGwgPSAwLCBsZW4xID0gcmVmMi5sZW5ndGg7IGwgPCBsZW4xOyBsKyspIHtcbiAgICAgICAgICBtID0gcmVmMltsXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgcHQ6IHRoaXMubGxUb1B0KChyZWYzID0gKHJlZjQgPSBtWydfb21zRGF0YSddKSAhPSBudWxsID8gcmVmNC51c3VhbFBvc2l0aW9uIDogdm9pZCAwKSAhPSBudWxsID8gcmVmMyA6IG0ucG9zaXRpb24pLFxuICAgICAgICAgICAgd2lsbFNwaWRlcmZ5OiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSkuY2FsbCh0aGlzKTtcbiAgICAgIHJlZjIgPSB0aGlzLm1hcmtlcnM7XG4gICAgICBmb3IgKGkxID0gbCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGkxID0gKytsKSB7XG4gICAgICAgIG0xID0gcmVmMltpMV07XG4gICAgICAgIGlmICghKChtMS5tYXAgIT0gbnVsbCkgJiYgbTEuZ2V0VmlzaWJsZSgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG0xRGF0YSA9IG1EYXRhW2kxXTtcbiAgICAgICAgaWYgKG0xRGF0YS53aWxsU3BpZGVyZnkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZWYzID0gdGhpcy5tYXJrZXJzO1xuICAgICAgICBmb3IgKGkyID0gbiA9IDAsIGxlbjIgPSByZWYzLmxlbmd0aDsgbiA8IGxlbjI7IGkyID0gKytuKSB7XG4gICAgICAgICAgbTIgPSByZWYzW2kyXTtcbiAgICAgICAgICBpZiAoaTIgPT09IGkxKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEoKG0yLm1hcCAhPSBudWxsKSAmJiBtMi5nZXRWaXNpYmxlKCkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbTJEYXRhID0gbURhdGFbaTJdO1xuICAgICAgICAgIGlmIChpMiA8IGkxICYmICFtMkRhdGEud2lsbFNwaWRlcmZ5KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMucHREaXN0YW5jZVNxKG0xRGF0YS5wdCwgbTJEYXRhLnB0KSA8IHB4U3EpIHtcbiAgICAgICAgICAgIG0xRGF0YS53aWxsU3BpZGVyZnkgPSBtMkRhdGEud2lsbFNwaWRlcmZ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVmNCA9IHRoaXMubWFya2VycztcbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIGZvciAoaSA9IHEgPSAwLCBsZW4zID0gcmVmNC5sZW5ndGg7IHEgPCBsZW4zOyBpID0gKytxKSB7XG4gICAgICAgIG0gPSByZWY0W2ldO1xuICAgICAgICBpZiAobURhdGFbaV0ud2lsbFNwaWRlcmZ5KSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuXG4gICAgcC5tYWtlSGlnaGxpZ2h0TGlzdGVuZXJGdW5jcyA9IGZ1bmN0aW9uKG1hcmtlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGlnaGxpZ2h0OiAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyWydfb21zRGF0YSddLmxlZy5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzWydsZWdDb2xvcnMnXVsnaGlnaGxpZ2h0ZWQnXVtfdGhpcy5tYXAubWFwVHlwZUlkXSxcbiAgICAgICAgICAgICAgekluZGV4OiBfdGhpc1snaGlnaGxpZ2h0ZWRMZWdaSW5kZXgnXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkodGhpcyksXG4gICAgICAgIHVuaGlnaGxpZ2h0OiAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyWydfb21zRGF0YSddLmxlZy5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzWydsZWdDb2xvcnMnXVsndXN1YWwnXVtfdGhpcy5tYXAubWFwVHlwZUlkXSxcbiAgICAgICAgICAgICAgekluZGV4OiBfdGhpc1sndXN1YWxMZWdaSW5kZXgnXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkodGhpcylcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHAuc3BpZGVyZnkgPSBmdW5jdGlvbihtYXJrZXJEYXRhLCBub25OZWFyYnlNYXJrZXJzKSB7XG4gICAgICB2Y
6780XIgYm9keVB0LCBmb290TGwsIGZvb3RQdCwgZm9vdFB0cywgaGlnaGxpZ2h0TGlzdGVuZXJGdW5jcywgbGVnLCBtYXJrZXIsIG1kLCBuZWFyZXN0TWFya2VyRGF0dW0sIG51bUZlZXQsIHNwaWRlcmZpZWRNYXJrZXJzO1xuICAgICAgdGhpcy5zcGlkZXJmeWluZyA9IHRydWU7XG4gICAgICBudW1GZWV0ID0gbWFya2VyRGF0YS5sZW5ndGg7XG4gICAgICBib2R5UHQgPSB0aGlzLnB0QXZlcmFnZSgoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsLCBsZW4xLCByZXN1bHRzO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBtYXJrZXJEYXRhLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIG1kID0gbWFya2VyRGF0YVtsXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2gobWQubWFya2VyUHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSkoKSk7XG4gICAgICBmb290UHRzID0gbnVtRmVldCA+PSB0aGlzWydjaXJjbGVTcGlyYWxTd2l0Y2hvdmVyJ10gPyB0aGlzLmdlbmVyYXRlUHRzU3BpcmFsKG51bUZlZXQsIGJvZHlQdCkucmV2ZXJzZSgpIDogdGhpcy5nZW5lcmF0ZVB0c0NpcmNsZShudW1GZWV0LCBib2R5UHQpO1xuICAgICAgc3BpZGVyZmllZE1hcmtlcnMgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsLCBsZW4xLCByZXN1bHRzO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBmb290UHRzLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIGZvb3RQdCA9IGZvb3RQdHNbbF07XG4gICAgICAgICAgZm9vdExsID0gdGhpcy5wdFRvTGwoZm9vdFB0KTtcbiAgICAgICAgICBuZWFyZXN0TWFya2VyRGF0dW0gPSB0aGlzLm1pbkV4dHJhY3QobWFya2VyRGF0YSwgKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnB0RGlzdGFuY2VTcShtZC5tYXJrZXJQdCwgZm9vdFB0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkodGhpcykpO1xuICAgICAgICAgIG1hcmtlciA9IG5lYXJlc3RNYXJrZXJEYXR1bS5tYXJrZXI7XG4gICAgICAgICAgbGVnID0gbmV3IGdtLlBvbHlsaW5lKHtcbiAgICAgICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgICAgICBwYXRoOiBbbWFya2VyLnBvc2l0aW9uLCBmb290TGxdLFxuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXNbJ2xlZ0NvbG9ycyddWyd1c3VhbCddW3RoaXMubWFwLm1hcFR5cGVJZF0sXG4gICAgICAgICAgICBzdHJva2VXZWlnaHQ6IHRoaXNbJ2xlZ1dlaWdodCddLFxuICAgICAgICAgICAgekluZGV4OiB0aGlzWyd1c3VhbExlZ1pJbmRleCddXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWFya2VyWydfb21zRGF0YSddID0ge1xuICAgICAgICAgICAgdXN1YWxQb3NpdGlvbjogbWFya2VyLnBvc2l0aW9uLFxuICAgICAgICAgICAgbGVnOiBsZWdcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0aGlzWydsZWdDb2xvcnMnXVsnaGlnaGxpZ2h0ZWQnXVt0aGlzLm1hcC5tYXBUeXBlSWRdICE9PSB0aGlzWydsZWdDb2xvcnMnXVsndXN1YWwnXVt0aGlzLm1hcC5tYXBUeXBlSWRdKSB7XG4gICAgICAgICAgICBoaWdobGlnaHRMaXN0ZW5lckZ1bmNzID0gdGhpcy5tYWtlSGlnaGxpZ2h0TGlzdGVuZXJGdW5jcyhtYXJrZXIpO1xuICAgICAgICAgICAgbWFya2VyWydfb21zRGF0YSddLmhpZ2h0bGlnaHRMaXN0ZW5lcnMgPSB7XG4gICAgICAgICAgICAgIGhpZ2hsaWdodDogZ2UuYWRkTGlzdGVuZXIobWFya2VyLCAnbW91c2VvdmVyJywgaGlnaGxpZ2h0TGlzdGVuZXJGdW5jcy5oaWdobGlnaHQpLFxuICAgICAgICAgICAgICB1bmhpZ2hsaWdodDogZ2UuYWRkTGlzdGVuZXIobWFya2VyLCAnbW91c2VvdXQnLCBoaWdobGlnaHRMaXN0ZW5lckZ1bmNzLnVuaGlnaGxpZ2h0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFya2VyLnNldFBvc2l0aW9uKGZvb3RMbCk7XG4gICAgICAgICAgbWFya2VyLnNldFpJbmRleChNYXRoLnJvdW5kKHRoaXNbJ3NwaWRlcmZpZWRaSW5kZXgnXSArIGZvb3RQdC55KSk7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKG1hcmtlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KS5jYWxsKHRoaXMpO1xuICAgICAgZGVsZXRlIHRoaXMuc3BpZGVyZnlpbmc7XG4gICAgICB0aGlzLnNwaWRlcmZpZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignc3BpZGVyZnknLCBzcGlkZXJmaWVkTWFya2Vycywgbm9uTmVhcmJ5TWFya2Vycyk7XG4gICAgfTtcblxuICAgIHBbJ3Vuc3BpZGVyZnknXSA9IGZ1bmN0aW9uKG1hcmtlck5vdFRvTW92ZSkge1xuICAgICAgdmFyIGwsIGxlbjEsIGxpc3RlbmVycywgbWFya2VyLCBub25OZWFyYnlNYXJrZXJzLCByZWYyLCB1bnNwaWRlcmZpZWRNYXJrZXJzO1xuICAgICAgaWYgKG1hcmtlck5vdFRvTW92ZSA9PSBudWxsKSB7XG4gICAgICAgIG1hcmtlck5vdFRvTW92ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zcGlkZXJmaWVkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLnVuc3BpZGVyZnlpbmcgPSB0cnVlO1xuICAgICAgdW5zcGlkZXJmaWVkTWFya2VycyA9IFtdO1xuICAgICAgbm9uTmVhcmJ5TWFya2VycyA9IFtdO1xuICAgICAgcmVmMiA9IHRoaXMubWFya2VycztcbiAgICAgIGZvciAobCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICBtYXJrZXIgPSByZWYyW2xdO1xuICAgICAgICBpZiAobWFya2VyWydfb21zRGF0YSddICE9IG51bGwpIHtcbiAgICAgICAgICBtYXJrZXJbJ19vbXNEYXRhJ10ubGVnLnNldE1hcChudWxsKTtcbiAgICAgICAgICBpZiAobWFya2VyICE9PSBtYXJrZXJOb3RUb01vdmUpIHtcbiAgICAgICAgICAgIG1hcmtlci5zZXRQb3NpdGlvbihtYXJrZXJbJ19vbXNEYXRhJ10udXN1YWxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcmtlci5zZXRaSW5kZXgobnVsbCk7XG4gICAgICAgICAgbGlzdGVuZXJzID0gbWFya2VyWydfb21zRGF0YSddLmhpZ2h0bGlnaHRMaXN0ZW5lcnM7XG4gICAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcnMuaGlnaGxpZ2h0KTtcbiAgICAgICAgICAgIGdlLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVycy51bmhpZ2hsaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBtYXJrZXJbJ19vbXNEYXRhJ107XG4gICAgICAgICAgdW5zcGlkZXJmaWVkTWFya2Vycy5wdXNoKG1hcmtlcik7XG4gICAgICAgI
6780H0gZWxzZSB7XG4gICAgICAgICAgbm9uTmVhcmJ5TWFya2Vycy5wdXNoKG1hcmtlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLnVuc3BpZGVyZnlpbmc7XG4gICAgICBkZWxldGUgdGhpcy5zcGlkZXJmaWVkO1xuICAgICAgdGhpcy50cmlnZ2VyKCd1bnNwaWRlcmZ5JywgdW5zcGlkZXJmaWVkTWFya2Vycywgbm9uTmVhcmJ5TWFya2Vycyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgcC5wdERpc3RhbmNlU3EgPSBmdW5jdGlvbihwdDEsIHB0Mikge1xuICAgICAgdmFyIGR4LCBkeTtcbiAgICAgIGR4ID0gcHQxLnggLSBwdDIueDtcbiAgICAgIGR5ID0gcHQxLnkgLSBwdDIueTtcbiAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9O1xuXG4gICAgcC5wdEF2ZXJhZ2UgPSBmdW5jdGlvbihwdHMpIHtcbiAgICAgIHZhciBsLCBsZW4xLCBudW1QdHMsIHB0LCBzdW1YLCBzdW1ZO1xuICAgICAgc3VtWCA9IHN1bVkgPSAwO1xuICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHB0cy5sZW5ndGg7IGwgPCBsZW4xOyBsKyspIHtcbiAgICAgICAgcHQgPSBwdHNbbF07XG4gICAgICAgIHN1bVggKz0gcHQueDtcbiAgICAgICAgc3VtWSArPSBwdC55O1xuICAgICAgfVxuICAgICAgbnVtUHRzID0gcHRzLmxlbmd0aDtcbiAgICAgIHJldHVybiBuZXcgZ20uUG9pbnQoc3VtWCAvIG51bVB0cywgc3VtWSAvIG51bVB0cyk7XG4gICAgfTtcblxuICAgIHAubGxUb1B0ID0gZnVuY3Rpb24obGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2pIZWxwZXIuZ2V0UHJvamVjdGlvbigpLmZyb21MYXRMbmdUb0RpdlBpeGVsKGxsKTtcbiAgICB9O1xuXG4gICAgcC5wdFRvTGwgPSBmdW5jdGlvbihwdCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvakhlbHBlci5nZXRQcm9qZWN0aW9uKCkuZnJvbURpdlBpeGVsVG9MYXRMbmcocHQpO1xuICAgIH07XG5cbiAgICBwLm1pbkV4dHJhY3QgPSBmdW5jdGlvbihzZXQsIGZ1bmMpIHtcbiAgICAgIHZhciBiZXN0SW5kZXgsIGJlc3RWYWwsIGluZGV4LCBpdGVtLCBsLCBsZW4xLCB2YWw7XG4gICAgICBmb3IgKGluZGV4ID0gbCA9IDAsIGxlbjEgPSBzZXQubGVuZ3RoOyBsIDwgbGVuMTsgaW5kZXggPSArK2wpIHtcbiAgICAgICAgaXRlbSA9IHNldFtpbmRleF07XG4gICAgICAgIHZhbCA9IGZ1bmMoaXRlbSk7XG4gICAgICAgIGlmICgodHlwZW9mIGJlc3RJbmRleCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBiZXN0SW5kZXggPT09IG51bGwpIHx8IHZhbCA8IGJlc3RWYWwpIHtcbiAgICAgICAgICBiZXN0VmFsID0gdmFsO1xuICAgICAgICAgIGJlc3RJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0LnNwbGljZShiZXN0SW5kZXgsIDEpWzBdO1xuICAgIH07XG5cbiAgICBwLmFyckluZGV4T2YgPSBmdW5jdGlvbihhcnIsIG9iaikge1xuICAgICAgdmFyIGksIGwsIGxlbjEsIG87XG4gICAgICBpZiAoYXJyLmluZGV4T2YgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYXJyLmluZGV4T2Yob2JqKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IGwgPSAwLCBsZW4xID0gYXJyLmxlbmd0aDsgbCA8IGxlbjE7IGkgPSArK2wpIHtcbiAgICAgICAgbyA9IGFycltpXTtcbiAgICAgICAgaWYgKG8gPT09IG9iaikge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIF9DbGFzcy5Qcm9qSGVscGVyID0gZnVuY3Rpb24obWFwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRNYXAobWFwKTtcbiAgICB9O1xuXG4gICAgX0NsYXNzLlByb2pIZWxwZXIucHJvdG90eXBlID0gbmV3IGdtLk92ZXJsYXlWaWV3KCk7XG5cbiAgICBfQ2xhc3MuUHJvakhlbHBlci5wcm90b3R5cGVbJ2RyYXcnXSA9IGZ1bmN0aW9uKCkge307XG5cbiAgICByZXR1cm4gX0NsYXNzO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJ2YXIgJCA9IGpRdWVyeS5ub0NvbmZsaWN0KCk7XG5cbiQoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcblxudmFyICRob21lcGFnZVNsaWRlciA9ICQoJy5ob21lcGFnZS1zbGlkZXInKTtcblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuXHRpZigkaG9tZXBhZ2VTbGlkZXIubGVuZ3RoKSB7XG5cdFx0JGhvbWVwYWdlU2xpZGVyLnNsaWNrKHtcblx0XHRcdGFycm93czogdHJ1ZSxcblx0XHRcdGRvdHM6IHRydWUsXG5cdFx0XHRhdXRvcGxheTogdHJ1ZSxcblx0XHRcdGF1dG9wbGF5U3BlZWQ6IDYwMDAsXG5cdFx0XHRmYWRlOiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBnYWxsZXJ5IHNsaWRlclxuXHR2YXIgJGdhbGxlcnlTbGlkZXIgPSAkKCcuZ2FsbGVyeS13aWRnZXQtc2xpZGVyJyk7XG5cblx0JGdhbGxlcnlTbGlkZXIub24oJ2luaXQnLCBmdW5jdGlvbihzbGljayl7XG5cdFx0dmFyICRzbGlkZXMgPSAkZ2FsbGVyeVNsaWRlci5maW5kKCcuc2xpY2stc2xpZGUnKS5ub3QoJy5zbGljay1jbG9uZWQnKSxcblx0XHRcdHNsaWRlc051bWJlciA9ICRzbGlkZXMubGVuZ3RoOyAvLyBmb3Igc29tZSByZWFzb24gaXQgcmVjZWl2ZXMgMiBhY3RpdmUgc2xpZGVzXG5cdFx0JCgnLnNsaWRlcy1jb3VudGVyJykuZmluZCgnLmN1cnJlbnQtc2xpZGUtbnVtYmVyJykuaHRtbCgnMScpO1xuXHRcdCQoJy5zbGlkZXMtY291bnRlcicpLmZpbmQoJy50b3RhbC1zbGlkZXMnKS5hcHBlbmQoJyBvZiAnICsgc2xpZGVzTnVtYmVyKTtcblx0fSk7XG5cblx0JGdhbGxlcnlTbGlkZXIub24oJ2FmdGVyQ2hhbmdlJywgZnVuY3Rpb24oc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKXtcblx0XHQkKCcuc2xpZGVzLWNvdW50ZXInKS5maW5kKCcuY3VycmVudC1zbGlkZS1udW1iZXInKS5odG1sKGN1cnJlbnRTbGlkZS5jdXJyZW50U2xpZGUgKyAxKTtcblx0fSk7XG5cblx0aWYoJGdhbGxlcnlTbGlkZXIubGVuZ3RoKSB7XG5cdFx0dmFyIHNsaWNrR2FsbGVyeVNsaWRlciA9ICRnYWxsZXJ5U2xpZGVyLnNsaWNrKHtcblx0XHRcdGFycm93czogdHJ1ZSxcblx0XHRcdGRvdHM6IGZhbHNlLFxuXHRcdFx0YWRhcHRpdmVIZWlnaHQ6IHRydWUsXG5cdFx0XHRwcmV2QXJyb3c6ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbGxlcnktc2xpZGVyLXByZXZcIj4mbHNhcXVvOzwvYnV0dG9uPicsXG5cdFx0XHRuZXh0QXJyb3c6ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbGxlcnktc2xpZGVyLW5leHRcIj4mcnNhcXVvOzwvYnV0dG9uPicsXG5cdFx0XHRhcHBlbmRBcnJvd3M6ICQoJy5nYWxsZXJ5LXNsaWRlci1uYXYnKSxcblx0XHR9KTtcblx0fVxuXG5cdCQoJy5mYW5jeWJveCcpLmZhbmN5Ym94KCk7XG5cblx0JC5mbi5hbG1Db21wbGV0ZSA9IGZ1bmN0aW9uKGFsbSl7XG5cdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRuZXcgRm91bmRhdGlvbi5FcXVhbGl6ZXIoJCgnI3BhZ2UsICNzaW5nbGUtcG9zdCcpLCB7XG5cdFx0XHRcdCdkYXRhLWVxdWFsaXplLW9uJyA6ICdtZWRpdW0nXG5cdFx0XHR9KTtcblx0XHR9LCAzMDApO1xuXHR9O1xuXG5cdC8qIG1ha2UgdGhlIG1vYmlsZSBtZW51IH
6780BhcmVudCBpdGVtcyBsaW5rcyBhY2Nlc3NpYmxlICovXG5cblx0Ly8gZGlzYWJsZSBwcmV2ZW50IGRlZmF1bHRcblx0JCgnI21vYmlsZS1tZW51IC5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnQgPiBhJykudW5iaW5kKCdjbGljaycpO1xuXG5cdCQoJyNtb2JpbGUtbWVudSAuaXMtYWNjb3JkaW9uLXN1Ym1lbnUtcGFyZW50ID4gYSAuZHJvcGRvd24tYXJyb3cnKS5jbGljayhmdW5jdGlvbiAoZSkge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0JCh0aGlzKS50b2dnbGVDbGFzcygnaXMtb3BlbmVkJyk7XG5cblx0XHRpZigkKHRoaXMpLmhhc0NsYXNzKCdpcy1vcGVuZWQnKSkge1xuXHRcdFx0JChkb2N1bWVudCkudHJpZ2dlcignZG93bi56Zi5hY2NvcmRpb25NZW51Jyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoZG9jdW1lbnQpLnRyaWdnZXIoJ3VwLnpmLmFjY29yZGlvbk1lbnUnKTtcblx0XHR9XG5cblx0XHQkKHRoaXMpLmNsb3Nlc3QoJy5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnQnKS5maW5kKCcuaXMtYWNjb3JkaW9uLXN1Ym1lbnUnKS5zbGlkZVRvZ2dsZSgpO1xuXHR9KTtcblxuXHQvLyBkaXNhYmxlIGN1cnJlbnQgeWVhciBvbiBhcmNoaXZlcyBwYWdlXG5cblx0aWYoJCgnYm9keScpLmhhc0NsYXNzKCdhcmNoaXZlJykgJiYgJCgnYm9keScpLmhhc0NsYXNzKCdkYXRlJykpIHtcblx0XHR2YXIgY3VycmVudEFyY2hpdmUgPSB3aW5kb3cubG9jYXRpb24uaHJlZixcblx0XHRcdCRhcmNoaXZlTGlzdCA9ICQoJy5hcmNoaXZlLWxpc3QnKTtcblxuXHRcdCRhcmNoaXZlTGlzdC5maW5kKFwiYVtocmVmPSdcIiArIGN1cnJlbnRBcmNoaXZlICsgXCInXVwiKVxuXHRcdFx0LmFkZENsYXNzKCdkaXNhYmxlZC1saW5rJylcblx0XHRcdC5jbGljayhmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9KTtcblx0fVxufSk7XG5cbiQod2luZG93KS5sb2FkKGZ1bmN0aW9uICgpIHtcblx0Ly8gbWFrZSB0aGUgY29udGVudCBhbmQgc2lkZWJhciBoZWlnaHQgZXF1YWxcblx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGVsZW0gPSBuZXcgRm91bmRhdGlvbi5FcXVhbGl6ZXIoJCgnI3BhZ2UsICNzaW5nbGUtcG9zdCcpLCB7XG5cdFx0XHQnZGF0YS1lcXVhbGl6ZS1vbicgOiAnbWVkaXVtJ1xuXHRcdH0pO1xuXHR9LCAwKTtcblxuXHQkKGRvY3VtZW50KS5vbignY2hhbmdlLnpmLnRhYnMgZG93bi56Zi5hY2NvcmRpb24gdXAuemYuYWNjb3JkaW9uIGRvd24uemYuYWNjb3JkaW9uTWVudSB1cC56Zi5hY2NvcmRpb25NZW51JywgZnVuY3Rpb24gKCkge1xuXHRcdG5ldyBGb3VuZGF0aW9uLkVxdWFsaXplcigkKCcjcGFnZSwgI3NpbmdsZS1wb3N0JyksIHtcblx0XHRcdCdkYXRhLWVxdWFsaXplLW9uJyA6ICdtZWRpdW0nXG5cdFx0fSk7XG5cdH0pO1xufSk7XG5cbi8vIHRyaWJlIGV2ZW50cyB0b29sdGlwcyBmb3IgdGhlIG1pbmkgY2FsZW5kYXJcblxudmFyICRldmVudHNXaWRnZXQgPSAkKCAnLmV2ZW50cy13aWRnZXQnICk7XG5cbiRldmVudHNXaWRnZXQub24oICdtb3VzZWVudGVyJywgJy5wYXJpc2gtdG9vbHRpcHMnLGZ1bmN0aW9uKCkge1xuXG5cdHZhciBib3R0b21QYWQgPSAwLFxuXHRcdCR0aGlzID0gJCggdGhpcyApLFxuXHRcdCRib2R5ID0gJCggJ2JvZHknICksXG5cdFx0JHRpcDtcblxuXHRpZiAoICRib2R5Lmhhc0NsYXNzKCAnZXZlbnRzLWdyaWR2aWV3JyApICkgeyAvLyBDYWwgVmlldyBUb29sdGlwc1xuXHRcdGJvdHRvbVBhZCA9ICR0aGlzLmZpbmQoICdhJyApLm91dGVySGVpZ2h0KCkgKyAxODtcblx0fVxuXHRlbHNlIGlmICggJGJvZHkuaXMoICcuc2luZ2xlLXRyaWJlX2V2ZW50cywgLmV2ZW50cy1saXN0LCAudHJpYmUtZXZlbnRzLWRheScgKSApIHsgLy8gU2luZ2xlL0xpc3QgVmlldyBSZWN1cnJpbmcgVG9vbHRpcHNcblx0XHRib3R0b21QYWQgPSAkdGhpcy5vdXRlckhlaWdodCgpICsgMTI7XG5cdH1cblx0ZWxzZSBpZiAoICRib2R5LmlzKCAnLnRyaWJlLWV2ZW50cy1waG90bycgKSApIHsgLy8gUGhvdG8gVmlld1xuXHRcdGJvdHRvbVBhZCA9ICR0aGlzLm91dGVySGVpZ2h0KCkgKyAxMDtcblx0fVxuXG5cdC8vIFdpZGdldCBUb29sdGlwc1xuXHRpZiAoICR0aGlzLnBhcmVudHMoICcudHJpYmUtZXZlbnRzLWNhbGVuZGFyLXdpZGdldCcgKS5sZW5ndGggKSB7XG5cdFx0Ym90dG9tUGFkID0gJHRoaXMub3V0ZXJIZWlnaHQoKSAtIDY7XG5cdH1cblx0aWYgKCAhICRib2R5Lmhhc0NsYXNzKCAndHJpYmUtZXZlbnRzLXdlZWsnICkgKSB7XG5cdFx0JHRpcCA9ICR0aGlzLmZpbmQoICcudHJpYmUtZXZlbnRzLXRvb2x0aXAnICk7XG5cblx0XHRpZiAoICEgJHRpcC5sZW5ndGggKSB7XG5cdFx0XHR2YXIgZGF0YSA9ICR0aGlzLmRhdGEoICd0cmliZWpzb24nICk7XG5cblx0XHRcdGlmKCAhIGRhdGEuaGFzT3duUHJvcGVydHkoJ2V2ZW50SWQnKSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhID09ICdzdHJpbmcnICkge1xuXHRcdFx0XHRkYXRhID0gJC5wYXJzZUpTT04oIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMuYXBwZW5kKCB0cmliZV90bXBsKCAndHJpYmVfdG1wbF90b29sdGlwJywgZGF0YSApICk7XG5cblx0XHRcdC8vIGFkZCBsaW5rcyB0byB0b29sdGlwc1xuXG5cdFx0XHRpZiggZGF0YS5oYXNPd25Qcm9wZXJ0eSgncGVybWFsaW5rJykgKSB7XG5cdFx0XHRcdHZhciAkdGl0bGUgPSAkKHRoaXMpLmZpbmQoJy5lbnRyeS10aXRsZScpLFxuXHRcdFx0XHRcdHRpdGxlVGV4dCA9ICR0aXRsZS50ZXh0KCksXG5cdFx0XHRcdFx0bGluayA9IGRhdGEucGVybWFsaW5rO1xuXG5cdFx0XHRcdCR0aXRsZS5odG1sKCc8YSBocmVmPVwiJyArIGxpbmsgKyAnXCI+JyArIHRpdGxlVGV4dCArICc8L2E+Jyk7XG5cdFx0XHR9XG5cblx0XHRcdCR0aXAgPSAkdGhpcy5maW5kKCAnLnRyaWJlLWV2ZW50cy10b29sdGlwJyApO1xuXG5cdFx0XHQkdGlwLmNzcyggJ2JvdHRvbScsIGJvdHRvbVBhZCApLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQkdGlwLmNzcyggJ2JvdHRvbScsIGJvdHRvbVBhZCApLnNob3coKTtcblx0XHR9XG5cdH1cblxufSApLm9uKCAnbW91c2VsZWF2ZScsICcucGFyaXNoLXRvb2x0aXBzJywgZnVuY3Rpb24oKSB7XG5cdCQoIHRoaXMgKS5maW5kKCAnLnRyaWJlLWV2ZW50cy10b29sdGlwJyApLnN0b3AoIHRydWUsIGZhbHNlICkuZmFkZU91dCggMjAwICk7XG59ICk7XG4
6780iXX0=
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.