HansHammel/watchmen

View on GitHub
webserver/public/build/scripts.js

Summary

Maintainability
A
0 mins
Test Coverage
if(function(t){"use strict";function e(t,e){return e=e||Error,function(){var n,r,i=2,a=arguments,o=a[0],s="["+(t?t+":":"")+o+"] ",u=a[1];for(s+=u.replace(/\{\d+\}/g,function(t){var e=+t.slice(1,-1),n=e+i;return n<a.length?bt(a[n]):t}),s+="\nhttp://errors.angularjs.org/1.6.1/"+(t?t+"/":"")+o,r=i,n="?";r<a.length;r++,n="&")s+=n+"p"+(r-i)+"="+encodeURIComponent(bt(a[r]));return new e(s)}}function n(t){if(null==t||A(t))return!1;if(ci(t)||b(t)||Zr&&t instanceof Zr)return!0;var e="length"in Object(t)&&t.length;return $(e)&&(e>=0&&(e-1 in t||t instanceof Array)||"function"==typeof t.item)}function r(t,e,i){var a,o;if(t)if(S(t))for(a in t)"prototype"!==a&&"length"!==a&&"name"!==a&&t.hasOwnProperty(a)&&e.call(i,t[a],a,t);else if(ci(t)||n(t)){var s="object"!=typeof t;for(a=0,o=t.length;a<o;a++)(s||a in t)&&e.call(i,t[a],a,t)}else if(t.forEach&&t.forEach!==r)t.forEach(e,i,t);else if(_(t))for(a in t)e.call(i,t[a],a,t);else if("function"==typeof t.hasOwnProperty)for(a in t)t.hasOwnProperty(a)&&e.call(i,t[a],a,t);else for(a in t)Br.call(t,a)&&e.call(i,t[a],a,t);return t}function i(t,e,n){for(var r=Object.keys(t).sort(),i=0;i<r.length;i++)e.call(n,t[r[i]],r[i]);return r}function a(t){return function(e,n){t(n,e)}}function o(){return++si}function s(t,e){e?t.$$hashKey=e:delete t.$$hashKey}function u(t,e,n){for(var r=t.$$hashKey,i=0,a=e.length;i<a;++i){var o=e[i];if(x(o)||S(o))for(var c=Object.keys(o),l=0,f=c.length;l<f;l++){var h=c[l],d=o[h];n&&x(d)?w(d)?t[h]=new Date(d.valueOf()):T(d)?t[h]=new RegExp(d):d.nodeName?t[h]=d.cloneNode(!0):V(d)?t[h]=d.clone():(x(t[h])||(t[h]=ci(d)?[]:{}),u(t[h],[d],!0)):t[h]=d}}return s(t,r),t}function c(t){return u(t,ti.call(arguments,1),!1)}function l(t){return u(t,ti.call(arguments,1),!0)}function f(t){return parseInt(t,10)}function h(t,e){return c(Object.create(t),e)}function d(){}function p(t){return t}function g(t){return function(){return t}}function v(t){return S(t.toString)&&t.toString!==ri}function m(t){return"undefined"==typeof t}function y(t){return"undefined"!=typeof t}function x(t){return null!==t&&"object"==typeof t}function _(t){return null!==t&&"object"==typeof t&&!ii(t)}function b(t){return"string"==typeof t}function $(t){return"number"==typeof t}function w(t){return"[object Date]"===ri.call(t)}function S(t){return"function"==typeof t}function T(t){return"[object RegExp]"===ri.call(t)}function A(t){return t&&t.window===t}function C(t){return t&&t.$evalAsync&&t.$watch}function E(t){return"[object File]"===ri.call(t)}function M(t){return"[object FormData]"===ri.call(t)}function k(t){return"[object Blob]"===ri.call(t)}function P(t){return"boolean"==typeof t}function O(t){return t&&S(t.then)}function L(t){return t&&$(t.length)&&li.test(ri.call(t))}function D(t){return"[object ArrayBuffer]"===ri.call(t)}function V(t){return!(!t||!(t.nodeName||t.prop&&t.attr&&t.find))}function R(t){var e,n={},r=t.split(",");for(e=0;e<r.length;e++)n[r[e]]=!0;return n}function I(t){return qr(t.nodeName||t[0]&&t[0].nodeName)}function N(t,e){return Array.prototype.indexOf.call(t,e)!==-1}function j(t,e){var n=t.indexOf(e);return n>=0&&t.splice(n,1),n}function F(t,e){function n(t,e){var n,r=e.$$hashKey;if(ci(t))for(var a=0,o=t.length;a<o;a++)e.push(i(t[a]));else if(_(t))for(n in t)e[n]=i(t[n]);else if(t&&"function"==typeof t.hasOwnProperty)for(n in t)t.hasOwnProperty(n)&&(e[n]=i(t[n]));else for(n in t)Br.call(t,n)&&(e[n]=i(t[n]));return s(e,r),e}function i(t){if(!x(t))return t;var e=o.indexOf(t);if(e!==-1)return u[e];if(A(t)||C(t))throw ai("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");var r=!1,i=a(t);return void 0===i&&(i=ci(t)?[]:Object.create(ii(t)),r=!0),o.push(t),u.push(i),r?n(t,i):i}function a(t){switch(ri.call(t)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new t.constructor(i(t.buffer),t.byteOffset,t.length);case"[object ArrayBuffer]":if(!t.slice){var e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(new Uint8Array(t)),e}return t.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new t.constructor(t.valueOf());case"[object RegExp]":var n=new RegExp(t.source,t.toString().match(/[^\/]*$/)[0]);return n.lastIndex=t.lastIndex,n;case"[object Blob]":return new t.constructor([t],{type:t.type})}if(S(t.cloneNode))return t.cloneNode(!0)}var o=[],u=[];if(e){if(L(e)||D(e))throw ai("cpta","Can't copy! TypedArray destination cannot be mutated.");if(t===e)throw ai("cpi","Can't copy! Source and destination are identical.");return ci(e)?e.length=0:r(e,function(t,n){"$$hashKey"!==n&&delete e[n]}),o.push(t),u.push(e),n(t,e)}return i(t)}function G(t,e){if(t===e)return!0;if(null===t||null===e)return!1;if(t!==t&&e!==e)return!0;var n,r,i,a=typeof t,o=typeof e;if(a===o&&"object"===a){if(!ci(t)){if(w(t))return!!w(e)&&G(t.getTime(),e.getTime());if(T(t))return!!T(e)&&t.toString()===e.toString();if(C(t)||C(e)||A(t)||A(e)||ci(e)||w(e)||T(e))return!1;i=vt();for(r in t)if("$"!==r.charAt(0)&&!S(t[r])){if(!G(t[r],e[r]))return!1;i[r]=!0}for(r in e)if(!(r in i)&&"$"!==r.charAt(0)&&y(e[r])&&!S(e[r]))return!1;return!0}if(!ci(e))return!1;if((n=t.length)===e.length){for(r=0;r<n;r++)if(!G(t[r],e[r]))return!1;return!0}}return!1}function H(t,e,n){return t.concat(ti.call(e,n))}function z(t,e){return ti.call(t,e||0)}function U(t,e){var n=arguments.length>2?z(arguments,2):[];return!S(e)||e instanceof RegExp?e:n.length?function(){return arguments.length?e.apply(t,H(n,arguments,0)):e.apply(t,n)}:function(){return arguments.length?e.apply(t,arguments):e.call(t)}}function B(e,n){var r=n;return"string"==typeof e&&"$"===e.charAt(0)&&"$"===e.charAt(1)?r=void 0:A(n)?r="$WINDOW":n&&t.document===n?r="$DOCUMENT":C(n)&&(r="$SCOPE"),r}function q(t,e){if(!m(t))return $(e)||(e=e?2:null),JSON.stringify(t,B,e)}function Y(t){return b(t)?JSON.parse(t):t}function W(t,e){t=t.replace(gi,"");var n=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return ui(n)?e:n}function X(t,e){return t=new Date(t.getTime()),t.setMinutes(t.getMinutes()+e),t}function Q(t,e,n){n=n?-1:1;var r=t.getTimezoneOffset(),i=W(e,r);return X(t,n*(i-r))}function Z(t){t=Zr(t).clone();try{t.empty()}catch(t){}var e=Zr("<div>").append(t).html();try{return t[0].nodeType===$i?qr(e):e.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(t,e){return"<"+qr(e)})}catch(t){return qr(e)}}function J(t){try{return decodeURIComponent(t)}catch(t){}}function K(t){var e={};return r((t||"").split("&"),function(t){var n,r,i;t&&(r=t=t.replace(/\+/g,"%20"),n=t.indexOf("="),n!==-1&&(r=t.substring(0,n),i=t.substring(n+1)),r=J(r),y(r)&&(i=!y(i)||J(i),Br.call(e,r)?ci(e[r])?e[r].push(i):e[r]=[e[r],i]:e[r]=i))}),e}function tt(t){var e=[];return r(t,function(t,n){ci(t)?r(t,function(t){e.push(nt(n,!0)+(t===!0?"":"="+nt(t,!0)))}):e.push(nt(n,!0)+(t===!0?"":"="+nt(t,!0)))}),e.length?e.join("&"):""}function et(t){return nt(t,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function nt(t,e){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,e?"%20":"+")}function rt(t,e){var n,r,i=vi.length;for(r=0;r<i;++r)if(n=vi[r]+e,b(n=t.getAttribute(n)))return n;return null}function it(t){if(!t.currentScript)return!0;var e=t.currentScript.getAttribute("src"),n=t.createElement("a");if(n.href=e,t.location.origin===n.origin)return!0;switch(n.protocol){case"http:":case"https:":case"ftp:":case"blob:":case"file:":case"data:":return!0;default:return!1}}function at(e,n){var i,a,o={};if(r(vi,function(t){var n=t+"app";!i&&e.hasAttribute&&e.hasAttribute(n)&&(i=e,a=e.getAttribute(n))}),r(vi,function(t){var n,r=t+"app";!i&&(n=e.querySelector("["+r.replace(":","\\:")+"]"))&&(i=n,a=n.getAttribute(r))}),i){if(!mi)return void t.console.error("Angular: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match.");o.strictDi=null!==rt(i,"strict-di"),n(i,a?[a]:[],o)}}function ot(e,n,i){x(i)||(i={});var a={strictDi:!1};i=c(a,i);var o=function(){if(e=Zr(e),e.injector()){var r=e[0]===t.document?"document":Z(e);throw ai("btstrpd","App already bootstrapped with this element '{0}'",r.replace(/</,"&lt;").replace(/>/,"&gt;"))}n=n||[],n.unshift(["$provide",function(t){t.value("$rootElement",e)}]),i.debugInfoEnabled&&n.push(["$compileProvider",function(t){t.debugInfoEnabled(!0)}]),n.unshift("ng");var a=ce(n,i.strictDi);return a.invoke(["$rootScope","$rootElement","$compile","$injector",function(t,e,n,r){t.$apply(function(){e.data("$injector",r),n(e)(t)})}]),a},s=/^NG_ENABLE_DEBUG_INFO!/,u=/^NG_DEFER_BOOTSTRAP!/;return t&&s.test(t.name)&&(i.debugInfoEnabled=!0,t.name=t.name.replace(s,"")),t&&!u.test(t.name)?o():(t.name=t.name.replace(u,""),oi.resumeBootstrap=function(t){return r(t,function(t){n.push(t)}),o()},void(S(oi.resumeDeferredBootstrap)&&oi.resumeDeferredBootstrap()))}function st(){t.name="NG_ENABLE_DEBUG_INFO!"+t.name,t.location.reload()}function ut(t){var e=oi.element(t).injector();if(!e)throw ai("test","no injector found for element argument to getTestability");return e.get("$$testability")}function ct(t,e){return e=e||"_",t.replace(yi,function(t,n){return(n?e:"")+t.toLowerCase()})}function lt(){var e;if(!xi){var n=pi();Jr=m(n)?t.jQuery:n?t[n]:void 0,Jr&&Jr.fn.on?(Zr=Jr,c(Jr.fn,{scope:ji.scope,isolateScope:ji.isolateScope,controller:ji.controller,injector:ji.injector,inheritedData:ji.inheritedData}),e=Jr.cleanData,Jr.cleanData=function(t){for(var n,r,i=0;null!=(r=t[i]);i++)n=Jr._data(r,"events"),n&&n.$destroy&&Jr(r).triggerHandler("$destroy");e(t)}):Zr=Dt,oi.element=Zr,xi=!0}}function ft(t,e,n){if(!t)throw ai("areq","Argument '{0}' is {1}",e||"?",n||"required");return t}function ht(t,e,n){return n&&ci(t)&&(t=t[t.length-1]),ft(S(t),e,"not a function, got "+(t&&"object"==typeof t?t.constructor.name||"Object":typeof t)),t}function dt(t,e){if("hasOwnProperty"===t)throw ai("badname","hasOwnProperty is not a valid {0} name",e)}function pt(t,e,n){if(!e)return t;for(var r,i=e.split("."),a=t,o=i.length,s=0;s<o;s++)r=i[s],t&&(t=(a=t)[r]);return!n&&S(t)?U(a,t):t}function gt(t){for(var e,n=t[0],r=t[t.length-1],i=1;n!==r&&(n=n.nextSibling);i++)(e||t[i]!==n)&&(e||(e=Zr(ti.call(t,0,i))),e.push(n));return e||t}function vt(){return Object.create(null)}function mt(t){if(null==t)return"";switch(typeof t){case"string":break;case"number":t=""+t;break;default:t=!v(t)||ci(t)||w(t)?q(t):t.toString()}return t}function yt(t){function n(t,e,n){return t[e]||(t[e]=n())}var r=e("$injector"),i=e("ng"),a=n(t,"angular",Object);return a.$$minErr=a.$$minErr||e,n(a,"module",function(){var t={};return function(e,a,o){var s=function(t,e){if("hasOwnProperty"===t)throw i("badname","hasOwnProperty is not a valid {0} name",e)};return s(e,"module"),a&&t.hasOwnProperty(e)&&(t[e]=null),n(t,e,function(){function t(t,e,n,r){return r||(r=i),function(){return r[n||"push"]([t,e,arguments]),l}}function n(t,n,r){return r||(r=i),function(i,a){return a&&S(a)&&(a.$$moduleName=e),r.push([t,n,arguments]),l}}if(!a)throw r("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",e);var i=[],s=[],u=[],c=t("$injector","invoke","push",s),l={_invokeQueue:i,_configBlocks:s,_runBlocks:u,requires:a,name:e,provider:n("$provide","provider"),factory:n("$provide","factory"),service:n("$provide","service"),value:t("$provide","value"),constant:t("$provide","constant","unshift"),decorator:n("$provide","decorator",s),animation:n("$animateProvider","register"),filter:n("$filterProvider","register"),controller:n("$controllerProvider","register"),directive:n("$compileProvider","directive"),component:n("$compileProvider","component"),config:c,run:function(t){return u.push(t),this}};return o&&c(o),l})}})}function xt(t,e){if(ci(t)){e=e||[];for(var n=0,r=t.length;n<r;n++)e[n]=t[n]}else if(x(t)){e=e||{};for(var i in t)"$"===i.charAt(0)&&"$"===i.charAt(1)||(e[i]=t[i])}return e||t}function _t(t){var e=[];return JSON.stringify(t,function(t,n){if(n=B(t,n),x(n)){if(e.indexOf(n)>=0)return"...";e.push(n)}return n})}function bt(t){return"function"==typeof t?t.toString().replace(/ \{[\s\S]*$/,""):m(t)?"undefined":"string"!=typeof t?_t(t):t}function $t(n){c(n,{bootstrap:ot,copy:F,extend:c,merge:l,equals:G,element:Zr,forEach:r,injector:ce,noop:d,bind:U,toJson:q,fromJson:Y,identity:p,isUndefined:m,isDefined:y,isString:b,isFunction:S,isObject:x,isNumber:$,isElement:V,isArray:ci,version:Ai,isDate:w,lowercase:qr,uppercase:Yr,callbacks:{$$counter:0},getTestability:ut,reloadWithDebugInfo:st,$$minErr:e,$$csp:di,$$encodeUriSegment:et,$$encodeUriQuery:nt,$$stringify:mt}),(Kr=yt(t))("ng",["ngLocale"],["$provide",function(t){t.provider({$$sanitizeUri:Cn}),t.provider("$compile",_e).directive({a:qa,input:ho,textarea:ho,form:Ja,script:ss,select:ls,option:fs,ngBind:vo,ngBindHtml:yo,ngBindTemplate:mo,ngClass:_o,ngClassEven:$o,ngClassOdd:bo,ngCloak:wo,ngController:So,ngForm:Ka,ngHide:ts,ngIf:Co,ngInclude:Eo,ngInit:ko,ngNonBindable:Bo,ngPluralize:Xo,ngRepeat:Qo,ngShow:Ko,ngStyle:es,ngSwitch:ns,ngSwitchWhen:rs,ngSwitchDefault:is,ngOptions:Wo,ngTransclude:os,ngModel:Ho,ngList:Po,ngChange:xo,pattern:ds,ngPattern:ds,required:hs,ngRequired:hs,minlength:gs,ngMinlength:gs,maxlength:ps,ngMaxlength:ps,ngValue:go,ngModelOptions:Uo}).directive({ngInclude:Mo}).directive(Ya).directive(To),t.provider({$anchorScroll:le,$animate:ea,$animateCss:ia,$$animateJs:Ki,$$animateQueue:ta,$$AnimateRunner:ra,$$animateAsyncRun:na,$browser:ve,$cacheFactory:me,$controller:Ae,$document:Ce,$$isDocumentHidden:Ee,$exceptionHandler:Me,$filter:Hn,$$forceReflow:fa,$interpolate:ze,$interval:Ue,$http:je,$httpParamSerializer:Pe,$httpParamSerializerJQLike:Oe,$httpBackend:Ge,$xhrFactory:Fe,$jsonpCallbacks:xa,$location:on,$log:sn,$parse:bn,$rootScope:An,$q:$n,$$q:wn,$sce:On,$sceDelegate:Pn,$sniffer:Ln,$templateCache:ye,$templateRequest:Dn,$$testability:Vn,$timeout:Rn,$window:jn,$$rAF:Tn,$$jqLite:ne,$$HashMap:zi,$$cookieReader:Gn})}])}function wt(){return++Ei}function St(t){return At(t.replace(ki,"ms-"))}function Tt(t,e){return e.toUpperCase()}function At(t){return t.replace(Mi,Tt)}function Ct(t){return!Di.test(t)}function Et(t){var e=t.nodeType;return e===_i||!e||e===Si}function Mt(t){for(var e in Ci[t.ng339])return!0;return!1}function kt(t){for(var e=0,n=t.length;e<n;e++)Nt(t[e])}function Pt(t,e){var n,i,a,o,s=e.createDocumentFragment(),u=[];if(Ct(t))u.push(e.createTextNode(t));else{for(n=s.appendChild(e.createElement("div")),i=(Vi.exec(t)||["",""])[1].toLowerCase(),a=Ii[i]||Ii._default,n.innerHTML=a[1]+t.replace(Ri,"<$1></$2>")+a[2],o=a[0];o--;)n=n.lastChild;u=H(u,n.childNodes),n=s.firstChild,n.textContent=""}return s.textContent="",s.innerHTML="",r(u,function(t){s.appendChild(t)}),s}function Ot(e,n){n=n||t.document;var r;return(r=Li.exec(e))?[n.createElement(r[1])]:(r=Pt(e,n))?r.childNodes:[]}function Lt(t,e){var n=t.parentNode;n&&n.replaceChild(e,t),e.appendChild(t)}function Dt(t){if(t instanceof Dt)return t;var e;if(b(t)&&(t=fi(t),e=!0),!(this instanceof Dt)){if(e&&"<"!==t.charAt(0))throw Oi("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new Dt(t)}e?Ut(this,Ot(t)):S(t)?Qt(t):Ut(this,t)}function Vt(t){return t.cloneNode(!0)}function Rt(t,e){if(e||Nt(t),t.querySelectorAll)for(var n=t.querySelectorAll("*"),r=0,i=n.length;r<i;r++)Nt(n[r])}function It(t,e,n,i){if(y(i))throw Oi("offargs","jqLite#off() does not support the `selector` argument");var a=jt(t),o=a&&a.events,s=a&&a.handle;if(s)if(e){var u=function(e){var r=o[e];y(n)&&j(r||[],n),y(n)&&r&&r.length>0||(t.removeEventListener(e,s),delete o[e])};r(e.split(" "),function(t){u(t),Pi[t]&&u(Pi[t])})}else for(e in o)"$destroy"!==e&&t.removeEventListener(e,s),delete o[e]}function Nt(t,e){var n=t.ng339,r=n&&Ci[n];if(r){if(e)return void delete r.data[e];r.handle&&(r.events.$destroy&&r.handle({},"$destroy"),It(t)),delete Ci[n],t.ng339=void 0}}function jt(t,e){var n=t.ng339,r=n&&Ci[n];return e&&!r&&(t.ng339=n=wt(),r=Ci[n]={events:{},data:{},handle:void 0}),r}function Ft(t,e,n){if(Et(t)){var r,i=y(n),a=!i&&e&&!x(e),o=!e,s=jt(t,!a),u=s&&s.data;if(i)u[At(e)]=n;else{if(o)return u;if(a)return u&&u[At(e)];for(r in e)u[At(r)]=e[r]}}}function Gt(t,e){return!!t.getAttribute&&(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+e+" ")>-1}function Ht(t,e){e&&t.setAttribute&&r(e.split(" "),function(e){t.setAttribute("class",fi((" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+fi(e)+" "," ")))})}function zt(t,e){if(e&&t.setAttribute){var n=(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");r(e.split(" "),function(t){t=fi(t),n.indexOf(" "+t+" ")===-1&&(n+=t+" ")}),t.setAttribute("class",fi(n))}}function Ut(t,e){if(e)if(e.nodeType)t[t.length++]=e;else{var n=e.length;if("number"==typeof n&&e.window!==e){if(n)for(var r=0;r<n;r++)t[t.length++]=e[r]}else t[t.length++]=e}}function Bt(t,e){return qt(t,"$"+(e||"ngController")+"Controller")}function qt(t,e,n){t.nodeType===Si&&(t=t.documentElement);for(var r=ci(e)?e:[e];t;){for(var i=0,a=r.length;i<a;i++)if(y(n=Zr.data(t,r[i])))return n;t=t.parentNode||t.nodeType===Ti&&t.host}}function Yt(t){for(Rt(t,!0);t.firstChild;)t.removeChild(t.firstChild)}function Wt(t,e){e||Rt(t);var n=t.parentNode;n&&n.removeChild(t)}function Xt(e,n){n=n||t,"complete"===n.document.readyState?n.setTimeout(e):Zr(n).on("load",e)}function Qt(e){function n(){t.document.removeEventListener("DOMContentLoaded",n),t.removeEventListener("load",n),e()}"complete"===t.document.readyState?t.setTimeout(e):(t.document.addEventListener("DOMContentLoaded",n),t.addEventListener("load",n))}function Zt(t,e){var n=Fi[e.toLowerCase()];return n&&Gi[I(t)]&&n}function Jt(t){return Hi[t]}function Kt(t,e){var n=function(n,r){n.isDefaultPrevented=function(){return n.defaultPrevented};var i=e[r||n.type],a=i?i.length:0;if(a){if(m(n.immediatePropagationStopped)){var o=n.stopImmediatePropagation;n.stopImmediatePropagation=function(){n.immediatePropagationStopped=!0,n.stopPropagation&&n.stopPropagation(),o&&o.call(n)}}n.isImmediatePropagationStopped=function(){return n.immediatePropagationStopped===!0};var s=i.specialHandlerWrapper||te;a>1&&(i=xt(i));for(var u=0;u<a;u++)n.isImmediatePropagationStopped()||s(t,n,i[u])}};return n.elem=t,n}function te(t,e,n){n.call(t,e)}function ee(t,e,n){var r=e.relatedTarget;r&&(r===t||Ni.call(t,r))||n.call(t,e)}function ne(){this.$get=function(){return c(Dt,{hasClass:function(t,e){return t.attr&&(t=t[0]),Gt(t,e)},addClass:function(t,e){return t.attr&&(t=t[0]),zt(t,e)},removeClass:function(t,e){return t.attr&&(t=t[0]),Ht(t,e)}})}}function re(t,e){var n=t&&t.$$hashKey;if(n)return"function"==typeof n&&(n=t.$$hashKey()),n;var r=typeof t;return n="function"===r||"object"===r&&null!==t?t.$$hashKey=r+":"+(e||o)():r+":"+t}function ie(t,e){if(e){var n=0;this.nextUid=function(){return++n}}r(t,this.put,this)}function ae(t){return Function.prototype.toString.call(t)+" "}function oe(t){var e=ae(t).replace(Wi,""),n=e.match(Ui)||e.match(Bi);return n}function se(t){var e=oe(t);return e?"function("+(e[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function ue(t,e,n){var i,a,o;if("function"==typeof t){if(!(i=t.$inject)){if(i=[],t.length){if(e)throw b(n)&&n||(n=t.name||se(t)),Xi("strictdi","{0} is not using explicit annotation and cannot be invoked in strict mode",n);a=oe(t),r(a[1].split(qi),function(t){t.replace(Yi,function(t,e,n){i.push(n)})})}t.$inject=i}}else ci(t)?(o=t.length-1,ht(t[o],"fn"),i=t.slice(0,o)):ht(t,"fn",!0);return i}function ce(t,e){function n(t){return function(e,n){return x(e)?void r(e,a(t)):t(e,n)}}function i(t,e){if(dt(t,"service"),(S(e)||ci(e))&&(e=w.instantiate(e)),!e.$get)throw Xi("pget","Provider '{0}' must define $get factory method.",t);return $[t+v]=e}function o(t,e){return function(){var n=C.invoke(e,this);if(m(n))throw Xi("undef","Provider '{0}' must return a value from $get factory method.",t);return n}}function s(t,e,n){return i(t,{$get:n!==!1?o(t,e):e})}function u(t,e){return s(t,["$injector",function(t){return t.instantiate(e)}])}function c(t,e){return s(t,g(e),!1)}function l(t,e){dt(t,"constant"),$[t]=e,T[t]=e}function f(t,e){var n=w.get(t+v),r=n.$get;n.$get=function(){var t=C.invoke(r,n);return C.invoke(e,null,{$delegate:t})}}function h(t){ft(m(t)||ci(t),"modulesToLoad","not an array");var e,n=[];return r(t,function(t){function r(t){var e,n;for(e=0,n=t.length;e<n;e++){var r=t[e],i=w.get(r[0]);i[r[1]].apply(i,r[2])}}if(!_.get(t)){_.put(t,!0);try{b(t)?(e=Kr(t),n=n.concat(h(e.requires)).concat(e._runBlocks),r(e._invokeQueue),r(e._configBlocks)):S(t)?n.push(w.invoke(t)):ci(t)?n.push(w.invoke(t)):ht(t,"module")}catch(e){throw ci(t)&&(t=t[t.length-1]),e.message&&e.stack&&e.stack.indexOf(e.message)===-1&&(e=e.message+"\n"+e.stack),Xi("modulerr","Failed to instantiate module {0} due to:\n{1}",t,e.stack||e.message||e)}}}),n}function d(t,n){function r(e,r){if(t.hasOwnProperty(e)){if(t[e]===p)throw Xi("cdep","Circular dependency found: {0}",e+" <- "+y.join(" <- "));return t[e]}try{return y.unshift(e),t[e]=p,t[e]=n(e,r),t[e]}catch(n){throw t[e]===p&&delete t[e],n}finally{y.shift()}}function i(t,n,i){for(var a=[],o=ce.$$annotate(t,e,i),s=0,u=o.length;s<u;s++){var c=o[s];if("string"!=typeof c)throw Xi("itkn","Incorrect injection token! Expected service name as string, got {0}",c);a.push(n&&n.hasOwnProperty(c)?n[c]:r(c,i))}return a}function a(t){if(Qr||"function"!=typeof t)return!1;var e=t.$$ngIsClass;return P(e)||(e=t.$$ngIsClass=/^(?:class\b|constructor\()/.test(ae(t))),e}function o(t,e,n,r){"string"==typeof n&&(r=n,n=null);var o=i(t,n,r);return ci(t)&&(t=t[t.length-1]),a(t)?(o.unshift(null),new(Function.prototype.bind.apply(t,o))):t.apply(e,o)}function s(t,e,n){var r=ci(t)?t[t.length-1]:t,a=i(t,e,n);return a.unshift(null),new(Function.prototype.bind.apply(r,a))}return{invoke:o,instantiate:s,get:r,annotate:ce.$$annotate,has:function(e){return $.hasOwnProperty(e+v)||t.hasOwnProperty(e)}}}e=e===!0;var p={},v="Provider",y=[],_=new ie([],(!0)),$={$provide:{provider:n(i),factory:n(s),service:n(u),value:n(c),constant:n(l),decorator:f}},w=$.$injector=d($,function(t,e){throw oi.isString(e)&&y.push(e),Xi("unpr","Unknown provider: {0}",y.join(" <- "))}),T={},A=d(T,function(t,e){var n=w.get(t+v,e);return C.invoke(n.$get,n,void 0,t)}),C=A;$["$injector"+v]={$get:g(A)};var E=h(t);return C=A.get("$injector"),C.strictDi=e,r(E,function(t){t&&C.invoke(t)}),C}function le(){var t=!0;this.disableAutoScrolling=function(){t=!1},this.$get=["$window","$location","$rootScope",function(e,n,r){function i(t){var e=null;return Array.prototype.some.call(t,function(t){if("a"===I(t))return e=t,!0}),e}function a(){var t=s.yOffset;if(S(t))t=t();else if(V(t)){var n=t[0],r=e.getComputedStyle(n);t="fixed"!==r.position?0:n.getBoundingClientRect().bottom}else $(t)||(t=0);return t}function o(t){if(t){t.scrollIntoView();var n=a();if(n){var r=t.getBoundingClientRect().top;e.scrollBy(0,r-n)}}else e.scrollTo(0,0)}function s(t){t=b(t)?t:$(t)?t.toString():n.hash();var e;t?(e=u.getElementById(t))?o(e):(e=i(u.getElementsByName(t)))?o(e):"top"===t&&o(null):o(null)}var u=e.document;return t&&r.$watch(function(){return n.hash()},function(t,e){t===e&&""===t||Xt(function(){r.$evalAsync(s)})}),s}]}function fe(t,e){return t||e?t?e?(ci(t)&&(t=t.join(" ")),ci(e)&&(e=e.join(" ")),t+" "+e):t:e:""}function he(t){for(var e=0;e<t.length;e++){var n=t[e];if(n.nodeType===Zi)return n}}function de(t){b(t)&&(t=t.split(" "));var e=vt();return r(t,function(t){t.length&&(e[t]=!0)}),e}function pe(t){return x(t)?t:{}}function ge(t,e,n,i){function a(t){try{t.apply(null,z(arguments,1))}finally{if(y--,0===y)for(;x.length;)try{x.pop()()}catch(t){n.error(t)}}}function o(t){var e=t.indexOf("#");return e===-1?"":t.substr(e)}function s(){S=null,u(),c()}function u(){_=T(),_=m(_)?null:_,G(_,E)&&(_=E),E=_}function c(){$===l.url()&&b===_||($=l.url(),b=_,r(A,function(t){t(l.url(),_)}))}var l=this,f=t.location,h=t.history,p=t.setTimeout,g=t.clearTimeout,v={};l.isMock=!1;var y=0,x=[];l.$$completeOutstandingRequest=a,l.$$incOutstandingRequestCount=function(){y++},l.notifyWhenNoOutstandingRequests=function(t){0===y?t():x.push(t)};var _,b,$=f.href,w=e.find("base"),S=null,T=i.history?function(){try{return h.state}catch(t){}}:d;u(),b=_,l.url=function(e,n,r){if(m(r)&&(r=null),f!==t.location&&(f=t.location),h!==t.history&&(h=t.history),e){var a=b===r;if($===e&&(!i.history||a))return l;var s=$&&Qe($)===Qe(e);return $=e,b=r,!i.history||s&&a?(s||(S=e),n?f.replace(e):s?f.hash=o(e):f.href=e,f.href!==e&&(S=e)):(h[n?"replaceState":"pushState"](r,"",e),u(),b=_),S&&(S=e),l}return S||f.href.replace(/%27/g,"'")},l.state=function(){return _};var A=[],C=!1,E=null;l.onUrlChange=function(e){return C||(i.history&&Zr(t).on("popstate",s),Zr(t).on("hashchange",s),C=!0),A.push(e),e},l.$$applicationDestroyed=function(){Zr(t).off("hashchange popstate",s)},l.$$checkUrlChange=c,l.baseHref=function(){var t=w.attr("href");return t?t.replace(/^(https?:)?\/\/[^\/]*/,""):""},l.defer=function(t,e){var n;return y++,n=p(function(){delete v[n],a(t)},e||0),v[n]=!0,n},l.defer.cancel=function(t){return!!v[t]&&(delete v[t],g(t),a(d),!0)}}function ve(){this.$get=["$window","$log","$sniffer","$document",function(t,e,n,r){return new ge(t,r,e,n)}]}function me(){this.$get=function(){function t(t,r){function i(t){t!==h&&(d?d===t&&(d=t.n):d=t,a(t.n,t.p),a(t,h),h=t,h.n=null)}function a(t,e){t!==e&&(t&&(t.p=e),e&&(e.n=t))}if(t in n)throw e("$cacheFactory")("iid","CacheId '{0}' is already taken!",t);var o=0,s=c({},r,{id:t}),u=vt(),l=r&&r.capacity||Number.MAX_VALUE,f=vt(),h=null,d=null;return n[t]={put:function(t,e){if(!m(e)){if(l<Number.MAX_VALUE){var n=f[t]||(f[t]={key:t});i(n)}return t in u||o++,u[t]=e,o>l&&this.remove(d.key),e}},get:function(t){if(l<Number.MAX_VALUE){var e=f[t];if(!e)return;i(e)}return u[t]},remove:function(t){if(l<Number.MAX_VALUE){var e=f[t];if(!e)return;e===h&&(h=e.p),e===d&&(d=e.n),a(e.n,e.p),delete f[t]}t in u&&(delete u[t],o--)},removeAll:function(){u=vt(),o=0,f=vt(),h=d=null},destroy:function(){u=null,s=null,f=null,delete n[t]},info:function(){return c({},s,{size:o})}}}var n={};return t.info=function(){var t={};return r(n,function(e,n){t[n]=e.info()}),t},t.get=function(t){return n[t]},t}}function ye(){this.$get=["$cacheFactory",function(t){return t("templates")}]}function xe(){}function _e(e,n){function i(t,e,n){var i=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,a=vt();return r(t,function(t,r){if(t in E)return void(a[r]=E[t]);var o=t.match(i);if(!o)throw aa("iscp","Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}",e,r,t,n?"controller bindings definition":"isolate scope definition");a[r]={mode:o[1][0],collection:"*"===o[2],optional:"?"===o[3],attrName:o[4]||r},o[4]&&(E[t]=a[r])}),a}function o(t,e){var n={isolateScope:null,bindToController:null};if(x(t.scope)&&(t.bindToController===!0?(n.bindToController=i(t.scope,e,!0),n.isolateScope={}):n.isolateScope=i(t.scope,e,!1)),x(t.bindToController)&&(n.bindToController=i(t.bindToController,e,!0)),n.bindToController&&!t.controller)throw aa("noctrl","Cannot bind to controller without directive '{0}'s controller.",e);return n}function s(t){var e=t.charAt(0);if(!e||e!==qr(e))throw aa("baddir","Directive/Component name '{0}' is invalid. The first character must be a lowercase letter",t);if(t!==t.trim())throw aa("baddir","Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces",t)}function u(t){var e=t.require||t.controller&&t.name;return!ci(e)&&x(e)&&r(e,function(t,n){var r=t.match(T),i=t.substring(r[0].length);i||(e[n]=r[0]+n)}),e}function l(t,e){if(t&&(!b(t)||!/[EACM]/.test(t)))throw aa("badrestrict","Restrict property '{0}' of directive '{1}' is invalid",t,e);return t||"EA"}var f={},v="Directive",_=/^\s*directive:\s*([\w-]+)\s+(.*)$/,$=/(([\w-]+)(?::([^;]+))?;?)/,w=R("ngSrc,ngSrcset,src,srcset"),T=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,A=/^(on[a-z]+|formaction)$/,E=vt();this.directive=function t(n,i){return ft(n,"name"),dt(n,"directive"),b(n)?(s(n),ft(i,"directiveFactory"),f.hasOwnProperty(n)||(f[n]=[],e.factory(n+v,["$injector","$exceptionHandler",function(t,e){var i=[];return r(f[n],function(r,a){try{var o=t.invoke(r);S(o)?o={compile:g(o)}:!o.compile&&o.link&&(o.compile=g(o.link)),o.priority=o.priority||0,o.index=a,o.name=o.name||n,o.require=u(o),o.restrict=l(o.restrict,n),o.$$moduleName=r.$$moduleName,i.push(o)}catch(t){e(t)}}),i}])),f[n].push(i)):r(n,a(t)),this},this.component=function(t,e){function n(t){function n(e){return S(e)||ci(e)?function(n,r){return t.invoke(e,this,{$element:n,$attrs:r})}:e}var a=e.template||e.templateUrl?e.template:"",o={controller:i,controllerAs:Te(e.controller)||e.controllerAs||"$ctrl",template:n(a),templateUrl:n(e.templateUrl),transclude:e.transclude,scope:{},bindToController:e.bindings||{},restrict:"E",require:e.require};return r(e,function(t,e){"$"===e.charAt(0)&&(o[e]=t)}),o}var i=e.controller||function(){};return r(e,function(t,e){"$"===e.charAt(0)&&(n[e]=t,S(i)&&(i[e]=t))}),n.$inject=["$injector"],this.directive(t,n)},this.aHrefSanitizationWhitelist=function(t){return y(t)?(n.aHrefSanitizationWhitelist(t),this):n.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(n.imgSrcSanitizationWhitelist(t),this):n.imgSrcSanitizationWhitelist()};var M=!0;this.debugInfoEnabled=function(t){return y(t)?(M=t,this):M};var k=!1;this.preAssignBindingsEnabled=function(t){return y(t)?(k=t,this):k};var O=10;this.onChangesTtl=function(t){return arguments.length?(O=t,this):O};var L=!0;this.commentDirectivesEnabled=function(t){return arguments.length?(L=t,this):L};var D=!0;this.cssClassDirectivesEnabled=function(t){return arguments.length?(D=t,this):D},this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(e,n,i,a,s,u,l,g,E,V){function R(){try{if(!--Mt)throw wt=void 0,aa("infchng","{0} $onChanges() iterations reached. Aborting!\n",O);l.$apply(function(){for(var t=[],e=0,n=wt.length;e<n;++e)try{wt[e]()}catch(e){t.push(e)}if(wt=void 0,t.length)throw t})}finally{Mt++}}function N(t,e){if(e){var n,r,i,a=Object.keys(e);for(n=0,r=a.length;n<r;n++)i=a[n],this[i]=e[i]}else this.$attr={};this.$$element=t}function F(t,e,n){Tt.innerHTML="<span "+e+">";var r=Tt.firstChild.attributes,i=r[0];r.removeNamedItem(i.name),i.value=n,t.attributes.setNamedItem(i)}function H(t,e){try{t.addClass(e)}catch(t){}}function B(t,e,n,r,i){t instanceof Zr||(t=Zr(t));var a=Y(t,e,t,n,r,i);B.$$addScopeClass(t);var o=null;return function(e,n,r){if(!t)throw aa("multilink","This element has already been linked.");ft(e,"scope"),i&&i.needsNewScope&&(e=e.$parent.$new()),r=r||{};var s=r.parentBoundTranscludeFn,u=r.transcludeControllers,c=r.futureParentElement;s&&s.$$boundTransclude&&(s=s.$$boundTransclude),o||(o=q(c));var l;if(l="html"!==o?Zr(gt(o,Zr("<div>").append(t).html())):n?ji.clone.call(t):t,u)for(var f in u)l.data("$"+f+"Controller",u[f].instance);return B.$$addScopeInfo(l,e),n&&n(l,e),a&&a(e,l,l,s),n||(t=a=null),l}}function q(t){var e=t&&t[0];return e&&"foreignobject"!==I(e)&&ri.call(e).match(/SVG/)?"svg":"html"}function Y(t,e,n,r,i,a){function o(t,n,r,i){var a,o,s,u,c,l,f,h,g;if(d){var v=n.length;for(g=new Array(v),c=0;c<p.length;c+=3)f=p[c],g[f]=n[f]}else g=n;for(c=0,l=p.length;c<l;)s=g[p[c++]],a=p[c++],o=p[c++],a?(a.scope?(u=t.$new(),B.$$addScopeInfo(Zr(s),u)):u=t,h=a.transcludeOnThisElement?X(t,a.transclude,i):!a.templateOnThisElement&&i?i:!i&&e?X(t,e):null,a(o,u,s,r,h)):o&&o(t,s.childNodes,void 0,i)}for(var s,u,c,l,f,h,d,p=[],g=ci(t)||t instanceof Zr,v=0;v<t.length;v++)s=new N,11===Qr&&W(t,v,g),u=Q(t[v],[],s,0===v?r:void 0,i),c=u.length?nt(u,t[v],s,e,n,null,[],[],a):null,c&&c.scope&&B.$$addScopeClass(s.$$element),f=c&&c.terminal||!(l=t[v].childNodes)||!l.length?null:Y(l,c?(c.transcludeOnThisElement||!c.templateOnThisElement)&&c.transclude:e),
(c||f)&&(p.push(v,c,f),h=!0,d=d||c),a=null;return h?o:null}function W(t,e,n){var r,i=t[e],a=i.parentNode;if(i.nodeType===$i)for(;;){if(r=a?i.nextSibling:t[e+1],!r||r.nodeType!==$i)break;i.nodeValue=i.nodeValue+r.nodeValue,r.parentNode&&r.parentNode.removeChild(r),n&&r===t[e+1]&&t.splice(e+1,1)}}function X(t,e,n){function r(r,i,a,o,s){return r||(r=t.$new(!1,s),r.$$transcluded=!0),e(r,i,{parentBoundTranscludeFn:n,transcludeControllers:a,futureParentElement:o})}var i=r.$$slots=vt();for(var a in e.$$slots)e.$$slots[a]?i[a]=X(t,e.$$slots[a],n):i[a]=null;return r}function Q(t,e,n,r,i){var a,o,s,u=t.nodeType,c=n.$attr;switch(u){case _i:o=I(t),ot(e,$e(o),"E",r,i);for(var l,f,h,d,p,g,v=t.attributes,m=0,y=v&&v.length;m<y;m++){var _=!1,w=!1;l=v[m],f=l.name,p=l.value,d=$e(f),g=Lt.test(d),g&&(f=f.replace(sa,"").substr(8).replace(/_(.)/g,function(t,e){return e.toUpperCase()}));var S=d.match(Dt);S&&st(S[1])&&(_=f,w=f.substr(0,f.length-5)+"end",f=f.substr(0,f.length-6)),h=$e(f.toLowerCase()),c[h]=f,!g&&n.hasOwnProperty(h)||(n[h]=p,Zt(t,h)&&(n[h]=!0)),yt(t,e,p,h,g),ot(e,h,"A",r,i,_,w)}if("input"===o&&"hidden"===t.getAttribute("type")&&t.setAttribute("autocomplete","off"),!Et)break;if(s=t.className,x(s)&&(s=s.animVal),b(s)&&""!==s)for(;a=$.exec(s);)h=$e(a[2]),ot(e,h,"C",r,i)&&(n[h]=fi(a[3])),s=s.substr(a.index+a[0].length);break;case $i:pt(e,t.nodeValue);break;case wi:if(!At)break;J(t,e,n,r,i)}return e.sort(ht),e}function J(t,e,n,r,i){try{var a=_.exec(t.nodeValue);if(a){var o=$e(a[1]);ot(e,o,"M",r,i)&&(n[o]=fi(a[2]))}}catch(t){}}function K(t,e,n){var r=[],i=0;if(e&&t.hasAttribute&&t.hasAttribute(e)){do{if(!t)throw aa("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",e,n);t.nodeType===_i&&(t.hasAttribute(e)&&i++,t.hasAttribute(n)&&i--),r.push(t),t=t.nextSibling}while(i>0)}else r.push(t);return Zr(r)}function tt(t,e,n){return function(r,i,a,o,s){return i=K(i[0],e,n),t(r,i,a,o,s)}}function et(t,e,n,r,i,a){var o;return t?B(e,n,r,i,a):function(){return o||(o=B(e,n,r,i,a),e=n=a=null),o.apply(this,arguments)}}function nt(t,e,n,a,o,s,u,l,f){function h(t,e,n,r){t&&(n&&(t=tt(t,n,r)),t.require=p.require,t.directiveName=g,(T===p||p.$$isolateScope)&&(t=_t(t,{isolateScope:!0})),u.push(t)),e&&(n&&(e=tt(e,n,r)),e.require=p.require,e.directiveName=g,(T===p||p.$$isolateScope)&&(e=_t(e,{isolateScope:!0})),l.push(e))}function d(t,a,o,s,f){function h(t,e,n,r){var i;if(C(t)||(r=n,n=e,e=t,t=void 0),O&&(i=_),n||(n=O?E.parent():E),!r)return f(t,e,i,n,j);var a=f.$$slots[r];if(a)return a(t,e,i,n,j);if(m(a))throw aa("noslot",'No parent directive that requires a transclusion with slot name "{0}". Element: {1}',r,Z(E))}var d,p,g,v,y,_,b,E,M,P;e===o?(M=n,E=n.$$element):(E=Zr(o),M=new N(E,n)),y=a,T?v=a.$new(!0):$&&(y=a.$parent),f&&(b=h,b.$$boundTransclude=f,b.isSlotFilled=function(t){return!!f.$$slots[t]}),w&&(_=it(E,M,b,w,v,a,T)),T&&(B.$$addScopeInfo(E,v,!0,!(A&&(A===T||A===T.$$originalDirective))),B.$$addScopeClass(E,!0),v.$$isolateBindings=T.$$isolateBindings,P=$t(a,M,v,v.$$isolateBindings,T),P.removeWatches&&v.$on("$destroy",P.removeWatches));for(var L in _){var D=w[L],V=_[L],R=D.$$bindings.bindToController;if(k){R?V.bindingInfo=$t(y,M,V.instance,R,D):V.bindingInfo={};var I=V();I!==V.instance&&(V.instance=I,E.data("$"+D.name+"Controller",I),V.bindingInfo.removeWatches&&V.bindingInfo.removeWatches(),V.bindingInfo=$t(y,M,V.instance,R,D))}else V.instance=V(),E.data("$"+D.name+"Controller",V.instance),V.bindingInfo=$t(y,M,V.instance,R,D)}for(r(w,function(t,e){var n=t.require;t.bindToController&&!ci(n)&&x(n)&&c(_[e].instance,rt(e,n,E,_))}),r(_,function(t){var e=t.instance;if(S(e.$onChanges))try{e.$onChanges(t.bindingInfo.initialChanges)}catch(t){i(t)}if(S(e.$onInit))try{e.$onInit()}catch(t){i(t)}S(e.$doCheck)&&(y.$watch(function(){e.$doCheck()}),e.$doCheck()),S(e.$onDestroy)&&y.$on("$destroy",function(){e.$onDestroy()})}),d=0,p=u.length;d<p;d++)g=u[d],bt(g,g.isolateScope?v:a,E,M,g.require&&rt(g.directiveName,g.require,E,_),b);var j=a;for(T&&(T.template||null===T.templateUrl)&&(j=v),t&&t(j,o.childNodes,void 0,f),d=l.length-1;d>=0;d--)g=l[d],bt(g,g.isolateScope?v:a,E,M,g.require&&rt(g.directiveName,g.require,E,_),b);r(_,function(t){var e=t.instance;S(e.$postLink)&&e.$postLink()})}f=f||{};for(var p,g,v,y,_,b=-Number.MAX_VALUE,$=f.newScopeDirective,w=f.controllerDirectives,T=f.newIsolateScopeDirective,A=f.templateDirective,E=f.nonTlbTranscludeDirective,M=!1,P=!1,O=f.hasElementTranscludeDirective,L=n.$$element=Zr(e),D=s,V=a,R=!1,j=!1,F=0,G=t.length;F<G;F++){p=t[F];var H=p.$$start,q=p.$$end;if(H&&(L=K(e,H,q)),v=void 0,b>p.priority)break;if(_=p.scope,_&&(p.templateUrl||(x(_)?(dt("new/isolated scope",T||$,p,L),T=p):dt("new/isolated scope",T,p,L)),$=$||p),g=p.name,!R&&(p.replace&&(p.templateUrl||p.template)||p.transclude&&!p.$$tlb)){for(var Y,W=F+1;Y=t[W++];)if(Y.transclude&&!Y.$$tlb||Y.replace&&(Y.templateUrl||Y.template)){j=!0;break}R=!0}if(!p.templateUrl&&p.controller&&(w=w||vt(),dt("'"+g+"' controller",w[g],p,L),w[g]=p),_=p.transclude)if(M=!0,p.$$tlb||(dt("transclusion",E,p,L),E=p),"element"===_)O=!0,b=p.priority,v=L,L=n.$$element=Zr(B.$$createComment(g,n[g])),e=L[0],xt(o,z(v),e),v[0].$$parentNode=v[0].parentNode,V=et(j,v,a,b,D&&D.name,{nonTlbTranscludeDirective:E});else{var X=vt();if(x(_)){v=[];var J=vt(),nt=vt();r(_,function(t,e){var n="?"===t.charAt(0);t=n?t.substring(1):t,J[t]=e,X[e]=null,nt[e]=n}),r(L.contents(),function(t){var e=J[$e(I(t))];e?(nt[e]=!0,X[e]=X[e]||[],X[e].push(t)):v.push(t)}),r(nt,function(t,e){if(!t)throw aa("reqslot","Required transclusion slot `{0}` was not filled.",e)});for(var ot in X)X[ot]&&(X[ot]=et(j,X[ot],a))}else v=Zr(Vt(e)).contents();L.empty(),V=et(j,v,a,void 0,void 0,{needsNewScope:p.$$isolateScope||p.$$newScope}),V.$$slots=X}if(p.template)if(P=!0,dt("template",A,p,L),A=p,_=S(p.template)?p.template(L,n):p.template,_=Ot(_),p.replace){if(D=p,v=Ct(_)?[]:Se(gt(p.templateNamespace,fi(_))),e=v[0],1!==v.length||e.nodeType!==_i)throw aa("tplrt","Template for directive '{0}' must have exactly one root element. {1}",g,"");xt(o,L,e);var st={$attr:{}},ct=Q(e,[],st),ft=t.splice(F+1,t.length-(F+1));(T||$)&&at(ct,T,$),t=t.concat(ct).concat(ft),ut(n,st),G=t.length}else L.html(_);if(p.templateUrl)P=!0,dt("template",A,p,L),A=p,p.replace&&(D=p),d=lt(t.splice(F,t.length-F),L,n,o,M&&V,u,l,{controllerDirectives:w,newScopeDirective:$!==p&&$,newIsolateScopeDirective:T,templateDirective:A,nonTlbTranscludeDirective:E}),G=t.length;else if(p.compile)try{y=p.compile(L,n,V);var ht=p.$$originalDirective||p;S(y)?h(null,U(ht,y),H,q):y&&h(U(ht,y.pre),U(ht,y.post),H,q)}catch(t){i(t,Z(L))}p.terminal&&(d.terminal=!0,b=Math.max(b,p.priority))}return d.scope=$&&$.scope===!0,d.transcludeOnThisElement=M,d.templateOnThisElement=P,d.transclude=V,f.hasElementTranscludeDirective=O,d}function rt(t,e,n,i){var a;if(b(e)){var o=e.match(T),s=e.substring(o[0].length),u=o[1]||o[3],c="?"===o[2];if("^^"===u?n=n.parent():(a=i&&i[s],a=a&&a.instance),!a){var l="$"+s+"Controller";a=u?n.inheritedData(l):n.data(l)}if(!a&&!c)throw aa("ctreq","Controller '{0}', required by directive '{1}', can't be found!",s,t)}else if(ci(e)){a=[];for(var f=0,h=e.length;f<h;f++)a[f]=rt(t,e[f],n,i)}else x(e)&&(a={},r(e,function(e,r){a[r]=rt(t,e,n,i)}));return a||null}function it(t,e,n,r,i,a,o){var s=vt();for(var c in r){var l=r[c],f={$scope:l===o||l.$$isolateScope?i:a,$element:t,$attrs:e,$transclude:n},h=l.controller;"@"===h&&(h=e[l.name]);var d=u(h,f,!0,l.controllerAs);s[l.name]=d,t.data("$"+l.name+"Controller",d.instance)}return s}function at(t,e,n){for(var r=0,i=t.length;r<i;r++)t[r]=h(t[r],{$$isolateScope:e,$$newScope:n})}function ot(t,n,r,i,a,s,u){if(n===a)return null;var c=null;if(f.hasOwnProperty(n))for(var l,d=e.get(n+v),p=0,g=d.length;p<g;p++)if(l=d[p],(m(i)||i>l.priority)&&l.restrict.indexOf(r)!==-1){if(s&&(l=h(l,{$$start:s,$$end:u})),!l.$$bindings){var y=l.$$bindings=o(l,l.name);x(y.isolateScope)&&(l.$$isolateBindings=y.isolateScope)}t.push(l),c=l}return c}function st(t){if(f.hasOwnProperty(t))for(var n,r=e.get(t+v),i=0,a=r.length;i<a;i++)if(n=r[i],n.multiElement)return!0;return!1}function ut(t,e){var n=e.$attr,i=t.$attr;r(t,function(r,i){"$"!==i.charAt(0)&&(e[i]&&e[i]!==r&&(r.length?r+=("style"===i?";":" ")+e[i]:r=e[i]),t.$set(i,r,!0,n[i]))}),r(e,function(e,r){t.hasOwnProperty(r)||"$"===r.charAt(0)||(t[r]=e,"class"!==r&&"style"!==r&&(i[r]=n[r]))})}function lt(t,e,n,o,s,u,c,l){var f,p,g=[],v=e[0],m=t.shift(),y=h(m,{templateUrl:null,transclude:null,replace:null,$$originalDirective:m}),_=S(m.templateUrl)?m.templateUrl(e,n):m.templateUrl,b=m.templateNamespace;return e.empty(),a(_).then(function(i){var a,h,d,$;if(i=Ot(i),m.replace){if(d=Ct(i)?[]:Se(gt(b,fi(i))),a=d[0],1!==d.length||a.nodeType!==_i)throw aa("tplrt","Template for directive '{0}' must have exactly one root element. {1}",m.name,_);h={$attr:{}},xt(o,e,a);var w=Q(a,[],h);x(m.scope)&&at(w,!0),t=w.concat(t),ut(n,h)}else a=v,e.html(i);for(t.unshift(y),f=nt(t,a,n,s,e,m,u,c,l),r(o,function(t,n){t===a&&(o[n]=e[0])}),p=Y(e[0].childNodes,s);g.length;){var S=g.shift(),T=g.shift(),A=g.shift(),C=g.shift(),E=e[0];if(!S.$$destroyed){if(T!==v){var M=T.className;l.hasElementTranscludeDirective&&m.replace||(E=Vt(a)),xt(A,Zr(T),E),H(Zr(E),M)}$=f.transcludeOnThisElement?X(S,f.transclude,C):C,f(p,S,E,o,$)}}g=null}).catch(function(t){t instanceof Error&&i(t)}).catch(d),function(t,e,n,r,i){var a=i;e.$$destroyed||(g?g.push(e,n,r,a):(f.transcludeOnThisElement&&(a=X(e,f.transclude,i)),f(p,e,n,r,a)))}}function ht(t,e){var n=e.priority-t.priority;return 0!==n?n:t.name!==e.name?t.name<e.name?-1:1:t.index-e.index}function dt(t,e,n,r){function i(t){return t?" (module: "+t+")":""}if(e)throw aa("multidir","Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}",e.name,i(e.$$moduleName),n.name,i(n.$$moduleName),t,Z(r))}function pt(t,e){var r=n(e,!0);r&&t.push({priority:0,compile:function(t){var e=t.parent(),n=!!e.length;return n&&B.$$addBindingClass(e),function(t,e){var i=e.parent();n||B.$$addBindingClass(i),B.$$addBindingInfo(i,r.expressions),t.$watch(r,function(t){e[0].nodeValue=t})}}})}function gt(e,n){switch(e=qr(e||"html")){case"svg":case"math":var r=t.document.createElement("div");return r.innerHTML="<"+e+">"+n+"</"+e+">",r.childNodes[0].childNodes;default:return n}}function mt(t,e){if("srcdoc"===e)return g.HTML;var n=I(t);if("src"===e||"ngSrc"===e){if(["img","video","audio","source","track"].indexOf(n)===-1)return g.RESOURCE_URL}else if("xlinkHref"===e||"form"===n&&"action"===e||"link"===n&&"href"===e)return g.RESOURCE_URL}function yt(t,e,r,i,a){var o=mt(t,i),s=!a,u=w[i]||a,c=n(r,s,o,u);if(c){if("multiple"===i&&"select"===I(t))throw aa("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",Z(t));if(A.test(i))throw aa("nodomevents","Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.");e.push({priority:100,compile:function(){return{pre:function(t,e,a){var s=a.$$observers||(a.$$observers=vt()),l=a[i];l!==r&&(c=l&&n(l,!0,o,u),r=l),c&&(a[i]=c(t),(s[i]||(s[i]=[])).$$inter=!0,(a.$$observers&&a.$$observers[i].$$scope||t).$watch(c,function(t,e){"class"===i&&t!==e?a.$updateClass(t,e):a.$set(i,t)}))}}}})}}function xt(e,n,r){var i,a,o=n[0],s=n.length,u=o.parentNode;if(e)for(i=0,a=e.length;i<a;i++)if(e[i]===o){e[i++]=r;for(var c=i,l=c+s-1,f=e.length;c<f;c++,l++)l<f?e[c]=e[l]:delete e[c];e.length-=s-1,e.context===o&&(e.context=r);break}u&&u.replaceChild(r,o);var h=t.document.createDocumentFragment();for(i=0;i<s;i++)h.appendChild(n[i]);for(Zr.hasData(o)&&(Zr.data(r,Zr.data(o)),Zr(o).off("$destroy")),Zr.cleanData(h.querySelectorAll("*")),i=1;i<s;i++)delete n[i];n[0]=r,n.length=1}function _t(t,e){return c(function(){return t.apply(null,arguments)},t,e)}function bt(t,e,n,r,a,o){try{t(e,n,r,a,o)}catch(t){i(t,Z(n))}}function $t(t,e,i,a,o){function u(e,n,r){!S(i.$onChanges)||n===r||n!==n&&r!==r||(wt||(t.$$postDigest(R),wt=[]),l||(l={},wt.push(c)),l[e]&&(r=l[e].previousValue),l[e]=new be(r,n))}function c(){i.$onChanges(l),l=void 0}var l,f=[],h={};return r(a,function(r,a){var c,l,p,g,v,m=r.attrName,y=r.optional,x=r.mode;switch(x){case"@":y||Br.call(e,m)||(i[a]=e[m]=void 0),v=e.$observe(m,function(t){if(b(t)||P(t)){var e=i[a];u(a,t,e),i[a]=t}}),e.$$observers[m].$$scope=t,c=e[m],b(c)?i[a]=n(c)(t):P(c)&&(i[a]=c),h[a]=new be(oa,i[a]),f.push(v);break;case"=":if(!Br.call(e,m)){if(y)break;e[m]=void 0}if(y&&!e[m])break;l=s(e[m]),g=l.literal?G:function(t,e){return t===e||t!==t&&e!==e},p=l.assign||function(){throw c=i[a]=l(t),aa("nonassign","Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!",e[m],m,o.name)},c=i[a]=l(t);var _=function(e){return g(e,i[a])||(g(e,c)?p(t,e=i[a]):i[a]=e),c=e};_.$stateful=!0,v=r.collection?t.$watchCollection(e[m],_):t.$watch(s(e[m],_),null,l.literal),f.push(v);break;case"<":if(!Br.call(e,m)){if(y)break;e[m]=void 0}if(y&&!e[m])break;l=s(e[m]);var $=l.literal,w=i[a]=l(t);h[a]=new be(oa,i[a]),v=t.$watch(l,function(t,e){if(e===t){if(e===w||$&&G(e,w))return;e=w}u(a,t,e),i[a]=t},$),f.push(v);break;case"&":if(l=e.hasOwnProperty(m)?s(e[m]):d,l===d&&y)break;i[a]=function(e){return l(t,e)}}}),{initialChanges:h,removeWatches:f.length&&function(){for(var t=0,e=f.length;t<e;++t)f[t]()}}}var wt,St=/^\w/,Tt=t.document.createElement("div"),At=L,Et=D,Mt=O;N.prototype={$normalize:$e,$addClass:function(t){t&&t.length>0&&E.addClass(this.$$element,t)},$removeClass:function(t){t&&t.length>0&&E.removeClass(this.$$element,t)},$updateClass:function(t,e){var n=we(t,e);n&&n.length&&E.addClass(this.$$element,n);var r=we(e,t);r&&r.length&&E.removeClass(this.$$element,r)},$set:function(t,e,n,a){var o,s=this.$$element[0],u=Zt(s,t),c=Jt(t),l=t;if(u?(this.$$element.prop(t,e),a=u):c&&(this[c]=e,l=c),this[t]=e,a?this.$attr[t]=a:(a=this.$attr[t],a||(this.$attr[t]=a=ct(t,"-"))),o=I(this.$$element),"a"===o&&("href"===t||"xlinkHref"===t)||"img"===o&&"src"===t)this[t]=e=V(e,"src"===t);else if("img"===o&&"srcset"===t&&y(e)){for(var f="",h=fi(e),d=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,p=/\s/.test(h)?d:/(,)/,g=h.split(p),v=Math.floor(g.length/2),x=0;x<v;x++){var _=2*x;f+=V(fi(g[_]),!0),f+=" "+fi(g[_+1])}var b=fi(g[2*x]).split(/\s/);f+=V(fi(b[0]),!0),2===b.length&&(f+=" "+fi(b[1])),this[t]=e=f}n!==!1&&(null===e||m(e)?this.$$element.removeAttr(a):St.test(a)?this.$$element.attr(a,e):F(this.$$element[0],a,e));var $=this.$$observers;$&&r($[l],function(t){try{t(e)}catch(t){i(t)}})},$observe:function(t,e){var n=this,r=n.$$observers||(n.$$observers=vt()),i=r[t]||(r[t]=[]);return i.push(e),l.$evalAsync(function(){i.$$inter||!n.hasOwnProperty(t)||m(n[t])||e(n[t])}),function(){j(i,e)}}};var kt=n.startSymbol(),Pt=n.endSymbol(),Ot="{{"===kt&&"}}"===Pt?p:function(t){return t.replace(/\{\{/g,kt).replace(/}}/g,Pt)},Lt=/^ngAttr[A-Z]/,Dt=/^(.+)Start$/;return B.$$addBindingInfo=M?function(t,e){var n=t.data("$binding")||[];ci(e)?n=n.concat(e):n.push(e),t.data("$binding",n)}:d,B.$$addBindingClass=M?function(t){H(t,"ng-binding")}:d,B.$$addScopeInfo=M?function(t,e,n,r){var i=n?r?"$isolateScopeNoTemplate":"$isolateScope":"$scope";t.data(i,e)}:d,B.$$addScopeClass=M?function(t,e){H(t,e?"ng-isolate-scope":"ng-scope")}:d,B.$$createComment=function(e,n){var r="";return M&&(r=" "+(e||"")+": ",n&&(r+=n+" ")),t.document.createComment(r)},B}]}function be(t,e){this.previousValue=t,this.currentValue=e}function $e(t){return t.replace(sa,"").replace(ua,Tt)}function we(t,e){var n="",r=t.split(/\s+/),i=e.split(/\s+/);t:for(var a=0;a<r.length;a++){for(var o=r[a],s=0;s<i.length;s++)if(o===i[s])continue t;n+=(n.length>0?" ":"")+o}return n}function Se(t){t=Zr(t);var e=t.length;if(e<=1)return t;for(;e--;){var n=t[e];(n.nodeType===wi||n.nodeType===$i&&""===n.nodeValue.trim())&&ei.call(t,e,1)}return t}function Te(t,e){if(e&&b(e))return e;if(b(t)){var n=la.exec(t);if(n)return n[3]}}function Ae(){var t={},n=!1;this.has=function(e){return t.hasOwnProperty(e)},this.register=function(e,n){dt(e,"controller"),x(e)?c(t,e):t[e]=n},this.allowGlobals=function(){n=!0},this.$get=["$injector","$window",function(r,i){function a(t,n,r,i){if(!t||!x(t.$scope))throw e("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",i,n);t.$scope[n]=r}return function(e,o,s,u){var l,f,h,d;if(s=s===!0,u&&b(u)&&(d=u),b(e)){if(f=e.match(la),!f)throw ca("ctrlfmt","Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.",e);if(h=f[1],d=d||f[3],e=t.hasOwnProperty(h)?t[h]:pt(o.$scope,h,!0)||(n?pt(i,h,!0):void 0),!e)throw ca("ctrlreg","The controller with the name '{0}' is not registered.",h);ht(e,h,!0)}if(s){var p=(ci(e)?e[e.length-1]:e).prototype;return l=Object.create(p||null),d&&a(o,d,l,h||e.name),c(function(){var t=r.invoke(e,l,o,h);return t!==l&&(x(t)||S(t))&&(l=t,d&&a(o,d,l,h||e.name)),l},{instance:l,identifier:d})}return l=r.instantiate(e,o,h),d&&a(o,d,l,h||e.name),l}}]}function Ce(){this.$get=["$window",function(t){return Zr(t.document)}]}function Ee(){this.$get=["$document","$rootScope",function(t,e){function n(){i=r.hidden}var r=t[0],i=r&&r.hidden;return t.on("visibilitychange",n),e.$on("$destroy",function(){t.off("visibilitychange",n)}),function(){return i}}]}function Me(){this.$get=["$log",function(t){return function(e,n){t.error.apply(t,arguments)}}]}function ke(t){return x(t)?w(t)?t.toISOString():q(t):t}function Pe(){this.$get=function(){return function(t){if(!t)return"";var e=[];return i(t,function(t,n){null===t||m(t)||(ci(t)?r(t,function(t){e.push(nt(n)+"="+nt(ke(t)))}):e.push(nt(n)+"="+nt(ke(t))))}),e.join("&")}}}function Oe(){this.$get=function(){return function(t){function e(t,a,o){null===t||m(t)||(ci(t)?r(t,function(t,n){e(t,a+"["+(x(t)?n:"")+"]")}):x(t)&&!w(t)?i(t,function(t,n){e(t,a+(o?"":"[")+n+(o?"":"]"))}):n.push(nt(a)+"="+nt(ke(t))))}if(!t)return"";var n=[];return e(t,"",!0),n.join("&")}}}function Le(t,e){if(b(t)){var n=t.replace(va,"").trim();if(n){var r=e("Content-Type");(r&&0===r.indexOf(ha)||De(n))&&(t=Y(n))}}return t}function De(t){var e=t.match(pa);return e&&ga[e[0]].test(t)}function Ve(t){function e(t,e){t&&(i[t]=i[t]?i[t]+", "+e:e)}var n,i=vt();return b(t)?r(t.split("\n"),function(t){n=t.indexOf(":"),e(qr(fi(t.substr(0,n))),fi(t.substr(n+1)))}):x(t)&&r(t,function(t,n){e(qr(n),fi(t))}),i}function Re(t){var e;return function(n){if(e||(e=Ve(t)),n){var r=e[qr(n)];return void 0===r&&(r=null),r}return e}}function Ie(t,e,n,i){return S(i)?i(t,e,n):(r(i,function(r){t=r(t,e,n)}),t)}function Ne(t){return 200<=t&&t<300}function je(){var t=this.defaults={transformResponse:[Le],transformRequest:[function(t){return!x(t)||E(t)||k(t)||M(t)?t:q(t)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:xt(da),put:xt(da),patch:xt(da)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},n=!1;this.useApplyAsync=function(t){return y(t)?(n=!!t,this):n};var i=this.interceptors=[];this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function(a,o,s,u,l,f,h,p){function g(n){function i(t,e){for(var n=0,r=e.length;n<r;){var i=e[n++],a=e[n++];t=t.then(i,a)}return e.length=0,t}function o(){a.$$completeOutstandingRequest(d)}function s(t,e){var n,i={};return r(t,function(t,r){S(t)?(n=t(e),null!=n&&(i[r]=n)):i[r]=t}),i}function u(e){var n,r,i,a=t.headers,o=c({},e.headers);a=c({},a.common,a[qr(e.method)]);t:for(n in a){r=qr(n);for(i in o)if(qr(i)===r)continue t;o[n]=a[n]}return s(o,xt(e))}function l(e){var n=e.headers,i=Ie(e.data,Re(n),void 0,e.transformRequest);return m(i)&&r(n,function(t,e){"content-type"===qr(e)&&delete n[e]}),m(e.withCredentials)&&!m(t.withCredentials)&&(e.withCredentials=t.withCredentials),$(e,i).then(g,g)}function g(t){var e=c({},t);return e.data=Ie(t.data,t.headers,t.status,v.transformResponse),Ne(t.status)?e:f.reject(e)}if(!x(n))throw e("$http")("badreq","Http request configuration must be an object.  Received: {0}",n);if(!b(p.valueOf(n.url)))throw e("$http")("badreq","Http request configuration url must be a string or a $sce trusted object.  Received: {0}",n.url);var v=c({method:"get",transformRequest:t.transformRequest,transformResponse:t.transformResponse,paramSerializer:t.paramSerializer,jsonpCallbackParam:t.jsonpCallbackParam},n);v.headers=u(n),v.method=Yr(v.method),v.paramSerializer=b(v.paramSerializer)?h.get(v.paramSerializer):v.paramSerializer,a.$$incOutstandingRequestCount();var y=[],_=[],w=f.resolve(v);return r(C,function(t){(t.request||t.requestError)&&y.unshift(t.request,t.requestError),(t.response||t.responseError)&&_.push(t.response,t.responseError)}),w=i(w,y),w=w.then(l),w=i(w,_),w=w.finally(o)}function v(t){r(arguments,function(t){g[t]=function(e,n){return g(c({},n||{},{method:t,url:e}))}})}function _(t){r(arguments,function(t){g[t]=function(e,n,r){return g(c({},r||{},{method:t,url:e,data:n}))}})}function $(e,i){function a(t){if(t){var e={};return r(t,function(t,r){e[r]=function(e){function r(){t(e)}n?l.$applyAsync(r):l.$$phase?r():l.$apply(r)}}),e}}function u(t,e,r,i){function a(){c(e,t,r,i)}v&&(Ne(t)?v.put(M,[t,e,Ve(r),i]):v.remove(M)),n?l.$applyAsync(a):(a(),l.$$phase||l.$apply())}function c(t,n,r,i){n=n>=-1?n:0,(Ne(n)?$.resolve:$.reject)({data:t,status:n,headers:Re(r),config:e,statusText:i})}function h(t){c(t.data,t.status,xt(t.headers()),t.statusText)}function d(){var t=g.pendingRequests.indexOf(e);t!==-1&&g.pendingRequests.splice(t,1)}var v,_,$=f.defer(),S=$.promise,C=e.headers,E="jsonp"===qr(e.method),M=e.url;if(E?M=p.getTrustedResourceUrl(M):b(M)||(M=p.valueOf(M)),M=w(M,e.paramSerializer(e.params)),E&&(M=T(M,e.jsonpCallbackParam)),g.pendingRequests.push(e),S.then(d,d),!e.cache&&!t.cache||e.cache===!1||"GET"!==e.method&&"JSONP"!==e.method||(v=x(e.cache)?e.cache:x(t.cache)?t.cache:A),v&&(_=v.get(M),y(_)?O(_)?_.then(h,h):ci(_)?c(_[1],_[0],xt(_[2]),_[3]):c(_,200,{},"OK"):v.put(M,S)),m(_)){var k=Nn(e.url)?s()[e.xsrfCookieName||t.xsrfCookieName]:void 0;k&&(C[e.xsrfHeaderName||t.xsrfHeaderName]=k),o(e.method,M,i,u,C,e.timeout,e.withCredentials,e.responseType,a(e.eventHandlers),a(e.uploadEventHandlers))}return S}function w(t,e){return e.length>0&&(t+=(t.indexOf("?")===-1?"?":"&")+e),t}function T(t,e){if(/[&?][^=]+=JSON_CALLBACK/.test(t))throw ma("badjsonp",'Illegal use of JSON_CALLBACK in url, "{0}"',t);var n=new RegExp("[&?]"+e+"=");if(n.test(t))throw ma("badjsonp",'Illegal use of callback param, "{0}", in url, "{1}"',e,t);return t+=(t.indexOf("?")===-1?"?":"&")+e+"=JSON_CALLBACK"}var A=u("$http");t.paramSerializer=b(t.paramSerializer)?h.get(t.paramSerializer):t.paramSerializer;var C=[];return r(i,function(t){C.unshift(b(t)?h.get(t):h.invoke(t))}),g.pendingRequests=[],v("get","delete","head","jsonp"),_("post","put","patch"),g.defaults=t,g}]}function Fe(){this.$get=function(){return function(){return new t.XMLHttpRequest}}}function Ge(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(t,e,n,r){return He(t,r,t.defer,e,n[0])}]}function He(t,e,n,i,a){function o(t,e,n){t=t.replace("JSON_CALLBACK",e);var r=a.createElement("script"),o=null;return r.type="text/javascript",r.src=t,r.async=!0,o=function(t){r.removeEventListener("load",o),r.removeEventListener("error",o),a.body.removeChild(r),r=null;var s=-1,u="unknown";t&&("load"!==t.type||i.wasCalled(e)||(t={type:"error"}),u=t.type,s="error"===t.type?404:200),n&&n(s,u)},r.addEventListener("load",o),r.addEventListener("error",o),a.body.appendChild(r),o}return function(a,s,u,c,l,f,h,d,p,g){function v(){b&&b(),$&&$.abort()}function x(t,e,r,i,a){y(S)&&n.cancel(S),b=$=null,t(e,r,i,a)}if(s=s||t.url(),"jsonp"===qr(a))var _=i.createCallback(s),b=o(s,_,function(t,e){var n=200===t&&i.getResponse(_);x(c,t,n,"",e),i.removeCallback(_)});else{var $=e(a,s);$.open(a,s,!0),r(l,function(t,e){y(t)&&$.setRequestHeader(e,t)}),$.onload=function(){var t=$.statusText||"",e="response"in $?$.response:$.responseText,n=1223===$.status?204:$.status;0===n&&(n=e?200:"file"===In(s).protocol?404:0),x(c,n,e,$.getAllResponseHeaders(),t)};var w=function(){x(c,-1,null,null,"")};if($.onerror=w,$.onabort=w,$.ontimeout=w,r(p,function(t,e){$.addEventListener(e,t)}),r(g,function(t,e){$.upload.addEventListener(e,t)}),h&&($.withCredentials=!0),d)try{$.responseType=d}catch(t){if("json"!==d)throw t}$.send(m(u)?null:u)}if(f>0)var S=n(v,f);else O(f)&&f.then(v)}}function ze(){var t="{{",e="}}";this.startSymbol=function(e){return e?(t=e,this):t},this.endSymbol=function(t){return t?(e=t,this):e},this.$get=["$parse","$exceptionHandler","$sce",function(n,r,i){function a(t){return"\\\\\\"+t}function o(n){return n.replace(h,t).replace(d,e)}function s(t,e,n,r){var i=t.$watch(function(t){return i(),r(t)},e,n);return i}function u(a,u,h,d){function p(t){try{return t=P(t),d&&!y(t)?t:mt(t)}catch(t){r(ya.interr(a,t))}}if(!a.length||a.indexOf(t)===-1){var v;if(!u){var x=o(a);v=g(x),v.exp=a,v.expressions=[],v.$$watchDelegate=s}return v}d=!!d;for(var _,b,$,w=0,T=[],A=[],C=a.length,E=[],M=[];w<C;){if((_=a.indexOf(t,w))===-1||(b=a.indexOf(e,_+l))===-1){w!==C&&E.push(o(a.substring(w)));break}w!==_&&E.push(o(a.substring(w,_))),$=a.substring(_+l,b),T.push($),A.push(n($,p)),w=b+f,M.push(E.length),E.push("")}if(h&&E.length>1&&ya.throwNoconcat(a),!u||T.length){var k=function(t){for(var e=0,n=T.length;e<n;e++){if(d&&m(t[e]))return;E[M[e]]=t[e]}return E.join("")},P=function(t){return h?i.getTrusted(h,t):i.valueOf(t)};return c(function(t){var e=0,n=T.length,i=new Array(n);try{for(;e<n;e++)i[e]=A[e](t);return k(i)}catch(t){r(ya.interr(a,t))}},{exp:a,expressions:T,$$watchDelegate:function(t,e){var n;return t.$watchGroup(A,function(r,i){var a=k(r);S(e)&&e.call(this,a,r!==i?n:a,t),n=a})}})}}var l=t.length,f=e.length,h=new RegExp(t.replace(/./g,a),"g"),d=new RegExp(e.replace(/./g,a),"g");return u.startSymbol=function(){return t},u.endSymbol=function(){return e},u}]}function Ue(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(t,e,n,r,i){function a(a,s,u,c){function l(){f?a.apply(null,h):a(g)}var f=arguments.length>4,h=f?z(arguments,4):[],d=e.setInterval,p=e.clearInterval,g=0,v=y(c)&&!c,m=(v?r:n).defer(),x=m.promise;return u=y(u)?u:0,x.$$intervalId=d(function(){v?i.defer(l):t.$evalAsync(l),m.notify(g++),u>0&&g>=u&&(m.resolve(g),p(x.$$intervalId),delete o[x.$$intervalId]),v||t.$apply()},s),o[x.$$intervalId]=m,x}var o={};return a.cancel=function(t){return!!(t&&t.$$intervalId in o)&&(o[t.$$intervalId].promise.catch(d),o[t.$$intervalId].reject("canceled"),e.clearInterval(t.$$intervalId),delete o[t.$$intervalId],!0)},a}]}function Be(t){for(var e=t.split("/"),n=e.length;n--;)e[n]=et(e[n]);return e.join("/")}function qe(t,e){var n=In(t);e.$$protocol=n.protocol,e.$$host=n.hostname,e.$$port=f(n.port)||ba[n.protocol]||null}function Ye(t,e){if(wa.test(t))throw $a("badpath",'Invalid url "{0}".',t);var n="/"!==t.charAt(0);n&&(t="/"+t);var r=In(t);e.$$path=decodeURIComponent(n&&"/"===r.pathname.charAt(0)?r.pathname.substring(1):r.pathname),e.$$search=K(r.search),e.$$hash=decodeURIComponent(r.hash),e.$$path&&"/"!==e.$$path.charAt(0)&&(e.$$path="/"+e.$$path)}function We(t,e){return t.slice(0,e.length)===e}function Xe(t,e){if(We(e,t))return e.substr(t.length)}function Qe(t){var e=t.indexOf("#");return e===-1?t:t.substr(0,e)}function Ze(t){return t.replace(/(#.+)|#$/,"$1")}function Je(t){return t.substr(0,Qe(t).lastIndexOf("/")+1)}function Ke(t){return t.substring(0,t.indexOf("/",t.indexOf("//")+2))}function tn(t,e,n){this.$$html5=!0,n=n||"",qe(t,this),this.$$parse=function(t){var n=Xe(e,t);if(!b(n))throw $a("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',t,e);Ye(n,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var t=tt(this.$$search),n=this.$$hash?"#"+et(this.$$hash):"";this.$$url=Be(this.$$path)+(t?"?"+t:"")+n,this.$$absUrl=e+this.$$url.substr(1)},this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var a,o,s;return y(a=Xe(t,r))?(o=a,s=n&&y(a=Xe(n,a))?e+(Xe("/",a)||a):t+o):y(a=Xe(e,r))?s=e+a:e===r+"/"&&(s=e),s&&this.$$parse(s),!!s}}function en(t,e,n){qe(t,this),this.$$parse=function(r){function i(t,e,n){var r,i=/^\/[A-Z]:(\/.*)/;return We(e,n)&&(e=e.replace(n,"")),i.exec(e)?t:(r=i.exec(t),r?r[1]:t)}var a,o=Xe(t,r)||Xe(e,r);m(o)||"#"!==o.charAt(0)?this.$$html5?a=o:(a="",m(o)&&(t=r,this.replace())):(a=Xe(n,o),m(a)&&(a=o)),Ye(a,this),this.$$path=i(this.$$path,a,t),this.$$compose()},this.$$compose=function(){var e=tt(this.$$search),r=this.$$hash?"#"+et(this.$$hash):"";this.$$url=Be(this.$$path)+(e?"?"+e:"")+r,this.$$absUrl=t+(this.$$url?n+this.$$url:"")},this.$$parseLinkUrl=function(e,n){return Qe(t)===Qe(e)&&(this.$$parse(e),!0)}}function nn(t,e,n){this.$$html5=!0,en.apply(this,arguments),this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var a,o;return t===Qe(r)?a=r:(o=Xe(e,r))?a=t+n+o:e===r+"/"&&(a=e),a&&this.$$parse(a),!!a},this.$$compose=function(){var e=tt(this.$$search),r=this.$$hash?"#"+et(this.$$hash):"";this.$$url=Be(this.$$path)+(e?"?"+e:"")+r,this.$$absUrl=t+n+this.$$url}}function rn(t){return function(){return this[t]}}function an(t,e){return function(n){return m(n)?this[t]:(this[t]=e(n),this.$$compose(),this)}}function on(){var t="!",e={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(e){return y(e)?(t=e,this):t},this.html5Mode=function(t){return P(t)?(e.enabled=t,this):x(t)?(P(t.enabled)&&(e.enabled=t.enabled),P(t.requireBase)&&(e.requireBase=t.requireBase),(P(t.rewriteLinks)||b(t.rewriteLinks))&&(e.rewriteLinks=t.rewriteLinks),this):e},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(n,r,i,a,o){function s(t,e,n){var i=c.url(),a=c.$$state;try{r.url(t,e,n),c.$$state=r.state()}catch(t){throw c.url(i),c.$$state=a,t}}function u(t,e){n.$broadcast("$locationChangeSuccess",c.absUrl(),t,c.$$state,e)}var c,l,f,h=r.baseHref(),d=r.url();if(e.enabled){if(!h&&e.requireBase)throw $a("nobase","$location in HTML5 mode requires a <base> tag to be present!");f=Ke(d)+(h||"/"),l=i.history?tn:nn}else f=Qe(d),l=en;var p=Je(f);c=new l(f,p,"#"+t),c.$$parseLinkUrl(d,d),c.$$state=r.state();var g=/^\s*(javascript|mailto):/i;a.on("click",function(t){var i=e.rewriteLinks;if(i&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey&&2!==t.which&&2!==t.button){for(var s=Zr(t.target);"a"!==I(s[0]);)if(s[0]===a[0]||!(s=s.parent())[0])return;if(!b(i)||!m(s.attr(i))){var u=s.prop("href"),l=s.attr("href")||s.attr("xlink:href");x(u)&&"[object SVGAnimatedString]"===u.toString()&&(u=In(u.animVal).href),g.test(u)||!u||s.attr("target")||t.isDefaultPrevented()||c.$$parseLinkUrl(u,l)&&(t.preventDefault(),c.absUrl()!==r.url()&&(n.$apply(),o.angular["ff-684208-preventDefault"]=!0))}}}),Ze(c.absUrl())!==Ze(d)&&r.url(c.absUrl(),!0);var v=!0;return r.onUrlChange(function(t,e){return We(t,p)?(n.$evalAsync(function(){var r,i=c.absUrl(),a=c.$$state;t=Ze(t),c.$$parse(t),c.$$state=e,r=n.$broadcast("$locationChangeStart",t,i,e,a).defaultPrevented,c.absUrl()===t&&(r?(c.$$parse(i),c.$$state=a,s(i,!1,a)):(v=!1,u(i,a)))}),void(n.$$phase||n.$digest())):void(o.location.href=t)}),n.$watch(function(){var t=Ze(r.url()),e=Ze(c.absUrl()),a=r.state(),o=c.$$replace,l=t!==e||c.$$html5&&i.history&&a!==c.$$state;(v||l)&&(v=!1,n.$evalAsync(function(){var e=c.absUrl(),r=n.$broadcast("$locationChangeStart",e,t,c.$$state,a).defaultPrevented;c.absUrl()===e&&(r?(c.$$parse(t),c.$$state=a):(l&&s(e,o,a===c.$$state?null:c.$$state),u(t,a)))})),c.$$replace=!1}),c}]}function sn(){var t=!0,e=this;this.debugEnabled=function(e){return y(e)?(t=e,this):t},this.$get=["$window",function(n){function i(t){return t instanceof Error&&(t.stack?t=t.message&&t.stack.indexOf(t.message)===-1?"Error: "+t.message+"\n"+t.stack:t.stack:t.sourceURL&&(t=t.message+"\n"+t.sourceURL+":"+t.line)),t}function a(t){var e=n.console||{},a=e[t]||e.log||d,o=!1;try{o=!!a.apply}catch(t){}return o?function(){var t=[];return r(arguments,function(e){t.push(i(e))}),a.apply(e,t)}:function(t,e){a(t,null==e?"":e)}}return{log:a("log"),info:a("info"),warn:a("warn"),error:a("error"),debug:function(){var n=a("debug");return function(){
t&&n.apply(e,arguments)}}()}}]}function un(t){return t+""}function cn(t,e){return"undefined"!=typeof t?t:e}function ln(t,e){return"undefined"==typeof t?e:"undefined"==typeof e?t:t+e}function fn(t,e){var n=t(e);return!n.$stateful}function hn(t,e){var n,i,a;switch(t.type){case ka.Program:n=!0,r(t.body,function(t){hn(t.expression,e),n=n&&t.expression.constant}),t.constant=n;break;case ka.Literal:t.constant=!0,t.toWatch=[];break;case ka.UnaryExpression:hn(t.argument,e),t.constant=t.argument.constant,t.toWatch=t.argument.toWatch;break;case ka.BinaryExpression:hn(t.left,e),hn(t.right,e),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.left.toWatch.concat(t.right.toWatch);break;case ka.LogicalExpression:hn(t.left,e),hn(t.right,e),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.constant?[]:[t];break;case ka.ConditionalExpression:hn(t.test,e),hn(t.alternate,e),hn(t.consequent,e),t.constant=t.test.constant&&t.alternate.constant&&t.consequent.constant,t.toWatch=t.constant?[]:[t];break;case ka.Identifier:t.constant=!1,t.toWatch=[t];break;case ka.MemberExpression:hn(t.object,e),t.computed&&hn(t.property,e),t.constant=t.object.constant&&(!t.computed||t.property.constant),t.toWatch=[t];break;case ka.CallExpression:a=!!t.filter&&fn(e,t.callee.name),n=a,i=[],r(t.arguments,function(t){hn(t,e),n=n&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=n,t.toWatch=a?i:[t];break;case ka.AssignmentExpression:hn(t.left,e),hn(t.right,e),t.constant=t.left.constant&&t.right.constant,t.toWatch=[t];break;case ka.ArrayExpression:n=!0,i=[],r(t.elements,function(t){hn(t,e),n=n&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=n,t.toWatch=i;break;case ka.ObjectExpression:n=!0,i=[],r(t.properties,function(t){hn(t.value,e),n=n&&t.value.constant&&!t.computed,t.value.constant||i.push.apply(i,t.value.toWatch)}),t.constant=n,t.toWatch=i;break;case ka.ThisExpression:t.constant=!1,t.toWatch=[];break;case ka.LocalsExpression:t.constant=!1,t.toWatch=[]}}function dn(t){if(1===t.length){var e=t[0].expression,n=e.toWatch;return 1!==n.length?n:n[0]!==e?n:void 0}}function pn(t){return t.type===ka.Identifier||t.type===ka.MemberExpression}function gn(t){if(1===t.body.length&&pn(t.body[0].expression))return{type:ka.AssignmentExpression,left:t.body[0].expression,right:{type:ka.NGValueParameter},operator:"="}}function vn(t){return 0===t.body.length||1===t.body.length&&(t.body[0].expression.type===ka.Literal||t.body[0].expression.type===ka.ArrayExpression||t.body[0].expression.type===ka.ObjectExpression)}function mn(t){return t.constant}function yn(t,e){this.astBuilder=t,this.$filter=e}function xn(t,e){this.astBuilder=t,this.$filter=e}function _n(t){return S(t.valueOf)?t.valueOf():Aa.call(t)}function bn(){var t,e,n=vt(),i={true:!0,false:!1,null:null,undefined:void 0};this.addLiteral=function(t,e){i[t]=e},this.setIdentifierFns=function(n,r){return t=n,e=r,this},this.$get=["$filter",function(a){function o(t,e){var r,i,o;switch(typeof t){case"string":if(t=t.trim(),o=t,r=n[o],!r){":"===t.charAt(0)&&":"===t.charAt(1)&&(i=!0,t=t.substring(2));var s=new Ma(g),p=new Pa(s,a,g);r=p.parse(t),r.constant?r.$$watchDelegate=f:i?r.$$watchDelegate=r.literal?l:c:r.inputs&&(r.$$watchDelegate=u),n[o]=r}return h(r,e);case"function":return h(t,e);default:return h(d,e)}}function s(t,e){return null==t||null==e?t===e:("object"!=typeof t||(t=_n(t),"object"!=typeof t))&&(t===e||t!==t&&e!==e)}function u(t,e,n,r,i){var a,o=r.inputs;if(1===o.length){var u=s;return o=o[0],t.$watch(function(t){var e=o(t);return s(e,u)||(a=r(t,void 0,void 0,[e]),u=e&&_n(e)),a},e,n,i)}for(var c=[],l=[],f=0,h=o.length;f<h;f++)c[f]=s,l[f]=null;return t.$watch(function(t){for(var e=!1,n=0,i=o.length;n<i;n++){var u=o[n](t);(e||(e=!s(u,c[n])))&&(l[n]=u,c[n]=u&&_n(u))}return e&&(a=r(t,void 0,void 0,l)),a},e,n,i)}function c(t,e,n,r,i){function a(t){return r(t)}function o(t,n,r){c=t,S(e)&&e(t,n,r),y(t)&&r.$$postDigest(function(){y(c)&&s()})}var s,c;return s=r.inputs?u(t,o,n,r,i):t.$watch(a,o,n)}function l(t,e,n,i){function a(t){var e=!0;return r(t,function(t){y(t)||(e=!1)}),e}var o,s;return o=t.$watch(function(t){return i(t)},function(t,n,r){s=t,S(e)&&e(t,n,r),a(t)&&r.$$postDigest(function(){a(s)&&o()})},n)}function f(t,e,n,r){var i=t.$watch(function(t){return i(),r(t)},e,n);return i}function h(t,e){if(!e)return t;var n=t.$$watchDelegate,r=!1,i=n!==l&&n!==c,a=i?function(n,i,a,o){var s=r&&o?o[0]:t(n,i,a,o);return e(s,n,i)}:function(n,r,i,a){var o=t(n,r,i,a),s=e(o,n,r);return y(o)?s:o};return r=!t.inputs,t.$$watchDelegate&&t.$$watchDelegate!==u?(a.$$watchDelegate=t.$$watchDelegate,a.inputs=t.inputs):e.$stateful||(a.$$watchDelegate=u,a.inputs=t.inputs?t.inputs:[t]),a}var p=di().noUnsafeEval,g={csp:p,literals:F(i),isIdentifierStart:S(t)&&t,isIdentifierContinue:S(e)&&e};return o}]}function $n(){var t=!0;this.$get=["$rootScope","$exceptionHandler",function(e,n){return Sn(function(t){e.$evalAsync(t)},n,t)}],this.errorOnUnhandledRejections=function(e){return y(e)?(t=e,this):t}}function wn(){var t=!0;this.$get=["$browser","$exceptionHandler",function(e,n){return Sn(function(t){e.defer(t)},n,t)}],this.errorOnUnhandledRejections=function(e){return y(e)?(t=e,this):t}}function Sn(t,n,i){function a(){return new o}function o(){var t=this.promise=new s;this.resolve=function(e){h(t,e)},this.reject=function(e){p(t,e)},this.notify=function(e){v(t,e)}}function s(){this.$$state={status:0}}function u(e){var n,r,a;a=e.pending,e.processScheduled=!1,e.pending=void 0;try{for(var o=0,s=a.length;o<s;++o){e.pur=!0,r=a[o][0],n=a[o][e.status];try{S(n)?h(r,n(e.value)):1===e.status?h(r,e.value):p(r,e.value)}catch(t){p(r,t)}}}finally{--C,i&&0===C&&t(l)}}function l(){for(;!C&&E.length;){var t=E.shift();if(!t.pur){t.pur=!0;var e="Possibly unhandled rejection: "+bt(t.value);t.value instanceof Error?n(t.value,e):n(e)}}}function f(e){!i||e.pending||2!==e.status||e.pur||(0===C&&0===E.length&&t(l),E.push(e)),!e.processScheduled&&e.pending&&(e.processScheduled=!0,++C,t(function(){u(e)}))}function h(t,e){t.$$state.status||(e===t?g(t,A("qcycle","Expected promise to be resolved with value other than itself '{0}'",e)):d(t,e))}function d(t,e){function n(e){o||(o=!0,d(t,e))}function r(e){o||(o=!0,g(t,e))}function i(e){v(t,e)}var a,o=!1;try{(x(e)||S(e))&&(a=e.then),S(a)?(t.$$state.status=-1,a.call(e,n,r,i)):(t.$$state.value=e,t.$$state.status=1,f(t.$$state))}catch(t){r(t)}}function p(t,e){t.$$state.status||g(t,e)}function g(t,e){t.$$state.value=e,t.$$state.status=2,f(t.$$state)}function v(e,r){var i=e.$$state.pending;e.$$state.status<=0&&i&&i.length&&t(function(){for(var t,e,a=0,o=i.length;a<o;a++){e=i[a][0],t=i[a][3];try{v(e,S(t)?t(r):r)}catch(t){n(t)}}})}function y(t){var e=new s;return p(e,t),e}function _(t,e,n){var r=null;try{S(n)&&(r=n())}catch(t){return y(t)}return O(r)?r.then(function(){return e(t)},y):e(t)}function b(t,e,n,r){var i=new s;return h(i,t),i.then(e,n,r)}function $(t){var e=new s,n=0,i=ci(t)?[]:{};return r(t,function(t,r){n++,b(t).then(function(t){i[r]=t,--n||h(e,i)},function(t){p(e,t)})}),0===n&&h(e,i),e}function w(t){var e=a();return r(t,function(t){b(t).then(e.resolve,e.reject)}),e.promise}function T(t){function e(t){h(r,t)}function n(t){p(r,t)}if(!S(t))throw A("norslvr","Expected resolverFn, got '{0}'",t);var r=new s;return t(e,n),r}var A=e("$q",TypeError),C=0,E=[];c(s.prototype,{then:function(t,e,n){if(m(t)&&m(e)&&m(n))return this;var r=new s;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([r,t,e,n]),this.$$state.status>0&&f(this.$$state),r},catch:function(t){return this.then(null,t)},finally:function(t,e){return this.then(function(e){return _(e,M,t)},function(e){return _(e,y,t)},e)}});var M=b;return T.prototype=s.prototype,T.defer=a,T.reject=y,T.when=b,T.resolve=M,T.all=$,T.race=w,T}function Tn(){this.$get=["$window","$timeout",function(t,e){var n=t.requestAnimationFrame||t.webkitRequestAnimationFrame,r=t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.webkitCancelRequestAnimationFrame,i=!!n,a=i?function(t){var e=n(t);return function(){r(e)}}:function(t){var n=e(t,16.66,!1);return function(){e.cancel(n)}};return a.supported=i,a}]}function An(){function t(t){function e(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=o(),this.$$ChildScope=null}return e.prototype=t,e}var i=10,a=e("$rootScope"),s=null,u=null;this.digestTtl=function(t){return arguments.length&&(i=t),i},this.$get=["$exceptionHandler","$parse","$browser",function(e,c,l){function f(t){t.currentScope.$$destroyed=!0}function h(t){9===Qr&&(t.$$childHead&&h(t.$$childHead),t.$$nextSibling&&h(t.$$nextSibling)),t.$parent=t.$$nextSibling=t.$$prevSibling=t.$$childHead=t.$$childTail=t.$root=t.$$watchers=null}function p(){this.$id=o(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$$isolateBindings=null}function g(t){if(T.$$phase)throw a("inprog","{0} already in progress",T.$$phase);T.$$phase=t}function v(){T.$$phase=null}function y(t,e){do t.$$watchersCount+=e;while(t=t.$parent)}function _(t,e,n){do t.$$listenerCount[n]-=e,0===t.$$listenerCount[n]&&delete t.$$listenerCount[n];while(t=t.$parent)}function b(){}function $(){for(;E.length;)try{E.shift()()}catch(t){e(t)}u=null}function w(){null===u&&(u=l.defer(function(){T.$apply($)}))}p.prototype={constructor:p,$new:function(e,n){var r;return n=n||this,e?(r=new p,r.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=t(this)),r=new this.$$ChildScope),r.$parent=n,r.$$prevSibling=n.$$childTail,n.$$childHead?(n.$$childTail.$$nextSibling=r,n.$$childTail=r):n.$$childHead=n.$$childTail=r,(e||n!==this)&&r.$on("$destroy",f),r},$watch:function(t,e,n,r){var i=c(t);if(i.$$watchDelegate)return i.$$watchDelegate(this,e,n,i,t);var a=this,o=a.$$watchers,u={fn:e,last:b,get:i,exp:r||t,eq:!!n};return s=null,S(e)||(u.fn=d),o||(o=a.$$watchers=[],o.$$digestWatchIndex=-1),o.unshift(u),o.$$digestWatchIndex++,y(this,1),function(){var t=j(o,u);t>=0&&(y(a,-1),t<o.$$digestWatchIndex&&o.$$digestWatchIndex--),s=null}},$watchGroup:function(t,e){function n(){u=!1,c?(c=!1,e(a,a,s)):e(a,i,s)}var i=new Array(t.length),a=new Array(t.length),o=[],s=this,u=!1,c=!0;if(!t.length){var l=!0;return s.$evalAsync(function(){l&&e(a,a,s)}),function(){l=!1}}return 1===t.length?this.$watch(t[0],function(t,n,r){a[0]=t,i[0]=n,e(a,t===n?a:i,r)}):(r(t,function(t,e){var r=s.$watch(t,function(t,r){a[e]=t,i[e]=r,u||(u=!0,s.$evalAsync(n))});o.push(r)}),function(){for(;o.length;)o.shift()()})},$watchCollection:function(t,e){function r(t){a=t;var e,r,i,s,u;if(!m(a)){if(x(a))if(n(a)){o!==d&&(o=d,v=o.length=0,f++),e=a.length,v!==e&&(f++,o.length=v=e);for(var c=0;c<e;c++)u=o[c],s=a[c],i=u!==u&&s!==s,i||u===s||(f++,o[c]=s)}else{o!==p&&(o=p={},v=0,f++),e=0;for(r in a)Br.call(a,r)&&(e++,s=a[r],u=o[r],r in o?(i=u!==u&&s!==s,i||u===s||(f++,o[r]=s)):(v++,o[r]=s,f++));if(v>e){f++;for(r in o)Br.call(a,r)||(v--,delete o[r])}}else o!==a&&(o=a,f++);return f}}function i(){if(g?(g=!1,e(a,a,u)):e(a,s,u),l)if(x(a))if(n(a)){s=new Array(a.length);for(var t=0;t<a.length;t++)s[t]=a[t]}else{s={};for(var r in a)Br.call(a,r)&&(s[r]=a[r])}else s=a}r.$stateful=!0;var a,o,s,u=this,l=e.length>1,f=0,h=c(t,r),d=[],p={},g=!0,v=0;return this.$watch(h,i)},$digest:function(){var t,n,r,o,c,f,h,d,p,m,y,x=i,_=this,w=[];g("$digest"),l.$$checkUrlChange(),this===T&&null!==u&&(l.defer.cancel(u),$()),s=null;do{h=!1,p=_;for(var E=0;E<A.length;E++){try{y=A[E],y.scope.$eval(y.expression,y.locals)}catch(t){e(t)}s=null}A.length=0;t:do{if(f=p.$$watchers)for(f.$$digestWatchIndex=f.length;f.$$digestWatchIndex--;)try{if(t=f[f.$$digestWatchIndex])if(c=t.get,(n=c(p))===(r=t.last)||(t.eq?G(n,r):ui(n)&&ui(r))){if(t===s){h=!1;break t}}else h=!0,s=t,t.last=t.eq?F(n,null):n,o=t.fn,o(n,r===b?n:r,p),x<5&&(m=4-x,w[m]||(w[m]=[]),w[m].push({msg:S(t.exp)?"fn: "+(t.exp.name||t.exp.toString()):t.exp,newVal:n,oldVal:r}))}catch(t){e(t)}if(!(d=p.$$watchersCount&&p.$$childHead||p!==_&&p.$$nextSibling))for(;p!==_&&!(d=p.$$nextSibling);)p=p.$parent}while(p=d);if((h||A.length)&&!x--)throw v(),a("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",i,w)}while(h||A.length);for(v();M<C.length;)try{C[M++]()}catch(t){e(t)}C.length=M=0},$destroy:function(){if(!this.$$destroyed){var t=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this===T&&l.$$applicationDestroyed(),y(this,-this.$$watchersCount);for(var e in this.$$listenerCount)_(this,this.$$listenerCount[e],e);t&&t.$$childHead===this&&(t.$$childHead=this.$$nextSibling),t&&t.$$childTail===this&&(t.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=d,this.$on=this.$watch=this.$watchGroup=function(){return d},this.$$listeners={},this.$$nextSibling=null,h(this)}},$eval:function(t,e){return c(t)(this,e)},$evalAsync:function(t,e){T.$$phase||A.length||l.defer(function(){A.length&&T.$digest()}),A.push({scope:this,expression:c(t),locals:e})},$$postDigest:function(t){C.push(t)},$apply:function(t){try{g("$apply");try{return this.$eval(t)}finally{v()}}catch(t){e(t)}finally{try{T.$digest()}catch(t){throw e(t),t}}},$applyAsync:function(t){function e(){n.$eval(t)}var n=this;t&&E.push(e),t=c(t),w()},$on:function(t,e){var n=this.$$listeners[t];n||(this.$$listeners[t]=n=[]),n.push(e);var r=this;do r.$$listenerCount[t]||(r.$$listenerCount[t]=0),r.$$listenerCount[t]++;while(r=r.$parent);var i=this;return function(){var r=n.indexOf(e);r!==-1&&(n[r]=null,_(i,1,t))}},$emit:function(t,n){var r,i,a,o=[],s=this,u=!1,c={name:t,targetScope:s,stopPropagation:function(){u=!0},preventDefault:function(){c.defaultPrevented=!0},defaultPrevented:!1},l=H([c],arguments,1);do{for(r=s.$$listeners[t]||o,c.currentScope=s,i=0,a=r.length;i<a;i++)if(r[i])try{r[i].apply(null,l)}catch(t){e(t)}else r.splice(i,1),i--,a--;if(u)return c.currentScope=null,c;s=s.$parent}while(s);return c.currentScope=null,c},$broadcast:function(t,n){var r=this,i=r,a=r,o={name:t,targetScope:r,preventDefault:function(){o.defaultPrevented=!0},defaultPrevented:!1};if(!r.$$listenerCount[t])return o;for(var s,u,c,l=H([o],arguments,1);i=a;){for(o.currentScope=i,s=i.$$listeners[t]||[],u=0,c=s.length;u<c;u++)if(s[u])try{s[u].apply(null,l)}catch(t){e(t)}else s.splice(u,1),u--,c--;if(!(a=i.$$listenerCount[t]&&i.$$childHead||i!==r&&i.$$nextSibling))for(;i!==r&&!(a=i.$$nextSibling);)i=i.$parent}return o.currentScope=null,o}};var T=new p,A=T.$$asyncQueue=[],C=T.$$postDigestQueue=[],E=T.$$applyAsyncQueue=[],M=0;return T}]}function Cn(){var t=/^\s*(https?|ftp|mailto|tel|file):/,e=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(e){return y(e)?(t=e,this):t},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(e=t,this):e},this.$get=function(){return function(n,r){var i,a=r?e:t;return i=In(n).href,""===i||i.match(a)?n:"unsafe:"+i}}}function En(t){return t.replace(Da,Tt)}function Mn(t){if("self"===t)return t;if(b(t)){if(t.indexOf("***")>-1)throw Oa("iwcard","Illegal sequence *** in string matcher.  String: {0}",t);return t=hi(t).replace(/\\\*\\\*/g,".*").replace(/\\\*/g,"[^:/.?&;]*"),new RegExp("^"+t+"$")}if(T(t))return new RegExp("^"+t.source+"$");throw Oa("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function kn(t){var e=[];return y(t)&&r(t,function(t){e.push(Mn(t))}),e}function Pn(){this.SCE_CONTEXTS=La;var t=["self"],e=[];this.resourceUrlWhitelist=function(e){return arguments.length&&(t=kn(e)),t},this.resourceUrlBlacklist=function(t){return arguments.length&&(e=kn(t)),e},this.$get=["$injector",function(n){function r(t,e){return"self"===t?Nn(e):!!t.exec(e.href)}function i(n){var i,a,o=In(n.toString()),s=!1;for(i=0,a=t.length;i<a;i++)if(r(t[i],o)){s=!0;break}if(s)for(i=0,a=e.length;i<a;i++)if(r(e[i],o)){s=!1;break}return s}function a(t){var e=function(t){this.$$unwrapTrustedValue=function(){return t}};return t&&(e.prototype=new t),e.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},e.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},e}function o(t,e){var n=f.hasOwnProperty(t)?f[t]:null;if(!n)throw Oa("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",t,e);if(null===e||m(e)||""===e)return e;if("string"!=typeof e)throw Oa("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",t);return new n(e)}function s(t){return t instanceof l?t.$$unwrapTrustedValue():t}function u(t,e){if(null===e||m(e)||""===e)return e;var n=f.hasOwnProperty(t)?f[t]:null;if(n&&e instanceof n)return e.$$unwrapTrustedValue();if(t===La.RESOURCE_URL){if(i(e))return e;throw Oa("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}",e.toString())}if(t===La.HTML)return c(e);throw Oa("unsafe","Attempting to use an unsafe value in a safe context.")}var c=function(t){throw Oa("unsafe","Attempting to use an unsafe value in a safe context.")};n.has("$sanitize")&&(c=n.get("$sanitize"));var l=a(),f={};return f[La.HTML]=a(l),f[La.CSS]=a(l),f[La.URL]=a(l),f[La.JS]=a(l),f[La.RESOURCE_URL]=a(f[La.URL]),{trustAs:o,getTrusted:u,valueOf:s}}]}function On(){var t=!0;this.enabled=function(e){return arguments.length&&(t=!!e),t},this.$get=["$parse","$sceDelegate",function(e,n){if(t&&Qr<8)throw Oa("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.");var i=xt(La);i.isEnabled=function(){return t},i.trustAs=n.trustAs,i.getTrusted=n.getTrusted,i.valueOf=n.valueOf,t||(i.trustAs=i.getTrusted=function(t,e){return e},i.valueOf=p),i.parseAs=function(t,n){var r=e(n);return r.literal&&r.constant?r:e(n,function(e){return i.getTrusted(t,e)})};var a=i.parseAs,o=i.getTrusted,s=i.trustAs;return r(La,function(t,e){var n=qr(e);i[En("parse_as_"+n)]=function(e){return a(t,e)},i[En("get_trusted_"+n)]=function(e){return o(t,e)},i[En("trust_as_"+n)]=function(e){return s(t,e)}}),i}]}function Ln(){this.$get=["$window","$document",function(t,e){var n={},r=t.chrome&&(t.chrome.app&&t.chrome.app.runtime||!t.chrome.app&&t.chrome.runtime&&t.chrome.runtime.id),i=!r&&t.history&&t.history.pushState,a=f((/android (\d+)/.exec(qr((t.navigator||{}).userAgent))||[])[1]),o=/Boxee/i.test((t.navigator||{}).userAgent),s=e[0]||{},u=s.body&&s.body.style,c=!1,l=!1;return u&&(c=!!("transition"in u||"webkitTransition"in u),l=!!("animation"in u||"webkitAnimation"in u)),{history:!(!i||a<4||o),hasEvent:function(t){if("input"===t&&Qr)return!1;if(m(n[t])){var e=s.createElement("div");n[t]="on"+t in e}return n[t]},csp:di(),transitions:c,animations:l,android:a}}]}function Dn(){var t;this.httpOptions=function(e){return e?(t=e,this):t},this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function(e,n,r,i,a){function o(s,u){function l(t){return u||(t=Va("tpload","Failed to load template: {0} (HTTP status: {1} {2})",s,t.status,t.statusText),e(t)),i.reject(t)}o.totalPendingRequests++,b(s)&&!m(n.get(s))||(s=a.getTrustedResourceUrl(s));var f=r.defaults&&r.defaults.transformResponse;return ci(f)?f=f.filter(function(t){return t!==Le}):f===Le&&(f=null),r.get(s,c({cache:n,transformResponse:f},t)).finally(function(){o.totalPendingRequests--}).then(function(t){return n.put(s,t.data),t.data},l)}return o.totalPendingRequests=0,o}]}function Vn(){this.$get=["$rootScope","$browser","$location",function(t,e,n){var i={};return i.findBindings=function(t,e,n){var i=t.getElementsByClassName("ng-binding"),a=[];return r(i,function(t){var i=oi.element(t).data("$binding");i&&r(i,function(r){if(n){var i=new RegExp("(^|\\s)"+hi(e)+"(\\s|\\||$)");i.test(r)&&a.push(t)}else r.indexOf(e)!==-1&&a.push(t)})}),a},i.findModels=function(t,e,n){for(var r=["ng-","data-ng-","ng\\:"],i=0;i<r.length;++i){var a=n?"=":"*=",o="["+r[i]+"model"+a+'"'+e+'"]',s=t.querySelectorAll(o);if(s.length)return s}},i.getLocation=function(){return n.url()},i.setLocation=function(e){e!==n.url()&&(n.url(e),t.$digest())},i.whenStable=function(t){e.notifyWhenNoOutstandingRequests(t)},i}]}function Rn(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(t,e,n,r,i){function a(a,s,u){S(a)||(u=s,s=a,a=d);var c,l=z(arguments,3),f=y(u)&&!u,h=(f?r:n).defer(),p=h.promise;return c=e.defer(function(){try{h.resolve(a.apply(null,l))}catch(t){h.reject(t),i(t)}finally{delete o[p.$$timeoutId]}f||t.$apply()},s),p.$$timeoutId=c,o[c]=h,p}var o={};return a.cancel=function(t){return!!(t&&t.$$timeoutId in o)&&(o[t.$$timeoutId].promise.catch(d),o[t.$$timeoutId].reject("canceled"),delete o[t.$$timeoutId],e.defer.cancel(t.$$timeoutId))},a}]}function In(t){var e=t;return Qr&&(Ra.setAttribute("href",e),e=Ra.href),Ra.setAttribute("href",e),{href:Ra.href,protocol:Ra.protocol?Ra.protocol.replace(/:$/,""):"",host:Ra.host,search:Ra.search?Ra.search.replace(/^\?/,""):"",hash:Ra.hash?Ra.hash.replace(/^#/,""):"",hostname:Ra.hostname,port:Ra.port,pathname:"/"===Ra.pathname.charAt(0)?Ra.pathname:"/"+Ra.pathname}}function Nn(t){var e=b(t)?In(t):t;return e.protocol===Ia.protocol&&e.host===Ia.host}function jn(){this.$get=g(t)}function Fn(t){function e(t){try{return t.cookie||""}catch(t){return""}}function n(t){try{return decodeURIComponent(t)}catch(e){return t}}var r=t[0]||{},i={},a="";return function(){var t,o,s,u,c,l=e(r);if(l!==a)for(a=l,t=a.split("; "),i={},s=0;s<t.length;s++)o=t[s],u=o.indexOf("="),u>0&&(c=n(o.substring(0,u)),m(i[c])&&(i[c]=n(o.substring(u+1))));return i}}function Gn(){this.$get=Fn}function Hn(t){function e(i,a){if(x(i)){var o={};return r(i,function(t,n){o[n]=e(n,t)}),o}return t.factory(i+n,a)}var n="Filter";this.register=e,this.$get=["$injector",function(t){return function(e){return t.get(e+n)}}],e("currency",Yn),e("date",ur),e("filter",zn),e("json",cr),e("limitTo",lr),e("lowercase",Ua),e("number",Wn),e("orderBy",hr),e("uppercase",Ba)}function zn(){return function(t,r,i,a){if(!n(t)){if(null==t)return t;throw e("filter")("notarray","Expected array but received: {0}",t)}a=a||"$";var o,s,u=qn(r);switch(u){case"function":o=r;break;case"boolean":case"null":case"number":case"string":s=!0;case"object":o=Un(r,i,a,s);break;default:return t}return Array.prototype.filter.call(t,o)}}function Un(t,e,n,r){var i,a=x(t)&&n in t;return e===!0?e=G:S(e)||(e=function(t,e){return!m(t)&&(null===t||null===e?t===e:!(x(e)||x(t)&&!v(t))&&(t=qr(""+t),e=qr(""+e),t.indexOf(e)!==-1))}),i=function(i){return a&&!x(i)?Bn(i,t[n],e,n,!1):Bn(i,t,e,n,r)}}function Bn(t,e,n,r,i,a){var o=qn(t),s=qn(e);if("string"===s&&"!"===e.charAt(0))return!Bn(t,e.substring(1),n,r,i);if(ci(t))return t.some(function(t){return Bn(t,e,n,r,i)});switch(o){case"object":var u;if(i){for(u in t)if("$"!==u.charAt(0)&&Bn(t[u],e,n,r,!0))return!0;return!a&&Bn(t,e,n,r,!1)}if("object"===s){for(u in e){var c=e[u];if(!S(c)&&!m(c)){var l=u===r,f=l?t:t[u];if(!Bn(f,c,n,r,l,l))return!1}}return!0}return n(t,e);case"function":return!1;default:return n(t,e)}}function qn(t){return null===t?"null":typeof t}function Yn(t){var e=t.NUMBER_FORMATS;return function(t,n,r){return m(n)&&(n=e.CURRENCY_SYM),m(r)&&(r=e.PATTERNS[1].maxFrac),null==t?t:Zn(t,e.PATTERNS[1],e.GROUP_SEP,e.DECIMAL_SEP,r).replace(/\u00A4/g,n)}}function Wn(t){var e=t.NUMBER_FORMATS;return function(t,n){return null==t?t:Zn(t,e.PATTERNS[0],e.GROUP_SEP,e.DECIMAL_SEP,n)}}function Xn(t){var e,n,r,i,a,o=0;for((n=t.indexOf(ja))>-1&&(t=t.replace(ja,"")),(r=t.search(/e/i))>0?(n<0&&(n=r),n+=+t.slice(r+1),t=t.substring(0,r)):n<0&&(n=t.length),r=0;t.charAt(r)===Fa;r++);if(r===(a=t.length))e=[0],n=1;else{for(a--;t.charAt(a)===Fa;)a--;for(n-=r,e=[],i=0;r<=a;r++,i++)e[i]=+t.charAt(r)}return n>Na&&(e=e.splice(0,Na-1),o=n-1,n=1),{d:e,e:o,i:n}}function Qn(t,e,n,r){var i=t.d,a=i.length-t.i;e=m(e)?Math.min(Math.max(n,a),r):+e;var o=e+t.i,s=i[o];if(o>0){i.splice(Math.max(t.i,o));for(var u=o;u<i.length;u++)i[u]=0}else{a=Math.max(0,a),t.i=1,i.length=Math.max(1,o=e+1),i[0]=0;for(var c=1;c<o;c++)i[c]=0}if(s>=5)if(o-1<0){for(var l=0;l>o;l--)i.unshift(0),t.i++;i.unshift(1),t.i++}else i[o-1]++;for(;a<Math.max(0,e);a++)i.push(0);var f=i.reduceRight(function(t,e,n,r){return e+=t,r[n]=e%10,Math.floor(e/10)},0);f&&(i.unshift(f),t.i++)}function Zn(t,e,n,r,i){if(!b(t)&&!$(t)||isNaN(t))return"";var a,o=!isFinite(t),s=!1,u=Math.abs(t)+"",c="";if(o)c="∞";else{a=Xn(u),Qn(a,i,e.minFrac,e.maxFrac);var l=a.d,f=a.i,h=a.e,d=[];for(s=l.reduce(function(t,e){return t&&!e},!0);f<0;)l.unshift(0),f++;f>0?d=l.splice(f,l.length):(d=l,l=[0]);var p=[];for(l.length>=e.lgSize&&p.unshift(l.splice(-e.lgSize,l.length).join(""));l.length>e.gSize;)p.unshift(l.splice(-e.gSize,l.length).join(""));l.length&&p.unshift(l.join("")),c=p.join(n),d.length&&(c+=r+d.join("")),h&&(c+="e+"+h)}return t<0&&!s?e.negPre+c+e.negSuf:e.posPre+c+e.posSuf}function Jn(t,e,n,r){var i="";for((t<0||r&&t<=0)&&(r?t=-t+1:(t=-t,i="-")),t=""+t;t.length<e;)t=Fa+t;return n&&(t=t.substr(t.length-e)),i+t}function Kn(t,e,n,r,i){return n=n||0,function(a){var o=a["get"+t]();return(n>0||o>-n)&&(o+=n),0===o&&n===-12&&(o=12),Jn(o,e,r,i)}}function tr(t,e,n){return function(r,i){var a=r["get"+t](),o=(n?"STANDALONE":"")+(e?"SHORT":""),s=Yr(o+t);return i[s][a]}}function er(t,e,n){var r=-1*n,i=r>=0?"+":"";return i+=Jn(Math[r>0?"floor":"ceil"](r/60),2)+Jn(Math.abs(r%60),2)}function nr(t){var e=new Date(t,0,1).getDay();return new Date(t,0,(e<=4?5:12)-e)}function rr(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate()+(4-t.getDay()))}function ir(t){return function(e){var n=nr(e.getFullYear()),r=rr(e),i=+r-+n,a=1+Math.round(i/6048e5);return Jn(a,t)}}function ar(t,e){return t.getHours()<12?e.AMPMS[0]:e.AMPMS[1]}function or(t,e){return t.getFullYear()<=0?e.ERAS[0]:e.ERAS[1]}function sr(t,e){return t.getFullYear()<=0?e.ERANAMES[0]:e.ERANAMES[1]}function ur(t){function e(t){var e;if(e=t.match(n)){var r=new Date(0),i=0,a=0,o=e[8]?r.setUTCFullYear:r.setFullYear,s=e[8]?r.setUTCHours:r.setHours;e[9]&&(i=f(e[9]+e[10]),a=f(e[9]+e[11])),o.call(r,f(e[1]),f(e[2])-1,f(e[3]));var u=f(e[4]||0)-i,c=f(e[5]||0)-a,l=f(e[6]||0),h=Math.round(1e3*parseFloat("0."+(e[7]||0)));return s.call(r,u,c,l,h),r}return t}var n=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(n,i,a){var o,s,u="",c=[];if(i=i||"mediumDate",i=t.DATETIME_FORMATS[i]||i,b(n)&&(n=za.test(n)?f(n):e(n)),$(n)&&(n=new Date(n)),!w(n)||!isFinite(n.getTime()))return n;for(;i;)s=Ha.exec(i),s?(c=H(c,s,1),i=c.pop()):(c.push(i),i=null);var l=n.getTimezoneOffset();return a&&(l=W(a,l),n=Q(n,a,!0)),r(c,function(e){o=Ga[e],u+=o?o(n,t.DATETIME_FORMATS,l):"''"===e?"'":e.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),u}}function cr(){return function(t,e){return m(e)&&(e=2),q(t,e)}}function lr(){return function(t,e,r){return e=Math.abs(Number(e))===1/0?Number(e):f(e),ui(e)?t:($(t)&&(t=t.toString()),n(t)?(r=!r||isNaN(r)?0:f(r),r=r<0?Math.max(0,t.length+r):r,e>=0?fr(t,r,r+e):0===r?fr(t,e,t.length):fr(t,Math.max(0,r+e),r)):t)}}function fr(t,e,n){return b(t)?t.slice(e,n):ti.call(t,e,n)}function hr(t){function r(e){return e.map(function(e){var n=1,r=p;if(S(e))r=e;else if(b(e)&&("+"!==e.charAt(0)&&"-"!==e.charAt(0)||(n="-"===e.charAt(0)?-1:1,e=e.substring(1)),""!==e&&(r=t(e),r.constant))){var i=r();r=function(t){return t[i]}}return{get:r,descending:n}})}function i(t){switch(typeof t){case"number":case"boolean":case"string":return!0;default:return!1}}function a(t){return S(t.valueOf)&&(t=t.valueOf(),i(t))?t:v(t)&&(t=t.toString(),i(t))?t:t}function o(t,e){var n=typeof t;return null===t?(n="string",t="null"):"object"===n&&(t=a(t)),{value:t,type:n,index:e}}function s(t,e){var n=0,r=t.type,i=e.type;if(r===i){var a=t.value,o=e.value;"string"===r?(a=a.toLowerCase(),o=o.toLowerCase()):"object"===r&&(x(a)&&(a=t.index),x(o)&&(o=e.index)),a!==o&&(n=a<o?-1:1)}else n=r<i?-1:1;return n}return function(t,i,a,u){function c(t,e){return{value:t,tieBreaker:{value:e,type:"number",index:e},predicateValues:f.map(function(n){return o(n.get(t),e)})}}function l(t,e){for(var n=0,r=f.length;n<r;n++){var i=d(t.predicateValues[n],e.predicateValues[n]);if(i)return i*f[n].descending*h}return d(t.tieBreaker,e.tieBreaker)*h}if(null==t)return t;if(!n(t))throw e("orderBy")("notarray","Expected array but received: {0}",t);ci(i)||(i=[i]),0===i.length&&(i=["+"]);var f=r(i),h=a?-1:1,d=S(u)?u:s,p=Array.prototype.map.call(t,c);return p.sort(l),t=p.map(function(t){return t.value})}}function dr(t){return S(t)&&(t={link:t}),t.restrict=t.restrict||"AC",g(t)}function pr(t,e){t.$name=e}function gr(t,e,n,r,i){this.$$controls=[],this.$error={},this.$$success={},this.$pending=void 0,this.$name=i(e.name||e.ngForm||"")(n),this.$dirty=!1,this.$pristine=!0,this.$valid=!0,this.$invalid=!1,this.$submitted=!1,this.$$parentForm=Wa,this.$$element=t,this.$$animate=r,vr(this)}function vr(t){t.$$classCache={},t.$$classCache[Lo]=!(t.$$classCache[Oo]=t.$$element.hasClass(Oo))}function mr(t){function e(t,e,n,r){t[e]||(t[e]={}),o(t[e],n,r)}function n(t,e,n,r){t[e]&&s(t[e],n,r),yr(t[e])&&(t[e]=void 0)}function r(t,e,n){n&&!t.$$classCache[e]?(t.$$animate.addClass(t.$$element,e),t.$$classCache[e]=!0):!n&&t.$$classCache[e]&&(t.$$animate.removeClass(t.$$element,e),t.$$classCache[e]=!1)}function i(t,e,n){e=e?"-"+ct(e,"-"):"",r(t,Oo+e,n===!0),r(t,Lo+e,n===!1)}var a=t.clazz,o=t.set,s=t.unset;a.prototype.$setValidity=function(t,a,u){m(a)?e(this,"$pending",t,u):n(this,"$pending",t,u),P(a)?a?(s(this.$error,t,u),o(this.$$success,t,u)):(o(this.$error,t,u),s(this.$$success,t,u)):(s(this.$error,t,u),s(this.$$success,t,u)),this.$pending?(r(this,Xa,!0),this.$valid=this.$invalid=void 0,i(this,"",null)):(r(this,Xa,!1),this.$valid=yr(this.$error),this.$invalid=!this.$valid,i(this,"",this.$valid));var c;c=this.$pending&&this.$pending[t]?void 0:!this.$error[t]&&(!!this.$$success[t]||null),i(this,t,c),this.$$parentForm.$setValidity(t,c,this)}}function yr(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function xr(t){t.$formatters.push(function(e){return t.$isEmpty(e)?e:e.toString()})}function _r(t,e,n,r,i,a){br(t,e,n,r,i,a),xr(r)}function br(t,e,n,r,i,a){var o=qr(e[0].type);if(!i.android){var s=!1;e.on("compositionstart",function(){s=!0}),e.on("compositionend",function(){s=!1,c()})}var u,c=function(t){if(u&&(a.defer.cancel(u),u=null),!s){var i=e.val(),c=t&&t.type;"password"===o||n.ngTrim&&"false"===n.ngTrim||(i=fi(i)),(r.$viewValue!==i||""===i&&r.$$hasNativeValidators)&&r.$setViewValue(i,c)}};if(i.hasEvent("input"))e.on("input",c);else{var l=function(t,e,n){u||(u=a.defer(function(){u=null,e&&e.value===n||c(t)}))};e.on("keydown",function(t){var e=t.keyCode;91===e||15<e&&e<19||37<=e&&e<=40||l(t,this,this.value)}),i.hasEvent("paste")&&e.on("paste cut",l)}e.on("change",c),lo[o]&&r.$$hasNativeValidators&&o===n.type&&e.on(co,function(t){if(!u){var e=this[Ur],n=e.badInput,r=e.typeMismatch;u=a.defer(function(){u=null,e.badInput===n&&e.typeMismatch===r||c(t)})}}),r.$render=function(){var t=r.$isEmpty(r.$viewValue)?"":r.$viewValue;e.val()!==t&&e.val(t)}}function $r(t,e){if(w(t))return t;if(b(t)){oo.lastIndex=0;var n=oo.exec(t);if(n){var r=+n[1],i=+n[2],a=0,o=0,s=0,u=0,c=nr(r),l=7*(i-1);return e&&(a=e.getHours(),o=e.getMinutes(),s=e.getSeconds(),u=e.getMilliseconds()),new Date(r,0,c.getDate()+l,a,o,s,u)}}return NaN}function wr(t,e){return function(n,i){var a,o;if(w(n))return n;if(b(n)){if('"'===n.charAt(0)&&'"'===n.charAt(n.length-1)&&(n=n.substring(1,n.length-1)),to.test(n))return new Date(n);if(t.lastIndex=0,a=t.exec(n))return a.shift(),o=i?{yyyy:i.getFullYear(),MM:i.getMonth()+1,dd:i.getDate(),HH:i.getHours(),mm:i.getMinutes(),ss:i.getSeconds(),sss:i.getMilliseconds()/1e3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(a,function(t,n){
n<e.length&&(o[e[n]]=+t)}),new Date(o.yyyy,o.MM-1,o.dd,o.HH,o.mm,o.ss||0,1e3*o.sss||0)}return NaN}}function Sr(t,e,n,r){return function(i,a,o,s,u,c,l){function f(t){return t&&!(t.getTime&&t.getTime()!==t.getTime())}function h(t){return y(t)&&!w(t)?n(t)||void 0:t}Tr(i,a,o,s),br(i,a,o,s,u,c);var d,p=s&&s.$options.getOption("timezone");if(s.$$parserName=t,s.$parsers.push(function(t){if(s.$isEmpty(t))return null;if(e.test(t)){var r=n(t,d);return p&&(r=Q(r,p)),r}}),s.$formatters.push(function(t){if(t&&!w(t))throw Fo("datefmt","Expected `{0}` to be a date",t);return f(t)?(d=t,d&&p&&(d=Q(d,p,!0)),l("date")(t,r,p)):(d=null,"")}),y(o.min)||o.ngMin){var g;s.$validators.min=function(t){return!f(t)||m(g)||n(t)>=g},o.$observe("min",function(t){g=h(t),s.$validate()})}if(y(o.max)||o.ngMax){var v;s.$validators.max=function(t){return!f(t)||m(v)||n(t)<=v},o.$observe("max",function(t){v=h(t),s.$validate()})}}}function Tr(t,e,n,r){var i=e[0],a=r.$$hasNativeValidators=x(i.validity);a&&r.$parsers.push(function(t){var n=e.prop(Ur)||{};return n.badInput||n.typeMismatch?void 0:t})}function Ar(t){t.$$parserName="number",t.$parsers.push(function(e){return t.$isEmpty(e)?null:ro.test(e)?parseFloat(e):void 0}),t.$formatters.push(function(e){if(!t.$isEmpty(e)){if(!$(e))throw Fo("numfmt","Expected `{0}` to be a number",e);e=e.toString()}return e})}function Cr(t){return y(t)&&!$(t)&&(t=parseFloat(t)),ui(t)?void 0:t}function Er(t){return(0|t)===t}function Mr(t){var e=t.toString(),n=e.indexOf(".");if(n===-1){if(-1<t&&t<1){var r=/e-(\d+)$/.exec(e);if(r)return Number(r[1])}return 0}return e.length-n-1}function kr(t,e,n){var r=Number(t);if(!Er(r)||!Er(e)||!Er(n)){var i=Math.max(Mr(r),Mr(e),Mr(n)),a=Math.pow(10,i);r*=a,e*=a,n*=a}return(r-e)%n===0}function Pr(t,e,n,r,i,a){Tr(t,e,n,r),Ar(r),br(t,e,n,r,i,a);var o,s;if((y(n.min)||n.ngMin)&&(r.$validators.min=function(t){return r.$isEmpty(t)||m(o)||t>=o},n.$observe("min",function(t){o=Cr(t),r.$validate()})),(y(n.max)||n.ngMax)&&(r.$validators.max=function(t){return r.$isEmpty(t)||m(s)||t<=s},n.$observe("max",function(t){s=Cr(t),r.$validate()})),y(n.step)||n.ngStep){var u;r.$validators.step=function(t,e){return r.$isEmpty(e)||m(u)||kr(e,o||0,u)},n.$observe("step",function(t){u=Cr(t),r.$validate()})}}function Or(t,e,n,r,i,a){function o(t,r){e.attr(t,n[t]),n.$observe(t,r)}function s(t){if(f=Cr(t),!ui(r.$modelValue))if(l){var n=e.val();f>n&&(n=f,e.val(n)),r.$setViewValue(n)}else r.$validate()}function u(t){if(h=Cr(t),!ui(r.$modelValue))if(l){var n=e.val();h<n&&(e.val(h),n=h<f?f:h),r.$setViewValue(n)}else r.$validate()}function c(t){d=Cr(t),ui(r.$modelValue)||(l&&r.$viewValue!==e.val()?r.$setViewValue(e.val()):r.$validate())}Tr(t,e,n,r),Ar(r),br(t,e,n,r,i,a);var l=r.$$hasNativeValidators&&"range"===e[0].type,f=l?0:void 0,h=l?100:void 0,d=l?1:void 0,p=e[0].validity,g=y(n.min),v=y(n.max),x=y(n.step),_=r.$render;r.$render=l&&y(p.rangeUnderflow)&&y(p.rangeOverflow)?function(){_(),r.$setViewValue(e.val())}:_,g&&(r.$validators.min=l?function(){return!0}:function(t,e){return r.$isEmpty(e)||m(f)||e>=f},o("min",s)),v&&(r.$validators.max=l?function(){return!0}:function(t,e){return r.$isEmpty(e)||m(h)||e<=h},o("max",u)),x&&(r.$validators.step=l?function(){return!p.stepMismatch}:function(t,e){return r.$isEmpty(e)||m(d)||kr(e,f||0,d)},o("step",c))}function Lr(t,e,n,r,i,a){br(t,e,n,r,i,a),xr(r),r.$$parserName="url",r.$validators.url=function(t,e){var n=t||e;return r.$isEmpty(n)||eo.test(n)}}function Dr(t,e,n,r,i,a){br(t,e,n,r,i,a),xr(r),r.$$parserName="email",r.$validators.email=function(t,e){var n=t||e;return r.$isEmpty(n)||no.test(n)}}function Vr(t,e,n,r){var i=!n.ngTrim||"false"!==fi(n.ngTrim);m(n.name)&&e.attr("name",o());var a=function(t){var a;e[0].checked&&(a=n.value,i&&(a=fi(a)),r.$setViewValue(a,t&&t.type))};e.on("click",a),r.$render=function(){var t=n.value;i&&(t=fi(t)),e[0].checked=t===r.$viewValue},n.$observe("value",r.$render)}function Rr(t,e,n,r,i){var a;if(y(r)){if(a=t(r),!a.constant)throw Fo("constexpr","Expected constant expression for `{0}`, but saw `{1}`.",n,r);return a(e)}return i}function Ir(t,e,n,r,i,a,o,s){var u=Rr(s,t,"ngTrueValue",n.ngTrueValue,!0),c=Rr(s,t,"ngFalseValue",n.ngFalseValue,!1),l=function(t){r.$setViewValue(e[0].checked,t&&t.type)};e.on("click",l),r.$render=function(){e[0].checked=r.$viewValue},r.$isEmpty=function(t){return t===!1},r.$formatters.push(function(t){return G(t,u)}),r.$parsers.push(function(t){return t?u:c})}function Nr(t,e){function n(t,e){if(!t||!t.length)return[];if(!e||!e.length)return t;var n=[];t:for(var r=0;r<t.length;r++){for(var i=t[r],a=0;a<e.length;a++)if(i===e[a])continue t;n.push(i)}return n}function i(t){return t&&t.split(" ")}function a(t){var e=t;return ci(t)?e=t.map(a).join(" "):x(t)&&(e=Object.keys(t).filter(function(e){return t[e]}).join(" ")),e}function o(t){var e=t;if(ci(t))e=t.map(o);else if(x(t)){var n=!1;e=Object.keys(t).filter(function(e){var r=t[e];return!n&&m(r)&&(n=!0),r}),n&&e.push(void 0)}return e}t="ngClass"+t;var s;return["$parse",function(u){return{restrict:"AC",link:function(c,l,f){function h(t){t=g(i(t),1),f.$addClass(t)}function d(t){t=g(i(t),-1),f.$removeClass(t)}function p(t,e){var r=i(t),a=i(e),o=n(r,a),s=n(a,r),u=g(o,-1),c=g(s,1);f.$addClass(c),f.$removeClass(u)}function g(t,e){var n=[];return r(t,function(t){(e>0||T[t])&&(T[t]=(T[t]||0)+e,T[t]===+(e>0)&&n.push(t))}),n.join(" ")}function v(t){t===e?h(x):d(x),A=t}function m(t){var e=a(t);e!==x&&y(e)}function y(t){A===e&&p(x,t),x=t}var x,_=f[t].trim(),b=":"===_.charAt(0)&&":"===_.charAt(1),$=b?o:a,w=u(_,$),S=b?m:y,T=l.data("$classCounts"),A=!0;T||(T=vt(),l.data("$classCounts",T)),"ngClass"!==t&&(s||(s=u("$index",function(t){return 1&t})),c.$watch(s,v)),c.$watch(w,S,b)}}}]}function jr(t,e,n,r,i,a,o,s,u){this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$$rawModelValue=void 0,this.$validators={},this.$asyncValidators={},this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$untouched=!0,this.$touched=!1,this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$error={},this.$$success={},this.$pending=void 0,this.$name=u(n.name||"",!1)(t),this.$$parentForm=Wa,this.$options=Go,this.$$parsedNgModel=i(n.ngModel),this.$$parsedNgModelAssign=this.$$parsedNgModel.assign,this.$$ngModelGet=this.$$parsedNgModel,this.$$ngModelSet=this.$$parsedNgModelAssign,this.$$pendingDebounce=null,this.$$parserValid=void 0,this.$$currentValidationRunId=0,this.$$scope=t,this.$$attr=n,this.$$element=r,this.$$animate=a,this.$$timeout=o,this.$$parse=i,this.$$q=s,this.$$exceptionHandler=e,vr(this),Fr(this)}function Fr(t){t.$$scope.$watch(function(){var e=t.$$ngModelGet(t.$$scope);if(e!==t.$modelValue&&(t.$modelValue===t.$modelValue||e===e)){t.$modelValue=t.$$rawModelValue=e,t.$$parserValid=void 0;for(var n=t.$formatters,r=n.length,i=e;r--;)i=n[r](i);t.$viewValue!==i&&(t.$$updateEmptyClasses(i),t.$viewValue=t.$$lastCommittedViewValue=i,t.$render(),t.$$runValidators(t.$modelValue,t.$viewValue,d))}return e})}function Gr(t){this.$$options=t}function Hr(t,e){r(e,function(e,n){y(t[n])||(t[n]=e)})}var zr=/^\/(.+)\/([a-z]*)$/,Ur="validity",Br=Object.prototype.hasOwnProperty,qr=function(t){return b(t)?t.toLowerCase():t},Yr=function(t){return b(t)?t.toUpperCase():t},Wr=function(t){return b(t)?t.replace(/[A-Z]/g,function(t){return String.fromCharCode(32|t.charCodeAt(0))}):t},Xr=function(t){return b(t)?t.replace(/[a-z]/g,function(t){return String.fromCharCode(t.charCodeAt(0)&-33)}):t};"i"!=="I".toLowerCase()&&(qr=Wr,Yr=Xr);var Qr,Zr,Jr,Kr,ti=[].slice,ei=[].splice,ni=[].push,ri=Object.prototype.toString,ii=Object.getPrototypeOf,ai=e("ng"),oi=t.angular||(t.angular={}),si=0;Qr=t.document.documentMode;var ui=Number.isNaN||function(t){return t!==t};d.$inject=[],p.$inject=[];var ci=Array.isArray,li=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/,fi=function(t){return b(t)?t.trim():t},hi=function(t){return t.replace(/([-()[\]{}+?*.$^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},di=function(){function e(){try{return new Function(""),!1}catch(t){return!0}}if(!y(di.rules)){var n=t.document.querySelector("[ng-csp]")||t.document.querySelector("[data-ng-csp]");if(n){var r=n.getAttribute("ng-csp")||n.getAttribute("data-ng-csp");di.rules={noUnsafeEval:!r||r.indexOf("no-unsafe-eval")!==-1,noInlineStyle:!r||r.indexOf("no-inline-style")!==-1}}else di.rules={noUnsafeEval:e(),noInlineStyle:!1}}return di.rules},pi=function(){if(y(pi.name_))return pi.name_;var e,n,r,i,a=vi.length;for(n=0;n<a;++n)if(r=vi[n],e=t.document.querySelector("["+r.replace(":","\\:")+"jq]")){i=e.getAttribute(r+"jq");break}return pi.name_=i},gi=/:/g,vi=["ng-","data-ng-","ng:","x-ng-"],mi=it(t.document),yi=/[A-Z]/g,xi=!1,_i=1,bi=2,$i=3,wi=8,Si=9,Ti=11,Ai={full:"1.6.1",major:1,minor:6,dot:1,codeName:"promise-rectification"};Dt.expando="ng339";var Ci=Dt.cache={},Ei=1;Dt._data=function(t){return this.cache[t[this.expando]]||{}};var Mi=/-([a-z])/g,ki=/^-ms-/,Pi={mouseleave:"mouseout",mouseenter:"mouseover"},Oi=e("jqLite"),Li=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Di=/<|&#?\w+;/,Vi=/<([\w:-]+)/,Ri=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Ii={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Ii.optgroup=Ii.option,Ii.tbody=Ii.tfoot=Ii.colgroup=Ii.caption=Ii.thead,Ii.th=Ii.td;var Ni=t.Node.prototype.contains||function(t){return!!(16&this.compareDocumentPosition(t))},ji=Dt.prototype={ready:Qt,toString:function(){var t=[];return r(this,function(e){t.push(""+e)}),"["+t.join(", ")+"]"},eq:function(t){return Zr(t>=0?this[t]:this[this.length+t])},length:0,push:ni,sort:[].sort,splice:[].splice},Fi={};r("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(t){Fi[qr(t)]=t});var Gi={};r("input,select,option,textarea,button,form,details".split(","),function(t){Gi[t]=!0});var Hi={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};r({data:Ft,removeData:Nt,hasData:Mt,cleanData:kt},function(t,e){Dt[e]=t}),r({data:Ft,inheritedData:qt,scope:function(t){return Zr.data(t,"$scope")||qt(t.parentNode||t,["$isolateScope","$scope"])},isolateScope:function(t){return Zr.data(t,"$isolateScope")||Zr.data(t,"$isolateScopeNoTemplate")},controller:Bt,injector:function(t){return qt(t,"$injector")},removeAttr:function(t,e){t.removeAttribute(e)},hasClass:Gt,css:function(t,e,n){return e=St(e),y(n)?void(t.style[e]=n):t.style[e]},attr:function(t,e,n){var r,i=t.nodeType;if(i!==$i&&i!==bi&&i!==wi&&t.getAttribute){var a=qr(e),o=Fi[a];return y(n)?void(null===n||n===!1&&o?t.removeAttribute(e):t.setAttribute(e,o?a:n)):(r=t.getAttribute(e),o&&null!==r&&(r=a),null===r?void 0:r)}},prop:function(t,e,n){return y(n)?void(t[e]=n):t[e]},text:function(){function t(t,e){if(m(e)){var n=t.nodeType;return n===_i||n===$i?t.textContent:""}t.textContent=e}return t.$dv="",t}(),val:function(t,e){if(m(e)){if(t.multiple&&"select"===I(t)){var n=[];return r(t.options,function(t){t.selected&&n.push(t.value||t.text)}),n}return t.value}t.value=e},html:function(t,e){return m(e)?t.innerHTML:(Rt(t,!0),void(t.innerHTML=e))},empty:Yt},function(t,e){Dt.prototype[e]=function(e,n){var r,i,a=this.length;if(t!==Yt&&m(2===t.length&&t!==Gt&&t!==Bt?e:n)){if(x(e)){for(r=0;r<a;r++)if(t===Ft)t(this[r],e);else for(i in e)t(this[r],i,e[i]);return this}for(var o=t.$dv,s=m(o)?Math.min(a,1):a,u=0;u<s;u++){var c=t(this[u],e,n);o=o?o+c:c}return o}for(r=0;r<a;r++)t(this[r],e,n);return this}}),r({removeData:Nt,on:function(t,e,n,r){if(y(r))throw Oi("onargs","jqLite#on() does not support the `selector` or `eventData` parameters");if(Et(t)){var i=jt(t,!0),a=i.events,o=i.handle;o||(o=i.handle=Kt(t,a));for(var s=e.indexOf(" ")>=0?e.split(" "):[e],u=s.length,c=function(e,r,i){var s=a[e];s||(s=a[e]=[],s.specialHandlerWrapper=r,"$destroy"===e||i||t.addEventListener(e,o)),s.push(n)};u--;)e=s[u],Pi[e]?(c(Pi[e],ee),c(e,void 0,!0)):c(e)}},off:It,one:function(t,e,n){t=Zr(t),t.on(e,function r(){t.off(e,n),t.off(e,r)}),t.on(e,n)},replaceWith:function(t,e){var n,i=t.parentNode;Rt(t),r(new Dt(e),function(e){n?i.insertBefore(e,n.nextSibling):i.replaceChild(e,t),n=e})},children:function(t){var e=[];return r(t.childNodes,function(t){t.nodeType===_i&&e.push(t)}),e},contents:function(t){return t.contentDocument||t.childNodes||[]},append:function(t,e){var n=t.nodeType;if(n===_i||n===Ti){e=new Dt(e);for(var r=0,i=e.length;r<i;r++){var a=e[r];t.appendChild(a)}}},prepend:function(t,e){if(t.nodeType===_i){var n=t.firstChild;r(new Dt(e),function(e){t.insertBefore(e,n)})}},wrap:function(t,e){Lt(t,Zr(e).eq(0).clone()[0])},remove:Wt,detach:function(t){Wt(t,!0)},after:function(t,e){var n=t,r=t.parentNode;if(r){e=new Dt(e);for(var i=0,a=e.length;i<a;i++){var o=e[i];r.insertBefore(o,n.nextSibling),n=o}}},addClass:zt,removeClass:Ht,toggleClass:function(t,e,n){e&&r(e.split(" "),function(e){var r=n;m(r)&&(r=!Gt(t,e)),(r?zt:Ht)(t,e)})},parent:function(t){var e=t.parentNode;return e&&e.nodeType!==Ti?e:null},next:function(t){return t.nextElementSibling},find:function(t,e){return t.getElementsByTagName?t.getElementsByTagName(e):[]},clone:Vt,triggerHandler:function(t,e,n){var i,a,o,s=e.type||e,u=jt(t),l=u&&u.events,f=l&&l[s];f&&(i={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return this.defaultPrevented===!0},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return this.immediatePropagationStopped===!0},stopPropagation:d,type:s,target:t},e.type&&(i=c(i,e)),a=xt(f),o=n?[i].concat(n):[i],r(a,function(e){i.isImmediatePropagationStopped()||e.apply(t,o)}))}},function(t,e){Dt.prototype[e]=function(e,n,r){for(var i,a=0,o=this.length;a<o;a++)m(i)?(i=t(this[a],e,n,r),y(i)&&(i=Zr(i))):Ut(i,t(this[a],e,n,r));return y(i)?i:this}}),Dt.prototype.bind=Dt.prototype.on,Dt.prototype.unbind=Dt.prototype.off,ie.prototype={put:function(t,e){this[re(t,this.nextUid)]=e},get:function(t){return this[re(t,this.nextUid)]},remove:function(t){var e=this[t=re(t,this.nextUid)];return delete this[t],e}};var zi=[function(){this.$get=[function(){return ie}]}],Ui=/^([^(]+?)=>/,Bi=/^[^(]*\(\s*([^)]*)\)/m,qi=/,/,Yi=/^\s*(_?)(\S+?)\1\s*$/,Wi=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Xi=e("$injector");ce.$$annotate=ue;var Qi=e("$animate"),Zi=1,Ji="ng-animate",Ki=function(){this.$get=d},ta=function(){var t=new ie,e=[];this.$get=["$$AnimateRunner","$rootScope",function(n,i){function a(t,e,n){var i=!1;return e&&(e=b(e)?e.split(" "):ci(e)?e:[],r(e,function(e){e&&(i=!0,t[e]=n)})),i}function o(){r(e,function(e){var n=t.get(e);if(n){var i=de(e.attr("class")),a="",o="";r(n,function(t,e){var n=!!i[e];t!==n&&(t?a+=(a.length?" ":"")+e:o+=(o.length?" ":"")+e)}),r(e,function(t){a&&zt(t,a),o&&Ht(t,o)}),t.remove(e)}}),e.length=0}function s(n,r,s){var u=t.get(n)||{},c=a(u,r,!0),l=a(u,s,!1);(c||l)&&(t.put(n,u),e.push(n),1===e.length&&i.$$postDigest(o))}return{enabled:d,on:d,off:d,pin:d,push:function(t,e,r,i){i&&i(),r=r||{},r.from&&t.css(r.from),r.to&&t.css(r.to),(r.addClass||r.removeClass)&&s(t,r.addClass,r.removeClass);var a=new n;return a.complete(),a}}}]},ea=["$provide",function(t){var e=this;this.$$registeredAnimations=Object.create(null),this.register=function(n,r){if(n&&"."!==n.charAt(0))throw Qi("notcsel","Expecting class selector starting with '.' got '{0}'.",n);var i=n+"-animation";e.$$registeredAnimations[n.substr(1)]=i,t.factory(i,r)},this.classNameFilter=function(t){if(1===arguments.length&&(this.$$classNameFilter=t instanceof RegExp?t:null,this.$$classNameFilter)){var e=new RegExp("(\\s+|\\/)"+Ji+"(\\s+|\\/)");if(e.test(this.$$classNameFilter.toString()))throw Qi("nongcls",'$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.',Ji)}return this.$$classNameFilter},this.$get=["$$animateQueue",function(t){function e(t,e,n){if(n){var r=he(n);!r||r.parentNode||r.previousElementSibling||(n=null)}n?n.after(t):e.prepend(t)}return{on:t.on,off:t.off,pin:t.pin,enabled:t.enabled,cancel:function(t){t.end&&t.end()},enter:function(n,r,i,a){return r=r&&Zr(r),i=i&&Zr(i),r=r||i.parent(),e(n,r,i),t.push(n,"enter",pe(a))},move:function(n,r,i,a){return r=r&&Zr(r),i=i&&Zr(i),r=r||i.parent(),e(n,r,i),t.push(n,"move",pe(a))},leave:function(e,n){return t.push(e,"leave",pe(n),function(){e.remove()})},addClass:function(e,n,r){return r=pe(r),r.addClass=fe(r.addclass,n),t.push(e,"addClass",r)},removeClass:function(e,n,r){return r=pe(r),r.removeClass=fe(r.removeClass,n),t.push(e,"removeClass",r)},setClass:function(e,n,r,i){return i=pe(i),i.addClass=fe(i.addClass,n),i.removeClass=fe(i.removeClass,r),t.push(e,"setClass",i)},animate:function(e,n,r,i,a){return a=pe(a),a.from=a.from?c(a.from,n):n,a.to=a.to?c(a.to,r):r,i=i||"ng-inline-animate",a.tempClasses=fe(a.tempClasses,i),t.push(e,"animate",a)}}}]}],na=function(){this.$get=["$$rAF",function(t){function e(e){n.push(e),n.length>1||t(function(){for(var t=0;t<n.length;t++)n[t]();n=[]})}var n=[];return function(){var t=!1;return e(function(){t=!0}),function(n){t?n():e(n)}}}]},ra=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$$isDocumentHidden","$timeout",function(t,e,n,i,a){function o(t){this.setHost(t);var e=n(),r=function(t){a(t,0,!1)};this._doneCallbacks=[],this._tick=function(t){i()?r(t):e(t)},this._state=0}var s=0,u=1,c=2;return o.chain=function(t,e){function n(){return r===t.length?void e(!0):void t[r](function(t){return t===!1?void e(!1):(r++,void n())})}var r=0;n()},o.all=function(t,e){function n(n){a=a&&n,++i===t.length&&e(a)}var i=0,a=!0;r(t,function(t){t.done(n)})},o.prototype={setHost:function(t){this.host=t||{}},done:function(t){this._state===c?t():this._doneCallbacks.push(t)},progress:d,getPromise:function(){if(!this.promise){var e=this;this.promise=t(function(t,n){e.done(function(e){e===!1?n():t()})})}return this.promise},then:function(t,e){return this.getPromise().then(t,e)},catch:function(t){return this.getPromise().catch(t)},finally:function(t){return this.getPromise().finally(t)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end(),this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel(),this._resolve(!1)},complete:function(t){var e=this;e._state===s&&(e._state=u,e._tick(function(){e._resolve(t)}))},_resolve:function(t){this._state!==c&&(r(this._doneCallbacks,function(e){e(t)}),this._doneCallbacks.length=0,this._state=c)}},o}]},ia=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(t,e,n){return function(e,r){function i(){return t(function(){a(),s||u.complete(),s=!0}),u}function a(){o.addClass&&(e.addClass(o.addClass),o.addClass=null),o.removeClass&&(e.removeClass(o.removeClass),o.removeClass=null),o.to&&(e.css(o.to),o.to=null)}var o=r||{};o.$$prepared||(o=F(o)),o.cleanupStyles&&(o.from=o.to=null),o.from&&(e.css(o.from),o.from=null);var s,u=new n;return{start:i,end:i}}}]},aa=e("$compile"),oa=new xe;_e.$inject=["$provide","$$sanitizeUriProvider"],be.prototype.isFirstChange=function(){return this.previousValue===oa};var sa=/^((?:x|data)[:\-_])/i,ua=/[:\-_]+(.)/g,ca=e("$controller"),la=/^(\S+)(\s+as\s+([\w$]+))?$/,fa=function(){this.$get=["$document",function(t){return function(e){return e?!e.nodeType&&e instanceof Zr&&(e=e[0]):e=t[0].body,e.offsetWidth+1}}]},ha="application/json",da={"Content-Type":ha+";charset=utf-8"},pa=/^\[|^\{(?!\{)/,ga={"[":/]$/,"{":/}$/},va=/^\)]\}',?\n/,ma=e("$http"),ya=oi.$interpolateMinErr=e("$interpolate");ya.throwNoconcat=function(t){throw ya("noconcat","Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce",t)},ya.interr=function(t,e){return ya("interr","Can't interpolate: {0}\n{1}",t,e.toString())};var xa=function(){this.$get=["$window",function(t){function e(t){var e=function(t){e.data=t,e.called=!0};return e.id=t,e}var n=t.angular.callbacks,r={};return{createCallback:function(t){var i="_"+(n.$$counter++).toString(36),a="angular.callbacks."+i,o=e(i);return r[a]=n[i]=o,a},wasCalled:function(t){return r[t].called},getResponse:function(t){return r[t].data},removeCallback:function(t){var e=r[t];delete n[e.id],delete r[t]}}}]},_a=/^([^?#]*)(\?([^#]*))?(#(.*))?$/,ba={http:80,https:443,ftp:21},$a=e("$location"),wa=/^\s*[\\/]{2,}/,Sa={$$absUrl:"",$$html5:!1,$$replace:!1,absUrl:rn("$$absUrl"),url:function(t){if(m(t))return this.$$url;var e=_a.exec(t);return(e[1]||""===t)&&this.path(decodeURIComponent(e[1])),(e[2]||e[1]||""===t)&&this.search(e[3]||""),this.hash(e[5]||""),this},protocol:rn("$$protocol"),host:rn("$$host"),port:rn("$$port"),path:an("$$path",function(t){return t=null!==t?t.toString():"","/"===t.charAt(0)?t:"/"+t}),search:function(t,e){switch(arguments.length){case 0:return this.$$search;case 1:if(b(t)||$(t))t=t.toString(),this.$$search=K(t);else{if(!x(t))throw $a("isrcharg","The first argument of the `$location#search()` call must be a string or an object.");t=F(t,{}),r(t,function(e,n){null==e&&delete t[n]}),this.$$search=t}break;default:m(e)||null===e?delete this.$$search[t]:this.$$search[t]=e}return this.$$compose(),this},hash:an("$$hash",function(t){return null!==t?t.toString():""}),replace:function(){return this.$$replace=!0,this}};r([nn,en,tn],function(t){t.prototype=Object.create(Sa),t.prototype.state=function(e){if(!arguments.length)return this.$$state;if(t!==tn||!this.$$html5)throw $a("nostate","History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API");return this.$$state=m(e)?null:e,this}});var Ta=e("$parse"),Aa={}.constructor.prototype.valueOf,Ca=vt();r("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(t){Ca[t]=!0});var Ea={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Ma=function(t){this.options=t};Ma.prototype={constructor:Ma,lex:function(t){for(this.text=t,this.index=0,this.tokens=[];this.index<this.text.length;){var e=this.text.charAt(this.index);if('"'===e||"'"===e)this.readString(e);else if(this.isNumber(e)||"."===e&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(e,"(){}[].,;:?"))this.tokens.push({index:this.index,text:e}),this.index++;else if(this.isWhitespace(e))this.index++;else{var n=e+this.peek(),r=n+this.peek(2),i=Ca[e],a=Ca[n],o=Ca[r];if(i||a||o){var s=o?r:a?n:e;this.tokens.push({index:this.index,text:s,operator:!0}),this.index+=s.length}else this.throwError("Unexpected next character ",this.index,this.index+1)}}return this.tokens},is:function(t,e){return e.indexOf(t)!==-1},peek:function(t){var e=t||1;return this.index+e<this.text.length&&this.text.charAt(this.index+e)},isNumber:function(t){return"0"<=t&&t<="9"&&"string"==typeof t},isWhitespace:function(t){return" "===t||"\r"===t||"\t"===t||"\n"===t||"\v"===t||" "===t},isIdentifierStart:function(t){return this.options.isIdentifierStart?this.options.isIdentifierStart(t,this.codePointAt(t)):this.isValidIdentifierStart(t)},isValidIdentifierStart:function(t){return"a"<=t&&t<="z"||"A"<=t&&t<="Z"||"_"===t||"$"===t},isIdentifierContinue:function(t){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(t,this.codePointAt(t)):this.isValidIdentifierContinue(t)},isValidIdentifierContinue:function(t,e){return this.isValidIdentifierStart(t,e)||this.isNumber(t)},codePointAt:function(t){return 1===t.length?t.charCodeAt(0):(t.charCodeAt(0)<<10)+t.charCodeAt(1)-56613888},peekMultichar:function(){var t=this.text.charAt(this.index),e=this.peek();if(!e)return t;var n=t.charCodeAt(0),r=e.charCodeAt(0);return n>=55296&&n<=56319&&r>=56320&&r<=57343?t+e:t},isExpOperator:function(t){return"-"===t||"+"===t||this.isNumber(t)},throwError:function(t,e,n){n=n||this.index;var r=y(e)?"s "+e+"-"+this.index+" ["+this.text.substring(e,n)+"]":" "+n;throw Ta("lexerr","Lexer Error: {0} at column{1} in expression [{2}].",t,r,this.text)},readNumber:function(){for(var t="",e=this.index;this.index<this.text.length;){var n=qr(this.text.charAt(this.index));if("."===n||this.isNumber(n))t+=n;else{var r=this.peek();if("e"===n&&this.isExpOperator(r))t+=n;else if(this.isExpOperator(n)&&r&&this.isNumber(r)&&"e"===t.charAt(t.length-1))t+=n;else{if(!this.isExpOperator(n)||r&&this.isNumber(r)||"e"!==t.charAt(t.length-1))break;this.throwError("Invalid exponent")}}this.index++}this.tokens.push({index:e,text:t,constant:!0,value:Number(t)})},readIdent:function(){var t=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var e=this.peekMultichar();if(!this.isIdentifierContinue(e))break;this.index+=e.length}this.tokens.push({index:t,text:this.text.slice(t,this.index),identifier:!0})},readString:function(t){var e=this.index;this.index++;for(var n="",r=t,i=!1;this.index<this.text.length;){var a=this.text.charAt(this.index);if(r+=a,i){if("u"===a){var o=this.text.substring(this.index+1,this.index+5);o.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+o+"]"),this.index+=4,n+=String.fromCharCode(parseInt(o,16))}else{var s=Ea[a];n+=s||a}i=!1}else if("\\"===a)i=!0;else{if(a===t)return this.index++,void this.tokens.push({index:e,text:r,constant:!0,value:n});n+=a}this.index++}this.throwError("Unterminated quote",e)}};var ka=function(t,e){this.lexer=t,this.options=e};ka.Program="Program",ka.ExpressionStatement="ExpressionStatement",ka.AssignmentExpression="AssignmentExpression",ka.ConditionalExpression="ConditionalExpression",ka.LogicalExpression="LogicalExpression",ka.BinaryExpression="BinaryExpression",ka.UnaryExpression="UnaryExpression",ka.CallExpression="CallExpression",ka.MemberExpression="MemberExpression",ka.Identifier="Identifier",ka.Literal="Literal",ka.ArrayExpression="ArrayExpression",ka.Property="Property",ka.ObjectExpression="ObjectExpression",ka.ThisExpression="ThisExpression",ka.LocalsExpression="LocalsExpression",ka.NGValueParameter="NGValueParameter",ka.prototype={ast:function(t){this.text=t,this.tokens=this.lexer.lex(t);var e=this.program();return 0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]),e},program:function(){for(var t=[];;)if(this.tokens.length>0&&!this.peek("}",")",";","]")&&t.push(this.expressionStatement()),!this.expect(";"))return{type:ka.Program,body:t}},expressionStatement:function(){return{type:ka.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var t=this.expression();this.expect("|");)t=this.filter(t);return t},expression:function(){return this.assignment()},assignment:function(){var t=this.ternary();if(this.expect("=")){if(!pn(t))throw Ta("lval","Trying to assign a value to a non l-value");t={type:ka.AssignmentExpression,left:t,right:this.assignment(),operator:"="}}return t},ternary:function(){var t,e,n=this.logicalOR();return this.expect("?")&&(t=this.expression(),this.consume(":"))?(e=this.expression(),{type:ka.ConditionalExpression,test:n,alternate:t,consequent:e}):n},logicalOR:function(){for(var t=this.logicalAND();this.expect("||");)t={type:ka.LogicalExpression,operator:"||",left:t,right:this.logicalAND()};return t},logicalAND:function(){for(var t=this.equality();this.expect("&&");)t={type:ka.LogicalExpression,operator:"&&",left:t,right:this.equality()};return t},equality:function(){for(var t,e=this.relational();t=this.expect("==","!=","===","!==");)e={type:ka.BinaryExpression,operator:t.text,left:e,right:this.relational()};return e},relational:function(){for(var t,e=this.additive();t=this.expect("<",">","<=",">=");)e={type:ka.BinaryExpression,operator:t.text,left:e,right:this.additive()};return e},additive:function(){for(var t,e=this.multiplicative();t=this.expect("+","-");)e={type:ka.BinaryExpression,operator:t.text,left:e,right:this.multiplicative()};return e},multiplicative:function(){for(var t,e=this.unary();t=this.expect("*","/","%");)e={type:ka.BinaryExpression,operator:t.text,left:e,right:this.unary()};return e},unary:function(){var t;return(t=this.expect("+","-","!"))?{type:ka.UnaryExpression,operator:t.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var t;this.expect("(")?(t=this.filterChain(),this.consume(")")):this.expect("[")?t=this.arrayDeclaration():this.expect("{")?t=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?t=F(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?t={type:ka.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?t=this.identifier():this.peek().constant?t=this.constant():this.throwError("not a primary expression",this.peek());for(var e;e=this.expect("(","[",".");)"("===e.text?(t={type:ka.CallExpression,callee:t,arguments:this.parseArguments()},this.consume(")")):"["===e.text?(t={type:ka.MemberExpression,object:t,property:this.expression(),computed:!0},this.consume("]")):"."===e.text?t={type:ka.MemberExpression,object:t,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return t},filter:function(t){for(var e=[t],n={type:ka.CallExpression,callee:this.identifier(),arguments:e,filter:!0};this.expect(":");)e.push(this.expression());return n},parseArguments:function(){var t=[];if(")"!==this.peekToken().text)do t.push(this.filterChain());while(this.expect(","));return t},identifier:function(){var t=this.consume();return t.identifier||this.throwError("is not a valid identifier",t),{type:ka.Identifier,name:t.text}},constant:function(){return{type:ka.Literal,value:this.consume().value}},arrayDeclaration:function(){var t=[];if("]"!==this.peekToken().text)do{if(this.peek("]"))break;t.push(this.expression())}while(this.expect(","));return this.consume("]"),{type:ka.ArrayExpression,elements:t}},object:function(){var t,e=[];if("}"!==this.peekToken().text)do{if(this.peek("}"))break;t={type:ka.Property,kind:"init"},this.peek().constant?(t.key=this.constant(),t.computed=!1,this.consume(":"),t.value=this.expression()):this.peek().identifier?(t.key=this.identifier(),t.computed=!1,this.peek(":")?(this.consume(":"),t.value=this.expression()):t.value=t.key):this.peek("[")?(this.consume("["),t.key=this.expression(),this.consume("]"),t.computed=!0,this.consume(":"),t.value=this.expression()):this.throwError("invalid key",this.peek()),e.push(t)}while(this.expect(","));return this.consume("}"),{type:ka.ObjectExpression,properties:e}},throwError:function(t,e){throw Ta("syntax","Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].",e.text,t,e.index+1,this.text,this.text.substring(e.index))},consume:function(t){if(0===this.tokens.length)throw Ta("ueoe","Unexpected end of expression: {0}",this.text);var e=this.expect(t);return e||this.throwError("is unexpected, expecting ["+t+"]",this.peek()),e},peekToken:function(){if(0===this.tokens.length)throw Ta("ueoe","Unexpected end of expression: {0}",this.text);return this.tokens[0]},peek:function(t,e,n,r){return this.peekAhead(0,t,e,n,r)},peekAhead:function(t,e,n,r,i){if(this.tokens.length>t){var a=this.tokens[t],o=a.text;if(o===e||o===n||o===r||o===i||!e&&!n&&!r&&!i)return a}return!1},expect:function(t,e,n,r){var i=this.peek(t,e,n,r);return!!i&&(this.tokens.shift(),i)},selfReferential:{this:{type:ka.ThisExpression},$locals:{type:ka.LocalsExpression}}},yn.prototype={compile:function(t){var e=this,n=this.astBuilder.ast(t);this.state={nextId:0,filters:{},fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]},hn(n,e.$filter);var i,a="";if(this.stage="assign",i=gn(n)){this.state.computing="assign";var o=this.nextId();this.recurse(i,o),this.return_(o),a="fn.assign="+this.generateFunction("assign","s,v,l")}var s=dn(n.body);e.stage="inputs",r(s,function(t,n){var r="fn"+n;e.state[r]={vars:[],body:[],own:{}},e.state.computing=r;var i=e.nextId();e.recurse(t,i),e.return_(i),e.state.inputs.push(r),
t.watchId=n}),this.state.computing="fn",this.stage="main",this.recurse(n);var u='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+a+this.watchFns()+"return fn;",c=new Function("$filter","getStringValue","ifDefined","plus",u)(this.$filter,un,cn,ln);return this.state=this.stage=void 0,c.literal=vn(n),c.constant=mn(n),c},USE:"use",STRICT:"strict",watchFns:function(){var t=[],e=this.state.inputs,n=this;return r(e,function(e){t.push("var "+e+"="+n.generateFunction(e,"s"))}),e.length&&t.push("fn.inputs=["+e.join(",")+"];"),t.join("")},generateFunction:function(t,e){return"function("+e+"){"+this.varsPrefix(t)+this.body(t)+"};"},filterPrefix:function(){var t=[],e=this;return r(this.state.filters,function(n,r){t.push(n+"=$filter("+e.escape(r)+")")}),t.length?"var "+t.join(",")+";":""},varsPrefix:function(t){return this.state[t].vars.length?"var "+this.state[t].vars.join(",")+";":""},body:function(t){return this.state[t].body.join("")},recurse:function(t,e,n,i,a,o){var s,u,c,l,f,h=this;if(i=i||d,!o&&y(t.watchId))return e=e||this.nextId(),void this.if_("i",this.lazyAssign(e,this.computedMember("i",t.watchId)),this.lazyRecurse(t,e,n,i,a,!0));switch(t.type){case ka.Program:r(t.body,function(e,n){h.recurse(e.expression,void 0,void 0,function(t){u=t}),n!==t.body.length-1?h.current().body.push(u,";"):h.return_(u)});break;case ka.Literal:l=this.escape(t.value),this.assign(e,l),i(e||l);break;case ka.UnaryExpression:this.recurse(t.argument,void 0,void 0,function(t){u=t}),l=t.operator+"("+this.ifDefined(u,0)+")",this.assign(e,l),i(l);break;case ka.BinaryExpression:this.recurse(t.left,void 0,void 0,function(t){s=t}),this.recurse(t.right,void 0,void 0,function(t){u=t}),l="+"===t.operator?this.plus(s,u):"-"===t.operator?this.ifDefined(s,0)+t.operator+this.ifDefined(u,0):"("+s+")"+t.operator+"("+u+")",this.assign(e,l),i(l);break;case ka.LogicalExpression:e=e||this.nextId(),h.recurse(t.left,e),h.if_("&&"===t.operator?e:h.not(e),h.lazyRecurse(t.right,e)),i(e);break;case ka.ConditionalExpression:e=e||this.nextId(),h.recurse(t.test,e),h.if_(e,h.lazyRecurse(t.alternate,e),h.lazyRecurse(t.consequent,e)),i(e);break;case ka.Identifier:e=e||this.nextId(),n&&(n.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",t.name)+"?l:s"),n.computed=!1,n.name=t.name),h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",t.name)),function(){h.if_("inputs"===h.stage||"s",function(){a&&1!==a&&h.if_(h.isNull(h.nonComputedMember("s",t.name)),h.lazyAssign(h.nonComputedMember("s",t.name),"{}")),h.assign(e,h.nonComputedMember("s",t.name))})},e&&h.lazyAssign(e,h.nonComputedMember("l",t.name))),i(e);break;case ka.MemberExpression:s=n&&(n.context=this.nextId())||this.nextId(),e=e||this.nextId(),h.recurse(t.object,s,void 0,function(){h.if_(h.notNull(s),function(){t.computed?(u=h.nextId(),h.recurse(t.property,u),h.getStringValue(u),a&&1!==a&&h.if_(h.not(h.computedMember(s,u)),h.lazyAssign(h.computedMember(s,u),"{}")),l=h.computedMember(s,u),h.assign(e,l),n&&(n.computed=!0,n.name=u)):(a&&1!==a&&h.if_(h.isNull(h.nonComputedMember(s,t.property.name)),h.lazyAssign(h.nonComputedMember(s,t.property.name),"{}")),l=h.nonComputedMember(s,t.property.name),h.assign(e,l),n&&(n.computed=!1,n.name=t.property.name))},function(){h.assign(e,"undefined")}),i(e)},!!a);break;case ka.CallExpression:e=e||this.nextId(),t.filter?(u=h.filter(t.callee.name),c=[],r(t.arguments,function(t){var e=h.nextId();h.recurse(t,e),c.push(e)}),l=u+"("+c.join(",")+")",h.assign(e,l),i(e)):(u=h.nextId(),s={},c=[],h.recurse(t.callee,u,s,function(){h.if_(h.notNull(u),function(){r(t.arguments,function(e){h.recurse(e,t.constant?void 0:h.nextId(),void 0,function(t){c.push(t)})}),l=s.name?h.member(s.context,s.name,s.computed)+"("+c.join(",")+")":u+"("+c.join(",")+")",h.assign(e,l)},function(){h.assign(e,"undefined")}),i(e)}));break;case ka.AssignmentExpression:u=this.nextId(),s={},this.recurse(t.left,void 0,s,function(){h.if_(h.notNull(s.context),function(){h.recurse(t.right,u),l=h.member(s.context,s.name,s.computed)+t.operator+u,h.assign(e,l),i(e||l)})},1);break;case ka.ArrayExpression:c=[],r(t.elements,function(e){h.recurse(e,t.constant?void 0:h.nextId(),void 0,function(t){c.push(t)})}),l="["+c.join(",")+"]",this.assign(e,l),i(e||l);break;case ka.ObjectExpression:c=[],f=!1,r(t.properties,function(t){t.computed&&(f=!0)}),f?(e=e||this.nextId(),this.assign(e,"{}"),r(t.properties,function(t){t.computed?(s=h.nextId(),h.recurse(t.key,s)):s=t.key.type===ka.Identifier?t.key.name:""+t.key.value,u=h.nextId(),h.recurse(t.value,u),h.assign(h.member(e,s,t.computed),u)})):(r(t.properties,function(e){h.recurse(e.value,t.constant?void 0:h.nextId(),void 0,function(t){c.push(h.escape(e.key.type===ka.Identifier?e.key.name:""+e.key.value)+":"+t)})}),l="{"+c.join(",")+"}",this.assign(e,l)),i(e||l);break;case ka.ThisExpression:this.assign(e,"s"),i(e||"s");break;case ka.LocalsExpression:this.assign(e,"l"),i(e||"l");break;case ka.NGValueParameter:this.assign(e,"v"),i(e||"v")}},getHasOwnProperty:function(t,e){var n=t+"."+e,r=this.current().own;return r.hasOwnProperty(n)||(r[n]=this.nextId(!1,t+"&&("+this.escape(e)+" in "+t+")")),r[n]},assign:function(t,e){if(t)return this.current().body.push(t,"=",e,";"),t},filter:function(t){return this.state.filters.hasOwnProperty(t)||(this.state.filters[t]=this.nextId(!0)),this.state.filters[t]},ifDefined:function(t,e){return"ifDefined("+t+","+this.escape(e)+")"},plus:function(t,e){return"plus("+t+","+e+")"},return_:function(t){this.current().body.push("return ",t,";")},if_:function(t,e,n){if(t===!0)e();else{var r=this.current().body;r.push("if(",t,"){"),e(),r.push("}"),n&&(r.push("else{"),n(),r.push("}"))}},not:function(t){return"!("+t+")"},isNull:function(t){return t+"==null"},notNull:function(t){return t+"!=null"},nonComputedMember:function(t,e){var n=/^[$_a-zA-Z][$_a-zA-Z0-9]*$/,r=/[^$_a-zA-Z0-9]/g;return n.test(e)?t+"."+e:t+'["'+e.replace(r,this.stringEscapeFn)+'"]'},computedMember:function(t,e){return t+"["+e+"]"},member:function(t,e,n){return n?this.computedMember(t,e):this.nonComputedMember(t,e)},getStringValue:function(t){this.assign(t,"getStringValue("+t+")")},lazyRecurse:function(t,e,n,r,i,a){var o=this;return function(){o.recurse(t,e,n,r,i,a)}},lazyAssign:function(t,e){var n=this;return function(){n.assign(t,e)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)},escape:function(t){if(b(t))return"'"+t.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if($(t))return t.toString();if(t===!0)return"true";if(t===!1)return"false";if(null===t)return"null";if("undefined"==typeof t)return"undefined";throw Ta("esc","IMPOSSIBLE")},nextId:function(t,e){var n="v"+this.state.nextId++;return t||this.current().vars.push(n+(e?"="+e:"")),n},current:function(){return this.state[this.state.computing]}},xn.prototype={compile:function(t){var e=this,n=this.astBuilder.ast(t);hn(n,e.$filter);var i,a;(i=gn(n))&&(a=this.recurse(i));var o,s=dn(n.body);s&&(o=[],r(s,function(t,n){var r=e.recurse(t);t.input=r,o.push(r),t.watchId=n}));var u=[];r(n.body,function(t){u.push(e.recurse(t.expression))});var c=0===n.body.length?d:1===n.body.length?u[0]:function(t,e){var n;return r(u,function(r){n=r(t,e)}),n};return a&&(c.assign=function(t,e,n){return a(t,n,e)}),o&&(c.inputs=o),c.literal=vn(n),c.constant=mn(n),c},recurse:function(t,e,n){var i,a,o,s=this;if(t.input)return this.inputs(t.input,t.watchId);switch(t.type){case ka.Literal:return this.value(t.value,e);case ka.UnaryExpression:return a=this.recurse(t.argument),this["unary"+t.operator](a,e);case ka.BinaryExpression:return i=this.recurse(t.left),a=this.recurse(t.right),this["binary"+t.operator](i,a,e);case ka.LogicalExpression:return i=this.recurse(t.left),a=this.recurse(t.right),this["binary"+t.operator](i,a,e);case ka.ConditionalExpression:return this["ternary?:"](this.recurse(t.test),this.recurse(t.alternate),this.recurse(t.consequent),e);case ka.Identifier:return s.identifier(t.name,e,n);case ka.MemberExpression:return i=this.recurse(t.object,!1,!!n),t.computed||(a=t.property.name),t.computed&&(a=this.recurse(t.property)),t.computed?this.computedMember(i,a,e,n):this.nonComputedMember(i,a,e,n);case ka.CallExpression:return o=[],r(t.arguments,function(t){o.push(s.recurse(t))}),t.filter&&(a=this.$filter(t.callee.name)),t.filter||(a=this.recurse(t.callee,!0)),t.filter?function(t,n,r,i){for(var s=[],u=0;u<o.length;++u)s.push(o[u](t,n,r,i));var c=a.apply(void 0,s,i);return e?{context:void 0,name:void 0,value:c}:c}:function(t,n,r,i){var s,u=a(t,n,r,i);if(null!=u.value){for(var c=[],l=0;l<o.length;++l)c.push(o[l](t,n,r,i));s=u.value.apply(u.context,c)}return e?{value:s}:s};case ka.AssignmentExpression:return i=this.recurse(t.left,!0,1),a=this.recurse(t.right),function(t,n,r,o){var s=i(t,n,r,o),u=a(t,n,r,o);return s.context[s.name]=u,e?{value:u}:u};case ka.ArrayExpression:return o=[],r(t.elements,function(t){o.push(s.recurse(t))}),function(t,n,r,i){for(var a=[],s=0;s<o.length;++s)a.push(o[s](t,n,r,i));return e?{value:a}:a};case ka.ObjectExpression:return o=[],r(t.properties,function(t){t.computed?o.push({key:s.recurse(t.key),computed:!0,value:s.recurse(t.value)}):o.push({key:t.key.type===ka.Identifier?t.key.name:""+t.key.value,computed:!1,value:s.recurse(t.value)})}),function(t,n,r,i){for(var a={},s=0;s<o.length;++s)o[s].computed?a[o[s].key(t,n,r,i)]=o[s].value(t,n,r,i):a[o[s].key]=o[s].value(t,n,r,i);return e?{value:a}:a};case ka.ThisExpression:return function(t){return e?{value:t}:t};case ka.LocalsExpression:return function(t,n){return e?{value:n}:n};case ka.NGValueParameter:return function(t,n,r){return e?{value:r}:r}}},"unary+":function(t,e){return function(n,r,i,a){var o=t(n,r,i,a);return o=y(o)?+o:0,e?{value:o}:o}},"unary-":function(t,e){return function(n,r,i,a){var o=t(n,r,i,a);return o=y(o)?-o:-0,e?{value:o}:o}},"unary!":function(t,e){return function(n,r,i,a){var o=!t(n,r,i,a);return e?{value:o}:o}},"binary+":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o),u=e(r,i,a,o),c=ln(s,u);return n?{value:c}:c}},"binary-":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o),u=e(r,i,a,o),c=(y(s)?s:0)-(y(u)?u:0);return n?{value:c}:c}},"binary*":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)*e(r,i,a,o);return n?{value:s}:s}},"binary/":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)/e(r,i,a,o);return n?{value:s}:s}},"binary%":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)%e(r,i,a,o);return n?{value:s}:s}},"binary===":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)===e(r,i,a,o);return n?{value:s}:s}},"binary!==":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)!==e(r,i,a,o);return n?{value:s}:s}},"binary==":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)==e(r,i,a,o);return n?{value:s}:s}},"binary!=":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)!=e(r,i,a,o);return n?{value:s}:s}},"binary<":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)<e(r,i,a,o);return n?{value:s}:s}},"binary>":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)>e(r,i,a,o);return n?{value:s}:s}},"binary<=":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)<=e(r,i,a,o);return n?{value:s}:s}},"binary>=":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)>=e(r,i,a,o);return n?{value:s}:s}},"binary&&":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)&&e(r,i,a,o);return n?{value:s}:s}},"binary||":function(t,e,n){return function(r,i,a,o){var s=t(r,i,a,o)||e(r,i,a,o);return n?{value:s}:s}},"ternary?:":function(t,e,n,r){return function(i,a,o,s){var u=t(i,a,o,s)?e(i,a,o,s):n(i,a,o,s);return r?{value:u}:u}},value:function(t,e){return function(){return e?{context:void 0,name:void 0,value:t}:t}},identifier:function(t,e,n){return function(r,i,a,o){var s=i&&t in i?i:r;n&&1!==n&&s&&null==s[t]&&(s[t]={});var u=s?s[t]:void 0;return e?{context:s,name:t,value:u}:u}},computedMember:function(t,e,n,r){return function(i,a,o,s){var u,c,l=t(i,a,o,s);return null!=l&&(u=e(i,a,o,s),u=un(u),r&&1!==r&&l&&!l[u]&&(l[u]={}),c=l[u]),n?{context:l,name:u,value:c}:c}},nonComputedMember:function(t,e,n,r){return function(i,a,o,s){var u=t(i,a,o,s);r&&1!==r&&u&&null==u[e]&&(u[e]={});var c=null!=u?u[e]:void 0;return n?{context:u,name:e,value:c}:c}},inputs:function(t,e){return function(n,r,i,a){return a?a[e]:t(n,r,i)}}};var Pa=function(t,e,n){this.lexer=t,this.$filter=e,this.options=n,this.ast=new ka(t,n),this.astCompiler=n.csp?new xn(this.ast,e):new yn(this.ast,e)};Pa.prototype={constructor:Pa,parse:function(t){return this.astCompiler.compile(t)}};var Oa=e("$sce"),La={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Da=/_([a-z])/g,Va=e("$compile"),Ra=t.document.createElement("a"),Ia=In(t.location.href);Fn.$inject=["$document"],Hn.$inject=["$provide"];var Na=22,ja=".",Fa="0";Yn.$inject=["$locale"],Wn.$inject=["$locale"];var Ga={yyyy:Kn("FullYear",4,0,!1,!0),yy:Kn("FullYear",2,0,!0,!0),y:Kn("FullYear",1,0,!1,!0),MMMM:tr("Month"),MMM:tr("Month",!0),MM:Kn("Month",2,1),M:Kn("Month",1,1),LLLL:tr("Month",!1,!0),dd:Kn("Date",2),d:Kn("Date",1),HH:Kn("Hours",2),H:Kn("Hours",1),hh:Kn("Hours",2,-12),h:Kn("Hours",1,-12),mm:Kn("Minutes",2),m:Kn("Minutes",1),ss:Kn("Seconds",2),s:Kn("Seconds",1),sss:Kn("Milliseconds",3),EEEE:tr("Day"),EEE:tr("Day",!0),a:ar,Z:er,ww:ir(2),w:ir(1),G:or,GG:or,GGG:or,GGGG:sr},Ha=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,za=/^-?\d+$/;ur.$inject=["$locale"];var Ua=g(qr),Ba=g(Yr);hr.$inject=["$parse"];var qa=g({restrict:"E",compile:function(t,e){if(!e.href&&!e.xlinkHref)return function(t,e){if("a"===e[0].nodeName.toLowerCase()){var n="[object SVGAnimatedString]"===ri.call(e.prop("href"))?"xlink:href":"href";e.on("click",function(t){e.attr(n)||t.preventDefault()})}}}}),Ya={};r(Fi,function(t,e){function n(t,n,i){t.$watch(i[r],function(t){i.$set(e,!!t)})}if("multiple"!==t){var r=$e("ng-"+e),i=n;"checked"===t&&(i=function(t,e,i){i.ngModel!==i[r]&&n(t,e,i)}),Ya[r]=function(){return{restrict:"A",priority:100,link:i}}}}),r(Hi,function(t,e){Ya[e]=function(){return{priority:100,link:function(t,n,r){if("ngPattern"===e&&"/"===r.ngPattern.charAt(0)){var i=r.ngPattern.match(zr);if(i)return void r.$set("ngPattern",new RegExp(i[1],i[2]))}t.$watch(r[e],function(t){r.$set(e,t)})}}}}),r(["src","srcset","href"],function(t){var e=$e("ng-"+t);Ya[e]=function(){return{priority:99,link:function(n,r,i){var a=t,o=t;"href"===t&&"[object SVGAnimatedString]"===ri.call(r.prop("href"))&&(o="xlinkHref",i.$attr[o]="xlink:href",a=null),i.$observe(e,function(e){return e?(i.$set(o,e),void(Qr&&a&&r.prop(a,i[o]))):void("href"===t&&i.$set(o,null))})}}}});var Wa={$addControl:d,$$renameControl:pr,$removeControl:d,$setValidity:d,$setDirty:d,$setPristine:d,$setSubmitted:d},Xa="ng-pending",Qa="ng-submitted";gr.$inject=["$element","$attrs","$scope","$animate","$interpolate"],gr.prototype={$rollbackViewValue:function(){r(this.$$controls,function(t){t.$rollbackViewValue()})},$commitViewValue:function(){r(this.$$controls,function(t){t.$commitViewValue()})},$addControl:function(t){dt(t.$name,"input"),this.$$controls.push(t),t.$name&&(this[t.$name]=t),t.$$parentForm=this},$$renameControl:function(t,e){var n=t.$name;this[n]===t&&delete this[n],this[e]=t,t.$name=e},$removeControl:function(t){t.$name&&this[t.$name]===t&&delete this[t.$name],r(this.$pending,function(e,n){this.$setValidity(n,null,t)},this),r(this.$error,function(e,n){this.$setValidity(n,null,t)},this),r(this.$$success,function(e,n){this.$setValidity(n,null,t)},this),j(this.$$controls,t),t.$$parentForm=Wa},$setDirty:function(){this.$$animate.removeClass(this.$$element,Do),this.$$animate.addClass(this.$$element,Vo),this.$dirty=!0,this.$pristine=!1,this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,Do,Vo+" "+Qa),this.$dirty=!1,this.$pristine=!0,this.$submitted=!1,r(this.$$controls,function(t){t.$setPristine()})},$setUntouched:function(){r(this.$$controls,function(t){t.$setUntouched()})},$setSubmitted:function(){this.$$animate.addClass(this.$$element,Qa),this.$submitted=!0,this.$$parentForm.$setSubmitted()}},mr({clazz:gr,set:function(t,e,n){var r=t[e];if(r){var i=r.indexOf(n);i===-1&&r.push(n)}else t[e]=[n]},unset:function(t,e,n){var r=t[e];r&&(j(r,n),0===r.length&&delete t[e])}});var Za=function(t){return["$timeout","$parse",function(e,n){function r(t){return""===t?n('this[""]').assign:n(t).assign||d}var i={name:"form",restrict:t?"EAC":"E",require:["form","^^?form"],controller:gr,compile:function(n,i){n.addClass(Do).addClass(Oo);var a=i.name?"name":!(!t||!i.ngForm)&&"ngForm";return{pre:function(t,n,i,o){var s=o[0];if(!("action"in i)){var u=function(e){t.$apply(function(){s.$commitViewValue(),s.$setSubmitted()}),e.preventDefault()};n[0].addEventListener("submit",u),n.on("$destroy",function(){e(function(){n[0].removeEventListener("submit",u)},0,!1)})}var l=o[1]||s.$$parentForm;l.$addControl(s);var f=a?r(s.$name):d;a&&(f(t,s),i.$observe(a,function(e){s.$name!==e&&(f(t,void 0),s.$$parentForm.$$renameControl(s,e),(f=r(s.$name))(t,s))})),n.on("$destroy",function(){s.$$parentForm.$removeControl(s),f(t,void 0),c(s,Wa)})}}}};return i}]},Ja=Za(),Ka=Za(!0),to=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,eo=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:\/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,no=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[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])?)*$/,ro=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,io=/^(\d{4,})-(\d{2})-(\d{2})$/,ao=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,oo=/^(\d{4,})-W(\d\d)$/,so=/^(\d{4,})-(\d\d)$/,uo=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,co="keydown wheel mousedown",lo=vt();r("date,datetime-local,month,time,week".split(","),function(t){lo[t]=!0});var fo={text:_r,date:Sr("date",io,wr(io,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":Sr("datetimelocal",ao,wr(ao,["yyyy","MM","dd","HH","mm","ss","sss"]),"yyyy-MM-ddTHH:mm:ss.sss"),time:Sr("time",uo,wr(uo,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:Sr("week",oo,$r,"yyyy-Www"),month:Sr("month",so,wr(so,["yyyy","MM"]),"yyyy-MM"),number:Pr,url:Lr,email:Dr,radio:Vr,range:Or,checkbox:Ir,hidden:d,button:d,submit:d,reset:d,file:d},ho=["$browser","$sniffer","$filter","$parse",function(t,e,n,r){return{restrict:"E",require:["?ngModel"],link:{pre:function(i,a,o,s){s[0]&&(fo[qr(o.type)]||fo.text)(i,a,o,s[0],e,t,n,r)}}}}],po=/^(true|false|\d+)$/,go=function(){function t(t,e,n){t.prop("value",n),e.$set("value",n)}return{restrict:"A",priority:100,compile:function(e,n){return po.test(n.ngValue)?function(e,n,r){var i=e.$eval(r.ngValue);t(n,r,i)}:function(e,n,r){e.$watch(r.ngValue,function(e){t(n,r,e)})}}}},vo=["$compile",function(t){return{restrict:"AC",compile:function(e){return t.$$addBindingClass(e),function(e,n,r){t.$$addBindingInfo(n,r.ngBind),n=n[0],e.$watch(r.ngBind,function(t){n.textContent=mt(t)})}}}}],mo=["$interpolate","$compile",function(t,e){return{compile:function(n){return e.$$addBindingClass(n),function(n,r,i){var a=t(r.attr(i.$attr.ngBindTemplate));e.$$addBindingInfo(r,a.expressions),r=r[0],i.$observe("ngBindTemplate",function(t){r.textContent=m(t)?"":t})}}}}],yo=["$sce","$parse","$compile",function(t,e,n){return{restrict:"A",compile:function(r,i){var a=e(i.ngBindHtml),o=e(i.ngBindHtml,function(e){return t.valueOf(e)});return n.$$addBindingClass(r),function(e,r,i){n.$$addBindingInfo(r,i.ngBindHtml),e.$watch(o,function(){var n=a(e);r.html(t.getTrustedHtml(n)||"")})}}}}],xo=g({restrict:"A",require:"ngModel",link:function(t,e,n,r){r.$viewChangeListeners.push(function(){t.$eval(n.ngChange)})}}),_o=Nr("",!0),bo=Nr("Odd",0),$o=Nr("Even",1),wo=dr({compile:function(t,e){e.$set("ngCloak",void 0),t.removeClass("ng-cloak")}}),So=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],To={},Ao={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(t){var e=$e("ng-"+t);To[e]=["$parse","$rootScope",function(n,r){return{restrict:"A",compile:function(i,a){var o=n(a[e],null,!0);return function(e,n){n.on(t,function(n){var i=function(){o(e,{$event:n})};Ao[t]&&r.$$phase?e.$evalAsync(i):e.$apply(i)})}}}}]});var Co=["$animate","$compile",function(t,e){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(n,r,i,a,o){var s,u,c;n.$watch(i.ngIf,function(n){n?u||o(function(n,a){u=a,n[n.length++]=e.$$createComment("end ngIf",i.ngIf),s={clone:n},t.enter(n,r.parent(),r)}):(c&&(c.remove(),c=null),u&&(u.$destroy(),u=null),s&&(c=gt(s.clone),t.leave(c).done(function(t){t!==!1&&(c=null)}),s=null))})}}}],Eo=["$templateRequest","$anchorScroll","$animate",function(t,e,n){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:oi.noop,compile:function(r,i){var a=i.ngInclude||i.src,o=i.onload||"",s=i.autoscroll;return function(r,i,u,c,l){var f,h,d,p=0,g=function(){h&&(h.remove(),h=null),f&&(f.$destroy(),f=null),d&&(n.leave(d).done(function(t){t!==!1&&(h=null)}),h=d,d=null)};r.$watch(a,function(a){var u=function(t){t===!1||!y(s)||s&&!r.$eval(s)||e()},h=++p;a?(t(a,!0).then(function(t){if(!r.$$destroyed&&h===p){var e=r.$new();c.template=t;var s=l(e,function(t){g(),n.enter(t,null,i).done(u)});f=e,d=s,f.$emit("$includeContentLoaded",a),r.$eval(o)}},function(){r.$$destroyed||h===p&&(g(),r.$emit("$includeContentError",a))}),r.$emit("$includeContentRequested",a)):(g(),c.template=null)})}}}}],Mo=["$compile",function(e){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(n,r,i,a){return ri.call(r[0]).match(/SVG/)?(r.empty(),void e(Pt(a.template,t.document).childNodes)(n,function(t){r.append(t)},{futureParentElement:r})):(r.html(a.template),void e(r.contents())(n))}}}],ko=dr({priority:450,compile:function(){return{pre:function(t,e,n){t.$eval(n.ngInit)}}}}),Po=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(t,e,n,i){var a=n.ngList||", ",o="false"!==n.ngTrim,s=o?fi(a):a,u=function(t){if(!m(t)){var e=[];return t&&r(t.split(s),function(t){t&&e.push(o?fi(t):t)}),e}};i.$parsers.push(u),i.$formatters.push(function(t){if(ci(t))return t.join(a)}),i.$isEmpty=function(t){return!t||!t.length}}}},Oo="ng-valid",Lo="ng-invalid",Do="ng-pristine",Vo="ng-dirty",Ro="ng-untouched",Io="ng-touched",No="ng-empty",jo="ng-not-empty",Fo=e("ngModel");jr.$inject=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$q","$interpolate"],jr.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var t=this.$$parse(this.$$attr.ngModel+"()"),e=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function(e){var n=this.$$parsedNgModel(e);return S(n)&&(n=t(e)),n},this.$$ngModelSet=function(t,n){S(this.$$parsedNgModel(t))?e(t,{$$$p:n}):this.$$parsedNgModelAssign(t,n)}}else if(!this.$$parsedNgModel.assign)throw Fo("nonassign","Expression '{0}' is non-assignable. Element: {1}",this.$$attr.ngModel,Z(this.$$element))},$render:d,$isEmpty:function(t){return m(t)||""===t||null===t||t!==t},$$updateEmptyClasses:function(t){this.$isEmpty(t)?(this.$$animate.removeClass(this.$$element,jo),this.$$animate.addClass(this.$$element,No)):(this.$$animate.removeClass(this.$$element,No),this.$$animate.addClass(this.$$element,jo))},$setPristine:function(){this.$dirty=!1,this.$pristine=!0,this.$$animate.removeClass(this.$$element,Vo),this.$$animate.addClass(this.$$element,Do)},$setDirty:function(){this.$dirty=!0,this.$pristine=!1,this.$$animate.removeClass(this.$$element,Do),this.$$animate.addClass(this.$$element,Vo),this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1,this.$untouched=!0,this.$$animate.setClass(this.$$element,Ro,Io)},$setTouched:function(){this.$touched=!0,this.$untouched=!1,this.$$animate.setClass(this.$$element,Io,Ro)},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce),this.$viewValue=this.$$lastCommittedViewValue,this.$render()},$validate:function(){if(!ui(this.$modelValue)){var t=this.$$lastCommittedViewValue,e=this.$$rawModelValue,n=this.$valid,r=this.$modelValue,i=this.$options.getOption("allowInvalid"),a=this;this.$$runValidators(e,t,function(t){i||n===t||(a.$modelValue=t?e:void 0,a.$modelValue!==r&&a.$$writeModelToScope())})}},$$runValidators:function(t,e,n){function i(){var t=l.$$parserName||"parse";return m(l.$$parserValid)?(s(t,null),!0):(l.$$parserValid||(r(l.$validators,function(t,e){s(e,null)}),r(l.$asyncValidators,function(t,e){s(e,null)})),s(t,l.$$parserValid),l.$$parserValid)}function a(){var n=!0;return r(l.$validators,function(r,i){var a=Boolean(r(t,e));n=n&&a,s(i,a)}),!!n||(r(l.$asyncValidators,function(t,e){s(e,null)}),!1)}function o(){var n=[],i=!0;r(l.$asyncValidators,function(r,a){var o=r(t,e);if(!O(o))throw Fo("nopromise","Expected asynchronous validator to return a promise but got '{0}' instead.",o);s(a,void 0),n.push(o.then(function(){s(a,!0)},function(){i=!1,s(a,!1)}))}),n.length?l.$$q.all(n).then(function(){u(i)},d):u(!0)}function s(t,e){c===l.$$currentValidationRunId&&l.$setValidity(t,e)}function u(t){c===l.$$currentValidationRunId&&n(t)}this.$$currentValidationRunId++;var c=this.$$currentValidationRunId,l=this;return i()&&a()?void o():void u(!1)},$commitViewValue:function(){var t=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce),(this.$$lastCommittedViewValue!==t||""===t&&this.$$hasNativeValidators)&&(this.$$updateEmptyClasses(t),this.$$lastCommittedViewValue=t,this.$pristine&&this.$setDirty(),this.$$parseAndValidate())},$$parseAndValidate:function(){function t(){r.$modelValue!==a&&r.$$writeModelToScope()}var e=this.$$lastCommittedViewValue,n=e,r=this;if(this.$$parserValid=!m(n)||void 0,this.$$parserValid)for(var i=0;i<this.$parsers.length;i++)if(n=this.$parsers[i](n),m(n)){this.$$parserValid=!1;break}ui(this.$modelValue)&&(this.$modelValue=this.$$ngModelGet(this.$$scope));var a=this.$modelValue,o=this.$options.getOption("allowInvalid");this.$$rawModelValue=n,o&&(this.$modelValue=n,t()),this.$$runValidators(n,this.$$lastCommittedViewValue,function(e){o||(r.$modelValue=e?n:void 0,t())})},$$writeModelToScope:function(){this.$$ngModelSet(this.$$scope,this.$modelValue),r(this.$viewChangeListeners,function(t){try{t()}catch(t){this.$$exceptionHandler(t)}},this)},$setViewValue:function(t,e){this.$viewValue=t,this.$options.getOption("updateOnDefault")&&this.$$debounceViewValueCommit(e)},$$debounceViewValueCommit:function(t){var e=this.$options.getOption("debounce");$(e[t])?e=e[t]:$(e.default)&&(e=e.default),this.$$timeout.cancel(this.$$pendingDebounce);var n=this;e>0?this.$$pendingDebounce=this.$$timeout(function(){n.$commitViewValue()},e):this.$$scope.$root.$$phase?this.$commitViewValue():this.$$scope.$apply(function(){n.$commitViewValue()})}},mr({clazz:jr,set:function(t,e){t[e]=!0},unset:function(t,e){delete t[e]}});var Go,Ho=["$rootScope",function(t){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:jr,priority:1,compile:function(e){return e.addClass(Do).addClass(Ro).addClass(Oo),{pre:function(t,e,n,r){var i=r[0],a=r[1]||i.$$parentForm,o=r[2];o&&(i.$options=o.$options),i.$$initGetterSetters(),a.$addControl(i),n.$observe("name",function(t){i.$name!==t&&i.$$parentForm.$$renameControl(i,t)}),t.$on("$destroy",function(){i.$$parentForm.$removeControl(i)})},post:function(e,n,r,i){function a(){o.$setTouched()}var o=i[0];o.$options.getOption("updateOn")&&n.on(o.$options.getOption("updateOn"),function(t){o.$$debounceViewValueCommit(t&&t.type)}),n.on("blur",function(){o.$touched||(t.$$phase?e.$evalAsync(a):e.$apply(a))})}}}}}],zo=/(\s+|^)default(\s+|$)/;Gr.prototype={getOption:function(t){return this.$$options[t]},createChild:function(t){var e=!1;return t=c({},t),r(t,function(n,r){"$inherit"===n?"*"===r?e=!0:(t[r]=this.$$options[r],"updateOn"===r&&(t.updateOnDefault=this.$$options.updateOnDefault)):"updateOn"===r&&(t.updateOnDefault=!1,t[r]=fi(n.replace(zo,function(){return t.updateOnDefault=!0," "})))},this),e&&(delete t["*"],Hr(t,this.$$options)),Hr(t,Go.$$options),new Gr(t)}},Go=new Gr({updateOn:"",updateOnDefault:!0,debounce:0,getterSetter:!1,allowInvalid:!1,timezone:null});var Uo=function(){function t(t,e){this.$$attrs=t,this.$$scope=e}return t.$inject=["$attrs","$scope"],t.prototype={$onInit:function(){var t=this.parentCtrl?this.parentCtrl.$options:Go,e=this.$$scope.$eval(this.$$attrs.ngModelOptions);this.$options=t.createChild(e)}},{restrict:"A",priority:10,require:{parentCtrl:"?^^ngModelOptions"},bindToController:!0,controller:t}},Bo=dr({terminal:!0,priority:1e3}),qo=e("ngOptions"),Yo=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([$\w][$\w]*)|(?:\(\s*([$\w][$\w]*)\s*,\s*([$\w][$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,Wo=["$compile","$document","$parse",function(e,i,a){function o(t,e,r){function i(t,e,n,r,i){this.selectValue=t,this.viewValue=e,this.label=n,this.group=r,this.disabled=i}function o(t){var e;if(!c&&n(t))e=t;else{e=[];for(var r in t)t.hasOwnProperty(r)&&"$"!==r.charAt(0)&&e.push(r)}return e}var s=t.match(Yo);if(!s)throw qo("iexp","Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}",t,Z(e));var u=s[5]||s[7],c=s[6],l=/ as /.test(s[0])&&s[1],f=s[9],h=a(s[2]?s[1]:u),d=l&&a(l),p=d||h,g=f&&a(f),v=f?function(t,e){return g(r,e)}:function(t){return re(t)},m=function(t,e){return v(t,w(t,e))},y=a(s[2]||s[1]),x=a(s[3]||""),_=a(s[4]||""),b=a(s[8]),$={},w=c?function(t,e){return $[c]=e,$[u]=t,$}:function(t){return $[u]=t,$};return{trackBy:f,getTrackByValue:m,getWatchables:a(b,function(t){var e=[];t=t||[];for(var n=o(t),i=n.length,a=0;a<i;a++){var u=t===n?a:n[a],c=t[u],l=w(c,u),f=v(c,l);if(e.push(f),s[2]||s[1]){var h=y(r,l);e.push(h)}if(s[4]){var d=_(r,l);e.push(d)}}return e}),getOptions:function(){for(var t=[],e={},n=b(r)||[],a=o(n),s=a.length,u=0;u<s;u++){var c=n===a?u:a[u],l=n[c],h=w(l,c),d=p(r,h),g=v(d,h),$=y(r,h),S=x(r,h),T=_(r,h),A=new i(g,d,$,S,T);t.push(A),e[g]=A}return{items:t,selectValueMap:e,getOptionFromViewValue:function(t){return e[m(t)]},getViewValueFromOption:function(t){return f?F(t.viewValue):t.viewValue}}}}}function s(t,n,a,s){function l(t,e){var n=u.cloneNode(!1);e.appendChild(n),h(t,n)}function f(t){var e=w.getOptionFromViewValue(t),n=e&&e.element;return n&&!n.selected&&(n.selected=!0),e}function h(t,e){t.element=e,e.disabled=t.disabled,t.label!==e.label&&(e.label=t.label,e.textContent=t.label),e.value=t.selectValue}function d(){var t=w&&p.readValue();if(w)for(var e=w.items.length-1;e>=0;e--){var r=w.items[e];Wt(y(r.group)?r.element.parentNode:r.element)}w=S.getOptions();var i={};if(b&&n.prepend(p.emptyOption),w.items.forEach(function(t){var e;y(t.group)?(e=i[t.group],e||(e=c.cloneNode(!1),T.appendChild(e),e.label=null===t.group?"null":t.group,i[t.group]=e),l(t,e)):l(t,T)}),n[0].appendChild(T),g.$render(),!g.$isEmpty(t)){var a=p.readValue(),o=S.trackBy||v;(o?G(t,a):t===a)||(g.$setViewValue(a),g.$render())}}for(var p=s[0],g=s[1],v=a.multiple,m=0,x=n.children(),_=x.length;m<_;m++)if(""===x[m].value){p.hasEmptyOption=!0,p.emptyOption=x.eq(m);break}var b=!!p.emptyOption,$=Zr(u.cloneNode(!1));$.val("?");var w,S=o(a.ngOptions,n,t),T=i[0].createDocumentFragment();p.generateUnknownOptionValue=function(t){return"?"},v?(p.writeValue=function(t){var e=t&&t.map(f)||[];w.items.forEach(function(t){t.element.selected&&!N(e,t)&&(t.element.selected=!1)})},p.readValue=function(){var t=n.val()||[],e=[];return r(t,function(t){var n=w.selectValueMap[t];n&&!n.disabled&&e.push(w.getViewValueFromOption(n))}),e},S.trackBy&&t.$watchCollection(function(){if(ci(g.$viewValue))return g.$viewValue.map(function(t){return S.getTrackByValue(t);
})},function(){g.$render()})):(p.writeValue=function(t){var e=w.selectValueMap[n.val()],r=w.getOptionFromViewValue(t);e&&e.element.removeAttribute("selected"),r?(n[0].value!==r.selectValue&&(p.removeUnknownOption(),p.unselectEmptyOption(),n[0].value=r.selectValue,r.element.selected=!0),r.element.setAttribute("selected","selected")):b?p.selectEmptyOption():p.unknownOption.parent().length?p.updateUnknownOption(t):p.renderUnknownOption(t)},p.readValue=function(){var t=w.selectValueMap[n.val()];return t&&!t.disabled?(p.unselectEmptyOption(),p.removeUnknownOption(),w.getViewValueFromOption(t)):null},S.trackBy&&t.$watch(function(){return S.getTrackByValue(g.$viewValue)},function(){g.$render()})),b&&(p.emptyOption.remove(),e(p.emptyOption)(t),p.emptyOption[0].nodeType===wi?(p.hasEmptyOption=!1,p.registerOption=function(t,e){""===e.val()&&(p.hasEmptyOption=!0,p.emptyOption=e,p.emptyOption.removeClass("ng-scope"),g.$render(),e.on("$destroy",function(){p.hasEmptyOption=!1,p.emptyOption=void 0}))}):p.emptyOption.removeClass("ng-scope")),n.empty(),d(),t.$watchCollection(S.getWatchables,d)}var u=t.document.createElement("option"),c=t.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(t,e,n,r){r[0].registerOption=d},post:s}}}],Xo=["$locale","$interpolate","$log",function(t,e,n){var i=/{}/g,a=/^when(Minus)?(.+)$/;return{link:function(o,s,u){function c(t){s.text(t||"")}var l,f=u.count,h=u.$attr.when&&s.attr(u.$attr.when),p=u.offset||0,g=o.$eval(h)||{},v={},y=e.startSymbol(),x=e.endSymbol(),_=y+f+"-"+p+x,b=oi.noop;r(u,function(t,e){var n=a.exec(e);if(n){var r=(n[1]?"-":"")+qr(n[2]);g[r]=s.attr(u.$attr[e])}}),r(g,function(t,n){v[n]=e(t.replace(i,_))}),o.$watch(f,function(e){var r=parseFloat(e),i=ui(r);if(i||r in g||(r=t.pluralCat(r-p)),!(r===l||i&&ui(l))){b();var a=v[r];m(a)?(null!=e&&n.debug("ngPluralize: no rule defined for '"+r+"' in "+h),b=d,c()):b=o.$watch(a,c),l=r}})}}}],Qo=["$parse","$animate","$compile",function(t,i,a){var o="$$NG_REMOVED",s=e("ngRepeat"),u=function(t,e,n,r,i,a,o){t[n]=r,i&&(t[i]=a),t.$index=e,t.$first=0===e,t.$last=e===o-1,t.$middle=!(t.$first||t.$last),t.$odd=!(t.$even=0===(1&e))},c=function(t){return t.clone[0]},l=function(t){return t.clone[t.clone.length-1]};return{restrict:"A",multiElement:!0,transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,compile:function(e,f){var h=f.ngRepeat,d=a.$$createComment("end ngRepeat",h),p=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!p)throw s("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",h);var g=p[1],v=p[2],m=p[3],y=p[4];if(p=g.match(/^(?:(\s*[$\w]+)|\(\s*([$\w]+)\s*,\s*([$\w]+)\s*\))$/),!p)throw s("iidexp","'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",g);var x=p[3]||p[1],_=p[2];if(m&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(m)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(m)))throw s("badident","alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.",m);var b,$,w,S,T={$id:re};return y?b=t(y):(w=function(t,e){return re(e)},S=function(t){return t}),function(t,e,a,f,p){b&&($=function(e,n,r){return _&&(T[_]=e),T[x]=n,T.$index=r,b(t,T)});var g=vt();t.$watchCollection(v,function(a){var f,v,y,b,T,A,C,E,M,k,P,O,L=e[0],D=vt();if(m&&(t[m]=a),n(a))M=a,E=$||w;else{E=$||S,M=[];for(var V in a)Br.call(a,V)&&"$"!==V.charAt(0)&&M.push(V)}for(b=M.length,P=new Array(b),f=0;f<b;f++)if(T=a===M?f:M[f],A=a[T],C=E(T,A,f),g[C])k=g[C],delete g[C],D[C]=k,P[f]=k;else{if(D[C])throw r(P,function(t){t&&t.scope&&(g[t.id]=t)}),s("dupes","Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",h,C,A);P[f]={id:C,scope:void 0,clone:void 0},D[C]=!0}for(var R in g){if(k=g[R],O=gt(k.clone),i.leave(O),O[0].parentNode)for(f=0,v=O.length;f<v;f++)O[f][o]=!0;k.scope.$destroy()}for(f=0;f<b;f++)if(T=a===M?f:M[f],A=a[T],k=P[f],k.scope){y=L;do y=y.nextSibling;while(y&&y[o]);c(k)!==y&&i.move(gt(k.clone),null,L),L=l(k),u(k.scope,f,x,A,_,T,b)}else p(function(t,e){k.scope=e;var n=d.cloneNode(!1);t[t.length++]=n,i.enter(t,null,L),L=n,k.clone=t,D[k.id]=k,u(k.scope,f,x,A,_,T,b)});g=D})}}}}],Zo="ng-hide",Jo="ng-hide-animate",Ko=["$animate",function(t){return{restrict:"A",multiElement:!0,link:function(e,n,r){e.$watch(r.ngShow,function(e){t[e?"removeClass":"addClass"](n,Zo,{tempClasses:Jo})})}}}],ts=["$animate",function(t){return{restrict:"A",multiElement:!0,link:function(e,n,r){e.$watch(r.ngHide,function(e){t[e?"addClass":"removeClass"](n,Zo,{tempClasses:Jo})})}}}],es=dr(function(t,e,n){t.$watch(n.ngStyle,function(t,n){n&&t!==n&&r(n,function(t,n){e.css(n,"")}),t&&e.css(t)},!0)}),ns=["$animate","$compile",function(t,e){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(n,i,a,o){var s=a.ngSwitch||a.on,u=[],c=[],l=[],f=[],h=function(t,e){return function(n){n!==!1&&t.splice(e,1)}};n.$watch(s,function(n){for(var i,a;l.length;)t.cancel(l.pop());for(i=0,a=f.length;i<a;++i){var s=gt(c[i].clone);f[i].$destroy();var d=l[i]=t.leave(s);d.done(h(l,i))}c.length=0,f.length=0,(u=o.cases["!"+n]||o.cases["?"])&&r(u,function(n){n.transclude(function(r,i){f.push(i);var a=n.element;r[r.length++]=e.$$createComment("end ngSwitchWhen");var o={clone:r};c.push(o),t.enter(r,a.parent(),a)})})})}}}],rs=dr({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(t,e,n,i,a){var o=n.ngSwitchWhen.split(n.ngSwitchWhenSeparator).sort().filter(function(t,e,n){return n[e-1]!==t});r(o,function(t){i.cases["!"+t]=i.cases["!"+t]||[],i.cases["!"+t].push({transclude:a,element:e})})}}),is=dr({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(t,e,n,r,i){r.cases["?"]=r.cases["?"]||[],r.cases["?"].push({transclude:i,element:e})}}),as=e("ngTransclude"),os=["$compile",function(t){return{restrict:"EAC",terminal:!0,compile:function(e){var n=t(e.contents());return e.empty(),function(t,e,r,i,a){function o(t,n){t.length&&u(t)?e.append(t):(s(),n.$destroy())}function s(){n(t,function(t){e.append(t)})}function u(t){for(var e=0,n=t.length;e<n;e++){var r=t[e];if(r.nodeType!==$i||r.nodeValue.trim())return!0}}if(!a)throw as("orphan","Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}",Z(e));r.ngTransclude===r.$attr.ngTransclude&&(r.ngTransclude="");var c=r.ngTransclude||r.ngTranscludeSlot;a(o,null,c),c&&!a.isSlotFilled(c)&&s()}}}}],ss=["$templateCache",function(t){return{restrict:"E",terminal:!0,compile:function(e,n){if("text/ng-template"===n.type){var r=n.id,i=e[0].text;t.put(r,i)}}}}],us={$setViewValue:d,$render:d},cs=["$element","$scope",function(e,n){function r(){u||(u=!0,n.$$postDigest(function(){u=!1,o.ngModelCtrl.$render()}))}function i(t){c||(c=!0,n.$$postDigest(function(){n.$$destroyed||(c=!1,o.ngModelCtrl.$setViewValue(o.readValue()),t&&o.ngModelCtrl.$render())}))}function a(t){t.prop("selected",!0),t.attr("selected",!0)}var o=this,s=new ie;o.selectValueMap={},o.ngModelCtrl=us,o.multiple=!1,o.unknownOption=Zr(t.document.createElement("option")),o.hasEmptyOption=!1,o.emptyOption=void 0,o.renderUnknownOption=function(t){var n=o.generateUnknownOptionValue(t);o.unknownOption.val(n),e.prepend(o.unknownOption),a(o.unknownOption),e.val(n)},o.updateUnknownOption=function(t){var n=o.generateUnknownOptionValue(t);o.unknownOption.val(n),a(o.unknownOption),e.val(n)},o.generateUnknownOptionValue=function(t){return"? "+re(t)+" ?"},o.removeUnknownOption=function(){o.unknownOption.parent()&&o.unknownOption.remove()},o.selectEmptyOption=function(){o.emptyOption&&(e.val(""),a(o.emptyOption))},o.unselectEmptyOption=function(){o.hasEmptyOption&&o.emptyOption.removeAttr("selected")},n.$on("$destroy",function(){o.renderUnknownOption=d}),o.readValue=function(){var t=e.val(),n=t in o.selectValueMap?o.selectValueMap[t]:t;return o.hasOption(n)?n:null},o.writeValue=function(t){var n=e[0].options[e[0].selectedIndex];if(n&&n.removeAttribute("selected"),o.hasOption(t)){o.removeUnknownOption();var r=re(t);e.val(r in o.selectValueMap?r:t);var i=e[0].options[e[0].selectedIndex];a(Zr(i))}else null==t&&o.emptyOption?(o.removeUnknownOption(),o.selectEmptyOption()):o.unknownOption.parent().length?o.updateUnknownOption(t):o.renderUnknownOption(t)},o.addOption=function(t,e){if(e[0].nodeType!==wi){dt(t,'"option value"'),""===t&&(o.hasEmptyOption=!0,o.emptyOption=e);var n=s.get(t)||0;s.put(t,n+1),r()}},o.removeOption=function(t){var e=s.get(t);e&&(1===e?(s.remove(t),""===t&&(o.hasEmptyOption=!1,o.emptyOption=void 0)):s.put(t,e-1))},o.hasOption=function(t){return!!s.get(t)};var u=!1,c=!1;o.registerOption=function(t,e,n,r,a){if(n.$attr.ngValue){var s,u=NaN;n.$observe("value",function(t){var n,r=e.prop("selected");y(u)&&(o.removeOption(s),delete o.selectValueMap[u],n=!0),u=re(t),s=t,o.selectValueMap[u]=t,o.addOption(t,e),e.attr("value",u),n&&r&&i()})}else r?n.$observe("value",function(t){o.readValue();var n,r=e.prop("selected");y(s)&&(o.removeOption(s),n=!0),s=t,o.addOption(t,e),n&&r&&i()}):a?t.$watch(a,function(t,r){n.$set("value",t);var a=e.prop("selected");r!==t&&o.removeOption(r),o.addOption(t,e),r&&a&&i()}):o.addOption(n.value,e);n.$observe("disabled",function(t){("true"===t||t&&e.prop("selected"))&&(o.multiple?i(!0):(o.ngModelCtrl.$setViewValue(null),o.ngModelCtrl.$render()))}),e.on("$destroy",function(){var t=o.readValue(),e=n.value;o.removeOption(e),o.ngModelCtrl.$render(),(o.multiple&&t&&t.indexOf(e)!==-1||t===e)&&i(!0)})}}],ls=function(){function t(t,e,n,i){var a=i[0],o=i[1];if(!o)return void(a.registerOption=d);if(a.ngModelCtrl=o,e.on("change",function(){a.removeUnknownOption(),t.$apply(function(){o.$setViewValue(a.readValue())})}),n.multiple){a.multiple=!0,a.readValue=function(){var t=[];return r(e.find("option"),function(e){if(e.selected&&!e.disabled){var n=e.value;t.push(n in a.selectValueMap?a.selectValueMap[n]:n)}}),t},a.writeValue=function(t){var n=new ie(t);r(e.find("option"),function(t){t.selected=y(n.get(t.value))||y(n.get(a.selectValueMap[t.value]))})};var s,u=NaN;t.$watch(function(){u!==o.$viewValue||G(s,o.$viewValue)||(s=xt(o.$viewValue),o.$render()),u=o.$viewValue}),o.$isEmpty=function(t){return!t||0===t.length}}}function e(t,e,n,r){var i=r[1];if(i){var a=r[0];i.$render=function(){a.writeValue(i.$viewValue)}}}return{restrict:"E",require:["select","?ngModel"],controller:cs,priority:1,link:{pre:t,post:e}}},fs=["$interpolate",function(t){return{restrict:"E",priority:100,compile:function(e,n){var r,i;return y(n.ngValue)||(y(n.value)?r=t(n.value,!0):(i=t(e.text(),!0),i||n.$set("value",e.text()))),function(t,e,n){var a="$selectController",o=e.parent(),s=o.data(a)||o.parent().data(a);s&&s.registerOption(t,e,n,r,i)}}}}],hs=function(){return{restrict:"A",require:"?ngModel",link:function(t,e,n,r){r&&(n.required=!0,r.$validators.required=function(t,e){return!n.required||!r.$isEmpty(e)},n.$observe("required",function(){r.$validate()}))}}},ds=function(){return{restrict:"A",require:"?ngModel",link:function(t,n,r,i){if(i){var a,o=r.ngPattern||r.pattern;r.$observe("pattern",function(t){if(b(t)&&t.length>0&&(t=new RegExp("^"+t+"$")),t&&!t.test)throw e("ngPattern")("noregexp","Expected {0} to be a RegExp but was {1}. Element: {2}",o,t,Z(n));a=t||void 0,i.$validate()}),i.$validators.pattern=function(t,e){return i.$isEmpty(e)||m(a)||a.test(e)}}}}},ps=function(){return{restrict:"A",require:"?ngModel",link:function(t,e,n,r){if(r){var i=-1;n.$observe("maxlength",function(t){var e=f(t);i=ui(e)?-1:e,r.$validate()}),r.$validators.maxlength=function(t,e){return i<0||r.$isEmpty(e)||e.length<=i}}}}},gs=function(){return{restrict:"A",require:"?ngModel",link:function(t,e,n,r){if(r){var i=0;n.$observe("minlength",function(t){i=f(t)||0,r.$validate()}),r.$validators.minlength=function(t,e){return r.$isEmpty(e)||e.length>=i}}}}};return t.angular.bootstrap?void(t.console&&console.log("WARNING: Tried to load angular more than once.")):(lt(),$t(oi),oi.module("ngLocale",[],["$provide",function(t){function e(t){t+="";var e=t.indexOf(".");return e==-1?0:t.length-e-1}function n(t,n){var r=n;void 0===r&&(r=Math.min(e(t),3));var i=Math.pow(10,r),a=(t*i|0)%i;return{v:r,f:a}}var r={ZERO:"zero",ONE:"one",TWO:"two",FEW:"few",MANY:"many",OTHER:"other"};t.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],SHORTDAY:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],SHORTMONTH:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],STANDALONEMONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a",short:"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-¤",negSuf:"",posPre:"¤",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(t,e){var i=0|t,a=n(t,e);return 1==i&&0==a.v?r.ONE:r.OTHER}})}]),void Zr(function(){at(t.document,ot)}))}(window),!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>'),function(t,e){"use strict";function n(t){return null!=t&&""!==t&&"hasOwnProperty"!==t&&o.test("."+t)}function r(t,r){if(!n(r))throw a("badmember",'Dotted member path "@{0}" is invalid.',r);for(var i=r.split("."),o=0,s=i.length;o<s&&e.isDefined(t);o++){var u=i[o];t=null!==t?t[u]:void 0}return t}function i(t,n){n=n||{},e.forEach(n,function(t,e){delete n[e]});for(var r in t)!t.hasOwnProperty(r)||"$"===r.charAt(0)&&"$"===r.charAt(1)||(n[r]=t[r]);return n}var a=e.$$minErr("$resource"),o=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;e.module("ngResource",["ng"]).provider("$resource",function(){var t=/^https?:\/\/\[[^\]]*][^\/]*/,n=this;this.defaults={stripTrailingSlashes:!0,cancellable:!1,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},delete:{method:"DELETE"}}},this.$get=["$http","$log","$q","$timeout",function(o,s,u,c){function l(t,e){this.template=t,this.defaults=p({},n.defaults,e),this.urlParams={}}function f(t,e,_,b){function $(t,n){var i={};return n=p({},e,n),d(n,function(e,n){y(e)&&(e=e(t)),i[n]=e&&e.charAt&&"@"===e.charAt(0)?r(t,e.substr(1)):e}),i}function w(t){return t.resource}function S(t){i(t||{},this)}var T=new l(t,b);return _=p({},n.defaults.actions,_),S.prototype.toJSON=function(){var t=p({},this);return delete t.$promise,delete t.$resolved,t},d(_,function(t,e){var n=/^(POST|PUT|PATCH)$/i.test(t.method),r=t.timeout,l=m(t.cancellable)?t.cancellable:T.defaults.cancellable;r&&!x(r)&&(s.debug("ngResource:\n  Only numeric values are allowed as `timeout`.\n  Promises are not supported in $resource, because the same value would be used for multiple requests. If you are looking for a way to cancel requests, you should use the `cancellable` option."),delete t.timeout,r=null),S[e]=function(s,f,m,x){function _(t){N.catch(h),M.resolve(t)}var b,A,C,E={};switch(arguments.length){case 4:C=x,A=m;case 3:case 2:if(!y(f)){E=s,b=f,A=m;break}if(y(s)){A=s,C=f;break}A=f,C=m;case 1:y(s)?A=s:n?b=s:E=s;break;case 0:break;default:throw a("badargs","Expected up to 4 arguments [params, data, success, error], got {0} arguments",arguments.length)}var M,k,P=this instanceof S,O=P?b:t.isArray?[]:new S(b),L={},D=t.interceptor&&t.interceptor.response||w,V=t.interceptor&&t.interceptor.responseError||void 0,R=!!C,I=!!V;d(t,function(t,e){switch(e){default:L[e]=g(t);break;case"params":case"isArray":case"interceptor":case"cancellable":}}),!P&&l&&(M=u.defer(),L.timeout=M.promise,r&&(k=c(M.resolve,r))),n&&(L.data=b),T.setUrlParams(L,p({},$(b,t.params||{}),E),t.url);var N=o(L).then(function(n){var r=n.data;if(r){if(v(r)!==!!t.isArray)throw a("badcfg","Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})",e,t.isArray?"array":"object",v(r)?"array":"object",L.method,L.url);if(t.isArray)O.length=0,d(r,function(t){"object"==typeof t?O.push(new S(t)):O.push(t)});else{var o=O.$promise;i(r,O),O.$promise=o}}return n.resource=O,n});return N=N.finally(function(){O.$resolved=!0,!P&&l&&(O.$cancelRequest=h,c.cancel(k),M=k=L.timeout=null)}),N=N.then(function(t){var e=D(t);return(A||h)(e,t.headers,t.status,t.statusText),e},R||I?function(t){return R&&C(t),I?V(t):u.reject(t)}:void 0),R&&!I&&N.catch(h),P?N:(O.$promise=N,O.$resolved=!1,l&&(O.$cancelRequest=_),O)},S.prototype["$"+e]=function(t,n,r){y(t)&&(r=n,n=t,t={});var i=S[e].call(this,t,this,n,r);return i.$promise||i}}),S.bind=function(n){var r=p({},e,n);return f(t,r,_,b)},S}var h=e.noop,d=e.forEach,p=e.extend,g=e.copy,v=e.isArray,m=e.isDefined,y=e.isFunction,x=e.isNumber,_=e.$$encodeUriQuery,b=e.$$encodeUriSegment;return l.prototype={setUrlParams:function(e,n,r){var i,o,s=this,u=r||s.template,c="",l=s.urlParams=Object.create(null);d(u.split(/\W/),function(t){if("hasOwnProperty"===t)throw a("badname","hasOwnProperty is not a valid parameter name.");!new RegExp("^\\d+$").test(t)&&t&&new RegExp("(^|[^\\\\]):"+t+"(\\W|$)").test(u)&&(l[t]={isQueryParamValue:new RegExp("\\?.*=:"+t+"(?:\\W|$)").test(u)})}),u=u.replace(/\\:/g,":"),u=u.replace(t,function(t){return c=t,""}),n=n||{},d(s.urlParams,function(t,e){i=n.hasOwnProperty(e)?n[e]:s.defaults[e],m(i)&&null!==i?(o=t.isQueryParamValue?_(i,!0):b(i),u=u.replace(new RegExp(":"+e+"(\\W|$)","g"),function(t,e){return o+e})):u=u.replace(new RegExp("(/?):"+e+"(\\W|$)","g"),function(t,e,n){return"/"===n.charAt(0)?n:e+n})}),s.defaults.stripTrailingSlashes&&(u=u.replace(/\/+$/,"")||"/"),u=u.replace(/\/\.(?=\w+($|\?))/,"."),e.url=c+u.replace(/\/\\\./,"/."),d(n,function(t,n){s.urlParams[n]||(e.params=e.params||{},e.params[n]=t)})}},f}]})}(window,window.angular),function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.moment=e()}(this,function(){"use strict";function t(){return gr.apply(null,arguments)}function e(t){gr=t}function n(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function r(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function i(t){var e;for(e in t)return!1;return!0}function a(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function o(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function s(t,e){var n,r=[];for(n=0;n<t.length;++n)r.push(e(t[n],n));return r}function u(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function c(t,e){for(var n in e)u(e,n)&&(t[n]=e[n]);return u(e,"toString")&&(t.toString=e.toString),u(e,"valueOf")&&(t.valueOf=e.valueOf),t}function l(t,e,n,r){return me(t,e,n,r,!0).utc()}function f(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function h(t){return null==t._pf&&(t._pf=f()),t._pf}function d(t){if(null==t._isValid){var e=h(t),n=mr.call(e.parsedDateParts,function(t){return null!=t}),r=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(r=r&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return r;t._isValid=r}return t._isValid}function p(t){var e=l(NaN);return null!=t?c(h(e),t):h(e).userInvalidated=!0,e}function g(t){return void 0===t}function v(t,e){var n,r,i;if(g(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),g(e._i)||(t._i=e._i),g(e._f)||(t._f=e._f),g(e._l)||(t._l=e._l),g(e._strict)||(t._strict=e._strict),g(e._tzm)||(t._tzm=e._tzm),g(e._isUTC)||(t._isUTC=e._isUTC),g(e._offset)||(t._offset=e._offset),g(e._pf)||(t._pf=h(e)),g(e._locale)||(t._locale=e._locale),yr.length>0)for(n in yr)r=yr[n],i=e[r],g(i)||(t[r]=i);return t}function m(e){v(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),xr===!1&&(xr=!0,t.updateOffset(this),xr=!1)}function y(t){return t instanceof m||null!=t&&null!=t._isAMomentObject}function x(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function _(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=x(e)),n}function b(t,e,n){var r,i=Math.min(t.length,e.length),a=Math.abs(t.length-e.length),o=0;for(r=0;r<i;r++)(n&&t[r]!==e[r]||!n&&_(t[r])!==_(e[r]))&&o++;return o+a}function $(e){t.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function w(e,n){var r=!0;return c(function(){if(null!=t.deprecationHandler&&t.deprecationHandler(null,e),r){for(var i,a=[],o=0;o<arguments.length;o++){if(i="","object"==typeof arguments[o]){i+="\n["+o+"] ";for(var s in arguments[0])i+=s+": "+arguments[0][s]+", ";i=i.slice(0,-2)}else i=arguments[o];a.push(i)}$(e+"\nArguments: "+Array.prototype.slice.call(a).join("")+"\n"+(new Error).stack),r=!1}return n.apply(this,arguments)},n)}function S(e,n){null!=t.deprecationHandler&&t.deprecationHandler(e,n),_r[e]||($(n),_r[e]=!0)}function T(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function A(t){var e,n;for(n in t)e=t[n],T(e)?this[n]=e:this["_"+n]=e;this._config=t,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function C(t,e){var n,i=c({},t);for(n in e)u(e,n)&&(r(t[n])&&r(e[n])?(i[n]={},c(i[n],t[n]),c(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)u(t,n)&&!u(e,n)&&r(t[n])&&(i[n]=c({},i[n]));return i}function E(t){null!=t&&this.set(t)}function M(t,e,n){var r=this._calendar[t]||this._calendar.sameElse;return T(r)?r.call(e,n):r}function k(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function P(){return this._invalidDate}function O(t){return this._ordinal.replace("%d",t)}function L(t,e,n,r){var i=this._relativeTime[n];return T(i)?i(t,e,n,r):i.replace(/%d/i,t)}function D(t,e){var n=this._relativeTime[t>0?"future":"past"];return T(n)?n(e):n.replace(/%s/i,e)}function V(t,e){var n=t.toLowerCase();kr[n]=kr[n+"s"]=kr[e]=t}function R(t){return"string"==typeof t?kr[t]||kr[t.toLowerCase()]:void 0}function I(t){var e,n,r={};for(n in t)u(t,n)&&(e=R(n),e&&(r[e]=t[n]));return r}function N(t,e){Pr[t]=e}function j(t){var e=[];for(var n in t)e.push({unit:n,priority:Pr[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function F(e,n){return function(r){return null!=r?(H(this,e,r),t.updateOffset(this,n),this):G(this,e)}}function G(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function H(t,e,n){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](n)}function z(t){return t=R(t),T(this[t])?this[t]():this}function U(t,e){if("object"==typeof t){t=I(t);for(var n=j(t),r=0;r<n.length;r++)this[n[r].unit](t[n[r].unit])}else if(t=R(t),T(this[t]))return this[t](e);return this}function B(t,e,n){var r=""+Math.abs(t),i=e-r.length,a=t>=0;return(a?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+r}function q(t,e,n,r){var i=r;"string"==typeof r&&(i=function(){return this[r]()}),t&&(Vr[t]=i),e&&(Vr[e[0]]=function(){return B(i.apply(this,arguments),e[1],e[2])}),n&&(Vr[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),t)})}function Y(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function W(t){var e,n,r=t.match(Or);for(e=0,n=r.length;e<n;e++)Vr[r[e]]?r[e]=Vr[r[e]]:r[e]=Y(r[e]);return function(e){var i,a="";for(i=0;i<n;i++)a+=r[i]instanceof Function?r[i].call(e,t):r[i];return a}}function X(t,e){return t.isValid()?(e=Q(e,t.localeData()),Dr[e]=Dr[e]||W(e),Dr[e](t)):t.localeData().invalidDate()}function Q(t,e){function n(t){return e.longDateFormat(t)||t}var r=5;for(Lr.lastIndex=0;r>=0&&Lr.test(t);)t=t.replace(Lr,n),Lr.lastIndex=0,r-=1;return t}function Z(t,e,n){Kr[t]=T(e)?e:function(t,r){return t&&n?n:e}}function J(t,e){return u(Kr,t)?Kr[t](e._strict,e._locale):new RegExp(K(t))}function K(t){return tt(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,r,i){return e||n||r||i}))}function tt(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function et(t,e){var n,r=e;for("string"==typeof t&&(t=[t]),a(e)&&(r=function(t,n){n[e]=_(t)}),n=0;n<t.length;n++)ti[t[n]]=r}function nt(t,e){et(t,function(t,n,r,i){r._w=r._w||{},e(t,r._w,r,i)})}function rt(t,e,n){null!=e&&u(ti,t)&&ti[t](e,n._a,n,t)}function it(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function at(t,e){return t?n(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||fi).test(e)?"format":"standalone"][t.month()]:this._months}function ot(t,e){return t?n(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[fi.test(e)?"format":"standalone"][t.month()]:this._monthsShort}function st(t,e,n){var r,i,a,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)a=l([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(a,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(a,"").toLocaleLowerCase();return n?"MMM"===e?(i=li.call(this._shortMonthsParse,o),i!==-1?i:null):(i=li.call(this._longMonthsParse,o),i!==-1?i:null):"MMM"===e?(i=li.call(this._shortMonthsParse,o),i!==-1?i:(i=li.call(this._longMonthsParse,o),i!==-1?i:null)):(i=li.call(this._longMonthsParse,o),i!==-1?i:(i=li.call(this._shortMonthsParse,o),i!==-1?i:null))}function ut(t,e,n){var r,i,a;if(this._monthsParseExact)return st.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(i=l([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(a="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(a.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[r].test(t))return r;if(n&&"MMM"===e&&this._shortMonthsParse[r].test(t))return r;if(!n&&this._monthsParse[r].test(t))return r}}function ct(t,e){var n;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=_(e);else if(e=t.localeData().monthsParse(e),!a(e))return t;return n=Math.min(t.date(),it(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n),t}function lt(e){return null!=e?(ct(this,e),t.updateOffset(this,!0),this):G(this,"Month")}function ft(){return it(this.year(),this.month())}function ht(t){return this._monthsParseExact?(u(this,"_monthsRegex")||pt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(u(this,"_monthsShortRegex")||(this._monthsShortRegex=pi),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)}function dt(t){return this._monthsParseExact?(u(this,"_monthsRegex")||pt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(u(this,"_monthsRegex")||(this._monthsRegex=gi),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)}function pt(){function t(t,e){return e.length-t.length}var e,n,r=[],i=[],a=[];for(e=0;e<12;e++)n=l([2e3,e]),r.push(this.monthsShort(n,"")),i.push(this.months(n,"")),a.push(this.months(n,"")),a.push(this.monthsShort(n,""));for(r.sort(t),i.sort(t),a.sort(t),e=0;e<12;e++)r[e]=tt(r[e]),i[e]=tt(i[e]);for(e=0;e<24;e++)a[e]=tt(a[e]);this._monthsRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+r.join("|")+")","i")}function gt(t){return vt(t)?366:365}function vt(t){return t%4===0&&t%100!==0||t%400===0}function mt(){return vt(this.year())}function yt(t,e,n,r,i,a,o){var s=new Date(t,e,n,r,i,a,o);return t<100&&t>=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function xt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function _t(t,e,n){var r=7+e-n,i=(7+xt(t,0,r).getUTCDay()-e)%7;return-i+r-1}function bt(t,e,n,r,i){var a,o,s=(7+n-r)%7,u=_t(t,r,i),c=1+7*(e-1)+s+u;return c<=0?(a=t-1,o=gt(a)+c):c>gt(t)?(a=t+1,o=c-gt(t)):(a=t,o=c),{year:a,dayOfYear:o}}function $t(t,e,n){var r,i,a=_t(t.year(),e,n),o=Math.floor((t.dayOfYear()-a-1)/7)+1;return o<1?(i=t.year()-1,r=o+wt(i,e,n)):o>wt(t.year(),e,n)?(r=o-wt(t.year(),e,n),i=t.year()+1):(i=t.year(),r=o),{week:r,year:i}}function wt(t,e,n){var r=_t(t,e,n),i=_t(t+1,e,n);return(gt(t)-r+i)/7}function St(t){return $t(t,this._week.dow,this._week.doy).week}function Tt(){return this._week.dow}function At(){return this._week.doy}function Ct(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Et(t){var e=$t(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Mt(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function kt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Pt(t,e){return t?n(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:this._weekdays}function Ot(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Lt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Dt(t,e,n){var r,i,a,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)a=l([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===e?(i=li.call(this._weekdaysParse,o),i!==-1?i:null):"ddd"===e?(i=li.call(this._shortWeekdaysParse,o),i!==-1?i:null):(i=li.call(this._minWeekdaysParse,o),i!==-1?i:null):"dddd"===e?(i=li.call(this._weekdaysParse,o),i!==-1?i:(i=li.call(this._shortWeekdaysParse,o),i!==-1?i:(i=li.call(this._minWeekdaysParse,o),i!==-1?i:null))):"ddd"===e?(i=li.call(this._shortWeekdaysParse,o),i!==-1?i:(i=li.call(this._weekdaysParse,o),i!==-1?i:(i=li.call(this._minWeekdaysParse,o),i!==-1?i:null))):(i=li.call(this._minWeekdaysParse,o),i!==-1?i:(i=li.call(this._weekdaysParse,o),i!==-1?i:(i=li.call(this._shortWeekdaysParse,o),i!==-1?i:null)))}function Vt(t,e,n){var r,i,a;if(this._weekdaysParseExact)return Dt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(i=l([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(i,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(i,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(i,"").replace(".",".?")+"$","i")),this._weekdaysParse[r]||(a="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[r]=new RegExp(a.replace(".",""),"i")),
n&&"dddd"===e&&this._fullWeekdaysParse[r].test(t))return r;if(n&&"ddd"===e&&this._shortWeekdaysParse[r].test(t))return r;if(n&&"dd"===e&&this._minWeekdaysParse[r].test(t))return r;if(!n&&this._weekdaysParse[r].test(t))return r}}function Rt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Mt(t,this.localeData()),this.add(t-e,"d")):e}function It(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Nt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=kt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function jt(t){return this._weekdaysParseExact?(u(this,"_weekdaysRegex")||Ht.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(u(this,"_weekdaysRegex")||(this._weekdaysRegex=bi),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ft(t){return this._weekdaysParseExact?(u(this,"_weekdaysRegex")||Ht.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(u(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=$i),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Gt(t){return this._weekdaysParseExact?(u(this,"_weekdaysRegex")||Ht.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(u(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=wi),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Ht(){function t(t,e){return e.length-t.length}var e,n,r,i,a,o=[],s=[],u=[],c=[];for(e=0;e<7;e++)n=l([2e3,1]).day(e),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),a=this.weekdays(n,""),o.push(r),s.push(i),u.push(a),c.push(r),c.push(i),c.push(a);for(o.sort(t),s.sort(t),u.sort(t),c.sort(t),e=0;e<7;e++)s[e]=tt(s[e]),u[e]=tt(u[e]),c[e]=tt(c[e]);this._weekdaysRegex=new RegExp("^("+c.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function zt(){return this.hours()%12||12}function Ut(){return this.hours()||24}function Bt(t,e){q(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Yt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Wt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Xt(t){return t?t.toLowerCase().replace("_","-"):t}function Qt(t){for(var e,n,r,i,a=0;a<t.length;){for(i=Xt(t[a]).split("-"),e=i.length,n=Xt(t[a+1]),n=n?n.split("-"):null;e>0;){if(r=Zt(i.slice(0,e).join("-")))return r;if(n&&n.length>=e&&b(i,n,!0)>=e-1)break;e--}a++}return null}function Zt(t){var e=null;if(!Ei[t]&&"undefined"!=typeof module&&module&&module.exports)try{e=Si._abbr,require("./locale/"+t),Jt(e)}catch(t){}return Ei[t]}function Jt(t,e){var n;return t&&(n=g(e)?ee(t):Kt(t,e),n&&(Si=n)),Si._abbr}function Kt(t,e){if(null!==e){var n=Ci;if(e.abbr=t,null!=Ei[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=Ei[t]._config;else if(null!=e.parentLocale){if(null==Ei[e.parentLocale])return Mi[e.parentLocale]||(Mi[e.parentLocale]=[]),Mi[e.parentLocale].push({name:t,config:e}),null;n=Ei[e.parentLocale]._config}return Ei[t]=new E(C(n,e)),Mi[t]&&Mi[t].forEach(function(t){Kt(t.name,t.config)}),Jt(t),Ei[t]}return delete Ei[t],null}function te(t,e){if(null!=e){var n,r=Ci;null!=Ei[t]&&(r=Ei[t]._config),e=C(r,e),n=new E(e),n.parentLocale=Ei[t],Ei[t]=n,Jt(t)}else null!=Ei[t]&&(null!=Ei[t].parentLocale?Ei[t]=Ei[t].parentLocale:null!=Ei[t]&&delete Ei[t]);return Ei[t]}function ee(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return Si;if(!n(t)){if(e=Zt(t))return e;t=[t]}return Qt(t)}function ne(){return wr(Ei)}function re(t){var e,n=t._a;return n&&h(t).overflow===-2&&(e=n[ni]<0||n[ni]>11?ni:n[ri]<1||n[ri]>it(n[ei],n[ni])?ri:n[ii]<0||n[ii]>24||24===n[ii]&&(0!==n[ai]||0!==n[oi]||0!==n[si])?ii:n[ai]<0||n[ai]>59?ai:n[oi]<0||n[oi]>59?oi:n[si]<0||n[si]>999?si:-1,h(t)._overflowDayOfYear&&(e<ei||e>ri)&&(e=ri),h(t)._overflowWeeks&&e===-1&&(e=ui),h(t)._overflowWeekday&&e===-1&&(e=ci),h(t).overflow=e),t}function ie(t){var e,n,r,i,a,o,s=t._i,u=ki.exec(s)||Pi.exec(s);if(u){for(h(t).iso=!0,e=0,n=Li.length;e<n;e++)if(Li[e][1].exec(u[1])){i=Li[e][0],r=Li[e][2]!==!1;break}if(null==i)return void(t._isValid=!1);if(u[3]){for(e=0,n=Di.length;e<n;e++)if(Di[e][1].exec(u[3])){a=(u[2]||" ")+Di[e][0];break}if(null==a)return void(t._isValid=!1)}if(!r&&null!=a)return void(t._isValid=!1);if(u[4]){if(!Oi.exec(u[4]))return void(t._isValid=!1);o="Z"}t._f=i+(a||"")+(o||""),le(t)}else t._isValid=!1}function ae(e){var n=Vi.exec(e._i);return null!==n?void(e._d=new Date((+n[1]))):(ie(e),void(e._isValid===!1&&(delete e._isValid,t.createFromInputFallback(e))))}function oe(t,e,n){return null!=t?t:null!=e?e:n}function se(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function ue(t){var e,n,r,i,a=[];if(!t._d){for(r=se(t),t._w&&null==t._a[ri]&&null==t._a[ni]&&ce(t),t._dayOfYear&&(i=oe(t._a[ei],r[ei]),t._dayOfYear>gt(i)&&(h(t)._overflowDayOfYear=!0),n=xt(i,0,t._dayOfYear),t._a[ni]=n.getUTCMonth(),t._a[ri]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=r[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[ii]&&0===t._a[ai]&&0===t._a[oi]&&0===t._a[si]&&(t._nextDay=!0,t._a[ii]=0),t._d=(t._useUTC?xt:yt).apply(null,a),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[ii]=24)}}function ce(t){var e,n,r,i,a,o,s,u;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)a=1,o=4,n=oe(e.GG,t._a[ei],$t(ye(),1,4).year),r=oe(e.W,1),i=oe(e.E,1),(i<1||i>7)&&(u=!0);else{a=t._locale._week.dow,o=t._locale._week.doy;var c=$t(ye(),a,o);n=oe(e.gg,t._a[ei],c.year),r=oe(e.w,c.week),null!=e.d?(i=e.d,(i<0||i>6)&&(u=!0)):null!=e.e?(i=e.e+a,(e.e<0||e.e>6)&&(u=!0)):i=a}r<1||r>wt(n,a,o)?h(t)._overflowWeeks=!0:null!=u?h(t)._overflowWeekday=!0:(s=bt(n,r,i,a,o),t._a[ei]=s.year,t._dayOfYear=s.dayOfYear)}function le(e){if(e._f===t.ISO_8601)return void ie(e);e._a=[],h(e).empty=!0;var n,r,i,a,o,s=""+e._i,u=s.length,c=0;for(i=Q(e._f,e._locale).match(Or)||[],n=0;n<i.length;n++)a=i[n],r=(s.match(J(a,e))||[])[0],r&&(o=s.substr(0,s.indexOf(r)),o.length>0&&h(e).unusedInput.push(o),s=s.slice(s.indexOf(r)+r.length),c+=r.length),Vr[a]?(r?h(e).empty=!1:h(e).unusedTokens.push(a),rt(a,r,e)):e._strict&&!r&&h(e).unusedTokens.push(a);h(e).charsLeftOver=u-c,s.length>0&&h(e).unusedInput.push(s),e._a[ii]<=12&&h(e).bigHour===!0&&e._a[ii]>0&&(h(e).bigHour=void 0),h(e).parsedDateParts=e._a.slice(0),h(e).meridiem=e._meridiem,e._a[ii]=fe(e._locale,e._a[ii],e._meridiem),ue(e),re(e)}function fe(t,e,n){var r;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(r=t.isPM(n),r&&e<12&&(e+=12),r||12!==e||(e=0),e):e}function he(t){var e,n,r,i,a;if(0===t._f.length)return h(t).invalidFormat=!0,void(t._d=new Date(NaN));for(i=0;i<t._f.length;i++)a=0,e=v({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[i],le(e),d(e)&&(a+=h(e).charsLeftOver,a+=10*h(e).unusedTokens.length,h(e).score=a,(null==r||a<r)&&(r=a,n=e));c(t,n||e)}function de(t){if(!t._d){var e=I(t._i);t._a=s([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),ue(t)}}function pe(t){var e=new m(re(ge(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function ge(t){var e=t._i,r=t._f;return t._locale=t._locale||ee(t._l),null===e||void 0===r&&""===e?p({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),y(e)?new m(re(e)):(o(e)?t._d=e:n(r)?he(t):r?le(t):ve(t),d(t)||(t._d=null),t))}function ve(e){var r=e._i;void 0===r?e._d=new Date(t.now()):o(r)?e._d=new Date(r.valueOf()):"string"==typeof r?ae(e):n(r)?(e._a=s(r.slice(0),function(t){return parseInt(t,10)}),ue(e)):"object"==typeof r?de(e):a(r)?e._d=new Date(r):t.createFromInputFallback(e)}function me(t,e,a,o,s){var u={};return a!==!0&&a!==!1||(o=a,a=void 0),(r(t)&&i(t)||n(t)&&0===t.length)&&(t=void 0),u._isAMomentObject=!0,u._useUTC=u._isUTC=s,u._l=a,u._i=t,u._f=e,u._strict=o,pe(u)}function ye(t,e,n,r){return me(t,e,n,r,!1)}function xe(t,e){var r,i;if(1===e.length&&n(e[0])&&(e=e[0]),!e.length)return ye();for(r=e[0],i=1;i<e.length;++i)e[i].isValid()&&!e[i][t](r)||(r=e[i]);return r}function _e(){var t=[].slice.call(arguments,0);return xe("isBefore",t)}function be(){var t=[].slice.call(arguments,0);return xe("isAfter",t)}function $e(t){var e=I(t),n=e.year||0,r=e.quarter||0,i=e.month||0,a=e.week||0,o=e.day||0,s=e.hour||0,u=e.minute||0,c=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*c+6e4*u+1e3*s*60*60,this._days=+o+7*a,this._months=+i+3*r+12*n,this._data={},this._locale=ee(),this._bubble()}function we(t){return t instanceof $e}function Se(t){return t<0?Math.round(-1*t)*-1:Math.round(t)}function Te(t,e){q(t,0,0,function(){var t=this.utcOffset(),n="+";return t<0&&(t=-t,n="-"),n+B(~~(t/60),2)+e+B(~~t%60,2)})}function Ae(t,e){var n=(e||"").match(t);if(null===n)return null;var r=n[n.length-1]||[],i=(r+"").match(ji)||["-",0,0],a=+(60*i[1])+_(i[2]);return 0===a?0:"+"===i[0]?a:-a}function Ce(e,n){var r,i;return n._isUTC?(r=n.clone(),i=(y(e)||o(e)?e.valueOf():ye(e).valueOf())-r.valueOf(),r._d.setTime(r._d.valueOf()+i),t.updateOffset(r,!1),r):ye(e).local()}function Ee(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Me(e,n){var r,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null!=e){if("string"==typeof e){if(e=Ae(Qr,e),null===e)return this}else Math.abs(e)<16&&(e=60*e);return!this._isUTC&&n&&(r=Ee(this)),this._offset=e,this._isUTC=!0,null!=r&&this.add(r,"m"),i!==e&&(!n||this._changeInProgress?Be(this,Fe(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,t.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?i:Ee(this)}function ke(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function Pe(t){return this.utcOffset(0,t)}function Oe(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ee(this),"m")),this}function Le(){if(null!=this._tzm)this.utcOffset(this._tzm);else if("string"==typeof this._i){var t=Ae(Xr,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this}function De(t){return!!this.isValid()&&(t=t?ye(t).utcOffset():0,(this.utcOffset()-t)%60===0)}function Ve(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Re(){if(!g(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),t=ge(t),t._a){var e=t._isUTC?l(t._a):ye(t._a);this._isDSTShifted=this.isValid()&&b(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Ie(){return!!this.isValid()&&!this._isUTC}function Ne(){return!!this.isValid()&&this._isUTC}function je(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Fe(t,e){var n,r,i,o=t,s=null;return we(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:a(t)?(o={},e?o[e]=t:o.milliseconds=t):(s=Fi.exec(t))?(n="-"===s[1]?-1:1,o={y:0,d:_(s[ri])*n,h:_(s[ii])*n,m:_(s[ai])*n,s:_(s[oi])*n,ms:_(Se(1e3*s[si]))*n}):(s=Gi.exec(t))?(n="-"===s[1]?-1:1,o={y:Ge(s[2],n),M:Ge(s[3],n),w:Ge(s[4],n),d:Ge(s[5],n),h:Ge(s[6],n),m:Ge(s[7],n),s:Ge(s[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(i=ze(ye(o.from),ye(o.to)),o={},o.ms=i.milliseconds,o.M=i.months),r=new $e(o),we(t)&&u(t,"_locale")&&(r._locale=t._locale),r}function Ge(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function He(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function ze(t,e){var n;return t.isValid()&&e.isValid()?(e=Ce(e,t),t.isBefore(e)?n=He(t,e):(n=He(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function Ue(t,e){return function(n,r){var i,a;return null===r||isNaN(+r)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),a=n,n=r,r=a),n="string"==typeof n?+n:n,i=Fe(n,r),Be(this,i,t),this}}function Be(e,n,r,i){var a=n._milliseconds,o=Se(n._days),s=Se(n._months);e.isValid()&&(i=null==i||i,a&&e._d.setTime(e._d.valueOf()+a*r),o&&H(e,"Date",G(e,"Date")+o*r),s&&ct(e,G(e,"Month")+s*r),i&&t.updateOffset(e,o||s))}function qe(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function Ye(e,n){var r=e||ye(),i=Ce(r,this).startOf("day"),a=t.calendarFormat(this,i)||"sameElse",o=n&&(T(n[a])?n[a].call(this,r):n[a]);return this.format(o||this.localeData().calendar(a,this,ye(r)))}function We(){return new m(this)}function Xe(t,e){var n=y(t)?t:ye(t);return!(!this.isValid()||!n.isValid())&&(e=R(g(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(e).valueOf())}function Qe(t,e){var n=y(t)?t:ye(t);return!(!this.isValid()||!n.isValid())&&(e=R(g(e)?"millisecond":e),"millisecond"===e?this.valueOf()<n.valueOf():this.clone().endOf(e).valueOf()<n.valueOf())}function Ze(t,e,n,r){return r=r||"()",("("===r[0]?this.isAfter(t,n):!this.isBefore(t,n))&&(")"===r[1]?this.isBefore(e,n):!this.isAfter(e,n))}function Je(t,e){var n,r=y(t)?t:ye(t);return!(!this.isValid()||!r.isValid())&&(e=R(e||"millisecond"),"millisecond"===e?this.valueOf()===r.valueOf():(n=r.valueOf(),this.clone().startOf(e).valueOf()<=n&&n<=this.clone().endOf(e).valueOf()))}function Ke(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function tn(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function en(t,e,n){var r,i,a,o;return this.isValid()?(r=Ce(t,this),r.isValid()?(i=6e4*(r.utcOffset()-this.utcOffset()),e=R(e),"year"===e||"month"===e||"quarter"===e?(o=nn(this,r),"quarter"===e?o/=3:"year"===e&&(o/=12)):(a=this-r,o="second"===e?a/1e3:"minute"===e?a/6e4:"hour"===e?a/36e5:"day"===e?(a-i)/864e5:"week"===e?(a-i)/6048e5:a),n?o:x(o)):NaN):NaN}function nn(t,e){var n,r,i=12*(e.year()-t.year())+(e.month()-t.month()),a=t.clone().add(i,"months");return e-a<0?(n=t.clone().add(i-1,"months"),r=(e-a)/(a-n)):(n=t.clone().add(i+1,"months"),r=(e-a)/(n-a)),-(i+r)||0}function rn(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function an(){var t=this.clone().utc();return 0<t.year()&&t.year()<=9999?T(Date.prototype.toISOString)?this.toDate().toISOString():X(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):X(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function on(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',r=0<this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i="-MM-DD[T]HH:mm:ss.SSS",a=e+'[")]';return this.format(n+r+i+a)}function sn(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=X(this,e);return this.localeData().postformat(n)}function un(t,e){return this.isValid()&&(y(t)&&t.isValid()||ye(t).isValid())?Fe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function cn(t){return this.from(ye(),t)}function ln(t,e){return this.isValid()&&(y(t)&&t.isValid()||ye(t).isValid())?Fe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function fn(t){return this.to(ye(),t)}function hn(t){var e;return void 0===t?this._locale._abbr:(e=ee(t),null!=e&&(this._locale=e),this)}function dn(){return this._locale}function pn(t){switch(t=R(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function gn(t){return t=R(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function vn(){return this._d.valueOf()-6e4*(this._offset||0)}function mn(){return Math.floor(this.valueOf()/1e3)}function yn(){return new Date(this.valueOf())}function xn(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function _n(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function bn(){return this.isValid()?this.toISOString():null}function $n(){return d(this)}function wn(){return c({},h(this))}function Sn(){return h(this).overflow}function Tn(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function An(t,e){q(0,[t,t.length],0,e)}function Cn(t){return Pn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function En(t){return Pn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Mn(){return wt(this.year(),1,4)}function kn(){var t=this.localeData()._week;return wt(this.year(),t.dow,t.doy)}function Pn(t,e,n,r,i){var a;return null==t?$t(this,r,i).year:(a=wt(t,r,i),e>a&&(e=a),On.call(this,t,e,n,r,i))}function On(t,e,n,r,i){var a=bt(t,e,n,r,i),o=xt(a.year,0,a.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function Ln(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Dn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Vn(t,e){e[si]=_(1e3*("0."+t))}function Rn(){return this._isUTC?"UTC":""}function In(){return this._isUTC?"Coordinated Universal Time":""}function Nn(t){return ye(1e3*t)}function jn(){return ye.apply(null,arguments).parseZone()}function Fn(t){return t}function Gn(t,e,n,r){var i=ee(),a=l().set(r,e);return i[n](a,t)}function Hn(t,e,n){if(a(t)&&(e=t,t=void 0),t=t||"",null!=e)return Gn(t,e,n,"month");var r,i=[];for(r=0;r<12;r++)i[r]=Gn(t,r,n,"month");return i}function zn(t,e,n,r){"boolean"==typeof t?(a(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,a(e)&&(n=e,e=void 0),e=e||"");var i=ee(),o=t?i._week.dow:0;if(null!=n)return Gn(e,(n+o)%7,r,"day");var s,u=[];for(s=0;s<7;s++)u[s]=Gn(e,(s+o)%7,r,"day");return u}function Un(t,e){return Hn(t,e,"months")}function Bn(t,e){return Hn(t,e,"monthsShort")}function qn(t,e,n){return zn(t,e,n,"weekdays")}function Yn(t,e,n){return zn(t,e,n,"weekdaysShort")}function Wn(t,e,n){return zn(t,e,n,"weekdaysMin")}function Xn(){var t=this._data;return this._milliseconds=Ji(this._milliseconds),this._days=Ji(this._days),this._months=Ji(this._months),t.milliseconds=Ji(t.milliseconds),t.seconds=Ji(t.seconds),t.minutes=Ji(t.minutes),t.hours=Ji(t.hours),t.months=Ji(t.months),t.years=Ji(t.years),this}function Qn(t,e,n,r){var i=Fe(e,n);return t._milliseconds+=r*i._milliseconds,t._days+=r*i._days,t._months+=r*i._months,t._bubble()}function Zn(t,e){return Qn(this,t,e,1)}function Jn(t,e){return Qn(this,t,e,-1)}function Kn(t){return t<0?Math.floor(t):Math.ceil(t)}function tr(){var t,e,n,r,i,a=this._milliseconds,o=this._days,s=this._months,u=this._data;return a>=0&&o>=0&&s>=0||a<=0&&o<=0&&s<=0||(a+=864e5*Kn(nr(s)+o),o=0,s=0),u.milliseconds=a%1e3,t=x(a/1e3),u.seconds=t%60,e=x(t/60),u.minutes=e%60,n=x(e/60),u.hours=n%24,o+=x(n/24),i=x(er(o)),s+=i,o-=Kn(nr(i)),r=x(s/12),s%=12,u.days=o,u.months=s,u.years=r,this}function er(t){return 4800*t/146097}function nr(t){return 146097*t/4800}function rr(t){var e,n,r=this._milliseconds;if(t=R(t),"month"===t||"year"===t)return e=this._days+r/864e5,n=this._months+er(e),"month"===t?n:n/12;switch(e=this._days+Math.round(nr(this._months)),t){case"week":return e/7+r/6048e5;case"day":return e+r/864e5;case"hour":return 24*e+r/36e5;case"minute":return 1440*e+r/6e4;case"second":return 86400*e+r/1e3;case"millisecond":return Math.floor(864e5*e)+r;default:throw new Error("Unknown unit "+t)}}function ir(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12)}function ar(t){return function(){return this.as(t)}}function or(t){return t=R(t),this[t+"s"]()}function sr(t){return function(){return this._data[t]}}function ur(){return x(this.days()/7)}function cr(t,e,n,r,i){return i.relativeTime(e||1,!!n,t,r)}function lr(t,e,n){var r=Fe(t).abs(),i=pa(r.as("s")),a=pa(r.as("m")),o=pa(r.as("h")),s=pa(r.as("d")),u=pa(r.as("M")),c=pa(r.as("y")),l=i<ga.s&&["s",i]||a<=1&&["m"]||a<ga.m&&["mm",a]||o<=1&&["h"]||o<ga.h&&["hh",o]||s<=1&&["d"]||s<ga.d&&["dd",s]||u<=1&&["M"]||u<ga.M&&["MM",u]||c<=1&&["y"]||["yy",c];return l[2]=e,l[3]=+t>0,l[4]=n,cr.apply(null,l)}function fr(t){return void 0===t?pa:"function"==typeof t&&(pa=t,!0)}function hr(t,e){return void 0!==ga[t]&&(void 0===e?ga[t]:(ga[t]=e,!0))}function dr(t){var e=this.localeData(),n=lr(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function pr(){var t,e,n,r=va(this._milliseconds)/1e3,i=va(this._days),a=va(this._months);t=x(r/60),e=x(t/60),r%=60,t%=60,n=x(a/12),a%=12;var o=n,s=a,u=i,c=e,l=t,f=r,h=this.asSeconds();return h?(h<0?"-":"")+"P"+(o?o+"Y":"")+(s?s+"M":"")+(u?u+"D":"")+(c||l||f?"T":"")+(c?c+"H":"")+(l?l+"M":"")+(f?f+"S":""):"P0D"}var gr,vr;vr=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,r=0;r<n;r++)if(r in e&&t.call(this,e[r],r,e))return!0;return!1};var mr=vr,yr=t.momentProperties=[],xr=!1,_r={};t.suppressDeprecationWarnings=!1,t.deprecationHandler=null;var br;br=Object.keys?Object.keys:function(t){var e,n=[];for(e in t)u(t,e)&&n.push(e);return n};var $r,wr=br,Sr={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Tr={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Ar="Invalid date",Cr="%d",Er=/\d{1,2}/,Mr={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},kr={},Pr={},Or=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Lr=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Dr={},Vr={},Rr=/\d/,Ir=/\d\d/,Nr=/\d{3}/,jr=/\d{4}/,Fr=/[+-]?\d{6}/,Gr=/\d\d?/,Hr=/\d\d\d\d?/,zr=/\d\d\d\d\d\d?/,Ur=/\d{1,3}/,Br=/\d{1,4}/,qr=/[+-]?\d{1,6}/,Yr=/\d+/,Wr=/[+-]?\d+/,Xr=/Z|[+-]\d\d:?\d\d/gi,Qr=/Z|[+-]\d\d(?::?\d\d)?/gi,Zr=/[+-]?\d+(\.\d{1,3})?/,Jr=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Kr={},ti={},ei=0,ni=1,ri=2,ii=3,ai=4,oi=5,si=6,ui=7,ci=8;$r=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1};var li=$r;q("M",["MM",2],"Mo",function(){return this.month()+1}),q("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),q("MMMM",0,0,function(t){return this.localeData().months(this,t)}),V("month","M"),N("month",8),Z("M",Gr),Z("MM",Gr,Ir),Z("MMM",function(t,e){return e.monthsShortRegex(t)}),Z("MMMM",function(t,e){return e.monthsRegex(t)}),et(["M","MM"],function(t,e){e[ni]=_(t)-1}),et(["MMM","MMMM"],function(t,e,n,r){var i=n._locale.monthsParse(t,r,n._strict);null!=i?e[ni]=i:h(n).invalidMonth=t});var fi=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,hi="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),di="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),pi=Jr,gi=Jr;q("Y",0,0,function(){var t=this.year();return t<=9999?""+t:"+"+t}),q(0,["YY",2],0,function(){return this.year()%100}),q(0,["YYYY",4],0,"year"),q(0,["YYYYY",5],0,"year"),q(0,["YYYYYY",6,!0],0,"year"),V("year","y"),N("year",1),Z("Y",Wr),Z("YY",Gr,Ir),Z("YYYY",Br,jr),Z("YYYYY",qr,Fr),Z("YYYYYY",qr,Fr),et(["YYYYY","YYYYYY"],ei),et("YYYY",function(e,n){n[ei]=2===e.length?t.parseTwoDigitYear(e):_(e)}),et("YY",function(e,n){n[ei]=t.parseTwoDigitYear(e)}),et("Y",function(t,e){e[ei]=parseInt(t,10)}),t.parseTwoDigitYear=function(t){return _(t)+(_(t)>68?1900:2e3)};var vi=F("FullYear",!0);q("w",["ww",2],"wo","week"),q("W",["WW",2],"Wo","isoWeek"),V("week","w"),V("isoWeek","W"),N("week",5),N("isoWeek",5),Z("w",Gr),Z("ww",Gr,Ir),Z("W",Gr),Z("WW",Gr,Ir),nt(["w","ww","W","WW"],function(t,e,n,r){e[r.substr(0,1)]=_(t)});var mi={dow:0,doy:6};q("d",0,"do","day"),q("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),q("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),q("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),q("e",0,0,"weekday"),q("E",0,0,"isoWeekday"),V("day","d"),V("weekday","e"),V("isoWeekday","E"),N("day",11),N("weekday",11),N("isoWeekday",11),Z("d",Gr),Z("e",Gr),Z("E",Gr),Z("dd",function(t,e){return e.weekdaysMinRegex(t)}),Z("ddd",function(t,e){return e.weekdaysShortRegex(t)}),Z("dddd",function(t,e){return e.weekdaysRegex(t)}),nt(["dd","ddd","dddd"],function(t,e,n,r){var i=n._locale.weekdaysParse(t,r,n._strict);null!=i?e.d=i:h(n).invalidWeekday=t}),nt(["d","e","E"],function(t,e,n,r){e[r]=_(t)});var yi="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),xi="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),_i="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),bi=Jr,$i=Jr,wi=Jr;q("H",["HH",2],0,"hour"),q("h",["hh",2],0,zt),q("k",["kk",2],0,Ut),q("hmm",0,0,function(){return""+zt.apply(this)+B(this.minutes(),2)}),q("hmmss",0,0,function(){return""+zt.apply(this)+B(this.minutes(),2)+B(this.seconds(),2)}),q("Hmm",0,0,function(){return""+this.hours()+B(this.minutes(),2)}),q("Hmmss",0,0,function(){return""+this.hours()+B(this.minutes(),2)+B(this.seconds(),2)}),Bt("a",!0),Bt("A",!1),V("hour","h"),N("hour",13),Z("a",qt),Z("A",qt),Z("H",Gr),Z("h",Gr),Z("HH",Gr,Ir),Z("hh",Gr,Ir),Z("hmm",Hr),Z("hmmss",zr),Z("Hmm",Hr),Z("Hmmss",zr),et(["H","HH"],ii),et(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),et(["h","hh"],function(t,e,n){e[ii]=_(t),h(n).bigHour=!0}),et("hmm",function(t,e,n){var r=t.length-2;e[ii]=_(t.substr(0,r)),e[ai]=_(t.substr(r)),h(n).bigHour=!0}),et("hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[ii]=_(t.substr(0,r)),e[ai]=_(t.substr(r,2)),e[oi]=_(t.substr(i)),h(n).bigHour=!0}),et("Hmm",function(t,e,n){var r=t.length-2;e[ii]=_(t.substr(0,r)),e[ai]=_(t.substr(r))}),et("Hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[ii]=_(t.substr(0,r)),e[ai]=_(t.substr(r,2)),e[oi]=_(t.substr(i))});var Si,Ti=/[ap]\.?m?\.?/i,Ai=F("Hours",!0),Ci={calendar:Sr,longDateFormat:Tr,invalidDate:Ar,ordinal:Cr,ordinalParse:Er,relativeTime:Mr,months:hi,monthsShort:di,week:mi,weekdays:yi,weekdaysMin:_i,weekdaysShort:xi,meridiemParse:Ti},Ei={},Mi={},ki=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Pi=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Oi=/Z|[+-]\d\d(?::?\d\d)?/,Li=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Di=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Vi=/^\/?Date\((\-?\d+)/i;t.createFromInputFallback=w("value provided is not in a recognized ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),t.ISO_8601=function(){};var Ri=w("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=ye.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:p()}),Ii=w("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=ye.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:p()}),Ni=function(){return Date.now?Date.now():+new Date};Te("Z",":"),Te("ZZ",""),Z("Z",Qr),Z("ZZ",Qr),et(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Ae(Qr,t)});var ji=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var Fi=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Gi=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Fe.fn=$e.prototype;var Hi=Ue(1,"add"),zi=Ue(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Ui=w("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});q(0,["gg",2],0,function(){return this.weekYear()%100}),q(0,["GG",2],0,function(){return this.isoWeekYear()%100}),An("gggg","weekYear"),An("ggggg","weekYear"),An("GGGG","isoWeekYear"),An("GGGGG","isoWeekYear"),V("weekYear","gg"),V("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),Z("G",Wr),Z("g",Wr),Z("GG",Gr,Ir),Z("gg",Gr,Ir),Z("GGGG",Br,jr),Z("gggg",Br,jr),Z("GGGGG",qr,Fr),Z("ggggg",qr,Fr),nt(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,r){e[r.substr(0,2)]=_(t)}),nt(["gg","GG"],function(e,n,r,i){n[i]=t.parseTwoDigitYear(e)}),q("Q",0,"Qo","quarter"),V("quarter","Q"),N("quarter",7),Z("Q",Rr),et("Q",function(t,e){e[ni]=3*(_(t)-1)}),q("D",["DD",2],"Do","date"),V("date","D"),N("date",9),Z("D",Gr),Z("DD",Gr,Ir),Z("Do",function(t,e){return t?e._ordinalParse:e._ordinalParseLenient}),et(["D","DD"],ri),et("Do",function(t,e){e[ri]=_(t.match(Gr)[0],10)});var Bi=F("Date",!0);q("DDD",["DDDD",3],"DDDo","dayOfYear"),V("dayOfYear","DDD"),N("dayOfYear",4),Z("DDD",Ur),Z("DDDD",Nr),et(["DDD","DDDD"],function(t,e,n){n._dayOfYear=_(t)}),q("m",["mm",2],0,"minute"),V("minute","m"),N("minute",14),Z("m",Gr),Z("mm",Gr,Ir),et(["m","mm"],ai);var qi=F("Minutes",!1);q("s",["ss",2],0,"second"),V("second","s"),N("second",15),Z("s",Gr),Z("ss",Gr,Ir),et(["s","ss"],oi);var Yi=F("Seconds",!1);q("S",0,0,function(){return~~(this.millisecond()/100)}),q(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),q(0,["SSS",3],0,"millisecond"),q(0,["SSSS",4],0,function(){return 10*this.millisecond()}),q(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),q(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),q(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),q(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),q(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),V("millisecond","ms"),N("millisecond",16),Z("S",Ur,Rr),Z("SS",Ur,Ir),Z("SSS",Ur,Nr);var Wi;for(Wi="SSSS";Wi.length<=9;Wi+="S")Z(Wi,Yr);for(Wi="S";Wi.length<=9;Wi+="S")et(Wi,Vn);var Xi=F("Milliseconds",!1);q("z",0,0,"zoneAbbr"),q("zz",0,0,"zoneName");var Qi=m.prototype;Qi.add=Hi,Qi.calendar=Ye,Qi.clone=We,Qi.diff=en,Qi.endOf=gn,Qi.format=sn,Qi.from=un,
Qi.fromNow=cn,Qi.to=ln,Qi.toNow=fn,Qi.get=z,Qi.invalidAt=Sn,Qi.isAfter=Xe,Qi.isBefore=Qe,Qi.isBetween=Ze,Qi.isSame=Je,Qi.isSameOrAfter=Ke,Qi.isSameOrBefore=tn,Qi.isValid=$n,Qi.lang=Ui,Qi.locale=hn,Qi.localeData=dn,Qi.max=Ii,Qi.min=Ri,Qi.parsingFlags=wn,Qi.set=U,Qi.startOf=pn,Qi.subtract=zi,Qi.toArray=xn,Qi.toObject=_n,Qi.toDate=yn,Qi.toISOString=an,Qi.inspect=on,Qi.toJSON=bn,Qi.toString=rn,Qi.unix=mn,Qi.valueOf=vn,Qi.creationData=Tn,Qi.year=vi,Qi.isLeapYear=mt,Qi.weekYear=Cn,Qi.isoWeekYear=En,Qi.quarter=Qi.quarters=Ln,Qi.month=lt,Qi.daysInMonth=ft,Qi.week=Qi.weeks=Ct,Qi.isoWeek=Qi.isoWeeks=Et,Qi.weeksInYear=kn,Qi.isoWeeksInYear=Mn,Qi.date=Bi,Qi.day=Qi.days=Rt,Qi.weekday=It,Qi.isoWeekday=Nt,Qi.dayOfYear=Dn,Qi.hour=Qi.hours=Ai,Qi.minute=Qi.minutes=qi,Qi.second=Qi.seconds=Yi,Qi.millisecond=Qi.milliseconds=Xi,Qi.utcOffset=Me,Qi.utc=Pe,Qi.local=Oe,Qi.parseZone=Le,Qi.hasAlignedHourOffset=De,Qi.isDST=Ve,Qi.isLocal=Ie,Qi.isUtcOffset=Ne,Qi.isUtc=je,Qi.isUTC=je,Qi.zoneAbbr=Rn,Qi.zoneName=In,Qi.dates=w("dates accessor is deprecated. Use date instead.",Bi),Qi.months=w("months accessor is deprecated. Use month instead",lt),Qi.years=w("years accessor is deprecated. Use year instead",vi),Qi.zone=w("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",ke),Qi.isDSTShifted=w("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Re);var Zi=E.prototype;Zi.calendar=M,Zi.longDateFormat=k,Zi.invalidDate=P,Zi.ordinal=O,Zi.preparse=Fn,Zi.postformat=Fn,Zi.relativeTime=L,Zi.pastFuture=D,Zi.set=A,Zi.months=at,Zi.monthsShort=ot,Zi.monthsParse=ut,Zi.monthsRegex=dt,Zi.monthsShortRegex=ht,Zi.week=St,Zi.firstDayOfYear=At,Zi.firstDayOfWeek=Tt,Zi.weekdays=Pt,Zi.weekdaysMin=Lt,Zi.weekdaysShort=Ot,Zi.weekdaysParse=Vt,Zi.weekdaysRegex=jt,Zi.weekdaysShortRegex=Ft,Zi.weekdaysMinRegex=Gt,Zi.isPM=Yt,Zi.meridiem=Wt,Jt("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=w("moment.lang is deprecated. Use moment.locale instead.",Jt),t.langData=w("moment.langData is deprecated. Use moment.localeData instead.",ee);var Ji=Math.abs,Ki=ar("ms"),ta=ar("s"),ea=ar("m"),na=ar("h"),ra=ar("d"),ia=ar("w"),aa=ar("M"),oa=ar("y"),sa=sr("milliseconds"),ua=sr("seconds"),ca=sr("minutes"),la=sr("hours"),fa=sr("days"),ha=sr("months"),da=sr("years"),pa=Math.round,ga={s:45,m:45,h:22,d:26,M:11},va=Math.abs,ma=$e.prototype;return ma.abs=Xn,ma.add=Zn,ma.subtract=Jn,ma.as=rr,ma.asMilliseconds=Ki,ma.asSeconds=ta,ma.asMinutes=ea,ma.asHours=na,ma.asDays=ra,ma.asWeeks=ia,ma.asMonths=aa,ma.asYears=oa,ma.valueOf=ir,ma._bubble=tr,ma.get=or,ma.milliseconds=sa,ma.seconds=ua,ma.minutes=ca,ma.hours=la,ma.days=fa,ma.weeks=ur,ma.months=ha,ma.years=da,ma.humanize=dr,ma.toISOString=pr,ma.toString=pr,ma.toJSON=pr,ma.locale=hn,ma.localeData=dn,ma.toIsoString=w("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",pr),ma.lang=Ui,q("X",0,0,"unix"),q("x",0,0,"valueOf"),Z("x",Wr),Z("X",Zr),et("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),et("x",function(t,e,n){n._d=new Date(_(t))}),t.version="2.17.1",e(ye),t.fn=Qi,t.min=_e,t.max=be,t.now=Ni,t.utc=l,t.unix=Nn,t.months=Un,t.isDate=o,t.locale=Jt,t.invalid=p,t.duration=Fe,t.isMoment=y,t.weekdays=qn,t.parseZone=jn,t.localeData=ee,t.isDuration=we,t.monthsShort=Bn,t.weekdaysMin=Wn,t.defineLocale=Kt,t.updateLocale=te,t.locales=ne,t.weekdaysShort=Yn,t.normalizeUnits=R,t.relativeTimeRounding=fr,t.relativeTimeThreshold=hr,t.calendarFormat=qe,t.prototype=Qi,t}),!function(t,e){"use strict";return"function"==typeof define&&define.amd?void define(["angular"],function(t){return e(t)}):e(t)}(window.angular||null,function(t){"use strict";var e=t.module("ngTable",[]);return function(){function e(e){function n(e,n){var a=e.charAt(0).toUpperCase()+e.substring(1),o={};return o["on"+a]=r(e),o["publish"+a]=i(e),t.extend(n,o)}function r(n){return function(r){var i=t.identity,o=e;if(2===arguments.length?t.isFunction(arguments[1].$new)?o=arguments[1]:i=arguments[1]:arguments.length>2&&(o=arguments[1],i=arguments[2]),t.isObject(i)){var s=i;i=function(t){return t===s}}return o.$on("ngTable:"+n,function(t,e){if(!e.isNullInstance){var n=a(arguments,2),o=[e].concat(n);i.apply(this,o)&&r.apply(this,o)}})}}function i(t){return function(){var n=["ngTable:"+t].concat(Array.prototype.slice.call(arguments));e.$broadcast.apply(e,n)}}function a(t,e){return Array.prototype.slice.call(t,null==e?1:e)}var o={};return o=n("afterCreated",o),o=n("afterReloadData",o),o=n("datasetChanged",o),o=n("pagesChanged",o)}t.module("ngTable").factory("ngTableEventsChannel",e),e.$inject=["$rootScope"]}(),function(){function e(){function e(){n()}function n(){a=o}function r(e){var n=t.extend({},a,e);n.aliasUrls=t.extend({},a.aliasUrls,e.aliasUrls),a=n}function i(){function e(t,e){return-1!==t.indexOf("/")?t:i.getUrlForAlias(t,e)}function n(t){return a.aliasUrls[t]||a.defaultBaseUrl+t+a.defaultExt}var r,i={config:r,getTemplateUrl:e,getUrlForAlias:n};return Object.defineProperty(i,"config",{get:function(){return r=r||t.copy(a)},enumerable:!0}),i}var a,o={defaultBaseUrl:"ng-table/filters/",defaultExt:".html",aliasUrls:{}};this.$get=i,this.resetConfigs=n,this.setConfig=r,e(),i.$inject=[]}t.module("ngTable").provider("ngTableFilterConfig",e),e.$inject=[]}(),function(){function e(){function t(t){function n(n,r){if(null==n)return[];var i=r.hasFilter()?t(e.filterFilterName)(n,r.filter(!0)):n,a=r.orderBy(),o=a.length?t(e.sortingFilterName)(i,a):i,s=o.slice((r.page()-1)*r.count(),r.page()*r.count());return r.total(o.length),s}return n}var e=this;e.$get=t,e.filterFilterName="filter",e.sortingFilterName="orderBy",t.$inject=["$filter"]}t.module("ngTable").provider("ngTableDefaultGetData",e),e.$inject=[]}(),function(){function e(t){function e(e){return function(){var n=t.defer(),r=e.apply(this,[n].concat(Array.prototype.slice.call(arguments)));return r||(r=n.promise),r}}return e}t.module("ngTable").factory("ngTableGetDataBcShim",e),e.$inject=["$q"]}(),e.value("ngTableDefaults",{params:{},settings:{}}),e.factory("NgTableParams",["$q","$log","ngTableDefaults","ngTableGetDataBcShim","ngTableDefaultGetData","ngTableEventsChannel",function(e,n,r,i,a,o){var s=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},u=function(u,c){function l(){var t=y.getDataFnAdaptor(y.getData);return e.when(t.call(y,p))}function f(){var t=y.getGroupsFnAdaptor(y.getGroups);return e.when(t.call(y,y.groupBy,p))}function h(t){var n=y.interceptors||[];return n.reduce(function(t,n){var r=n.response&&n.response.bind(n)||e.when,i=n.responseError&&n.responseError.bind(n)||e.reject;return t.then(function(t){return r(t,p)},function(t){return i(t,p)})},t())}"boolean"==typeof u&&(this.isNullInstance=!0);var d,p=this,g=!1,v=function(){y.debugMode&&n.debug&&n.debug.apply(this,arguments)};this.data=[],this.parameters=function(e,n){if(n=n||!1,t.isDefined(e)){for(var r in e){var i=e[r];if(n&&r.indexOf("[")>=0){for(var a=r.split(/\[(.*)\]/).reverse(),o="",u=0,c=a.length;c>u;u++){var l=a[u];if(""!==l){var f=i;i={},i[o=l]=s(f)?parseFloat(f):f}}"sorting"===o&&(m[o]={}),m[o]=t.extend(m[o]||{},i[o])}else m[r]=s(e[r])?parseFloat(e[r]):e[r]}return v("ngTable: set parameters",m),this}return m},this.settings=function(e){if(t.isDefined(e)){t.isArray(e.data)&&(e.total=e.data.length),e.getData&&e.getData.length>1&&(e.getDataFnAdaptor=i),e.getGroups&&e.getGroups.length>2&&(e.getGroupsFnAdaptor=i);var n=y.data;y=t.extend(y,e);var r=e.hasOwnProperty("data")&&e.data!=n;return r&&(g&&this.page(1),g=!1,o.publishDatasetChanged(this,e.data,n)),v("ngTable: set settings",y),this}return y},this.page=function(e){return t.isDefined(e)?this.parameters({page:e}):m.page},this.total=function(e){return t.isDefined(e)?this.settings({total:e}):y.total},this.count=function(e){return t.isDefined(e)?this.parameters({count:e,page:1}):m.count},this.filter=function(e){if(t.isDefined(e)&&t.isObject(e))return this.parameters({filter:e,page:1});if(e===!0){for(var n=Object.keys(m.filter),r={},i=0;i<n.length;i++){var a=m.filter[n[i]];null!=a&&""!==a&&(r[n[i]]=a)}return r}return m.filter},this.sorting=function(e){if(2==arguments.length){var n={};return n[e]=arguments[1],this.parameters({sorting:n}),this}return t.isDefined(e)?this.parameters({sorting:e}):m.sorting},this.isSortBy=function(e,n){return void 0!==n?t.isDefined(m.sorting[e])&&m.sorting[e]==n:t.isDefined(m.sorting[e])},this.orderBy=function(){var t=[];for(var e in m.sorting)t.push(("asc"===m.sorting[e]?"+":"-")+e);return t},this.getData=function(t){return a(this.data,t)},this.getGroups=function(e){return l().then(function(n){var r={};t.forEach(n,function(n){var i=t.isFunction(e)?e(n):n[e];r[i]=r[i]||{data:[]},r[i].value=i,r[i].data.push(n)});var i=[];for(var a in r)i.push(r[a]);return v("ngTable: refresh groups",i),i})},this.generatePagesArray=function(t,e,n,r){arguments.length||(t=this.page(),e=this.total(),n=this.count());var i,a,o,s,u;if(r=r&&6>r?6:r,u=[],s=Math.ceil(e/n),s>1){u.push({type:"prev",number:Math.max(1,t-1),active:t>1}),u.push({type:"first",number:1,active:t>1,current:1===t}),a=Math.round((y.paginationMaxBlocks-y.paginationMinBlocks)/2),o=Math.max(2,t-a),i=Math.min(s-1,t+2*a-(t-o)),o=Math.max(2,o-(2*a-(i-o)));for(var c=o;i>=c;)u.push(c===o&&2!==c||c===i&&c!==s-1?{type:"more",active:!1}:{type:"page",number:c,active:t!==c,current:t===c}),c++;u.push({type:"last",number:s,active:t!==s,current:t===s}),u.push({type:"next",number:Math.min(s,t+1),active:s>t})}return u},this.isDataReloadRequired=function(){return!g||!t.equals(m,d)},this.hasFilter=function(){return Object.keys(this.filter(!0)).length>0},this.hasFilterChanges=function(){return!t.equals(m&&m.filter,d&&d.filter)},this.url=function(e){e=e||!1;var n=e?[]:{};for(var r in m)if(m.hasOwnProperty(r)){var i=m[r],a=encodeURIComponent(r);if("object"==typeof i){for(var o in i)if(!t.isUndefined(i[o])&&""!==i[o]){var s=a+"["+encodeURIComponent(o)+"]";e?n.push(s+"="+i[o]):n[s]=i[o]}}else t.isFunction(i)||t.isUndefined(i)||""===i||(e?n.push(a+"="+encodeURIComponent(i)):n[a]=encodeURIComponent(i))}return n},this.reload=function(){var n=this,r=null;y.$loading=!0,d=t.copy(m),g=!0,r=h(y.groupBy?f:l),v("ngTable: reload data");var i=n.data;return r.then(function(t){return y.$loading=!1,n.data=t,o.publishAfterReloadData(n,t,i),n.reloadPages(),y.$scope&&y.$scope.$emit("ngTableAfterReloadData"),t}).catch(function(t){return d=null,g=!1,e.reject(t)})},this.reloadPages=function(){var e;return function(){var n=e,r=p.generatePagesArray(p.page(),p.total(),p.count());t.equals(n,r)||(e=r,o.publishPagesChanged(this,r,n))}}();var m={page:1,count:1,filter:{},sorting:{},group:{},groupBy:null};t.extend(m,r.params);var y={$scope:null,$loading:!1,data:null,total:0,defaultSort:"desc",filterDelay:750,counts:[10,25,50,100],interceptors:[],paginationMaxBlocks:11,paginationMinBlocks:5,sortingIndicator:"span",getDataFnAdaptor:t.identity,getGroupsFnAdaptor:t.identity,getGroups:this.getGroups,getData:this.getData};return this.settings(r.settings),this.settings(c),this.parameters(u,!0),o.publishAfterCreated(this),this};return u}]),e.factory("ngTableParams",["NgTableParams",function(t){return t}]),function(){function e(t,e){t.config=e}t.module("ngTable").controller("ngTableFilterRowController",e),e.$inject=["$scope","ngTableFilterConfig"]}(),function(){function e(t){function e(e,n){var r=e.sortable&&e.sortable();if(r){var i=t.params.settings().defaultSort,a="asc"===i?"desc":"asc",o=t.params.sorting()&&t.params.sorting()[r]&&t.params.sorting()[r]===i,s=n.ctrlKey||n.metaKey?t.params.sorting():{};s[r]=o?a:i,t.params.parameters({sorting:s})}}t.sortBy=e}t.module("ngTable").controller("ngTableSorterRowController",e),e.$inject=["$scope"]}(),e.controller("ngTableController",["$scope","NgTableParams","$timeout","$parse","$compile","$attrs","$element","ngTableColumn","ngTableEventsChannel",function(e,n,r,i,a,o,s,u,c){function l(t){if(t){e.params.settings().$scope=e;var n=e.params;if(n.hasFilterChanges()){var r=function(){n.page(1),n.reload()};n.settings().filterDelay?h(r,n.settings().filterDelay):r()}else n.reload()}}function f(){function t(t,n){t.settings().groupBy?e.$groups=n:e.$data=n}function n(t,n){e.pages=n}function r(t){return e.params===t}c.onAfterReloadData(t,e,r),c.onPagesChanged(n,e,r)}e.$filterRow={},e.$loading=!1,e.hasOwnProperty("params")||(e.params=new n((!0))),e.params.settings().$scope=e;var h=function(){var t=0;return function(e,n){r.cancel(t),t=r(e,n)}}();e.$watch("params",function(t,e){t!==e&&t&&t.reload()},!1),e.$watch("params.isDataReloadRequired()",l),this.compileDirectiveTemplates=function(){if(!s.hasClass("ng-table")){e.templates={header:o.templateHeader?o.templateHeader:"ng-table/header.html",pagination:o.templatePagination?o.templatePagination:"ng-table/pager.html"},s.addClass("ng-table");var n=null,r=!1;t.forEach(s.children(),function(t){"THEAD"===t.tagName&&(r=!0)}),r||(n=t.element(document.createElement("thead")).attr("ng-include","templates.header"),s.prepend(n));var i=t.element(document.createElement("div")).attr({"ng-table-pagination":"params","template-url":"templates.pagination"});s.after(i),n&&a(n)(e),a(i)(e)}},this.loadFilterData=function(n){t.forEach(n,function(n){var r;return r=n.filterData(e,{$column:n}),r?t.isObject(r)&&t.isObject(r.promise)?(delete n.filterData,r.promise.then(function(e){t.isArray(e)||t.isFunction(e)||t.isObject(e)?t.isArray(e)&&e.unshift({title:"",id:""}):e=[],n.data=e})):n.data=r:void delete n.filterData})},this.buildColumns=function(t){return t.map(function(t){return u.buildColumn(t,e)})},this.parseNgTableDynamicExpr=function(t){if(!t||t.indexOf(" with ")>-1){var e=t.split(/\s+with\s+/);return{tableParams:e[0],columns:e[1]}}throw new Error("Parse error (expected example: ng-table-dynamic='tableParams with cols')")},this.setupBindingsToInternalScope=function(n){var r=i(n);e.$watch(r,function(n){t.isUndefined(n)||(e.paramsModel=r,e.params=n)},!1),o.showFilter&&e.$parent.$watch(o.showFilter,function(t){e.show_filter=t}),o.disableFilter&&e.$parent.$watch(o.disableFilter,function(t){e.$filterRow.disabled=t})},f()}]),e.factory("ngTableColumn",[function(){function e(e,r){var i=Object.create(e);for(var a in n)void 0===i[a]&&(i[a]=n[a]),t.isFunction(i[a])||!function(t){i[t]=function(){return e[t]}}(a),function(t){var n=i[t];i[t]=function(){return 0===arguments.length?n.call(e,r):n.apply(e,arguments)}}(a);return i}var n={class:function(){return""},filter:function(){return!1},filterData:t.noop,headerTemplateURL:function(){return!1},headerTitle:function(){return""},sortable:function(){return!1},show:function(){return!0},title:function(){return""},titleAlt:function(){return""}};return{buildColumn:e}}]),e.directive("ngTable",["$q","$parse",function(e,n){return{restrict:"A",priority:1001,scope:!0,controller:"ngTableController",compile:function(e){var r=[],i=0,a=null;return t.forEach(t.element(e.find("tr")),function(e){e=t.element(e),e.hasClass("ng-table-group")||a||(a=e)}),a?(t.forEach(a.find("td"),function(e){var a=t.element(e);if(!a.attr("ignore-cell")||"true"!==a.attr("ignore-cell")){var o=function(t){return a.attr("x-data-"+t)||a.attr("data-"+t)||a.attr(t)},s=function(e){var i=o(e);return i?function(e,a){return n(i)(e,t.extend(a||{},{$columns:r}))}:void 0},u=o("title-alt")||o("title");u&&a.attr("data-title-text","{{"+u+"}}"),r.push({id:i++,title:s("title"),titleAlt:s("title-alt"),headerTitle:s("header-title"),sortable:s("sortable"),class:s("header-class"),filter:s("filter"),headerTemplateURL:s("header"),filterData:s("filter-data"),show:a.attr("ng-if")?function(t){return n(a.attr("ng-if"))(t)}:void 0})}}),function(t,e,n,i){t.$columns=r=i.buildColumns(r),i.setupBindingsToInternalScope(n.ngTable),i.loadFilterData(r),i.compileDirectiveTemplates()}):void 0}}}]),e.directive("ngTableDynamic",["$parse",function(){return{restrict:"A",priority:1001,scope:!0,controller:"ngTableController",compile:function(e){var n;return t.forEach(t.element(e.find("tr")),function(e){e=t.element(e),e.hasClass("ng-table-group")||n||(n=e)}),n?(t.forEach(n.find("td"),function(e){var n=t.element(e),r=function(t){return n.attr("x-data-"+t)||n.attr("data-"+t)||n.attr(t)},i=r("title");i||n.attr("data-title-text","{{$columns[$index].titleAlt(this) || $columns[$index].title(this)}}");var a=n.attr("ng-if");a||n.attr("ng-if","$columns[$index].show(this)")}),function(t,e,n,r){var i=r.parseNgTableDynamicExpr(n.ngTableDynamic);r.setupBindingsToInternalScope(i.tableParams),r.compileDirectiveTemplates(),t.$watchCollection(i.columns,function(e){t.$columns=r.buildColumns(e),r.loadFilterData(t.$columns)})}):void 0}}}]),function(){function e(){var t={restrict:"E",replace:!0,templateUrl:"ng-table/filterRow.html",scope:!0,controller:"ngTableFilterRowController"};return t}t.module("ngTable").directive("ngTableFilterRow",e),e.$inject=[]}(),function(){function e(){var t={restrict:"E",replace:!0,templateUrl:"ng-table/sorterRow.html",scope:!0,controller:"ngTableSorterRowController"};return t}t.module("ngTable").directive("ngTableSorterRow",e),e.$inject=[]}(),e.directive("ngTablePagination",["$compile","ngTableEventsChannel",function(e,n){return{restrict:"A",scope:{params:"=ngTablePagination",templateUrl:"="},replace:!1,link:function(r,i){n.onAfterReloadData(function(t){r.pages=t.generatePagesArray()},r,function(t){return t===r.params}),r.$watch("templateUrl",function(n){if(!t.isUndefined(n)){var a=t.element(document.createElement("div"));a.attr({"ng-include":"templateUrl"}),i.append(a),e(a)(r)}})}}}]),t.module("ngTable").run(["$templateCache",function(t){t.put("ng-table/filterRow.html",'<tr ng-show="show_filter" class="ng-table-filters"> <th data-title-text="{{$column.titleAlt(this) || $column.title(this)}}" ng-repeat="$column in $columns" ng-if="$column.show(this)" class="filter"> <div ng-repeat="(name, filter) in $column.filter(this)"> <div ng-include="config.getTemplateUrl(filter)"></div> </div> </th> </tr> '),t.put("ng-table/filters/number.html",'<input type="number" name="{{name}}" ng-disabled="$filterRow.disabled" ng-model="params.filter()[name]" class="input-filter form-control"/> '),t.put("ng-table/filters/select-multiple.html",'<select ng-options="data.id as data.title for data in $column.data" ng-disabled="$filterRow.disabled" multiple ng-multiple="true" ng-model="params.filter()[name]" class="filter filter-select-multiple form-control" name="{{name}}"> </select> '),t.put("ng-table/filters/select.html",'<select ng-options="data.id as data.title for data in $column.data" ng-disabled="$filterRow.disabled" ng-model="params.filter()[name]" class="filter filter-select form-control" name="{{name}}"> <option style="display:none" value=""></option> </select> '),t.put("ng-table/filters/text.html",'<input type="text" name="{{name}}" ng-disabled="$filterRow.disabled" ng-model="params.filter()[name]" class="input-filter form-control"/> '),t.put("ng-table/header.html","<ng-table-sorter-row></ng-table-sorter-row> <ng-table-filter-row></ng-table-filter-row> "),t.put("ng-table/pager.html",'<div class="ng-cloak ng-table-pager" ng-if="params.data.length"> <div ng-if="params.settings().counts.length" class="ng-table-counts btn-group pull-right"> <button ng-repeat="count in params.settings().counts" type="button" ng-class="{\'active\':params.count()==count}" ng-click="params.count(count)" class="btn btn-default"> <span ng-bind="count"></span> </button> </div> <ul class="pagination ng-table-pagination"> <li ng-class="{\'disabled\': !page.active && !page.current, \'active\': page.current}" ng-repeat="page in pages" ng-switch="page.type"> <a ng-switch-when="prev" ng-click="params.page(page.number)" href="">&laquo;</a> <a ng-switch-when="first" ng-click="params.page(page.number)" href=""><span ng-bind="page.number"></span></a> <a ng-switch-when="page" ng-click="params.page(page.number)" href=""><span ng-bind="page.number"></span></a> <a ng-switch-when="more" ng-click="params.page(page.number)" href="">&#8230;</a> <a ng-switch-when="last" ng-click="params.page(page.number)" href=""><span ng-bind="page.number"></span></a> <a ng-switch-when="next" ng-click="params.page(page.number)" href="">&raquo;</a> </li> </ul> </div> '),t.put("ng-table/sorterRow.html",'<tr> <th title="{{$column.headerTitle(this)}}" ng-repeat="$column in $columns" ng-class="{ \'sortable\': $column.sortable(this), \'sort-asc\': params.sorting()[$column.sortable(this)]==\'asc\', \'sort-desc\': params.sorting()[$column.sortable(this)]==\'desc\' }" ng-click="sortBy($column, $event)" ng-if="$column.show(this)" ng-init="template=$column.headerTemplateURL(this)" class="header {{$column.class(this)}}"> <div ng-if="!template" class="ng-table-header" ng-class="{\'sort-indicator\': params.settings().sortingIndicator==\'div\'}"> <span ng-bind="$column.title(this)" ng-class="{\'sort-indicator\': params.settings().sortingIndicator==\'span\'}"></span> </div> <div ng-if="template" ng-include="template"></div> </th> </tr> ')}]),e}),function(t,e){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t.document?e(t,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return e(t)}:e(t)}("undefined"!=typeof window?window:this,function(t,e){"use strict";function n(t,e){e=e||et;var n=e.createElement("script");n.text=t,e.head.appendChild(n).parentNode.removeChild(n)}function r(t){var e=!!t&&"length"in t&&t.length,n=pt.type(t);return"function"!==n&&!pt.isWindow(t)&&("array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function i(t,e,n){return pt.isFunction(e)?pt.grep(t,function(t,r){return!!e.call(t,r,t)!==n}):e.nodeType?pt.grep(t,function(t){return t===e!==n}):"string"!=typeof e?pt.grep(t,function(t){return ot.call(e,t)>-1!==n}):St.test(e)?pt.filter(e,t,n):(e=pt.filter(e,t),pt.grep(t,function(t){return ot.call(e,t)>-1!==n&&1===t.nodeType}))}function a(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}function o(t){var e={};return pt.each(t.match(kt)||[],function(t,n){e[n]=!0}),e}function s(t){return t}function u(t){throw t}function c(t,e,n){var r;try{t&&pt.isFunction(r=t.promise)?r.call(t).done(e).fail(n):t&&pt.isFunction(r=t.then)?r.call(t,e,n):e.call(void 0,t)}catch(t){n.call(void 0,t)}}function l(){et.removeEventListener("DOMContentLoaded",l),t.removeEventListener("load",l),pt.ready()}function f(){this.expando=pt.expando+f.uid++}function h(t){return"true"===t||"false"!==t&&("null"===t?null:t===+t+""?+t:It.test(t)?JSON.parse(t):t)}function d(t,e,n){var r;if(void 0===n&&1===t.nodeType)if(r="data-"+e.replace(Nt,"-$&").toLowerCase(),n=t.getAttribute(r),"string"==typeof n){try{n=h(n)}catch(t){}Rt.set(t,e,n)}else n=void 0;return n}function p(t,e,n,r){var i,a=1,o=20,s=r?function(){return r.cur()}:function(){return pt.css(t,e,"")},u=s(),c=n&&n[3]||(pt.cssNumber[e]?"":"px"),l=(pt.cssNumber[e]||"px"!==c&&+u)&&Ft.exec(pt.css(t,e));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do a=a||".5",l/=a,pt.style(t,e,l+c);while(a!==(a=s()/u)&&1!==a&&--o)}return n&&(l=+l||+u||0,i=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=i)),i}function g(t){var e,n=t.ownerDocument,r=t.nodeName,i=Ut[r];return i?i:(e=n.body.appendChild(n.createElement(r)),i=pt.css(e,"display"),e.parentNode.removeChild(e),"none"===i&&(i="block"),Ut[r]=i,i)}function v(t,e){for(var n,r,i=[],a=0,o=t.length;a<o;a++)r=t[a],r.style&&(n=r.style.display,e?("none"===n&&(i[a]=Vt.get(r,"display")||null,i[a]||(r.style.display="")),""===r.style.display&&Ht(r)&&(i[a]=g(r))):"none"!==n&&(i[a]="none",Vt.set(r,"display",n)));for(a=0;a<o;a++)null!=i[a]&&(t[a].style.display=i[a]);return t}function m(t,e){var n;return n="undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e||"*"):"undefined"!=typeof t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&pt.nodeName(t,e)?pt.merge([t],n):n}function y(t,e){for(var n=0,r=t.length;n<r;n++)Vt.set(t[n],"globalEval",!e||Vt.get(e[n],"globalEval"))}function x(t,e,n,r,i){for(var a,o,s,u,c,l,f=e.createDocumentFragment(),h=[],d=0,p=t.length;d<p;d++)if(a=t[d],a||0===a)if("object"===pt.type(a))pt.merge(h,a.nodeType?[a]:a);else if(Xt.test(a)){for(o=o||f.appendChild(e.createElement("div")),s=(qt.exec(a)||["",""])[1].toLowerCase(),u=Wt[s]||Wt._default,o.innerHTML=u[1]+pt.htmlPrefilter(a)+u[2],l=u[0];l--;)o=o.lastChild;pt.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(e.createTextNode(a));for(f.textContent="",d=0;a=h[d++];)if(r&&pt.inArray(a,r)>-1)i&&i.push(a);else if(c=pt.contains(a.ownerDocument,a),o=m(f.appendChild(a),"script"),c&&y(o),n)for(l=0;a=o[l++];)Yt.test(a.type||"")&&n.push(a);return f}function _(){return!0}function b(){return!1}function $(){try{return et.activeElement}catch(t){}}function w(t,e,n,r,i,a){var o,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=void 0);for(s in e)w(t,s,n,r,e[s],a);return t}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=b;else if(!i)return t;return 1===a&&(o=i,i=function(t){return pt().off(t),o.apply(this,arguments)},i.guid=o.guid||(o.guid=pt.guid++)),t.each(function(){pt.event.add(this,e,i,r,n)})}function S(t,e){return pt.nodeName(t,"table")&&pt.nodeName(11!==e.nodeType?e:e.firstChild,"tr")?t.getElementsByTagName("tbody")[0]||t:t}function T(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function A(t){var e=re.exec(t.type);return e?t.type=e[1]:t.removeAttribute("type"),t}function C(t,e){var n,r,i,a,o,s,u,c;if(1===e.nodeType){if(Vt.hasData(t)&&(a=Vt.access(t),o=Vt.set(e,a),c=a.events)){delete o.handle,o.events={};for(i in c)for(n=0,r=c[i].length;n<r;n++)pt.event.add(e,i,c[i][n])}Rt.hasData(t)&&(s=Rt.access(t),u=pt.extend({},s),Rt.set(e,u))}}function E(t,e){var n=e.nodeName.toLowerCase();"input"===n&&Bt.test(t.type)?e.checked=t.checked:"input"!==n&&"textarea"!==n||(e.defaultValue=t.defaultValue)}function M(t,e,r,i){e=it.apply([],e);var a,o,s,u,c,l,f=0,h=t.length,d=h-1,p=e[0],g=pt.isFunction(p);if(g||h>1&&"string"==typeof p&&!ht.checkClone&&ne.test(p))return t.each(function(n){var a=t.eq(n);g&&(e[0]=p.call(this,n,a.html())),M(a,e,r,i)});if(h&&(a=x(e,t[0].ownerDocument,!1,t,i),o=a.firstChild,1===a.childNodes.length&&(a=o),o||i)){for(s=pt.map(m(a,"script"),T),u=s.length;f<h;f++)c=a,f!==d&&(c=pt.clone(c,!0,!0),u&&pt.merge(s,m(c,"script"))),r.call(t[f],c,f);if(u)for(l=s[s.length-1].ownerDocument,pt.map(s,A),f=0;f<u;f++)c=s[f],Yt.test(c.type||"")&&!Vt.access(c,"globalEval")&&pt.contains(l,c)&&(c.src?pt._evalUrl&&pt._evalUrl(c.src):n(c.textContent.replace(ie,""),l))}return t}function k(t,e,n){for(var r,i=e?pt.filter(e,t):t,a=0;null!=(r=i[a]);a++)n||1!==r.nodeType||pt.cleanData(m(r)),r.parentNode&&(n&&pt.contains(r.ownerDocument,r)&&y(m(r,"script")),r.parentNode.removeChild(r));return t}function P(t,e,n){var r,i,a,o,s=t.style;return n=n||se(t),n&&(o=n.getPropertyValue(e)||n[e],""!==o||pt.contains(t.ownerDocument,t)||(o=pt.style(t,e)),!ht.pixelMarginRight()&&oe.test(o)&&ae.test(e)&&(r=s.width,i=s.minWidth,a=s.maxWidth,s.minWidth=s.maxWidth=s.width=o,o=n.width,s.width=r,s.minWidth=i,s.maxWidth=a)),void 0!==o?o+"":o}function O(t,e){return{get:function(){return t()?void delete this.get:(this.get=e).apply(this,arguments)}}}function L(t){if(t in he)return t;for(var e=t[0].toUpperCase()+t.slice(1),n=fe.length;n--;)if(t=fe[n]+e,t in he)return t}function D(t,e,n){var r=Ft.exec(e);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):e}function V(t,e,n,r,i){var a,o=0;for(a=n===(r?"border":"content")?4:"width"===e?1:0;a<4;a+=2)"margin"===n&&(o+=pt.css(t,n+Gt[a],!0,i)),r?("content"===n&&(o-=pt.css(t,"padding"+Gt[a],!0,i)),"margin"!==n&&(o-=pt.css(t,"border"+Gt[a]+"Width",!0,i))):(o+=pt.css(t,"padding"+Gt[a],!0,i),"padding"!==n&&(o+=pt.css(t,"border"+Gt[a]+"Width",!0,i)));return o}function R(t,e,n){var r,i=!0,a=se(t),o="border-box"===pt.css(t,"boxSizing",!1,a);if(t.getClientRects().length&&(r=t.getBoundingClientRect()[e]),r<=0||null==r){if(r=P(t,e,a),(r<0||null==r)&&(r=t.style[e]),oe.test(r))return r;i=o&&(ht.boxSizingReliable()||r===t.style[e]),r=parseFloat(r)||0}return r+V(t,e,n||(o?"border":"content"),i,a)+"px"}function I(t,e,n,r,i){return new I.prototype.init(t,e,n,r,i)}function N(){pe&&(t.requestAnimationFrame(N),pt.fx.tick())}function j(){return t.setTimeout(function(){de=void 0}),de=pt.now()}function F(t,e){var n,r=0,i={height:t};for(e=e?1:0;r<4;r+=2-e)n=Gt[r],i["margin"+n]=i["padding"+n]=t;return e&&(i.opacity=i.width=t),i}function G(t,e,n){for(var r,i=(U.tweeners[e]||[]).concat(U.tweeners["*"]),a=0,o=i.length;a<o;a++)if(r=i[a].call(n,e,t))return r}function H(t,e,n){var r,i,a,o,s,u,c,l,f="width"in e||"height"in e,h=this,d={},p=t.style,g=t.nodeType&&Ht(t),m=Vt.get(t,"fxshow");n.queue||(o=pt._queueHooks(t,"fx"),null==o.unqueued&&(o.unqueued=0,s=o.empty.fire,o.empty.fire=function(){o.unqueued||s()}),o.unqueued++,h.always(function(){h.always(function(){o.unqueued--,pt.queue(t,"fx").length||o.empty.fire()})}));for(r in e)if(i=e[r],ge.test(i)){if(delete e[r],a=a||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!m||void 0===m[r])continue;g=!0}d[r]=m&&m[r]||pt.style(t,r)}if(u=!pt.isEmptyObject(e),u||!pt.isEmptyObject(d)){f&&1===t.nodeType&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],c=m&&m.display,null==c&&(c=Vt.get(t,"display")),l=pt.css(t,"display"),"none"===l&&(c?l=c:(v([t],!0),c=t.style.display||c,l=pt.css(t,"display"),v([t]))),("inline"===l||"inline-block"===l&&null!=c)&&"none"===pt.css(t,"float")&&(u||(h.done(function(){p.display=c}),null==c&&(l=p.display,c="none"===l?"":l)),p.display="inline-block")),n.overflow&&(p.overflow="hidden",h.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(m?"hidden"in m&&(g=m.hidden):m=Vt.access(t,"fxshow",{display:c}),a&&(m.hidden=!g),g&&v([t],!0),h.done(function(){g||v([t]),Vt.remove(t,"fxshow");for(r in d)pt.style(t,r,d[r])})),u=G(g?m[r]:0,r,h),r in m||(m[r]=u.start,g&&(u.end=u.start,u.start=0))}}function z(t,e){var n,r,i,a,o;for(n in t)if(r=pt.camelCase(n),i=e[r],a=t[n],pt.isArray(a)&&(i=a[1],a=t[n]=a[0]),n!==r&&(t[r]=a,delete t[n]),o=pt.cssHooks[r],o&&"expand"in o){a=o.expand(a),delete t[r];for(n in a)n in t||(t[n]=a[n],e[n]=i)}else e[r]=i}function U(t,e,n){var r,i,a=0,o=U.prefilters.length,s=pt.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var e=de||j(),n=Math.max(0,c.startTime+c.duration-e),r=n/c.duration||0,a=1-r,o=0,u=c.tweens.length;o<u;o++)c.tweens[o].run(a);return s.notifyWith(t,[c,a,n]),a<1&&u?n:(s.resolveWith(t,[c]),!1)},c=s.promise({elem:t,props:pt.extend({},e),opts:pt.extend(!0,{specialEasing:{},easing:pt.easing._default},n),originalProperties:e,originalOptions:n,startTime:de||j(),duration:n.duration,tweens:[],createTween:function(e,n){var r=pt.Tween(t,c.opts,e,n,c.opts.specialEasing[e]||c.opts.easing);return c.tweens.push(r),r},stop:function(e){var n=0,r=e?c.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)c.tweens[n].run(1);return e?(s.notifyWith(t,[c,1,0]),s.resolveWith(t,[c,e])):s.rejectWith(t,[c,e]),this}}),l=c.props;for(z(l,c.opts.specialEasing);a<o;a++)if(r=U.prefilters[a].call(c,t,l,c.opts))return pt.isFunction(r.stop)&&(pt._queueHooks(c.elem,c.opts.queue).stop=pt.proxy(r.stop,r)),r;return pt.map(l,G,c),pt.isFunction(c.opts.start)&&c.opts.start.call(t,c),pt.fx.timer(pt.extend(u,{elem:t,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function B(t){var e=t.match(kt)||[];return e.join(" ")}function q(t){return t.getAttribute&&t.getAttribute("class")||""}function Y(t,e,n,r){var i;if(pt.isArray(e))pt.each(e,function(e,i){n||Ae.test(t)?r(t,i):Y(t+"["+("object"==typeof i&&null!=i?e:"")+"]",i,n,r)});else if(n||"object"!==pt.type(e))r(t,e);else for(i in e)Y(t+"["+i+"]",e[i],n,r)}function W(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var r,i=0,a=e.toLowerCase().match(kt)||[];if(pt.isFunction(n))for(;r=a[i++];)"+"===r[0]?(r=r.slice(1)||"*",(t[r]=t[r]||[]).unshift(n)):(t[r]=t[r]||[]).push(n)}}function X(t,e,n,r){function i(s){var u;
return a[s]=!0,pt.each(t[s]||[],function(t,s){var c=s(e,n,r);return"string"!=typeof c||o||a[c]?o?!(u=c):void 0:(e.dataTypes.unshift(c),i(c),!1)}),u}var a={},o=t===Ne;return i(e.dataTypes[0])||!a["*"]&&i("*")}function Q(t,e){var n,r,i=pt.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((i[n]?t:r||(r={}))[n]=e[n]);return r&&pt.extend(!0,t,r),t}function Z(t,e,n){for(var r,i,a,o,s=t.contents,u=t.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=t.mimeType||e.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)a=u[0];else{for(i in n){if(!u[0]||t.converters[i+" "+u[0]]){a=i;break}o||(o=i)}a=a||o}if(a)return a!==u[0]&&u.unshift(a),n[a]}function J(t,e,n,r){var i,a,o,s,u,c={},l=t.dataTypes.slice();if(l[1])for(o in t.converters)c[o.toLowerCase()]=t.converters[o];for(a=l.shift();a;)if(t.responseFields[a]&&(n[t.responseFields[a]]=e),!u&&r&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),u=a,a=l.shift())if("*"===a)a=u;else if("*"!==u&&u!==a){if(o=c[u+" "+a]||c["* "+a],!o)for(i in c)if(s=i.split(" "),s[1]===a&&(o=c[u+" "+s[0]]||c["* "+s[0]])){o===!0?o=c[i]:c[i]!==!0&&(a=s[0],l.unshift(s[1]));break}if(o!==!0)if(o&&t.throws)e=o(e);else try{e=o(e)}catch(t){return{state:"parsererror",error:o?t:"No conversion from "+u+" to "+a}}}return{state:"success",data:e}}function K(t){return pt.isWindow(t)?t:9===t.nodeType&&t.defaultView}var tt=[],et=t.document,nt=Object.getPrototypeOf,rt=tt.slice,it=tt.concat,at=tt.push,ot=tt.indexOf,st={},ut=st.toString,ct=st.hasOwnProperty,lt=ct.toString,ft=lt.call(Object),ht={},dt="3.1.1",pt=function(t,e){return new pt.fn.init(t,e)},gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,vt=/^-ms-/,mt=/-([a-z])/g,yt=function(t,e){return e.toUpperCase()};pt.fn=pt.prototype={jquery:dt,constructor:pt,length:0,toArray:function(){return rt.call(this)},get:function(t){return null==t?rt.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=pt.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return pt.each(this,t)},map:function(t){return this.pushStack(pt.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return this.pushStack(rt.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n<e?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:at,sort:tt.sort,splice:tt.splice},pt.extend=pt.fn.extend=function(){var t,e,n,r,i,a,o=arguments[0]||{},s=1,u=arguments.length,c=!1;for("boolean"==typeof o&&(c=o,o=arguments[s]||{},s++),"object"==typeof o||pt.isFunction(o)||(o={}),s===u&&(o=this,s--);s<u;s++)if(null!=(t=arguments[s]))for(e in t)n=o[e],r=t[e],o!==r&&(c&&r&&(pt.isPlainObject(r)||(i=pt.isArray(r)))?(i?(i=!1,a=n&&pt.isArray(n)?n:[]):a=n&&pt.isPlainObject(n)?n:{},o[e]=pt.extend(c,a,r)):void 0!==r&&(o[e]=r));return o},pt.extend({expando:"jQuery"+(dt+Math.random()).replace(/\D/g,""),isReady:!0,error:function(t){throw new Error(t)},noop:function(){},isFunction:function(t){return"function"===pt.type(t)},isArray:Array.isArray,isWindow:function(t){return null!=t&&t===t.window},isNumeric:function(t){var e=pt.type(t);return("number"===e||"string"===e)&&!isNaN(t-parseFloat(t))},isPlainObject:function(t){var e,n;return!(!t||"[object Object]"!==ut.call(t))&&(!(e=nt(t))||(n=ct.call(e,"constructor")&&e.constructor,"function"==typeof n&&lt.call(n)===ft))},isEmptyObject:function(t){var e;for(e in t)return!1;return!0},type:function(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?st[ut.call(t)]||"object":typeof t},globalEval:function(t){n(t)},camelCase:function(t){return t.replace(vt,"ms-").replace(mt,yt)},nodeName:function(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()},each:function(t,e){var n,i=0;if(r(t))for(n=t.length;i<n&&e.call(t[i],i,t[i])!==!1;i++);else for(i in t)if(e.call(t[i],i,t[i])===!1)break;return t},trim:function(t){return null==t?"":(t+"").replace(gt,"")},makeArray:function(t,e){var n=e||[];return null!=t&&(r(Object(t))?pt.merge(n,"string"==typeof t?[t]:t):at.call(n,t)),n},inArray:function(t,e,n){return null==e?-1:ot.call(e,t,n)},merge:function(t,e){for(var n=+e.length,r=0,i=t.length;r<n;r++)t[i++]=e[r];return t.length=i,t},grep:function(t,e,n){for(var r,i=[],a=0,o=t.length,s=!n;a<o;a++)r=!e(t[a],a),r!==s&&i.push(t[a]);return i},map:function(t,e,n){var i,a,o=0,s=[];if(r(t))for(i=t.length;o<i;o++)a=e(t[o],o,n),null!=a&&s.push(a);else for(o in t)a=e(t[o],o,n),null!=a&&s.push(a);return it.apply([],s)},guid:1,proxy:function(t,e){var n,r,i;if("string"==typeof e&&(n=t[e],e=t,t=n),pt.isFunction(t))return r=rt.call(arguments,2),i=function(){return t.apply(e||this,r.concat(rt.call(arguments)))},i.guid=t.guid=t.guid||pt.guid++,i},now:Date.now,support:ht}),"function"==typeof Symbol&&(pt.fn[Symbol.iterator]=tt[Symbol.iterator]),pt.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(t,e){st["[object "+e+"]"]=e.toLowerCase()});var xt=function(t){function e(t,e,n,r){var i,a,o,s,u,c,l,h=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:G)!==L&&O(e),e=e||L,V)){if(11!==p&&(u=mt.exec(t)))if(i=u[1]){if(9===p){if(!(o=e.getElementById(i)))return n;if(o.id===i)return n.push(o),n}else if(h&&(o=h.getElementById(i))&&j(e,o)&&o.id===i)return n.push(o),n}else{if(u[2])return J.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&$.getElementsByClassName&&e.getElementsByClassName)return J.apply(n,e.getElementsByClassName(i)),n}if($.qsa&&!q[t+" "]&&(!R||!R.test(t))){if(1!==p)h=e,l=t;else if("object"!==e.nodeName.toLowerCase()){for((s=e.getAttribute("id"))?s=s.replace(bt,$t):e.setAttribute("id",s=F),c=A(t),a=c.length;a--;)c[a]="#"+s+" "+d(c[a]);l=c.join(","),h=yt.test(t)&&f(e.parentNode)||e}if(l)try{return J.apply(n,h.querySelectorAll(l)),n}catch(t){}finally{s===F&&e.removeAttribute("id")}}}return E(t.replace(st,"$1"),e,n,r)}function n(){function t(n,r){return e.push(n+" ")>w.cacheLength&&delete t[e.shift()],t[n+" "]=r}var e=[];return t}function r(t){return t[F]=!0,t}function i(t){var e=L.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function a(t,e){for(var n=t.split("|"),r=n.length;r--;)w.attrHandle[n[r]]=e}function o(t,e){var n=e&&t,r=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function s(t){return function(e){var n=e.nodeName.toLowerCase();return"input"===n&&e.type===t}}function u(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function c(t){return function(e){return"form"in e?e.parentNode&&e.disabled===!1?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&St(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function l(t){return r(function(e){return e=+e,r(function(n,r){for(var i,a=t([],n.length,e),o=a.length;o--;)n[i=a[o]]&&(n[i]=!(r[i]=n[i]))})})}function f(t){return t&&"undefined"!=typeof t.getElementsByTagName&&t}function h(){}function d(t){for(var e=0,n=t.length,r="";e<n;e++)r+=t[e].value;return r}function p(t,e,n){var r=e.dir,i=e.next,a=i||r,o=n&&"parentNode"===a,s=z++;return e.first?function(e,n,i){for(;e=e[r];)if(1===e.nodeType||o)return t(e,n,i);return!1}:function(e,n,u){var c,l,f,h=[H,s];if(u){for(;e=e[r];)if((1===e.nodeType||o)&&t(e,n,u))return!0}else for(;e=e[r];)if(1===e.nodeType||o)if(f=e[F]||(e[F]={}),l=f[e.uniqueID]||(f[e.uniqueID]={}),i&&i===e.nodeName.toLowerCase())e=e[r]||e;else{if((c=l[a])&&c[0]===H&&c[1]===s)return h[2]=c[2];if(l[a]=h,h[2]=t(e,n,u))return!0}return!1}}function g(t){return t.length>1?function(e,n,r){for(var i=t.length;i--;)if(!t[i](e,n,r))return!1;return!0}:t[0]}function v(t,n,r){for(var i=0,a=n.length;i<a;i++)e(t,n[i],r);return r}function m(t,e,n,r,i){for(var a,o=[],s=0,u=t.length,c=null!=e;s<u;s++)(a=t[s])&&(n&&!n(a,r,i)||(o.push(a),c&&e.push(s)));return o}function y(t,e,n,i,a,o){return i&&!i[F]&&(i=y(i)),a&&!a[F]&&(a=y(a,o)),r(function(r,o,s,u){var c,l,f,h=[],d=[],p=o.length,g=r||v(e||"*",s.nodeType?[s]:s,[]),y=!t||!r&&e?g:m(g,h,t,s,u),x=n?a||(r?t:p||i)?[]:o:y;if(n&&n(y,x,s,u),i)for(c=m(x,d),i(c,[],s,u),l=c.length;l--;)(f=c[l])&&(x[d[l]]=!(y[d[l]]=f));if(r){if(a||t){if(a){for(c=[],l=x.length;l--;)(f=x[l])&&c.push(y[l]=f);a(null,x=[],c,u)}for(l=x.length;l--;)(f=x[l])&&(c=a?tt(r,f):h[l])>-1&&(r[c]=!(o[c]=f))}}else x=m(x===o?x.splice(p,x.length):x),a?a(null,o,x,u):J.apply(o,x)})}function x(t){for(var e,n,r,i=t.length,a=w.relative[t[0].type],o=a||w.relative[" "],s=a?1:0,u=p(function(t){return t===e},o,!0),c=p(function(t){return tt(e,t)>-1},o,!0),l=[function(t,n,r){var i=!a&&(r||n!==M)||((e=n).nodeType?u(t,n,r):c(t,n,r));return e=null,i}];s<i;s++)if(n=w.relative[t[s].type])l=[p(g(l),n)];else{if(n=w.filter[t[s].type].apply(null,t[s].matches),n[F]){for(r=++s;r<i&&!w.relative[t[r].type];r++);return y(s>1&&g(l),s>1&&d(t.slice(0,s-1).concat({value:" "===t[s-2].type?"*":""})).replace(st,"$1"),n,s<r&&x(t.slice(s,r)),r<i&&x(t=t.slice(r)),r<i&&d(t))}l.push(n)}return g(l)}function _(t,n){var i=n.length>0,a=t.length>0,o=function(r,o,s,u,c){var l,f,h,d=0,p="0",g=r&&[],v=[],y=M,x=r||a&&w.find.TAG("*",c),_=H+=null==y?1:Math.random()||.1,b=x.length;for(c&&(M=o===L||o||c);p!==b&&null!=(l=x[p]);p++){if(a&&l){for(f=0,o||l.ownerDocument===L||(O(l),s=!V);h=t[f++];)if(h(l,o||L,s)){u.push(l);break}c&&(H=_)}i&&((l=!h&&l)&&d--,r&&g.push(l))}if(d+=p,i&&p!==d){for(f=0;h=n[f++];)h(g,v,o,s);if(r){if(d>0)for(;p--;)g[p]||v[p]||(v[p]=Q.call(u));v=m(v)}J.apply(u,v),c&&!r&&v.length>0&&d+n.length>1&&e.uniqueSort(u)}return c&&(H=_,M=y),g};return i?r(o):o}var b,$,w,S,T,A,C,E,M,k,P,O,L,D,V,R,I,N,j,F="sizzle"+1*new Date,G=t.document,H=0,z=0,U=n(),B=n(),q=n(),Y=function(t,e){return t===e&&(P=!0),0},W={}.hasOwnProperty,X=[],Q=X.pop,Z=X.push,J=X.push,K=X.slice,tt=function(t,e){for(var n=0,r=t.length;n<r;n++)if(t[n]===e)return n;return-1},et="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",nt="[\\x20\\t\\r\\n\\f]",rt="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",it="\\["+nt+"*("+rt+")(?:"+nt+"*([*^$|!~]?=)"+nt+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+rt+"))|)"+nt+"*\\]",at=":("+rt+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+it+")*)|.*)\\)|)",ot=new RegExp(nt+"+","g"),st=new RegExp("^"+nt+"+|((?:^|[^\\\\])(?:\\\\.)*)"+nt+"+$","g"),ut=new RegExp("^"+nt+"*,"+nt+"*"),ct=new RegExp("^"+nt+"*([>+~]|"+nt+")"+nt+"*"),lt=new RegExp("="+nt+"*([^\\]'\"]*?)"+nt+"*\\]","g"),ft=new RegExp(at),ht=new RegExp("^"+rt+"$"),dt={ID:new RegExp("^#("+rt+")"),CLASS:new RegExp("^\\.("+rt+")"),TAG:new RegExp("^("+rt+"|[*])"),ATTR:new RegExp("^"+it),PSEUDO:new RegExp("^"+at),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+nt+"*(even|odd|(([+-]|)(\\d*)n|)"+nt+"*(?:([+-]|)"+nt+"*(\\d+)|))"+nt+"*\\)|)","i"),bool:new RegExp("^(?:"+et+")$","i"),needsContext:new RegExp("^"+nt+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+nt+"*((?:-\\d)?\\d*)"+nt+"*\\)|)(?=[^-]|$)","i")},pt=/^(?:input|select|textarea|button)$/i,gt=/^h\d$/i,vt=/^[^{]+\{\s*\[native \w/,mt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,yt=/[+~]/,xt=new RegExp("\\\\([\\da-f]{1,6}"+nt+"?|("+nt+")|.)","ig"),_t=function(t,e,n){var r="0x"+e-65536;return r!==r||n?e:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},bt=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,$t=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},wt=function(){O()},St=p(function(t){return t.disabled===!0&&("form"in t||"label"in t)},{dir:"parentNode",next:"legend"});try{J.apply(X=K.call(G.childNodes),G.childNodes),X[G.childNodes.length].nodeType}catch(t){J={apply:X.length?function(t,e){Z.apply(t,K.call(e))}:function(t,e){for(var n=t.length,r=0;t[n++]=e[r++];);t.length=n-1}}}$=e.support={},T=e.isXML=function(t){var e=t&&(t.ownerDocument||t).documentElement;return!!e&&"HTML"!==e.nodeName},O=e.setDocument=function(t){var e,n,r=t?t.ownerDocument||t:G;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,D=L.documentElement,V=!T(L),G!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",wt,!1):n.attachEvent&&n.attachEvent("onunload",wt)),$.attributes=i(function(t){return t.className="i",!t.getAttribute("className")}),$.getElementsByTagName=i(function(t){return t.appendChild(L.createComment("")),!t.getElementsByTagName("*").length}),$.getElementsByClassName=vt.test(L.getElementsByClassName),$.getById=i(function(t){return D.appendChild(t).id=F,!L.getElementsByName||!L.getElementsByName(F).length}),$.getById?(w.filter.ID=function(t){var e=t.replace(xt,_t);return function(t){return t.getAttribute("id")===e}},w.find.ID=function(t,e){if("undefined"!=typeof e.getElementById&&V){var n=e.getElementById(t);return n?[n]:[]}}):(w.filter.ID=function(t){var e=t.replace(xt,_t);return function(t){var n="undefined"!=typeof t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},w.find.ID=function(t,e){if("undefined"!=typeof e.getElementById&&V){var n,r,i,a=e.getElementById(t);if(a){if(n=a.getAttributeNode("id"),n&&n.value===t)return[a];for(i=e.getElementsByName(t),r=0;a=i[r++];)if(n=a.getAttributeNode("id"),n&&n.value===t)return[a]}return[]}}),w.find.TAG=$.getElementsByTagName?function(t,e){return"undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t):$.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,r=[],i=0,a=e.getElementsByTagName(t);if("*"===t){for(;n=a[i++];)1===n.nodeType&&r.push(n);return r}return a},w.find.CLASS=$.getElementsByClassName&&function(t,e){if("undefined"!=typeof e.getElementsByClassName&&V)return e.getElementsByClassName(t)},I=[],R=[],($.qsa=vt.test(L.querySelectorAll))&&(i(function(t){D.appendChild(t).innerHTML="<a id='"+F+"'></a><select id='"+F+"-\r\\' msallowcapture=''><option selected=''></option></select>",t.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+nt+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||R.push("\\["+nt+"*(?:value|"+et+")"),t.querySelectorAll("[id~="+F+"-]").length||R.push("~="),t.querySelectorAll(":checked").length||R.push(":checked"),t.querySelectorAll("a#"+F+"+*").length||R.push(".#.+[+~]")}),i(function(t){t.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var e=L.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&R.push("name"+nt+"*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),D.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),R.push(",.*:")})),($.matchesSelector=vt.test(N=D.matches||D.webkitMatchesSelector||D.mozMatchesSelector||D.oMatchesSelector||D.msMatchesSelector))&&i(function(t){$.disconnectedMatch=N.call(t,"*"),N.call(t,"[s!='']:x"),I.push("!=",at)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),e=vt.test(D.compareDocumentPosition),j=e||vt.test(D.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,r=e&&e.parentNode;return t===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):t.compareDocumentPosition&&16&t.compareDocumentPosition(r)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},Y=e?function(t,e){if(t===e)return P=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n?n:(n=(t.ownerDocument||t)===(e.ownerDocument||e)?t.compareDocumentPosition(e):1,1&n||!$.sortDetached&&e.compareDocumentPosition(t)===n?t===L||t.ownerDocument===G&&j(G,t)?-1:e===L||e.ownerDocument===G&&j(G,e)?1:k?tt(k,t)-tt(k,e):0:4&n?-1:1)}:function(t,e){if(t===e)return P=!0,0;var n,r=0,i=t.parentNode,a=e.parentNode,s=[t],u=[e];if(!i||!a)return t===L?-1:e===L?1:i?-1:a?1:k?tt(k,t)-tt(k,e):0;if(i===a)return o(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?o(s[r],u[r]):s[r]===G?-1:u[r]===G?1:0},L):L},e.matches=function(t,n){return e(t,null,null,n)},e.matchesSelector=function(t,n){if((t.ownerDocument||t)!==L&&O(t),n=n.replace(lt,"='$1']"),$.matchesSelector&&V&&!q[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=N.call(t,n);if(r||$.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(t){}return e(n,L,null,[t]).length>0},e.contains=function(t,e){return(t.ownerDocument||t)!==L&&O(t),j(t,e)},e.attr=function(t,e){(t.ownerDocument||t)!==L&&O(t);var n=w.attrHandle[e.toLowerCase()],r=n&&W.call(w.attrHandle,e.toLowerCase())?n(t,e,!V):void 0;return void 0!==r?r:$.attributes||!V?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},e.escape=function(t){return(t+"").replace(bt,$t)},e.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},e.uniqueSort=function(t){var e,n=[],r=0,i=0;if(P=!$.detectDuplicates,k=!$.sortStable&&t.slice(0),t.sort(Y),P){for(;e=t[i++];)e===t[i]&&(r=n.push(i));for(;r--;)t.splice(n[r],1)}return k=null,t},S=e.getText=function(t){var e,n="",r=0,i=t.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=S(t)}else if(3===i||4===i)return t.nodeValue}else for(;e=t[r++];)n+=S(e);return n},w=e.selectors={cacheLength:50,createPseudo:r,match:dt,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(xt,_t),t[3]=(t[3]||t[4]||t[5]||"").replace(xt,_t),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||e.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&e.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return dt.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&ft.test(n)&&(e=A(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(xt,_t).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=U[t+" "];return e||(e=new RegExp("(^|"+nt+")"+t+"("+nt+"|$)"))&&U(t,function(t){return e.test("string"==typeof t.className&&t.className||"undefined"!=typeof t.getAttribute&&t.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(i){var a=e.attr(i,t);return null==a?"!="===n:!n||(a+="","="===n?a===r:"!="===n?a!==r:"^="===n?r&&0===a.indexOf(r):"*="===n?r&&a.indexOf(r)>-1:"$="===n?r&&a.slice(-r.length)===r:"~="===n?(" "+a.replace(ot," ")+" ").indexOf(r)>-1:"|="===n&&(a===r||a.slice(0,r.length+1)===r+"-"))}},CHILD:function(t,e,n,r,i){var a="nth"!==t.slice(0,3),o="last"!==t.slice(-4),s="of-type"===e;return 1===r&&0===i?function(t){return!!t.parentNode}:function(e,n,u){var c,l,f,h,d,p,g=a!==o?"nextSibling":"previousSibling",v=e.parentNode,m=s&&e.nodeName.toLowerCase(),y=!u&&!s,x=!1;if(v){if(a){for(;g;){for(h=e;h=h[g];)if(s?h.nodeName.toLowerCase()===m:1===h.nodeType)return!1;p=g="only"===t&&!p&&"nextSibling"}return!0}if(p=[o?v.firstChild:v.lastChild],o&&y){for(h=v,f=h[F]||(h[F]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[t]||[],d=c[0]===H&&c[1],x=d&&c[2],h=d&&v.childNodes[d];h=++d&&h&&h[g]||(x=d=0)||p.pop();)if(1===h.nodeType&&++x&&h===e){l[t]=[H,d,x];break}}else if(y&&(h=e,f=h[F]||(h[F]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[t]||[],d=c[0]===H&&c[1],x=d),x===!1)for(;(h=++d&&h&&h[g]||(x=d=0)||p.pop())&&((s?h.nodeName.toLowerCase()!==m:1!==h.nodeType)||!++x||(y&&(f=h[F]||(h[F]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),l[t]=[H,x]),h!==e)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(t,n){var i,a=w.pseudos[t]||w.setFilters[t.toLowerCase()]||e.error("unsupported pseudo: "+t);return a[F]?a(n):a.length>1?(i=[t,t,"",n],w.setFilters.hasOwnProperty(t.toLowerCase())?r(function(t,e){for(var r,i=a(t,n),o=i.length;o--;)r=tt(t,i[o]),t[r]=!(e[r]=i[o])}):function(t){return a(t,0,i)}):a}},pseudos:{not:r(function(t){var e=[],n=[],i=C(t.replace(st,"$1"));return i[F]?r(function(t,e,n,r){for(var a,o=i(t,null,r,[]),s=t.length;s--;)(a=o[s])&&(t[s]=!(e[s]=a))}):function(t,r,a){return e[0]=t,i(e,null,a,n),e[0]=null,!n.pop()}}),has:r(function(t){return function(n){return e(t,n).length>0}}),contains:r(function(t){return t=t.replace(xt,_t),function(e){return(e.textContent||e.innerText||S(e)).indexOf(t)>-1}}),lang:r(function(t){return ht.test(t||"")||e.error("unsupported lang: "+t),t=t.replace(xt,_t).toLowerCase(),function(e){var n;do if(n=V?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return n=n.toLowerCase(),n===t||0===n.indexOf(t+"-");while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===D},focus:function(t){return t===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,t.selected===!0},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!w.pseudos.empty(t)},header:function(t){return gt.test(t.nodeName)},input:function(t){return pt.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:l(function(){return[0]}),last:l(function(t,e){return[e-1]}),eq:l(function(t,e,n){return[n<0?n+e:n]}),even:l(function(t,e){for(var n=0;n<e;n+=2)t.push(n);return t}),odd:l(function(t,e){for(var n=1;n<e;n+=2)t.push(n);return t}),lt:l(function(t,e,n){for(var r=n<0?n+e:n;--r>=0;)t.push(r);return t}),gt:l(function(t,e,n){for(var r=n<0?n+e:n;++r<e;)t.push(r);return t})}},w.pseudos.nth=w.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[b]=s(b);for(b in{submit:!0,reset:!0})w.pseudos[b]=u(b);return h.prototype=w.filters=w.pseudos,w.setFilters=new h,A=e.tokenize=function(t,n){var r,i,a,o,s,u,c,l=B[t+" "];if(l)return n?0:l.slice(0);for(s=t,u=[],c=w.preFilter;s;){r&&!(i=ut.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(a=[])),r=!1,(i=ct.exec(s))&&(r=i.shift(),a.push({value:r,type:i[0].replace(st," ")}),s=s.slice(r.length));for(o in w.filter)!(i=dt[o].exec(s))||c[o]&&!(i=c[o](i))||(r=i.shift(),a.push({value:r,type:o,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?e.error(t):B(t,u).slice(0)},C=e.compile=function(t,e){var n,r=[],i=[],a=q[t+" "];if(!a){for(e||(e=A(t)),n=e.length;n--;)a=x(e[n]),a[F]?r.push(a):i.push(a);a=q(t,_(i,r)),a.selector=t}return a},E=e.select=function(t,e,n,r){var i,a,o,s,u,c="function"==typeof t&&t,l=!r&&A(t=c.selector||t);if(n=n||[],1===l.length){if(a=l[0]=l[0].slice(0),a.length>2&&"ID"===(o=a[0]).type&&9===e.nodeType&&V&&w.relative[a[1].type]){if(e=(w.find.ID(o.matches[0].replace(xt,_t),e)||[])[0],!e)return n;c&&(e=e.parentNode),t=t.slice(a.shift().value.length)}for(i=dt.needsContext.test(t)?0:a.length;i--&&(o=a[i],!w.relative[s=o.type]);)if((u=w.find[s])&&(r=u(o.matches[0].replace(xt,_t),yt.test(a[0].type)&&f(e.parentNode)||e))){if(a.splice(i,1),t=r.length&&d(a),!t)return J.apply(n,r),n;break}}return(c||C(t,l))(r,e,!V,n,!e||yt.test(t)&&f(e.parentNode)||e),n},$.sortStable=F.split("").sort(Y).join("")===F,$.detectDuplicates=!!P,O(),$.sortDetached=i(function(t){return 1&t.compareDocumentPosition(L.createElement("fieldset"))}),i(function(t){return t.innerHTML="<a href='#'></a>","#"===t.firstChild.getAttribute("href")})||a("type|href|height|width",function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)}),$.attributes&&i(function(t){return t.innerHTML="<input/>",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")})||a("value",function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue}),i(function(t){return null==t.getAttribute("disabled")})||a(et,function(t,e,n){var r;if(!n)return t[e]===!0?e.toLowerCase():(r=t.getAttributeNode(e))&&r.specified?r.value:null}),e}(t);pt.find=xt,pt.expr=xt.selectors,pt.expr[":"]=pt.expr.pseudos,pt.uniqueSort=pt.unique=xt.uniqueSort,pt.text=xt.getText,pt.isXMLDoc=xt.isXML,pt.contains=xt.contains,pt.escapeSelector=xt.escape;var _t=function(t,e,n){for(var r=[],i=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(i&&pt(t).is(n))break;r.push(t)}return r},bt=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},$t=pt.expr.match.needsContext,wt=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,St=/^.[^:#\[\.,]*$/;pt.filter=function(t,e,n){var r=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===r.nodeType?pt.find.matchesSelector(r,t)?[r]:[]:pt.find.matches(t,pt.grep(e,function(t){return 1===t.nodeType}))},pt.fn.extend({find:function(t){var e,n,r=this.length,i=this;if("string"!=typeof t)return this.pushStack(pt(t).filter(function(){for(e=0;e<r;e++)if(pt.contains(i[e],this))return!0}));for(n=this.pushStack([]),e=0;e<r;e++)pt.find(t,i[e],n);return r>1?pt.uniqueSort(n):n},filter:function(t){return this.pushStack(i(this,t||[],!1))},not:function(t){return this.pushStack(i(this,t||[],!0))},is:function(t){return!!i(this,"string"==typeof t&&$t.test(t)?pt(t):t||[],!1).length}});var Tt,At=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Ct=pt.fn.init=function(t,e,n){var r,i;if(!t)return this;if(n=n||Tt,"string"==typeof t){if(r="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:At.exec(t),!r||!r[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(r[1]){if(e=e instanceof pt?e[0]:e,pt.merge(this,pt.parseHTML(r[1],e&&e.nodeType?e.ownerDocument||e:et,!0)),wt.test(r[1])&&pt.isPlainObject(e))for(r in e)pt.isFunction(this[r])?this[r](e[r]):this.attr(r,e[r]);return this}return i=et.getElementById(r[2]),i&&(this[0]=i,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):pt.isFunction(t)?void 0!==n.ready?n.ready(t):t(pt):pt.makeArray(t,this)};Ct.prototype=pt.fn,Tt=pt(et);var Et=/^(?:parents|prev(?:Until|All))/,Mt={children:!0,contents:!0,next:!0,prev:!0};pt.fn.extend({has:function(t){var e=pt(t,this),n=e.length;return this.filter(function(){for(var t=0;t<n;t++)if(pt.contains(this,e[t]))return!0})},closest:function(t,e){var n,r=0,i=this.length,a=[],o="string"!=typeof t&&pt(t);if(!$t.test(t))for(;r<i;r++)for(n=this[r];n&&n!==e;n=n.parentNode)if(n.nodeType<11&&(o?o.index(n)>-1:1===n.nodeType&&pt.find.matchesSelector(n,t))){a.push(n);break}return this.pushStack(a.length>1?pt.uniqueSort(a):a)},index:function(t){return t?"string"==typeof t?ot.call(pt(t),this[0]):ot.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(pt.uniqueSort(pt.merge(this.get(),pt(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),pt.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return _t(t,"parentNode")},parentsUntil:function(t,e,n){return _t(t,"parentNode",n)},next:function(t){return a(t,"nextSibling")},prev:function(t){return a(t,"previousSibling")},nextAll:function(t){return _t(t,"nextSibling")},prevAll:function(t){return _t(t,"previousSibling")},nextUntil:function(t,e,n){return _t(t,"nextSibling",n)},prevUntil:function(t,e,n){return _t(t,"previousSibling",n)},siblings:function(t){return bt((t.parentNode||{}).firstChild,t)},children:function(t){return bt(t.firstChild)},contents:function(t){return t.contentDocument||pt.merge([],t.childNodes)}},function(t,e){pt.fn[t]=function(n,r){var i=pt.map(this,e,n);return"Until"!==t.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pt.filter(r,i)),this.length>1&&(Mt[t]||pt.uniqueSort(i),Et.test(t)&&i.reverse()),this.pushStack(i)}});var kt=/[^\x20\t\r\n\f]+/g;pt.Callbacks=function(t){t="string"==typeof t?o(t):pt.extend({},t);var e,n,r,i,a=[],s=[],u=-1,c=function(){for(i=t.once,r=e=!0;s.length;u=-1)for(n=s.shift();++u<a.length;)a[u].apply(n[0],n[1])===!1&&t.stopOnFalse&&(u=a.length,n=!1);t.memory||(n=!1),e=!1,i&&(a=n?[]:"")},l={add:function(){return a&&(n&&!e&&(u=a.length-1,s.push(n)),function e(n){pt.each(n,function(n,r){pt.isFunction(r)?t.unique&&l.has(r)||a.push(r):r&&r.length&&"string"!==pt.type(r)&&e(r)})}(arguments),n&&!e&&c()),this},remove:function(){return pt.each(arguments,function(t,e){for(var n;(n=pt.inArray(e,a,n))>-1;)a.splice(n,1),n<=u&&u--}),this},has:function(t){return t?pt.inArray(t,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=s=[],n||e||(a=n=""),this},locked:function(){return!!i},fireWith:function(t,n){return i||(n=n||[],n=[t,n.slice?n.slice():n],s.push(n),e||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},pt.extend({Deferred:function(e){var n=[["notify","progress",pt.Callbacks("memory"),pt.Callbacks("memory"),2],["resolve","done",pt.Callbacks("once memory"),pt.Callbacks("once memory"),0,"resolved"],["reject","fail",pt.Callbacks("once memory"),pt.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return a.done(arguments).fail(arguments),this},catch:function(t){return i.then(null,t)},pipe:function(){var t=arguments;return pt.Deferred(function(e){pt.each(n,function(n,r){var i=pt.isFunction(t[r[4]])&&t[r[4]];a[r[1]](function(){var t=i&&i.apply(this,arguments);t&&pt.isFunction(t.promise)?t.promise().progress(e.notify).done(e.resolve).fail(e.reject):e[r[0]+"With"](this,i?[t]:arguments)})}),t=null}).promise()},then:function(e,r,i){function a(e,n,r,i){return function(){var c=this,l=arguments,f=function(){var t,f;if(!(e<o)){if(t=r.apply(c,l),t===n.promise())throw new TypeError("Thenable self-resolution");f=t&&("object"==typeof t||"function"==typeof t)&&t.then,pt.isFunction(f)?i?f.call(t,a(o,n,s,i),a(o,n,u,i)):(o++,f.call(t,a(o,n,s,i),a(o,n,u,i),a(o,n,s,n.notifyWith))):(r!==s&&(c=void 0,l=[t]),(i||n.resolveWith)(c,l))}},h=i?f:function(){try{f()}catch(t){pt.Deferred.exceptionHook&&pt.Deferred.exceptionHook(t,h.stackTrace),e+1>=o&&(r!==u&&(c=void 0,l=[t]),n.rejectWith(c,l))}};e?h():(pt.Deferred.getStackHook&&(h.stackTrace=pt.Deferred.getStackHook()),t.setTimeout(h))}}var o=0;return pt.Deferred(function(t){n[0][3].add(a(0,t,pt.isFunction(i)?i:s,t.notifyWith)),n[1][3].add(a(0,t,pt.isFunction(e)?e:s)),n[2][3].add(a(0,t,pt.isFunction(r)?r:u))}).promise()},promise:function(t){return null!=t?pt.extend(t,i):i}},a={};return pt.each(n,function(t,e){var o=e[2],s=e[5];i[e[1]]=o.add,s&&o.add(function(){r=s},n[3-t][2].disable,n[0][2].lock),o.add(e[3].fire),a[e[0]]=function(){return a[e[0]+"With"](this===a?void 0:this,arguments),this},a[e[0]+"With"]=o.fireWith}),i.promise(a),e&&e.call(a,a),a},when:function(t){var e=arguments.length,n=e,r=Array(n),i=rt.call(arguments),a=pt.Deferred(),o=function(t){return function(n){r[t]=this,i[t]=arguments.length>1?rt.call(arguments):n,--e||a.resolveWith(r,i)}};if(e<=1&&(c(t,a.done(o(n)).resolve,a.reject),"pending"===a.state()||pt.isFunction(i[n]&&i[n].then)))return a.then();for(;n--;)c(i[n],o(n),a.reject);return a.promise()}});var Pt=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;pt.Deferred.exceptionHook=function(e,n){t.console&&t.console.warn&&e&&Pt.test(e.name)&&t.console.warn("jQuery.Deferred exception: "+e.message,e.stack,n)},pt.readyException=function(e){t.setTimeout(function(){throw e})};var Ot=pt.Deferred();pt.fn.ready=function(t){return Ot.then(t).catch(function(t){
pt.readyException(t)}),this},pt.extend({isReady:!1,readyWait:1,holdReady:function(t){t?pt.readyWait++:pt.ready(!0)},ready:function(t){(t===!0?--pt.readyWait:pt.isReady)||(pt.isReady=!0,t!==!0&&--pt.readyWait>0||Ot.resolveWith(et,[pt]))}}),pt.ready.then=Ot.then,"complete"===et.readyState||"loading"!==et.readyState&&!et.documentElement.doScroll?t.setTimeout(pt.ready):(et.addEventListener("DOMContentLoaded",l),t.addEventListener("load",l));var Lt=function(t,e,n,r,i,a,o){var s=0,u=t.length,c=null==n;if("object"===pt.type(n)){i=!0;for(s in n)Lt(t,e,s,n[s],!0,a,o)}else if(void 0!==r&&(i=!0,pt.isFunction(r)||(o=!0),c&&(o?(e.call(t,r),e=null):(c=e,e=function(t,e,n){return c.call(pt(t),n)})),e))for(;s<u;s++)e(t[s],n,o?r:r.call(t[s],s,e(t[s],n)));return i?t:c?e.call(t):u?e(t[0],n):a},Dt=function(t){return 1===t.nodeType||9===t.nodeType||!+t.nodeType};f.uid=1,f.prototype={cache:function(t){var e=t[this.expando];return e||(e={},Dt(t)&&(t.nodeType?t[this.expando]=e:Object.defineProperty(t,this.expando,{value:e,configurable:!0}))),e},set:function(t,e,n){var r,i=this.cache(t);if("string"==typeof e)i[pt.camelCase(e)]=n;else for(r in e)i[pt.camelCase(r)]=e[r];return i},get:function(t,e){return void 0===e?this.cache(t):t[this.expando]&&t[this.expando][pt.camelCase(e)]},access:function(t,e,n){return void 0===e||e&&"string"==typeof e&&void 0===n?this.get(t,e):(this.set(t,e,n),void 0!==n?n:e)},remove:function(t,e){var n,r=t[this.expando];if(void 0!==r){if(void 0!==e){pt.isArray(e)?e=e.map(pt.camelCase):(e=pt.camelCase(e),e=e in r?[e]:e.match(kt)||[]),n=e.length;for(;n--;)delete r[e[n]]}(void 0===e||pt.isEmptyObject(r))&&(t.nodeType?t[this.expando]=void 0:delete t[this.expando])}},hasData:function(t){var e=t[this.expando];return void 0!==e&&!pt.isEmptyObject(e)}};var Vt=new f,Rt=new f,It=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Nt=/[A-Z]/g;pt.extend({hasData:function(t){return Rt.hasData(t)||Vt.hasData(t)},data:function(t,e,n){return Rt.access(t,e,n)},removeData:function(t,e){Rt.remove(t,e)},_data:function(t,e,n){return Vt.access(t,e,n)},_removeData:function(t,e){Vt.remove(t,e)}}),pt.fn.extend({data:function(t,e){var n,r,i,a=this[0],o=a&&a.attributes;if(void 0===t){if(this.length&&(i=Rt.get(a),1===a.nodeType&&!Vt.get(a,"hasDataAttrs"))){for(n=o.length;n--;)o[n]&&(r=o[n].name,0===r.indexOf("data-")&&(r=pt.camelCase(r.slice(5)),d(a,r,i[r])));Vt.set(a,"hasDataAttrs",!0)}return i}return"object"==typeof t?this.each(function(){Rt.set(this,t)}):Lt(this,function(e){var n;if(a&&void 0===e){if(n=Rt.get(a,t),void 0!==n)return n;if(n=d(a,t),void 0!==n)return n}else this.each(function(){Rt.set(this,t,e)})},null,e,arguments.length>1,null,!0)},removeData:function(t){return this.each(function(){Rt.remove(this,t)})}}),pt.extend({queue:function(t,e,n){var r;if(t)return e=(e||"fx")+"queue",r=Vt.get(t,e),n&&(!r||pt.isArray(n)?r=Vt.access(t,e,pt.makeArray(n)):r.push(n)),r||[]},dequeue:function(t,e){e=e||"fx";var n=pt.queue(t,e),r=n.length,i=n.shift(),a=pt._queueHooks(t,e),o=function(){pt.dequeue(t,e)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===e&&n.unshift("inprogress"),delete a.stop,i.call(t,o,a)),!r&&a&&a.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Vt.get(t,n)||Vt.access(t,n,{empty:pt.Callbacks("once memory").add(function(){Vt.remove(t,[e+"queue",n])})})}}),pt.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length<n?pt.queue(this[0],t):void 0===e?this:this.each(function(){var n=pt.queue(this,t,e);pt._queueHooks(this,t),"fx"===t&&"inprogress"!==n[0]&&pt.dequeue(this,t)})},dequeue:function(t){return this.each(function(){pt.dequeue(this,t)})},clearQueue:function(t){return this.queue(t||"fx",[])},promise:function(t,e){var n,r=1,i=pt.Deferred(),a=this,o=this.length,s=function(){--r||i.resolveWith(a,[a])};for("string"!=typeof t&&(e=t,t=void 0),t=t||"fx";o--;)n=Vt.get(a[o],t+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(e)}});var jt=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Ft=new RegExp("^(?:([+-])=|)("+jt+")([a-z%]*)$","i"),Gt=["Top","Right","Bottom","Left"],Ht=function(t,e){return t=e||t,"none"===t.style.display||""===t.style.display&&pt.contains(t.ownerDocument,t)&&"none"===pt.css(t,"display")},zt=function(t,e,n,r){var i,a,o={};for(a in e)o[a]=t.style[a],t.style[a]=e[a];i=n.apply(t,r||[]);for(a in e)t.style[a]=o[a];return i},Ut={};pt.fn.extend({show:function(){return v(this,!0)},hide:function(){return v(this)},toggle:function(t){return"boolean"==typeof t?t?this.show():this.hide():this.each(function(){Ht(this)?pt(this).show():pt(this).hide()})}});var Bt=/^(?:checkbox|radio)$/i,qt=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,Yt=/^$|\/(?:java|ecma)script/i,Wt={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Wt.optgroup=Wt.option,Wt.tbody=Wt.tfoot=Wt.colgroup=Wt.caption=Wt.thead,Wt.th=Wt.td;var Xt=/<|&#?\w+;/;!function(){var t=et.createDocumentFragment(),e=t.appendChild(et.createElement("div")),n=et.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),ht.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",ht.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var Qt=et.documentElement,Zt=/^key/,Jt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Kt=/^([^.]*)(?:\.(.+)|)/;pt.event={global:{},add:function(t,e,n,r,i){var a,o,s,u,c,l,f,h,d,p,g,v=Vt.get(t);if(v)for(n.handler&&(a=n,n=a.handler,i=a.selector),i&&pt.find.matchesSelector(Qt,i),n.guid||(n.guid=pt.guid++),(u=v.events)||(u=v.events={}),(o=v.handle)||(o=v.handle=function(e){return"undefined"!=typeof pt&&pt.event.triggered!==e.type?pt.event.dispatch.apply(t,arguments):void 0}),e=(e||"").match(kt)||[""],c=e.length;c--;)s=Kt.exec(e[c])||[],d=g=s[1],p=(s[2]||"").split(".").sort(),d&&(f=pt.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=pt.event.special[d]||{},l=pt.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&pt.expr.match.needsContext.test(i),namespace:p.join(".")},a),(h=u[d])||(h=u[d]=[],h.delegateCount=0,f.setup&&f.setup.call(t,r,p,o)!==!1||t.addEventListener&&t.addEventListener(d,o)),f.add&&(f.add.call(t,l),l.handler.guid||(l.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,l):h.push(l),pt.event.global[d]=!0)},remove:function(t,e,n,r,i){var a,o,s,u,c,l,f,h,d,p,g,v=Vt.hasData(t)&&Vt.get(t);if(v&&(u=v.events)){for(e=(e||"").match(kt)||[""],c=e.length;c--;)if(s=Kt.exec(e[c])||[],d=g=s[1],p=(s[2]||"").split(".").sort(),d){for(f=pt.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,h=u[d]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=a=h.length;a--;)l=h[a],!i&&g!==l.origType||n&&n.guid!==l.guid||s&&!s.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(h.splice(a,1),l.selector&&h.delegateCount--,f.remove&&f.remove.call(t,l));o&&!h.length&&(f.teardown&&f.teardown.call(t,p,v.handle)!==!1||pt.removeEvent(t,d,v.handle),delete u[d])}else for(d in u)pt.event.remove(t,d+e[c],n,r,!0);pt.isEmptyObject(u)&&Vt.remove(t,"handle events")}},dispatch:function(t){var e,n,r,i,a,o,s=pt.event.fix(t),u=new Array(arguments.length),c=(Vt.get(this,"events")||{})[s.type]||[],l=pt.event.special[s.type]||{};for(u[0]=s,e=1;e<arguments.length;e++)u[e]=arguments[e];if(s.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,s)!==!1){for(o=pt.event.handlers.call(this,s,c),e=0;(i=o[e++])&&!s.isPropagationStopped();)for(s.currentTarget=i.elem,n=0;(a=i.handlers[n++])&&!s.isImmediatePropagationStopped();)s.rnamespace&&!s.rnamespace.test(a.namespace)||(s.handleObj=a,s.data=a.data,r=((pt.event.special[a.origType]||{}).handle||a.handler).apply(i.elem,u),void 0!==r&&(s.result=r)===!1&&(s.preventDefault(),s.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,s),s.result}},handlers:function(t,e){var n,r,i,a,o,s=[],u=e.delegateCount,c=t.target;if(u&&c.nodeType&&!("click"===t.type&&t.button>=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==t.type||c.disabled!==!0)){for(a=[],o={},n=0;n<u;n++)r=e[n],i=r.selector+" ",void 0===o[i]&&(o[i]=r.needsContext?pt(i,this).index(c)>-1:pt.find(i,this,null,[c]).length),o[i]&&a.push(r);a.length&&s.push({elem:c,handlers:a})}return c=this,u<e.length&&s.push({elem:c,handlers:e.slice(u)}),s},addProp:function(t,e){Object.defineProperty(pt.Event.prototype,t,{enumerable:!0,configurable:!0,get:pt.isFunction(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(t){return t[pt.expando]?t:new pt.Event(t)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==$()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===$()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&pt.nodeName(this,"input"))return this.click(),!1},_default:function(t){return pt.nodeName(t.target,"a")}},beforeunload:{postDispatch:function(t){void 0!==t.result&&t.originalEvent&&(t.originalEvent.returnValue=t.result)}}}},pt.removeEvent=function(t,e,n){t.removeEventListener&&t.removeEventListener(e,n)},pt.Event=function(t,e){return this instanceof pt.Event?(t&&t.type?(this.originalEvent=t,this.type=t.type,this.isDefaultPrevented=t.defaultPrevented||void 0===t.defaultPrevented&&t.returnValue===!1?_:b,this.target=t.target&&3===t.target.nodeType?t.target.parentNode:t.target,this.currentTarget=t.currentTarget,this.relatedTarget=t.relatedTarget):this.type=t,e&&pt.extend(this,e),this.timeStamp=t&&t.timeStamp||pt.now(),void(this[pt.expando]=!0)):new pt.Event(t,e)},pt.Event.prototype={constructor:pt.Event,isDefaultPrevented:b,isPropagationStopped:b,isImmediatePropagationStopped:b,isSimulated:!1,preventDefault:function(){var t=this.originalEvent;this.isDefaultPrevented=_,t&&!this.isSimulated&&t.preventDefault()},stopPropagation:function(){var t=this.originalEvent;this.isPropagationStopped=_,t&&!this.isSimulated&&t.stopPropagation()},stopImmediatePropagation:function(){var t=this.originalEvent;this.isImmediatePropagationStopped=_,t&&!this.isSimulated&&t.stopImmediatePropagation(),this.stopPropagation()}},pt.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(t){var e=t.button;return null==t.which&&Zt.test(t.type)?null!=t.charCode?t.charCode:t.keyCode:!t.which&&void 0!==e&&Jt.test(t.type)?1&e?1:2&e?3:4&e?2:0:t.which}},pt.event.addProp),pt.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(t,e){pt.event.special[t]={delegateType:e,bindType:e,handle:function(t){var n,r=this,i=t.relatedTarget,a=t.handleObj;return i&&(i===r||pt.contains(r,i))||(t.type=a.origType,n=a.handler.apply(this,arguments),t.type=e),n}}}),pt.fn.extend({on:function(t,e,n,r){return w(this,t,e,n,r)},one:function(t,e,n,r){return w(this,t,e,n,r,1)},off:function(t,e,n){var r,i;if(t&&t.preventDefault&&t.handleObj)return r=t.handleObj,pt(t.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof t){for(i in t)this.off(i,e,t[i]);return this}return e!==!1&&"function"!=typeof e||(n=e,e=void 0),n===!1&&(n=b),this.each(function(){pt.event.remove(this,t,n,e)})}});var te=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ee=/<script|<style|<link/i,ne=/checked\s*(?:[^=]|=\s*.checked.)/i,re=/^true\/(.*)/,ie=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;pt.extend({htmlPrefilter:function(t){return t.replace(te,"<$1></$2>")},clone:function(t,e,n){var r,i,a,o,s=t.cloneNode(!0),u=pt.contains(t.ownerDocument,t);if(!(ht.noCloneChecked||1!==t.nodeType&&11!==t.nodeType||pt.isXMLDoc(t)))for(o=m(s),a=m(t),r=0,i=a.length;r<i;r++)E(a[r],o[r]);if(e)if(n)for(a=a||m(t),o=o||m(s),r=0,i=a.length;r<i;r++)C(a[r],o[r]);else C(t,s);return o=m(s,"script"),o.length>0&&y(o,!u&&m(t,"script")),s},cleanData:function(t){for(var e,n,r,i=pt.event.special,a=0;void 0!==(n=t[a]);a++)if(Dt(n)){if(e=n[Vt.expando]){if(e.events)for(r in e.events)i[r]?pt.event.remove(n,r):pt.removeEvent(n,r,e.handle);n[Vt.expando]=void 0}n[Rt.expando]&&(n[Rt.expando]=void 0)}}}),pt.fn.extend({detach:function(t){return k(this,t,!0)},remove:function(t){return k(this,t)},text:function(t){return Lt(this,function(t){return void 0===t?pt.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)})},null,t,arguments.length)},append:function(){return M(this,arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=S(this,t);e.appendChild(t)}})},prepend:function(){return M(this,arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=S(this,t);e.insertBefore(t,e.firstChild)}})},before:function(){return M(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this)})},after:function(){return M(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)})},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(pt.cleanData(m(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map(function(){return pt.clone(this,t,e)})},html:function(t){return Lt(this,function(t){var e=this[0]||{},n=0,r=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!ee.test(t)&&!Wt[(qt.exec(t)||["",""])[1].toLowerCase()]){t=pt.htmlPrefilter(t);try{for(;n<r;n++)e=this[n]||{},1===e.nodeType&&(pt.cleanData(m(e,!1)),e.innerHTML=t);e=0}catch(t){}}e&&this.empty().append(t)},null,t,arguments.length)},replaceWith:function(){var t=[];return M(this,arguments,function(e){var n=this.parentNode;pt.inArray(this,t)<0&&(pt.cleanData(m(this)),n&&n.replaceChild(e,this))},t)}}),pt.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(t,e){pt.fn[t]=function(t){for(var n,r=[],i=pt(t),a=i.length-1,o=0;o<=a;o++)n=o===a?this:this.clone(!0),pt(i[o])[e](n),at.apply(r,n.get());return this.pushStack(r)}});var ae=/^margin/,oe=new RegExp("^("+jt+")(?!px)[a-z%]+$","i"),se=function(e){var n=e.ownerDocument.defaultView;return n&&n.opener||(n=t),n.getComputedStyle(e)};!function(){function e(){if(s){s.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",s.innerHTML="",Qt.appendChild(o);var e=t.getComputedStyle(s);n="1%"!==e.top,a="2px"===e.marginLeft,r="4px"===e.width,s.style.marginRight="50%",i="4px"===e.marginRight,Qt.removeChild(o),s=null}}var n,r,i,a,o=et.createElement("div"),s=et.createElement("div");s.style&&(s.style.backgroundClip="content-box",s.cloneNode(!0).style.backgroundClip="",ht.clearCloneStyle="content-box"===s.style.backgroundClip,o.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",o.appendChild(s),pt.extend(ht,{pixelPosition:function(){return e(),n},boxSizingReliable:function(){return e(),r},pixelMarginRight:function(){return e(),i},reliableMarginLeft:function(){return e(),a}}))}();var ue=/^(none|table(?!-c[ea]).+)/,ce={position:"absolute",visibility:"hidden",display:"block"},le={letterSpacing:"0",fontWeight:"400"},fe=["Webkit","Moz","ms"],he=et.createElement("div").style;pt.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=P(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:"cssFloat"},style:function(t,e,n,r){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var i,a,o,s=pt.camelCase(e),u=t.style;return e=pt.cssProps[s]||(pt.cssProps[s]=L(s)||s),o=pt.cssHooks[e]||pt.cssHooks[s],void 0===n?o&&"get"in o&&void 0!==(i=o.get(t,!1,r))?i:u[e]:(a=typeof n,"string"===a&&(i=Ft.exec(n))&&i[1]&&(n=p(t,e,i),a="number"),null!=n&&n===n&&("number"===a&&(n+=i&&i[3]||(pt.cssNumber[s]?"":"px")),ht.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),o&&"set"in o&&void 0===(n=o.set(t,n,r))||(u[e]=n)),void 0)}},css:function(t,e,n,r){var i,a,o,s=pt.camelCase(e);return e=pt.cssProps[s]||(pt.cssProps[s]=L(s)||s),o=pt.cssHooks[e]||pt.cssHooks[s],o&&"get"in o&&(i=o.get(t,!0,n)),void 0===i&&(i=P(t,e,r)),"normal"===i&&e in le&&(i=le[e]),""===n||n?(a=parseFloat(i),n===!0||isFinite(a)?a||0:i):i}}),pt.each(["height","width"],function(t,e){pt.cssHooks[e]={get:function(t,n,r){if(n)return!ue.test(pt.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?R(t,e,r):zt(t,ce,function(){return R(t,e,r)})},set:function(t,n,r){var i,a=r&&se(t),o=r&&V(t,e,r,"border-box"===pt.css(t,"boxSizing",!1,a),a);return o&&(i=Ft.exec(n))&&"px"!==(i[3]||"px")&&(t.style[e]=n,n=pt.css(t,e)),D(t,n,o)}}}),pt.cssHooks.marginLeft=O(ht.reliableMarginLeft,function(t,e){if(e)return(parseFloat(P(t,"marginLeft"))||t.getBoundingClientRect().left-zt(t,{marginLeft:0},function(){return t.getBoundingClientRect().left}))+"px"}),pt.each({margin:"",padding:"",border:"Width"},function(t,e){pt.cssHooks[t+e]={expand:function(n){for(var r=0,i={},a="string"==typeof n?n.split(" "):[n];r<4;r++)i[t+Gt[r]+e]=a[r]||a[r-2]||a[0];return i}},ae.test(t)||(pt.cssHooks[t+e].set=D)}),pt.fn.extend({css:function(t,e){return Lt(this,function(t,e,n){var r,i,a={},o=0;if(pt.isArray(e)){for(r=se(t),i=e.length;o<i;o++)a[e[o]]=pt.css(t,e[o],!1,r);return a}return void 0!==n?pt.style(t,e,n):pt.css(t,e)},t,e,arguments.length>1)}}),pt.Tween=I,I.prototype={constructor:I,init:function(t,e,n,r,i,a){this.elem=t,this.prop=n,this.easing=i||pt.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=r,this.unit=a||(pt.cssNumber[n]?"":"px")},cur:function(){var t=I.propHooks[this.prop];return t&&t.get?t.get(this):I.propHooks._default.get(this)},run:function(t){var e,n=I.propHooks[this.prop];return this.options.duration?this.pos=e=pt.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=pt.css(t.elem,t.prop,""),e&&"auto"!==e?e:0)},set:function(t){pt.fx.step[t.prop]?pt.fx.step[t.prop](t):1!==t.elem.nodeType||null==t.elem.style[pt.cssProps[t.prop]]&&!pt.cssHooks[t.prop]?t.elem[t.prop]=t.now:pt.style(t.elem,t.prop,t.now+t.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},pt.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},pt.fx=I.prototype.init,pt.fx.step={};var de,pe,ge=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;pt.Animation=pt.extend(U,{tweeners:{"*":[function(t,e){var n=this.createTween(t,e);return p(n.elem,t,Ft.exec(e),n),n}]},tweener:function(t,e){pt.isFunction(t)?(e=t,t=["*"]):t=t.match(kt);for(var n,r=0,i=t.length;r<i;r++)n=t[r],U.tweeners[n]=U.tweeners[n]||[],U.tweeners[n].unshift(e)},prefilters:[H],prefilter:function(t,e){e?U.prefilters.unshift(t):U.prefilters.push(t)}}),pt.speed=function(t,e,n){var r=t&&"object"==typeof t?pt.extend({},t):{complete:n||!n&&e||pt.isFunction(t)&&t,duration:t,easing:n&&e||e&&!pt.isFunction(e)&&e};return pt.fx.off||et.hidden?r.duration=0:"number"!=typeof r.duration&&(r.duration in pt.fx.speeds?r.duration=pt.fx.speeds[r.duration]:r.duration=pt.fx.speeds._default),null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){pt.isFunction(r.old)&&r.old.call(this),r.queue&&pt.dequeue(this,r.queue)},r},pt.fn.extend({fadeTo:function(t,e,n,r){return this.filter(Ht).css("opacity",0).show().end().animate({opacity:e},t,n,r)},animate:function(t,e,n,r){var i=pt.isEmptyObject(t),a=pt.speed(e,n,r),o=function(){var e=U(this,pt.extend({},t),a);(i||Vt.get(this,"finish"))&&e.stop(!0)};return o.finish=o,i||a.queue===!1?this.each(o):this.queue(a.queue,o)},stop:function(t,e,n){var r=function(t){var e=t.stop;delete t.stop,e(n)};return"string"!=typeof t&&(n=e,e=t,t=void 0),e&&t!==!1&&this.queue(t||"fx",[]),this.each(function(){var e=!0,i=null!=t&&t+"queueHooks",a=pt.timers,o=Vt.get(this);if(i)o[i]&&o[i].stop&&r(o[i]);else for(i in o)o[i]&&o[i].stop&&ve.test(i)&&r(o[i]);for(i=a.length;i--;)a[i].elem!==this||null!=t&&a[i].queue!==t||(a[i].anim.stop(n),e=!1,a.splice(i,1));!e&&n||pt.dequeue(this,t)})},finish:function(t){return t!==!1&&(t=t||"fx"),this.each(function(){var e,n=Vt.get(this),r=n[t+"queue"],i=n[t+"queueHooks"],a=pt.timers,o=r?r.length:0;for(n.finish=!0,pt.queue(this,t,[]),i&&i.stop&&i.stop.call(this,!0),e=a.length;e--;)a[e].elem===this&&a[e].queue===t&&(a[e].anim.stop(!0),a.splice(e,1));for(e=0;e<o;e++)r[e]&&r[e].finish&&r[e].finish.call(this);delete n.finish})}}),pt.each(["toggle","show","hide"],function(t,e){var n=pt.fn[e];pt.fn[e]=function(t,r,i){return null==t||"boolean"==typeof t?n.apply(this,arguments):this.animate(F(e,!0),t,r,i)}}),pt.each({slideDown:F("show"),slideUp:F("hide"),slideToggle:F("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(t,e){pt.fn[t]=function(t,n,r){return this.animate(e,t,n,r)}}),pt.timers=[],pt.fx.tick=function(){var t,e=0,n=pt.timers;for(de=pt.now();e<n.length;e++)t=n[e],t()||n[e]!==t||n.splice(e--,1);n.length||pt.fx.stop(),de=void 0},pt.fx.timer=function(t){pt.timers.push(t),t()?pt.fx.start():pt.timers.pop()},pt.fx.interval=13,pt.fx.start=function(){pe||(pe=t.requestAnimationFrame?t.requestAnimationFrame(N):t.setInterval(pt.fx.tick,pt.fx.interval))},pt.fx.stop=function(){t.cancelAnimationFrame?t.cancelAnimationFrame(pe):t.clearInterval(pe),pe=null},pt.fx.speeds={slow:600,fast:200,_default:400},pt.fn.delay=function(e,n){return e=pt.fx?pt.fx.speeds[e]||e:e,n=n||"fx",this.queue(n,function(n,r){var i=t.setTimeout(n,e);r.stop=function(){t.clearTimeout(i)}})},function(){var t=et.createElement("input"),e=et.createElement("select"),n=e.appendChild(et.createElement("option"));t.type="checkbox",ht.checkOn=""!==t.value,ht.optSelected=n.selected,t=et.createElement("input"),t.value="t",t.type="radio",ht.radioValue="t"===t.value}();var me,ye=pt.expr.attrHandle;pt.fn.extend({attr:function(t,e){return Lt(this,pt.attr,t,e,arguments.length>1)},removeAttr:function(t){return this.each(function(){pt.removeAttr(this,t)})}}),pt.extend({attr:function(t,e,n){var r,i,a=t.nodeType;if(3!==a&&8!==a&&2!==a)return"undefined"==typeof t.getAttribute?pt.prop(t,e,n):(1===a&&pt.isXMLDoc(t)||(i=pt.attrHooks[e.toLowerCase()]||(pt.expr.match.bool.test(e)?me:void 0)),void 0!==n?null===n?void pt.removeAttr(t,e):i&&"set"in i&&void 0!==(r=i.set(t,n,e))?r:(t.setAttribute(e,n+""),n):i&&"get"in i&&null!==(r=i.get(t,e))?r:(r=pt.find.attr(t,e),null==r?void 0:r))},attrHooks:{type:{set:function(t,e){if(!ht.radioValue&&"radio"===e&&pt.nodeName(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,r=0,i=e&&e.match(kt);if(i&&1===t.nodeType)for(;n=i[r++];)t.removeAttribute(n)}}),me={set:function(t,e,n){return e===!1?pt.removeAttr(t,n):t.setAttribute(n,n),n}},pt.each(pt.expr.match.bool.source.match(/\w+/g),function(t,e){var n=ye[e]||pt.find.attr;ye[e]=function(t,e,r){var i,a,o=e.toLowerCase();return r||(a=ye[o],ye[o]=i,i=null!=n(t,e,r)?o:null,ye[o]=a),i}});var xe=/^(?:input|select|textarea|button)$/i,_e=/^(?:a|area)$/i;pt.fn.extend({prop:function(t,e){return Lt(this,pt.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each(function(){delete this[pt.propFix[t]||t]})}}),pt.extend({prop:function(t,e,n){var r,i,a=t.nodeType;if(3!==a&&8!==a&&2!==a)return 1===a&&pt.isXMLDoc(t)||(e=pt.propFix[e]||e,i=pt.propHooks[e]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(t,n,e))?r:t[e]=n:i&&"get"in i&&null!==(r=i.get(t,e))?r:t[e]},propHooks:{tabIndex:{get:function(t){var e=pt.find.attr(t,"tabindex");return e?parseInt(e,10):xe.test(t.nodeName)||_e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),ht.optSelected||(pt.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),pt.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pt.propFix[this.toLowerCase()]=this}),pt.fn.extend({addClass:function(t){var e,n,r,i,a,o,s,u=0;if(pt.isFunction(t))return this.each(function(e){pt(this).addClass(t.call(this,e,q(this)))});if("string"==typeof t&&t)for(e=t.match(kt)||[];n=this[u++];)if(i=q(n),r=1===n.nodeType&&" "+B(i)+" "){for(o=0;a=e[o++];)r.indexOf(" "+a+" ")<0&&(r+=a+" ");s=B(r),i!==s&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,a,o,s,u=0;if(pt.isFunction(t))return this.each(function(e){pt(this).removeClass(t.call(this,e,q(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof t&&t)for(e=t.match(kt)||[];n=this[u++];)if(i=q(n),r=1===n.nodeType&&" "+B(i)+" "){for(o=0;a=e[o++];)for(;r.indexOf(" "+a+" ")>-1;)r=r.replace(" "+a+" "," ");s=B(r),i!==s&&n.setAttribute("class",s)}return this},toggleClass:function(t,e){var n=typeof t;return"boolean"==typeof e&&"string"===n?e?this.addClass(t):this.removeClass(t):pt.isFunction(t)?this.each(function(n){pt(this).toggleClass(t.call(this,n,q(this),e),e)}):this.each(function(){var e,r,i,a;if("string"===n)for(r=0,i=pt(this),a=t.match(kt)||[];e=a[r++];)i.hasClass(e)?i.removeClass(e):i.addClass(e);else void 0!==t&&"boolean"!==n||(e=q(this),e&&Vt.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||t===!1?"":Vt.get(this,"__className__")||""))})},hasClass:function(t){var e,n,r=0;for(e=" "+t+" ";n=this[r++];)if(1===n.nodeType&&(" "+B(q(n))+" ").indexOf(e)>-1)return!0;return!1}});var be=/\r/g;pt.fn.extend({val:function(t){var e,n,r,i=this[0];{if(arguments.length)return r=pt.isFunction(t),this.each(function(n){var i;1===this.nodeType&&(i=r?t.call(this,n,pt(this).val()):t,null==i?i="":"number"==typeof i?i+="":pt.isArray(i)&&(i=pt.map(i,function(t){return null==t?"":t+""})),e=pt.valHooks[this.type]||pt.valHooks[this.nodeName.toLowerCase()],e&&"set"in e&&void 0!==e.set(this,i,"value")||(this.value=i))});if(i)return e=pt.valHooks[i.type]||pt.valHooks[i.nodeName.toLowerCase()],e&&"get"in e&&void 0!==(n=e.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(be,""):null==n?"":n)}}}),pt.extend({valHooks:{option:{get:function(t){var e=pt.find.attr(t,"value");return null!=e?e:B(pt.text(t))}},select:{get:function(t){var e,n,r,i=t.options,a=t.selectedIndex,o="select-one"===t.type,s=o?null:[],u=o?a+1:i.length;for(r=a<0?u:o?a:0;r<u;r++)if(n=i[r],(n.selected||r===a)&&!n.disabled&&(!n.parentNode.disabled||!pt.nodeName(n.parentNode,"optgroup"))){if(e=pt(n).val(),o)return e;s.push(e)}return s},set:function(t,e){for(var n,r,i=t.options,a=pt.makeArray(e),o=i.length;o--;)r=i[o],(r.selected=pt.inArray(pt.valHooks.option.get(r),a)>-1)&&(n=!0);return n||(t.selectedIndex=-1),a}}}}),pt.each(["radio","checkbox"],function(){pt.valHooks[this]={set:function(t,e){if(pt.isArray(e))return t.checked=pt.inArray(pt(t).val(),e)>-1}},ht.checkOn||(pt.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})});var $e=/^(?:focusinfocus|focusoutblur)$/;pt.extend(pt.event,{trigger:function(e,n,r,i){var a,o,s,u,c,l,f,h=[r||et],d=ct.call(e,"type")?e.type:e,p=ct.call(e,"namespace")?e.namespace.split("."):[];if(o=s=r=r||et,3!==r.nodeType&&8!==r.nodeType&&!$e.test(d+pt.event.triggered)&&(d.indexOf(".")>-1&&(p=d.split("."),d=p.shift(),p.sort()),c=d.indexOf(":")<0&&"on"+d,e=e[pt.expando]?e:new pt.Event(d,"object"==typeof e&&e),e.isTrigger=i?2:3,e.namespace=p.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),n=null==n?[e]:pt.makeArray(n,[e]),f=pt.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!pt.isWindow(r)){for(u=f.delegateType||d,$e.test(u+d)||(o=o.parentNode);o;o=o.parentNode)h.push(o),s=o;s===(r.ownerDocument||et)&&h.push(s.defaultView||s.parentWindow||t)}for(a=0;(o=h[a++])&&!e.isPropagationStopped();)e.type=a>1?u:f.bindType||d,l=(Vt.get(o,"events")||{})[e.type]&&Vt.get(o,"handle"),l&&l.apply(o,n),l=c&&o[c],l&&l.apply&&Dt(o)&&(e.result=l.apply(o,n),e.result===!1&&e.preventDefault());return e.type=d,i||e.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!Dt(r)||c&&pt.isFunction(r[d])&&!pt.isWindow(r)&&(s=r[c],s&&(r[c]=null),pt.event.triggered=d,r[d](),pt.event.triggered=void 0,s&&(r[c]=s)),e.result}},simulate:function(t,e,n){var r=pt.extend(new pt.Event,n,{type:t,isSimulated:!0});pt.event.trigger(r,null,e)}}),pt.fn.extend({trigger:function(t,e){return this.each(function(){pt.event.trigger(t,e,this)})},triggerHandler:function(t,e){var n=this[0];if(n)return pt.event.trigger(t,e,n,!0)}}),pt.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(t,e){pt.fn[e]=function(t,n){return arguments.length>0?this.on(e,null,t,n):this.trigger(e)}}),pt.fn.extend({hover:function(t,e){return this.mouseenter(t).mouseleave(e||t)}}),ht.focusin="onfocusin"in t,ht.focusin||pt.each({focus:"focusin",blur:"focusout"},function(t,e){var n=function(t){pt.event.simulate(e,t.target,pt.event.fix(t))};pt.event.special[e]={setup:function(){var r=this.ownerDocument||this,i=Vt.access(r,e);i||r.addEventListener(t,n,!0),Vt.access(r,e,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=Vt.access(r,e)-1;i?Vt.access(r,e,i):(r.removeEventListener(t,n,!0),Vt.remove(r,e))}}});var we=t.location,Se=pt.now(),Te=/\?/;pt.parseXML=function(e){var n;if(!e||"string"!=typeof e)return null;try{n=(new t.DOMParser).parseFromString(e,"text/xml")}catch(t){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||pt.error("Invalid XML: "+e),n};var Ae=/\[\]$/,Ce=/\r?\n/g,Ee=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;pt.param=function(t,e){var n,r=[],i=function(t,e){var n=pt.isFunction(e)?e():e;r[r.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(pt.isArray(t)||t.jquery&&!pt.isPlainObject(t))pt.each(t,function(){i(this.name,this.value)});else for(n in t)Y(n,t[n],e,i);return r.join("&")},pt.fn.extend({serialize:function(){return pt.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var t=pt.prop(this,"elements");return t?pt.makeArray(t):this}).filter(function(){var t=this.type;return this.name&&!pt(this).is(":disabled")&&Me.test(this.nodeName)&&!Ee.test(t)&&(this.checked||!Bt.test(t))}).map(function(t,e){var n=pt(this).val();return null==n?null:pt.isArray(n)?pt.map(n,function(t){return{name:e.name,value:t.replace(Ce,"\r\n")}}):{name:e.name,value:n.replace(Ce,"\r\n")}}).get()}});var ke=/%20/g,Pe=/#.*$/,Oe=/([?&])_=[^&]*/,Le=/^(.*?):[ \t]*([^\r\n]*)$/gm,De=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ve=/^(?:GET|HEAD)$/,Re=/^\/\//,Ie={},Ne={},je="*/".concat("*"),Fe=et.createElement("a");Fe.href=we.href,pt.extend({active:0,
lastModified:{},etag:{},ajaxSettings:{url:we.href,type:"GET",isLocal:De.test(we.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":je,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":pt.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Q(Q(t,pt.ajaxSettings),e):Q(pt.ajaxSettings,t)},ajaxPrefilter:W(Ie),ajaxTransport:W(Ne),ajax:function(e,n){function r(e,n,r,s){var c,h,d,_,b,$=n;l||(l=!0,u&&t.clearTimeout(u),i=void 0,o=s||"",w.readyState=e>0?4:0,c=e>=200&&e<300||304===e,r&&(_=Z(p,w,r)),_=J(p,_,w,c),c?(p.ifModified&&(b=w.getResponseHeader("Last-Modified"),b&&(pt.lastModified[a]=b),b=w.getResponseHeader("etag"),b&&(pt.etag[a]=b)),204===e||"HEAD"===p.type?$="nocontent":304===e?$="notmodified":($=_.state,h=_.data,d=_.error,c=!d)):(d=$,!e&&$||($="error",e<0&&(e=0))),w.status=e,w.statusText=(n||$)+"",c?m.resolveWith(g,[h,$,w]):m.rejectWith(g,[w,$,d]),w.statusCode(x),x=void 0,f&&v.trigger(c?"ajaxSuccess":"ajaxError",[w,p,c?h:d]),y.fireWith(g,[w,$]),f&&(v.trigger("ajaxComplete",[w,p]),--pt.active||pt.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=void 0),n=n||{};var i,a,o,s,u,c,l,f,h,d,p=pt.ajaxSetup({},n),g=p.context||p,v=p.context&&(g.nodeType||g.jquery)?pt(g):pt.event,m=pt.Deferred(),y=pt.Callbacks("once memory"),x=p.statusCode||{},_={},b={},$="canceled",w={readyState:0,getResponseHeader:function(t){var e;if(l){if(!s)for(s={};e=Le.exec(o);)s[e[1].toLowerCase()]=e[2];e=s[t.toLowerCase()]}return null==e?null:e},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(t,e){return null==l&&(t=b[t.toLowerCase()]=b[t.toLowerCase()]||t,_[t]=e),this},overrideMimeType:function(t){return null==l&&(p.mimeType=t),this},statusCode:function(t){var e;if(t)if(l)w.always(t[w.status]);else for(e in t)x[e]=[x[e],t[e]];return this},abort:function(t){var e=t||$;return i&&i.abort(e),r(0,e),this}};if(m.promise(w),p.url=((e||p.url||we.href)+"").replace(Re,we.protocol+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(kt)||[""],null==p.crossDomain){c=et.createElement("a");try{c.href=p.url,c.href=c.href,p.crossDomain=Fe.protocol+"//"+Fe.host!=c.protocol+"//"+c.host}catch(t){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=pt.param(p.data,p.traditional)),X(Ie,p,n,w),l)return w;f=pt.event&&p.global,f&&0===pt.active++&&pt.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Ve.test(p.type),a=p.url.replace(Pe,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(ke,"+")):(d=p.url.slice(a.length),p.data&&(a+=(Te.test(a)?"&":"?")+p.data,delete p.data),p.cache===!1&&(a=a.replace(Oe,"$1"),d=(Te.test(a)?"&":"?")+"_="+Se++ +d),p.url=a+d),p.ifModified&&(pt.lastModified[a]&&w.setRequestHeader("If-Modified-Since",pt.lastModified[a]),pt.etag[a]&&w.setRequestHeader("If-None-Match",pt.etag[a])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&w.setRequestHeader("Content-Type",p.contentType),w.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+je+"; q=0.01":""):p.accepts["*"]);for(h in p.headers)w.setRequestHeader(h,p.headers[h]);if(p.beforeSend&&(p.beforeSend.call(g,w,p)===!1||l))return w.abort();if($="abort",y.add(p.complete),w.done(p.success),w.fail(p.error),i=X(Ne,p,n,w)){if(w.readyState=1,f&&v.trigger("ajaxSend",[w,p]),l)return w;p.async&&p.timeout>0&&(u=t.setTimeout(function(){w.abort("timeout")},p.timeout));try{l=!1,i.send(_,r)}catch(t){if(l)throw t;r(-1,t)}}else r(-1,"No Transport");return w},getJSON:function(t,e,n){return pt.get(t,e,n,"json")},getScript:function(t,e){return pt.get(t,void 0,e,"script")}}),pt.each(["get","post"],function(t,e){pt[e]=function(t,n,r,i){return pt.isFunction(n)&&(i=i||r,r=n,n=void 0),pt.ajax(pt.extend({url:t,type:e,dataType:i,data:n,success:r},pt.isPlainObject(t)&&t))}}),pt._evalUrl=function(t){return pt.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},pt.fn.extend({wrapAll:function(t){var e;return this[0]&&(pt.isFunction(t)&&(t=t.call(this[0])),e=pt(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t}).append(this)),this},wrapInner:function(t){return pt.isFunction(t)?this.each(function(e){pt(this).wrapInner(t.call(this,e))}):this.each(function(){var e=pt(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)})},wrap:function(t){var e=pt.isFunction(t);return this.each(function(n){pt(this).wrapAll(e?t.call(this,n):t)})},unwrap:function(t){return this.parent(t).not("body").each(function(){pt(this).replaceWith(this.childNodes)}),this}}),pt.expr.pseudos.hidden=function(t){return!pt.expr.pseudos.visible(t)},pt.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},pt.ajaxSettings.xhr=function(){try{return new t.XMLHttpRequest}catch(t){}};var Ge={0:200,1223:204},He=pt.ajaxSettings.xhr();ht.cors=!!He&&"withCredentials"in He,ht.ajax=He=!!He,pt.ajaxTransport(function(e){var n,r;if(ht.cors||He&&!e.crossDomain)return{send:function(i,a){var o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(o in e.xhrFields)s[o]=e.xhrFields[o];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(o in i)s.setRequestHeader(o,i[o]);n=function(t){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.onreadystatechange=null,"abort"===t?s.abort():"error"===t?"number"!=typeof s.status?a(0,"error"):a(s.status,s.statusText):a(Ge[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&t.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(e.hasContent&&e.data||null)}catch(t){if(n)throw t}},abort:function(){n&&n()}}}),pt.ajaxPrefilter(function(t){t.crossDomain&&(t.contents.script=!1)}),pt.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return pt.globalEval(t),t}}}),pt.ajaxPrefilter("script",function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")}),pt.ajaxTransport("script",function(t){if(t.crossDomain){var e,n;return{send:function(r,i){e=pt("<script>").prop({charset:t.scriptCharset,src:t.url}).on("load error",n=function(t){e.remove(),n=null,t&&i("error"===t.type?404:200,t.type)}),et.head.appendChild(e[0])},abort:function(){n&&n()}}}});var ze=[],Ue=/(=)\?(?=&|$)|\?\?/;pt.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var t=ze.pop()||pt.expando+"_"+Se++;return this[t]=!0,t}}),pt.ajaxPrefilter("json jsonp",function(e,n,r){var i,a,o,s=e.jsonp!==!1&&(Ue.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ue.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return i=e.jsonpCallback=pt.isFunction(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(Ue,"$1"+i):e.jsonp!==!1&&(e.url+=(Te.test(e.url)?"&":"?")+e.jsonp+"="+i),e.converters["script json"]=function(){return o||pt.error(i+" was not called"),o[0]},e.dataTypes[0]="json",a=t[i],t[i]=function(){o=arguments},r.always(function(){void 0===a?pt(t).removeProp(i):t[i]=a,e[i]&&(e.jsonpCallback=n.jsonpCallback,ze.push(i)),o&&pt.isFunction(a)&&a(o[0]),o=a=void 0}),"script"}),ht.createHTMLDocument=function(){var t=et.implementation.createHTMLDocument("").body;return t.innerHTML="<form></form><form></form>",2===t.childNodes.length}(),pt.parseHTML=function(t,e,n){if("string"!=typeof t)return[];"boolean"==typeof e&&(n=e,e=!1);var r,i,a;return e||(ht.createHTMLDocument?(e=et.implementation.createHTMLDocument(""),r=e.createElement("base"),r.href=et.location.href,e.head.appendChild(r)):e=et),i=wt.exec(t),a=!n&&[],i?[e.createElement(i[1])]:(i=x([t],e,a),a&&a.length&&pt(a).remove(),pt.merge([],i.childNodes))},pt.fn.load=function(t,e,n){var r,i,a,o=this,s=t.indexOf(" ");return s>-1&&(r=B(t.slice(s)),t=t.slice(0,s)),pt.isFunction(e)?(n=e,e=void 0):e&&"object"==typeof e&&(i="POST"),o.length>0&&pt.ajax({url:t,type:i||"GET",dataType:"html",data:e}).done(function(t){a=arguments,o.html(r?pt("<div>").append(pt.parseHTML(t)).find(r):t)}).always(n&&function(t,e){o.each(function(){n.apply(this,a||[t.responseText,e,t])})}),this},pt.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(t,e){pt.fn[e]=function(t){return this.on(e,t)}}),pt.expr.pseudos.animated=function(t){return pt.grep(pt.timers,function(e){return t===e.elem}).length},pt.offset={setOffset:function(t,e,n){var r,i,a,o,s,u,c,l=pt.css(t,"position"),f=pt(t),h={};"static"===l&&(t.style.position="relative"),s=f.offset(),a=pt.css(t,"top"),u=pt.css(t,"left"),c=("absolute"===l||"fixed"===l)&&(a+u).indexOf("auto")>-1,c?(r=f.position(),o=r.top,i=r.left):(o=parseFloat(a)||0,i=parseFloat(u)||0),pt.isFunction(e)&&(e=e.call(t,n,pt.extend({},s))),null!=e.top&&(h.top=e.top-s.top+o),null!=e.left&&(h.left=e.left-s.left+i),"using"in e?e.using.call(t,h):f.css(h)}},pt.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){pt.offset.setOffset(this,t,e)});var e,n,r,i,a=this[0];if(a)return a.getClientRects().length?(r=a.getBoundingClientRect(),r.width||r.height?(i=a.ownerDocument,n=K(i),e=i.documentElement,{top:r.top+n.pageYOffset-e.clientTop,left:r.left+n.pageXOffset-e.clientLeft}):r):{top:0,left:0}},position:function(){if(this[0]){var t,e,n=this[0],r={top:0,left:0};return"fixed"===pt.css(n,"position")?e=n.getBoundingClientRect():(t=this.offsetParent(),e=this.offset(),pt.nodeName(t[0],"html")||(r=t.offset()),r={top:r.top+pt.css(t[0],"borderTopWidth",!0),left:r.left+pt.css(t[0],"borderLeftWidth",!0)}),{top:e.top-r.top-pt.css(n,"marginTop",!0),left:e.left-r.left-pt.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent;t&&"static"===pt.css(t,"position");)t=t.offsetParent;return t||Qt})}}),pt.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,e){var n="pageYOffset"===e;pt.fn[t]=function(r){return Lt(this,function(t,r,i){var a=K(t);return void 0===i?a?a[e]:t[r]:void(a?a.scrollTo(n?a.pageXOffset:i,n?i:a.pageYOffset):t[r]=i)},t,r,arguments.length)}}),pt.each(["top","left"],function(t,e){pt.cssHooks[e]=O(ht.pixelPosition,function(t,n){if(n)return n=P(t,e),oe.test(n)?pt(t).position()[e]+"px":n})}),pt.each({Height:"height",Width:"width"},function(t,e){pt.each({padding:"inner"+t,content:e,"":"outer"+t},function(n,r){pt.fn[r]=function(i,a){var o=arguments.length&&(n||"boolean"!=typeof i),s=n||(i===!0||a===!0?"margin":"border");return Lt(this,function(e,n,i){var a;return pt.isWindow(e)?0===r.indexOf("outer")?e["inner"+t]:e.document.documentElement["client"+t]:9===e.nodeType?(a=e.documentElement,Math.max(e.body["scroll"+t],a["scroll"+t],e.body["offset"+t],a["offset"+t],a["client"+t])):void 0===i?pt.css(e,n,s):pt.style(e,n,i,s)},e,o?i:void 0,o)}})}),pt.fn.extend({bind:function(t,e,n){return this.on(t,null,e,n)},unbind:function(t,e){return this.off(t,null,e)},delegate:function(t,e,n,r){return this.on(e,t,n,r)},undelegate:function(t,e,n){return 1===arguments.length?this.off(t,"**"):this.off(e,t||"**",n)}}),pt.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return pt});var Be=t.jQuery,qe=t.$;return pt.noConflict=function(e){return t.$===pt&&(t.$=qe),e&&t.jQuery===pt&&(t.jQuery=Be),pt},e||(t.jQuery=t.$=pt),pt}),function(t,e){"object"==typeof module&&module.exports?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Spinner=e()}(this,function(){"use strict";function t(t,e){var n,r=document.createElement(t||"div");for(n in e)r[n]=e[n];return r}function e(t){for(var e=1,n=arguments.length;e<n;e++)t.appendChild(arguments[e]);return t}function n(t,e,n,r){var i=["opacity",e,~~(100*t),n,r].join("-"),a=.01+n/r*100,o=Math.max(1-(1-t)/e*(100-a),t),s=c.substring(0,c.indexOf("Animation")).toLowerCase(),u=s&&"-"+s+"-"||"";return h[i]||(l.insertRule("@"+u+"keyframes "+i+"{0%{opacity:"+o+"}"+a+"%{opacity:"+t+"}"+(a+.01)+"%{opacity:1}"+(a+e)%100+"%{opacity:"+t+"}100%{opacity:"+o+"}}",l.cssRules.length),h[i]=1),i}function r(t,e){var n,r,i=t.style;if(e=e.charAt(0).toUpperCase()+e.slice(1),void 0!==i[e])return e;for(r=0;r<f.length;r++)if(n=f[r]+e,void 0!==i[n])return n}function i(t,e){for(var n in e)t.style[r(t,n)||n]=e[n];return t}function a(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)void 0===t[r]&&(t[r]=n[r])}return t}function o(t,e){return"string"==typeof t?t:t[e%t.length]}function s(t){this.opts=a(t||{},s.defaults,d)}function u(){function n(e,n){return t("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',n)}l.addRule(".spin-vml","behavior:url(#default#VML)"),s.prototype.lines=function(t,r){function a(){return i(n("group",{coordsize:l+" "+l,coordorigin:-c+" "+-c}),{width:l,height:l})}function s(t,s,u){e(h,e(i(a(),{rotation:360/r.lines*t+"deg",left:~~s}),e(i(n("roundrect",{arcsize:r.corners}),{width:c,height:r.scale*r.width,left:r.scale*r.radius,top:-r.scale*r.width>>1,filter:u}),n("fill",{color:o(r.color,t),opacity:r.opacity}),n("stroke",{opacity:0}))))}var u,c=r.scale*(r.length+r.width),l=2*r.scale*c,f=-(r.width+r.length)*r.scale*2+"px",h=i(a(),{position:"absolute",top:f,left:f});if(r.shadow)for(u=1;u<=r.lines;u++)s(u,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(u=1;u<=r.lines;u++)s(u);return e(t,h)},s.prototype.opacity=function(t,e,n,r){var i=t.firstChild;r=r.shadow&&r.lines||0,i&&e+r<i.childNodes.length&&(i=i.childNodes[e+r],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}}var c,l,f=["webkit","Moz","ms","O"],h={},d={lines:12,length:7,width:5,radius:10,scale:1,corners:1,color:"#000",opacity:.25,rotate:0,direction:1,speed:1,trail:100,fps:20,zIndex:2e9,className:"spinner",top:"50%",left:"50%",shadow:!1,hwaccel:!1,position:"absolute"};if(s.defaults={},a(s.prototype,{spin:function(e){this.stop();var n=this,r=n.opts,a=n.el=t(null,{className:r.className});if(i(a,{position:r.position,width:0,zIndex:r.zIndex,left:r.left,top:r.top}),e&&e.insertBefore(a,e.firstChild||null),a.setAttribute("role","progressbar"),n.lines(a,n.opts),!c){var o,s=0,u=(r.lines-1)*(1-r.direction)/2,l=r.fps,f=l/r.speed,h=(1-r.opacity)/(f*r.trail/100),d=f/r.lines;!function t(){s++;for(var e=0;e<r.lines;e++)o=Math.max(1-(s+(r.lines-e)*d)%f*h,r.opacity),n.opacity(a,e*r.direction+u,o,r);n.timeout=n.el&&setTimeout(t,~~(1e3/l))}()}return n},stop:function(){var t=this.el;return t&&(clearTimeout(this.timeout),t.parentNode&&t.parentNode.removeChild(t),this.el=void 0),this},lines:function(r,a){function s(e,n){return i(t(),{position:"absolute",width:a.scale*(a.length+a.width)+"px",height:a.scale*a.width+"px",background:e,boxShadow:n,transformOrigin:"left",transform:"rotate("+~~(360/a.lines*l+a.rotate)+"deg) translate("+a.scale*a.radius+"px,0)",borderRadius:(a.corners*a.scale*a.width>>1)+"px"})}for(var u,l=0,f=(a.lines-1)*(1-a.direction)/2;l<a.lines;l++)u=i(t(),{position:"absolute",top:1+~(a.scale*a.width/2)+"px",transform:a.hwaccel?"translate3d(0,0,0)":"",opacity:a.opacity,animation:c&&n(a.opacity,a.trail,f+l*a.direction,a.lines)+" "+1/a.speed+"s linear infinite"}),a.shadow&&e(u,i(s("#000","0 0 4px #000"),{top:"2px"})),e(r,e(u,s(o(a.color,l),"0 0 1px rgba(0,0,0,.1)")));return r},opacity:function(t,e,n){e<t.childNodes.length&&(t.childNodes[e].style.opacity=n)}}),"undefined"!=typeof document){l=function(){var n=t("style",{type:"text/css"});return e(document.getElementsByTagName("head")[0],n),n.sheet||n.styleSheet}();var p=i(t("group"),{behavior:"url(#default#VML)"});!r(p,"transform")&&p.adj?u():c=r(p,"animation")}return s}),!function(){function t(t){return t&&(t.ownerDocument||t.document||t).documentElement}function e(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}function n(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}function r(t){return null===t?NaN:+t}function i(t){return!isNaN(t)}function a(t){return{left:function(e,n,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=e.length);r<i;){var a=r+i>>>1;t(e[a],n)<0?r=a+1:i=a}return r},right:function(e,n,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=e.length);r<i;){var a=r+i>>>1;t(e[a],n)>0?i=a:r=a+1}return r}}}function o(t){return t.length}function s(t){for(var e=1;t*e%1;)e*=10;return e}function u(t,e){for(var n in e)Object.defineProperty(t.prototype,n,{value:e[n],enumerable:!1})}function c(){this._=Object.create(null)}function l(t){return(t+="")===xo||t[0]===_o?_o+t:t}function f(t){return(t+="")[0]===_o?t.slice(1):t}function h(t){return l(t)in this._}function d(t){return(t=l(t))in this._&&delete this._[t]}function p(){var t=[];for(var e in this._)t.push(f(e));return t}function g(){var t=0;for(var e in this._)++t;return t}function v(){for(var t in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(t){return t}function x(t,e,n){return function(){var r=n.apply(e,arguments);return r===e?t:r}}function _(t,e){if(e in t)return e;e=e.charAt(0).toUpperCase()+e.slice(1);for(var n=0,r=bo.length;n<r;++n){var i=bo[n]+e;if(i in t)return i}}function b(){}function $(){}function w(t){function e(){for(var e,r=n,i=-1,a=r.length;++i<a;)(e=r[i].on)&&e.apply(this,arguments);return t}var n=[],r=new c;return e.on=function(e,i){var a,o=r.get(e);return arguments.length<2?o&&o.on:(o&&(o.on=null,n=n.slice(0,a=n.indexOf(o)).concat(n.slice(a+1)),r.remove(e)),i&&n.push(r.set(e,{on:i})),t)},e}function S(){so.event.preventDefault()}function T(){for(var t,e=so.event;t=e.sourceEvent;)e=t;return e}function A(t){for(var e=new $,n=0,r=arguments.length;++n<r;)e[arguments[n]]=w(e);return e.of=function(n,r){return function(i){try{var a=i.sourceEvent=so.event;i.target=t,so.event=i,e[i.type].apply(n,r)}finally{so.event=a}}},e}function C(t){return wo(t,Co),t}function E(t){return"function"==typeof t?t:function(){return So(t,this)}}function M(t){return"function"==typeof t?t:function(){return To(t,this)}}function k(t,e){function n(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function i(){this.setAttribute(t,e)}function a(){this.setAttributeNS(t.space,t.local,e)}function o(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}function s(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}return t=so.ns.qualify(t),null==e?t.local?r:n:"function"==typeof e?t.local?s:o:t.local?a:i}function P(t){return t.trim().replace(/\s+/g," ")}function O(t){return new RegExp("(?:^|\\s+)"+so.requote(t)+"(?:\\s+|$)","g")}function L(t){return(t+"").trim().split(/^|\s+/)}function D(t,e){function n(){for(var n=-1;++n<i;)t[n](this,e)}function r(){for(var n=-1,r=e.apply(this,arguments);++n<i;)t[n](this,r)}t=L(t).map(V);var i=t.length;return"function"==typeof e?r:n}function V(t){var e=O(t);return function(n,r){if(i=n.classList)return r?i.add(t):i.remove(t);var i=n.getAttribute("class")||"";r?(e.lastIndex=0,e.test(i)||n.setAttribute("class",P(i+" "+t))):n.setAttribute("class",P(i.replace(e," ")))}}function R(t,e,n){function r(){this.style.removeProperty(t)}function i(){this.style.setProperty(t,e,n)}function a(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}return null==e?r:"function"==typeof e?a:i}function I(t,e){function n(){delete this[t]}function r(){this[t]=e}function i(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}return null==e?n:"function"==typeof e?i:r}function N(t){function e(){var e=this.ownerDocument,n=this.namespaceURI;return n===Eo&&e.documentElement.namespaceURI===Eo?e.createElement(t):e.createElementNS(n,t)}function n(){return this.ownerDocument.createElementNS(t.space,t.local)}return"function"==typeof t?t:(t=so.ns.qualify(t)).local?n:e}function j(){var t=this.parentNode;t&&t.removeChild(this)}function F(t){return{__data__:t}}function G(t){return function(){return Ao(this,t)}}function H(t){return arguments.length||(t=n),function(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}}function z(t,e){for(var n=0,r=t.length;n<r;n++)for(var i,a=t[n],o=0,s=a.length;o<s;o++)(i=a[o])&&e(i,o,n);return t}function U(t){return wo(t,ko),t}function B(t){var e,n;return function(r,i,a){var o,s=t[a].update,u=s.length;for(a!=n&&(n=a,e=0),i>=e&&(e=i+1);!(o=s[e])&&++e<u;);return o}}function q(t,e,n){function r(){var e=this[o];e&&(this.removeEventListener(t,e,e.$),delete this[o])}function i(){var i=u(e,co(arguments));r.call(this),this.addEventListener(t,this[o]=i,i.$=n),i._=e}function a(){var e,n=new RegExp("^__on([^.]+)"+so.requote(t)+"$");for(var r in this)if(e=r.match(n)){var i=this[r];this.removeEventListener(e[1],i,i.$),delete this[r]}}var o="__on"+t,s=t.indexOf("."),u=Y;s>0&&(t=t.slice(0,s));var c=Po.get(t);return c&&(t=c,u=W),s?e?i:r:e?b:a}function Y(t,e){return function(n){var r=so.event;so.event=n,e[0]=this.__data__;try{t.apply(this,e)}finally{so.event=r}}}function W(t,e){var n=Y(t,e);return function(t){var e=this,r=t.relatedTarget;r&&(r===e||8&r.compareDocumentPosition(e))||n.call(e,t)}}function X(n){var r=".dragsuppress-"+ ++Lo,i="click"+r,a=so.select(e(n)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Oo&&(Oo=!("onselectstart"in n)&&_(n.style,"userSelect")),Oo){var o=t(n).style,s=o[Oo];o[Oo]="none"}return function(t){if(a.on(r,null),Oo&&(o[Oo]=s),t){var e=function(){a.on(i,null)};a.on(i,function(){S(),e()},!0),setTimeout(e,0)}}}function Q(t,n){n.changedTouches&&(n=n.changedTouches[0]);var r=t.ownerSVGElement||t;if(r.createSVGPoint){var i=r.createSVGPoint();if(Do<0){var a=e(t);if(a.scrollX||a.scrollY){r=so.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Do=!(o.f||o.e),r.remove()}}return Do?(i.x=n.pageX,i.y=n.pageY):(i.x=n.clientX,i.y=n.clientY),i=i.matrixTransform(t.getScreenCTM().inverse()),[i.x,i.y]}var s=t.getBoundingClientRect();return[n.clientX-s.left-t.clientLeft,n.clientY-s.top-t.clientTop]}function Z(){return so.event.changedTouches[0].identifier}function J(t){return t>0?1:t<0?-1:0}function K(t,e,n){return(e[0]-t[0])*(n[1]-t[1])-(e[1]-t[1])*(n[0]-t[0])}function tt(t){return t>1?0:t<-1?Io:Math.acos(t)}function et(t){return t>1?Fo:t<-1?-Fo:Math.asin(t)}function nt(t){return((t=Math.exp(t))-1/t)/2}function rt(t){return((t=Math.exp(t))+1/t)/2}function it(t){return((t=Math.exp(2*t))-1)/(t+1)}function at(t){return(t=Math.sin(t/2))*t}function ot(){}function st(t,e,n){return this instanceof st?(this.h=+t,this.s=+e,void(this.l=+n)):arguments.length<2?t instanceof st?new st(t.h,t.s,t.l):bt(""+t,$t,st):new st(t,e,n)}function ut(t,e,n){function r(t){return t>360?t-=360:t<0&&(t+=360),t<60?a+(o-a)*t/60:t<180?o:t<240?a+(o-a)*(240-t)/60:a}function i(t){return Math.round(255*r(t))}var a,o;return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)?0:e<0?0:e>1?1:e,n=n<0?0:n>1?1:n,o=n<=.5?n*(1+e):n+e-n*e,a=2*n-o,new mt(i(t+120),i(t),i(t-120))}function ct(t,e,n){return this instanceof ct?(this.h=+t,this.c=+e,void(this.l=+n)):arguments.length<2?t instanceof ct?new ct(t.h,t.c,t.l):t instanceof ft?dt(t.l,t.a,t.b):dt((t=wt((t=so.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new ct(t,e,n)}function lt(t,e,n){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new ft(n,Math.cos(t*=Go)*e,Math.sin(t)*e)}function ft(t,e,n){return this instanceof ft?(this.l=+t,this.a=+e,void(this.b=+n)):arguments.length<2?t instanceof ft?new ft(t.l,t.a,t.b):t instanceof ct?lt(t.h,t.c,t.l):wt((t=mt(t)).r,t.g,t.b):new ft(t,e,n)}function ht(t,e,n){var r=(t+16)/116,i=r+e/500,a=r-n/200;return i=pt(i)*Jo,r=pt(r)*Ko,a=pt(a)*ts,new mt(vt(3.2404542*i-1.5371385*r-.4985314*a),vt(-.969266*i+1.8760108*r+.041556*a),vt(.0556434*i-.2040259*r+1.0572252*a))}function dt(t,e,n){return t>0?new ct(Math.atan2(n,e)*Ho,Math.sqrt(e*e+n*n),t):new ct(NaN,NaN,t)}function pt(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function gt(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function vt(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mt(t,e,n){return this instanceof mt?(this.r=~~t,this.g=~~e,void(this.b=~~n)):arguments.length<2?t instanceof mt?new mt(t.r,t.g,t.b):bt(""+t,mt,ut):new mt(t,e,n)}function yt(t){return new mt(t>>16,t>>8&255,255&t)}function xt(t){return yt(t)+""}function _t(t){return t<16?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function bt(t,e,n){var r,i,a,o=0,s=0,u=0;if(r=/([a-z]+)\((.*)\)/.exec(t=t.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return n(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return e(Tt(i[0]),Tt(i[1]),Tt(i[2]))}return(a=rs.get(t))?e(a.r,a.g,a.b):(null==t||"#"!==t.charAt(0)||isNaN(a=parseInt(t.slice(1),16))||(4===t.length?(o=(3840&a)>>4,o=o>>4|o,s=240&a,s=s>>4|s,u=15&a,u=u<<4|u):7===t.length&&(o=(16711680&a)>>16,s=(65280&a)>>8,u=255&a)),e(o,s,u))}function $t(t,e,n){var r,i,a=Math.min(t/=255,e/=255,n/=255),o=Math.max(t,e,n),s=o-a,u=(o+a)/2;return s?(i=u<.5?s/(o+a):s/(2-o-a),r=t==o?(e-n)/s+(e<n?6:0):e==o?(n-t)/s+2:(t-e)/s+4,r*=60):(r=NaN,i=u>0&&u<1?0:r),new st(r,i,u)}function wt(t,e,n){t=St(t),e=St(e),n=St(n);var r=gt((.4124564*t+.3575761*e+.1804375*n)/Jo),i=gt((.2126729*t+.7151522*e+.072175*n)/Ko),a=gt((.0193339*t+.119192*e+.9503041*n)/ts);return ft(116*i-16,500*(r-i),200*(i-a))}function St(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Tt(t){var e=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*e):e}function At(t){return"function"==typeof t?t:function(){return t}}function Ct(t){return function(e,n,r){return 2===arguments.length&&"function"==typeof n&&(r=n,n=null),Et(e,n,t,r)}}function Et(t,e,n,r){function i(){var t,e=u.status;if(!e&&kt(u)||e>=200&&e<300||304===e){try{t=n.call(a,u)}catch(t){return void o.error.call(a,t)}o.load.call(a,t)}else o.error.call(a,u)}var a={},o=so.dispatch("beforesend","progress","load","error"),s={},u=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in u||!/^(http(s)?:)?\/\//.test(t)||(u=new XDomainRequest),"onload"in u?u.onload=u.onerror=i:u.onreadystatechange=function(){u.readyState>3&&i()},u.onprogress=function(t){var e=so.event;so.event=t;try{o.progress.call(a,u)}finally{so.event=e}},a.header=function(t,e){return t=(t+"").toLowerCase(),arguments.length<2?s[t]:(null==e?delete s[t]:s[t]=e+"",a)},a.mimeType=function(t){return arguments.length?(e=null==t?null:t+"",a):e},a.responseType=function(t){return arguments.length?(c=t,a):c},a.response=function(t){return n=t,a},["get","post"].forEach(function(t){a[t]=function(){return a.send.apply(a,[t].concat(co(arguments)))}}),a.send=function(n,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),u.open(n,t,!0),null==e||"accept"in s||(s.accept=e+",*/*"),u.setRequestHeader)for(var l in s)u.setRequestHeader(l,s[l]);return null!=e&&u.overrideMimeType&&u.overrideMimeType(e),null!=c&&(u.responseType=c),null!=i&&a.on("error",i).on("load",function(t){i(null,t)}),o.beforesend.call(a,u),u.send(null==r?null:r),a},a.abort=function(){return u.abort(),a},so.rebind(a,o,"on"),null==r?a:a.get(Mt(r))}function Mt(t){return 1===t.length?function(e,n){t(null==e?n:null)}:t}function kt(t){var e=t.responseType;return e&&"text"!==e?t.response:t.responseText}function Pt(t,e,n){var r=arguments.length;r<2&&(e=0),r<3&&(n=Date.now());var i=n+e,a={c:t,t:i,n:null};return as?as.n=a:is=a,as=a,os||(ss=clearTimeout(ss),os=1,us(Ot)),a}function Ot(){var t=Lt(),e=Dt()-t;e>24?(isFinite(e)&&(clearTimeout(ss),ss=setTimeout(Ot,e)),os=0):(os=1,us(Ot))}function Lt(){for(var t=Date.now(),e=is;e;)t>=e.t&&e.c(t-e.t)&&(e.c=null),e=e.n;return t}function Dt(){for(var t,e=is,n=1/0;e;)e.c?(e.t<n&&(n=e.t),e=(t=e).n):e=t?t.n=e.n:is=e.n;return as=t,n}function Vt(t,e){return e-(t?Math.ceil(Math.log(t)/Math.LN10):1)}function Rt(t,e){var n=Math.pow(10,3*yo(8-e));return{scale:e>8?function(t){return t/n}:function(t){return t*n},symbol:t}}function It(t){var e=t.decimal,n=t.thousands,r=t.grouping,i=t.currency,a=r&&n?function(t,e){for(var i=t.length,a=[],o=0,s=r[0],u=0;i>0&&s>0&&(u+s+1>e&&(s=Math.max(1,e-u)),a.push(t.substring(i-=s,i+s)),!((u+=s+1)>e));)s=r[o=(o+1)%r.length];return a.reverse().join(n)}:y;return function(t){var n=ls.exec(t),r=n[1]||" ",o=n[2]||">",s=n[3]||"-",u=n[4]||"",c=n[5],l=+n[6],f=n[7],h=n[8],d=n[9],p=1,g="",v="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),d){case"n":f=!0,d="g";break;case"%":p=100,v="%",d="f";break;case"p":p=100,v="%",d="r";break;case"b":case"o":case"x":case"X":"#"===u&&(g="0"+d.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,d="r"}"$"===u&&(g=i[0],v=i[1]),"r"!=d||h||(d="g"),null!=h&&("g"==d?h=Math.max(1,Math.min(21,h)):"e"!=d&&"f"!=d||(h=Math.max(0,Math.min(20,h)))),d=fs.get(d)||Nt;var x=c&&f;return function(t){var n=v;if(m&&t%1)return"";var i=t<0||0===t&&1/t<0?(t=-t,"-"):"-"===s?"":s;if(p<0){var u=so.formatPrefix(t,h);t=u.scale(t),n=u.symbol+v}else t*=p;t=d(t,h);var _,b,$=t.lastIndexOf(".");if($<0){var w=y?t.lastIndexOf("e"):-1;w<0?(_=t,b=""):(_=t.substring(0,w),b=t.substring(w))}else _=t.substring(0,$),b=e+t.substring($+1);!c&&f&&(_=a(_,1/0));var S=g.length+_.length+b.length+(x?0:i.length),T=S<l?new Array(S=l-S+1).join(r):"";return x&&(_=a(T+_,T.length?l-b.length:1/0)),i+=g,t=_+b,("<"===o?i+t+T:">"===o?T+i+t:"^"===o?T.substring(0,S>>=1)+i+t+T.substring(S):i+(x?t:T+t))+n}}}function Nt(t){return t+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(t,e,n){function r(e){var n=t(e),r=a(n,1);return e-n<r-e?n:r}function i(n){return e(n=t(new ds(n-1)),1),n}function a(t,n){return e(t=new ds((+t)),n),t}function o(t,r,a){var o=i(t),s=[];if(a>1)for(;o<r;)n(o)%a||s.push(new Date((+o))),e(o,1);else for(;o<r;)s.push(new Date((+o))),e(o,1);return s}function s(t,e,n){try{ds=jt;var r=new jt;return r._=t,o(r,e,n)}finally{ds=Date}}t.floor=t,t.round=r,t.ceil=i,t.offset=a,t.range=o;var u=t.utc=Gt(t);return u.floor=u,u.round=Gt(r),u.ceil=Gt(i),u.offset=Gt(a),u.range=s,t}function Gt(t){return function(e,n){try{ds=jt;var r=new jt;return r._=e,t(r,n)._}finally{ds=Date}}}function Ht(t){function e(t){function e(e){for(var n,i,a,o=[],s=-1,u=0;++s<r;)37===t.charCodeAt(s)&&(o.push(t.slice(u,s)),null!=(i=gs[n=t.charAt(++s)])&&(n=t.charAt(++s)),(a=E[n])&&(n=a(e,null==i?"e"===n?" ":"0":i)),o.push(n),u=s+1);return o.push(t.slice(u,s)),o.join("")}var r=t.length;return e.parse=function(e){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},i=n(r,t,e,0);if(i!=e.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var a=null!=r.Z&&ds!==jt,o=new(a?jt:ds);return"j"in r?o.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(r.w="W"in r?1:0),o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),a?o._:o},e.toString=function(){return t},e}function n(t,e,n,r){for(var i,a,o,s=0,u=e.length,c=n.length;s<u;){if(r>=c)return-1;if(i=e.charCodeAt(s++),37===i){if(o=e.charAt(s++),a=M[o in gs?e.charAt(s++):o],!a||(r=a(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}function r(t,e,n){$.lastIndex=0;var r=$.exec(e.slice(n));return r?(t.w=w.get(r[0].toLowerCase()),n+r[0].length):-1}function i(t,e,n){_.lastIndex=0;var r=_.exec(e.slice(n));
return r?(t.w=b.get(r[0].toLowerCase()),n+r[0].length):-1}function a(t,e,n){A.lastIndex=0;var r=A.exec(e.slice(n));return r?(t.m=C.get(r[0].toLowerCase()),n+r[0].length):-1}function o(t,e,n){S.lastIndex=0;var r=S.exec(e.slice(n));return r?(t.m=T.get(r[0].toLowerCase()),n+r[0].length):-1}function s(t,e,r){return n(t,E.c.toString(),e,r)}function u(t,e,r){return n(t,E.x.toString(),e,r)}function c(t,e,r){return n(t,E.X.toString(),e,r)}function l(t,e,n){var r=x.get(e.slice(n,n+=2).toLowerCase());return null==r?-1:(t.p=r,n)}var f=t.dateTime,h=t.date,d=t.time,p=t.periods,g=t.days,v=t.shortDays,m=t.months,y=t.shortMonths;e.utc=function(t){function n(t){try{ds=jt;var e=new ds;return e._=t,r(e)}finally{ds=Date}}var r=e(t);return n.parse=function(t){try{ds=jt;var e=r.parse(t);return e&&e._}finally{ds=Date}},n.toString=r.toString,n},e.multi=e.utc.multi=ue;var x=so.map(),_=Ut(g),b=Bt(g),$=Ut(v),w=Bt(v),S=Ut(m),T=Bt(m),A=Ut(y),C=Bt(y);p.forEach(function(t,e){x.set(t.toLowerCase(),e)});var E={a:function(t){return v[t.getDay()]},A:function(t){return g[t.getDay()]},b:function(t){return y[t.getMonth()]},B:function(t){return m[t.getMonth()]},c:e(f),d:function(t,e){return zt(t.getDate(),e,2)},e:function(t,e){return zt(t.getDate(),e,2)},H:function(t,e){return zt(t.getHours(),e,2)},I:function(t,e){return zt(t.getHours()%12||12,e,2)},j:function(t,e){return zt(1+hs.dayOfYear(t),e,3)},L:function(t,e){return zt(t.getMilliseconds(),e,3)},m:function(t,e){return zt(t.getMonth()+1,e,2)},M:function(t,e){return zt(t.getMinutes(),e,2)},p:function(t){return p[+(t.getHours()>=12)]},S:function(t,e){return zt(t.getSeconds(),e,2)},U:function(t,e){return zt(hs.sundayOfYear(t),e,2)},w:function(t){return t.getDay()},W:function(t,e){return zt(hs.mondayOfYear(t),e,2)},x:e(h),X:e(d),y:function(t,e){return zt(t.getFullYear()%100,e,2)},Y:function(t,e){return zt(t.getFullYear()%1e4,e,4)},Z:oe,"%":function(){return"%"}},M={a:r,A:i,b:a,B:o,c:s,d:te,e:te,H:ne,I:ne,j:ee,L:ae,m:Kt,M:re,p:l,S:ie,U:Yt,w:qt,W:Wt,x:u,X:c,y:Qt,Y:Xt,Z:Zt,"%":se};return e}function zt(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",a=i.length;return r+(a<n?new Array(n-a+1).join(e)+i:i)}function Ut(t){return new RegExp("^(?:"+t.map(so.requote).join("|")+")","i")}function Bt(t){for(var e=new c,n=-1,r=t.length;++n<r;)e.set(t[n].toLowerCase(),n);return e}function qt(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+1));return r?(t.w=+r[0],n+r[0].length):-1}function Yt(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n));return r?(t.U=+r[0],n+r[0].length):-1}function Wt(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n));return r?(t.W=+r[0],n+r[0].length):-1}function Xt(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+4));return r?(t.y=+r[0],n+r[0].length):-1}function Qt(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+2));return r?(t.y=Jt(+r[0]),n+r[0].length):-1}function Zt(t,e,n){return/^[+-]\d{4}$/.test(e=e.slice(n,n+5))?(t.Z=-e,n+5):-1}function Jt(t){return t+(t>68?1900:2e3)}function Kt(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function te(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function ee(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+3));return r?(t.j=+r[0],n+r[0].length):-1}function ne(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function re(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function ie(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function ae(t,e,n){vs.lastIndex=0;var r=vs.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function oe(t){var e=t.getTimezoneOffset(),n=e>0?"-":"+",r=yo(e)/60|0,i=yo(e)%60;return n+zt(r,"0",2)+zt(i,"0",2)}function se(t,e,n){ms.lastIndex=0;var r=ms.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function ue(t){for(var e=t.length,n=-1;++n<e;)t[n][0]=this(t[n][0]);return function(e){for(var n=0,r=t[n];!r[1](e);)r=t[++n];return r[0](e)}}function ce(){}function le(t,e,n){var r=n.s=t+e,i=r-t,a=r-i;n.t=t-a+(e-i)}function fe(t,e){t&&bs.hasOwnProperty(t.type)&&bs[t.type](t,e)}function he(t,e,n){var r,i=-1,a=t.length-n;for(e.lineStart();++i<a;)r=t[i],e.point(r[0],r[1],r[2]);e.lineEnd()}function de(t,e){var n=-1,r=t.length;for(e.polygonStart();++n<r;)he(t[n],e,1);e.polygonEnd()}function pe(){function t(t,e){t*=Go,e=e*Go/2+Io/4;var n=t-r,o=n>=0?1:-1,s=o*n,u=Math.cos(e),c=Math.sin(e),l=a*c,f=i*u+l*Math.cos(s),h=l*o*Math.sin(s);ws.add(Math.atan2(h,f)),r=t,i=u,a=c}var e,n,r,i,a;Ss.point=function(o,s){Ss.point=t,r=(e=o)*Go,i=Math.cos(s=(n=s)*Go/2+Io/4),a=Math.sin(s)},Ss.lineEnd=function(){t(e,n)}}function ge(t){var e=t[0],n=t[1],r=Math.cos(n);return[r*Math.cos(e),r*Math.sin(e),Math.sin(n)]}function ve(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function me(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function ye(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function xe(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function _e(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function be(t){return[Math.atan2(t[1],t[0]),et(t[2])]}function $e(t,e){return yo(t[0]-e[0])<Vo&&yo(t[1]-e[1])<Vo}function we(t,e){t*=Go;var n=Math.cos(e*=Go);Se(n*Math.cos(t),n*Math.sin(t),Math.sin(e))}function Se(t,e,n){++Ts,Cs+=(t-Cs)/Ts,Es+=(e-Es)/Ts,Ms+=(n-Ms)/Ts}function Te(){function t(t,i){t*=Go;var a=Math.cos(i*=Go),o=a*Math.cos(t),s=a*Math.sin(t),u=Math.sin(i),c=Math.atan2(Math.sqrt((c=n*u-r*s)*c+(c=r*o-e*u)*c+(c=e*s-n*o)*c),e*o+n*s+r*u);As+=c,ks+=c*(e+(e=o)),Ps+=c*(n+(n=s)),Os+=c*(r+(r=u)),Se(e,n,r)}var e,n,r;Rs.point=function(i,a){i*=Go;var o=Math.cos(a*=Go);e=o*Math.cos(i),n=o*Math.sin(i),r=Math.sin(a),Rs.point=t,Se(e,n,r)}}function Ae(){Rs.point=we}function Ce(){function t(t,e){t*=Go;var n=Math.cos(e*=Go),o=n*Math.cos(t),s=n*Math.sin(t),u=Math.sin(e),c=i*u-a*s,l=a*o-r*u,f=r*s-i*o,h=Math.sqrt(c*c+l*l+f*f),d=r*o+i*s+a*u,p=h&&-tt(d)/h,g=Math.atan2(h,d);Ls+=p*c,Ds+=p*l,Vs+=p*f,As+=g,ks+=g*(r+(r=o)),Ps+=g*(i+(i=s)),Os+=g*(a+(a=u)),Se(r,i,a)}var e,n,r,i,a;Rs.point=function(o,s){e=o,n=s,Rs.point=t,o*=Go;var u=Math.cos(s*=Go);r=u*Math.cos(o),i=u*Math.sin(o),a=Math.sin(s),Se(r,i,a)},Rs.lineEnd=function(){t(e,n),Rs.lineEnd=Ae,Rs.point=we}}function Ee(t,e){function n(n,r){return n=t(n,r),e(n[0],n[1])}return t.invert&&e.invert&&(n.invert=function(n,r){return n=e.invert(n,r),n&&t.invert(n[0],n[1])}),n}function Me(){return!0}function ke(t,e,n,r,i){var a=[],o=[];if(t.forEach(function(t){if(!((e=t.length-1)<=0)){var e,n=t[0],r=t[e];if($e(n,r)){i.lineStart();for(var s=0;s<e;++s)i.point((n=t[s])[0],n[1]);return void i.lineEnd()}var u=new Oe(n,t,null,(!0)),c=new Oe(n,null,u,(!1));u.o=c,a.push(u),o.push(c),u=new Oe(r,t,null,(!1)),c=new Oe(r,null,u,(!0)),u.o=c,a.push(u),o.push(c)}}),o.sort(e),Pe(a),Pe(o),a.length){for(var s=0,u=n,c=o.length;s<c;++s)o[s].e=u=!u;for(var l,f,h=a[0];;){for(var d=h,p=!0;d.v;)if((d=d.n)===h)return;l=d.z,i.lineStart();do{if(d.v=d.o.v=!0,d.e){if(p)for(var s=0,c=l.length;s<c;++s)i.point((f=l[s])[0],f[1]);else r(d.x,d.n.x,1,i);d=d.n}else{if(p){l=d.p.z;for(var s=l.length-1;s>=0;--s)i.point((f=l[s])[0],f[1])}else r(d.x,d.p.x,-1,i);d=d.p}d=d.o,l=d.z,p=!p}while(!d.v);i.lineEnd()}}}function Pe(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r<e;)i.n=n=t[r],n.p=i,i=n;i.n=n=t[0],n.p=i}}function Oe(t,e,n,r){this.x=t,this.z=e,this.o=n,this.e=r,this.v=!1,this.n=this.p=null}function Le(t,e,n,r){return function(i,a){function o(e,n){var r=i(e,n);t(e=r[0],n=r[1])&&a.point(e,n)}function s(t,e){var n=i(t,e);v.point(n[0],n[1])}function u(){y.point=s,v.lineStart()}function c(){y.point=o,v.lineEnd()}function l(t,e){g.push([t,e]);var n=i(t,e);_.point(n[0],n[1])}function f(){_.lineStart(),g=[]}function h(){l(g[0][0],g[0][1]),_.lineEnd();var t,e=_.clean(),n=x.buffer(),r=n.length;if(g.pop(),p.push(g),g=null,r)if(1&e){t=n[0];var i,r=t.length-1,o=-1;if(r>0){for(b||(a.polygonStart(),b=!0),a.lineStart();++o<r;)a.point((i=t[o])[0],i[1]);a.lineEnd()}}else r>1&&2&e&&n.push(n.pop().concat(n.shift())),d.push(n.filter(De))}var d,p,g,v=e(a),m=i.invert(r[0],r[1]),y={point:o,lineStart:u,lineEnd:c,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,d=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=u,y.lineEnd=c,d=so.merge(d);var t=Fe(m,p);d.length?(b||(a.polygonStart(),b=!0),ke(d,Re,t,n,a)):t&&(b||(a.polygonStart(),b=!0),a.lineStart(),n(null,null,1,a),a.lineEnd()),b&&(a.polygonEnd(),b=!1),d=p=null},sphere:function(){a.polygonStart(),a.lineStart(),n(null,null,1,a),a.lineEnd(),a.polygonEnd()}},x=Ve(),_=e(x),b=!1;return y}}function De(t){return t.length>1}function Ve(){var t,e=[];return{lineStart:function(){e.push(t=[])},point:function(e,n){t.push([e,n])},lineEnd:b,buffer:function(){var n=e;return e=[],t=null,n},rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))}}}function Re(t,e){return((t=t.x)[0]<0?t[1]-Fo-Vo:Fo-t[1])-((e=e.x)[0]<0?e[1]-Fo-Vo:Fo-e[1])}function Ie(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(a,o){var s=a>0?Io:-Io,u=yo(a-n);yo(u-Io)<Vo?(t.point(n,r=(r+o)/2>0?Fo:-Fo),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),t.point(a,r),e=0):i!==s&&u>=Io&&(yo(n-i)<Vo&&(n-=i*Vo),yo(a-s)<Vo&&(a-=s*Vo),r=Ne(n,r,a,o),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),e=0),t.point(n=a,r=o),i=s},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}function Ne(t,e,n,r){var i,a,o=Math.sin(t-n);return yo(o)>Vo?Math.atan((Math.sin(e)*(a=Math.cos(r))*Math.sin(n)-Math.sin(r)*(i=Math.cos(e))*Math.sin(t))/(i*a*o)):(e+r)/2}function je(t,e,n,r){var i;if(null==t)i=n*Fo,r.point(-Io,i),r.point(0,i),r.point(Io,i),r.point(Io,0),r.point(Io,-i),r.point(0,-i),r.point(-Io,-i),r.point(-Io,0),r.point(-Io,i);else if(yo(t[0]-e[0])>Vo){var a=t[0]<e[0]?Io:-Io;i=n*a/2,r.point(-a,i),r.point(0,i),r.point(a,i)}else r.point(e[0],e[1])}function Fe(t,e){var n=t[0],r=t[1],i=[Math.sin(n),-Math.cos(n),0],a=0,o=0;ws.reset();for(var s=0,u=e.length;s<u;++s){var c=e[s],l=c.length;if(l)for(var f=c[0],h=f[0],d=f[1]/2+Io/4,p=Math.sin(d),g=Math.cos(d),v=1;;){v===l&&(v=0),t=c[v];var m=t[0],y=t[1]/2+Io/4,x=Math.sin(y),_=Math.cos(y),b=m-h,$=b>=0?1:-1,w=$*b,S=w>Io,T=p*x;if(ws.add(Math.atan2(T*$*Math.sin(w),g*_+T*Math.cos(w))),a+=S?b+$*No:b,S^h>=n^m>=n){var A=me(ge(f),ge(t));_e(A);var C=me(i,A);_e(C);var E=(S^b>=0?-1:1)*et(C[2]);(r>E||r===E&&(A[0]||A[1]))&&(o+=S^b>=0?1:-1)}if(!v++)break;h=m,p=x,g=_,f=t}}return(a<-Vo||a<Vo&&ws<-Vo)^1&o}function Ge(t){function e(t,e){return Math.cos(t)*Math.cos(e)>a}function n(t){var n,a,u,c,l;return{lineStart:function(){c=u=!1,l=1},point:function(f,h){var d,p=[f,h],g=e(f,h),v=o?g?0:i(f,h):g?i(f+(f<0?Io:-Io),h):0;if(!n&&(c=u=g)&&t.lineStart(),g!==u&&(d=r(n,p),($e(n,d)||$e(p,d))&&(p[0]+=Vo,p[1]+=Vo,g=e(p[0],p[1]))),g!==u)l=0,g?(t.lineStart(),d=r(p,n),t.point(d[0],d[1])):(d=r(n,p),t.point(d[0],d[1]),t.lineEnd()),n=d;else if(s&&n&&o^g){var m;v&a||!(m=r(p,n,!0))||(l=0,o?(t.lineStart(),t.point(m[0][0],m[0][1]),t.point(m[1][0],m[1][1]),t.lineEnd()):(t.point(m[1][0],m[1][1]),t.lineEnd(),t.lineStart(),t.point(m[0][0],m[0][1])))}!g||n&&$e(n,p)||t.point(p[0],p[1]),n=p,u=g,a=v},lineEnd:function(){u&&t.lineEnd(),n=null},clean:function(){return l|(c&&u)<<1}}}function r(t,e,n){var r=ge(t),i=ge(e),o=[1,0,0],s=me(r,i),u=ve(s,s),c=s[0],l=u-c*c;if(!l)return!n&&t;var f=a*u/l,h=-a*c/l,d=me(o,s),p=xe(o,f),g=xe(s,h);ye(p,g);var v=d,m=ve(p,v),y=ve(v,v),x=m*m-y*(ve(p,p)-1);if(!(x<0)){var _=Math.sqrt(x),b=xe(v,(-m-_)/y);if(ye(b,p),b=be(b),!n)return b;var $,w=t[0],S=e[0],T=t[1],A=e[1];S<w&&($=w,w=S,S=$);var C=S-w,E=yo(C-Io)<Vo,M=E||C<Vo;if(!E&&A<T&&($=T,T=A,A=$),M?E?T+A>0^b[1]<(yo(b[0]-w)<Vo?T:A):T<=b[1]&&b[1]<=A:C>Io^(w<=b[0]&&b[0]<=S)){var k=xe(v,(-m+_)/y);return ye(k,p),[b,be(k)]}}}function i(e,n){var r=o?t:Io-t,i=0;return e<-r?i|=1:e>r&&(i|=2),n<-r?i|=4:n>r&&(i|=8),i}var a=Math.cos(t),o=a>0,s=yo(a)>Vo,u=gn(t,6*Go);return Le(e,n,u,o?[0,-t]:[-Io,t-Io])}function He(t,e,n,r){return function(i){var a,o=i.a,s=i.b,u=o.x,c=o.y,l=s.x,f=s.y,h=0,d=1,p=l-u,g=f-c;if(a=t-u,p||!(a>0)){if(a/=p,p<0){if(a<h)return;a<d&&(d=a)}else if(p>0){if(a>d)return;a>h&&(h=a)}if(a=n-u,p||!(a<0)){if(a/=p,p<0){if(a>d)return;a>h&&(h=a)}else if(p>0){if(a<h)return;a<d&&(d=a)}if(a=e-c,g||!(a>0)){if(a/=g,g<0){if(a<h)return;a<d&&(d=a)}else if(g>0){if(a>d)return;a>h&&(h=a)}if(a=r-c,g||!(a<0)){if(a/=g,g<0){if(a>d)return;a>h&&(h=a)}else if(g>0){if(a<h)return;a<d&&(d=a)}return h>0&&(i.a={x:u+h*p,y:c+h*g}),d<1&&(i.b={x:u+d*p,y:c+d*g}),i}}}}}}function ze(t,e,n,r){function i(r,i){return yo(r[0]-t)<Vo?i>0?0:3:yo(r[0]-n)<Vo?i>0?2:1:yo(r[1]-e)<Vo?i>0?1:0:i>0?3:2}function a(t,e){return o(t.x,e.x)}function o(t,e){var n=i(t,1),r=i(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(s){function u(t){for(var e=0,n=v.length,r=t[1],i=0;i<n;++i)for(var a,o=1,s=v[i],u=s.length,c=s[0];o<u;++o)a=s[o],c[1]<=r?a[1]>r&&K(c,a,t)>0&&++e:a[1]<=r&&K(c,a,t)<0&&--e,c=a;return 0!==e}function c(a,s,u,c){var l=0,f=0;if(null==a||(l=i(a,u))!==(f=i(s,u))||o(a,s)<0^u>0){do c.point(0===l||3===l?t:n,l>1?r:e);while((l=(l+u+4)%4)!==f)}else c.point(s[0],s[1])}function l(i,a){return t<=i&&i<=n&&e<=a&&a<=r}function f(t,e){l(t,e)&&s.point(t,e)}function h(){M.point=p,v&&v.push(m=[]),S=!0,w=!1,b=$=NaN}function d(){g&&(p(y,x),_&&w&&C.rejoin(),g.push(C.buffer())),M.point=f,w&&s.lineEnd()}function p(t,e){t=Math.max(-Ns,Math.min(Ns,t)),e=Math.max(-Ns,Math.min(Ns,e));var n=l(t,e);if(v&&m.push([t,e]),S)y=t,x=e,_=n,S=!1,n&&(s.lineStart(),s.point(t,e));else if(n&&w)s.point(t,e);else{var r={a:{x:b,y:$},b:{x:t,y:e}};E(r)?(w||(s.lineStart(),s.point(r.a.x,r.a.y)),s.point(r.b.x,r.b.y),n||s.lineEnd(),T=!1):n&&(s.lineStart(),s.point(t,e),T=!1)}b=t,$=e,w=n}var g,v,m,y,x,_,b,$,w,S,T,A=s,C=Ve(),E=He(t,e,n,r),M={point:f,lineStart:h,lineEnd:d,polygonStart:function(){s=C,g=[],v=[],T=!0},polygonEnd:function(){s=A,g=so.merge(g);var e=u([t,r]),n=T&&e,i=g.length;(n||i)&&(s.polygonStart(),n&&(s.lineStart(),c(null,null,1,s),s.lineEnd()),i&&ke(g,a,e,c,s),s.polygonEnd()),g=v=m=null}};return M}}function Ue(t){var e=0,n=Io/3,r=sn(t),i=r(e,n);return i.parallels=function(t){return arguments.length?r(e=t[0]*Io/180,n=t[1]*Io/180):[e/Io*180,n/Io*180]},i}function Be(t,e){function n(t,e){var n=Math.sqrt(a-2*i*Math.sin(e))/i;return[n*Math.sin(t*=i),o-n*Math.cos(t)]}var r=Math.sin(t),i=(r+Math.sin(e))/2,a=1+r*(2*i-r),o=Math.sqrt(a)/i;return n.invert=function(t,e){var n=o-e;return[Math.atan2(t,n)/i,et((a-(t*t+n*n)*i*i)/(2*i))]},n}function qe(){function t(t,e){Fs+=i*t-r*e,r=t,i=e}var e,n,r,i;Bs.point=function(a,o){Bs.point=t,e=r=a,n=i=o},Bs.lineEnd=function(){t(e,n)}}function Ye(t,e){t<Gs&&(Gs=t),t>zs&&(zs=t),e<Hs&&(Hs=e),e>Us&&(Us=e)}function We(){function t(t,e){o.push("M",t,",",e,a)}function e(t,e){o.push("M",t,",",e),s.point=n}function n(t,e){o.push("L",t,",",e)}function r(){s.point=t}function i(){o.push("Z")}var a=Xe(4.5),o=[],s={point:t,lineStart:function(){s.point=e},lineEnd:r,polygonStart:function(){s.lineEnd=i},polygonEnd:function(){s.lineEnd=r,s.point=t},pointRadius:function(t){return a=Xe(t),s},result:function(){if(o.length){var t=o.join("");return o=[],t}}};return s}function Xe(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Qe(t,e){Cs+=t,Es+=e,++Ms}function Ze(){function t(t,r){var i=t-e,a=r-n,o=Math.sqrt(i*i+a*a);ks+=o*(e+t)/2,Ps+=o*(n+r)/2,Os+=o,Qe(e=t,n=r)}var e,n;Ys.point=function(r,i){Ys.point=t,Qe(e=r,n=i)}}function Je(){Ys.point=Qe}function Ke(){function t(t,e){var n=t-r,a=e-i,o=Math.sqrt(n*n+a*a);ks+=o*(r+t)/2,Ps+=o*(i+e)/2,Os+=o,o=i*t-r*e,Ls+=o*(r+t),Ds+=o*(i+e),Vs+=3*o,Qe(r=t,i=e)}var e,n,r,i;Ys.point=function(a,o){Ys.point=t,Qe(e=r=a,n=i=o)},Ys.lineEnd=function(){t(e,n)}}function tn(t){function e(e,n){t.moveTo(e+o,n),t.arc(e,n,o,0,No)}function n(e,n){t.moveTo(e,n),s.point=r}function r(e,n){t.lineTo(e,n)}function i(){s.point=e}function a(){t.closePath()}var o=4.5,s={point:e,lineStart:function(){s.point=n},lineEnd:i,polygonStart:function(){s.lineEnd=a},polygonEnd:function(){s.lineEnd=i,s.point=e},pointRadius:function(t){return o=t,s},result:b};return s}function en(t){function e(t){return(s?r:n)(t)}function n(e){return an(e,function(n,r){n=t(n,r),e.point(n[0],n[1])})}function r(e){function n(n,r){n=t(n,r),e.point(n[0],n[1])}function r(){x=NaN,S.point=a,e.lineStart()}function a(n,r){var a=ge([n,r]),o=t(n,r);i(x,_,y,b,$,w,x=o[0],_=o[1],y=n,b=a[0],$=a[1],w=a[2],s,e),e.point(x,_)}function o(){S.point=n,e.lineEnd()}function u(){r(),S.point=c,S.lineEnd=l}function c(t,e){a(f=t,h=e),d=x,p=_,g=b,v=$,m=w,S.point=a}function l(){i(x,_,y,b,$,w,d,p,f,g,v,m,s,e),S.lineEnd=o,o()}var f,h,d,p,g,v,m,y,x,_,b,$,w,S={point:n,lineStart:r,lineEnd:o,polygonStart:function(){e.polygonStart(),S.lineStart=u},polygonEnd:function(){e.polygonEnd(),S.lineStart=r}};return S}function i(e,n,r,s,u,c,l,f,h,d,p,g,v,m){var y=l-e,x=f-n,_=y*y+x*x;if(_>4*a&&v--){var b=s+d,$=u+p,w=c+g,S=Math.sqrt(b*b+$*$+w*w),T=Math.asin(w/=S),A=yo(yo(w)-1)<Vo||yo(r-h)<Vo?(r+h)/2:Math.atan2($,b),C=t(A,T),E=C[0],M=C[1],k=E-e,P=M-n,O=x*k-y*P;(O*O/_>a||yo((y*k+x*P)/_-.5)>.3||s*d+u*p+c*g<o)&&(i(e,n,r,s,u,c,E,M,A,b/=S,$/=S,w,v,m),m.point(E,M),i(E,M,A,b,$,w,l,f,h,d,p,g,v,m))}}var a=.5,o=Math.cos(30*Go),s=16;return e.precision=function(t){return arguments.length?(s=(a=t*t)>0&&16,e):Math.sqrt(a)},e}function nn(t){var e=en(function(e,n){return t([e*Ho,n*Ho])});return function(t){return un(e(t))}}function rn(t){this.stream=t}function an(t,e){return{point:e,sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function on(t){return sn(function(){return t})()}function sn(t){function e(t){return t=s(t[0]*Go,t[1]*Go),[t[0]*h+u,c-t[1]*h]}function n(t){return t=s.invert((t[0]-u)/h,(c-t[1])/h),t&&[t[0]*Ho,t[1]*Ho]}function r(){s=Ee(o=fn(m,x,_),a);var t=a(g,v);return u=d-t[0]*h,c=p+t[1]*h,i()}function i(){return l&&(l.valid=!1,l=null),e}var a,o,s,u,c,l,f=en(function(t,e){return t=a(t,e),[t[0]*h+u,c-t[1]*h]}),h=150,d=480,p=250,g=0,v=0,m=0,x=0,_=0,b=Is,$=y,w=null,S=null;return e.stream=function(t){return l&&(l.valid=!1),l=un(b(o,f($(t)))),l.valid=!0,l},e.clipAngle=function(t){return arguments.length?(b=null==t?(w=t,Is):Ge((w=+t)*Go),i()):w},e.clipExtent=function(t){return arguments.length?(S=t,$=t?ze(t[0][0],t[0][1],t[1][0],t[1][1]):y,i()):S},e.scale=function(t){return arguments.length?(h=+t,r()):h},e.translate=function(t){return arguments.length?(d=+t[0],p=+t[1],r()):[d,p]},e.center=function(t){return arguments.length?(g=t[0]%360*Go,v=t[1]%360*Go,r()):[g*Ho,v*Ho]},e.rotate=function(t){return arguments.length?(m=t[0]%360*Go,x=t[1]%360*Go,_=t.length>2?t[2]%360*Go:0,r()):[m*Ho,x*Ho,_*Ho]},so.rebind(e,f,"precision"),function(){return a=t.apply(this,arguments),e.invert=a.invert&&n,r()}}function un(t){return an(t,function(e,n){t.point(e*Go,n*Go)})}function cn(t,e){return[t,e]}function ln(t,e){return[t>Io?t-No:t<-Io?t+No:t,e]}function fn(t,e,n){return t?e||n?Ee(dn(t),pn(e,n)):dn(t):e||n?pn(e,n):ln}function hn(t){return function(e,n){return e+=t,[e>Io?e-No:e<-Io?e+No:e,n]}}function dn(t){var e=hn(t);return e.invert=hn(-t),e}function pn(t,e){function n(t,e){var n=Math.cos(e),s=Math.cos(t)*n,u=Math.sin(t)*n,c=Math.sin(e),l=c*r+s*i;return[Math.atan2(u*a-l*o,s*r-c*i),et(l*a+u*o)]}var r=Math.cos(t),i=Math.sin(t),a=Math.cos(e),o=Math.sin(e);return n.invert=function(t,e){var n=Math.cos(e),s=Math.cos(t)*n,u=Math.sin(t)*n,c=Math.sin(e),l=c*a-u*o;return[Math.atan2(u*a+c*o,s*r+l*i),et(l*r-s*i)]},n}function gn(t,e){var n=Math.cos(t),r=Math.sin(t);return function(i,a,o,s){var u=o*e;null!=i?(i=vn(n,i),a=vn(n,a),(o>0?i<a:i>a)&&(i+=o*No)):(i=t+o*No,a=t-.5*u);for(var c,l=i;o>0?l>a:l<a;l-=u)s.point((c=be([n,-r*Math.cos(l),-r*Math.sin(l)]))[0],c[1])}}function vn(t,e){var n=ge(e);n[0]-=t,_e(n);var r=tt(-n[1]);return((-n[2]<0?-r:r)+2*Math.PI-Vo)%(2*Math.PI)}function mn(t,e,n){var r=so.range(t,e-Vo,n).concat(e);return function(t){return r.map(function(e){return[t,e]})}}function yn(t,e,n){var r=so.range(t,e-Vo,n).concat(e);return function(t){return r.map(function(e){return[e,t]})}}function xn(t){return t.source}function _n(t){return t.target}function bn(t,e,n,r){var i=Math.cos(e),a=Math.sin(e),o=Math.cos(r),s=Math.sin(r),u=i*Math.cos(t),c=i*Math.sin(t),l=o*Math.cos(n),f=o*Math.sin(n),h=2*Math.asin(Math.sqrt(at(r-e)+i*o*at(n-t))),d=1/Math.sin(h),p=h?function(t){var e=Math.sin(t*=h)*d,n=Math.sin(h-t)*d,r=n*u+e*l,i=n*c+e*f,o=n*a+e*s;return[Math.atan2(i,r)*Ho,Math.atan2(o,Math.sqrt(r*r+i*i))*Ho]}:function(){return[t*Ho,e*Ho]};return p.distance=h,p}function $n(){function t(t,i){var a=Math.sin(i*=Go),o=Math.cos(i),s=yo((t*=Go)-e),u=Math.cos(s);Ws+=Math.atan2(Math.sqrt((s=o*Math.sin(s))*s+(s=r*a-n*o*u)*s),n*a+r*o*u),e=t,n=a,r=o}var e,n,r;Xs.point=function(i,a){e=i*Go,n=Math.sin(a*=Go),r=Math.cos(a),Xs.point=t},Xs.lineEnd=function(){Xs.point=Xs.lineEnd=b}}function wn(t,e){function n(e,n){var r=Math.cos(e),i=Math.cos(n),a=t(r*i);return[a*i*Math.sin(e),a*Math.sin(n)]}return n.invert=function(t,n){var r=Math.sqrt(t*t+n*n),i=e(r),a=Math.sin(i),o=Math.cos(i);return[Math.atan2(t*a,r*o),Math.asin(r&&n*a/r)]},n}function Sn(t,e){function n(t,e){o>0?e<-Fo+Vo&&(e=-Fo+Vo):e>Fo-Vo&&(e=Fo-Vo);var n=o/Math.pow(i(e),a);return[n*Math.sin(a*t),o-n*Math.cos(a*t)]}var r=Math.cos(t),i=function(t){return Math.tan(Io/4+t/2)},a=t===e?Math.sin(t):Math.log(r/Math.cos(e))/Math.log(i(e)/i(t)),o=r*Math.pow(i(t),a)/a;return a?(n.invert=function(t,e){var n=o-e,r=J(a)*Math.sqrt(t*t+n*n);return[Math.atan2(t,n)/a,2*Math.atan(Math.pow(o/r,1/a))-Fo]},n):An}function Tn(t,e){function n(t,e){var n=a-e;return[n*Math.sin(i*t),a-n*Math.cos(i*t)]}var r=Math.cos(t),i=t===e?Math.sin(t):(r-Math.cos(e))/(e-t),a=r/i+t;return yo(i)<Vo?cn:(n.invert=function(t,e){var n=a-e;return[Math.atan2(t,n)/i,a-J(i)*Math.sqrt(t*t+n*n)]},n)}function An(t,e){return[t,Math.log(Math.tan(Io/4+e/2))]}function Cn(t){var e,n=on(t),r=n.scale,i=n.translate,a=n.clipExtent;return n.scale=function(){var t=r.apply(n,arguments);return t===n?e?n.clipExtent(null):n:t},n.translate=function(){var t=i.apply(n,arguments);return t===n?e?n.clipExtent(null):n:t},n.clipExtent=function(t){var o=a.apply(n,arguments);if(o===n){if(e=null==t){var s=Io*r(),u=i();a([[u[0]-s,u[1]-s],[u[0]+s,u[1]+s]])}}else e&&(o=null);return o},n.clipExtent(null)}function En(t,e){return[Math.log(Math.tan(Io/4+e/2)),-t]}function Mn(t){return t[0]}function kn(t){return t[1]}function Pn(t){for(var e=t.length,n=[0,1],r=2,i=2;i<e;i++){for(;r>1&&K(t[n[r-2]],t[n[r-1]],t[i])<=0;)--r;n[r++]=i}return n.slice(0,r)}function On(t,e){return t[0]-e[0]||t[1]-e[1]}function Ln(t,e,n){return(n[0]-e[0])*(t[1]-e[1])<(n[1]-e[1])*(t[0]-e[0])}function Dn(t,e,n,r){var i=t[0],a=n[0],o=e[0]-i,s=r[0]-a,u=t[1],c=n[1],l=e[1]-u,f=r[1]-c,h=(s*(u-c)-f*(i-a))/(f*o-s*l);return[i+h*o,u+h*l]}function Vn(t){var e=t[0],n=t[t.length-1];return!(e[0]-n[0]||e[1]-n[1])}function Rn(){rr(this),this.edge=this.site=this.circle=null}function In(t){var e=su.pop()||new Rn;return e.site=t,e}function Nn(t){Wn(t),iu.remove(t),su.push(t),rr(t)}function jn(t){var e=t.circle,n=e.x,r=e.cy,i={x:n,y:r},a=t.P,o=t.N,s=[t];Nn(t);for(var u=a;u.circle&&yo(n-u.circle.x)<Vo&&yo(r-u.circle.cy)<Vo;)a=u.P,s.unshift(u),Nn(u),u=a;s.unshift(u),Wn(u);for(var c=o;c.circle&&yo(n-c.circle.x)<Vo&&yo(r-c.circle.cy)<Vo;)o=c.N,s.push(c),Nn(c),c=o;s.push(c),Wn(c);var l,f=s.length;for(l=1;l<f;++l)c=s[l],u=s[l-1],tr(c.edge,u.site,c.site,i);u=s[0],c=s[f-1],c.edge=Jn(u.site,c.site,null,i),Yn(u),Yn(c)}function Fn(t){for(var e,n,r,i,a=t.x,o=t.y,s=iu._;s;)if(r=Gn(s,o)-a,r>Vo)s=s.L;else{if(i=a-Hn(s,o),!(i>Vo)){r>-Vo?(e=s.P,n=s):i>-Vo?(e=s,n=s.N):e=n=s;break}if(!s.R){e=s;break}s=s.R}var u=In(t);if(iu.insert(e,u),e||n){if(e===n)return Wn(e),n=In(e.site),iu.insert(u,n),u.edge=n.edge=Jn(e.site,u.site),Yn(e),void Yn(n);if(!n)return void(u.edge=Jn(e.site,u.site));Wn(e),Wn(n);var c=e.site,l=c.x,f=c.y,h=t.x-l,d=t.y-f,p=n.site,g=p.x-l,v=p.y-f,m=2*(h*v-d*g),y=h*h+d*d,x=g*g+v*v,_={x:(v*y-d*x)/m+l,y:(h*x-g*y)/m+f};tr(n.edge,c,p,_),u.edge=Jn(c,t,null,_),n.edge=Jn(t,p,null,_),Yn(e),Yn(n)}}function Gn(t,e){var n=t.site,r=n.x,i=n.y,a=i-e;if(!a)return r;var o=t.P;if(!o)return-(1/0);n=o.site;var s=n.x,u=n.y,c=u-e;if(!c)return s;var l=s-r,f=1/a-1/c,h=l/c;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*c)-u+c/2+i-a/2)))/f+r:(r+s)/2}function Hn(t,e){var n=t.N;if(n)return Gn(n,e);var r=t.site;return r.y===e?r.x:1/0}function zn(t){this.site=t,this.edges=[]}function Un(t){for(var e,n,r,i,a,o,s,u,c,l,f=t[0][0],h=t[1][0],d=t[0][1],p=t[1][1],g=ru,v=g.length;v--;)if(a=g[v],a&&a.prepare())for(s=a.edges,u=s.length,o=0;o<u;)l=s[o].end(),r=l.x,i=l.y,c=s[++o%u].start(),e=c.x,n=c.y,(yo(r-e)>Vo||yo(i-n)>Vo)&&(s.splice(o,0,new er(Kn(a.site,l,yo(r-f)<Vo&&p-i>Vo?{x:f,y:yo(e-f)<Vo?n:p}:yo(i-p)<Vo&&h-r>Vo?{x:yo(n-p)<Vo?e:h,y:p}:yo(r-h)<Vo&&i-d>Vo?{x:h,y:yo(e-h)<Vo?n:d}:yo(i-d)<Vo&&r-f>Vo?{x:yo(n-d)<Vo?e:f,y:d}:null),a.site,null)),++u)}function Bn(t,e){return e.angle-t.angle}function qn(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Yn(t){var e=t.P,n=t.N;if(e&&n){var r=e.site,i=t.site,a=n.site;if(r!==a){var o=i.x,s=i.y,u=r.x-o,c=r.y-s,l=a.x-o,f=a.y-s,h=2*(u*f-c*l);if(!(h>=-Ro)){var d=u*u+c*c,p=l*l+f*f,g=(f*d-c*p)/h,v=(u*p-l*d)/h,f=v+s,m=uu.pop()||new qn;m.arc=t,m.site=i,m.x=g+o,m.y=f+Math.sqrt(g*g+v*v),m.cy=f,t.circle=m;for(var y=null,x=ou._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}ou.insert(y,m),y||(au=m)}}}}function Wn(t){var e=t.circle;e&&(e.P||(au=e.N),ou.remove(e),uu.push(e),rr(e),t.circle=null)}function Xn(t){for(var e,n=nu,r=He(t[0][0],t[0][1],t[1][0],t[1][1]),i=n.length;i--;)e=n[i],(!Qn(e,t)||!r(e)||yo(e.a.x-e.b.x)<Vo&&yo(e.a.y-e.b.y)<Vo)&&(e.a=e.b=null,n.splice(i,1))}function Qn(t,e){var n=t.b;if(n)return!0;var r,i,a=t.a,o=e[0][0],s=e[1][0],u=e[0][1],c=e[1][1],l=t.l,f=t.r,h=l.x,d=l.y,p=f.x,g=f.y,v=(h+p)/2,m=(d+g)/2;if(g===d){if(v<o||v>=s)return;if(h>p){if(a){if(a.y>=c)return}else a={x:v,y:u};n={x:v,y:c}}else{if(a){if(a.y<u)return}else a={x:v,y:c};n={x:v,y:u}}}else if(r=(h-p)/(g-d),i=m-r*v,r<-1||r>1)if(h>p){if(a){if(a.y>=c)return}else a={x:(u-i)/r,y:u};n={x:(c-i)/r,y:c}}else{if(a){if(a.y<u)return}else a={x:(c-i)/r,y:c};n={x:(u-i)/r,y:u}}else if(d<g){if(a){if(a.x>=s)return}else a={x:o,y:r*o+i};n={x:s,y:r*s+i}}else{if(a){if(a.x<o)return}else a={x:s,y:r*s+i};n={x:o,y:r*o+i}}return t.a=a,t.b=n,!0}function Zn(t,e){this.l=t,this.r=e,this.a=this.b=null}function Jn(t,e,n,r){var i=new Zn(t,e);return nu.push(i),n&&tr(i,t,e,n),r&&tr(i,e,t,r),ru[t.i].edges.push(new er(i,t,e)),ru[e.i].edges.push(new er(i,e,t)),i}function Kn(t,e,n){var r=new Zn(t,null);return r.a=e,r.b=n,nu.push(r),r}function tr(t,e,n,r){t.a||t.b?t.l===n?t.b=r:t.a=r:(t.a=r,t.l=e,t.r=n)}function er(t,e,n){var r=t.a,i=t.b;this.edge=t,this.site=e,this.angle=n?Math.atan2(n.y-e.y,n.x-e.x):t.l===e?Math.atan2(i.x-r.x,r.y-i.y):Math.atan2(r.x-i.x,i.y-r.y)}function nr(){this._=null}function rr(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function ir(t,e){var n=e,r=e.R,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.R=r.L,n.R&&(n.R.U=n),r.L=n}function ar(t,e){var n=e,r=e.L,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.L=r.R,n.L&&(n.L.U=n),r.R=n}function or(t){for(;t.L;)t=t.L;return t}function sr(t,e){var n,r,i,a=t.sort(ur).pop();for(nu=[],ru=new Array(t.length),iu=new nr,ou=new nr;;)if(i=au,a&&(!i||a.y<i.y||a.y===i.y&&a.x<i.x))a.x===n&&a.y===r||(ru[a.i]=new zn(a),Fn(a),n=a.x,r=a.y),a=t.pop();else{if(!i)break;jn(i.arc)}e&&(Xn(e),Un(e));var o={cells:ru,edges:nu};return iu=ou=nu=ru=null,o}function ur(t,e){return e.y-t.y||e.x-t.x}function cr(t,e,n){return(t.x-n.x)*(e.y-t.y)-(t.x-e.x)*(n.y-t.y)}function lr(t){return t.x}function fr(t){return t.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function dr(t,e,n,r,i,a){if(!t(e,n,r,i,a)){var o=.5*(n+i),s=.5*(r+a),u=e.nodes;u[0]&&dr(t,u[0],n,r,o,s),u[1]&&dr(t,u[1],o,r,i,s),u[2]&&dr(t,u[2],n,s,o,a),u[3]&&dr(t,u[3],o,s,i,a)}}function pr(t,e,n,r,i,a,o){var s,u=1/0;return function t(c,l,f,h,d){if(!(l>a||f>o||h<r||d<i)){if(p=c.point){var p,g=e-c.x,v=n-c.y,m=g*g+v*v;if(m<u){var y=Math.sqrt(u=m);r=e-y,i=n-y,a=e+y,o=n+y,s=p}}for(var x=c.nodes,_=.5*(l+h),b=.5*(f+d),$=e>=_,w=n>=b,S=w<<1|$,T=S+4;S<T;++S)if(c=x[3&S])switch(3&S){case 0:t(c,l,f,_,b);break;case 1:t(c,_,f,h,b);break;case 2:t(c,l,b,_,d);break;case 3:t(c,_,b,h,d)}}}(t,r,i,a,o),s}function gr(t,e){t=so.rgb(t),e=so.rgb(e);var n=t.r,r=t.g,i=t.b,a=e.r-n,o=e.g-r,s=e.b-i;return function(t){return"#"+_t(Math.round(n+a*t))+_t(Math.round(r+o*t))+_t(Math.round(i+s*t))}}function vr(t,e){var n,r={},i={};for(n in t)n in e?r[n]=xr(t[n],e[n]):i[n]=t[n];for(n in e)n in t||(i[n]=e[n]);return function(t){for(n in r)i[n]=r[n](t);return i}}function mr(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}function yr(t,e){var n,r,i,a=lu.lastIndex=fu.lastIndex=0,o=-1,s=[],u=[];for(t+="",e+="";(n=lu.exec(t))&&(r=fu.exec(e));)(i=r.index)>a&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,u.push({i:o,x:mr(n,r)})),a=fu.lastIndex;return a<e.length&&(i=e.slice(a),s[o]?s[o]+=i:s[++o]=i),s.length<2?u[0]?(e=u[0].x,function(t){return e(t)+""}):function(){return e}:(e=u.length,function(t){for(var n,r=0;r<e;++r)s[(n=u[r]).i]=n.x(t);return s.join("")})}function xr(t,e){for(var n,r=so.interpolators.length;--r>=0&&!(n=so.interpolators[r](t,e)););return n}function _r(t,e){var n,r=[],i=[],a=t.length,o=e.length,s=Math.min(t.length,e.length);for(n=0;n<s;++n)r.push(xr(t[n],e[n]));for(;n<a;++n)i[n]=t[n];for(;n<o;++n)i[n]=e[n];return function(t){for(n=0;n<s;++n)i[n]=r[n](t);return i}}function br(t){return function(e){return e<=0?0:e>=1?1:t(e)}}function $r(t){return function(e){return 1-t(1-e)}}function wr(t){return function(e){return.5*(e<.5?t(2*e):2-t(2-2*e))}}function Sr(t){return t*t}function Tr(t){return t*t*t}function Ar(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,n=e*t;return 4*(t<.5?n:3*(t-e)+n-.75)}function Cr(t){return function(e){return Math.pow(e,t)}}function Er(t){return 1-Math.cos(t*Fo)}function Mr(t){return Math.pow(2,10*(t-1))}function kr(t){return 1-Math.sqrt(1-t*t)}function Pr(t,e){var n;return arguments.length<2&&(e=.45),arguments.length?n=e/No*Math.asin(1/t):(t=1,n=e/4),function(r){return 1+t*Math.pow(2,-10*r)*Math.sin((r-n)*No/e)}}function Or(t){return t||(t=1.70158),function(e){return e*e*((t+1)*e-t)}}function Lr(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function Dr(t,e){t=so.hcl(t),e=so.hcl(e);var n=t.h,r=t.c,i=t.l,a=e.h-n,o=e.c-r,s=e.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?e.c:r),isNaN(a)?(a=0,n=isNaN(n)?e.h:n):a>180?a-=360:a<-180&&(a+=360),function(t){return lt(n+a*t,r+o*t,i+s*t)+""}}function Vr(t,e){t=so.hsl(t),e=so.hsl(e);var n=t.h,r=t.s,i=t.l,a=e.h-n,o=e.s-r,s=e.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?e.s:r),isNaN(a)?(a=0,n=isNaN(n)?e.h:n):a>180?a-=360:a<-180&&(a+=360),function(t){return ut(n+a*t,r+o*t,i+s*t)+""}}function Rr(t,e){t=so.lab(t),e=so.lab(e);var n=t.l,r=t.a,i=t.b,a=e.l-n,o=e.a-r,s=e.b-i;return function(t){return ht(n+a*t,r+o*t,i+s*t)+""}}function Ir(t,e){return e-=t,function(n){return Math.round(t+e*n)}}function Nr(t){var e=[t.a,t.b],n=[t.c,t.d],r=Fr(e),i=jr(e,n),a=Fr(Gr(n,e,-i))||0;e[0]*n[1]<n[0]*e[1]&&(e[0]*=-1,e[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(e[1],e[0]):Math.atan2(-n[0],n[1]))*Ho,this.translate=[t.e,t.f],this.scale=[r,a],this.skew=a?Math.atan2(i,a)*Ho:0}function jr(t,e){return t[0]*e[0]+t[1]*e[1]}function Fr(t){var e=Math.sqrt(jr(t,t));return e&&(t[0]/=e,t[1]/=e),e}function Gr(t,e,n){return t[0]+=n*e[0],t[1]+=n*e[1],t}function Hr(t){return t.length?t.pop()+",":""}function zr(t,e,n,r){if(t[0]!==e[0]||t[1]!==e[1]){var i=n.push("translate(",null,",",null,")");r.push({i:i-4,x:mr(t[0],e[0])},{i:i-2,x:mr(t[1],e[1])})}else(e[0]||e[1])&&n.push("translate("+e+")")}function Ur(t,e,n,r){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),r.push({i:n.push(Hr(n)+"rotate(",null,")")-2,x:mr(t,e)})):e&&n.push(Hr(n)+"rotate("+e+")")}function Br(t,e,n,r){t!==e?r.push({i:n.push(Hr(n)+"skewX(",null,")")-2,x:mr(t,e)}):e&&n.push(Hr(n)+"skewX("+e+")");
}function qr(t,e,n,r){if(t[0]!==e[0]||t[1]!==e[1]){var i=n.push(Hr(n)+"scale(",null,",",null,")");r.push({i:i-4,x:mr(t[0],e[0])},{i:i-2,x:mr(t[1],e[1])})}else 1===e[0]&&1===e[1]||n.push(Hr(n)+"scale("+e+")")}function Yr(t,e){var n=[],r=[];return t=so.transform(t),e=so.transform(e),zr(t.translate,e.translate,n,r),Ur(t.rotate,e.rotate,n,r),Br(t.skew,e.skew,n,r),qr(t.scale,e.scale,n,r),t=e=null,function(t){for(var e,i=-1,a=r.length;++i<a;)n[(e=r[i]).i]=e.x(t);return n.join("")}}function Wr(t,e){return e=(e-=t=+t)||1/e,function(n){return(n-t)/e}}function Xr(t,e){return e=(e-=t=+t)||1/e,function(n){return Math.max(0,Math.min(1,(n-t)/e))}}function Qr(t){for(var e=t.source,n=t.target,r=Jr(e,n),i=[e];e!==r;)e=e.parent,i.push(e);for(var a=i.length;n!==r;)i.splice(a,0,n),n=n.parent;return i}function Zr(t){for(var e=[],n=t.parent;null!=n;)e.push(t),t=n,n=n.parent;return e.push(t),e}function Jr(t,e){if(t===e)return t;for(var n=Zr(t),r=Zr(e),i=n.pop(),a=r.pop(),o=null;i===a;)o=i,i=n.pop(),a=r.pop();return o}function Kr(t){t.fixed|=2}function ti(t){t.fixed&=-7}function ei(t){t.fixed|=4,t.px=t.x,t.py=t.y}function ni(t){t.fixed&=-5}function ri(t,e,n){var r=0,i=0;if(t.charge=0,!t.leaf)for(var a,o=t.nodes,s=o.length,u=-1;++u<s;)a=o[u],null!=a&&(ri(a,e,n),t.charge+=a.charge,r+=a.charge*a.cx,i+=a.charge*a.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var c=e*n[t.point.index];t.charge+=t.pointCharge=c,r+=c*t.point.x,i+=c*t.point.y}t.cx=r/t.charge,t.cy=i/t.charge}function ii(t,e){return so.rebind(t,e,"sort","children","value"),t.nodes=t,t.links=li,t}function ai(t,e){for(var n=[t];null!=(t=n.pop());)if(e(t),(i=t.children)&&(r=i.length))for(var r,i;--r>=0;)n.push(i[r])}function oi(t,e){for(var n=[t],r=[];null!=(t=n.pop());)if(r.push(t),(a=t.children)&&(i=a.length))for(var i,a,o=-1;++o<i;)n.push(a[o]);for(;null!=(t=r.pop());)e(t)}function si(t){return t.children}function ui(t){return t.value}function ci(t,e){return e.value-t.value}function li(t){return so.merge(t.map(function(t){return(t.children||[]).map(function(e){return{source:t,target:e}})}))}function fi(t){return t.x}function hi(t){return t.y}function di(t,e,n){t.y0=e,t.y=n}function pi(t){return so.range(t.length)}function gi(t){for(var e=-1,n=t[0].length,r=[];++e<n;)r[e]=0;return r}function vi(t){for(var e,n=1,r=0,i=t[0][1],a=t.length;n<a;++n)(e=t[n][1])>i&&(r=n,i=e);return r}function mi(t){return t.reduce(yi,0)}function yi(t,e){return t+e[1]}function xi(t,e){return _i(t,Math.ceil(Math.log(e.length)/Math.LN2+1))}function _i(t,e){for(var n=-1,r=+t[0],i=(t[1]-r)/e,a=[];++n<=e;)a[n]=i*n+r;return a}function bi(t){return[so.min(t),so.max(t)]}function $i(t,e){return t.value-e.value}function wi(t,e){var n=t._pack_next;t._pack_next=e,e._pack_prev=t,e._pack_next=n,n._pack_prev=e}function Si(t,e){t._pack_next=e,e._pack_prev=t}function Ti(t,e){var n=e.x-t.x,r=e.y-t.y,i=t.r+e.r;return.999*i*i>n*n+r*r}function Ai(t){function e(t){l=Math.min(t.x-t.r,l),f=Math.max(t.x+t.r,f),h=Math.min(t.y-t.r,h),d=Math.max(t.y+t.r,d)}if((n=t.children)&&(c=n.length)){var n,r,i,a,o,s,u,c,l=1/0,f=-(1/0),h=1/0,d=-(1/0);if(n.forEach(Ci),r=n[0],r.x=-r.r,r.y=0,e(r),c>1&&(i=n[1],i.x=i.r,i.y=0,e(i),c>2))for(a=n[2],ki(r,i,a),e(a),wi(r,a),r._pack_prev=a,wi(a,i),i=r._pack_next,o=3;o<c;o++){ki(r,i,a=n[o]);var p=0,g=1,v=1;for(s=i._pack_next;s!==i;s=s._pack_next,g++)if(Ti(s,a)){p=1;break}if(1==p)for(u=r._pack_prev;u!==s._pack_prev&&!Ti(u,a);u=u._pack_prev,v++);p?(g<v||g==v&&i.r<r.r?Si(r,i=s):Si(r=u,i),o--):(wi(r,a),i=a,e(a))}var m=(l+f)/2,y=(h+d)/2,x=0;for(o=0;o<c;o++)a=n[o],a.x-=m,a.y-=y,x=Math.max(x,a.r+Math.sqrt(a.x*a.x+a.y*a.y));t.r=x,n.forEach(Ei)}}function Ci(t){t._pack_next=t._pack_prev=t}function Ei(t){delete t._pack_next,delete t._pack_prev}function Mi(t,e,n,r){var i=t.children;if(t.x=e+=r*t.x,t.y=n+=r*t.y,t.r*=r,i)for(var a=-1,o=i.length;++a<o;)Mi(i[a],e,n,r)}function ki(t,e,n){var r=t.r+n.r,i=e.x-t.x,a=e.y-t.y;if(r&&(i||a)){var o=e.r+n.r,s=i*i+a*a;o*=o,r*=r;var u=.5+(r-o)/(2*s),c=Math.sqrt(Math.max(0,2*o*(r+s)-(r-=s)*r-o*o))/(2*s);n.x=t.x+u*i+c*a,n.y=t.y+u*a-c*i}else n.x=t.x+r,n.y=t.y}function Pi(t,e){return t.parent==e.parent?1:2}function Oi(t){var e=t.children;return e.length?e[0]:t.t}function Li(t){var e,n=t.children;return(e=n.length)?n[e-1]:t.t}function Di(t,e,n){var r=n/(e.i-t.i);e.c-=r,e.s+=n,t.c+=r,e.z+=n,e.m+=n}function Vi(t){for(var e,n=0,r=0,i=t.children,a=i.length;--a>=0;)e=i[a],e.z+=n,e.m+=n,n+=e.s+(r+=e.c)}function Ri(t,e,n){return t.a.parent===e.parent?t.a:n}function Ii(t){return 1+so.max(t,function(t){return t.y})}function Ni(t){return t.reduce(function(t,e){return t+e.x},0)/t.length}function ji(t){var e=t.children;return e&&e.length?ji(e[0]):t}function Fi(t){var e,n=t.children;return n&&(e=n.length)?Fi(n[e-1]):t}function Gi(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Hi(t,e){var n=t.x+e[3],r=t.y+e[0],i=t.dx-e[1]-e[3],a=t.dy-e[0]-e[2];return i<0&&(n+=i/2,i=0),a<0&&(r+=a/2,a=0),{x:n,y:r,dx:i,dy:a}}function zi(t){var e=t[0],n=t[t.length-1];return e<n?[e,n]:[n,e]}function Ui(t){return t.rangeExtent?t.rangeExtent():zi(t.range())}function Bi(t,e,n,r){var i=n(t[0],t[1]),a=r(e[0],e[1]);return function(t){return a(i(t))}}function qi(t,e){var n,r=0,i=t.length-1,a=t[r],o=t[i];return o<a&&(n=r,r=i,i=n,n=a,a=o,o=n),t[r]=e.floor(a),t[i]=e.ceil(o),t}function Yi(t){return t?{floor:function(e){return Math.floor(e/t)*t},ceil:function(e){return Math.ceil(e/t)*t}}:$u}function Wi(t,e,n,r){var i=[],a=[],o=0,s=Math.min(t.length,e.length)-1;for(t[s]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++o<=s;)i.push(n(t[o-1],t[o])),a.push(r(e[o-1],e[o]));return function(e){var n=so.bisect(t,e,1,s)-1;return a[n](i[n](e))}}function Xi(t,e,n,r){function i(){var i=Math.min(t.length,e.length)>2?Wi:Bi,u=r?Xr:Wr;return o=i(t,e,u,n),s=i(e,t,u,xr),a}function a(t){return o(t)}var o,s;return a.invert=function(t){return s(t)},a.domain=function(e){return arguments.length?(t=e.map(Number),i()):t},a.range=function(t){return arguments.length?(e=t,i()):e},a.rangeRound=function(t){return a.range(t).interpolate(Ir)},a.clamp=function(t){return arguments.length?(r=t,i()):r},a.interpolate=function(t){return arguments.length?(n=t,i()):n},a.ticks=function(e){return Ki(t,e)},a.tickFormat=function(e,n){return ta(t,e,n)},a.nice=function(e){return Zi(t,e),i()},a.copy=function(){return Xi(t,e,n,r)},i()}function Qi(t,e){return so.rebind(t,e,"range","rangeRound","interpolate","clamp")}function Zi(t,e){return qi(t,Yi(Ji(t,e)[2])),qi(t,Yi(Ji(t,e)[2])),t}function Ji(t,e){null==e&&(e=10);var n=zi(t),r=n[1]-n[0],i=Math.pow(10,Math.floor(Math.log(r/e)/Math.LN10)),a=e/r*i;return a<=.15?i*=10:a<=.35?i*=5:a<=.75&&(i*=2),n[0]=Math.ceil(n[0]/i)*i,n[1]=Math.floor(n[1]/i)*i+.5*i,n[2]=i,n}function Ki(t,e){return so.range.apply(so,Ji(t,e))}function ta(t,e,n){var r=Ji(t,e);if(n){var i=ls.exec(n);if(i.shift(),"s"===i[8]){var a=so.formatPrefix(Math.max(yo(r[0]),yo(r[1])));return i[7]||(i[7]="."+ea(a.scale(r[2]))),i[8]="f",n=so.format(i.join("")),function(t){return n(a.scale(t))+a.symbol}}i[7]||(i[7]="."+na(i[8],r)),n=i.join("")}else n=",."+ea(r[2])+"f";return so.format(n)}function ea(t){return-Math.floor(Math.log(t)/Math.LN10+.01)}function na(t,e){var n=ea(e[2]);return t in wu?Math.abs(n-ea(Math.max(yo(e[0]),yo(e[1]))))+ +("e"!==t):n-2*("%"===t)}function ra(t,e,n,r){function i(t){return(n?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(e)}function a(t){return n?Math.pow(e,t):-Math.pow(e,-t)}function o(e){return t(i(e))}return o.invert=function(e){return a(t.invert(e))},o.domain=function(e){return arguments.length?(n=e[0]>=0,t.domain((r=e.map(Number)).map(i)),o):r},o.base=function(n){return arguments.length?(e=+n,t.domain(r.map(i)),o):e},o.nice=function(){var e=qi(r.map(i),n?Math:Tu);return t.domain(e),r=e.map(a),o},o.ticks=function(){var t=zi(r),o=[],s=t[0],u=t[1],c=Math.floor(i(s)),l=Math.ceil(i(u)),f=e%1?2:e;if(isFinite(l-c)){if(n){for(;c<l;c++)for(var h=1;h<f;h++)o.push(a(c)*h);o.push(a(c))}else for(o.push(a(c));c++<l;)for(var h=f-1;h>0;h--)o.push(a(c)*h);for(c=0;o[c]<s;c++);for(l=o.length;o[l-1]>u;l--);o=o.slice(c,l)}return o},o.tickFormat=function(t,n){if(!arguments.length)return Su;arguments.length<2?n=Su:"function"!=typeof n&&(n=so.format(n));var r=Math.max(1,e*t/o.ticks().length);return function(t){var o=t/a(Math.round(i(t)));return o*e<e-.5&&(o*=e),o<=r?n(t):""}},o.copy=function(){return ra(t.copy(),e,n,r)},Qi(o,t)}function ia(t,e,n){function r(e){return t(i(e))}var i=aa(e),a=aa(1/e);return r.invert=function(e){return a(t.invert(e))},r.domain=function(e){return arguments.length?(t.domain((n=e.map(Number)).map(i)),r):n},r.ticks=function(t){return Ki(n,t)},r.tickFormat=function(t,e){return ta(n,t,e)},r.nice=function(t){return r.domain(Zi(n,t))},r.exponent=function(o){return arguments.length?(i=aa(e=o),a=aa(1/e),t.domain(n.map(i)),r):e},r.copy=function(){return ia(t.copy(),e,n)},Qi(r,t)}function aa(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function oa(t,e){function n(n){return a[((i.get(n)||("range"===e.t?i.set(n,t.push(n)):NaN))-1)%a.length]}function r(e,n){return so.range(t.length).map(function(t){return e+n*t})}var i,a,o;return n.domain=function(r){if(!arguments.length)return t;t=[],i=new c;for(var a,o=-1,s=r.length;++o<s;)i.has(a=r[o])||i.set(a,t.push(a));return n[e.t].apply(n,e.a)},n.range=function(t){return arguments.length?(a=t,o=0,e={t:"range",a:arguments},n):a},n.rangePoints=function(i,s){arguments.length<2&&(s=0);var u=i[0],c=i[1],l=t.length<2?(u=(u+c)/2,0):(c-u)/(t.length-1+s);return a=r(u+l*s/2,l),o=0,e={t:"rangePoints",a:arguments},n},n.rangeRoundPoints=function(i,s){arguments.length<2&&(s=0);var u=i[0],c=i[1],l=t.length<2?(u=c=Math.round((u+c)/2),0):(c-u)/(t.length-1+s)|0;return a=r(u+Math.round(l*s/2+(c-u-(t.length-1+s)*l)/2),l),o=0,e={t:"rangeRoundPoints",a:arguments},n},n.rangeBands=function(i,s,u){arguments.length<2&&(s=0),arguments.length<3&&(u=s);var c=i[1]<i[0],l=i[c-0],f=i[1-c],h=(f-l)/(t.length-s+2*u);return a=r(l+h*u,h),c&&a.reverse(),o=h*(1-s),e={t:"rangeBands",a:arguments},n},n.rangeRoundBands=function(i,s,u){arguments.length<2&&(s=0),arguments.length<3&&(u=s);var c=i[1]<i[0],l=i[c-0],f=i[1-c],h=Math.floor((f-l)/(t.length-s+2*u));return a=r(l+Math.round((f-l-(t.length-s)*h)/2),h),c&&a.reverse(),o=Math.round(h*(1-s)),e={t:"rangeRoundBands",a:arguments},n},n.rangeBand=function(){return o},n.rangeExtent=function(){return zi(e.a[0])},n.copy=function(){return oa(t,e)},n.domain(t)}function sa(t,e){function a(){var n=0,r=e.length;for(s=[];++n<r;)s[n-1]=so.quantile(t,n/r);return o}function o(t){if(!isNaN(t=+t))return e[so.bisect(s,t)]}var s;return o.domain=function(e){return arguments.length?(t=e.map(r).filter(i).sort(n),a()):t},o.range=function(t){return arguments.length?(e=t,a()):e},o.quantiles=function(){return s},o.invertExtent=function(n){return n=e.indexOf(n),n<0?[NaN,NaN]:[n>0?s[n-1]:t[0],n<s.length?s[n]:t[t.length-1]]},o.copy=function(){return sa(t,e)},a()}function ua(t,e,n){function r(e){return n[Math.max(0,Math.min(o,Math.floor(a*(e-t))))]}function i(){return a=n.length/(e-t),o=n.length-1,r}var a,o;return r.domain=function(n){return arguments.length?(t=+n[0],e=+n[n.length-1],i()):[t,e]},r.range=function(t){return arguments.length?(n=t,i()):n},r.invertExtent=function(e){return e=n.indexOf(e),e=e<0?NaN:e/a+t,[e,e+1/a]},r.copy=function(){return ua(t,e,n)},i()}function ca(t,e){function n(n){if(n<=n)return e[so.bisect(t,n)]}return n.domain=function(e){return arguments.length?(t=e,n):t},n.range=function(t){return arguments.length?(e=t,n):e},n.invertExtent=function(n){return n=e.indexOf(n),[t[n-1],t[n]]},n.copy=function(){return ca(t,e)},n}function la(t){function e(t){return+t}return e.invert=e,e.domain=e.range=function(n){return arguments.length?(t=n.map(e),e):t},e.ticks=function(e){return Ki(t,e)},e.tickFormat=function(e,n){return ta(t,e,n)},e.copy=function(){return la(t)},e}function fa(){return 0}function ha(t){return t.innerRadius}function da(t){return t.outerRadius}function pa(t){return t.startAngle}function ga(t){return t.endAngle}function va(t){return t&&t.padAngle}function ma(t,e,n,r){return(t-n)*e-(e-r)*t>0?0:1}function ya(t,e,n,r,i){var a=t[0]-e[0],o=t[1]-e[1],s=(i?r:-r)/Math.sqrt(a*a+o*o),u=s*o,c=-s*a,l=t[0]+u,f=t[1]+c,h=e[0]+u,d=e[1]+c,p=(l+h)/2,g=(f+d)/2,v=h-l,m=d-f,y=v*v+m*m,x=n-r,_=l*d-h*f,b=(m<0?-1:1)*Math.sqrt(Math.max(0,x*x*y-_*_)),$=(_*m-v*b)/y,w=(-_*v-m*b)/y,S=(_*m+v*b)/y,T=(-_*v+m*b)/y,A=$-p,C=w-g,E=S-p,M=T-g;return A*A+C*C>E*E+M*M&&($=S,w=T),[[$-u,w-c],[$*n/x,w*n/x]]}function xa(t){function e(e){function o(){c.push("M",a(t(l),s))}for(var u,c=[],l=[],f=-1,h=e.length,d=At(n),p=At(r);++f<h;)i.call(this,u=e[f],f)?l.push([+d.call(this,u,f),+p.call(this,u,f)]):l.length&&(o(),l=[]);return l.length&&o(),c.length?c.join(""):null}var n=Mn,r=kn,i=Me,a=_a,o=a.key,s=.7;return e.x=function(t){return arguments.length?(n=t,e):n},e.y=function(t){return arguments.length?(r=t,e):r},e.defined=function(t){return arguments.length?(i=t,e):i},e.interpolate=function(t){return arguments.length?(o="function"==typeof t?a=t:(a=Pu.get(t)||_a).key,e):o},e.tension=function(t){return arguments.length?(s=t,e):s},e}function _a(t){return t.length>1?t.join("L"):t+"Z"}function ba(t){return t.join("L")+"Z"}function $a(t){for(var e=0,n=t.length,r=t[0],i=[r[0],",",r[1]];++e<n;)i.push("H",(r[0]+(r=t[e])[0])/2,"V",r[1]);return n>1&&i.push("H",r[0]),i.join("")}function wa(t){for(var e=0,n=t.length,r=t[0],i=[r[0],",",r[1]];++e<n;)i.push("V",(r=t[e])[1],"H",r[0]);return i.join("")}function Sa(t){for(var e=0,n=t.length,r=t[0],i=[r[0],",",r[1]];++e<n;)i.push("H",(r=t[e])[0],"V",r[1]);return i.join("")}function Ta(t,e){return t.length<4?_a(t):t[1]+Ea(t.slice(1,-1),Ma(t,e))}function Aa(t,e){return t.length<3?ba(t):t[0]+Ea((t.push(t[0]),t),Ma([t[t.length-2]].concat(t,[t[1]]),e))}function Ca(t,e){return t.length<3?_a(t):t[0]+Ea(t,Ma(t,e))}function Ea(t,e){if(e.length<1||t.length!=e.length&&t.length!=e.length+2)return _a(t);var n=t.length!=e.length,r="",i=t[0],a=t[1],o=e[0],s=o,u=1;if(n&&(r+="Q"+(a[0]-2*o[0]/3)+","+(a[1]-2*o[1]/3)+","+a[0]+","+a[1],i=t[1],u=2),e.length>1){s=e[1],a=t[u],u++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(a[0]-s[0])+","+(a[1]-s[1])+","+a[0]+","+a[1];for(var c=2;c<e.length;c++,u++)a=t[u],s=e[c],r+="S"+(a[0]-s[0])+","+(a[1]-s[1])+","+a[0]+","+a[1]}if(n){var l=t[u];r+="Q"+(a[0]+2*s[0]/3)+","+(a[1]+2*s[1]/3)+","+l[0]+","+l[1]}return r}function Ma(t,e){for(var n,r=[],i=(1-e)/2,a=t[0],o=t[1],s=1,u=t.length;++s<u;)n=a,a=o,o=t[s],r.push([i*(o[0]-n[0]),i*(o[1]-n[1])]);return r}function ka(t){if(t.length<3)return _a(t);var e=1,n=t.length,r=t[0],i=r[0],a=r[1],o=[i,i,i,(r=t[1])[0]],s=[a,a,a,r[1]],u=[i,",",a,"L",Da(Du,o),",",Da(Du,s)];for(t.push(t[n-1]);++e<=n;)r=t[e],o.shift(),o.push(r[0]),s.shift(),s.push(r[1]),Va(u,o,s);return t.pop(),u.push("L",r),u.join("")}function Pa(t){if(t.length<4)return _a(t);for(var e,n=[],r=-1,i=t.length,a=[0],o=[0];++r<3;)e=t[r],a.push(e[0]),o.push(e[1]);for(n.push(Da(Du,a)+","+Da(Du,o)),--r;++r<i;)e=t[r],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Va(n,a,o);return n.join("")}function Oa(t){for(var e,n,r=-1,i=t.length,a=i+4,o=[],s=[];++r<4;)n=t[r%i],o.push(n[0]),s.push(n[1]);for(e=[Da(Du,o),",",Da(Du,s)],--r;++r<a;)n=t[r%i],o.shift(),o.push(n[0]),s.shift(),s.push(n[1]),Va(e,o,s);return e.join("")}function La(t,e){var n=t.length-1;if(n)for(var r,i,a=t[0][0],o=t[0][1],s=t[n][0]-a,u=t[n][1]-o,c=-1;++c<=n;)r=t[c],i=c/n,r[0]=e*r[0]+(1-e)*(a+i*s),r[1]=e*r[1]+(1-e)*(o+i*u);return ka(t)}function Da(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}function Va(t,e,n){t.push("C",Da(Ou,e),",",Da(Ou,n),",",Da(Lu,e),",",Da(Lu,n),",",Da(Du,e),",",Da(Du,n))}function Ra(t,e){return(e[1]-t[1])/(e[0]-t[0])}function Ia(t){for(var e=0,n=t.length-1,r=[],i=t[0],a=t[1],o=r[0]=Ra(i,a);++e<n;)r[e]=(o+(o=Ra(i=a,a=t[e+1])))/2;return r[e]=o,r}function Na(t){for(var e,n,r,i,a=[],o=Ia(t),s=-1,u=t.length-1;++s<u;)e=Ra(t[s],t[s+1]),yo(e)<Vo?o[s]=o[s+1]=0:(n=o[s]/e,r=o[s+1]/e,i=n*n+r*r,i>9&&(i=3*e/Math.sqrt(i),o[s]=i*n,o[s+1]=i*r));for(s=-1;++s<=u;)i=(t[Math.min(u,s+1)][0]-t[Math.max(0,s-1)][0])/(6*(1+o[s]*o[s])),a.push([i||0,o[s]*i||0]);return a}function ja(t){return t.length<3?_a(t):t[0]+Ea(t,Na(t))}function Fa(t){for(var e,n,r,i=-1,a=t.length;++i<a;)e=t[i],n=e[0],r=e[1]-Fo,e[0]=n*Math.cos(r),e[1]=n*Math.sin(r);return t}function Ga(t){function e(e){function u(){g.push("M",s(t(m),f),l,c(t(v.reverse()),f),"Z")}for(var h,d,p,g=[],v=[],m=[],y=-1,x=e.length,_=At(n),b=At(i),$=n===r?function(){return d}:At(r),w=i===a?function(){return p}:At(a);++y<x;)o.call(this,h=e[y],y)?(v.push([d=+_.call(this,h,y),p=+b.call(this,h,y)]),m.push([+$.call(this,h,y),+w.call(this,h,y)])):v.length&&(u(),v=[],m=[]);return v.length&&u(),g.length?g.join(""):null}var n=Mn,r=Mn,i=0,a=kn,o=Me,s=_a,u=s.key,c=s,l="L",f=.7;return e.x=function(t){return arguments.length?(n=r=t,e):r},e.x0=function(t){return arguments.length?(n=t,e):n},e.x1=function(t){return arguments.length?(r=t,e):r},e.y=function(t){return arguments.length?(i=a=t,e):a},e.y0=function(t){return arguments.length?(i=t,e):i},e.y1=function(t){return arguments.length?(a=t,e):a},e.defined=function(t){return arguments.length?(o=t,e):o},e.interpolate=function(t){return arguments.length?(u="function"==typeof t?s=t:(s=Pu.get(t)||_a).key,c=s.reverse||s,l=s.closed?"M":"L",e):u},e.tension=function(t){return arguments.length?(f=t,e):f},e}function Ha(t){return t.radius}function za(t){return[t.x,t.y]}function Ua(t){return function(){var e=t.apply(this,arguments),n=e[0],r=e[1]-Fo;return[n*Math.cos(r),n*Math.sin(r)]}}function Ba(){return 64}function qa(){return"circle"}function Ya(t){var e=Math.sqrt(t/Io);return"M0,"+e+"A"+e+","+e+" 0 1,1 0,"+-e+"A"+e+","+e+" 0 1,1 0,"+e+"Z"}function Wa(t){return function(){var e,n,r;(e=this[t])&&(r=e[n=e.active])&&(r.timer.c=null,r.timer.t=NaN,--e.count?delete e[n]:delete this[t],e.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Xa(t,e,n){return wo(t,Gu),t.namespace=e,t.id=n,t}function Qa(t,e,n,r){var i=t.id,a=t.namespace;return z(t,"function"==typeof n?function(t,o,s){t[a][i].tween.set(e,r(n.call(t,t.__data__,o,s)))}:(n=r(n),function(t){t[a][i].tween.set(e,n)}))}function Za(t){return null==t&&(t=""),function(){this.textContent=t}}function Ja(t){return null==t?"__transition__":"__transition_"+t+"__"}function Ka(t,e,n,r,i){function a(t){var e=g.delay;return l.t=e+u,e<=t?o(t-e):void(l.c=o)}function o(n){var i=p.active,a=p[i];a&&(a.timer.c=null,a.timer.t=NaN,--p.count,delete p[i],a.event&&a.event.interrupt.call(t,t.__data__,a.index));for(var o in p)if(+o<r){var c=p[o];c.timer.c=null,c.timer.t=NaN,--p.count,delete p[o]}l.c=s,Pt(function(){return l.c&&s(n||1)&&(l.c=null,l.t=NaN),1},0,u),p.active=r,g.event&&g.event.start.call(t,t.__data__,e),d=[],g.tween.forEach(function(n,r){(r=r.call(t,t.__data__,e))&&d.push(r)}),h=g.ease,f=g.duration}function s(i){for(var a=i/f,o=h(a),s=d.length;s>0;)d[--s].call(t,o);if(a>=1)return g.event&&g.event.end.call(t,t.__data__,e),--p.count?delete p[r]:delete t[n],1}var u,l,f,h,d,p=t[n]||(t[n]={active:0,count:0}),g=p[r];g||(u=i.time,l=Pt(a,0,u),g=p[r]={tween:new c,time:u,timer:l,delay:i.delay,duration:i.duration,ease:i.ease,index:e},i=null,++p.count)}function to(t,e,n){t.attr("transform",function(t){var r=e(t);return"translate("+(isFinite(r)?r:n(t))+",0)"})}function eo(t,e,n){t.attr("transform",function(t){var r=e(t);return"translate(0,"+(isFinite(r)?r:n(t))+")"})}function no(t){return t.toISOString()}function ro(t,e,n){function r(e){return t(e)}function i(t,n){var r=t[1]-t[0],i=r/n,a=so.bisect(Qu,i);return a==Qu.length?[e.year,Ji(t.map(function(t){return t/31536e6}),n)[2]]:a?e[i/Qu[a-1]<Qu[a]/i?a-1:a]:[Ku,Ji(t,n)[2]]}return r.invert=function(e){return io(t.invert(e))},r.domain=function(e){return arguments.length?(t.domain(e),r):t.domain().map(io)},r.nice=function(t,e){function n(n){return!isNaN(n)&&!t.range(n,io(+n+1),e).length}var a=r.domain(),o=zi(a),s=null==t?i(o,10):"number"==typeof t&&i(o,t);return s&&(t=s[0],e=s[1]),r.domain(qi(a,e>1?{floor:function(e){for(;n(e=t.floor(e));)e=io(e-1);return e},ceil:function(e){for(;n(e=t.ceil(e));)e=io(+e+1);return e}}:t))},r.ticks=function(t,e){var n=zi(r.domain()),a=null==t?i(n,10):"number"==typeof t?i(n,t):!t.range&&[{range:t},e];return a&&(t=a[0],e=a[1]),t.range(n[0],io(+n[1]+1),e<1?1:e)},r.tickFormat=function(){return n},r.copy=function(){return ro(t.copy(),e,n)},Qi(r,t)}function io(t){return new Date(t)}function ao(t){return JSON.parse(t.responseText)}function oo(t){var e=lo.createRange();return e.selectNode(lo.body),e.createContextualFragment(t.responseText)}var so={version:"3.5.17"},uo=[].slice,co=function(t){return uo.call(t)},lo=this.document;if(lo)try{co(lo.documentElement.childNodes)[0].nodeType}catch(t){co=function(t){for(var e=t.length,n=new Array(e);e--;)n[e]=t[e];return n}}if(Date.now||(Date.now=function(){return+new Date}),lo)try{lo.createElement("DIV").style.setProperty("opacity",0,"")}catch(t){var fo=this.Element.prototype,ho=fo.setAttribute,po=fo.setAttributeNS,go=this.CSSStyleDeclaration.prototype,vo=go.setProperty;fo.setAttribute=function(t,e){ho.call(this,t,e+"")},fo.setAttributeNS=function(t,e,n){po.call(this,t,e,n+"")},go.setProperty=function(t,e,n){vo.call(this,t,e+"",n)}}so.ascending=n,so.descending=function(t,e){return e<t?-1:e>t?1:e>=t?0:NaN},so.min=function(t,e){var n,r,i=-1,a=t.length;if(1===arguments.length){for(;++i<a;)if(null!=(r=t[i])&&r>=r){n=r;break}for(;++i<a;)null!=(r=t[i])&&n>r&&(n=r)}else{for(;++i<a;)if(null!=(r=e.call(t,t[i],i))&&r>=r){n=r;break}for(;++i<a;)null!=(r=e.call(t,t[i],i))&&n>r&&(n=r)}return n},so.max=function(t,e){var n,r,i=-1,a=t.length;if(1===arguments.length){for(;++i<a;)if(null!=(r=t[i])&&r>=r){n=r;break}for(;++i<a;)null!=(r=t[i])&&r>n&&(n=r)}else{for(;++i<a;)if(null!=(r=e.call(t,t[i],i))&&r>=r){n=r;break}for(;++i<a;)null!=(r=e.call(t,t[i],i))&&r>n&&(n=r)}return n},so.extent=function(t,e){var n,r,i,a=-1,o=t.length;if(1===arguments.length){for(;++a<o;)if(null!=(r=t[a])&&r>=r){n=i=r;break}for(;++a<o;)null!=(r=t[a])&&(n>r&&(n=r),i<r&&(i=r))}else{for(;++a<o;)if(null!=(r=e.call(t,t[a],a))&&r>=r){n=i=r;break}for(;++a<o;)null!=(r=e.call(t,t[a],a))&&(n>r&&(n=r),i<r&&(i=r))}return[n,i]},so.sum=function(t,e){var n,r=0,a=t.length,o=-1;if(1===arguments.length)for(;++o<a;)i(n=+t[o])&&(r+=n);else for(;++o<a;)i(n=+e.call(t,t[o],o))&&(r+=n);return r},so.mean=function(t,e){var n,a=0,o=t.length,s=-1,u=o;if(1===arguments.length)for(;++s<o;)i(n=r(t[s]))?a+=n:--u;else for(;++s<o;)i(n=r(e.call(t,t[s],s)))?a+=n:--u;if(u)return a/u},so.quantile=function(t,e){var n=(t.length-1)*e+1,r=Math.floor(n),i=+t[r-1],a=n-r;return a?i+a*(t[r]-i):i},so.median=function(t,e){var a,o=[],s=t.length,u=-1;if(1===arguments.length)for(;++u<s;)i(a=r(t[u]))&&o.push(a);else for(;++u<s;)i(a=r(e.call(t,t[u],u)))&&o.push(a);if(o.length)return so.quantile(o.sort(n),.5)},so.variance=function(t,e){var n,a,o=t.length,s=0,u=0,c=-1,l=0;if(1===arguments.length)for(;++c<o;)i(n=r(t[c]))&&(a=n-s,s+=a/++l,u+=a*(n-s));else for(;++c<o;)i(n=r(e.call(t,t[c],c)))&&(a=n-s,s+=a/++l,u+=a*(n-s));if(l>1)return u/(l-1)},so.deviation=function(){var t=so.variance.apply(this,arguments);return t?Math.sqrt(t):t};var mo=a(n);so.bisectLeft=mo.left,so.bisect=so.bisectRight=mo.right,so.bisector=function(t){return a(1===t.length?function(e,r){return n(t(e),r)}:t)},so.shuffle=function(t,e,n){(a=arguments.length)<3&&(n=t.length,a<2&&(e=0));for(var r,i,a=n-e;a;)i=Math.random()*a--|0,r=t[a+e],t[a+e]=t[i+e],t[i+e]=r;return t},so.permute=function(t,e){for(var n=e.length,r=new Array(n);n--;)r[n]=t[e[n]];return r},so.pairs=function(t){for(var e,n=0,r=t.length-1,i=t[0],a=new Array(r<0?0:r);n<r;)a[n]=[e=i,i=t[++n]];return a},so.transpose=function(t){if(!(i=t.length))return[];for(var e=-1,n=so.min(t,o),r=new Array(n);++e<n;)for(var i,a=-1,s=r[e]=new Array(i);++a<i;)s[a]=t[a][e];return r},so.zip=function(){return so.transpose(arguments)},so.keys=function(t){var e=[];for(var n in t)e.push(n);return e},so.values=function(t){var e=[];for(var n in t)e.push(t[n]);return e},so.entries=function(t){var e=[];for(var n in t)e.push({key:n,value:t[n]});return e},so.merge=function(t){for(var e,n,r,i=t.length,a=-1,o=0;++a<i;)o+=t[a].length;for(n=new Array(o);--i>=0;)for(r=t[i],e=r.length;--e>=0;)n[--o]=r[e];return n};var yo=Math.abs;so.range=function(t,e,n){if(arguments.length<3&&(n=1,arguments.length<2&&(e=t,t=0)),(e-t)/n===1/0)throw new Error("infinite range");var r,i=[],a=s(yo(n)),o=-1;if(t*=a,e*=a,n*=a,n<0)for(;(r=t+n*++o)>e;)i.push(r/a);else for(;(r=t+n*++o)<e;)i.push(r/a);return i},so.map=function(t,e){var n=new c;if(t instanceof c)t.forEach(function(t,e){n.set(t,e)});else if(Array.isArray(t)){var r,i=-1,a=t.length;if(1===arguments.length)for(;++i<a;)n.set(i,t[i]);else for(;++i<a;)n.set(e.call(t,r=t[i],i),r)}else for(var o in t)n.set(o,t[o]);return n};var xo="__proto__",_o="\0";u(c,{has:h,get:function(t){return this._[l(t)]},set:function(t,e){return this._[l(t)]=e},remove:d,keys:p,values:function(){var t=[];for(var e in this._)t.push(this._[e]);return t},entries:function(){var t=[];for(var e in this._)t.push({key:f(e),value:this._[e]});return t},size:g,empty:v,forEach:function(t){for(var e in this._)t.call(this,f(e),this._[e])}}),so.nest=function(){function t(e,o,s){if(s>=a.length)return r?r.call(i,o):n?o.sort(n):o;for(var u,l,f,h,d=-1,p=o.length,g=a[s++],v=new c;++d<p;)(h=v.get(u=g(l=o[d])))?h.push(l):v.set(u,[l]);return e?(l=e(),f=function(n,r){l.set(n,t(e,r,s))}):(l={},f=function(n,r){l[n]=t(e,r,s)}),v.forEach(f),l}function e(t,n){if(n>=a.length)return t;var r=[],i=o[n++];return t.forEach(function(t,i){r.push({key:t,values:e(i,n)})}),i?r.sort(function(t,e){return i(t.key,e.key)}):r}var n,r,i={},a=[],o=[];return i.map=function(e,n){return t(n,e,0)},i.entries=function(n){return e(t(so.map,n,0),0)},i.key=function(t){return a.push(t),i},i.sortKeys=function(t){return o[a.length-1]=t,i},i.sortValues=function(t){return n=t,i},i.rollup=function(t){return r=t,i},i},so.set=function(t){var e=new m;if(t)for(var n=0,r=t.length;n<r;++n)e.add(t[n]);return e},u(m,{has:h,add:function(t){return this._[l(t+="")]=!0,t},remove:d,values:p,size:g,empty:v,forEach:function(t){for(var e in this._)t.call(this,f(e))}}),so.behavior={},so.rebind=function(t,e){for(var n,r=1,i=arguments.length;++r<i;)t[n=arguments[r]]=x(t,e,e[n]);return t};var bo=["webkit","ms","moz","Moz","o","O"];so.dispatch=function(){for(var t=new $,e=-1,n=arguments.length;++e<n;)t[arguments[e]]=w(t);return t},$.prototype.on=function(t,e){var n=t.indexOf("."),r="";if(n>=0&&(r=t.slice(n+1),t=t.slice(0,n)),t)return arguments.length<2?this[t].on(r):this[t].on(r,e);if(2===arguments.length){if(null==e)for(t in this)this.hasOwnProperty(t)&&this[t].on(r,null);return this}},so.event=null,so.requote=function(t){return t.replace($o,"\\$&")};var $o=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,wo={}.__proto__?function(t,e){t.__proto__=e}:function(t,e){for(var n in e)t[n]=e[n]},So=function(t,e){return e.querySelector(t)},To=function(t,e){return e.querySelectorAll(t)},Ao=function(t,e){var n=t.matches||t[_(t,"matchesSelector")];return(Ao=function(t,e){return n.call(t,e)})(t,e)};"function"==typeof Sizzle&&(So=function(t,e){return Sizzle(t,e)[0]||null},To=Sizzle,Ao=Sizzle.matchesSelector),so.selection=function(){return so.select(lo.documentElement)};var Co=so.selection.prototype=[];Co.select=function(t){var e,n,r,i,a=[];t=E(t);for(var o=-1,s=this.length;++o<s;){a.push(e=[]),e.parentNode=(r=this[o]).parentNode;for(var u=-1,c=r.length;++u<c;)(i=r[u])?(e.push(n=t.call(i,i.__data__,u,o)),n&&"__data__"in i&&(n.__data__=i.__data__)):e.push(null)}return C(a)},Co.selectAll=function(t){var e,n,r=[];t=M(t);for(var i=-1,a=this.length;++i<a;)for(var o=this[i],s=-1,u=o.length;++s<u;)(n=o[s])&&(r.push(e=co(t.call(n,n.__data__,s,i))),e.parentNode=n);return C(r)};var Eo="http://www.w3.org/1999/xhtml",Mo={svg:"http://www.w3.org/2000/svg",xhtml:Eo,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};so.ns={prefix:Mo,qualify:function(t){var e=t.indexOf(":"),n=t;return e>=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),Mo.hasOwnProperty(n)?{space:Mo[n],local:t}:t}},Co.attr=function(t,e){if(arguments.length<2){if("string"==typeof t){var n=this.node();return t=so.ns.qualify(t),t.local?n.getAttributeNS(t.space,t.local):n.getAttribute(t)}for(e in t)this.each(k(e,t[e]));return this}return this.each(k(t,e))},Co.classed=function(t,e){if(arguments.length<2){if("string"==typeof t){var n=this.node(),r=(t=L(t)).length,i=-1;if(e=n.classList){for(;++i<r;)if(!e.contains(t[i]))return!1}else for(e=n.getAttribute("class");++i<r;)if(!O(t[i]).test(e))return!1;return!0}for(e in t)this.each(D(e,t[e]));return this}return this.each(D(t,e))},Co.style=function(t,n,r){var i=arguments.length;if(i<3){if("string"!=typeof t){i<2&&(n="");for(r in t)this.each(R(r,t[r],n));return this}if(i<2){var a=this.node();return e(a).getComputedStyle(a,null).getPropertyValue(t)}r=""}return this.each(R(t,n,r))},Co.property=function(t,e){if(arguments.length<2){if("string"==typeof t)return this.node()[t];for(e in t)this.each(I(e,t[e]));return this}return this.each(I(t,e))},Co.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},Co.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},Co.append=function(t){return t=N(t),this.select(function(){return this.appendChild(t.apply(this,arguments))})},Co.insert=function(t,e){return t=N(t),e=E(e),this.select(function(){return this.insertBefore(t.apply(this,arguments),e.apply(this,arguments)||null)})},Co.remove=function(){return this.each(j)},Co.data=function(t,e){function n(t,n){var r,i,a,o=t.length,f=n.length,h=Math.min(o,f),d=new Array(f),p=new Array(f),g=new Array(o);if(e){var v,m=new c,y=new Array(o);for(r=-1;++r<o;)(i=t[r])&&(m.has(v=e.call(i,i.__data__,r))?g[r]=i:m.set(v,i),y[r]=v);for(r=-1;++r<f;)(i=m.get(v=e.call(n,a=n[r],r)))?i!==!0&&(d[r]=i,i.__data__=a):p[r]=F(a),m.set(v,!0);for(r=-1;++r<o;)r in y&&m.get(y[r])!==!0&&(g[r]=t[r])}else{for(r=-1;++r<h;)i=t[r],a=n[r],i?(i.__data__=a,d[r]=i):p[r]=F(a);for(;r<f;++r)p[r]=F(n[r]);for(;r<o;++r)g[r]=t[r]}p.update=d,p.parentNode=d.parentNode=g.parentNode=t.parentNode,s.push(p),u.push(d),l.push(g)}var r,i,a=-1,o=this.length;if(!arguments.length){for(t=new Array(o=(r=this[0]).length);++a<o;)(i=r[a])&&(t[a]=i.__data__);return t}var s=U([]),u=C([]),l=C([]);if("function"==typeof t)for(;++a<o;)n(r=this[a],t.call(r,r.parentNode.__data__,a));else for(;++a<o;)n(r=this[a],t);return u.enter=function(){return s},u.exit=function(){return l},u},Co.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},Co.filter=function(t){var e,n,r,i=[];"function"!=typeof t&&(t=G(t));for(var a=0,o=this.length;a<o;a++){i.push(e=[]),e.parentNode=(n=this[a]).parentNode;for(var s=0,u=n.length;s<u;s++)(r=n[s])&&t.call(r,r.__data__,s,a)&&e.push(r)}return C(i)},Co.order=function(){for(var t=-1,e=this.length;++t<e;)for(var n,r=this[t],i=r.length-1,a=r[i];--i>=0;)(n=r[i])&&(a&&a!==n.nextSibling&&a.parentNode.insertBefore(n,a),a=n);return this},Co.sort=function(t){t=H.apply(this,arguments);for(var e=-1,n=this.length;++e<n;)this[e].sort(t);return this.order()},Co.each=function(t){return z(this,function(e,n,r){t.call(e,e.__data__,n,r)})},Co.call=function(t){var e=co(arguments);return t.apply(e[0]=this,e),this},Co.empty=function(){return!this.node()},Co.node=function(){for(var t=0,e=this.length;t<e;t++)for(var n=this[t],r=0,i=n.length;r<i;r++){var a=n[r];if(a)return a}return null},Co.size=function(){var t=0;return z(this,function(){++t}),t};var ko=[];so.selection.enter=U,so.selection.enter.prototype=ko,ko.append=Co.append,ko.empty=Co.empty,ko.node=Co.node,ko.call=Co.call,ko.size=Co.size,ko.select=function(t){
for(var e,n,r,i,a,o=[],s=-1,u=this.length;++s<u;){r=(i=this[s]).update,o.push(e=[]),e.parentNode=i.parentNode;for(var c=-1,l=i.length;++c<l;)(a=i[c])?(e.push(r[c]=n=t.call(i.parentNode,a.__data__,c,s)),n.__data__=a.__data__):e.push(null)}return C(o)},ko.insert=function(t,e){return arguments.length<2&&(e=B(this)),Co.insert.call(this,t,e)},so.select=function(e){var n;return"string"==typeof e?(n=[So(e,lo)],n.parentNode=lo.documentElement):(n=[e],n.parentNode=t(e)),C([n])},so.selectAll=function(t){var e;return"string"==typeof t?(e=co(To(t,lo)),e.parentNode=lo.documentElement):(e=co(t),e.parentNode=null),C([e])},Co.on=function(t,e,n){var r=arguments.length;if(r<3){if("string"!=typeof t){r<2&&(e=!1);for(n in t)this.each(q(n,t[n],e));return this}if(r<2)return(r=this.node()["__on"+t])&&r._;n=!1}return this.each(q(t,e,n))};var Po=so.map({mouseenter:"mouseover",mouseleave:"mouseout"});lo&&Po.forEach(function(t){"on"+t in lo&&Po.remove(t)});var Oo,Lo=0;so.mouse=function(t){return Q(t,T())};var Do=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;so.touch=function(t,e,n){if(arguments.length<3&&(n=e,e=T().changedTouches),e)for(var r,i=0,a=e.length;i<a;++i)if((r=e[i]).identifier===n)return Q(t,r)},so.behavior.drag=function(){function t(){this.on("mousedown.drag",a).on("touchstart.drag",o)}function n(t,e,n,a,o){return function(){function s(){var t,n,r=e(h,g);r&&(t=r[0]-x[0],n=r[1]-x[1],p|=t|n,x=r,d({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:t,dy:n}))}function u(){e(h,g)&&(m.on(a+v,null).on(o+v,null),y(p),d({type:"dragend"}))}var c,l=this,f=so.event.target.correspondingElement||so.event.target,h=l.parentNode,d=r.of(l,arguments),p=0,g=t(),v=".drag"+(null==g?"":"-"+g),m=so.select(n(f)).on(a+v,s).on(o+v,u),y=X(f),x=e(h,g);i?(c=i.apply(l,arguments),c=[c.x-x[0],c.y-x[1]]):c=[0,0],d({type:"dragstart"})}}var r=A(t,"drag","dragstart","dragend"),i=null,a=n(b,so.mouse,e,"mousemove","mouseup"),o=n(Z,so.touch,y,"touchmove","touchend");return t.origin=function(e){return arguments.length?(i=e,t):i},so.rebind(t,r,"on")},so.touches=function(t,e){return arguments.length<2&&(e=T().touches),e?co(e).map(function(e){var n=Q(t,e);return n.identifier=e.identifier,n}):[]};var Vo=1e-6,Ro=Vo*Vo,Io=Math.PI,No=2*Io,jo=No-Vo,Fo=Io/2,Go=Io/180,Ho=180/Io,zo=Math.SQRT2,Uo=2,Bo=4;so.interpolateZoom=function(t,e){var n,r,i=t[0],a=t[1],o=t[2],s=e[0],u=e[1],c=e[2],l=s-i,f=u-a,h=l*l+f*f;if(h<Ro)r=Math.log(c/o)/zo,n=function(t){return[i+t*l,a+t*f,o*Math.exp(zo*t*r)]};else{var d=Math.sqrt(h),p=(c*c-o*o+Bo*h)/(2*o*Uo*d),g=(c*c-o*o-Bo*h)/(2*c*Uo*d),v=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(g*g+1)-g);r=(m-v)/zo,n=function(t){var e=t*r,n=rt(v),s=o/(Uo*d)*(n*it(zo*e+v)-nt(v));return[i+s*l,a+s*f,o*n/rt(zo*e+v)]}}return n.duration=1e3*r,n},so.behavior.zoom=function(){function t(t){t.on(P,f).on(Yo+".zoom",d).on("dblclick.zoom",p).on(D,h)}function n(t){return[(t[0]-T.x)/T.k,(t[1]-T.y)/T.k]}function r(t){return[t[0]*T.k+T.x,t[1]*T.k+T.y]}function i(t){T.k=Math.max(E[0],Math.min(E[1],t))}function a(t,e){e=r(e),T.x+=t[0]-e[0],T.y+=t[1]-e[1]}function o(e,n,r,o){e.__chart__={x:T.x,y:T.y,k:T.k},i(Math.pow(2,o)),a(v=n,r),e=so.select(e),M>0&&(e=e.transition().duration(M)),e.call(t.event)}function s(){b&&b.domain(_.range().map(function(t){return(t-T.x)/T.k}).map(_.invert)),w&&w.domain($.range().map(function(t){return(t-T.y)/T.k}).map($.invert))}function u(t){k++||t({type:"zoomstart"})}function c(t){s(),t({type:"zoom",scale:T.k,translate:[T.x,T.y]})}function l(t){--k||(t({type:"zoomend"}),v=null)}function f(){function t(){s=1,a(so.mouse(i),h),c(o)}function r(){f.on(O,null).on(L,null),d(s),l(o)}var i=this,o=V.of(i,arguments),s=0,f=so.select(e(i)).on(O,t).on(L,r),h=n(so.mouse(i)),d=X(i);Fu.call(i),u(o)}function h(){function t(){var t=so.touches(p);return d=T.k,t.forEach(function(t){t.identifier in v&&(v[t.identifier]=n(t))}),t}function e(){var e=so.event.target;so.select(e).on(_,r).on(b,s),$.push(e);for(var n=so.event.changedTouches,i=0,a=n.length;i<a;++i)v[n[i].identifier]=null;var u=t(),c=Date.now();if(1===u.length){if(c-x<500){var l=u[0];o(p,l,v[l.identifier],Math.floor(Math.log(T.k)/Math.LN2)+1),S()}x=c}else if(u.length>1){var l=u[0],f=u[1],h=l[0]-f[0],d=l[1]-f[1];m=h*h+d*d}}function r(){var t,e,n,r,o=so.touches(p);Fu.call(p);for(var s=0,u=o.length;s<u;++s,r=null)if(n=o[s],r=v[n.identifier]){if(e)break;t=n,e=r}if(r){var l=(l=n[0]-t[0])*l+(l=n[1]-t[1])*l,f=m&&Math.sqrt(l/m);t=[(t[0]+n[0])/2,(t[1]+n[1])/2],e=[(e[0]+r[0])/2,(e[1]+r[1])/2],i(f*d)}x=null,a(t,e),c(g)}function s(){if(so.event.touches.length){for(var e=so.event.changedTouches,n=0,r=e.length;n<r;++n)delete v[e[n].identifier];for(var i in v)return void t()}so.selectAll($).on(y,null),w.on(P,f).on(D,h),A(),l(g)}var d,p=this,g=V.of(p,arguments),v={},m=0,y=".zoom-"+so.event.changedTouches[0].identifier,_="touchmove"+y,b="touchend"+y,$=[],w=so.select(p),A=X(p);e(),u(g),w.on(P,null).on(D,e)}function d(){var t=V.of(this,arguments);y?clearTimeout(y):(Fu.call(this),g=n(v=m||so.mouse(this)),u(t)),y=setTimeout(function(){y=null,l(t)},50),S(),i(Math.pow(2,.002*qo())*T.k),a(v,g),c(t)}function p(){var t=so.mouse(this),e=Math.log(T.k)/Math.LN2;o(this,t,n(t),so.event.shiftKey?Math.ceil(e)-1:Math.floor(e)+1)}var g,v,m,y,x,_,b,$,w,T={x:0,y:0,k:1},C=[960,500],E=Wo,M=250,k=0,P="mousedown.zoom",O="mousemove.zoom",L="mouseup.zoom",D="touchstart.zoom",V=A(t,"zoomstart","zoom","zoomend");return Yo||(Yo="onwheel"in lo?(qo=function(){return-so.event.deltaY*(so.event.deltaMode?120:1)},"wheel"):"onmousewheel"in lo?(qo=function(){return so.event.wheelDelta},"mousewheel"):(qo=function(){return-so.event.detail},"MozMousePixelScroll")),t.event=function(t){t.each(function(){var t=V.of(this,arguments),e=T;Nu?so.select(this).transition().each("start.zoom",function(){T=this.__chart__||{x:0,y:0,k:1},u(t)}).tween("zoom:zoom",function(){var n=C[0],r=C[1],i=v?v[0]:n/2,a=v?v[1]:r/2,o=so.interpolateZoom([(i-T.x)/T.k,(a-T.y)/T.k,n/T.k],[(i-e.x)/e.k,(a-e.y)/e.k,n/e.k]);return function(e){var r=o(e),s=n/r[2];this.__chart__=T={x:i-r[0]*s,y:a-r[1]*s,k:s},c(t)}}).each("interrupt.zoom",function(){l(t)}).each("end.zoom",function(){l(t)}):(this.__chart__=T,u(t),c(t),l(t))})},t.translate=function(e){return arguments.length?(T={x:+e[0],y:+e[1],k:T.k},s(),t):[T.x,T.y]},t.scale=function(e){return arguments.length?(T={x:T.x,y:T.y,k:null},i(+e),s(),t):T.k},t.scaleExtent=function(e){return arguments.length?(E=null==e?Wo:[+e[0],+e[1]],t):E},t.center=function(e){return arguments.length?(m=e&&[+e[0],+e[1]],t):m},t.size=function(e){return arguments.length?(C=e&&[+e[0],+e[1]],t):C},t.duration=function(e){return arguments.length?(M=+e,t):M},t.x=function(e){return arguments.length?(b=e,_=e.copy(),T={x:0,y:0,k:1},t):b},t.y=function(e){return arguments.length?(w=e,$=e.copy(),T={x:0,y:0,k:1},t):w},so.rebind(t,V,"on")};var qo,Yo,Wo=[0,1/0];so.color=ot,ot.prototype.toString=function(){return this.rgb()+""},so.hsl=st;var Xo=st.prototype=new ot;Xo.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new st(this.h,this.s,this.l/t)},Xo.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new st(this.h,this.s,t*this.l)},Xo.rgb=function(){return ut(this.h,this.s,this.l)},so.hcl=ct;var Qo=ct.prototype=new ot;Qo.brighter=function(t){return new ct(this.h,this.c,Math.min(100,this.l+Zo*(arguments.length?t:1)))},Qo.darker=function(t){return new ct(this.h,this.c,Math.max(0,this.l-Zo*(arguments.length?t:1)))},Qo.rgb=function(){return lt(this.h,this.c,this.l).rgb()},so.lab=ft;var Zo=18,Jo=.95047,Ko=1,ts=1.08883,es=ft.prototype=new ot;es.brighter=function(t){return new ft(Math.min(100,this.l+Zo*(arguments.length?t:1)),this.a,this.b)},es.darker=function(t){return new ft(Math.max(0,this.l-Zo*(arguments.length?t:1)),this.a,this.b)},es.rgb=function(){return ht(this.l,this.a,this.b)},so.rgb=mt;var ns=mt.prototype=new ot;ns.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var e=this.r,n=this.g,r=this.b,i=30;return e||n||r?(e&&e<i&&(e=i),n&&n<i&&(n=i),r&&r<i&&(r=i),new mt(Math.min(255,e/t),Math.min(255,n/t),Math.min(255,r/t))):new mt(i,i,i)},ns.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new mt(t*this.r,t*this.g,t*this.b)},ns.hsl=function(){return $t(this.r,this.g,this.b)},ns.toString=function(){return"#"+_t(this.r)+_t(this.g)+_t(this.b)};var rs=so.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});rs.forEach(function(t,e){rs.set(t,yt(e))}),so.functor=At,so.xhr=Ct(y),so.dsv=function(t,e){function n(t,n,a){arguments.length<3&&(a=n,n=null);var o=Et(t,e,null==n?r:i(n),a);return o.row=function(t){return arguments.length?o.response(null==(n=t)?r:i(t)):n},o}function r(t){return n.parse(t.responseText)}function i(t){return function(e){return n.parse(e.responseText,t)}}function a(e){return e.map(o).join(t)}function o(t){return s.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var s=new RegExp('["'+t+"\n]"),u=t.charCodeAt(0);return n.parse=function(t,e){var r;return n.parseRows(t,function(t,n){if(r)return r(t,n-1);var i=new Function("d","return {"+t.map(function(t,e){return JSON.stringify(t)+": d["+e+"]"}).join(",")+"}");r=e?function(t,n){return e(i(t),n)}:i})},n.parseRows=function(t,e){function n(){if(l>=c)return o;if(i)return i=!1,a;var e=l;if(34===t.charCodeAt(e)){for(var n=e;n++<c;)if(34===t.charCodeAt(n)){if(34!==t.charCodeAt(n+1))break;++n}l=n+2;var r=t.charCodeAt(n+1);return 13===r?(i=!0,10===t.charCodeAt(n+2)&&++l):10===r&&(i=!0),t.slice(e+1,n).replace(/""/g,'"')}for(;l<c;){var r=t.charCodeAt(l++),s=1;if(10===r)i=!0;else if(13===r)i=!0,10===t.charCodeAt(l)&&(++l,++s);else if(r!==u)continue;return t.slice(e,l-s)}return t.slice(e)}for(var r,i,a={},o={},s=[],c=t.length,l=0,f=0;(r=n())!==o;){for(var h=[];r!==a&&r!==o;)h.push(r),r=n();e&&null==(h=e(h,f++))||s.push(h)}return s},n.format=function(e){if(Array.isArray(e[0]))return n.formatRows(e);var r=new m,i=[];return e.forEach(function(t){for(var e in t)r.has(e)||i.push(r.add(e))}),[i.map(o).join(t)].concat(e.map(function(e){return i.map(function(t){return o(e[t])}).join(t)})).join("\n")},n.formatRows=function(t){return t.map(a).join("\n")},n},so.csv=so.dsv(",","text/csv"),so.tsv=so.dsv("\t","text/tab-separated-values");var is,as,os,ss,us=this[_(this,"requestAnimationFrame")]||function(t){setTimeout(t,17)};so.timer=function(){Pt.apply(this,arguments)},so.timer.flush=function(){Lt(),Dt()},so.round=function(t,e){return e?Math.round(t*(e=Math.pow(10,e)))/e:Math.round(t)};var cs=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(Rt);so.formatPrefix=function(t,e){var n=0;return(t=+t)&&(t<0&&(t*=-1),e&&(t=so.round(t,Vt(t,e))),n=1+Math.floor(1e-12+Math.log(t)/Math.LN10),n=Math.max(-24,Math.min(24,3*Math.floor((n-1)/3)))),cs[8+n/3]};var ls=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,fs=so.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,e){return t.toPrecision(e)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},r:function(t,e){return(t=so.round(t,Vt(t,e))).toFixed(Math.max(0,Math.min(20,Vt(t*(1+1e-15),e))))}}),hs=so.time={},ds=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){ps.setUTCDate.apply(this._,arguments)},setDay:function(){ps.setUTCDay.apply(this._,arguments)},setFullYear:function(){ps.setUTCFullYear.apply(this._,arguments)},setHours:function(){ps.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){ps.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){ps.setUTCMinutes.apply(this._,arguments)},setMonth:function(){ps.setUTCMonth.apply(this._,arguments)},setSeconds:function(){ps.setUTCSeconds.apply(this._,arguments)},setTime:function(){ps.setTime.apply(this._,arguments)}};var ps=Date.prototype;hs.year=Ft(function(t){return t=hs.day(t),t.setMonth(0,1),t},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t){return t.getFullYear()}),hs.years=hs.year.range,hs.years.utc=hs.year.utc.range,hs.day=Ft(function(t){var e=new ds(2e3,0);return e.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),e},function(t,e){t.setDate(t.getDate()+e)},function(t){return t.getDate()-1}),hs.days=hs.day.range,hs.days.utc=hs.day.utc.range,hs.dayOfYear=function(t){var e=hs.year(t);return Math.floor((t-e-6e4*(t.getTimezoneOffset()-e.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(t,e){e=7-e;var n=hs[t]=Ft(function(t){return(t=hs.day(t)).setDate(t.getDate()-(t.getDay()+e)%7),t},function(t,e){t.setDate(t.getDate()+7*Math.floor(e))},function(t){var n=hs.year(t).getDay();return Math.floor((hs.dayOfYear(t)+(n+e)%7)/7)-(n!==e)});hs[t+"s"]=n.range,hs[t+"s"].utc=n.utc.range,hs[t+"OfYear"]=function(t){var n=hs.year(t).getDay();return Math.floor((hs.dayOfYear(t)+(n+e)%7)/7)}}),hs.week=hs.sunday,hs.weeks=hs.sunday.range,hs.weeks.utc=hs.sunday.utc.range,hs.weekOfYear=hs.sundayOfYear;var gs={"-":"",_:" ",0:"0"},vs=/^\s*\d+/,ms=/^%/;so.locale=function(t){return{numberFormat:It(t),timeFormat:Ht(t)}};var ys=so.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});so.format=ys.numberFormat,so.geo={},ce.prototype={s:0,t:0,add:function(t){le(t,this.t,xs),le(xs.s,this.s,this),this.s?this.t+=xs.t:this.s=xs.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xs=new ce;so.geo.stream=function(t,e){t&&_s.hasOwnProperty(t.type)?_s[t.type](t,e):fe(t,e)};var _s={Feature:function(t,e){fe(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r<i;)fe(n[r].geometry,e)}},bs={Sphere:function(t,e){e.sphere()},Point:function(t,e){t=t.coordinates,e.point(t[0],t[1],t[2])},MultiPoint:function(t,e){for(var n=t.coordinates,r=-1,i=n.length;++r<i;)t=n[r],e.point(t[0],t[1],t[2])},LineString:function(t,e){he(t.coordinates,e,0)},MultiLineString:function(t,e){for(var n=t.coordinates,r=-1,i=n.length;++r<i;)he(n[r],e,0)},Polygon:function(t,e){de(t.coordinates,e)},MultiPolygon:function(t,e){for(var n=t.coordinates,r=-1,i=n.length;++r<i;)de(n[r],e)},GeometryCollection:function(t,e){for(var n=t.geometries,r=-1,i=n.length;++r<i;)fe(n[r],e)}};so.geo.area=function(t){return $s=0,so.geo.stream(t,Ss),$s};var $s,ws=new ce,Ss={sphere:function(){$s+=4*Io},point:b,lineStart:b,lineEnd:b,polygonStart:function(){ws.reset(),Ss.lineStart=pe},polygonEnd:function(){var t=2*ws;$s+=t<0?4*Io+t:t,Ss.lineStart=Ss.lineEnd=Ss.point=b}};so.geo.bounds=function(){function t(t,e){x.push(_=[l=t,h=t]),e<f&&(f=e),e>d&&(d=e)}function e(e,n){var r=ge([e*Go,n*Go]);if(m){var i=me(m,r),a=[i[1],-i[0],0],o=me(a,i);_e(o),o=be(o);var u=e-p,c=u>0?1:-1,g=o[0]*Ho*c,v=yo(u)>180;if(v^(c*p<g&&g<c*e)){var y=o[1]*Ho;y>d&&(d=y)}else if(g=(g+360)%360-180,v^(c*p<g&&g<c*e)){var y=-o[1]*Ho;y<f&&(f=y)}else n<f&&(f=n),n>d&&(d=n);v?e<p?s(l,e)>s(l,h)&&(h=e):s(e,h)>s(l,h)&&(l=e):h>=l?(e<l&&(l=e),e>h&&(h=e)):e>p?s(l,e)>s(l,h)&&(h=e):s(e,h)>s(l,h)&&(l=e)}else t(e,n);m=r,p=e}function n(){b.point=e}function r(){_[0]=l,_[1]=h,b.point=t,m=null}function i(t,n){if(m){var r=t-p;y+=yo(r)>180?r+(r>0?360:-360):r}else g=t,v=n;Ss.point(t,n),e(t,n)}function a(){Ss.lineStart()}function o(){i(g,v),Ss.lineEnd(),yo(y)>Vo&&(l=-(h=180)),_[0]=l,_[1]=h,m=null}function s(t,e){return(e-=t)<0?e+360:e}function u(t,e){return t[0]-e[0]}function c(t,e){return e[0]<=e[1]?e[0]<=t&&t<=e[1]:t<e[0]||e[1]<t}var l,f,h,d,p,g,v,m,y,x,_,b={point:t,lineStart:n,lineEnd:r,polygonStart:function(){b.point=i,b.lineStart=a,b.lineEnd=o,y=0,Ss.polygonStart()},polygonEnd:function(){Ss.polygonEnd(),b.point=t,b.lineStart=n,b.lineEnd=r,ws<0?(l=-(h=180),f=-(d=90)):y>Vo?d=90:y<-Vo&&(f=-90),_[0]=l,_[1]=h}};return function(t){d=h=-(l=f=1/0),x=[],so.geo.stream(t,b);var e=x.length;if(e){x.sort(u);for(var n,r=1,i=x[0],a=[i];r<e;++r)n=x[r],c(n[0],i)||c(n[1],i)?(s(i[0],n[1])>s(i[0],i[1])&&(i[1]=n[1]),s(n[0],i[1])>s(i[0],i[1])&&(i[0]=n[0])):a.push(i=n);for(var o,n,p=-(1/0),e=a.length-1,r=0,i=a[e];r<=e;i=n,++r)n=a[r],(o=s(i[1],n[0]))>p&&(p=o,l=n[0],h=i[1])}return x=_=null,l===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[l,f],[h,d]]}}(),so.geo.centroid=function(t){Ts=As=Cs=Es=Ms=ks=Ps=Os=Ls=Ds=Vs=0,so.geo.stream(t,Rs);var e=Ls,n=Ds,r=Vs,i=e*e+n*n+r*r;return i<Ro&&(e=ks,n=Ps,r=Os,As<Vo&&(e=Cs,n=Es,r=Ms),i=e*e+n*n+r*r,i<Ro)?[NaN,NaN]:[Math.atan2(n,e)*Ho,et(r/Math.sqrt(i))*Ho]};var Ts,As,Cs,Es,Ms,ks,Ps,Os,Ls,Ds,Vs,Rs={sphere:b,point:we,lineStart:Te,lineEnd:Ae,polygonStart:function(){Rs.lineStart=Ce},polygonEnd:function(){Rs.lineStart=Te}},Is=Le(Me,Ie,je,[-Io,-Io/2]),Ns=1e9;so.geo.clipExtent=function(){var t,e,n,r,i,a,o={stream:function(t){return i&&(i.valid=!1),i=a(t),i.valid=!0,i},extent:function(s){return arguments.length?(a=ze(t=+s[0][0],e=+s[0][1],n=+s[1][0],r=+s[1][1]),i&&(i.valid=!1,i=null),o):[[t,e],[n,r]]}};return o.extent([[0,0],[960,500]])},(so.geo.conicEqualArea=function(){return Ue(Be)}).raw=Be,so.geo.albers=function(){return so.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},so.geo.albersUsa=function(){function t(t){var a=t[0],o=t[1];return e=null,n(a,o),e||(r(a,o),e)||i(a,o),e}var e,n,r,i,a=so.geo.albers(),o=so.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),s=so.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),u={point:function(t,n){e=[t,n]}};return t.invert=function(t){var e=a.scale(),n=a.translate(),r=(t[0]-n[0])/e,i=(t[1]-n[1])/e;return(i>=.12&&i<.234&&r>=-.425&&r<-.214?o:i>=.166&&i<.234&&r>=-.214&&r<-.115?s:a).invert(t)},t.stream=function(t){var e=a.stream(t),n=o.stream(t),r=s.stream(t);return{point:function(t,i){e.point(t,i),n.point(t,i),r.point(t,i)},sphere:function(){e.sphere(),n.sphere(),r.sphere()},lineStart:function(){e.lineStart(),n.lineStart(),r.lineStart()},lineEnd:function(){e.lineEnd(),n.lineEnd(),r.lineEnd()},polygonStart:function(){e.polygonStart(),n.polygonStart(),r.polygonStart()},polygonEnd:function(){e.polygonEnd(),n.polygonEnd(),r.polygonEnd()}}},t.precision=function(e){return arguments.length?(a.precision(e),o.precision(e),s.precision(e),t):a.precision()},t.scale=function(e){return arguments.length?(a.scale(e),o.scale(.35*e),s.scale(e),t.translate(a.translate())):a.scale()},t.translate=function(e){if(!arguments.length)return a.translate();var c=a.scale(),l=+e[0],f=+e[1];return n=a.translate(e).clipExtent([[l-.455*c,f-.238*c],[l+.455*c,f+.238*c]]).stream(u).point,r=o.translate([l-.307*c,f+.201*c]).clipExtent([[l-.425*c+Vo,f+.12*c+Vo],[l-.214*c-Vo,f+.234*c-Vo]]).stream(u).point,i=s.translate([l-.205*c,f+.212*c]).clipExtent([[l-.214*c+Vo,f+.166*c+Vo],[l-.115*c-Vo,f+.234*c-Vo]]).stream(u).point,t},t.scale(1070)};var js,Fs,Gs,Hs,zs,Us,Bs={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Fs=0,Bs.lineStart=qe},polygonEnd:function(){Bs.lineStart=Bs.lineEnd=Bs.point=b,js+=yo(Fs/2)}},qs={point:Ye,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ys={point:Qe,lineStart:Ze,lineEnd:Je,polygonStart:function(){Ys.lineStart=Ke},polygonEnd:function(){Ys.point=Qe,Ys.lineStart=Ze,Ys.lineEnd=Je}};so.geo.path=function(){function t(t){return t&&("function"==typeof s&&a.pointRadius(+s.apply(this,arguments)),o&&o.valid||(o=i(a)),so.geo.stream(t,o)),a.result()}function e(){return o=null,t}var n,r,i,a,o,s=4.5;return t.area=function(t){return js=0,so.geo.stream(t,i(Bs)),js},t.centroid=function(t){return Cs=Es=Ms=ks=Ps=Os=Ls=Ds=Vs=0,so.geo.stream(t,i(Ys)),Vs?[Ls/Vs,Ds/Vs]:Os?[ks/Os,Ps/Os]:Ms?[Cs/Ms,Es/Ms]:[NaN,NaN]},t.bounds=function(t){return zs=Us=-(Gs=Hs=1/0),so.geo.stream(t,i(qs)),[[Gs,Hs],[zs,Us]]},t.projection=function(t){return arguments.length?(i=(n=t)?t.stream||nn(t):y,e()):n},t.context=function(t){return arguments.length?(a=null==(r=t)?new We:new tn(t),"function"!=typeof s&&a.pointRadius(s),e()):r},t.pointRadius=function(e){return arguments.length?(s="function"==typeof e?e:(a.pointRadius(+e),+e),t):s},t.projection(so.geo.albersUsa()).context(null)},so.geo.transform=function(t){return{stream:function(e){var n=new rn(e);for(var r in t)n[r]=t[r];return n}}},rn.prototype={point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},so.geo.projection=on,so.geo.projectionMutator=sn,(so.geo.equirectangular=function(){return on(cn)}).raw=cn.invert=cn,so.geo.rotation=function(t){function e(e){return e=t(e[0]*Go,e[1]*Go),e[0]*=Ho,e[1]*=Ho,e}return t=fn(t[0]%360*Go,t[1]*Go,t.length>2?t[2]*Go:0),e.invert=function(e){return e=t.invert(e[0]*Go,e[1]*Go),e[0]*=Ho,e[1]*=Ho,e},e},ln.invert=cn,so.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,e=fn(-t[0]*Go,-t[1]*Go,0).invert,i=[];return n(null,null,1,{point:function(t,n){i.push(t=e(t,n)),t[0]*=Ho,t[1]*=Ho}}),{type:"Polygon",coordinates:[i]}}var e,n,r=[0,0],i=6;return t.origin=function(e){return arguments.length?(r=e,t):r},t.angle=function(r){return arguments.length?(n=gn((e=+r)*Go,i*Go),t):e},t.precision=function(r){return arguments.length?(n=gn(e*Go,(i=+r)*Go),t):i},t.angle(90)},so.geo.distance=function(t,e){var n,r=(e[0]-t[0])*Go,i=t[1]*Go,a=e[1]*Go,o=Math.sin(r),s=Math.cos(r),u=Math.sin(i),c=Math.cos(i),l=Math.sin(a),f=Math.cos(a);return Math.atan2(Math.sqrt((n=f*o)*n+(n=c*l-u*f*s)*n),u*l+c*f*s)},so.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:e()}}function e(){return so.range(Math.ceil(a/v)*v,i,v).map(h).concat(so.range(Math.ceil(c/m)*m,u,m).map(d)).concat(so.range(Math.ceil(r/p)*p,n,p).filter(function(t){return yo(t%v)>Vo}).map(l)).concat(so.range(Math.ceil(s/g)*g,o,g).filter(function(t){return yo(t%m)>Vo}).map(f))}var n,r,i,a,o,s,u,c,l,f,h,d,p=10,g=p,v=90,m=360,y=2.5;return t.lines=function(){return e().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[h(a).concat(d(u).slice(1),h(i).reverse().slice(1),d(c).reverse().slice(1))]}},t.extent=function(e){return arguments.length?t.majorExtent(e).minorExtent(e):t.minorExtent()},t.majorExtent=function(e){return arguments.length?(a=+e[0][0],i=+e[1][0],c=+e[0][1],u=+e[1][1],a>i&&(e=a,a=i,i=e),c>u&&(e=c,c=u,u=e),t.precision(y)):[[a,c],[i,u]]},t.minorExtent=function(e){return arguments.length?(r=+e[0][0],n=+e[1][0],s=+e[0][1],o=+e[1][1],r>n&&(e=r,r=n,n=e),s>o&&(e=s,s=o,o=e),t.precision(y)):[[r,s],[n,o]]},t.step=function(e){return arguments.length?t.majorStep(e).minorStep(e):t.minorStep()},t.majorStep=function(e){return arguments.length?(v=+e[0],m=+e[1],t):[v,m]},t.minorStep=function(e){return arguments.length?(p=+e[0],g=+e[1],t):[p,g]},t.precision=function(e){return arguments.length?(y=+e,l=mn(s,o,90),f=yn(r,n,y),h=mn(c,u,90),d=yn(a,i,y),t):y},t.majorExtent([[-180,-90+Vo],[180,90-Vo]]).minorExtent([[-180,-80-Vo],[180,80+Vo]])},so.geo.greatArc=function(){function t(){return{type:"LineString",coordinates:[e||r.apply(this,arguments),n||i.apply(this,arguments)]}}var e,n,r=xn,i=_n;return t.distance=function(){return so.geo.distance(e||r.apply(this,arguments),n||i.apply(this,arguments))},t.source=function(n){return arguments.length?(r=n,e="function"==typeof n?null:n,t):r},t.target=function(e){return arguments.length?(i=e,n="function"==typeof e?null:e,t):i},t.precision=function(){return arguments.length?t:0},t},so.geo.interpolate=function(t,e){return bn(t[0]*Go,t[1]*Go,e[0]*Go,e[1]*Go)},so.geo.length=function(t){return Ws=0,so.geo.stream(t,Xs),Ws};var Ws,Xs={sphere:b,point:b,lineStart:$n,lineEnd:b,polygonStart:b,polygonEnd:b},Qs=wn(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(so.geo.azimuthalEqualArea=function(){return on(Qs)}).raw=Qs;var Zs=wn(function(t){var e=Math.acos(t);return e&&e/Math.sin(e)},y);(so.geo.azimuthalEquidistant=function(){return on(Zs)}).raw=Zs,(so.geo.conicConformal=function(){return Ue(Sn)}).raw=Sn,(so.geo.conicEquidistant=function(){return Ue(Tn)}).raw=Tn;var Js=wn(function(t){return 1/t},Math.atan);(so.geo.gnomonic=function(){return on(Js)}).raw=Js,An.invert=function(t,e){return[t,2*Math.atan(Math.exp(e))-Fo]},(so.geo.mercator=function(){return Cn(An)}).raw=An;var Ks=wn(function(){return 1},Math.asin);(so.geo.orthographic=function(){return on(Ks)}).raw=Ks;var tu=wn(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(so.geo.stereographic=function(){return on(tu)}).raw=tu,En.invert=function(t,e){return[-e,2*Math.atan(Math.exp(t))-Fo]},(so.geo.transverseMercator=function(){var t=Cn(En),e=t.center,n=t.rotate;return t.center=function(t){return t?e([-t[1],t[0]]):(t=e(),[t[1],-t[0]])},t.rotate=function(t){return t?n([t[0],t[1],t.length>2?t[2]+90:90]):(t=n(),[t[0],t[1],t[2]-90])},n([0,0,90])}).raw=En,so.geom={},so.geom.hull=function(t){function e(t){if(t.length<3)return[];var e,i=At(n),a=At(r),o=t.length,s=[],u=[];for(e=0;e<o;e++)s.push([+i.call(this,t[e],e),+a.call(this,t[e],e),e]);for(s.sort(On),e=0;e<o;e++)u.push([s[e][0],-s[e][1]]);var c=Pn(s),l=Pn(u),f=l[0]===c[0],h=l[l.length-1]===c[c.length-1],d=[];for(e=c.length-1;e>=0;--e)d.push(t[s[c[e]][2]]);for(e=+f;e<l.length-h;++e)d.push(t[s[l[e]][2]]);return d}var n=Mn,r=kn;return arguments.length?e(t):(e.x=function(t){return arguments.length?(n=t,e):n},e.y=function(t){return arguments.length?(r=t,e):r},e)},so.geom.polygon=function(t){return wo(t,eu),t};var eu=so.geom.polygon.prototype=[];eu.area=function(){for(var t,e=-1,n=this.length,r=this[n-1],i=0;++e<n;)t=r,r=this[e],i+=t[1]*r[0]-t[0]*r[1];return.5*i},eu.centroid=function(t){var e,n,r=-1,i=this.length,a=0,o=0,s=this[i-1];for(arguments.length||(t=-1/(6*this.area()));++r<i;)e=s,s=this[r],n=e[0]*s[1]-s[0]*e[1],a+=(e[0]+s[0])*n,o+=(e[1]+s[1])*n;return[a*t,o*t]},eu.clip=function(t){for(var e,n,r,i,a,o,s=Vn(t),u=-1,c=this.length-Vn(this),l=this[c-1];++u<c;){for(e=t.slice(),t.length=0,i=this[u],a=e[(r=e.length-s)-1],n=-1;++n<r;)o=e[n],Ln(o,l,i)?(Ln(a,l,i)||t.push(Dn(a,o,l,i)),t.push(o)):Ln(a,l,i)&&t.push(Dn(a,o,l,i)),a=o;s&&t.push(t[0]),l=i}return t};var nu,ru,iu,au,ou,su=[],uu=[];zn.prototype.prepare=function(){for(var t,e=this.edges,n=e.length;n--;)t=e[n].edge,t.b&&t.a||e.splice(n,1);return e.sort(Bn),e.length},er.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nr.prototype={insert:function(t,e){var n,r,i;if(t){if(e.P=t,e.N=t.N,t.N&&(t.N.P=e),t.N=e,t.R){for(t=t.R;t.L;)t=t.L;t.L=e}else t.R=e;n=t}else this._?(t=or(this._),e.P=null,e.N=t,t.P=t.L=e,n=t):(e.P=e.N=null,this._=e,n=null);for(e.L=e.R=null,e.U=n,e.C=!0,t=e;n&&n.C;)r=n.U,n===r.L?(i=r.R,i&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.R&&(ir(this,n),t=n,n=t.U),n.C=!1,r.C=!0,ar(this,r))):(i=r.L,i&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.L&&(ar(this,n),t=n,n=t.U),n.C=!1,r.C=!0,ir(this,r))),n=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var e,n,r,i=t.U,a=t.L,o=t.R;if(n=a?o?or(o):a:o,i?i.L===t?i.L=n:i.R=n:this._=n,a&&o?(r=n.C,n.C=t.C,n.L=a,a.U=n,n!==o?(i=n.U,n.U=t.U,t=n.R,i.L=t,n.R=o,o.U=n):(n.U=i,i=n,t=n.R)):(r=t.C,t=n),t&&(t.U=i),!r){if(t&&t.C)return void(t.C=!1);do{if(t===this._)break;if(t===i.L){if(e=i.R,e.C&&(e.C=!1,i.C=!0,ir(this,i),e=i.R),e.L&&e.L.C||e.R&&e.R.C){e.R&&e.R.C||(e.L.C=!1,e.C=!0,ar(this,e),e=i.R),e.C=i.C,i.C=e.R.C=!1,ir(this,i),t=this._;break}}else if(e=i.L,e.C&&(e.C=!1,i.C=!0,ar(this,i),e=i.L),e.L&&e.L.C||e.R&&e.R.C){e.L&&e.L.C||(e.R.C=!1,e.C=!0,ir(this,e),e=i.L),e.C=i.C,i.C=e.L.C=!1,ar(this,i),t=this._;break}e.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}},so.geom.voronoi=function(t){function e(t){var e=new Array(t.length),r=s[0][0],i=s[0][1],a=s[1][0],o=s[1][1];return sr(n(t),s).cells.forEach(function(n,s){var u=n.edges,c=n.site,l=e[s]=u.length?u.map(function(t){var e=t.start();return[e.x,e.y]}):c.x>=r&&c.x<=a&&c.y>=i&&c.y<=o?[[r,o],[a,o],[a,i],[r,i]]:[];l.point=t[s]}),e}function n(t){return t.map(function(t,e){return{x:Math.round(a(t,e)/Vo)*Vo,y:Math.round(o(t,e)/Vo)*Vo,i:e}})}var r=Mn,i=kn,a=r,o=i,s=cu;return t?e(t):(e.links=function(t){return sr(n(t)).edges.filter(function(t){return t.l&&t.r}).map(function(e){return{source:t[e.l.i],target:t[e.r.i]}})},e.triangles=function(t){var e=[];return sr(n(t)).cells.forEach(function(n,r){for(var i,a,o=n.site,s=n.edges.sort(Bn),u=-1,c=s.length,l=s[c-1].edge,f=l.l===o?l.r:l.l;++u<c;)i=l,a=f,l=s[u].edge,f=l.l===o?l.r:l.l,r<a.i&&r<f.i&&cr(o,a,f)<0&&e.push([t[r],t[a.i],t[f.i]])}),e},e.x=function(t){return arguments.length?(a=At(r=t),
e):r},e.y=function(t){return arguments.length?(o=At(i=t),e):i},e.clipExtent=function(t){return arguments.length?(s=null==t?cu:t,e):s===cu?null:s},e.size=function(t){return arguments.length?e.clipExtent(t&&[[0,0],t]):s===cu?null:s&&s[1]},e)};var cu=[[-1e6,-1e6],[1e6,1e6]];so.geom.delaunay=function(t){return so.geom.voronoi().triangles(t)},so.geom.quadtree=function(t,e,n,r,i){function a(t){function a(t,e,n,r,i,a,o,s){if(!isNaN(n)&&!isNaN(r))if(t.leaf){var u=t.x,l=t.y;if(null!=u)if(yo(u-n)+yo(l-r)<.01)c(t,e,n,r,i,a,o,s);else{var f=t.point;t.x=t.y=t.point=null,c(t,f,u,l,i,a,o,s),c(t,e,n,r,i,a,o,s)}else t.x=n,t.y=r,t.point=e}else c(t,e,n,r,i,a,o,s)}function c(t,e,n,r,i,o,s,u){var c=.5*(i+s),l=.5*(o+u),f=n>=c,h=r>=l,d=h<<1|f;t.leaf=!1,t=t.nodes[d]||(t.nodes[d]=hr()),f?i=c:s=c,h?o=l:u=l,a(t,e,n,r,i,o,s,u)}var l,f,h,d,p,g,v,m,y,x=At(s),_=At(u);if(null!=e)g=e,v=n,m=r,y=i;else if(m=y=-(g=v=1/0),f=[],h=[],p=t.length,o)for(d=0;d<p;++d)l=t[d],l.x<g&&(g=l.x),l.y<v&&(v=l.y),l.x>m&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(d=0;d<p;++d){var b=+x(l=t[d],d),$=+_(l,d);b<g&&(g=b),$<v&&(v=$),b>m&&(m=b),$>y&&(y=$),f.push(b),h.push($)}var w=m-g,S=y-v;w>S?y=v+w:m=g+S;var T=hr();if(T.add=function(t){a(T,t,+x(t,++d),+_(t,d),g,v,m,y)},T.visit=function(t){dr(t,T,g,v,m,y)},T.find=function(t){return pr(T,t[0],t[1],g,v,m,y)},d=-1,null==e){for(;++d<p;)a(T,t[d],f[d],h[d],g,v,m,y);--d}else t.forEach(T.add);return f=h=t=l=null,T}var o,s=Mn,u=kn;return(o=arguments.length)?(s=lr,u=fr,3===o&&(i=n,r=e,n=e=0),a(t)):(a.x=function(t){return arguments.length?(s=t,a):s},a.y=function(t){return arguments.length?(u=t,a):u},a.extent=function(t){return arguments.length?(null==t?e=n=r=i=null:(e=+t[0][0],n=+t[0][1],r=+t[1][0],i=+t[1][1]),a):null==e?null:[[e,n],[r,i]]},a.size=function(t){return arguments.length?(null==t?e=n=r=i=null:(e=n=0,r=+t[0],i=+t[1]),a):null==e?null:[r-e,i-n]},a)},so.interpolateRgb=gr,so.interpolateObject=vr,so.interpolateNumber=mr,so.interpolateString=yr;var lu=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,fu=new RegExp(lu.source,"g");so.interpolate=xr,so.interpolators=[function(t,e){var n=typeof e;return("string"===n?rs.has(e.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(e)?gr:yr:e instanceof ot?gr:Array.isArray(e)?_r:"object"===n&&isNaN(e)?vr:mr)(t,e)}],so.interpolateArray=_r;var hu=function(){return y},du=so.map({linear:hu,poly:Cr,quad:function(){return Sr},cubic:function(){return Tr},sin:function(){return Er},exp:function(){return Mr},circle:function(){return kr},elastic:Pr,back:Or,bounce:function(){return Lr}}),pu=so.map({in:y,out:$r,"in-out":wr,"out-in":function(t){return wr($r(t))}});so.ease=function(t){var e=t.indexOf("-"),n=e>=0?t.slice(0,e):t,r=e>=0?t.slice(e+1):"in";return n=du.get(n)||hu,r=pu.get(r)||y,br(r(n.apply(null,uo.call(arguments,1))))},so.interpolateHcl=Dr,so.interpolateHsl=Vr,so.interpolateLab=Rr,so.interpolateRound=Ir,so.transform=function(t){var e=lo.createElementNS(so.ns.prefix.svg,"g");return(so.transform=function(t){if(null!=t){e.setAttribute("transform",t);var n=e.transform.baseVal.consolidate()}return new Nr(n?n.matrix:gu)})(t)},Nr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var gu={a:1,b:0,c:0,d:1,e:0,f:0};so.interpolateTransform=Yr,so.layout={},so.layout.bundle=function(){return function(t){for(var e=[],n=-1,r=t.length;++n<r;)e.push(Qr(t[n]));return e}},so.layout.chord=function(){function t(){var t,c,f,h,d,p={},g=[],v=so.range(a),m=[];for(n=[],r=[],t=0,h=-1;++h<a;){for(c=0,d=-1;++d<a;)c+=i[h][d];g.push(c),m.push(so.range(a)),t+=c}for(o&&v.sort(function(t,e){return o(g[t],g[e])}),s&&m.forEach(function(t,e){t.sort(function(t,n){return s(i[e][t],i[e][n])})}),t=(No-l*a)/t,c=0,h=-1;++h<a;){for(f=c,d=-1;++d<a;){var y=v[h],x=m[y][d],_=i[y][x],b=c,$=c+=_*t;p[y+"-"+x]={index:y,subindex:x,startAngle:b,endAngle:$,value:_}}r[y]={index:y,startAngle:f,endAngle:c,value:g[y]},c+=l}for(h=-1;++h<a;)for(d=h-1;++d<a;){var w=p[h+"-"+d],S=p[d+"-"+h];(w.value||S.value)&&n.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}u&&e()}function e(){n.sort(function(t,e){return u((t.source.value+t.target.value)/2,(e.source.value+e.target.value)/2)})}var n,r,i,a,o,s,u,c={},l=0;return c.matrix=function(t){return arguments.length?(a=(i=t)&&i.length,n=r=null,c):i},c.padding=function(t){return arguments.length?(l=t,n=r=null,c):l},c.sortGroups=function(t){return arguments.length?(o=t,n=r=null,c):o},c.sortSubgroups=function(t){return arguments.length?(s=t,n=null,c):s},c.sortChords=function(t){return arguments.length?(u=t,n&&e(),c):u},c.chords=function(){return n||t(),n},c.groups=function(){return r||t(),r},c},so.layout.force=function(){function t(t){return function(e,n,r,i){if(e.point!==t){var a=e.cx-t.x,o=e.cy-t.y,s=i-n,u=a*a+o*o;if(s*s/m<u){if(u<g){var c=e.charge/u;t.px-=a*c,t.py-=o*c}return!0}if(e.point&&u&&u<g){var c=e.pointCharge/u;t.px-=a*c,t.py-=o*c}}return!e.charge}}function e(t){t.px=so.event.x,t.py=so.event.y,u.resume()}var n,r,i,a,o,s,u={},c=so.dispatch("start","tick","end"),l=[1,1],f=.9,h=vu,d=mu,p=-30,g=yu,v=.1,m=.64,x=[],_=[];return u.tick=function(){if((i*=.99)<.005)return n=null,c.end({type:"end",alpha:i=0}),!0;var e,r,u,h,d,g,m,y,b,$=x.length,w=_.length;for(r=0;r<w;++r)u=_[r],h=u.source,d=u.target,y=d.x-h.x,b=d.y-h.y,(g=y*y+b*b)&&(g=i*o[r]*((g=Math.sqrt(g))-a[r])/g,y*=g,b*=g,d.x-=y*(m=h.weight+d.weight?h.weight/(h.weight+d.weight):.5),d.y-=b*m,h.x+=y*(m=1-m),h.y+=b*m);if((m=i*v)&&(y=l[0]/2,b=l[1]/2,r=-1,m))for(;++r<$;)u=x[r],u.x+=(y-u.x)*m,u.y+=(b-u.y)*m;if(p)for(ri(e=so.geom.quadtree(x),i,s),r=-1;++r<$;)(u=x[r]).fixed||e.visit(t(u));for(r=-1;++r<$;)u=x[r],u.fixed?(u.x=u.px,u.y=u.py):(u.x-=(u.px-(u.px=u.x))*f,u.y-=(u.py-(u.py=u.y))*f);c.tick({type:"tick",alpha:i})},u.nodes=function(t){return arguments.length?(x=t,u):x},u.links=function(t){return arguments.length?(_=t,u):_},u.size=function(t){return arguments.length?(l=t,u):l},u.linkDistance=function(t){return arguments.length?(h="function"==typeof t?t:+t,u):h},u.distance=u.linkDistance,u.linkStrength=function(t){return arguments.length?(d="function"==typeof t?t:+t,u):d},u.friction=function(t){return arguments.length?(f=+t,u):f},u.charge=function(t){return arguments.length?(p="function"==typeof t?t:+t,u):p},u.chargeDistance=function(t){return arguments.length?(g=t*t,u):Math.sqrt(g)},u.gravity=function(t){return arguments.length?(v=+t,u):v},u.theta=function(t){return arguments.length?(m=t*t,u):Math.sqrt(m)},u.alpha=function(t){return arguments.length?(t=+t,i?t>0?i=t:(n.c=null,n.t=NaN,n=null,c.end({type:"end",alpha:i=0})):t>0&&(c.start({type:"start",alpha:i=t}),n=Pt(u.tick)),u):i},u.start=function(){function t(t,r){if(!n){for(n=new Array(i),u=0;u<i;++u)n[u]=[];for(u=0;u<c;++u){var a=_[u];n[a.source.index].push(a.target),n[a.target.index].push(a.source)}}for(var o,s=n[e],u=-1,l=s.length;++u<l;)if(!isNaN(o=s[u][t]))return o;return Math.random()*r}var e,n,r,i=x.length,c=_.length,f=l[0],g=l[1];for(e=0;e<i;++e)(r=x[e]).index=e,r.weight=0;for(e=0;e<c;++e)r=_[e],"number"==typeof r.source&&(r.source=x[r.source]),"number"==typeof r.target&&(r.target=x[r.target]),++r.source.weight,++r.target.weight;for(e=0;e<i;++e)r=x[e],isNaN(r.x)&&(r.x=t("x",f)),isNaN(r.y)&&(r.y=t("y",g)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(a=[],"function"==typeof h)for(e=0;e<c;++e)a[e]=+h.call(this,_[e],e);else for(e=0;e<c;++e)a[e]=h;if(o=[],"function"==typeof d)for(e=0;e<c;++e)o[e]=+d.call(this,_[e],e);else for(e=0;e<c;++e)o[e]=d;if(s=[],"function"==typeof p)for(e=0;e<i;++e)s[e]=+p.call(this,x[e],e);else for(e=0;e<i;++e)s[e]=p;return u.resume()},u.resume=function(){return u.alpha(.1)},u.stop=function(){return u.alpha(0)},u.drag=function(){return r||(r=so.behavior.drag().origin(y).on("dragstart.force",Kr).on("drag.force",e).on("dragend.force",ti)),arguments.length?void this.on("mouseover.force",ei).on("mouseout.force",ni).call(r):r},so.rebind(u,c,"on")};var vu=20,mu=1,yu=1/0;so.layout.hierarchy=function(){function t(i){var a,o=[i],s=[];for(i.depth=0;null!=(a=o.pop());)if(s.push(a),(c=n.call(t,a,a.depth))&&(u=c.length)){for(var u,c,l;--u>=0;)o.push(l=c[u]),l.parent=a,l.depth=a.depth+1;r&&(a.value=0),a.children=c}else r&&(a.value=+r.call(t,a,a.depth)||0),delete a.children;return oi(i,function(t){var n,i;e&&(n=t.children)&&n.sort(e),r&&(i=t.parent)&&(i.value+=t.value)}),s}var e=ci,n=si,r=ui;return t.sort=function(n){return arguments.length?(e=n,t):e},t.children=function(e){return arguments.length?(n=e,t):n},t.value=function(e){return arguments.length?(r=e,t):r},t.revalue=function(e){return r&&(ai(e,function(t){t.children&&(t.value=0)}),oi(e,function(e){var n;e.children||(e.value=+r.call(t,e,e.depth)||0),(n=e.parent)&&(n.value+=e.value)})),e},t},so.layout.partition=function(){function t(e,n,r,i){var a=e.children;if(e.x=n,e.y=e.depth*i,e.dx=r,e.dy=i,a&&(o=a.length)){var o,s,u,c=-1;for(r=e.value?r/e.value:0;++c<o;)t(s=a[c],n,u=s.value*r,i),n+=u}}function e(t){var n=t.children,r=0;if(n&&(i=n.length))for(var i,a=-1;++a<i;)r=Math.max(r,e(n[a]));return 1+r}function n(n,a){var o=r.call(this,n,a);return t(o[0],0,i[0],i[1]/e(o[0])),o}var r=so.layout.hierarchy(),i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},ii(n,r)},so.layout.pie=function(){function t(o){var s,u=o.length,c=o.map(function(n,r){return+e.call(t,n,r)}),l=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof i?i.apply(this,arguments):i)-l,h=Math.min(Math.abs(f)/u,+("function"==typeof a?a.apply(this,arguments):a)),d=h*(f<0?-1:1),p=so.sum(c),g=p?(f-u*d)/p:0,v=so.range(u),m=[];return null!=n&&v.sort(n===xu?function(t,e){return c[e]-c[t]}:function(t,e){return n(o[t],o[e])}),v.forEach(function(t){m[t]={data:o[t],value:s=c[t],startAngle:l,endAngle:l+=s*g+d,padAngle:h}}),m}var e=Number,n=xu,r=0,i=No,a=0;return t.value=function(n){return arguments.length?(e=n,t):e},t.sort=function(e){return arguments.length?(n=e,t):n},t.startAngle=function(e){return arguments.length?(r=e,t):r},t.endAngle=function(e){return arguments.length?(i=e,t):i},t.padAngle=function(e){return arguments.length?(a=e,t):a},t};var xu={};so.layout.stack=function(){function t(s,u){if(!(h=s.length))return s;var c=s.map(function(n,r){return e.call(t,n,r)}),l=c.map(function(e){return e.map(function(e,n){return[a.call(t,e,n),o.call(t,e,n)]})}),f=n.call(t,l,u);c=so.permute(c,f),l=so.permute(l,f);var h,d,p,g,v=r.call(t,l,u),m=c[0].length;for(p=0;p<m;++p)for(i.call(t,c[0][p],g=v[p],l[0][p][1]),d=1;d<h;++d)i.call(t,c[d][p],g+=l[d-1][p][1],l[d][p][1]);return s}var e=y,n=pi,r=gi,i=di,a=fi,o=hi;return t.values=function(n){return arguments.length?(e=n,t):e},t.order=function(e){return arguments.length?(n="function"==typeof e?e:_u.get(e)||pi,t):n},t.offset=function(e){return arguments.length?(r="function"==typeof e?e:bu.get(e)||gi,t):r},t.x=function(e){return arguments.length?(a=e,t):a},t.y=function(e){return arguments.length?(o=e,t):o},t.out=function(e){return arguments.length?(i=e,t):i},t};var _u=so.map({"inside-out":function(t){var e,n,r=t.length,i=t.map(vi),a=t.map(mi),o=so.range(r).sort(function(t,e){return i[t]-i[e]}),s=0,u=0,c=[],l=[];for(e=0;e<r;++e)n=o[e],s<u?(s+=a[n],c.push(n)):(u+=a[n],l.push(n));return l.reverse().concat(c)},reverse:function(t){return so.range(t.length).reverse()},default:pi}),bu=so.map({silhouette:function(t){var e,n,r,i=t.length,a=t[0].length,o=[],s=0,u=[];for(n=0;n<a;++n){for(e=0,r=0;e<i;e++)r+=t[e][n][1];r>s&&(s=r),o.push(r)}for(n=0;n<a;++n)u[n]=(s-o[n])/2;return u},wiggle:function(t){var e,n,r,i,a,o,s,u,c,l=t.length,f=t[0],h=f.length,d=[];for(d[0]=u=c=0,n=1;n<h;++n){for(e=0,i=0;e<l;++e)i+=t[e][n][1];for(e=0,a=0,s=f[n][0]-f[n-1][0];e<l;++e){for(r=0,o=(t[e][n][1]-t[e][n-1][1])/(2*s);r<e;++r)o+=(t[r][n][1]-t[r][n-1][1])/s;a+=o*t[e][n][1]}d[n]=u-=i?a/i*s:0,u<c&&(c=u)}for(n=0;n<h;++n)d[n]-=c;return d},expand:function(t){var e,n,r,i=t.length,a=t[0].length,o=1/i,s=[];for(n=0;n<a;++n){for(e=0,r=0;e<i;e++)r+=t[e][n][1];if(r)for(e=0;e<i;e++)t[e][n][1]/=r;else for(e=0;e<i;e++)t[e][n][1]=o}for(n=0;n<a;++n)s[n]=0;return s},zero:gi});so.layout.histogram=function(){function t(t,a){for(var o,s,u=[],c=t.map(n,this),l=r.call(this,c,a),f=i.call(this,l,c,a),a=-1,h=c.length,d=f.length-1,p=e?1:1/h;++a<d;)o=u[a]=[],o.dx=f[a+1]-(o.x=f[a]),o.y=0;if(d>0)for(a=-1;++a<h;)s=c[a],s>=l[0]&&s<=l[1]&&(o=u[so.bisect(f,s,1,d)-1],o.y+=p,o.push(t[a]));return u}var e=!0,n=Number,r=bi,i=xi;return t.value=function(e){return arguments.length?(n=e,t):n},t.range=function(e){return arguments.length?(r=At(e),t):r},t.bins=function(e){return arguments.length?(i="number"==typeof e?function(t){return _i(t,e)}:At(e),t):i},t.frequency=function(n){return arguments.length?(e=!!n,t):e},t},so.layout.pack=function(){function t(t,a){var o=n.call(this,t,a),s=o[0],u=i[0],c=i[1],l=null==e?Math.sqrt:"function"==typeof e?e:function(){return e};if(s.x=s.y=0,oi(s,function(t){t.r=+l(t.value)}),oi(s,Ai),r){var f=r*(e?1:Math.max(2*s.r/u,2*s.r/c))/2;oi(s,function(t){t.r+=f}),oi(s,Ai),oi(s,function(t){t.r-=f})}return Mi(s,u/2,c/2,e?1:1/Math.max(2*s.r/u,2*s.r/c)),o}var e,n=so.layout.hierarchy().sort($i),r=0,i=[1,1];return t.size=function(e){return arguments.length?(i=e,t):i},t.radius=function(n){return arguments.length?(e=null==n||"function"==typeof n?n:+n,t):e},t.padding=function(e){return arguments.length?(r=+e,t):r},ii(t,n)},so.layout.tree=function(){function t(t,i){var l=o.call(this,t,i),f=l[0],h=e(f);if(oi(h,n),h.parent.m=-h.z,ai(h,r),c)ai(f,a);else{var d=f,p=f,g=f;ai(f,function(t){t.x<d.x&&(d=t),t.x>p.x&&(p=t),t.depth>g.depth&&(g=t)});var v=s(d,p)/2-d.x,m=u[0]/(p.x+s(p,d)/2+v),y=u[1]/(g.depth||1);ai(f,function(t){t.x=(t.x+v)*m,t.y=t.depth*y})}return l}function e(t){for(var e,n={A:null,children:[t]},r=[n];null!=(e=r.pop());)for(var i,a=e.children,o=0,s=a.length;o<s;++o)r.push((a[o]=i={_:a[o],parent:e,children:(i=a[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return n.children[0]}function n(t){var e=t.children,n=t.parent.children,r=t.i?n[t.i-1]:null;if(e.length){Vi(t);var a=(e[0].z+e[e.length-1].z)/2;r?(t.z=r.z+s(t._,r._),t.m=t.z-a):t.z=a}else r&&(t.z=r.z+s(t._,r._));t.parent.A=i(t,r,t.parent.A||n[0])}function r(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function i(t,e,n){if(e){for(var r,i=t,a=t,o=e,u=i.parent.children[0],c=i.m,l=a.m,f=o.m,h=u.m;o=Li(o),i=Oi(i),o&&i;)u=Oi(u),a=Li(a),a.a=t,r=o.z+f-i.z-c+s(o._,i._),r>0&&(Di(Ri(o,t,n),t,r),c+=r,l+=r),f+=o.m,c+=i.m,h+=u.m,l+=a.m;o&&!Li(a)&&(a.t=o,a.m+=f-l),i&&!Oi(u)&&(u.t=i,u.m+=c-h,n=t)}return n}function a(t){t.x*=u[0],t.y=t.depth*u[1]}var o=so.layout.hierarchy().sort(null).value(null),s=Pi,u=[1,1],c=null;return t.separation=function(e){return arguments.length?(s=e,t):s},t.size=function(e){return arguments.length?(c=null==(u=e)?a:null,t):c?null:u},t.nodeSize=function(e){return arguments.length?(c=null==(u=e)?null:a,t):c?u:null},ii(t,o)},so.layout.cluster=function(){function t(t,a){var o,s=e.call(this,t,a),u=s[0],c=0;oi(u,function(t){var e=t.children;e&&e.length?(t.x=Ni(e),t.y=Ii(e)):(t.x=o?c+=n(t,o):0,t.y=0,o=t)});var l=ji(u),f=Fi(u),h=l.x-n(l,f)/2,d=f.x+n(f,l)/2;return oi(u,i?function(t){t.x=(t.x-u.x)*r[0],t.y=(u.y-t.y)*r[1]}:function(t){t.x=(t.x-h)/(d-h)*r[0],t.y=(1-(u.y?t.y/u.y:1))*r[1]}),s}var e=so.layout.hierarchy().sort(null).value(null),n=Pi,r=[1,1],i=!1;return t.separation=function(e){return arguments.length?(n=e,t):n},t.size=function(e){return arguments.length?(i=null==(r=e),t):i?null:r},t.nodeSize=function(e){return arguments.length?(i=null!=(r=e),t):i?r:null},ii(t,e)},so.layout.treemap=function(){function t(t,e){for(var n,r,i=-1,a=t.length;++i<a;)r=(n=t[i]).value*(e<0?0:e),n.area=isNaN(r)||r<=0?0:r}function e(n){var a=n.children;if(a&&a.length){var o,s,u,c=f(n),l=[],h=a.slice(),p=1/0,g="slice"===d?c.dx:"dice"===d?c.dy:"slice-dice"===d?1&n.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(t(h,c.dx*c.dy/n.value),l.area=0;(u=h.length)>0;)l.push(o=h[u-1]),l.area+=o.area,"squarify"!==d||(s=r(l,g))<=p?(h.pop(),p=s):(l.area-=l.pop().area,i(l,g,c,!1),g=Math.min(c.dx,c.dy),l.length=l.area=0,p=1/0);l.length&&(i(l,g,c,!0),l.length=l.area=0),a.forEach(e)}}function n(e){var r=e.children;if(r&&r.length){var a,o=f(e),s=r.slice(),u=[];for(t(s,o.dx*o.dy/e.value),u.area=0;a=s.pop();)u.push(a),u.area+=a.area,null!=a.z&&(i(u,a.z?o.dx:o.dy,o,!s.length),u.length=u.area=0);r.forEach(n)}}function r(t,e){for(var n,r=t.area,i=0,a=1/0,o=-1,s=t.length;++o<s;)(n=t[o].area)&&(n<a&&(a=n),n>i&&(i=n));return r*=r,e*=e,r?Math.max(e*i*p/r,r/(e*a*p)):1/0}function i(t,e,n,r){var i,a=-1,o=t.length,s=n.x,c=n.y,l=e?u(t.area/e):0;if(e==n.dx){for((r||l>n.dy)&&(l=n.dy);++a<o;)i=t[a],i.x=s,i.y=c,i.dy=l,s+=i.dx=Math.min(n.x+n.dx-s,l?u(i.area/l):0);i.z=!0,i.dx+=n.x+n.dx-s,n.y+=l,n.dy-=l}else{for((r||l>n.dx)&&(l=n.dx);++a<o;)i=t[a],i.x=s,i.y=c,i.dx=l,c+=i.dy=Math.min(n.y+n.dy-c,l?u(i.area/l):0);i.z=!1,i.dy+=n.y+n.dy-c,n.x+=l,n.dx-=l}}function a(r){var i=o||s(r),a=i[0];return a.x=a.y=0,a.value?(a.dx=c[0],a.dy=c[1]):a.dx=a.dy=0,o&&s.revalue(a),t([a],a.dx*a.dy/a.value),(o?n:e)(a),h&&(o=i),i}var o,s=so.layout.hierarchy(),u=Math.round,c=[1,1],l=null,f=Gi,h=!1,d="squarify",p=.5*(1+Math.sqrt(5));return a.size=function(t){return arguments.length?(c=t,a):c},a.padding=function(t){function e(e){var n=t.call(a,e,e.depth);return null==n?Gi(e):Hi(e,"number"==typeof n?[n,n,n,n]:n)}function n(e){return Hi(e,t)}if(!arguments.length)return l;var r;return f=null==(l=t)?Gi:"function"==(r=typeof t)?e:"number"===r?(t=[t,t,t,t],n):n,a},a.round=function(t){return arguments.length?(u=t?Math.round:Number,a):u!=Number},a.sticky=function(t){return arguments.length?(h=t,o=null,a):h},a.ratio=function(t){return arguments.length?(p=t,a):p},a.mode=function(t){return arguments.length?(d=t+"",a):d},ii(a,s)},so.random={normal:function(t,e){var n=arguments.length;return n<2&&(e=1),n<1&&(t=0),function(){var n,r,i;do n=2*Math.random()-1,r=2*Math.random()-1,i=n*n+r*r;while(!i||i>1);return t+e*n*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var t=so.random.normal.apply(so,arguments);return function(){return Math.exp(t())}},bates:function(t){var e=so.random.irwinHall(t);return function(){return e()/t}},irwinHall:function(t){return function(){for(var e=0,n=0;n<t;n++)e+=Math.random();return e}}},so.scale={};var $u={floor:y,ceil:y};so.scale.linear=function(){return Xi([0,1],[0,1],xr,!1)};var wu={s:1,g:1,p:1,r:1,e:1};so.scale.log=function(){return ra(so.scale.linear().domain([0,1]),10,!0,[1,10])};var Su=so.format(".0e"),Tu={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};so.scale.pow=function(){return ia(so.scale.linear(),1,[0,1])},so.scale.sqrt=function(){return so.scale.pow().exponent(.5)},so.scale.ordinal=function(){return oa([],{t:"range",a:[[]]})},so.scale.category10=function(){return so.scale.ordinal().range(Au)},so.scale.category20=function(){return so.scale.ordinal().range(Cu)},so.scale.category20b=function(){return so.scale.ordinal().range(Eu)},so.scale.category20c=function(){return so.scale.ordinal().range(Mu)};var Au=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xt),Cu=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xt),Eu=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xt),Mu=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xt);so.scale.quantile=function(){return sa([],[])},so.scale.quantize=function(){return ua(0,1,[0,1])},so.scale.threshold=function(){return ca([.5],[0,1])},so.scale.identity=function(){return la([0,1])},so.svg={},so.svg.arc=function(){function t(){var t=Math.max(0,+n.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),l=o.apply(this,arguments)-Fo,f=s.apply(this,arguments)-Fo,h=Math.abs(f-l),d=l>f?0:1;if(c<t&&(p=c,c=t,t=p),h>=jo)return e(c,d)+(t?e(t,1-d):"")+"Z";var p,g,v,m,y,x,_,b,$,w,S,T,A=0,C=0,E=[];if((m=(+u.apply(this,arguments)||0)/2)&&(v=a===ku?Math.sqrt(t*t+c*c):+a.apply(this,arguments),d||(C*=-1),c&&(C=et(v/c*Math.sin(m))),t&&(A=et(v/t*Math.sin(m)))),c){y=c*Math.cos(l+C),x=c*Math.sin(l+C),_=c*Math.cos(f-C),b=c*Math.sin(f-C);var M=Math.abs(f-l-2*C)<=Io?0:1;if(C&&ma(y,x,_,b)===d^M){var k=(l+f)/2;y=c*Math.cos(k),x=c*Math.sin(k),_=b=null}}else y=x=0;if(t){$=t*Math.cos(f-A),w=t*Math.sin(f-A),S=t*Math.cos(l+A),T=t*Math.sin(l+A);var P=Math.abs(l-f+2*A)<=Io?0:1;if(A&&ma($,w,S,T)===1-d^P){var O=(l+f)/2;$=t*Math.cos(O),w=t*Math.sin(O),S=T=null}}else $=w=0;if(h>Vo&&(p=Math.min(Math.abs(c-t)/2,+i.apply(this,arguments)))>.001){g=t<c^d?0:1;var L=p,D=p;if(h<Io){var V=null==S?[$,w]:null==_?[y,x]:Dn([y,x],[S,T],[_,b],[$,w]),R=y-V[0],I=x-V[1],N=_-V[0],j=b-V[1],F=1/Math.sin(Math.acos((R*N+I*j)/(Math.sqrt(R*R+I*I)*Math.sqrt(N*N+j*j)))/2),G=Math.sqrt(V[0]*V[0]+V[1]*V[1]);D=Math.min(p,(t-G)/(F-1)),L=Math.min(p,(c-G)/(F+1))}if(null!=_){var H=ya(null==S?[$,w]:[S,T],[y,x],c,L,d),z=ya([_,b],[$,w],c,L,d);p===L?E.push("M",H[0],"A",L,",",L," 0 0,",g," ",H[1],"A",c,",",c," 0 ",1-d^ma(H[1][0],H[1][1],z[1][0],z[1][1]),",",d," ",z[1],"A",L,",",L," 0 0,",g," ",z[0]):E.push("M",H[0],"A",L,",",L," 0 1,",g," ",z[0])}else E.push("M",y,",",x);if(null!=S){var U=ya([y,x],[S,T],t,-D,d),B=ya([$,w],null==_?[y,x]:[_,b],t,-D,d);p===D?E.push("L",B[0],"A",D,",",D," 0 0,",g," ",B[1],"A",t,",",t," 0 ",d^ma(B[1][0],B[1][1],U[1][0],U[1][1]),",",1-d," ",U[1],"A",D,",",D," 0 0,",g," ",U[0]):E.push("L",B[0],"A",D,",",D," 0 0,",g," ",U[0])}else E.push("L",$,",",w)}else E.push("M",y,",",x),null!=_&&E.push("A",c,",",c," 0 ",M,",",d," ",_,",",b),E.push("L",$,",",w),null!=S&&E.push("A",t,",",t," 0 ",P,",",1-d," ",S,",",T);return E.push("Z"),E.join("")}function e(t,e){return"M0,"+t+"A"+t+","+t+" 0 1,"+e+" 0,"+-t+"A"+t+","+t+" 0 1,"+e+" 0,"+t}var n=ha,r=da,i=fa,a=ku,o=pa,s=ga,u=va;return t.innerRadius=function(e){return arguments.length?(n=At(e),t):n},t.outerRadius=function(e){return arguments.length?(r=At(e),t):r},t.cornerRadius=function(e){return arguments.length?(i=At(e),t):i},t.padRadius=function(e){return arguments.length?(a=e==ku?ku:At(e),t):a},t.startAngle=function(e){return arguments.length?(o=At(e),t):o},t.endAngle=function(e){return arguments.length?(s=At(e),t):s},t.padAngle=function(e){return arguments.length?(u=At(e),t):u},t.centroid=function(){var t=(+n.apply(this,arguments)+ +r.apply(this,arguments))/2,e=(+o.apply(this,arguments)+ +s.apply(this,arguments))/2-Fo;return[Math.cos(e)*t,Math.sin(e)*t]},t};var ku="auto";so.svg.line=function(){return xa(y)};var Pu=so.map({linear:_a,"linear-closed":ba,step:$a,"step-before":wa,"step-after":Sa,basis:ka,"basis-open":Pa,"basis-closed":Oa,bundle:La,cardinal:Ca,"cardinal-open":Ta,"cardinal-closed":Aa,monotone:ja});Pu.forEach(function(t,e){e.key=t,e.closed=/-closed$/.test(t)});var Ou=[0,2/3,1/3,0],Lu=[0,1/3,2/3,0],Du=[0,1/6,2/3,1/6];so.svg.line.radial=function(){var t=xa(Fa);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},wa.reverse=Sa,Sa.reverse=wa,so.svg.area=function(){return Ga(y)},so.svg.area.radial=function(){var t=Ga(Fa);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},so.svg.chord=function(){function t(t,s){var u=e(this,a,t,s),c=e(this,o,t,s);return"M"+u.p0+r(u.r,u.p1,u.a1-u.a0)+(n(u,c)?i(u.r,u.p1,u.r,u.p0):i(u.r,u.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,u.r,u.p0))+"Z"}function e(t,e,n,r){var i=e.call(t,n,r),a=s.call(t,i,r),o=u.call(t,i,r)-Fo,l=c.call(t,i,r)-Fo;return{r:a,a0:o,a1:l,p0:[a*Math.cos(o),a*Math.sin(o)],p1:[a*Math.cos(l),a*Math.sin(l)]}}function n(t,e){return t.a0==e.a0&&t.a1==e.a1}function r(t,e,n){return"A"+t+","+t+" 0 "+ +(n>Io)+",1 "+e}function i(t,e,n,r){return"Q 0,0 "+r}var a=xn,o=_n,s=Ha,u=pa,c=ga;return t.radius=function(e){return arguments.length?(s=At(e),t):s},t.source=function(e){return arguments.length?(a=At(e),t):a},t.target=function(e){return arguments.length?(o=At(e),t):o},t.startAngle=function(e){return arguments.length?(u=At(e),t):u},t.endAngle=function(e){return arguments.length?(c=At(e),t):c},t},so.svg.diagonal=function(){function t(t,i){var a=e.call(this,t,i),o=n.call(this,t,i),s=(a.y+o.y)/2,u=[a,{x:a.x,y:s},{x:o.x,y:s},o];return u=u.map(r),"M"+u[0]+"C"+u[1]+" "+u[2]+" "+u[3]}var e=xn,n=_n,r=za;return t.source=function(n){return arguments.length?(e=At(n),t):e},t.target=function(e){return arguments.length?(n=At(e),t):n},t.projection=function(e){return arguments.length?(r=e,t):r},t},so.svg.diagonal.radial=function(){var t=so.svg.diagonal(),e=za,n=t.projection;return t.projection=function(t){return arguments.length?n(Ua(e=t)):e},t},so.svg.symbol=function(){function t(t,r){return(Vu.get(e.call(this,t,r))||Ya)(n.call(this,t,r))}var e=qa,n=Ba;return t.type=function(n){return arguments.length?(e=At(n),t):e},t.size=function(e){return arguments.length?(n=At(e),t):n},t};var Vu=so.map({circle:Ya,cross:function(t){var e=Math.sqrt(t/5)/2;return"M"+-3*e+","+-e+"H"+-e+"V"+-3*e+"H"+e+"V"+-e+"H"+3*e+"V"+e+"H"+e+"V"+3*e+"H"+-e+"V"+e+"H"+-3*e+"Z"},diamond:function(t){var e=Math.sqrt(t/(2*Iu)),n=e*Iu;return"M0,"+-e+"L"+n+",0 0,"+e+" "+-n+",0Z"},square:function(t){var e=Math.sqrt(t)/2;return"M"+-e+","+-e+"L"+e+","+-e+" "+e+","+e+" "+-e+","+e+"Z"},"triangle-down":function(t){var e=Math.sqrt(t/Ru),n=e*Ru/2;return"M0,"+n+"L"+e+","+-n+" "+-e+","+-n+"Z"},"triangle-up":function(t){var e=Math.sqrt(t/Ru),n=e*Ru/2;return"M0,"+-n+"L"+e+","+n+" "+-e+","+n+"Z"}});so.svg.symbolTypes=Vu.keys();var Ru=Math.sqrt(3),Iu=Math.tan(30*Go);Co.transition=function(t){for(var e,n,r=Nu||++Hu,i=Ja(t),a=[],o=ju||{time:Date.now(),ease:Ar,delay:0,duration:250},s=-1,u=this.length;++s<u;){a.push(e=[]);for(var c=this[s],l=-1,f=c.length;++l<f;)(n=c[l])&&Ka(n,l,i,r,o),e.push(n)}return Xa(a,i,r)},Co.interrupt=function(t){return this.each(null==t?Fu:Wa(Ja(t)))};var Nu,ju,Fu=Wa(Ja()),Gu=[],Hu=0;Gu.call=Co.call,Gu.empty=Co.empty,Gu.node=Co.node,Gu.size=Co.size,so.transition=function(t,e){return t&&t.transition?Nu?t.transition(e):t:so.selection().transition(t)},so.transition.prototype=Gu,Gu.select=function(t){var e,n,r,i=this.id,a=this.namespace,o=[];t=E(t);for(var s=-1,u=this.length;++s<u;){o.push(e=[]);for(var c=this[s],l=-1,f=c.length;++l<f;)(r=c[l])&&(n=t.call(r,r.__data__,l,s))?("__data__"in r&&(n.__data__=r.__data__),Ka(n,l,a,i,r[a][i]),e.push(n)):e.push(null)}return Xa(o,a,i)},Gu.selectAll=function(t){var e,n,r,i,a,o=this.id,s=this.namespace,u=[];t=M(t);for(var c=-1,l=this.length;++c<l;)for(var f=this[c],h=-1,d=f.length;++h<d;)if(r=f[h]){a=r[s][o],n=t.call(r,r.__data__,h,c),u.push(e=[]);for(var p=-1,g=n.length;++p<g;)(i=n[p])&&Ka(i,p,s,o,a),e.push(i)}return Xa(u,s,o)},Gu.filter=function(t){var e,n,r,i=[];"function"!=typeof t&&(t=G(t));for(var a=0,o=this.length;a<o;a++){i.push(e=[]);for(var n=this[a],s=0,u=n.length;s<u;s++)(r=n[s])&&t.call(r,r.__data__,s,a)&&e.push(r)}return Xa(i,this.namespace,this.id)},Gu.tween=function(t,e){var n=this.id,r=this.namespace;return arguments.length<2?this.node()[r][n].tween.get(t):z(this,null==e?function(e){e[r][n].tween.remove(t)}:function(i){i[r][n].tween.set(t,e)})},Gu.attr=function(t,e){function n(){this.removeAttribute(s)}function r(){this.removeAttributeNS(s.space,s.local)}function i(t){return null==t?n:(t+="",function(){var e,n=this.getAttribute(s);return n!==t&&(e=o(n,t),function(t){this.setAttribute(s,e(t))})})}function a(t){return null==t?r:(t+="",function(){var e,n=this.getAttributeNS(s.space,s.local);return n!==t&&(e=o(n,t),function(t){this.setAttributeNS(s.space,s.local,e(t))})})}if(arguments.length<2){for(e in t)this.attr(e,t[e]);return this}var o="transform"==t?Yr:xr,s=so.ns.qualify(t);return Qa(this,"attr."+t,e,s.local?a:i)},Gu.attrTween=function(t,e){function n(t,n){var r=e.call(this,t,n,this.getAttribute(i));return r&&function(t){this.setAttribute(i,r(t))}}function r(t,n){var r=e.call(this,t,n,this.getAttributeNS(i.space,i.local));return r&&function(t){this.setAttributeNS(i.space,i.local,r(t))}}var i=so.ns.qualify(t);return this.tween("attr."+t,i.local?r:n)},Gu.style=function(t,n,r){function i(){this.style.removeProperty(t)}function a(n){return null==n?i:(n+="",function(){var i,a=e(this).getComputedStyle(this,null).getPropertyValue(t);return a!==n&&(i=xr(a,n),function(e){this.style.setProperty(t,i(e),r)})})}var o=arguments.length;if(o<3){if("string"!=typeof t){o<2&&(n="");for(r in t)this.style(r,t[r],n);return this}r=""}return Qa(this,"style."+t,n,a)},Gu.styleTween=function(t,n,r){function i(i,a){var o=n.call(this,i,a,e(this).getComputedStyle(this,null).getPropertyValue(t));return o&&function(e){this.style.setProperty(t,o(e),r)}}return arguments.length<3&&(r=""),this.tween("style."+t,i)},Gu.text=function(t){return Qa(this,"text",t,Za)},Gu.remove=function(){var t=this.namespace;return this.each("end.transition",function(){var e;this[t].count<2&&(e=this.parentNode)&&e.removeChild(this)})},Gu.ease=function(t){var e=this.id,n=this.namespace;return arguments.length<1?this.node()[n][e].ease:("function"!=typeof t&&(t=so.ease.apply(so,arguments)),z(this,function(r){r[n][e].ease=t}))},Gu.delay=function(t){var e=this.id,n=this.namespace;return arguments.length<1?this.node()[n][e].delay:z(this,"function"==typeof t?function(r,i,a){r[n][e].delay=+t.call(r,r.__data__,i,a)}:(t=+t,function(r){r[n][e].delay=t}))},Gu.duration=function(t){var e=this.id,n=this.namespace;return arguments.length<1?this.node()[n][e].duration:z(this,"function"==typeof t?function(r,i,a){r[n][e].duration=Math.max(1,t.call(r,r.__data__,i,a))}:(t=Math.max(1,t),function(r){r[n][e].duration=t}))},Gu.each=function(t,e){var n=this.id,r=this.namespace;if(arguments.length<2){var i=ju,a=Nu;try{Nu=n,z(this,function(e,i,a){ju=e[r][n],t.call(e,e.__data__,i,a)})}finally{ju=i,Nu=a}}else z(this,function(i){var a=i[r][n];(a.event||(a.event=so.dispatch("start","end","interrupt"))).on(t,e)});return this},Gu.transition=function(){for(var t,e,n,r,i=this.id,a=++Hu,o=this.namespace,s=[],u=0,c=this.length;u<c;u++){s.push(t=[]);for(var e=this[u],l=0,f=e.length;l<f;l++)(n=e[l])&&(r=n[o][i],Ka(n,l,o,a,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),t.push(n)}return Xa(s,o,a)},so.svg.axis=function(){function t(t){t.each(function(){var t,c=so.select(this),l=this.__chart__||n,f=this.__chart__=n.copy(),h=null==u?f.ticks?f.ticks.apply(f,s):f.domain():u,d=null==e?f.tickFormat?f.tickFormat.apply(f,s):y:e,p=c.selectAll(".tick").data(h,f),g=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Vo),v=so.transition(p.exit()).style("opacity",Vo).remove(),m=so.transition(p.order()).style("opacity",1),x=Math.max(i,0)+o,_=Ui(f),b=c.selectAll(".domain").data([0]),$=(b.enter().append("path").attr("class","domain"),so.transition(b));g.append("line"),g.append("text");var w,S,T,A,C=g.select("line"),E=m.select("line"),M=p.select("text").text(d),k=g.select("text"),P=m.select("text"),O="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(t=to,w="x",T="y",S="x2",A="y2",M.attr("dy",O<0?"0em":".71em").style("text-anchor","middle"),$.attr("d","M"+_[0]+","+O*a+"V0H"+_[1]+"V"+O*a)):(t=eo,w="y",T="x",S="y2",A="x2",M.attr("dy",".32em").style("text-anchor",O<0?"end":"start"),$.attr("d","M"+O*a+","+_[0]+"H0V"+_[1]+"H"+O*a)),C.attr(A,O*i),k.attr(T,O*x),E.attr(S,0).attr(A,O*i),P.attr(w,0).attr(T,O*x),f.rangeBand){var L=f,D=L.rangeBand()/2;l=f=function(t){return L(t)+D}}else l.rangeBand?l=f:v.call(t,f,l);g.call(t,l,f),m.call(t,f,f)})}var e,n=so.scale.linear(),r=zu,i=6,a=6,o=3,s=[10],u=null;return t.scale=function(e){return arguments.length?(n=e,t):n},t.orient=function(e){return arguments.length?(r=e in Uu?e+"":zu,t):r},t.ticks=function(){return arguments.length?(s=co(arguments),t):s},t.tickValues=function(e){return arguments.length?(u=e,t):u},t.tickFormat=function(n){return arguments.length?(e=n,t):e},t.tickSize=function(e){var n=arguments.length;return n?(i=+e,a=+arguments[n-1],
t):i},t.innerTickSize=function(e){return arguments.length?(i=+e,t):i},t.outerTickSize=function(e){return arguments.length?(a=+e,t):a},t.tickPadding=function(e){return arguments.length?(o=+e,t):o},t.tickSubdivide=function(){return arguments.length&&t},t};var zu="bottom",Uu={top:1,right:1,bottom:1,left:1};so.svg.brush=function(){function t(e){e.each(function(){var e=so.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",a).on("touchstart.brush",a),o=e.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),e.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var s=e.selectAll(".resize").data(g,y);s.exit().remove(),s.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Bu[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),s.style("display",t.empty()?"none":null);var u,f=so.transition(e),h=so.transition(o);c&&(u=Ui(c),h.attr("x",u[0]).attr("width",u[1]-u[0]),r(f)),l&&(u=Ui(l),h.attr("y",u[0]).attr("height",u[1]-u[0]),i(f)),n(f)})}function n(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+f[+/e$/.test(t)]+","+h[+/^s/.test(t)]+")"})}function r(t){t.select(".extent").attr("x",f[0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function i(t){t.select(".extent").attr("y",h[0]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function a(){function a(){32==so.event.keyCode&&(M||(x=null,P[0]-=f[1],P[1]-=h[1],M=2),S())}function g(){32==so.event.keyCode&&2==M&&(P[0]+=f[1],P[1]+=h[1],M=0,S())}function v(){var t=so.mouse(b),e=!1;_&&(t[0]+=_[0],t[1]+=_[1]),M||(so.event.altKey?(x||(x=[(f[0]+f[1])/2,(h[0]+h[1])/2]),P[0]=f[+(t[0]<x[0])],P[1]=h[+(t[1]<x[1])]):x=null),C&&m(t,c,0)&&(r(T),e=!0),E&&m(t,l,1)&&(i(T),e=!0),e&&(n(T),w({type:"brush",mode:M?"move":"resize"}))}function m(t,e,n){var r,i,a=Ui(e),u=a[0],c=a[1],l=P[n],g=n?h:f,v=g[1]-g[0];if(M&&(u-=l,c-=v+l),r=(n?p:d)?Math.max(u,Math.min(c,t[n])):t[n],M?i=(r+=l)+v:(x&&(l=Math.max(u,Math.min(c,2*x[n]-r))),l<r?(i=r,r=l):i=l),g[0]!=r||g[1]!=i)return n?s=null:o=null,g[0]=r,g[1]=i,!0}function y(){v(),T.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),so.select("body").style("cursor",null),O.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),k(),w({type:"brushend"})}var x,_,b=this,$=so.select(so.event.target),w=u.of(b,arguments),T=so.select(b),A=$.datum(),C=!/^(n|s)$/.test(A)&&c,E=!/^(e|w)$/.test(A)&&l,M=$.classed("extent"),k=X(b),P=so.mouse(b),O=so.select(e(b)).on("keydown.brush",a).on("keyup.brush",g);if(so.event.changedTouches?O.on("touchmove.brush",v).on("touchend.brush",y):O.on("mousemove.brush",v).on("mouseup.brush",y),T.interrupt().selectAll("*").interrupt(),M)P[0]=f[0]-P[0],P[1]=h[0]-P[1];else if(A){var L=+/w$/.test(A),D=+/^n/.test(A);_=[f[1-L]-P[0],h[1-D]-P[1]],P[0]=f[L],P[1]=h[D]}else so.event.altKey&&(x=P.slice());T.style("pointer-events","none").selectAll(".resize").style("display",null),so.select("body").style("cursor",$.style("cursor")),w({type:"brushstart"}),v()}var o,s,u=A(t,"brushstart","brush","brushend"),c=null,l=null,f=[0,0],h=[0,0],d=!0,p=!0,g=qu[0];return t.event=function(t){t.each(function(){var t=u.of(this,arguments),e={x:f,y:h,i:o,j:s},n=this.__chart__||e;this.__chart__=e,Nu?so.select(this).transition().each("start.brush",function(){o=n.i,s=n.j,f=n.x,h=n.y,t({type:"brushstart"})}).tween("brush:brush",function(){var n=_r(f,e.x),r=_r(h,e.y);return o=s=null,function(i){f=e.x=n(i),h=e.y=r(i),t({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=e.i,s=e.j,t({type:"brush",mode:"resize"}),t({type:"brushend"})}):(t({type:"brushstart"}),t({type:"brush",mode:"resize"}),t({type:"brushend"}))})},t.x=function(e){return arguments.length?(c=e,g=qu[!c<<1|!l],t):c},t.y=function(e){return arguments.length?(l=e,g=qu[!c<<1|!l],t):l},t.clamp=function(e){return arguments.length?(c&&l?(d=!!e[0],p=!!e[1]):c?d=!!e:l&&(p=!!e),t):c&&l?[d,p]:c?d:l?p:null},t.extent=function(e){var n,r,i,a,u;return arguments.length?(c&&(n=e[0],r=e[1],l&&(n=n[0],r=r[0]),o=[n,r],c.invert&&(n=c(n),r=c(r)),r<n&&(u=n,n=r,r=u),n==f[0]&&r==f[1]||(f=[n,r])),l&&(i=e[0],a=e[1],c&&(i=i[1],a=a[1]),s=[i,a],l.invert&&(i=l(i),a=l(a)),a<i&&(u=i,i=a,a=u),i==h[0]&&a==h[1]||(h=[i,a])),t):(c&&(o?(n=o[0],r=o[1]):(n=f[0],r=f[1],c.invert&&(n=c.invert(n),r=c.invert(r)),r<n&&(u=n,n=r,r=u))),l&&(s?(i=s[0],a=s[1]):(i=h[0],a=h[1],l.invert&&(i=l.invert(i),a=l.invert(a)),a<i&&(u=i,i=a,a=u))),c&&l?[[n,i],[r,a]]:c?[n,r]:l&&[i,a])},t.clear=function(){return t.empty()||(f=[0,0],h=[0,0],o=s=null),t},t.empty=function(){return!!c&&f[0]==f[1]||!!l&&h[0]==h[1]},so.rebind(t,u,"on")};var Bu={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},qu=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Yu=hs.format=ys.timeFormat,Wu=Yu.utc,Xu=Wu("%Y-%m-%dT%H:%M:%S.%LZ");Yu.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?no:Xu,no.parse=function(t){var e=new Date(t);return isNaN(e)?null:e},no.toString=Xu.toString,hs.second=Ft(function(t){return new ds(1e3*Math.floor(t/1e3))},function(t,e){t.setTime(t.getTime()+1e3*Math.floor(e))},function(t){return t.getSeconds()}),hs.seconds=hs.second.range,hs.seconds.utc=hs.second.utc.range,hs.minute=Ft(function(t){return new ds(6e4*Math.floor(t/6e4))},function(t,e){t.setTime(t.getTime()+6e4*Math.floor(e))},function(t){return t.getMinutes()}),hs.minutes=hs.minute.range,hs.minutes.utc=hs.minute.utc.range,hs.hour=Ft(function(t){var e=t.getTimezoneOffset()/60;return new ds(36e5*(Math.floor(t/36e5-e)+e))},function(t,e){t.setTime(t.getTime()+36e5*Math.floor(e))},function(t){return t.getHours()}),hs.hours=hs.hour.range,hs.hours.utc=hs.hour.utc.range,hs.month=Ft(function(t){return t=hs.day(t),t.setDate(1),t},function(t,e){t.setMonth(t.getMonth()+e)},function(t){return t.getMonth()}),hs.months=hs.month.range,hs.months.utc=hs.month.utc.range;var Qu=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Zu=[[hs.second,1],[hs.second,5],[hs.second,15],[hs.second,30],[hs.minute,1],[hs.minute,5],[hs.minute,15],[hs.minute,30],[hs.hour,1],[hs.hour,3],[hs.hour,6],[hs.hour,12],[hs.day,1],[hs.day,2],[hs.week,1],[hs.month,1],[hs.month,3],[hs.year,1]],Ju=Yu.multi([[".%L",function(t){return t.getMilliseconds()}],[":%S",function(t){return t.getSeconds()}],["%I:%M",function(t){return t.getMinutes()}],["%I %p",function(t){return t.getHours()}],["%a %d",function(t){return t.getDay()&&1!=t.getDate()}],["%b %d",function(t){return 1!=t.getDate()}],["%B",function(t){return t.getMonth()}],["%Y",Me]]),Ku={range:function(t,e,n){return so.range(Math.ceil(t/n)*n,+e,n).map(io)},floor:y,ceil:y};Zu.year=hs.year,hs.scale=function(){return ro(so.scale.linear(),Zu,Ju)};var tc=Zu.map(function(t){return[t[0].utc,t[1]]}),ec=Wu.multi([[".%L",function(t){return t.getUTCMilliseconds()}],[":%S",function(t){return t.getUTCSeconds()}],["%I:%M",function(t){return t.getUTCMinutes()}],["%I %p",function(t){return t.getUTCHours()}],["%a %d",function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],["%b %d",function(t){return 1!=t.getUTCDate()}],["%B",function(t){return t.getUTCMonth()}],["%Y",Me]]);tc.year=hs.year.utc,hs.scale.utc=function(){return ro(so.scale.linear(),tc,ec)},so.text=Ct(function(t){return t.responseText}),so.json=function(t,e){return Et(t,"application/json",ao,e)},so.html=function(t,e){return Et(t,"text/html",oo,e)},so.xml=Ct(function(t){return t.responseXML}),"function"==typeof define&&define.amd?(this.d3=so,define(so)):"object"==typeof module&&module.exports?module.exports=so:this.d3=so}(),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(t,e,n){"use strict";function r(t,e){return U(new(U(function(){},{prototype:t})),e)}function i(t){return z(arguments,function(e){e!==t&&z(e,function(e,n){t.hasOwnProperty(n)||(t[n]=e)})}),t}function a(t,e){var n=[];for(var r in t.path){if(t.path[r]!==e.path[r])break;n.push(t.path[r])}return n}function o(t){if(Object.keys)return Object.keys(t);var e=[];return z(t,function(t,n){e.push(n)}),e}function s(t,e){if(Array.prototype.indexOf)return t.indexOf(e,Number(arguments[2])||0);var n=t.length>>>0,r=Number(arguments[2])||0;for(r=r<0?Math.ceil(r):Math.floor(r),r<0&&(r+=n);r<n;r++)if(r in t&&t[r]===e)return r;return-1}function u(t,e,n,r){var i,u=a(n,r),c={},l=[];for(var f in u)if(u[f]&&u[f].params&&(i=o(u[f].params),i.length))for(var h in i)s(l,i[h])>=0||(l.push(i[h]),c[i[h]]=t[i[h]]);return U({},c,e)}function c(t,e,n){if(!n){n=[];for(var r in t)n.push(r)}for(var i=0;i<n.length;i++){var a=n[i];if(t[a]!=e[a])return!1}return!0}function l(t,e){var n={};return z(t,function(t){n[t]=e[t]}),n}function f(t){var e={},n=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));return z(n,function(n){n in t&&(e[n]=t[n])}),e}function h(t){var e={},n=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));for(var r in t)s(n,r)==-1&&(e[r]=t[r]);return e}function d(t,e){var n=H(t),r=n?[]:{};return z(t,function(t,i){e(t,i)&&(r[n?r.length:i]=t)}),r}function p(t,e){var n=H(t)?[]:{};return z(t,function(t,r){n[r]=e(t,r)}),n}function g(t){return t.then(n,function(){})&&t}function v(t,e){var r=1,a=2,u={},c=[],l=u,f=U(t.when(u),{$$promises:u,$$values:u});this.study=function(u){function d(t,n){if(y[n]!==a){if(m.push(n),y[n]===r)throw m.splice(0,s(m,n)),new Error("Cyclic dependency: "+m.join(" -> "));if(y[n]=r,F(t))v.push(n,[function(){return e.get(t)}],c);else{var i=e.annotate(t);z(i,function(t){t!==n&&u.hasOwnProperty(t)&&d(u[t],t)}),v.push(n,t,i)}m.pop(),y[n]=a}}function p(t){return G(t)&&t.then&&t.$$promises}if(!G(u))throw new Error("'invocables' must be an object");var g=o(u||{}),v=[],m=[],y={};return z(u,d),u=m=y=null,function(r,a,o){function s(){--_||(b||i(x,a.$$values),m.$$values=x,m.$$promises=m.$$promises||!0,delete m.$$inheritedValues,d.resolve(x))}function u(t){m.$$failure=t,d.reject(t)}function c(n,i,a){function c(t){f.reject(t),u(t)}function l(){if(!N(m.$$failure))try{f.resolve(e.invoke(i,o,x)),f.promise.then(function(t){x[n]=t,s()},c)}catch(t){c(t)}}var f=t.defer(),h=0;z(a,function(t){y.hasOwnProperty(t)&&!r.hasOwnProperty(t)&&(h++,y[t].then(function(e){x[t]=e,--h||l()},c))}),h||l(),y[n]=f.promise}if(p(r)&&o===n&&(o=a,a=r,r=null),r){if(!G(r))throw new Error("'locals' must be an object")}else r=l;if(a){if(!p(a))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else a=f;var d=t.defer(),m=d.promise,y=m.$$promises={},x=U({},r),_=1+v.length/3,b=!1;if(N(a.$$failure))return u(a.$$failure),m;a.$$inheritedValues&&i(x,h(a.$$inheritedValues,g)),U(y,a.$$promises),a.$$values?(b=i(x,h(a.$$values,g)),m.$$inheritedValues=h(a.$$values,g),s()):(a.$$inheritedValues&&(m.$$inheritedValues=h(a.$$inheritedValues,g)),a.then(s,u));for(var $=0,w=v.length;$<w;$+=3)r.hasOwnProperty(v[$])?s():c(v[$],v[$+1],v[$+2]);return m}},this.resolve=function(t,e,n,r){return this.study(t)(e,n,r)}}function m(t,e,n){this.fromConfig=function(t,e,n){return N(t.template)?this.fromString(t.template,e):N(t.templateUrl)?this.fromUrl(t.templateUrl,e):N(t.templateProvider)?this.fromProvider(t.templateProvider,e,n):null},this.fromString=function(t,e){return j(t)?t(e):t},this.fromUrl=function(n,r){return j(n)&&(n=n(r)),null==n?null:t.get(n,{cache:e,headers:{Accept:"text/html"}}).then(function(t){return t.data})},this.fromProvider=function(t,e,r){return n.invoke(t,null,r||{params:e})}}function y(t,e,i){function a(e,n,r,i){if(v.push(e),p[e])return p[e];if(!/^\w+([-.]+\w+)*(?:\[\])?$/.test(e))throw new Error("Invalid parameter name '"+e+"' in pattern '"+t+"'");if(g[e])throw new Error("Duplicate parameter name '"+e+"' in pattern '"+t+"'");return g[e]=new Y.Param(e,n,r,i),g[e]}function o(t,e,n,r){var i=["",""],a=t.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!e)return a;switch(n){case!1:i=["(",")"+(r?"?":"")];break;case!0:a=a.replace(/\/$/,""),i=["(?:/(",")|/)?"];break;default:i=["("+n+"|",")?"]}return a+i[0]+e+i[1]}function s(i,a){var o,s,u,c,l;return o=i[2]||i[3],l=e.params[o],u=t.substring(h,i.index),s=a?i[4]:i[4]||("*"==i[1]?".*":null),s&&(c=Y.type(s)||r(Y.type("string"),{pattern:new RegExp(s,e.caseInsensitive?"i":n)})),{id:o,regexp:s,segment:u,type:c,cfg:l}}e=U({params:{}},G(e)?e:{});var u,c=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,l=/([:]?)([\w\[\].-]+)|\{([\w\[\].-]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,f="^",h=0,d=this.segments=[],p=i?i.params:{},g=this.params=i?i.params.$$new():new Y.ParamSet,v=[];this.source=t;for(var m,y,x;(u=c.exec(t))&&(m=s(u,!1),!(m.segment.indexOf("?")>=0));)y=a(m.id,m.type,m.cfg,"path"),f+=o(m.segment,y.type.pattern.source,y.squash,y.isOptional),d.push(m.segment),h=c.lastIndex;x=t.substring(h);var _=x.indexOf("?");if(_>=0){var b=this.sourceSearch=x.substring(_);if(x=x.substring(0,_),this.sourcePath=t.substring(0,h+_),b.length>0)for(h=0;u=l.exec(b);)m=s(u,!0),y=a(m.id,m.type,m.cfg,"search"),h=c.lastIndex}else this.sourcePath=t,this.sourceSearch="";f+=o(x)+(e.strict===!1?"/?":"")+"$",d.push(x),this.regexp=new RegExp(f,e.caseInsensitive?"i":n),this.prefix=d[0],this.$$paramNames=v}function x(t){U(this,t)}function _(){function t(t){return null!=t?t.toString().replace(/(~|\/)/g,function(t){return{"~":"~~","/":"~2F"}[t]}):t}function i(t){return null!=t?t.toString().replace(/(~~|~2F)/g,function(t){return{"~~":"~","~2F":"/"}[t]}):t}function a(){return{strict:g,caseInsensitive:h}}function u(t){return j(t)||H(t)&&j(t[t.length-1])}function c(){for(;$.length;){var t=$.shift();if(t.pattern)throw new Error("You cannot override a type's .pattern at runtime.");e.extend(m[t.name],f.invoke(t.def))}}function l(t){U(this,t||{})}Y=this;var f,h=!1,g=!0,v=!1,m={},b=!0,$=[],w={string:{encode:t,decode:i,is:function(t){return null==t||!N(t)||"string"==typeof t},pattern:/[^\/]*/},int:{encode:t,decode:function(t){return parseInt(t,10)},is:function(t){return N(t)&&this.decode(t.toString())===t},pattern:/\d+/},bool:{encode:function(t){return t?1:0},decode:function(t){return 0!==parseInt(t,10)},is:function(t){return t===!0||t===!1},pattern:/0|1/},date:{encode:function(t){return this.is(t)?[t.getFullYear(),("0"+(t.getMonth()+1)).slice(-2),("0"+t.getDate()).slice(-2)].join("-"):n},decode:function(t){if(this.is(t))return t;var e=this.capture.exec(t);return e?new Date(e[1],e[2]-1,e[3]):n},is:function(t){return t instanceof Date&&!isNaN(t.valueOf())},equals:function(t,e){return this.is(t)&&this.is(e)&&t.toISOString()===e.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:e.toJson,decode:e.fromJson,is:e.isObject,equals:e.equals,pattern:/[^\/]*/},any:{encode:e.identity,decode:e.identity,equals:e.equals,pattern:/.*/}};_.$$getDefaultValue=function(t){if(!u(t.value))return t.value;if(!f)throw new Error("Injectable functions cannot be called at configuration time");return f.invoke(t.value)},this.caseInsensitive=function(t){return N(t)&&(h=t),h},this.strictMode=function(t){return N(t)&&(g=t),g},this.defaultSquashPolicy=function(t){if(!N(t))return v;if(t!==!0&&t!==!1&&!F(t))throw new Error("Invalid squash policy: "+t+". Valid policies: false, true, arbitrary-string");return v=t,t},this.compile=function(t,e){return new y(t,U(a(),e))},this.isMatcher=function(t){if(!G(t))return!1;var e=!0;return z(y.prototype,function(n,r){j(n)&&(e=e&&N(t[r])&&j(t[r]))}),e},this.type=function(t,e,n){if(!N(e))return m[t];if(m.hasOwnProperty(t))throw new Error("A type named '"+t+"' has already been defined.");return m[t]=new x(U({name:t},e)),n&&($.push({name:t,def:n}),b||c()),this},z(w,function(t,e){m[e]=new x(U({name:e},t))}),m=r(m,{}),this.$get=["$injector",function(t){return f=t,b=!1,c(),z(w,function(t,e){m[e]||(m[e]=new x(t))}),this}],this.Param=function(t,r,i,a){function c(t){var e=G(t)?o(t):[],n=s(e,"value")===-1&&s(e,"type")===-1&&s(e,"squash")===-1&&s(e,"array")===-1;return n&&(t={value:t}),t.$$fn=u(t.value)?t.value:function(){return t.value},t}function l(n,r,i){if(n.type&&r)throw new Error("Param '"+t+"' has two type configurations.");return r?r:n.type?e.isString(n.type)?m[n.type]:n.type instanceof x?n.type:new x(n.type):"config"===i?m.any:m.string}function h(){var e={array:"search"===a&&"auto"},n=t.match(/\[\]$/)?{array:!0}:{};return U(e,n,i).array}function g(t,e){var n=t.squash;if(!e||n===!1)return!1;if(!N(n)||null==n)return v;if(n===!0||F(n))return n;throw new Error("Invalid squash policy: '"+n+"'. Valid policies: false, true, or arbitrary string")}function y(t,e,r,i){var a,o,u=[{from:"",to:r||e?n:""},{from:null,to:r||e?n:""}];return a=H(t.replace)?t.replace:[],F(i)&&a.push({from:i,to:n}),o=p(a,function(t){return t.from}),d(u,function(t){return s(o,t.from)===-1}).concat(a)}function _(){if(!f)throw new Error("Injectable functions cannot be called at configuration time");var t=f.invoke(i.$$fn);if(null!==t&&t!==n&&!w.type.is(t))throw new Error("Default value ("+t+") for parameter '"+w.id+"' is not an instance of Type ("+w.type.name+")");return t}function b(t){function e(t){return function(e){return e.from===t}}function n(t){var n=p(d(w.replace,e(t)),function(t){return t.to});return n.length?n[0]:t}return t=n(t),N(t)?w.type.$normalize(t):_()}function $(){return"{Param:"+t+" "+r+" squash: '"+A+"' optional: "+T+"}"}var w=this;i=c(i),r=l(i,r,a);var S=h();r=S?r.$asArray(S,"search"===a):r,"string"!==r.name||S||"path"!==a||i.value!==n||(i.value="");var T=i.value!==n,A=g(i,T),C=y(i,S,T,A);U(this,{id:t,type:r,location:a,array:S,squash:A,replace:C,isOptional:T,value:b,dynamic:n,config:i,toString:$})},l.prototype={$$new:function(){return r(this,U(new l,{$$parent:this}))},$$keys:function(){for(var t=[],e=[],n=this,r=o(l.prototype);n;)e.push(n),n=n.$$parent;return e.reverse(),z(e,function(e){z(o(e),function(e){s(t,e)===-1&&s(r,e)===-1&&t.push(e)})}),t},$$values:function(t){var e={},n=this;return z(n.$$keys(),function(r){e[r]=n[r].value(t&&t[r])}),e},$$equals:function(t,e){var n=!0,r=this;return z(r.$$keys(),function(i){var a=t&&t[i],o=e&&e[i];r[i].type.equals(a,o)||(n=!1)}),n},$$validates:function(t){var r,i,a,o,s,u=this.$$keys();for(r=0;r<u.length&&(i=this[u[r]],a=t[u[r]],a!==n&&null!==a||!i.isOptional);r++){if(o=i.type.$normalize(a),!i.type.is(o))return!1;if(s=i.type.encode(o),e.isString(s)&&!i.type.pattern.exec(s))return!1}return!0},$$parent:n},this.ParamSet=l}function b(t,r){function i(t){var e=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(t.source);return null!=e?e[1].replace(/\\(.)/g,"$1"):""}function a(t,e){return t.replace(/\$(\$|\d{1,2})/,function(t,n){return e["$"===n?0:Number(n)]})}function o(t,e,n){if(!n)return!1;var r=t.invoke(e,e,{$match:n});return!N(r)||r}function s(r,i,a,o,s){function h(t,e,n){return"/"===v?t:e?v.slice(0,-1)+t:n?v.slice(1)+t:t}function d(t){function e(t){var e=t(a,r);return!!e&&(F(e)&&r.replace().url(e),!0)}if(!t||!t.defaultPrevented){g&&r.url()===g;g=n;var i,o=c.length;for(i=0;i<o;i++)if(e(c[i]))return;l&&e(l)}}function p(){return u=u||i.$on("$locationChangeSuccess",d)}var g,v=o.baseHref(),m=r.url();return f||p(),{sync:function(){d()},listen:function(){return p()},update:function(t){return t?void(m=r.url()):void(r.url()!==m&&(r.url(m),r.replace()))},push:function(t,e,i){var a=t.format(e||{});null!==a&&e&&e["#"]&&(a+="#"+e["#"]),r.url(a),g=i&&i.$$avoidResync?r.url():n,i&&i.replace&&r.replace()},href:function(n,i,a){if(!n.validates(i))return null;var o=t.html5Mode();e.isObject(o)&&(o=o.enabled),o=o&&s.history;var u=n.format(i);if(a=a||{},o||null===u||(u="#"+t.hashPrefix()+u),null!==u&&i&&i["#"]&&(u+="#"+i["#"]),u=h(u,o,a.absolute),!a.absolute||!u)return u;var c=!o&&u?"/":"",l=r.port();return l=80===l||443===l?"":":"+l,[r.protocol(),"://",r.host(),l,c,u].join("")}}}var u,c=[],l=null,f=!1;this.rule=function(t){if(!j(t))throw new Error("'rule' must be a function");return c.push(t),this},this.otherwise=function(t){if(F(t)){var e=t;t=function(){return e}}else if(!j(t))throw new Error("'rule' must be a function");return l=t,this},this.when=function(t,e){var n,s=F(e);if(F(t)&&(t=r.compile(t)),!s&&!j(e)&&!H(e))throw new Error("invalid 'handler' in when()");var u={matcher:function(t,e){return s&&(n=r.compile(e),e=["$match",function(t){return n.format(t)}]),U(function(n,r){return o(n,e,t.exec(r.path(),r.search()))},{prefix:F(t.prefix)?t.prefix:""})},regex:function(t,e){if(t.global||t.sticky)throw new Error("when() RegExp must not be global or sticky");return s&&(n=e,e=["$match",function(t){return a(n,t)}]),U(function(n,r){return o(n,e,t.exec(r.path()))},{prefix:i(t)})}},c={matcher:r.isMatcher(t),regex:t instanceof RegExp};for(var l in c)if(c[l])return this.rule(u[l](t,e));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(t){t===n&&(t=!0),f=t},this.$get=s,s.$inject=["$location","$rootScope","$injector","$browser","$sniffer"]}function $(t,i){function a(t){return 0===t.indexOf(".")||0===t.indexOf("^")}function h(t,e){if(!t)return n;var r=F(t),i=r?t:t.name,o=a(i);if(o){if(!e)throw new Error("No reference point given for path '"+i+"'");e=h(e);for(var s=i.split("."),u=0,c=s.length,l=e;u<c;u++)if(""!==s[u]||0!==u){if("^"!==s[u])break;if(!l.parent)throw new Error("Path '"+i+"' not valid for state '"+e.name+"'");l=l.parent}else l=e;s=s.slice(u).join("."),i=l.name+(l.name&&s?".":"")+s}var f=A[i];return!f||!r&&(r||f!==t&&f.self!==t)?n:f}function d(t,e){C[t]||(C[t]=[]),C[t].push(e)}function v(t){for(var e=C[t]||[];e.length;)m(e.shift())}function m(e){e=r(e,{self:e,resolve:e.resolve||{},toString:function(){return this.name}});var n=e.name;if(!F(n)||n.indexOf("@")>=0)throw new Error("State must have a valid name");if(A.hasOwnProperty(n))throw new Error("State '"+n+"' is already defined");var i=n.indexOf(".")!==-1?n.substring(0,n.lastIndexOf(".")):F(e.parent)?e.parent:G(e.parent)&&F(e.parent.name)?e.parent.name:"";if(i&&!A[i])return d(i,e.self);for(var a in M)j(M[a])&&(e[a]=M[a](e,M.$delegates[a]));return A[n]=e,!e[E]&&e.url&&t.when(e.url,["$match","$stateParams",function(t,n){T.$current.navigable==e&&c(t,n)||T.transitionTo(e,t,{inherit:!0,location:!1})}]),v(n),e}function y(t){return t.indexOf("*")>-1}function x(t){for(var e=t.split("."),n=T.$current.name.split("."),r=0,i=e.length;r<i;r++)"*"===e[r]&&(n[r]="*");return"**"===e[0]&&(n=n.slice(s(n,e[1])),n.unshift("**")),"**"===e[e.length-1]&&(n.splice(s(n,e[e.length-2])+1,Number.MAX_VALUE),n.push("**")),e.length==n.length&&n.join("")===e.join("")}function _(t,e){return F(t)&&!N(e)?M[t]:j(e)&&F(t)?(M[t]&&!M.$delegates[t]&&(M.$delegates[t]=M[t]),M[t]=e,this):this}function b(t,e){return G(t)?e=t:e.name=t,m(e),this}function $(t,i,a,s,f,d,v,m,_){function b(e,n,r,a){var o=t.$broadcast("$stateNotFound",e,n,r);if(o.defaultPrevented)return v.update(),P;if(!o.retry)return null;if(a.$retry)return v.update(),O;var s=T.transition=i.when(o.retry);return s.then(function(){return s!==T.transition?(t.$broadcast("$stateChangeCancel",e.to,e.toParams,n,r),M):(e.options.$retry=!0,T.transitionTo(e.to,e.toParams,e.options))},function(){return P}),v.update(),s}function $(t,n,r,o,u,c){function h(){var n=[];return z(t.views,function(r,i){var o=r.resolve&&r.resolve!==t.resolve?r.resolve:{};o.$template=[function(){return a.load(i,{view:r,locals:u.globals,params:d,notify:c.notify})||""}],n.push(f.resolve(o,u.globals,u.resolve,t).then(function(n){if(j(r.controllerProvider)||H(r.controllerProvider)){var a=e.extend({},o,u.globals);n.$$controller=s.invoke(r.controllerProvider,null,a)}else n.$$controller=r.controller;n.$$state=t,n.$$controllerAs=r.controllerAs,n.$$resolveAs=r.resolveAs,u[i]=n}))}),i.all(n).then(function(){return u.globals})}var d=r?n:l(t.params.$$keys(),n),p={$stateParams:d};u.resolve=f.resolve(t.resolve,p,u.resolve,t);var g=[u.resolve.then(function(t){u.globals=t})];return o&&g.push(o),i.all(g).then(h).then(function(t){return u})}var C=new Error("transition superseded"),M=g(i.reject(C)),k=g(i.reject(new Error("transition prevented"))),P=g(i.reject(new Error("transition aborted"))),O=g(i.reject(new Error("transition failed")));return S.locals={resolve:null,globals:{$stateParams:{}}},T={params:{},current:S.self,$current:S,transition:null},T.reload=function(t){return T.transitionTo(T.current,d,{reload:t||!0,inherit:!1,notify:!0})},T.go=function(t,e,n){return T.transitionTo(t,e,U({inherit:!0,relative:T.$current},n))},T.transitionTo=function(e,n,a){n=n||{},a=U({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},a||{});var o,c=T.$current,f=T.params,p=c.path,g=h(e,a.relative),m=n["#"];if(!N(g)){var y={to:e,toParams:n,options:a},x=b(y,c.self,f,a);if(x)return x;if(e=y.to,n=y.toParams,a=y.options,g=h(e,a.relative),!N(g)){if(!a.relative)throw new Error("No such state '"+e+"'");throw new Error("Could not resolve '"+e+"' from state '"+a.relative+"'")}}if(g[E])throw new Error("Cannot transition to abstract state '"+e+"'");if(a.inherit&&(n=u(d,n||{},T.$current,g)),!g.params.$$validates(n))return O;n=g.params.$$values(n),e=g;var _=e.path,A=0,P=_[A],L=S.locals,D=[];if(a.reload){if(F(a.reload)||G(a.reload)){if(G(a.reload)&&!a.reload.name)throw new Error("Invalid reload state object");var V=a.reload===!0?p[0]:h(a.reload);if(a.reload&&!V)throw new Error("No such reload state '"+(F(a.reload)?a.reload:a.reload.name)+"'");for(;P&&P===p[A]&&P!==V;)L=D[A]=P.locals,A++,P=_[A]}}else for(;P&&P===p[A]&&P.ownParams.$$equals(n,f);)L=D[A]=P.locals,A++,P=_[A];if(w(e,n,c,f,L,a))return m&&(n["#"]=m),T.params=n,B(T.params,d),B(l(e.params.$$keys(),d),e.locals.globals.$stateParams),a.location&&e.navigable&&e.navigable.url&&(v.push(e.navigable.url,n,{$$avoidResync:!0,replace:"replace"===a.location}),v.update(!0)),T.transition=null,i.when(T.current);if(n=l(e.params.$$keys(),n||{}),m&&(n["#"]=m),a.notify&&t.$broadcast("$stateChangeStart",e.self,n,c.self,f,a).defaultPrevented)return t.$broadcast("$stateChangeCancel",e.self,n,c.self,f),null==T.transition&&v.update(),k;for(var R=i.when(L),I=A;I<_.length;I++,P=_[I])L=D[I]=r(L),R=$(P,n,P===e,R,L,a);var j=T.transition=R.then(function(){var r,i,o;if(T.transition!==j)return t.$broadcast("$stateChangeCancel",e.self,n,c.self,f),M;for(r=p.length-1;r>=A;r--)o=p[r],o.self.onExit&&s.invoke(o.self.onExit,o.self,o.locals.globals),o.locals=null;for(r=A;r<_.length;r++)i=_[r],i.locals=D[r],i.self.onEnter&&s.invoke(i.self.onEnter,i.self,i.locals.globals);return T.transition!==j?(t.$broadcast("$stateChangeCancel",e.self,n,c.self,f),M):(T.$current=e,T.current=e.self,T.params=n,B(T.params,d),T.transition=null,a.location&&e.navigable&&v.push(e.navigable.url,e.navigable.locals.globals.$stateParams,{$$avoidResync:!0,replace:"replace"===a.location}),a.notify&&t.$broadcast("$stateChangeSuccess",e.self,n,c.self,f),v.update(!0),T.current)}).then(null,function(r){return r===C?M:T.transition!==j?(t.$broadcast("$stateChangeCancel",e.self,n,c.self,f),M):(T.transition=null,o=t.$broadcast("$stateChangeError",e.self,n,c.self,f,r),o.defaultPrevented||v.update(),i.reject(r))});return j},T.is=function(t,e,r){r=U({relative:T.$current},r||{});var i=h(t,r.relative);return N(i)?T.$current===i&&(!e||c(i.params.$$values(e),d)):n},T.includes=function(t,e,r){if(r=U({relative:T.$current},r||{}),F(t)&&y(t)){if(!x(t))return!1;t=T.$current.name}var i=h(t,r.relative);if(!N(i))return n;if(!N(T.$current.includes[i.name]))return!1;if(!e)return!0;for(var a=o(e),s=0;s<a.length;s++){var u=a[s],c=i.params[u];if(c&&!c.type.equals(d[u],e[u]))return!1}return!0},T.href=function(t,e,r){r=U({lossy:!0,inherit:!0,absolute:!1,relative:T.$current},r||{});var i=h(t,r.relative);if(!N(i))return null;r.inherit&&(e=u(d,e||{},T.$current,i));var a=i&&r.lossy?i.navigable:i;return a&&a.url!==n&&null!==a.url?v.href(a.url,l(i.params.$$keys().concat("#"),e||{}),{absolute:r.absolute}):null},T.get=function(t,e){if(0===arguments.length)return p(o(A),function(t){return A[t].self});var n=h(t,e||T.$current);return n&&n.self?n.self:null},T}function w(t,e,n,r,i,a){function o(t,e,n){function r(e){return"search"!=t.params[e].location}var i=t.params.$$keys().filter(r),a=f.apply({},[t.params].concat(i)),o=new Y.ParamSet(a);return o.$$equals(e,n)}if(!a.reload&&t===n&&(i===n.locals||t.self.reloadOnSearch===!1&&o(n,r,e)))return!0}var S,T,A={},C={},E="abstract",M={parent:function(t){if(N(t.parent)&&t.parent)return h(t.parent);var e=/^(.+)\.[^.]+$/.exec(t.name);return e?h(e[1]):S},data:function(t){return t.parent&&t.parent.data&&(t.data=t.self.data=r(t.parent.data,t.data)),t.data},url:function(t){var e=t.url,n={params:t.params||{}};if(F(e))return"^"==e.charAt(0)?i.compile(e.substring(1),n):(t.parent.navigable||S).url.concat(e,n);if(!e||i.isMatcher(e))return e;throw new Error("Invalid url '"+e+"' in state '"+t+"'")},navigable:function(t){return t.url?t:t.parent?t.parent.navigable:null},ownParams:function(t){var e=t.url&&t.url.params||new Y.ParamSet;return z(t.params||{},function(t,n){e[n]||(e[n]=new Y.Param(n,null,t,"config"))}),e},params:function(t){var e=f(t.ownParams,t.ownParams.$$keys());return t.parent&&t.parent.params?U(t.parent.params.$$new(),e):new Y.ParamSet},views:function(t){var e={};return z(N(t.views)?t.views:{"":t},function(n,r){r.indexOf("@")<0&&(r+="@"+t.parent.name),n.resolveAs=n.resolveAs||t.resolveAs||"$resolve",e[r]=n}),e},path:function(t){return t.parent?t.parent.path.concat(t):[]},includes:function(t){var e=t.parent?U({},t.parent.includes):{};return e[t.name]=!0,e},$delegates:{}};S=m({name:"",url:"^",views:null,abstract:!0}),S.navigable=null,this.decorator=_,this.state=b,this.$get=$,$.$inject=["$rootScope","$q","$view","$injector","$resolve","$stateParams","$urlRouter","$location","$urlMatcherFactory"]}function w(){function t(t,e){return{load:function(t,n){var r,i={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return n=U(i,n),n.view&&(r=e.fromConfig(n.view,n.params,n.locals)),r}}}this.$get=t,t.$inject=["$rootScope","$templateFactory"]}function S(){var t=!1;this.useAnchorScroll=function(){t=!0},this.$get=["$anchorScroll","$timeout",function(e,n){return t?e:function(t){return n(function(){t[0].scrollIntoView()},0,!1)}}]}function T(t,n,r,i,a){function o(){return n.has?function(t){return n.has(t)?n.get(t):null}:function(t){try{return n.get(t)}catch(t){return null}}}function s(t,n){var r=function(){return{enter:function(t,e,n){e.after(t),n()},leave:function(t,e){t.remove(),e()}}};if(l)return{enter:function(t,n,r){e.version.minor>2?l.enter(t,null,n).then(r):l.enter(t,null,n,r)},leave:function(t,n){e.version.minor>2?l.leave(t).then(n):l.leave(t,n)}};if(c){var i=c&&c(n,t);return{enter:function(t,e,n){i.enter(t,null,e),n()},leave:function(t,e){i.leave(t),e()}}}return r()}var u=o(),c=u("$animator"),l=u("$animate"),f={restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(n,o,u){return function(n,o,c){function l(){if(h&&(h.remove(),h=null),p&&(p.$destroy(),p=null),d){var t=d.data("$uiViewAnim");y.leave(d,function(){t.$$animLeave.resolve(),h=null}),h=d,d=null}}function f(s){var f,h=C(n,c,o,i),x=h&&t.$current&&t.$current.locals[h];if(s||x!==g){f=n.$new(),g=t.$current.locals[h],f.$emit("$viewContentLoading",h);var _=u(f,function(t){var i=a.defer(),s=a.defer(),u={$animEnter:i.promise,$animLeave:s.promise,$$animLeave:s};t.data("$uiViewAnim",u),y.enter(t,o,function(){i.resolve(),p&&p.$emit("$viewContentAnimationEnded"),(e.isDefined(m)&&!m||n.$eval(m))&&r(t)}),l()});d=_,p=f,p.$emit("$viewContentLoaded",h),p.$eval(v)}}var h,d,p,g,v=c.onload||"",m=c.autoscroll,y=s(c,n);o.inheritedData("$uiView");n.$on("$stateChangeSuccess",function(){f(!1)}),f(!0)}}};return f}function A(t,n,r,i){return{restrict:"ECA",
priority:-400,compile:function(a){var o=a.html();return function(a,s,u){var c=r.$current,l=C(a,u,s,i),f=c&&c.locals[l];if(f){s.data("$uiView",{name:l,state:f.$$state}),s.html(f.$template?f.$template:o);var h=e.extend({},f);a[f.$$resolveAs]=h;var d=t(s.contents());if(f.$$controller){f.$scope=a,f.$element=s;var p=n(f.$$controller,f);f.$$controllerAs&&(a[f.$$controllerAs]=p,a[f.$$controllerAs][f.$$resolveAs]=h),j(p.$onInit)&&p.$onInit(),s.data("$ngControllerController",p),s.children().data("$ngControllerController",p)}d(a)}}}}}function C(t,e,n,r){var i=r(e.uiView||e.name||"")(t),a=n.inheritedData("$uiView");return i.indexOf("@")>=0?i:i+"@"+(a?a.state.name:"")}function E(t,e){var n,r=t.match(/^\s*({[^}]*})\s*$/);if(r&&(t=e+"("+r[1]+")"),n=t.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!n||4!==n.length)throw new Error("Invalid state ref '"+t+"'");return{state:n[1],paramExpr:n[3]||null}}function M(t){var e=t.parent().inheritedData("$uiView");if(e&&e.state&&e.state.name)return e.state}function k(t){var e="[object SVGAnimatedString]"===Object.prototype.toString.call(t.prop("href")),n="FORM"===t[0].nodeName;return{attr:n?"action":e?"xlink:href":"href",isAnchor:"A"===t.prop("tagName").toUpperCase(),clickable:!n}}function P(t,e,n,r,i){return function(a){var o=a.which||a.button,s=i();if(!(o>1||a.ctrlKey||a.metaKey||a.shiftKey||t.attr("target"))){var u=n(function(){e.go(s.state,s.params,s.options)});a.preventDefault();var c=r.isAnchor&&!s.href?1:0;a.preventDefault=function(){c--<=0&&n.cancel(u)}}}}function O(t,e){return{relative:M(t)||e.$current,inherit:!0}}function L(t,n){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(r,i,a,o){var s,u=E(a.uiSref,t.current.name),c={state:u.state,href:null,params:null},l=k(i),f=o[1]||o[0],h=null;c.options=U(O(i,t),a.uiSrefOpts?r.$eval(a.uiSrefOpts):{});var d=function(n){n&&(c.params=e.copy(n)),c.href=t.href(u.state,c.params,c.options),h&&h(),f&&(h=f.$$addStateInfo(u.state,c.params)),null!==c.href&&a.$set(l.attr,c.href)};u.paramExpr&&(r.$watch(u.paramExpr,function(t){t!==c.params&&d(t)},!0),c.params=e.copy(r.$eval(u.paramExpr))),d(),l.clickable&&(s=P(i,t,n,l,function(){return c}),i[i.on?"on":"bind"]("click",s),r.$on("$destroy",function(){i[i.off?"off":"unbind"]("click",s)}))}}}function D(t,e){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(n,r,i,a){function o(e){h.state=e[0],h.params=e[1],h.options=e[2],h.href=t.href(h.state,h.params,h.options),d&&d(),c&&(d=c.$$addStateInfo(h.state,h.params)),h.href&&i.$set(u.attr,h.href)}var s,u=k(r),c=a[1]||a[0],l=[i.uiState,i.uiStateParams||null,i.uiStateOpts||null],f="["+l.map(function(t){return t||"null"}).join(", ")+"]",h={state:null,params:null,options:null,href:null},d=null;n.$watch(f,o,!0),o(n.$eval(f)),u.clickable&&(s=P(r,t,e,u,function(){return h}),r[r.on?"on":"bind"]("click",s),n.$on("$destroy",function(){r[r.off?"off":"unbind"]("click",s)}))}}}function V(t,e,n){return{restrict:"A",controller:["$scope","$element","$attrs","$timeout",function(e,r,i,a){function o(e,n,i){var a=t.get(e,M(r)),o=s(e,n),u={state:a||{name:e},params:n,hash:o};return g.push(u),v[o]=i,function(){var t=g.indexOf(u);t!==-1&&g.splice(t,1)}}function s(t,n){if(!F(t))throw new Error("state should be a string");return G(n)?t+q(n):(n=e.$eval(n),G(n)?t+q(n):t)}function u(){for(var t=0;t<g.length;t++)f(g[t].state,g[t].params)?c(r,v[g[t].hash]):l(r,v[g[t].hash]),h(g[t].state,g[t].params)?c(r,d):l(r,d)}function c(t,e){a(function(){t.addClass(e)})}function l(t,e){t.removeClass(e)}function f(e,n){return t.includes(e.name,n)}function h(e,n){return t.is(e.name,n)}var d,p,g=[],v={};d=n(i.uiSrefActiveEq||"",!1)(e);try{p=e.$eval(i.uiSrefActive)}catch(t){}p=p||n(i.uiSrefActive||"",!1)(e),G(p)&&z(p,function(n,r){if(F(n)){var i=E(n,t.current.name);o(i.state,e.$eval(i.paramExpr),r)}}),this.$$addStateInfo=function(t,e){if(!(G(p)&&g.length>0)){var n=o(t,e,p);return u(),n}},e.$on("$stateChangeSuccess",u),u()}]}}function R(t){var e=function(e,n){return t.is(e,n)};return e.$stateful=!0,e}function I(t){var e=function(e,n,r){return t.includes(e,n,r)};return e.$stateful=!0,e}var N=e.isDefined,j=e.isFunction,F=e.isString,G=e.isObject,H=e.isArray,z=e.forEach,U=e.extend,B=e.copy,q=e.toJson;e.module("ui.router.util",["ng"]),e.module("ui.router.router",["ui.router.util"]),e.module("ui.router.state",["ui.router.router","ui.router.util"]),e.module("ui.router",["ui.router.state"]),e.module("ui.router.compat",["ui.router"]),v.$inject=["$q","$injector"],e.module("ui.router.util").service("$resolve",v),m.$inject=["$http","$templateCache","$injector"],e.module("ui.router.util").service("$templateFactory",m);var Y;y.prototype.concat=function(t,e){var n={caseInsensitive:Y.caseInsensitive(),strict:Y.strictMode(),squash:Y.defaultSquashPolicy()};return new y(this.sourcePath+t+this.sourceSearch,U(n,e),this)},y.prototype.toString=function(){return this.source},y.prototype.exec=function(t,e){function n(t){function e(t){return t.split("").reverse().join("")}function n(t){return t.replace(/\\-/g,"-")}var r=e(t).split(/-(?!\\)/),i=p(r,e);return p(i,n).reverse()}var r=this.regexp.exec(t);if(!r)return null;e=e||{};var i,a,o,s=this.parameters(),u=s.length,c=this.segments.length-1,l={};if(c!==r.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");var f,h;for(i=0;i<c;i++){for(o=s[i],f=this.params[o],h=r[i+1],a=0;a<f.replace.length;a++)f.replace[a].from===h&&(h=f.replace[a].to);h&&f.array===!0&&(h=n(h)),N(h)&&(h=f.type.decode(h)),l[o]=f.value(h)}for(;i<u;i++){for(o=s[i],l[o]=this.params[o].value(e[o]),f=this.params[o],h=e[o],a=0;a<f.replace.length;a++)f.replace[a].from===h&&(h=f.replace[a].to);N(h)&&(h=f.type.decode(h)),l[o]=f.value(h)}return l},y.prototype.parameters=function(t){return N(t)?this.params[t]||null:this.$$paramNames},y.prototype.validates=function(t){return this.params.$$validates(t)},y.prototype.format=function(t){function e(t){return encodeURIComponent(t).replace(/-/g,function(t){return"%5C%"+t.charCodeAt(0).toString(16).toUpperCase()})}t=t||{};var n=this.segments,r=this.parameters(),i=this.params;if(!this.validates(t))return null;var a,o=!1,s=n.length-1,u=r.length,c=n[0];for(a=0;a<u;a++){var l=a<s,f=r[a],h=i[f],d=h.value(t[f]),g=h.isOptional&&h.type.equals(h.value(),d),v=!!g&&h.squash,m=h.type.encode(d);if(l){var y=n[a+1],x=a+1===s;if(v===!1)null!=m&&(c+=H(m)?p(m,e).join("-"):encodeURIComponent(m)),c+=y;else if(v===!0){var _=c.match(/\/$/)?/\/?(.*)/:/(.*)/;c+=y.match(_)[1]}else F(v)&&(c+=v+y);x&&h.squash===!0&&"/"===c.slice(-1)&&(c=c.slice(0,-1))}else{if(null==m||g&&v!==!1)continue;if(H(m)||(m=[m]),0===m.length)continue;m=p(m,encodeURIComponent).join("&"+f+"="),c+=(o?"&":"?")+(f+"="+m),o=!0}}return c},x.prototype.is=function(t,e){return!0},x.prototype.encode=function(t,e){return t},x.prototype.decode=function(t,e){return t},x.prototype.equals=function(t,e){return t==e},x.prototype.$subPattern=function(){var t=this.pattern.toString();return t.substr(1,t.length-2)},x.prototype.pattern=/.*/,x.prototype.toString=function(){return"{Type:"+this.name+"}"},x.prototype.$normalize=function(t){return this.is(t)?t:this.decode(t)},x.prototype.$asArray=function(t,e){function r(t,e){function r(t,e){return function(){return t[e].apply(t,arguments)}}function i(t){return H(t)?t:N(t)?[t]:[]}function a(t){switch(t.length){case 0:return n;case 1:return"auto"===e?t[0]:t;default:return t}}function o(t){return!t}function s(t,e){return function(n){if(H(n)&&0===n.length)return n;n=i(n);var r=p(n,t);return e===!0?0===d(r,o).length:a(r)}}function u(t){return function(e,n){var r=i(e),a=i(n);if(r.length!==a.length)return!1;for(var o=0;o<r.length;o++)if(!t(r[o],a[o]))return!1;return!0}}this.encode=s(r(t,"encode")),this.decode=s(r(t,"decode")),this.is=s(r(t,"is"),!0),this.equals=u(r(t,"equals")),this.pattern=t.pattern,this.$normalize=s(r(t,"$normalize")),this.name=t.name,this.$arrayMode=e}if(!t)return this;if("auto"===t&&!e)throw new Error("'auto' array mode is for query parameters only");return new r(this,t)},e.module("ui.router.util").provider("$urlMatcherFactory",_),e.module("ui.router.util").run(["$urlMatcherFactory",function(t){}]),b.$inject=["$locationProvider","$urlMatcherFactoryProvider"],e.module("ui.router.router").provider("$urlRouter",b),$.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider"],e.module("ui.router.state").factory("$stateParams",function(){return{}}).constant("$state.runtime",{autoinject:!0}).provider("$state",$).run(["$injector",function(t){t.get("$state.runtime").autoinject&&t.get("$state")}]),w.$inject=[],e.module("ui.router.state").provider("$view",w),e.module("ui.router.state").provider("$uiViewScroll",S),T.$inject=["$state","$injector","$uiViewScroll","$interpolate","$q"],A.$inject=["$compile","$controller","$state","$interpolate"],e.module("ui.router.state").directive("uiView",T),e.module("ui.router.state").directive("uiView",A),L.$inject=["$state","$timeout"],D.$inject=["$state","$timeout"],V.$inject=["$state","$stateParams","$interpolate"],e.module("ui.router.state").directive("uiSref",L).directive("uiSrefActive",V).directive("uiSrefActiveEq",V).directive("uiState",D),R.$inject=["$state"],I.$inject=["$state"],e.module("ui.router.state").filter("isState",R).filter("includedByState",I)}(window,window.angular),angular.module("angularMSTime",[]).directive("msTime",function(){return{restrict:"A",scope:{msModel:"=msTime",preMs:"@msTimePre",postMs:"@msTimePost"},link:function(t,e,n){function r(t){var e,n="",r={day:0,hrs:0,min:0,sec:0};if(t&&!isNaN(t))return e=new Date(Math.abs(t)),r.hrs=e.getUTCHours(),r.min=e.getUTCMinutes(),r.sec=e.getUTCSeconds(),r.hrs&&(n=r.hrs+":"),r.min?n=r.hrs&&r.min<10?n+"0"+r.min+":":n+r.min+":":n+="00:",r.sec?r.sec<10?n=n+"0"+r.sec:n+=r.sec:n+="00",n}function i(t){var e,n;return t=t.toString().trim(),e=t.split(":"),n=e.length,1===n?t="00:00:"+t:2===n?t="00:"+t:3===n||(t=n>=4?e[n-3]+":"+e[n-2]+":"+e[n-1]+":":"00:00"),Date.parse("01 Jan 1970 "+t+" UTC")}function a(t){return!!t&&/^(\d+:)?([012345]?\d:)?([012345]?\d)$/i.test(t)}function o(){var n=e[0].tagName.toLowerCase();"input"===n||"textarea"===n?(t.$watch("msModel",function(t){e.val(r(t))}),e.on("change",function(n){var r=e.val();e.addClass("ng-dirty"),a(r)?(t.msModel=i(r),t.$apply(),e.addClass("ng-valid").removeClass("ng-invalid")):e.addClass("ng-invalid").removeClass("ng-valid")})):t.$watch("msModel",function(n){var i=(t.preMs||"")+r(n)+(t.postMs||"");e.text(i)})}o()}}}),function(){function t(t,e){return t.set(e[0],e[1]),t}function e(t,e){return t.add(e),t}function n(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function r(t,e,n,r){for(var i=-1,a=null==t?0:t.length;++i<a;){var o=t[i];e(r,o,n(o),t)}return r}function i(t,e){for(var n=-1,r=null==t?0:t.length;++n<r&&e(t[n],n,t)!==!1;);return t}function a(t,e){for(var n=null==t?0:t.length;n--&&e(t[n],n,t)!==!1;);return t}function o(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(!e(t[n],n,t))return!1;return!0}function s(t,e){for(var n=-1,r=null==t?0:t.length,i=0,a=[];++n<r;){var o=t[n];e(o,n,t)&&(a[i++]=o)}return a}function u(t,e){var n=null==t?0:t.length;return!!n&&x(t,e,0)>-1}function c(t,e,n){for(var r=-1,i=null==t?0:t.length;++r<i;)if(n(e,t[r]))return!0;return!1}function l(t,e){for(var n=-1,r=null==t?0:t.length,i=Array(r);++n<r;)i[n]=e(t[n],n,t);return i}function f(t,e){for(var n=-1,r=e.length,i=t.length;++n<r;)t[i+n]=e[n];return t}function h(t,e,n,r){var i=-1,a=null==t?0:t.length;for(r&&a&&(n=t[++i]);++i<a;)n=e(n,t[i],i,t);return n}function d(t,e,n,r){var i=null==t?0:t.length;for(r&&i&&(n=t[--i]);i--;)n=e(n,t[i],i,t);return n}function p(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(e(t[n],n,t))return!0;return!1}function g(t){return t.split("")}function v(t){return t.match(Ne)||[]}function m(t,e,n){var r;return n(t,function(t,n,i){if(e(t,n,i))return r=n,!1}),r}function y(t,e,n,r){for(var i=t.length,a=n+(r?1:-1);r?a--:++a<i;)if(e(t[a],a,t))return a;return-1}function x(t,e,n){return e===e?q(t,e,n):y(t,b,n)}function _(t,e,n,r){for(var i=n-1,a=t.length;++i<a;)if(r(t[i],e))return i;return-1}function b(t){return t!==t}function $(t,e){var n=null==t?0:t.length;return n?C(t,e)/n:Ot}function w(t){return function(e){return null==e?K:e[t]}}function S(t){return function(e){return null==t?K:t[e]}}function T(t,e,n,r,i){return i(t,function(t,i,a){n=r?(r=!1,t):e(n,t,i,a)}),n}function A(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t}function C(t,e){for(var n,r=-1,i=t.length;++r<i;){var a=e(t[r]);a!==K&&(n=n===K?a:n+a)}return n}function E(t,e){for(var n=-1,r=Array(t);++n<t;)r[n]=e(n);return r}function M(t,e){return l(e,function(e){return[e,t[e]]})}function k(t){return function(e){return t(e)}}function P(t,e){return l(e,function(e){return t[e]})}function O(t,e){return t.has(e)}function L(t,e){for(var n=-1,r=t.length;++n<r&&x(e,t[n],0)>-1;);return n}function D(t,e){for(var n=t.length;n--&&x(e,t[n],0)>-1;);return n}function V(t,e){for(var n=t.length,r=0;n--;)t[n]===e&&++r;return r}function R(t){return"\\"+Zn[t]}function I(t,e){return null==t?K:t[e]}function N(t){return Hn.test(t)}function j(t){return zn.test(t)}function F(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}function G(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function H(t,e){return function(n){return t(e(n))}}function z(t,e){for(var n=-1,r=t.length,i=0,a=[];++n<r;){var o=t[n];o!==e&&o!==ot||(t[n]=ot,a[i++]=n)}return a}function U(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=t}),n}function B(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=[t,t]}),n}function q(t,e,n){for(var r=n-1,i=t.length;++r<i;)if(t[r]===e)return r;return-1}function Y(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}function W(t){return N(t)?Q(t):pr(t)}function X(t){return N(t)?Z(t):g(t)}function Q(t){for(var e=Fn.lastIndex=0;Fn.test(t);)++e;return e}function Z(t){return t.match(Fn)||[]}function J(t){return t.match(Gn)||[]}var K,tt="4.17.4",et=200,nt="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",rt="Expected a function",it="__lodash_hash_undefined__",at=500,ot="__lodash_placeholder__",st=1,ut=2,ct=4,lt=1,ft=2,ht=1,dt=2,pt=4,gt=8,vt=16,mt=32,yt=64,xt=128,_t=256,bt=512,$t=30,wt="...",St=800,Tt=16,At=1,Ct=2,Et=3,Mt=1/0,kt=9007199254740991,Pt=1.7976931348623157e308,Ot=NaN,Lt=4294967295,Dt=Lt-1,Vt=Lt>>>1,Rt=[["ary",xt],["bind",ht],["bindKey",dt],["curry",gt],["curryRight",vt],["flip",bt],["partial",mt],["partialRight",yt],["rearg",_t]],It="[object Arguments]",Nt="[object Array]",jt="[object AsyncFunction]",Ft="[object Boolean]",Gt="[object Date]",Ht="[object DOMException]",zt="[object Error]",Ut="[object Function]",Bt="[object GeneratorFunction]",qt="[object Map]",Yt="[object Number]",Wt="[object Null]",Xt="[object Object]",Qt="[object Promise]",Zt="[object Proxy]",Jt="[object RegExp]",Kt="[object Set]",te="[object String]",ee="[object Symbol]",ne="[object Undefined]",re="[object WeakMap]",ie="[object WeakSet]",ae="[object ArrayBuffer]",oe="[object DataView]",se="[object Float32Array]",ue="[object Float64Array]",ce="[object Int8Array]",le="[object Int16Array]",fe="[object Int32Array]",he="[object Uint8Array]",de="[object Uint8ClampedArray]",pe="[object Uint16Array]",ge="[object Uint32Array]",ve=/\b__p \+= '';/g,me=/\b(__p \+=) '' \+/g,ye=/(__e\(.*?\)|\b__t\)) \+\n'';/g,xe=/&(?:amp|lt|gt|quot|#39);/g,_e=/[&<>"']/g,be=RegExp(xe.source),$e=RegExp(_e.source),we=/<%-([\s\S]+?)%>/g,Se=/<%([\s\S]+?)%>/g,Te=/<%=([\s\S]+?)%>/g,Ae=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ce=/^\w*$/,Ee=/^\./,Me=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ke=/[\\^$.*+?()[\]{}|]/g,Pe=RegExp(ke.source),Oe=/^\s+|\s+$/g,Le=/^\s+/,De=/\s+$/,Ve=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Re=/\{\n\/\* \[wrapped with (.+)\] \*/,Ie=/,? & /,Ne=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,je=/\\(\\)?/g,Fe=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Ge=/\w*$/,He=/^[-+]0x[0-9a-f]+$/i,ze=/^0b[01]+$/i,Ue=/^\[object .+?Constructor\]$/,Be=/^0o[0-7]+$/i,qe=/^(?:0|[1-9]\d*)$/,Ye=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,We=/($^)/,Xe=/['\n\r\u2028\u2029\\]/g,Qe="\\ud800-\\udfff",Ze="\\u0300-\\u036f",Je="\\ufe20-\\ufe2f",Ke="\\u20d0-\\u20ff",tn=Ze+Je+Ke,en="\\u2700-\\u27bf",nn="a-z\\xdf-\\xf6\\xf8-\\xff",rn="\\xac\\xb1\\xd7\\xf7",an="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",on="\\u2000-\\u206f",sn=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",un="A-Z\\xc0-\\xd6\\xd8-\\xde",cn="\\ufe0e\\ufe0f",ln=rn+an+on+sn,fn="['’]",hn="["+Qe+"]",dn="["+ln+"]",pn="["+tn+"]",gn="\\d+",vn="["+en+"]",mn="["+nn+"]",yn="[^"+Qe+ln+gn+en+nn+un+"]",xn="\\ud83c[\\udffb-\\udfff]",_n="(?:"+pn+"|"+xn+")",bn="[^"+Qe+"]",$n="(?:\\ud83c[\\udde6-\\uddff]){2}",wn="[\\ud800-\\udbff][\\udc00-\\udfff]",Sn="["+un+"]",Tn="\\u200d",An="(?:"+mn+"|"+yn+")",Cn="(?:"+Sn+"|"+yn+")",En="(?:"+fn+"(?:d|ll|m|re|s|t|ve))?",Mn="(?:"+fn+"(?:D|LL|M|RE|S|T|VE))?",kn=_n+"?",Pn="["+cn+"]?",On="(?:"+Tn+"(?:"+[bn,$n,wn].join("|")+")"+Pn+kn+")*",Ln="\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)",Dn="\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)",Vn=Pn+kn+On,Rn="(?:"+[vn,$n,wn].join("|")+")"+Vn,In="(?:"+[bn+pn+"?",pn,$n,wn,hn].join("|")+")",Nn=RegExp(fn,"g"),jn=RegExp(pn,"g"),Fn=RegExp(xn+"(?="+xn+")|"+In+Vn,"g"),Gn=RegExp([Sn+"?"+mn+"+"+En+"(?="+[dn,Sn,"$"].join("|")+")",Cn+"+"+Mn+"(?="+[dn,Sn+An,"$"].join("|")+")",Sn+"?"+An+"+"+En,Sn+"+"+Mn,Dn,Ln,gn,Rn].join("|"),"g"),Hn=RegExp("["+Tn+Qe+tn+cn+"]"),zn=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Un=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Bn=-1,qn={};qn[se]=qn[ue]=qn[ce]=qn[le]=qn[fe]=qn[he]=qn[de]=qn[pe]=qn[ge]=!0,qn[It]=qn[Nt]=qn[ae]=qn[Ft]=qn[oe]=qn[Gt]=qn[zt]=qn[Ut]=qn[qt]=qn[Yt]=qn[Xt]=qn[Jt]=qn[Kt]=qn[te]=qn[re]=!1;var Yn={};Yn[It]=Yn[Nt]=Yn[ae]=Yn[oe]=Yn[Ft]=Yn[Gt]=Yn[se]=Yn[ue]=Yn[ce]=Yn[le]=Yn[fe]=Yn[qt]=Yn[Yt]=Yn[Xt]=Yn[Jt]=Yn[Kt]=Yn[te]=Yn[ee]=Yn[he]=Yn[de]=Yn[pe]=Yn[ge]=!0,Yn[zt]=Yn[Ut]=Yn[re]=!1;var Wn={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},Xn={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Qn={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"},Zn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Jn=parseFloat,Kn=parseInt,tr="object"==typeof global&&global&&global.Object===Object&&global,er="object"==typeof self&&self&&self.Object===Object&&self,nr=tr||er||Function("return this")(),rr="object"==typeof exports&&exports&&!exports.nodeType&&exports,ir=rr&&"object"==typeof module&&module&&!module.nodeType&&module,ar=ir&&ir.exports===rr,or=ar&&tr.process,sr=function(){try{return or&&or.binding&&or.binding("util")}catch(t){}}(),ur=sr&&sr.isArrayBuffer,cr=sr&&sr.isDate,lr=sr&&sr.isMap,fr=sr&&sr.isRegExp,hr=sr&&sr.isSet,dr=sr&&sr.isTypedArray,pr=w("length"),gr=S(Wn),vr=S(Xn),mr=S(Qn),yr=function g(S){function q(t){if(cu(t)&&!bh(t)&&!(t instanceof Ne)){if(t instanceof Z)return t;if(_l.call(t,"__wrapped__"))return ao(t)}return new Z(t)}function Q(){}function Z(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=K}function Ne(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Lt,this.__views__=[]}function Qe(){var t=new Ne(this.__wrapped__);return t.__actions__=Fi(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Fi(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Fi(this.__views__),t}function Ze(){if(this.__filtered__){var t=new Ne(this);t.__dir__=-1,t.__filtered__=!0}else t=this.clone(),t.__dir__*=-1;return t}function Je(){var t=this.__wrapped__.value(),e=this.__dir__,n=bh(t),r=e<0,i=n?t.length:0,a=Ma(0,i,this.__views__),o=a.start,s=a.end,u=s-o,c=r?s:o-1,l=this.__iteratees__,f=l.length,h=0,d=Ql(u,this.__takeCount__);if(!n||!r&&i==u&&d==u)return bi(t,this.__actions__);var p=[];t:for(;u--&&h<d;){c+=e;for(var g=-1,v=t[c];++g<f;){var m=l[g],y=m.iteratee,x=m.type,_=y(v);if(x==Ct)v=_;else if(!_){if(x==At)continue t;break t}}p[h++]=v}return p}function Ke(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function tn(){this.__data__=sf?sf(null):{},this.size=0}function en(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}function nn(t){var e=this.__data__;if(sf){var n=e[t];return n===it?K:n}return _l.call(e,t)?e[t]:K}function rn(t){var e=this.__data__;return sf?e[t]!==K:_l.call(e,t)}function an(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=sf&&e===K?it:e,this}function on(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function sn(){this.__data__=[],this.size=0}function un(t){var e=this.__data__,n=Ln(e,t);if(n<0)return!1;var r=e.length-1;return n==r?e.pop():Dl.call(e,n,1),--this.size,!0}function cn(t){var e=this.__data__,n=Ln(e,t);return n<0?K:e[n][1]}function ln(t){return Ln(this.__data__,t)>-1}function fn(t,e){var n=this.__data__,r=Ln(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this}function hn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function dn(){this.size=0,this.__data__={hash:new Ke,map:new(nf||on),string:new Ke}}function pn(t){var e=Ta(this,t).delete(t);return this.size-=e?1:0,e}function gn(t){return Ta(this,t).get(t)}function vn(t){return Ta(this,t).has(t)}function mn(t,e){var n=Ta(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this}function yn(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new hn;++e<n;)this.add(t[e])}function xn(t){return this.__data__.set(t,it),this}function _n(t){return this.__data__.has(t)}function bn(t){var e=this.__data__=new on(t);this.size=e.size}function $n(){this.__data__=new on,this.size=0}function wn(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}function Sn(t){return this.__data__.get(t)}function Tn(t){return this.__data__.has(t)}function An(t,e){var n=this.__data__;if(n instanceof on){var r=n.__data__;if(!nf||r.length<et-1)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new hn(r)}return n.set(t,e),this.size=n.size,this}function Cn(t,e){var n=bh(t),r=!n&&_h(t),i=!n&&!r&&wh(t),a=!n&&!r&&!i&&Eh(t),o=n||r||i||a,s=o?E(t.length,dl):[],u=s.length;for(var c in t)!e&&!_l.call(t,c)||o&&("length"==c||i&&("offset"==c||"parent"==c)||a&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||Ia(c,u))||s.push(c);return s}function En(t){var e=t.length;return e?t[ni(0,e-1)]:K}function Mn(t,e){return eo(Fi(t),Gn(e,0,t.length))}function kn(t){return eo(Fi(t))}function Pn(t,e,n){(n===K||Xs(t[e],n))&&(n!==K||e in t)||In(t,e,n)}function On(t,e,n){var r=t[e];_l.call(t,e)&&Xs(r,n)&&(n!==K||e in t)||In(t,e,n)}function Ln(t,e){for(var n=t.length;n--;)if(Xs(t[n][0],e))return n;return-1}function Dn(t,e,n,r){return xf(t,function(t,i,a){e(r,t,n(t),a)}),r}function Vn(t,e){return t&&Gi(e,Uu(e),t)}function Rn(t,e){return t&&Gi(e,Bu(e),t)}function In(t,e,n){"__proto__"==e&&Nl?Nl(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}function Fn(t,e){for(var n=-1,r=e.length,i=ol(r),a=null==t;++n<r;)i[n]=a?K:Gu(t,e[n]);return i}function Gn(t,e,n){return t===t&&(n!==K&&(t=t<=n?t:n),e!==K&&(t=t>=e?t:e)),t}function Hn(t,e,n,r,a,o){var s,u=e&st,c=e&ut,l=e&ct;if(n&&(s=a?n(t,r,a,o):n(t)),s!==K)return s;if(!uu(t))return t;var f=bh(t);if(f){if(s=Oa(t),!u)return Fi(t,s)}else{var h=Pf(t),d=h==Ut||h==Bt;if(wh(t))return Ei(t,u);if(h==Xt||h==It||d&&!a){if(s=c||d?{}:La(t),!u)return c?zi(t,Rn(s,t)):Hi(t,Vn(s,t))}else{if(!Yn[h])return a?t:{};s=Da(t,h,Hn,u)}}o||(o=new bn);var p=o.get(t);if(p)return p;o.set(t,s);var g=l?c?ba:_a:c?Bu:Uu,v=f?K:g(t);return i(v||t,function(r,i){v&&(i=r,r=t[i]),On(s,i,Hn(r,e,n,i,t,o))}),s}function zn(t){var e=Uu(t);return function(n){return Wn(n,t,e)}}function Wn(t,e,n){var r=n.length;if(null==t)return!r;for(t=fl(t);r--;){var i=n[r],a=e[i],o=t[i];if(o===K&&!(i in t)||!a(o))return!1}return!0}function Xn(t,e,n){if("function"!=typeof t)throw new pl(rt);return Df(function(){t.apply(K,n)},e)}function Qn(t,e,n,r){var i=-1,a=u,o=!0,s=t.length,f=[],h=e.length;if(!s)return f;n&&(e=l(e,k(n))),r?(a=c,o=!1):e.length>=et&&(a=O,o=!1,e=new yn(e));t:for(;++i<s;){var d=t[i],p=null==n?d:n(d);if(d=r||0!==d?d:0,o&&p===p){for(var g=h;g--;)if(e[g]===p)continue t;f.push(d)}else a(e,p,r)||f.push(d)}return f}function Zn(t,e){var n=!0;return xf(t,function(t,r,i){return n=!!e(t,r,i)}),n}function tr(t,e,n){for(var r=-1,i=t.length;++r<i;){var a=t[r],o=e(a);if(null!=o&&(s===K?o===o&&!_u(o):n(o,s)))var s=o,u=a}return u}function er(t,e,n,r){var i=t.length;for(n=Au(n),n<0&&(n=-n>i?0:i+n),r=r===K||r>i?i:Au(r),r<0&&(r+=i),r=n>r?0:Cu(r);n<r;)t[n++]=e;return t}function rr(t,e){var n=[];return xf(t,function(t,r,i){e(t,r,i)&&n.push(t)}),n}function ir(t,e,n,r,i){var a=-1,o=t.length;for(n||(n=Ra),i||(i=[]);++a<o;){var s=t[a];e>0&&n(s)?e>1?ir(s,e-1,n,r,i):f(i,s):r||(i[i.length]=s)}return i}function or(t,e){return t&&bf(t,e,Uu)}function sr(t,e){return t&&$f(t,e,Uu)}function pr(t,e){return s(e,function(e){return au(t[e])})}function yr(t,e){e=Ai(e,t);for(var n=0,r=e.length;null!=t&&n<r;)t=t[no(e[n++])];return n&&n==r?t:K}function _r(t,e,n){var r=e(t);return bh(t)?r:f(r,n(t))}function br(t){return null==t?t===K?ne:Wt:Il&&Il in fl(t)?Ea(t):Xa(t)}function $r(t,e){return t>e}function wr(t,e){return null!=t&&_l.call(t,e)}function Sr(t,e){return null!=t&&e in fl(t)}function Tr(t,e,n){return t>=Ql(e,n)&&t<Xl(e,n)}function Ar(t,e,n){for(var r=n?c:u,i=t[0].length,a=t.length,o=a,s=ol(a),f=1/0,h=[];o--;){var d=t[o];o&&e&&(d=l(d,k(e))),f=Ql(d.length,f),s[o]=!n&&(e||i>=120&&d.length>=120)?new yn(o&&d):K}d=t[0];var p=-1,g=s[0];t:for(;++p<i&&h.length<f;){var v=d[p],m=e?e(v):v;if(v=n||0!==v?v:0,!(g?O(g,m):r(h,m,n))){for(o=a;--o;){var y=s[o];if(!(y?O(y,m):r(t[o],m,n)))continue t}g&&g.push(m),h.push(v)}}return h}function Cr(t,e,n,r){return or(t,function(t,i,a){e(r,n(t),i,a)}),r}function Er(t,e,r){e=Ai(e,t),t=Za(t,e);var i=null==t?t:t[no(To(e))];return null==i?K:n(i,t,r)}function Mr(t){return cu(t)&&br(t)==It}function kr(t){return cu(t)&&br(t)==ae}function Pr(t){return cu(t)&&br(t)==Gt}function Or(t,e,n,r,i){return t===e||(null==t||null==e||!cu(t)&&!cu(e)?t!==t&&e!==e:Lr(t,e,n,r,Or,i))}function Lr(t,e,n,r,i,a){var o=bh(t),s=bh(e),u=o?Nt:Pf(t),c=s?Nt:Pf(e);u=u==It?Xt:u,c=c==It?Xt:c;var l=u==Xt,f=c==Xt,h=u==c;if(h&&wh(t)){if(!wh(e))return!1;o=!0,l=!1}if(h&&!l)return a||(a=new bn),o||Eh(t)?va(t,e,n,r,i,a):ma(t,e,u,n,r,i,a);if(!(n&lt)){var d=l&&_l.call(t,"__wrapped__"),p=f&&_l.call(e,"__wrapped__");if(d||p){var g=d?t.value():t,v=p?e.value():e;return a||(a=new bn),i(g,v,n,r,a)}}return!!h&&(a||(a=new bn),ya(t,e,n,r,i,a))}function Dr(t){return cu(t)&&Pf(t)==qt}function Vr(t,e,n,r){var i=n.length,a=i,o=!r;if(null==t)return!a;for(t=fl(t);i--;){var s=n[i];if(o&&s[2]?s[1]!==t[s[0]]:!(s[0]in t))return!1}for(;++i<a;){s=n[i];var u=s[0],c=t[u],l=s[1];if(o&&s[2]){if(c===K&&!(u in t))return!1}else{var f=new bn;if(r)var h=r(c,l,u,t,e,f);if(!(h===K?Or(l,c,lt|ft,r,f):h))return!1}}return!0}function Rr(t){if(!uu(t)||Ha(t))return!1;var e=au(t)?Al:Ue;return e.test(ro(t))}function Ir(t){return cu(t)&&br(t)==Jt}function Nr(t){return cu(t)&&Pf(t)==Kt}function jr(t){return cu(t)&&su(t.length)&&!!qn[br(t)]}function Fr(t){return"function"==typeof t?t:null==t?Dc:"object"==typeof t?bh(t)?qr(t[0],t[1]):Br(t):Hc(t)}function Gr(t){if(!za(t))return Wl(t);var e=[];for(var n in fl(t))_l.call(t,n)&&"constructor"!=n&&e.push(n);return e}function Hr(t){if(!uu(t))return Wa(t);var e=za(t),n=[];for(var r in t)("constructor"!=r||!e&&_l.call(t,r))&&n.push(r);return n}function zr(t,e){return t<e}function Ur(t,e){var n=-1,r=Qs(t)?ol(t.length):[];return xf(t,function(t,i,a){r[++n]=e(t,i,a)}),r}function Br(t){var e=Aa(t);return 1==e.length&&e[0][2]?Ba(e[0][0],e[0][1]):function(n){return n===t||Vr(n,t,e)}}function qr(t,e){return ja(t)&&Ua(e)?Ba(no(t),e):function(n){var r=Gu(n,t);return r===K&&r===e?zu(n,t):Or(e,r,lt|ft)}}function Yr(t,e,n,r,i){t!==e&&bf(e,function(a,o){if(uu(a))i||(i=new bn),Wr(t,e,o,n,Yr,r,i);else{var s=r?r(t[o],a,o+"",t,e,i):K;s===K&&(s=a),Pn(t,o,s)}},Bu)}function Wr(t,e,n,r,i,a,o){var s=t[n],u=e[n],c=o.get(u);if(c)return void Pn(t,n,c);var l=a?a(s,u,n+"",t,e,o):K,f=l===K;if(f){var h=bh(u),d=!h&&wh(u),p=!h&&!d&&Eh(u);l=u,h||d||p?bh(s)?l=s:Zs(s)?l=Fi(s):d?(f=!1,l=Ei(u,!0)):p?(f=!1,l=Vi(u,!0)):l=[]:mu(u)||_h(u)?(l=s,_h(s)?l=Mu(s):(!uu(s)||r&&au(s))&&(l=La(u))):f=!1}f&&(o.set(u,l),i(l,u,r,a,o),o.delete(u)),Pn(t,n,l)}function Xr(t,e){var n=t.length;if(n)return e+=e<0?n:0,Ia(e,n)?t[e]:K}function Qr(t,e,n){var r=-1;e=l(e.length?e:[Dc],k(Sa()));var i=Ur(t,function(t,n,i){var a=l(e,function(e){return e(t)});return{criteria:a,index:++r,value:t}});return A(i,function(t,e){return Ii(t,e,n)})}function Zr(t,e){return Jr(t,e,function(e,n){return zu(t,n)})}function Jr(t,e,n){for(var r=-1,i=e.length,a={};++r<i;){var o=e[r],s=yr(t,o);n(s,o)&&ui(a,Ai(o,t),s)}return a}function Kr(t){return function(e){return yr(e,t)}}function ti(t,e,n,r){var i=r?_:x,a=-1,o=e.length,s=t;for(t===e&&(e=Fi(e)),n&&(s=l(t,k(n)));++a<o;)for(var u=0,c=e[a],f=n?n(c):c;(u=i(s,f,u,r))>-1;)s!==t&&Dl.call(s,u,1),Dl.call(t,u,1);return t}function ei(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==a){var a=i;Ia(i)?Dl.call(t,i,1):yi(t,i)}}return t}function ni(t,e){return t+zl(Kl()*(e-t+1))}function ri(t,e,n,r){for(var i=-1,a=Xl(Hl((e-t)/(n||1)),0),o=ol(a);a--;)o[r?a:++i]=t,t+=n;return o}function ii(t,e){var n="";if(!t||e<1||e>kt)return n;do e%2&&(n+=t),e=zl(e/2),e&&(t+=t);while(e);return n}function ai(t,e){return Vf(Qa(t,e,Dc),t+"")}function oi(t){return En(rc(t))}function si(t,e){var n=rc(t);return eo(n,Gn(e,0,n.length))}function ui(t,e,n,r){if(!uu(t))return t;e=Ai(e,t);for(var i=-1,a=e.length,o=a-1,s=t;null!=s&&++i<a;){var u=no(e[i]),c=n;if(i!=o){var l=s[u];c=r?r(l,u,s):K,c===K&&(c=uu(l)?l:Ia(e[i+1])?[]:{})}On(s,u,c),s=s[u]}return t}function ci(t){return eo(rc(t))}function li(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var a=ol(i);++r<i;)a[r]=t[r+e];return a}function fi(t,e){
var n;return xf(t,function(t,r,i){return n=e(t,r,i),!n}),!!n}function hi(t,e,n){var r=0,i=null==t?r:t.length;if("number"==typeof e&&e===e&&i<=Vt){for(;r<i;){var a=r+i>>>1,o=t[a];null!==o&&!_u(o)&&(n?o<=e:o<e)?r=a+1:i=a}return i}return di(t,e,Dc,n)}function di(t,e,n,r){e=n(e);for(var i=0,a=null==t?0:t.length,o=e!==e,s=null===e,u=_u(e),c=e===K;i<a;){var l=zl((i+a)/2),f=n(t[l]),h=f!==K,d=null===f,p=f===f,g=_u(f);if(o)var v=r||p;else v=c?p&&(r||h):s?p&&h&&(r||!d):u?p&&h&&!d&&(r||!g):!d&&!g&&(r?f<=e:f<e);v?i=l+1:a=l}return Ql(a,Dt)}function pi(t,e){for(var n=-1,r=t.length,i=0,a=[];++n<r;){var o=t[n],s=e?e(o):o;if(!n||!Xs(s,u)){var u=s;a[i++]=0===o?0:o}}return a}function gi(t){return"number"==typeof t?t:_u(t)?Ot:+t}function vi(t){if("string"==typeof t)return t;if(bh(t))return l(t,vi)+"";if(_u(t))return mf?mf.call(t):"";var e=t+"";return"0"==e&&1/t==-Mt?"-0":e}function mi(t,e,n){var r=-1,i=u,a=t.length,o=!0,s=[],l=s;if(n)o=!1,i=c;else if(a>=et){var f=e?null:Cf(t);if(f)return U(f);o=!1,i=O,l=new yn}else l=e?[]:s;t:for(;++r<a;){var h=t[r],d=e?e(h):h;if(h=n||0!==h?h:0,o&&d===d){for(var p=l.length;p--;)if(l[p]===d)continue t;e&&l.push(d),s.push(h)}else i(l,d,n)||(l!==s&&l.push(d),s.push(h))}return s}function yi(t,e){return e=Ai(e,t),t=Za(t,e),null==t||delete t[no(To(e))]}function xi(t,e,n,r){return ui(t,e,n(yr(t,e)),r)}function _i(t,e,n,r){for(var i=t.length,a=r?i:-1;(r?a--:++a<i)&&e(t[a],a,t););return n?li(t,r?0:a,r?a+1:i):li(t,r?a+1:0,r?i:a)}function bi(t,e){var n=t;return n instanceof Ne&&(n=n.value()),h(e,function(t,e){return e.func.apply(e.thisArg,f([t],e.args))},n)}function $i(t,e,n){var r=t.length;if(r<2)return r?mi(t[0]):[];for(var i=-1,a=ol(r);++i<r;)for(var o=t[i],s=-1;++s<r;)s!=i&&(a[i]=Qn(a[i]||o,t[s],e,n));return mi(ir(a,1),e,n)}function wi(t,e,n){for(var r=-1,i=t.length,a=e.length,o={};++r<i;){var s=r<a?e[r]:K;n(o,t[r],s)}return o}function Si(t){return Zs(t)?t:[]}function Ti(t){return"function"==typeof t?t:Dc}function Ai(t,e){return bh(t)?t:ja(t,e)?[t]:Rf(Pu(t))}function Ci(t,e,n){var r=t.length;return n=n===K?r:n,!e&&n>=r?t:li(t,e,n)}function Ei(t,e){if(e)return t.slice();var n=t.length,r=kl?kl(n):new t.constructor(n);return t.copy(r),r}function Mi(t){var e=new t.constructor(t.byteLength);return new Ml(e).set(new Ml(t)),e}function ki(t,e){var n=e?Mi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}function Pi(e,n,r){var i=n?r(G(e),st):G(e);return h(i,t,new e.constructor)}function Oi(t){var e=new t.constructor(t.source,Ge.exec(t));return e.lastIndex=t.lastIndex,e}function Li(t,n,r){var i=n?r(U(t),st):U(t);return h(i,e,new t.constructor)}function Di(t){return vf?fl(vf.call(t)):{}}function Vi(t,e){var n=e?Mi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function Ri(t,e){if(t!==e){var n=t!==K,r=null===t,i=t===t,a=_u(t),o=e!==K,s=null===e,u=e===e,c=_u(e);if(!s&&!c&&!a&&t>e||a&&o&&u&&!s&&!c||r&&o&&u||!n&&u||!i)return 1;if(!r&&!a&&!c&&t<e||c&&n&&i&&!r&&!a||s&&n&&i||!o&&i||!u)return-1}return 0}function Ii(t,e,n){for(var r=-1,i=t.criteria,a=e.criteria,o=i.length,s=n.length;++r<o;){var u=Ri(i[r],a[r]);if(u){if(r>=s)return u;var c=n[r];return u*("desc"==c?-1:1)}}return t.index-e.index}function Ni(t,e,n,r){for(var i=-1,a=t.length,o=n.length,s=-1,u=e.length,c=Xl(a-o,0),l=ol(u+c),f=!r;++s<u;)l[s]=e[s];for(;++i<o;)(f||i<a)&&(l[n[i]]=t[i]);for(;c--;)l[s++]=t[i++];return l}function ji(t,e,n,r){for(var i=-1,a=t.length,o=-1,s=n.length,u=-1,c=e.length,l=Xl(a-s,0),f=ol(l+c),h=!r;++i<l;)f[i]=t[i];for(var d=i;++u<c;)f[d+u]=e[u];for(;++o<s;)(h||i<a)&&(f[d+n[o]]=t[i++]);return f}function Fi(t,e){var n=-1,r=t.length;for(e||(e=ol(r));++n<r;)e[n]=t[n];return e}function Gi(t,e,n,r){var i=!n;n||(n={});for(var a=-1,o=e.length;++a<o;){var s=e[a],u=r?r(n[s],t[s],s,n,t):K;u===K&&(u=t[s]),i?In(n,s,u):On(n,s,u)}return n}function Hi(t,e){return Gi(t,Mf(t),e)}function zi(t,e){return Gi(t,kf(t),e)}function Ui(t,e){return function(n,i){var a=bh(n)?r:Dn,o=e?e():{};return a(n,t,Sa(i,2),o)}}function Bi(t){return ai(function(e,n){var r=-1,i=n.length,a=i>1?n[i-1]:K,o=i>2?n[2]:K;for(a=t.length>3&&"function"==typeof a?(i--,a):K,o&&Na(n[0],n[1],o)&&(a=i<3?K:a,i=1),e=fl(e);++r<i;){var s=n[r];s&&t(e,s,r,a)}return e})}function qi(t,e){return function(n,r){if(null==n)return n;if(!Qs(n))return t(n,r);for(var i=n.length,a=e?i:-1,o=fl(n);(e?a--:++a<i)&&r(o[a],a,o)!==!1;);return n}}function Yi(t){return function(e,n,r){for(var i=-1,a=fl(e),o=r(e),s=o.length;s--;){var u=o[t?s:++i];if(n(a[u],u,a)===!1)break}return e}}function Wi(t,e,n){function r(){var e=this&&this!==nr&&this instanceof r?a:t;return e.apply(i?n:this,arguments)}var i=e&ht,a=Zi(t);return r}function Xi(t){return function(e){e=Pu(e);var n=N(e)?X(e):K,r=n?n[0]:e.charAt(0),i=n?Ci(n,1).join(""):e.slice(1);return r[t]()+i}}function Qi(t){return function(e){return h(Mc(cc(e).replace(Nn,"")),t,"")}}function Zi(t){return function(){var e=arguments;switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3]);case 5:return new t(e[0],e[1],e[2],e[3],e[4]);case 6:return new t(e[0],e[1],e[2],e[3],e[4],e[5]);case 7:return new t(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}var n=yf(t.prototype),r=t.apply(n,e);return uu(r)?r:n}}function Ji(t,e,r){function i(){for(var o=arguments.length,s=ol(o),u=o,c=wa(i);u--;)s[u]=arguments[u];var l=o<3&&s[0]!==c&&s[o-1]!==c?[]:z(s,c);if(o-=l.length,o<r)return ca(t,e,ea,i.placeholder,K,s,l,K,K,r-o);var f=this&&this!==nr&&this instanceof i?a:t;return n(f,this,s)}var a=Zi(t);return i}function Ki(t){return function(e,n,r){var i=fl(e);if(!Qs(e)){var a=Sa(n,3);e=Uu(e),n=function(t){return a(i[t],t,i)}}var o=t(e,n,r);return o>-1?i[a?e[o]:o]:K}}function ta(t){return xa(function(e){var n=e.length,r=n,i=Z.prototype.thru;for(t&&e.reverse();r--;){var a=e[r];if("function"!=typeof a)throw new pl(rt);if(i&&!o&&"wrapper"==$a(a))var o=new Z([],(!0))}for(r=o?r:n;++r<n;){a=e[r];var s=$a(a),u="wrapper"==s?Ef(a):K;o=u&&Ga(u[0])&&u[1]==(xt|gt|mt|_t)&&!u[4].length&&1==u[9]?o[$a(u[0])].apply(o,u[3]):1==a.length&&Ga(a)?o[s]():o.thru(a)}return function(){var t=arguments,r=t[0];if(o&&1==t.length&&bh(r))return o.plant(r).value();for(var i=0,a=n?e[i].apply(this,t):r;++i<n;)a=e[i].call(this,a);return a}})}function ea(t,e,n,r,i,a,o,s,u,c){function l(){for(var m=arguments.length,y=ol(m),x=m;x--;)y[x]=arguments[x];if(p)var _=wa(l),b=V(y,_);if(r&&(y=Ni(y,r,i,p)),a&&(y=ji(y,a,o,p)),m-=b,p&&m<c){var $=z(y,_);return ca(t,e,ea,l.placeholder,n,y,$,s,u,c-m)}var w=h?n:this,S=d?w[t]:t;return m=y.length,s?y=Ja(y,s):g&&m>1&&y.reverse(),f&&u<m&&(y.length=u),this&&this!==nr&&this instanceof l&&(S=v||Zi(S)),S.apply(w,y)}var f=e&xt,h=e&ht,d=e&dt,p=e&(gt|vt),g=e&bt,v=d?K:Zi(t);return l}function na(t,e){return function(n,r){return Cr(n,t,e(r),{})}}function ra(t,e){return function(n,r){var i;if(n===K&&r===K)return e;if(n!==K&&(i=n),r!==K){if(i===K)return r;"string"==typeof n||"string"==typeof r?(n=vi(n),r=vi(r)):(n=gi(n),r=gi(r)),i=t(n,r)}return i}}function ia(t){return xa(function(e){return e=l(e,k(Sa())),ai(function(r){var i=this;return t(e,function(t){return n(t,i,r)})})})}function aa(t,e){e=e===K?" ":vi(e);var n=e.length;if(n<2)return n?ii(e,t):e;var r=ii(e,Hl(t/W(e)));return N(e)?Ci(X(r),0,t).join(""):r.slice(0,t)}function oa(t,e,r,i){function a(){for(var e=-1,u=arguments.length,c=-1,l=i.length,f=ol(l+u),h=this&&this!==nr&&this instanceof a?s:t;++c<l;)f[c]=i[c];for(;u--;)f[c++]=arguments[++e];return n(h,o?r:this,f)}var o=e&ht,s=Zi(t);return a}function sa(t){return function(e,n,r){return r&&"number"!=typeof r&&Na(e,n,r)&&(n=r=K),e=Tu(e),n===K?(n=e,e=0):n=Tu(n),r=r===K?e<n?1:-1:Tu(r),ri(e,n,r,t)}}function ua(t){return function(e,n){return"string"==typeof e&&"string"==typeof n||(e=Eu(e),n=Eu(n)),t(e,n)}}function ca(t,e,n,r,i,a,o,s,u,c){var l=e&gt,f=l?o:K,h=l?K:o,d=l?a:K,p=l?K:a;e|=l?mt:yt,e&=~(l?yt:mt),e&pt||(e&=~(ht|dt));var g=[t,e,i,d,f,p,h,s,u,c],v=n.apply(K,g);return Ga(t)&&Lf(v,g),v.placeholder=r,Ka(v,t,e)}function la(t){var e=ll[t];return function(t,n){if(t=Eu(t),n=null==n?0:Ql(Au(n),292)){var r=(Pu(t)+"e").split("e"),i=e(r[0]+"e"+(+r[1]+n));return r=(Pu(i)+"e").split("e"),+(r[0]+"e"+(+r[1]-n))}return e(t)}}function fa(t){return function(e){var n=Pf(e);return n==qt?G(e):n==Kt?B(e):M(e,t(e))}}function ha(t,e,n,r,i,a,o,s){var u=e&dt;if(!u&&"function"!=typeof t)throw new pl(rt);var c=r?r.length:0;if(c||(e&=~(mt|yt),r=i=K),o=o===K?o:Xl(Au(o),0),s=s===K?s:Au(s),c-=i?i.length:0,e&yt){var l=r,f=i;r=i=K}var h=u?K:Ef(t),d=[t,e,n,r,i,l,f,a,o,s];if(h&&Ya(d,h),t=d[0],e=d[1],n=d[2],r=d[3],i=d[4],s=d[9]=d[9]===K?u?0:t.length:Xl(d[9]-c,0),!s&&e&(gt|vt)&&(e&=~(gt|vt)),e&&e!=ht)p=e==gt||e==vt?Ji(t,e,s):e!=mt&&e!=(ht|mt)||i.length?ea.apply(K,d):oa(t,e,n,r);else var p=Wi(t,e,n);var g=h?wf:Lf;return Ka(g(p,d),t,e)}function da(t,e,n,r){return t===K||Xs(t,ml[n])&&!_l.call(r,n)?e:t}function pa(t,e,n,r,i,a){return uu(t)&&uu(e)&&(a.set(e,t),Yr(t,e,K,pa,a),a.delete(e)),t}function ga(t){return mu(t)?K:t}function va(t,e,n,r,i,a){var o=n&lt,s=t.length,u=e.length;if(s!=u&&!(o&&u>s))return!1;var c=a.get(t);if(c&&a.get(e))return c==e;var l=-1,f=!0,h=n&ft?new yn:K;for(a.set(t,e),a.set(e,t);++l<s;){var d=t[l],g=e[l];if(r)var v=o?r(g,d,l,e,t,a):r(d,g,l,t,e,a);if(v!==K){if(v)continue;f=!1;break}if(h){if(!p(e,function(t,e){if(!O(h,e)&&(d===t||i(d,t,n,r,a)))return h.push(e)})){f=!1;break}}else if(d!==g&&!i(d,g,n,r,a)){f=!1;break}}return a.delete(t),a.delete(e),f}function ma(t,e,n,r,i,a,o){switch(n){case oe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ae:return!(t.byteLength!=e.byteLength||!a(new Ml(t),new Ml(e)));case Ft:case Gt:case Yt:return Xs(+t,+e);case zt:return t.name==e.name&&t.message==e.message;case Jt:case te:return t==e+"";case qt:var s=G;case Kt:var u=r&lt;if(s||(s=U),t.size!=e.size&&!u)return!1;var c=o.get(t);if(c)return c==e;r|=ft,o.set(t,e);var l=va(s(t),s(e),r,i,a,o);return o.delete(t),l;case ee:if(vf)return vf.call(t)==vf.call(e)}return!1}function ya(t,e,n,r,i,a){var o=n&lt,s=_a(t),u=s.length,c=_a(e),l=c.length;if(u!=l&&!o)return!1;for(var f=u;f--;){var h=s[f];if(!(o?h in e:_l.call(e,h)))return!1}var d=a.get(t);if(d&&a.get(e))return d==e;var p=!0;a.set(t,e),a.set(e,t);for(var g=o;++f<u;){h=s[f];var v=t[h],m=e[h];if(r)var y=o?r(m,v,h,e,t,a):r(v,m,h,t,e,a);if(!(y===K?v===m||i(v,m,n,r,a):y)){p=!1;break}g||(g="constructor"==h)}if(p&&!g){var x=t.constructor,_=e.constructor;x!=_&&"constructor"in t&&"constructor"in e&&!("function"==typeof x&&x instanceof x&&"function"==typeof _&&_ instanceof _)&&(p=!1)}return a.delete(t),a.delete(e),p}function xa(t){return Vf(Qa(t,K,mo),t+"")}function _a(t){return _r(t,Uu,Mf)}function ba(t){return _r(t,Bu,kf)}function $a(t){for(var e=t.name+"",n=cf[e],r=_l.call(cf,e)?n.length:0;r--;){var i=n[r],a=i.func;if(null==a||a==t)return i.name}return e}function wa(t){var e=_l.call(q,"placeholder")?q:t;return e.placeholder}function Sa(){var t=q.iteratee||Vc;return t=t===Vc?Fr:t,arguments.length?t(arguments[0],arguments[1]):t}function Ta(t,e){var n=t.__data__;return Fa(e)?n["string"==typeof e?"string":"hash"]:n.map}function Aa(t){for(var e=Uu(t),n=e.length;n--;){var r=e[n],i=t[r];e[n]=[r,i,Ua(i)]}return e}function Ca(t,e){var n=I(t,e);return Rr(n)?n:K}function Ea(t){var e=_l.call(t,Il),n=t[Il];try{t[Il]=K;var r=!0}catch(t){}var i=wl.call(t);return r&&(e?t[Il]=n:delete t[Il]),i}function Ma(t,e,n){for(var r=-1,i=n.length;++r<i;){var a=n[r],o=a.size;switch(a.type){case"drop":t+=o;break;case"dropRight":e-=o;break;case"take":e=Ql(e,t+o);break;case"takeRight":t=Xl(t,e-o)}}return{start:t,end:e}}function ka(t){var e=t.match(Re);return e?e[1].split(Ie):[]}function Pa(t,e,n){e=Ai(e,t);for(var r=-1,i=e.length,a=!1;++r<i;){var o=no(e[r]);if(!(a=null!=t&&n(t,o)))break;t=t[o]}return a||++r!=i?a:(i=null==t?0:t.length,!!i&&su(i)&&Ia(o,i)&&(bh(t)||_h(t)))}function Oa(t){var e=t.length,n=t.constructor(e);return e&&"string"==typeof t[0]&&_l.call(t,"index")&&(n.index=t.index,n.input=t.input),n}function La(t){return"function"!=typeof t.constructor||za(t)?{}:yf(Pl(t))}function Da(t,e,n,r){var i=t.constructor;switch(e){case ae:return Mi(t);case Ft:case Gt:return new i((+t));case oe:return ki(t,r);case se:case ue:case ce:case le:case fe:case he:case de:case pe:case ge:return Vi(t,r);case qt:return Pi(t,r,n);case Yt:case te:return new i(t);case Jt:return Oi(t);case Kt:return Li(t,r,n);case ee:return Di(t)}}function Va(t,e){var n=e.length;if(!n)return t;var r=n-1;return e[r]=(n>1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(Ve,"{\n/* [wrapped with "+e+"] */\n")}function Ra(t){return bh(t)||_h(t)||!!(Vl&&t&&t[Vl])}function Ia(t,e){return e=null==e?kt:e,!!e&&("number"==typeof t||qe.test(t))&&t>-1&&t%1==0&&t<e}function Na(t,e,n){if(!uu(n))return!1;var r=typeof e;return!!("number"==r?Qs(n)&&Ia(e,n.length):"string"==r&&e in n)&&Xs(n[e],t)}function ja(t,e){if(bh(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!_u(t))||(Ce.test(t)||!Ae.test(t)||null!=e&&t in fl(e))}function Fa(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}function Ga(t){var e=$a(t),n=q[e];if("function"!=typeof n||!(e in Ne.prototype))return!1;if(t===n)return!0;var r=Ef(n);return!!r&&t===r[0]}function Ha(t){return!!$l&&$l in t}function za(t){var e=t&&t.constructor,n="function"==typeof e&&e.prototype||ml;return t===n}function Ua(t){return t===t&&!uu(t)}function Ba(t,e){return function(n){return null!=n&&(n[t]===e&&(e!==K||t in fl(n)))}}function qa(t){var e=Vs(t,function(t){return n.size===at&&n.clear(),t}),n=e.cache;return e}function Ya(t,e){var n=t[1],r=e[1],i=n|r,a=i<(ht|dt|xt),o=r==xt&&n==gt||r==xt&&n==_t&&t[7].length<=e[8]||r==(xt|_t)&&e[7].length<=e[8]&&n==gt;if(!a&&!o)return t;r&ht&&(t[2]=e[2],i|=n&ht?0:pt);var s=e[3];if(s){var u=t[3];t[3]=u?Ni(u,s,e[4]):s,t[4]=u?z(t[3],ot):e[4]}return s=e[5],s&&(u=t[5],t[5]=u?ji(u,s,e[6]):s,t[6]=u?z(t[5],ot):e[6]),s=e[7],s&&(t[7]=s),r&xt&&(t[8]=null==t[8]?e[8]:Ql(t[8],e[8])),null==t[9]&&(t[9]=e[9]),t[0]=e[0],t[1]=i,t}function Wa(t){var e=[];if(null!=t)for(var n in fl(t))e.push(n);return e}function Xa(t){return wl.call(t)}function Qa(t,e,r){return e=Xl(e===K?t.length-1:e,0),function(){for(var i=arguments,a=-1,o=Xl(i.length-e,0),s=ol(o);++a<o;)s[a]=i[e+a];a=-1;for(var u=ol(e+1);++a<e;)u[a]=i[a];return u[e]=r(s),n(t,this,u)}}function Za(t,e){return e.length<2?t:yr(t,li(e,0,-1))}function Ja(t,e){for(var n=t.length,r=Ql(e.length,n),i=Fi(t);r--;){var a=e[r];t[r]=Ia(a,n)?i[a]:K}return t}function Ka(t,e,n){var r=e+"";return Vf(t,Va(r,io(ka(r),n)))}function to(t){var e=0,n=0;return function(){var r=Zl(),i=Tt-(r-n);if(n=r,i>0){if(++e>=St)return arguments[0]}else e=0;return t.apply(K,arguments)}}function eo(t,e){var n=-1,r=t.length,i=r-1;for(e=e===K?r:e;++n<e;){var a=ni(n,i),o=t[a];t[a]=t[n],t[n]=o}return t.length=e,t}function no(t){if("string"==typeof t||_u(t))return t;var e=t+"";return"0"==e&&1/t==-Mt?"-0":e}function ro(t){if(null!=t){try{return xl.call(t)}catch(t){}try{return t+""}catch(t){}}return""}function io(t,e){return i(Rt,function(n){var r="_."+n[0];e&n[1]&&!u(t,r)&&t.push(r)}),t.sort()}function ao(t){if(t instanceof Ne)return t.clone();var e=new Z(t.__wrapped__,t.__chain__);return e.__actions__=Fi(t.__actions__),e.__index__=t.__index__,e.__values__=t.__values__,e}function oo(t,e,n){e=(n?Na(t,e,n):e===K)?1:Xl(Au(e),0);var r=null==t?0:t.length;if(!r||e<1)return[];for(var i=0,a=0,o=ol(Hl(r/e));i<r;)o[a++]=li(t,i,i+=e);return o}function so(t){for(var e=-1,n=null==t?0:t.length,r=0,i=[];++e<n;){var a=t[e];a&&(i[r++]=a)}return i}function uo(){var t=arguments.length;if(!t)return[];for(var e=ol(t-1),n=arguments[0],r=t;r--;)e[r-1]=arguments[r];return f(bh(n)?Fi(n):[n],ir(e,1))}function co(t,e,n){var r=null==t?0:t.length;return r?(e=n||e===K?1:Au(e),li(t,e<0?0:e,r)):[]}function lo(t,e,n){var r=null==t?0:t.length;return r?(e=n||e===K?1:Au(e),e=r-e,li(t,0,e<0?0:e)):[]}function fo(t,e){return t&&t.length?_i(t,Sa(e,3),!0,!0):[]}function ho(t,e){return t&&t.length?_i(t,Sa(e,3),!0):[]}function po(t,e,n,r){var i=null==t?0:t.length;return i?(n&&"number"!=typeof n&&Na(t,e,n)&&(n=0,r=i),er(t,e,n,r)):[]}function go(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:Au(n);return i<0&&(i=Xl(r+i,0)),y(t,Sa(e,3),i)}function vo(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=r-1;return n!==K&&(i=Au(n),i=n<0?Xl(r+i,0):Ql(i,r-1)),y(t,Sa(e,3),i,!0)}function mo(t){var e=null==t?0:t.length;return e?ir(t,1):[]}function yo(t){var e=null==t?0:t.length;return e?ir(t,Mt):[]}function xo(t,e){var n=null==t?0:t.length;return n?(e=e===K?1:Au(e),ir(t,e)):[]}function _o(t){for(var e=-1,n=null==t?0:t.length,r={};++e<n;){var i=t[e];r[i[0]]=i[1]}return r}function bo(t){return t&&t.length?t[0]:K}function $o(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:Au(n);return i<0&&(i=Xl(r+i,0)),x(t,e,i)}function wo(t){var e=null==t?0:t.length;return e?li(t,0,-1):[]}function So(t,e){return null==t?"":Yl.call(t,e)}function To(t){var e=null==t?0:t.length;return e?t[e-1]:K}function Ao(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=r;return n!==K&&(i=Au(n),i=i<0?Xl(r+i,0):Ql(i,r-1)),e===e?Y(t,e,i):y(t,b,i,!0)}function Co(t,e){return t&&t.length?Xr(t,Au(e)):K}function Eo(t,e){return t&&t.length&&e&&e.length?ti(t,e):t}function Mo(t,e,n){return t&&t.length&&e&&e.length?ti(t,e,Sa(n,2)):t}function ko(t,e,n){return t&&t.length&&e&&e.length?ti(t,e,K,n):t}function Po(t,e){var n=[];if(!t||!t.length)return n;var r=-1,i=[],a=t.length;for(e=Sa(e,3);++r<a;){var o=t[r];e(o,r,t)&&(n.push(o),i.push(r))}return ei(t,i),n}function Oo(t){return null==t?t:tf.call(t)}function Lo(t,e,n){var r=null==t?0:t.length;return r?(n&&"number"!=typeof n&&Na(t,e,n)?(e=0,n=r):(e=null==e?0:Au(e),n=n===K?r:Au(n)),li(t,e,n)):[]}function Do(t,e){return hi(t,e)}function Vo(t,e,n){return di(t,e,Sa(n,2))}function Ro(t,e){var n=null==t?0:t.length;if(n){var r=hi(t,e);if(r<n&&Xs(t[r],e))return r}return-1}function Io(t,e){return hi(t,e,!0)}function No(t,e,n){return di(t,e,Sa(n,2),!0)}function jo(t,e){var n=null==t?0:t.length;if(n){var r=hi(t,e,!0)-1;if(Xs(t[r],e))return r}return-1}function Fo(t){return t&&t.length?pi(t):[]}function Go(t,e){return t&&t.length?pi(t,Sa(e,2)):[]}function Ho(t){var e=null==t?0:t.length;return e?li(t,1,e):[]}function zo(t,e,n){return t&&t.length?(e=n||e===K?1:Au(e),li(t,0,e<0?0:e)):[]}function Uo(t,e,n){var r=null==t?0:t.length;return r?(e=n||e===K?1:Au(e),e=r-e,li(t,e<0?0:e,r)):[]}function Bo(t,e){return t&&t.length?_i(t,Sa(e,3),!1,!0):[]}function qo(t,e){return t&&t.length?_i(t,Sa(e,3)):[]}function Yo(t){return t&&t.length?mi(t):[]}function Wo(t,e){return t&&t.length?mi(t,Sa(e,2)):[]}function Xo(t,e){return e="function"==typeof e?e:K,t&&t.length?mi(t,K,e):[]}function Qo(t){if(!t||!t.length)return[];var e=0;return t=s(t,function(t){if(Zs(t))return e=Xl(t.length,e),!0}),E(e,function(e){return l(t,w(e))})}function Zo(t,e){if(!t||!t.length)return[];var r=Qo(t);return null==e?r:l(r,function(t){return n(e,K,t)})}function Jo(t,e){return wi(t||[],e||[],On)}function Ko(t,e){return wi(t||[],e||[],ui)}function ts(t){var e=q(t);return e.__chain__=!0,e}function es(t,e){return e(t),t}function ns(t,e){return e(t)}function rs(){return ts(this)}function is(){return new Z(this.value(),this.__chain__)}function as(){this.__values__===K&&(this.__values__=Su(this.value()));var t=this.__index__>=this.__values__.length,e=t?K:this.__values__[this.__index__++];return{done:t,value:e}}function os(){return this}function ss(t){for(var e,n=this;n instanceof Q;){var r=ao(n);r.__index__=0,r.__values__=K,e?i.__wrapped__=r:e=r;var i=r;n=n.__wrapped__}return i.__wrapped__=t,e}function us(){var t=this.__wrapped__;if(t instanceof Ne){var e=t;return this.__actions__.length&&(e=new Ne(this)),e=e.reverse(),e.__actions__.push({func:ns,args:[Oo],thisArg:K}),new Z(e,this.__chain__)}return this.thru(Oo)}function cs(){return bi(this.__wrapped__,this.__actions__)}function ls(t,e,n){var r=bh(t)?o:Zn;return n&&Na(t,e,n)&&(e=K),r(t,Sa(e,3))}function fs(t,e){var n=bh(t)?s:rr;return n(t,Sa(e,3))}function hs(t,e){return ir(ys(t,e),1)}function ds(t,e){return ir(ys(t,e),Mt)}function ps(t,e,n){return n=n===K?1:Au(n),ir(ys(t,e),n)}function gs(t,e){var n=bh(t)?i:xf;return n(t,Sa(e,3))}function vs(t,e){var n=bh(t)?a:_f;return n(t,Sa(e,3))}function ms(t,e,n,r){t=Qs(t)?t:rc(t),n=n&&!r?Au(n):0;var i=t.length;return n<0&&(n=Xl(i+n,0)),xu(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&x(t,e,n)>-1}function ys(t,e){var n=bh(t)?l:Ur;return n(t,Sa(e,3))}function xs(t,e,n,r){return null==t?[]:(bh(e)||(e=null==e?[]:[e]),n=r?K:n,bh(n)||(n=null==n?[]:[n]),Qr(t,e,n))}function _s(t,e,n){var r=bh(t)?h:T,i=arguments.length<3;return r(t,Sa(e,4),n,i,xf)}function bs(t,e,n){var r=bh(t)?d:T,i=arguments.length<3;return r(t,Sa(e,4),n,i,_f)}function $s(t,e){var n=bh(t)?s:rr;return n(t,Rs(Sa(e,3)))}function ws(t){var e=bh(t)?En:oi;return e(t)}function Ss(t,e,n){e=(n?Na(t,e,n):e===K)?1:Au(e);var r=bh(t)?Mn:si;return r(t,e)}function Ts(t){var e=bh(t)?kn:ci;return e(t)}function As(t){if(null==t)return 0;if(Qs(t))return xu(t)?W(t):t.length;var e=Pf(t);return e==qt||e==Kt?t.size:Gr(t).length}function Cs(t,e,n){var r=bh(t)?p:fi;return n&&Na(t,e,n)&&(e=K),r(t,Sa(e,3))}function Es(t,e){if("function"!=typeof e)throw new pl(rt);return t=Au(t),function(){if(--t<1)return e.apply(this,arguments)}}function Ms(t,e,n){return e=n?K:e,e=t&&null==e?t.length:e,ha(t,xt,K,K,K,K,e)}function ks(t,e){var n;if("function"!=typeof e)throw new pl(rt);return t=Au(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=K),n}}function Ps(t,e,n){e=n?K:e;var r=ha(t,gt,K,K,K,K,K,e);return r.placeholder=Ps.placeholder,r}function Os(t,e,n){e=n?K:e;var r=ha(t,vt,K,K,K,K,K,e);return r.placeholder=Os.placeholder,r}function Ls(t,e,n){function r(e){var n=h,r=d;return h=d=K,y=e,g=t.apply(r,n)}function i(t){return y=t,v=Df(s,e),x?r(t):g}function a(t){var n=t-m,r=t-y,i=e-n;return _?Ql(i,p-r):i}function o(t){var n=t-m,r=t-y;return m===K||n>=e||n<0||_&&r>=p}function s(){var t=ch();return o(t)?u(t):void(v=Df(s,a(t)))}function u(t){return v=K,b&&h?r(t):(h=d=K,g)}function c(){v!==K&&Af(v),y=0,h=m=d=v=K}function l(){return v===K?g:u(ch())}function f(){var t=ch(),n=o(t);if(h=arguments,d=this,m=t,n){if(v===K)return i(m);if(_)return v=Df(s,e),r(m)}return v===K&&(v=Df(s,e)),g}var h,d,p,g,v,m,y=0,x=!1,_=!1,b=!0;if("function"!=typeof t)throw new pl(rt);return e=Eu(e)||0,uu(n)&&(x=!!n.leading,_="maxWait"in n,p=_?Xl(Eu(n.maxWait)||0,e):p,b="trailing"in n?!!n.trailing:b),f.cancel=c,f.flush=l,f}function Ds(t){return ha(t,bt)}function Vs(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new pl(rt);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],a=n.cache;if(a.has(i))return a.get(i);var o=t.apply(this,r);return n.cache=a.set(i,o)||a,o};return n.cache=new(Vs.Cache||hn),n}function Rs(t){if("function"!=typeof t)throw new pl(rt);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}function Is(t){return ks(2,t)}function Ns(t,e){if("function"!=typeof t)throw new pl(rt);return e=e===K?e:Au(e),ai(t,e)}function js(t,e){if("function"!=typeof t)throw new pl(rt);return e=null==e?0:Xl(Au(e),0),ai(function(r){var i=r[e],a=Ci(r,0,e);return i&&f(a,i),n(t,this,a)})}function Fs(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new pl(rt);return uu(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),Ls(t,e,{leading:r,maxWait:e,trailing:i})}function Gs(t){return Ms(t,1)}function Hs(t,e){return gh(Ti(e),t)}function zs(){if(!arguments.length)return[];var t=arguments[0];return bh(t)?t:[t]}function Us(t){return Hn(t,ct)}function Bs(t,e){return e="function"==typeof e?e:K,Hn(t,ct,e)}function qs(t){return Hn(t,st|ct)}function Ys(t,e){return e="function"==typeof e?e:K,Hn(t,st|ct,e)}function Ws(t,e){return null==e||Wn(t,e,Uu(e))}function Xs(t,e){return t===e||t!==t&&e!==e}function Qs(t){return null!=t&&su(t.length)&&!au(t)}function Zs(t){return cu(t)&&Qs(t)}function Js(t){return t===!0||t===!1||cu(t)&&br(t)==Ft}function Ks(t){return cu(t)&&1===t.nodeType&&!mu(t)}function tu(t){if(null==t)return!0;if(Qs(t)&&(bh(t)||"string"==typeof t||"function"==typeof t.splice||wh(t)||Eh(t)||_h(t)))return!t.length;var e=Pf(t);if(e==qt||e==Kt)return!t.size;if(za(t))return!Gr(t).length;for(var n in t)if(_l.call(t,n))return!1;return!0}function eu(t,e){return Or(t,e)}function nu(t,e,n){n="function"==typeof n?n:K;var r=n?n(t,e):K;return r===K?Or(t,e,K,n):!!r}function ru(t){if(!cu(t))return!1;var e=br(t);return e==zt||e==Ht||"string"==typeof t.message&&"string"==typeof t.name&&!mu(t)}function iu(t){return"number"==typeof t&&ql(t)}function au(t){if(!uu(t))return!1;var e=br(t);return e==Ut||e==Bt||e==jt||e==Zt}function ou(t){return"number"==typeof t&&t==Au(t)}function su(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=kt}function uu(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function cu(t){return null!=t&&"object"==typeof t}function lu(t,e){return t===e||Vr(t,e,Aa(e))}function fu(t,e,n){return n="function"==typeof n?n:K,Vr(t,e,Aa(e),n)}function hu(t){return vu(t)&&t!=+t}function du(t){if(Of(t))throw new ul(nt);return Rr(t)}function pu(t){return null===t}function gu(t){return null==t}function vu(t){return"number"==typeof t||cu(t)&&br(t)==Yt}function mu(t){if(!cu(t)||br(t)!=Xt)return!1;var e=Pl(t);if(null===e)return!0;var n=_l.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&xl.call(n)==Sl}function yu(t){return ou(t)&&t>=-kt&&t<=kt}function xu(t){return"string"==typeof t||!bh(t)&&cu(t)&&br(t)==te}function _u(t){return"symbol"==typeof t||cu(t)&&br(t)==ee}function bu(t){return t===K}function $u(t){return cu(t)&&Pf(t)==re}function wu(t){return cu(t)&&br(t)==ie}function Su(t){if(!t)return[];if(Qs(t))return xu(t)?X(t):Fi(t);if(Rl&&t[Rl])return F(t[Rl]());var e=Pf(t),n=e==qt?G:e==Kt?U:rc;return n(t)}function Tu(t){if(!t)return 0===t?t:0;if(t=Eu(t),t===Mt||t===-Mt){var e=t<0?-1:1;return e*Pt}return t===t?t:0}function Au(t){var e=Tu(t),n=e%1;return e===e?n?e-n:e:0}function Cu(t){return t?Gn(Au(t),0,Lt):0}function Eu(t){if("number"==typeof t)return t;if(_u(t))return Ot;if(uu(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=uu(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Oe,"");var n=ze.test(t);return n||Be.test(t)?Kn(t.slice(2),n?2:8):He.test(t)?Ot:+t}function Mu(t){return Gi(t,Bu(t))}function ku(t){return t?Gn(Au(t),-kt,kt):0===t?t:0}function Pu(t){return null==t?"":vi(t)}function Ou(t,e){var n=yf(t);return null==e?n:Vn(n,e)}function Lu(t,e){return m(t,Sa(e,3),or)}function Du(t,e){return m(t,Sa(e,3),sr)}function Vu(t,e){return null==t?t:bf(t,Sa(e,3),Bu)}function Ru(t,e){return null==t?t:$f(t,Sa(e,3),Bu)}function Iu(t,e){return t&&or(t,Sa(e,3))}function Nu(t,e){return t&&sr(t,Sa(e,3))}function ju(t){return null==t?[]:pr(t,Uu(t))}function Fu(t){return null==t?[]:pr(t,Bu(t))}function Gu(t,e,n){var r=null==t?K:yr(t,e);return r===K?n:r}function Hu(t,e){return null!=t&&Pa(t,e,wr)}function zu(t,e){return null!=t&&Pa(t,e,Sr)}function Uu(t){return Qs(t)?Cn(t):Gr(t)}function Bu(t){return Qs(t)?Cn(t,!0):Hr(t)}function qu(t,e){var n={};return e=Sa(e,3),or(t,function(t,r,i){In(n,e(t,r,i),t)}),n}function Yu(t,e){var n={};return e=Sa(e,3),or(t,function(t,r,i){In(n,r,e(t,r,i))}),n}function Wu(t,e){return Xu(t,Rs(Sa(e)))}function Xu(t,e){if(null==t)return{};var n=l(ba(t),function(t){return[t]});return e=Sa(e),Jr(t,n,function(t,n){return e(t,n[0])})}function Qu(t,e,n){e=Ai(e,t);var r=-1,i=e.length;for(i||(i=1,t=K);++r<i;){var a=null==t?K:t[no(e[r])];a===K&&(r=i,a=n),t=au(a)?a.call(t):a}return t}function Zu(t,e,n){return null==t?t:ui(t,e,n)}function Ju(t,e,n,r){return r="function"==typeof r?r:K,null==t?t:ui(t,e,n,r)}function Ku(t,e,n){var r=bh(t),a=r||wh(t)||Eh(t);if(e=Sa(e,4),null==n){var o=t&&t.constructor;n=a?r?new o:[]:uu(t)&&au(o)?yf(Pl(t)):{}}return(a?i:or)(t,function(t,r,i){return e(n,t,r,i)}),n}function tc(t,e){return null==t||yi(t,e)}function ec(t,e,n){return null==t?t:xi(t,e,Ti(n))}function nc(t,e,n,r){return r="function"==typeof r?r:K,null==t?t:xi(t,e,Ti(n),r)}function rc(t){return null==t?[]:P(t,Uu(t))}function ic(t){return null==t?[]:P(t,Bu(t))}function ac(t,e,n){return n===K&&(n=e,e=K),n!==K&&(n=Eu(n),n=n===n?n:0),e!==K&&(e=Eu(e),e=e===e?e:0),Gn(Eu(t),e,n)}function oc(t,e,n){return e=Tu(e),n===K?(n=e,e=0):n=Tu(n),t=Eu(t),Tr(t,e,n)}function sc(t,e,n){if(n&&"boolean"!=typeof n&&Na(t,e,n)&&(e=n=K),n===K&&("boolean"==typeof e?(n=e,e=K):"boolean"==typeof t&&(n=t,t=K)),t===K&&e===K?(t=0,e=1):(t=Tu(t),e===K?(e=t,t=0):e=Tu(e)),t>e){var r=t;t=e,e=r}if(n||t%1||e%1){var i=Kl();return Ql(t+i*(e-t+Jn("1e-"+((i+"").length-1))),e)}return ni(t,e)}function uc(t){return td(Pu(t).toLowerCase())}function cc(t){return t=Pu(t),t&&t.replace(Ye,gr).replace(jn,"")}function lc(t,e,n){t=Pu(t),e=vi(e);var r=t.length;n=n===K?r:Gn(Au(n),0,r);var i=n;return n-=e.length,n>=0&&t.slice(n,i)==e}function fc(t){return t=Pu(t),t&&$e.test(t)?t.replace(_e,vr):t}function hc(t){return t=Pu(t),t&&Pe.test(t)?t.replace(ke,"\\$&"):t}function dc(t,e,n){t=Pu(t),e=Au(e);var r=e?W(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return aa(zl(i),n)+t+aa(Hl(i),n)}function pc(t,e,n){t=Pu(t),e=Au(e);var r=e?W(t):0;return e&&r<e?t+aa(e-r,n):t}function gc(t,e,n){t=Pu(t),e=Au(e);var r=e?W(t):0;return e&&r<e?aa(e-r,n)+t:t}function vc(t,e,n){return n||null==e?e=0:e&&(e=+e),Jl(Pu(t).replace(Le,""),e||0)}function mc(t,e,n){return e=(n?Na(t,e,n):e===K)?1:Au(e),ii(Pu(t),e)}function yc(){var t=arguments,e=Pu(t[0]);return t.length<3?e:e.replace(t[1],t[2])}function xc(t,e,n){return n&&"number"!=typeof n&&Na(t,e,n)&&(e=n=K),(n=n===K?Lt:n>>>0)?(t=Pu(t),t&&("string"==typeof e||null!=e&&!Ah(e))&&(e=vi(e),!e&&N(t))?Ci(X(t),0,n):t.split(e,n)):[]}function _c(t,e,n){return t=Pu(t),n=null==n?0:Gn(Au(n),0,t.length),e=vi(e),t.slice(n,n+e.length)==e}function bc(t,e,n){var r=q.templateSettings;n&&Na(t,e,n)&&(e=K),t=Pu(t),e=Lh({},e,r,da);var i,a,o=Lh({},e.imports,r.imports,da),s=Uu(o),u=P(o,s),c=0,l=e.interpolate||We,f="__p += '",h=hl((e.escape||We).source+"|"+l.source+"|"+(l===Te?Fe:We).source+"|"+(e.evaluate||We).source+"|$","g"),d="//# sourceURL="+("sourceURL"in e?e.sourceURL:"lodash.templateSources["+ ++Bn+"]")+"\n";t.replace(h,function(e,n,r,o,s,u){return r||(r=o),f+=t.slice(c,u).replace(Xe,R),n&&(i=!0,f+="' +\n__e("+n+") +\n'"),s&&(a=!0,f+="';\n"+s+";\n__p += '"),r&&(f+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),c=u+e.length,e}),f+="';\n";var p=e.variable;p||(f="with (obj) {\n"+f+"\n}\n"),f=(a?f.replace(ve,""):f).replace(me,"$1").replace(ye,"$1;"),f="function("+(p||"obj")+") {\n"+(p?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(a?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+f+"return __p\n}";var g=ed(function(){return cl(s,d+"return "+f).apply(K,u)});if(g.source=f,ru(g))throw g;return g}function $c(t){return Pu(t).toLowerCase()}function wc(t){return Pu(t).toUpperCase()}function Sc(t,e,n){if(t=Pu(t),t&&(n||e===K))return t.replace(Oe,"");if(!t||!(e=vi(e)))return t;var r=X(t),i=X(e),a=L(r,i),o=D(r,i)+1;return Ci(r,a,o).join("")}function Tc(t,e,n){if(t=Pu(t),t&&(n||e===K))return t.replace(De,"");if(!t||!(e=vi(e)))return t;var r=X(t),i=D(r,X(e))+1;return Ci(r,0,i).join("")}function Ac(t,e,n){if(t=Pu(t),t&&(n||e===K))return t.replace(Le,"");if(!t||!(e=vi(e)))return t;var r=X(t),i=L(r,X(e));return Ci(r,i).join("")}function Cc(t,e){var n=$t,r=wt;if(uu(e)){var i="separator"in e?e.separator:i;n="length"in e?Au(e.length):n,r="omission"in e?vi(e.omission):r}t=Pu(t);var a=t.length;if(N(t)){var o=X(t);a=o.length}if(n>=a)return t;var s=n-W(r);if(s<1)return r;var u=o?Ci(o,0,s).join(""):t.slice(0,s);if(i===K)return u+r;if(o&&(s+=u.length-s),Ah(i)){if(t.slice(s).search(i)){var c,l=u;for(i.global||(i=hl(i.source,Pu(Ge.exec(i))+"g")),i.lastIndex=0;c=i.exec(l);)var f=c.index;u=u.slice(0,f===K?s:f)}}else if(t.indexOf(vi(i),s)!=s){var h=u.lastIndexOf(i);
h>-1&&(u=u.slice(0,h))}return u+r}function Ec(t){return t=Pu(t),t&&be.test(t)?t.replace(xe,mr):t}function Mc(t,e,n){return t=Pu(t),e=n?K:e,e===K?j(t)?J(t):v(t):t.match(e)||[]}function kc(t){var e=null==t?0:t.length,r=Sa();return t=e?l(t,function(t){if("function"!=typeof t[1])throw new pl(rt);return[r(t[0]),t[1]]}):[],ai(function(r){for(var i=-1;++i<e;){var a=t[i];if(n(a[0],this,r))return n(a[1],this,r)}})}function Pc(t){return zn(Hn(t,st))}function Oc(t){return function(){return t}}function Lc(t,e){return null==t||t!==t?e:t}function Dc(t){return t}function Vc(t){return Fr("function"==typeof t?t:Hn(t,st))}function Rc(t){return Br(Hn(t,st))}function Ic(t,e){return qr(t,Hn(e,st))}function Nc(t,e,n){var r=Uu(e),a=pr(e,r);null!=n||uu(e)&&(a.length||!r.length)||(n=e,e=t,t=this,a=pr(e,Uu(e)));var o=!(uu(n)&&"chain"in n&&!n.chain),s=au(t);return i(a,function(n){var r=e[n];t[n]=r,s&&(t.prototype[n]=function(){var e=this.__chain__;if(o||e){var n=t(this.__wrapped__),i=n.__actions__=Fi(this.__actions__);return i.push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,f([this.value()],arguments))})}),t}function jc(){return nr._===this&&(nr._=Tl),this}function Fc(){}function Gc(t){return t=Au(t),ai(function(e){return Xr(e,t)})}function Hc(t){return ja(t)?w(no(t)):Kr(t)}function zc(t){return function(e){return null==t?K:yr(t,e)}}function Uc(){return[]}function Bc(){return!1}function qc(){return{}}function Yc(){return""}function Wc(){return!0}function Xc(t,e){if(t=Au(t),t<1||t>kt)return[];var n=Lt,r=Ql(t,Lt);e=Sa(e),t-=Lt;for(var i=E(r,e);++n<t;)e(n);return i}function Qc(t){return bh(t)?l(t,no):_u(t)?[t]:Fi(Rf(Pu(t)))}function Zc(t){var e=++bl;return Pu(t)+e}function Jc(t){return t&&t.length?tr(t,Dc,$r):K}function Kc(t,e){return t&&t.length?tr(t,Sa(e,2),$r):K}function tl(t){return $(t,Dc)}function el(t,e){return $(t,Sa(e,2))}function nl(t){return t&&t.length?tr(t,Dc,zr):K}function rl(t,e){return t&&t.length?tr(t,Sa(e,2),zr):K}function il(t){return t&&t.length?C(t,Dc):0}function al(t,e){return t&&t.length?C(t,Sa(e,2)):0}S=null==S?nr:xr.defaults(nr.Object(),S,xr.pick(nr,Un));var ol=S.Array,sl=S.Date,ul=S.Error,cl=S.Function,ll=S.Math,fl=S.Object,hl=S.RegExp,dl=S.String,pl=S.TypeError,gl=ol.prototype,vl=cl.prototype,ml=fl.prototype,yl=S["__core-js_shared__"],xl=vl.toString,_l=ml.hasOwnProperty,bl=0,$l=function(){var t=/[^.]+$/.exec(yl&&yl.keys&&yl.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),wl=ml.toString,Sl=xl.call(fl),Tl=nr._,Al=hl("^"+xl.call(_l).replace(ke,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Cl=ar?S.Buffer:K,El=S.Symbol,Ml=S.Uint8Array,kl=Cl?Cl.allocUnsafe:K,Pl=H(fl.getPrototypeOf,fl),Ol=fl.create,Ll=ml.propertyIsEnumerable,Dl=gl.splice,Vl=El?El.isConcatSpreadable:K,Rl=El?El.iterator:K,Il=El?El.toStringTag:K,Nl=function(){try{var t=Ca(fl,"defineProperty");return t({},"",{}),t}catch(t){}}(),jl=S.clearTimeout!==nr.clearTimeout&&S.clearTimeout,Fl=sl&&sl.now!==nr.Date.now&&sl.now,Gl=S.setTimeout!==nr.setTimeout&&S.setTimeout,Hl=ll.ceil,zl=ll.floor,Ul=fl.getOwnPropertySymbols,Bl=Cl?Cl.isBuffer:K,ql=S.isFinite,Yl=gl.join,Wl=H(fl.keys,fl),Xl=ll.max,Ql=ll.min,Zl=sl.now,Jl=S.parseInt,Kl=ll.random,tf=gl.reverse,ef=Ca(S,"DataView"),nf=Ca(S,"Map"),rf=Ca(S,"Promise"),af=Ca(S,"Set"),of=Ca(S,"WeakMap"),sf=Ca(fl,"create"),uf=of&&new of,cf={},lf=ro(ef),ff=ro(nf),hf=ro(rf),df=ro(af),pf=ro(of),gf=El?El.prototype:K,vf=gf?gf.valueOf:K,mf=gf?gf.toString:K,yf=function(){function t(){}return function(e){if(!uu(e))return{};if(Ol)return Ol(e);t.prototype=e;var n=new t;return t.prototype=K,n}}();q.templateSettings={escape:we,evaluate:Se,interpolate:Te,variable:"",imports:{_:q}},q.prototype=Q.prototype,q.prototype.constructor=q,Z.prototype=yf(Q.prototype),Z.prototype.constructor=Z,Ne.prototype=yf(Q.prototype),Ne.prototype.constructor=Ne,Ke.prototype.clear=tn,Ke.prototype.delete=en,Ke.prototype.get=nn,Ke.prototype.has=rn,Ke.prototype.set=an,on.prototype.clear=sn,on.prototype.delete=un,on.prototype.get=cn,on.prototype.has=ln,on.prototype.set=fn,hn.prototype.clear=dn,hn.prototype.delete=pn,hn.prototype.get=gn,hn.prototype.has=vn,hn.prototype.set=mn,yn.prototype.add=yn.prototype.push=xn,yn.prototype.has=_n,bn.prototype.clear=$n,bn.prototype.delete=wn,bn.prototype.get=Sn,bn.prototype.has=Tn,bn.prototype.set=An;var xf=qi(or),_f=qi(sr,!0),bf=Yi(),$f=Yi(!0),wf=uf?function(t,e){return uf.set(t,e),t}:Dc,Sf=Nl?function(t,e){return Nl(t,"toString",{configurable:!0,enumerable:!1,value:Oc(e),writable:!0})}:Dc,Tf=ai,Af=jl||function(t){return nr.clearTimeout(t)},Cf=af&&1/U(new af([,-0]))[1]==Mt?function(t){return new af(t)}:Fc,Ef=uf?function(t){return uf.get(t)}:Fc,Mf=Ul?function(t){return null==t?[]:(t=fl(t),s(Ul(t),function(e){return Ll.call(t,e)}))}:Uc,kf=Ul?function(t){for(var e=[];t;)f(e,Mf(t)),t=Pl(t);return e}:Uc,Pf=br;(ef&&Pf(new ef(new ArrayBuffer(1)))!=oe||nf&&Pf(new nf)!=qt||rf&&Pf(rf.resolve())!=Qt||af&&Pf(new af)!=Kt||of&&Pf(new of)!=re)&&(Pf=function(t){var e=br(t),n=e==Xt?t.constructor:K,r=n?ro(n):"";if(r)switch(r){case lf:return oe;case ff:return qt;case hf:return Qt;case df:return Kt;case pf:return re}return e});var Of=yl?au:Bc,Lf=to(wf),Df=Gl||function(t,e){return nr.setTimeout(t,e)},Vf=to(Sf),Rf=qa(function(t){var e=[];return Ee.test(t)&&e.push(""),t.replace(Me,function(t,n,r,i){e.push(r?i.replace(je,"$1"):n||t)}),e}),If=ai(function(t,e){return Zs(t)?Qn(t,ir(e,1,Zs,!0)):[]}),Nf=ai(function(t,e){var n=To(e);return Zs(n)&&(n=K),Zs(t)?Qn(t,ir(e,1,Zs,!0),Sa(n,2)):[]}),jf=ai(function(t,e){var n=To(e);return Zs(n)&&(n=K),Zs(t)?Qn(t,ir(e,1,Zs,!0),K,n):[]}),Ff=ai(function(t){var e=l(t,Si);return e.length&&e[0]===t[0]?Ar(e):[]}),Gf=ai(function(t){var e=To(t),n=l(t,Si);return e===To(n)?e=K:n.pop(),n.length&&n[0]===t[0]?Ar(n,Sa(e,2)):[]}),Hf=ai(function(t){var e=To(t),n=l(t,Si);return e="function"==typeof e?e:K,e&&n.pop(),n.length&&n[0]===t[0]?Ar(n,K,e):[]}),zf=ai(Eo),Uf=xa(function(t,e){var n=null==t?0:t.length,r=Fn(t,e);return ei(t,l(e,function(t){return Ia(t,n)?+t:t}).sort(Ri)),r}),Bf=ai(function(t){return mi(ir(t,1,Zs,!0))}),qf=ai(function(t){var e=To(t);return Zs(e)&&(e=K),mi(ir(t,1,Zs,!0),Sa(e,2))}),Yf=ai(function(t){var e=To(t);return e="function"==typeof e?e:K,mi(ir(t,1,Zs,!0),K,e)}),Wf=ai(function(t,e){return Zs(t)?Qn(t,e):[]}),Xf=ai(function(t){return $i(s(t,Zs))}),Qf=ai(function(t){var e=To(t);return Zs(e)&&(e=K),$i(s(t,Zs),Sa(e,2))}),Zf=ai(function(t){var e=To(t);return e="function"==typeof e?e:K,$i(s(t,Zs),K,e)}),Jf=ai(Qo),Kf=ai(function(t){var e=t.length,n=e>1?t[e-1]:K;return n="function"==typeof n?(t.pop(),n):K,Zo(t,n)}),th=xa(function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,i=function(e){return Fn(e,t)};return!(e>1||this.__actions__.length)&&r instanceof Ne&&Ia(n)?(r=r.slice(n,+n+(e?1:0)),r.__actions__.push({func:ns,args:[i],thisArg:K}),new Z(r,this.__chain__).thru(function(t){return e&&!t.length&&t.push(K),t})):this.thru(i)}),eh=Ui(function(t,e,n){_l.call(t,n)?++t[n]:In(t,n,1)}),nh=Ki(go),rh=Ki(vo),ih=Ui(function(t,e,n){_l.call(t,n)?t[n].push(e):In(t,n,[e])}),ah=ai(function(t,e,r){var i=-1,a="function"==typeof e,o=Qs(t)?ol(t.length):[];return xf(t,function(t){o[++i]=a?n(e,t,r):Er(t,e,r)}),o}),oh=Ui(function(t,e,n){In(t,n,e)}),sh=Ui(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]}),uh=ai(function(t,e){if(null==t)return[];var n=e.length;return n>1&&Na(t,e[0],e[1])?e=[]:n>2&&Na(e[0],e[1],e[2])&&(e=[e[0]]),Qr(t,ir(e,1),[])}),ch=Fl||function(){return nr.Date.now()},lh=ai(function(t,e,n){var r=ht;if(n.length){var i=z(n,wa(lh));r|=mt}return ha(t,r,e,n,i)}),fh=ai(function(t,e,n){var r=ht|dt;if(n.length){var i=z(n,wa(fh));r|=mt}return ha(e,r,t,n,i)}),hh=ai(function(t,e){return Xn(t,1,e)}),dh=ai(function(t,e,n){return Xn(t,Eu(e)||0,n)});Vs.Cache=hn;var ph=Tf(function(t,e){e=1==e.length&&bh(e[0])?l(e[0],k(Sa())):l(ir(e,1),k(Sa()));var r=e.length;return ai(function(i){for(var a=-1,o=Ql(i.length,r);++a<o;)i[a]=e[a].call(this,i[a]);return n(t,this,i)})}),gh=ai(function(t,e){var n=z(e,wa(gh));return ha(t,mt,K,e,n)}),vh=ai(function(t,e){var n=z(e,wa(vh));return ha(t,yt,K,e,n)}),mh=xa(function(t,e){return ha(t,_t,K,K,K,e)}),yh=ua($r),xh=ua(function(t,e){return t>=e}),_h=Mr(function(){return arguments}())?Mr:function(t){return cu(t)&&_l.call(t,"callee")&&!Ll.call(t,"callee")},bh=ol.isArray,$h=ur?k(ur):kr,wh=Bl||Bc,Sh=cr?k(cr):Pr,Th=lr?k(lr):Dr,Ah=fr?k(fr):Ir,Ch=hr?k(hr):Nr,Eh=dr?k(dr):jr,Mh=ua(zr),kh=ua(function(t,e){return t<=e}),Ph=Bi(function(t,e){if(za(e)||Qs(e))return void Gi(e,Uu(e),t);for(var n in e)_l.call(e,n)&&On(t,n,e[n])}),Oh=Bi(function(t,e){Gi(e,Bu(e),t)}),Lh=Bi(function(t,e,n,r){Gi(e,Bu(e),t,r)}),Dh=Bi(function(t,e,n,r){Gi(e,Uu(e),t,r)}),Vh=xa(Fn),Rh=ai(function(t){return t.push(K,da),n(Lh,K,t)}),Ih=ai(function(t){return t.push(K,pa),n(Hh,K,t)}),Nh=na(function(t,e,n){t[e]=n},Oc(Dc)),jh=na(function(t,e,n){_l.call(t,e)?t[e].push(n):t[e]=[n]},Sa),Fh=ai(Er),Gh=Bi(function(t,e,n){Yr(t,e,n)}),Hh=Bi(function(t,e,n,r){Yr(t,e,n,r)}),zh=xa(function(t,e){var n={};if(null==t)return n;var r=!1;e=l(e,function(e){return e=Ai(e,t),r||(r=e.length>1),e}),Gi(t,ba(t),n),r&&(n=Hn(n,st|ut|ct,ga));for(var i=e.length;i--;)yi(n,e[i]);return n}),Uh=xa(function(t,e){return null==t?{}:Zr(t,e)}),Bh=fa(Uu),qh=fa(Bu),Yh=Qi(function(t,e,n){return e=e.toLowerCase(),t+(n?uc(e):e)}),Wh=Qi(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),Xh=Qi(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),Qh=Xi("toLowerCase"),Zh=Qi(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}),Jh=Qi(function(t,e,n){return t+(n?" ":"")+td(e)}),Kh=Qi(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),td=Xi("toUpperCase"),ed=ai(function(t,e){try{return n(t,K,e)}catch(t){return ru(t)?t:new ul(t)}}),nd=xa(function(t,e){return i(e,function(e){e=no(e),In(t,e,lh(t[e],t))}),t}),rd=ta(),id=ta(!0),ad=ai(function(t,e){return function(n){return Er(n,t,e)}}),od=ai(function(t,e){return function(n){return Er(t,n,e)}}),sd=ia(l),ud=ia(o),cd=ia(p),ld=sa(),fd=sa(!0),hd=ra(function(t,e){return t+e},0),dd=la("ceil"),pd=ra(function(t,e){return t/e},1),gd=la("floor"),vd=ra(function(t,e){return t*e},1),md=la("round"),yd=ra(function(t,e){return t-e},0);return q.after=Es,q.ary=Ms,q.assign=Ph,q.assignIn=Oh,q.assignInWith=Lh,q.assignWith=Dh,q.at=Vh,q.before=ks,q.bind=lh,q.bindAll=nd,q.bindKey=fh,q.castArray=zs,q.chain=ts,q.chunk=oo,q.compact=so,q.concat=uo,q.cond=kc,q.conforms=Pc,q.constant=Oc,q.countBy=eh,q.create=Ou,q.curry=Ps,q.curryRight=Os,q.debounce=Ls,q.defaults=Rh,q.defaultsDeep=Ih,q.defer=hh,q.delay=dh,q.difference=If,q.differenceBy=Nf,q.differenceWith=jf,q.drop=co,q.dropRight=lo,q.dropRightWhile=fo,q.dropWhile=ho,q.fill=po,q.filter=fs,q.flatMap=hs,q.flatMapDeep=ds,q.flatMapDepth=ps,q.flatten=mo,q.flattenDeep=yo,q.flattenDepth=xo,q.flip=Ds,q.flow=rd,q.flowRight=id,q.fromPairs=_o,q.functions=ju,q.functionsIn=Fu,q.groupBy=ih,q.initial=wo,q.intersection=Ff,q.intersectionBy=Gf,q.intersectionWith=Hf,q.invert=Nh,q.invertBy=jh,q.invokeMap=ah,q.iteratee=Vc,q.keyBy=oh,q.keys=Uu,q.keysIn=Bu,q.map=ys,q.mapKeys=qu,q.mapValues=Yu,q.matches=Rc,q.matchesProperty=Ic,q.memoize=Vs,q.merge=Gh,q.mergeWith=Hh,q.method=ad,q.methodOf=od,q.mixin=Nc,q.negate=Rs,q.nthArg=Gc,q.omit=zh,q.omitBy=Wu,q.once=Is,q.orderBy=xs,q.over=sd,q.overArgs=ph,q.overEvery=ud,q.overSome=cd,q.partial=gh,q.partialRight=vh,q.partition=sh,q.pick=Uh,q.pickBy=Xu,q.property=Hc,q.propertyOf=zc,q.pull=zf,q.pullAll=Eo,q.pullAllBy=Mo,q.pullAllWith=ko,q.pullAt=Uf,q.range=ld,q.rangeRight=fd,q.rearg=mh,q.reject=$s,q.remove=Po,q.rest=Ns,q.reverse=Oo,q.sampleSize=Ss,q.set=Zu,q.setWith=Ju,q.shuffle=Ts,q.slice=Lo,q.sortBy=uh,q.sortedUniq=Fo,q.sortedUniqBy=Go,q.split=xc,q.spread=js,q.tail=Ho,q.take=zo,q.takeRight=Uo,q.takeRightWhile=Bo,q.takeWhile=qo,q.tap=es,q.throttle=Fs,q.thru=ns,q.toArray=Su,q.toPairs=Bh,q.toPairsIn=qh,q.toPath=Qc,q.toPlainObject=Mu,q.transform=Ku,q.unary=Gs,q.union=Bf,q.unionBy=qf,q.unionWith=Yf,q.uniq=Yo,q.uniqBy=Wo,q.uniqWith=Xo,q.unset=tc,q.unzip=Qo,q.unzipWith=Zo,q.update=ec,q.updateWith=nc,q.values=rc,q.valuesIn=ic,q.without=Wf,q.words=Mc,q.wrap=Hs,q.xor=Xf,q.xorBy=Qf,q.xorWith=Zf,q.zip=Jf,q.zipObject=Jo,q.zipObjectDeep=Ko,q.zipWith=Kf,q.entries=Bh,q.entriesIn=qh,q.extend=Oh,q.extendWith=Lh,Nc(q,q),q.add=hd,q.attempt=ed,q.camelCase=Yh,q.capitalize=uc,q.ceil=dd,q.clamp=ac,q.clone=Us,q.cloneDeep=qs,q.cloneDeepWith=Ys,q.cloneWith=Bs,q.conformsTo=Ws,q.deburr=cc,q.defaultTo=Lc,q.divide=pd,q.endsWith=lc,q.eq=Xs,q.escape=fc,q.escapeRegExp=hc,q.every=ls,q.find=nh,q.findIndex=go,q.findKey=Lu,q.findLast=rh,q.findLastIndex=vo,q.findLastKey=Du,q.floor=gd,q.forEach=gs,q.forEachRight=vs,q.forIn=Vu,q.forInRight=Ru,q.forOwn=Iu,q.forOwnRight=Nu,q.get=Gu,q.gt=yh,q.gte=xh,q.has=Hu,q.hasIn=zu,q.head=bo,q.identity=Dc,q.includes=ms,q.indexOf=$o,q.inRange=oc,q.invoke=Fh,q.isArguments=_h,q.isArray=bh,q.isArrayBuffer=$h,q.isArrayLike=Qs,q.isArrayLikeObject=Zs,q.isBoolean=Js,q.isBuffer=wh,q.isDate=Sh,q.isElement=Ks,q.isEmpty=tu,q.isEqual=eu,q.isEqualWith=nu,q.isError=ru,q.isFinite=iu,q.isFunction=au,q.isInteger=ou,q.isLength=su,q.isMap=Th,q.isMatch=lu,q.isMatchWith=fu,q.isNaN=hu,q.isNative=du,q.isNil=gu,q.isNull=pu,q.isNumber=vu,q.isObject=uu,q.isObjectLike=cu,q.isPlainObject=mu,q.isRegExp=Ah,q.isSafeInteger=yu,q.isSet=Ch,q.isString=xu,q.isSymbol=_u,q.isTypedArray=Eh,q.isUndefined=bu,q.isWeakMap=$u,q.isWeakSet=wu,q.join=So,q.kebabCase=Wh,q.last=To,q.lastIndexOf=Ao,q.lowerCase=Xh,q.lowerFirst=Qh,q.lt=Mh,q.lte=kh,q.max=Jc,q.maxBy=Kc,q.mean=tl,q.meanBy=el,q.min=nl,q.minBy=rl,q.stubArray=Uc,q.stubFalse=Bc,q.stubObject=qc,q.stubString=Yc,q.stubTrue=Wc,q.multiply=vd,q.nth=Co,q.noConflict=jc,q.noop=Fc,q.now=ch,q.pad=dc,q.padEnd=pc,q.padStart=gc,q.parseInt=vc,q.random=sc,q.reduce=_s,q.reduceRight=bs,q.repeat=mc,q.replace=yc,q.result=Qu,q.round=md,q.runInContext=g,q.sample=ws,q.size=As,q.snakeCase=Zh,q.some=Cs,q.sortedIndex=Do,q.sortedIndexBy=Vo,q.sortedIndexOf=Ro,q.sortedLastIndex=Io,q.sortedLastIndexBy=No,q.sortedLastIndexOf=jo,q.startCase=Jh,q.startsWith=_c,q.subtract=yd,q.sum=il,q.sumBy=al,q.template=bc,q.times=Xc,q.toFinite=Tu,q.toInteger=Au,q.toLength=Cu,q.toLower=$c,q.toNumber=Eu,q.toSafeInteger=ku,q.toString=Pu,q.toUpper=wc,q.trim=Sc,q.trimEnd=Tc,q.trimStart=Ac,q.truncate=Cc,q.unescape=Ec,q.uniqueId=Zc,q.upperCase=Kh,q.upperFirst=td,q.each=gs,q.eachRight=vs,q.first=bo,Nc(q,function(){var t={};return or(q,function(e,n){_l.call(q.prototype,n)||(t[n]=e)}),t}(),{chain:!1}),q.VERSION=tt,i(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){q[t].placeholder=q}),i(["drop","take"],function(t,e){Ne.prototype[t]=function(n){n=n===K?1:Xl(Au(n),0);var r=this.__filtered__&&!e?new Ne(this):this.clone();return r.__filtered__?r.__takeCount__=Ql(n,r.__takeCount__):r.__views__.push({size:Ql(n,Lt),type:t+(r.__dir__<0?"Right":"")}),r},Ne.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),i(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n==At||n==Et;Ne.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Sa(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),i(["head","last"],function(t,e){var n="take"+(e?"Right":"");Ne.prototype[t]=function(){return this[n](1).value()[0]}}),i(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");Ne.prototype[t]=function(){return this.__filtered__?new Ne(this):this[n](1)}}),Ne.prototype.compact=function(){return this.filter(Dc)},Ne.prototype.find=function(t){return this.filter(t).head()},Ne.prototype.findLast=function(t){return this.reverse().find(t)},Ne.prototype.invokeMap=ai(function(t,e){return"function"==typeof t?new Ne(this):this.map(function(n){return Er(n,t,e)})}),Ne.prototype.reject=function(t){return this.filter(Rs(Sa(t)))},Ne.prototype.slice=function(t,e){t=Au(t);var n=this;return n.__filtered__&&(t>0||e<0)?new Ne(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==K&&(e=Au(e),n=e<0?n.dropRight(-e):n.take(e-t)),n)},Ne.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Ne.prototype.toArray=function(){return this.take(Lt)},or(Ne.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),i=q[r?"take"+("last"==e?"Right":""):e],a=r||/^find/.test(e);i&&(q.prototype[e]=function(){var e=this.__wrapped__,o=r?[1]:arguments,s=e instanceof Ne,u=o[0],c=s||bh(e),l=function(t){var e=i.apply(q,f([t],o));return r&&h?e[0]:e};c&&n&&"function"==typeof u&&1!=u.length&&(s=c=!1);var h=this.__chain__,d=!!this.__actions__.length,p=a&&!h,g=s&&!d;if(!a&&c){e=g?e:new Ne(this);var v=t.apply(e,o);return v.__actions__.push({func:ns,args:[l],thisArg:K}),new Z(v,h)}return p&&g?t.apply(this,o):(v=this.thru(l),p?r?v.value()[0]:v.value():v)})}),i(["pop","push","shift","sort","splice","unshift"],function(t){var e=gl[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);q.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(bh(i)?i:[],t)}return this[n](function(n){return e.apply(bh(n)?n:[],t)})}}),or(Ne.prototype,function(t,e){var n=q[e];if(n){var r=n.name+"",i=cf[r]||(cf[r]=[]);i.push({name:e,func:n})}}),cf[ea(K,dt).name]=[{name:"wrapper",func:K}],Ne.prototype.clone=Qe,Ne.prototype.reverse=Ze,Ne.prototype.value=Je,q.prototype.at=th,q.prototype.chain=rs,q.prototype.commit=is,q.prototype.next=as,q.prototype.plant=ss,q.prototype.reverse=us,q.prototype.toJSON=q.prototype.valueOf=q.prototype.value=cs,q.prototype.first=q.prototype.head,Rl&&(q.prototype[Rl]=os),q},xr=yr();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(nr._=xr,define(function(){return xr})):ir?((ir.exports=xr)._=xr,rr._=xr):nr._=xr}.call(this),function(){"use strict";function t(t){return angular.isUndefined(t)||null===t}function e(){try{return require("moment")}catch(t){throw new Error("Please install moment via npm. Please reference to: https://github.com/urish/angular-moment")}}function n(n,r){if("undefined"==typeof r){if("function"!=typeof require)throw new Error("Moment cannot be found by angular-moment! Please reference to: https://github.com/urish/angular-moment");r=e()}return n.module("angularMoment",[]).constant("angularMomentConfig",{preprocess:null,timezone:null,format:null,statefulFilters:!0}).constant("moment",r).constant("amTimeAgoConfig",{withoutSuffix:!1,serverTime:null,titleFormat:null,fullDateThreshold:null,fullDateFormat:null,fullDateThresholdUnit:"day"}).directive("amTimeAgo",["$window","moment","amMoment","amTimeAgoConfig",function(e,r,i,a){return function(o,s,u){function c(){var t;if(g)t=g;else if(a.serverTime){var e=(new Date).getTime(),n=e-$+a.serverTime;t=r(n)}else t=r();return t}function l(){v&&(e.clearTimeout(v),v=null)}function f(t){var n=c().diff(t,b),r=x&&n>=x;if(r?s.text(t.format(_)):s.text(t.from(c(),m)),y&&T&&s.attr("title",t.format(y)),!r){var i=Math.abs(c().diff(t,"minute")),a=3600;i<1?a=1:i<60?a=30:i<180&&(a=300),v=e.setTimeout(function(){f(t)},1e3*a)}}function h(t){S&&s.attr("datetime",t)}function d(){if(l(),p){var t=i.preprocessDate(p);f(t),h(t.toISOString())}}var p,g,v=null,m=a.withoutSuffix,y=a.titleFormat,x=a.fullDateThreshold,_=a.fullDateFormat,b=a.fullDateThresholdUnit,$=(new Date).getTime(),w=u.amTimeAgo,S="TIME"===s[0].nodeName.toUpperCase(),T=!s.attr("title");o.$watch(w,function(e){return t(e)||""===e?(l(),void(p&&(s.text(""),h(""),p=null))):(p=e,void d())}),n.isDefined(u.amFrom)&&o.$watch(u.amFrom,function(e){g=t(e)||""===e?null:r(e),d()}),n.isDefined(u.amWithoutSuffix)&&o.$watch(u.amWithoutSuffix,function(t){"boolean"==typeof t?(m=t,d()):m=a.withoutSuffix}),u.$observe("amFullDateThreshold",function(t){x=t,d()}),u.$observe("amFullDateFormat",function(t){_=t,d()}),u.$observe("amFullDateThresholdUnit",function(t){b=t,d()}),o.$on("$destroy",function(){l()}),o.$on("amMoment:localeChanged",function(){d()})}}]).service("amMoment",["moment","$rootScope","$log","angularMomentConfig",function(t,e,r,i){var a=null;this.changeLocale=function(r,i){var a=t.locale(r,i);return n.isDefined(r)&&e.$broadcast("amMoment:localeChanged"),a},this.changeTimezone=function(n){t.tz&&t.tz.setDefault?(t.tz.setDefault(n),e.$broadcast("amMoment:timezoneChanged")):r.warn("angular-moment: changeTimezone() works only with moment-timezone.js v0.3.0 or greater."),i.timezone=n,a=n},this.preprocessDate=function(e){return a!==i.timezone&&this.changeTimezone(i.timezone),i.preprocess?i.preprocess(e):t(!isNaN(parseFloat(e))&&isFinite(e)?parseInt(e,10):e)}}]).filter("amParse",["moment",function(t){return function(e,n){return t(e,n)}}]).filter("amFromUnix",["moment",function(t){return function(e){return t.unix(e)}}]).filter("amUtc",["moment",function(t){return function(e){return t.utc(e)}}]).filter("amUtcOffset",["amMoment",function(t){function e(e,n){return t.preprocessDate(e).utcOffset(n)}return e}]).filter("amLocal",["moment",function(t){return function(e){return t.isMoment(e)?e.local():null}}]).filter("amTimezone",["amMoment","angularMomentConfig","$log",function(t,e,n){function r(e,r){var i=t.preprocessDate(e);return r?i.tz?i.tz(r):(n.warn("angular-moment: named timezone specified but moment.tz() is undefined. Did you forget to include moment-timezone.js ?"),i):i}return r}]).filter("amCalendar",["moment","amMoment","angularMomentConfig",function(e,n,r){function i(e,r,i){if(t(e))return"";var a=n.preprocessDate(e);return a.isValid()?a.calendar(r,i):""}return i.$stateful=r.statefulFilters,i}]).filter("amDifference",["moment","amMoment","angularMomentConfig",function(e,n,r){function i(r,i,a,o){if(t(r))return"";var s=n.preprocessDate(r),u=t(i)?e():n.preprocessDate(i);return s.isValid()&&u.isValid()?s.diff(u,a,o):""}return i.$stateful=r.statefulFilters,i}]).filter("amDateFormat",["moment","amMoment","angularMomentConfig",function(e,n,r){function i(e,r){if(t(e))return"";var i=n.preprocessDate(e);return i.isValid()?i.format(r):""}return i.$stateful=r.statefulFilters,i}]).filter("amDurationFormat",["moment","angularMomentConfig",function(e,n){function r(n,r,i){return t(n)?"":e.duration(n,r).humanize(i)}return r.$stateful=n.statefulFilters,r}]).filter("amTimeAgo",["moment","amMoment","angularMomentConfig",function(e,n,r){function i(r,i,a){var o,s;return t(r)?"":(r=n.preprocessDate(r),o=e(r),o.isValid()?(s=e(a),!t(a)&&s.isValid()?o.from(s,i):o.fromNow(i)):"")}return i.$stateful=r.statefulFilters,i}]).filter("amSubtract",["moment","angularMomentConfig",function(e,n){function r(n,r,i){return t(n)?"":e(n).subtract(parseInt(r,10),i)}return r.$stateful=n.statefulFilters,r}]).filter("amAdd",["moment","angularMomentConfig",function(e,n){function r(n,r,i){return t(n)?"":e(n).add(parseInt(r,10),i)}return r.$stateful=n.statefulFilters,r}]).filter("amStartOf",["moment","angularMomentConfig",function(e,n){function r(n,r){return t(n)?"":e(n).startOf(r)}return r.$stateful=n.statefulFilters,r}]).filter("amEndOf",["moment","angularMomentConfig",function(e,n){function r(n,r){return t(n)?"":e(n).endOf(r)}return r.$stateful=n.statefulFilters,r}]),"angularMoment"}var r=window&&window.process&&window.process.type;"function"==typeof define&&define.amd?define(["angular","moment"],n):"undefined"!=typeof module&&module&&module.exports&&"function"==typeof require&&!r?module.exports=n(require("angular"),require("moment")):n(angular,("undefined"!=typeof global?global:window).moment)}(),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in e)if(void 0!==t.style[n])return{end:e[n]};return!1}t.fn.emulateTransitionEnd=function(e){var n=!1,r=this;t(this).one("bsTransitionEnd",function(){n=!0});var i=function(){n||t(r).trigger(t.support.transition.end)};return setTimeout(i,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var n=t(this),i=n.data("bs.alert");i||n.data("bs.alert",i=new r(this)),"string"==typeof e&&i[e].call(n)})}var n='[data-dismiss="alert"]',r=function(e){t(e).on("click",n,this.close)};r.VERSION="3.3.7",r.TRANSITION_DURATION=150,r.prototype.close=function(e){function n(){o.detach().trigger("closed.bs.alert").remove()}var i=t(this),a=i.attr("data-target");a||(a=i.attr("href"),a=a&&a.replace(/.*(?=#[^\s]*$)/,""));var o=t("#"===a?[]:a);e&&e.preventDefault(),o.length||(o=i.closest(".alert")),o.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(o.removeClass("in"),t.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",n).emulateTransitionEnd(r.TRANSITION_DURATION):n())};var i=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=r,t.fn.alert.noConflict=function(){return t.fn.alert=i,this},t(document).on("click.bs.alert.data-api",n,r.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var r=t(this),i=r.data("bs.button"),a="object"==typeof e&&e;i||r.data("bs.button",i=new n(this,a)),"toggle"==e?i.toggle():e&&i.setState(e)})}var n=function(e,r){this.$element=t(e),this.options=t.extend({},n.DEFAULTS,r),this.isLoading=!1};n.VERSION="3.3.7",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(e){var n="disabled",r=this.$element,i=r.is("input")?"val":"html",a=r.data();e+="Text",null==a.resetText&&r.data("resetText",r[i]()),setTimeout(t.proxy(function(){r[i](null==a[e]?this.options[e]:a[e]),"loadingText"==e?(this.isLoading=!0,r.addClass(n).attr(n,n).prop(n,!0)):this.isLoading&&(this.isLoading=!1,r.removeClass(n).removeAttr(n).prop(n,!1))},this),0)},n.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),t&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var r=t.fn.button;t.fn.button=e,t.fn.button.Constructor=n,t.fn.button.noConflict=function(){return t.fn.button=r,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(n){var r=t(n.target).closest(".btn");e.call(r,"toggle"),t(n.target).is('input[type="radio"], input[type="checkbox"]')||(n.preventDefault(),r.is("input,button")?r.trigger("focus"):r.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){t(e.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(e.type))})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var r=t(this),i=r.data("bs.carousel"),a=t.extend({},n.DEFAULTS,r.data(),"object"==typeof e&&e),o="string"==typeof e?e:a.slide;i||r.data("bs.carousel",i=new n(this,a)),"number"==typeof e?i.to(e):o?i[o]():a.interval&&i.pause().cycle()})}var n=function(e,n){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",t.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};n.VERSION="3.3.7",n.TRANSITION_DURATION=600,n.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},n.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},n.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},n.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},n.prototype.getItemForDirection=function(t,e){var n=this.getItemIndex(e),r="prev"==t&&0===n||"next"==t&&n==this.$items.length-1;if(r&&!this.options.wrap)return e;var i="prev"==t?-1:1,a=(n+i)%this.$items.length;return this.$items.eq(a)},n.prototype.to=function(t){var e=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(t>this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",this.$items.eq(t))},n.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},n.prototype.next=function(){if(!this.sliding)return this.slide("next")},n.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},n.prototype.slide=function(e,r){var i=this.$element.find(".item.active"),a=r||this.getItemForDirection(e,i),o=this.interval,s="next"==e?"left":"right",u=this;if(a.hasClass("active"))return this.sliding=!1;var c=a[0],l=t.Event("slide.bs.carousel",{relatedTarget:c,direction:s});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,o&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var f=t(this.$indicators.children()[this.getItemIndex(a)]);f&&f.addClass("active")}var h=t.Event("slid.bs.carousel",{relatedTarget:c,direction:s});return t.support.transition&&this.$element.hasClass("slide")?(a.addClass(e),a[0].offsetWidth,i.addClass(s),a.addClass(s),i.one("bsTransitionEnd",function(){a.removeClass([e,s].join(" ")).addClass("active"),i.removeClass(["active",s].join(" ")),u.sliding=!1,setTimeout(function(){u.$element.trigger(h)},0)}).emulateTransitionEnd(n.TRANSITION_DURATION)):(i.removeClass("active"),a.addClass("active"),this.sliding=!1,this.$element.trigger(h)),o&&this.cycle(),this}};var r=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=n,t.fn.carousel.noConflict=function(){return t.fn.carousel=r,this};var i=function(n){var r,i=t(this),a=t(i.attr("data-target")||(r=i.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""));if(a.hasClass("carousel")){var o=t.extend({},a.data(),i.data()),s=i.attr("data-slide-to");s&&(o.interval=!1),e.call(a,o),s&&a.data("bs.carousel").to(s),n.preventDefault()}};t(document).on("click.bs.carousel.data-api","[data-slide]",i).on("click.bs.carousel.data-api","[data-slide-to]",i),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var n=t(this);e.call(n,n.data())})})}(jQuery),+function(t){"use strict";function e(e){var n,r=e.attr("data-target")||(n=e.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return t(r)}function n(e){return this.each(function(){var n=t(this),i=n.data("bs.collapse"),a=t.extend({},r.DEFAULTS,n.data(),"object"==typeof e&&e);!i&&a.toggle&&/show|hide/.test(e)&&(a.toggle=!1),i||n.data("bs.collapse",i=new r(this,a)),"string"==typeof e&&i[e]()})}var r=function(e,n){this.$element=t(e),this.options=t.extend({},r.DEFAULTS,n),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};r.VERSION="3.3.7",r.TRANSITION_DURATION=350,
r.DEFAULTS={toggle:!0},r.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},r.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,i=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(i&&i.length&&(e=i.data("bs.collapse"),e&&e.transitioning))){var a=t.Event("show.bs.collapse");if(this.$element.trigger(a),!a.isDefaultPrevented()){i&&i.length&&(n.call(i,"hide"),e||i.data("bs.collapse",null));var o=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[o](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var s=function(){this.$element.removeClass("collapsing").addClass("collapse in")[o](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return s.call(this);var u=t.camelCase(["scroll",o].join("-"));this.$element.one("bsTransitionEnd",t.proxy(s,this)).emulateTransitionEnd(r.TRANSITION_DURATION)[o](this.$element[0][u])}}}},r.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[n](0).one("bsTransitionEnd",t.proxy(i,this)).emulateTransitionEnd(r.TRANSITION_DURATION):i.call(this)}}},r.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},r.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(n,r){var i=t(r);this.addAriaAndCollapsedClass(e(i),i)},this)).end()},r.prototype.addAriaAndCollapsedClass=function(t,e){var n=t.hasClass("in");t.attr("aria-expanded",n),e.toggleClass("collapsed",!n).attr("aria-expanded",n)};var i=t.fn.collapse;t.fn.collapse=n,t.fn.collapse.Constructor=r,t.fn.collapse.noConflict=function(){return t.fn.collapse=i,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(r){var i=t(this);i.attr("data-target")||r.preventDefault();var a=e(i),o=a.data("bs.collapse"),s=o?"toggle":i.data();n.call(a,s)})}(jQuery),+function(t){"use strict";function e(e){var n=e.attr("data-target");n||(n=e.attr("href"),n=n&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var r=n&&t(n);return r&&r.length?r:e.parent()}function n(n){n&&3===n.which||(t(i).remove(),t(a).each(function(){var r=t(this),i=e(r),a={relatedTarget:this};i.hasClass("open")&&(n&&"click"==n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(i[0],n.target)||(i.trigger(n=t.Event("hide.bs.dropdown",a)),n.isDefaultPrevented()||(r.attr("aria-expanded","false"),i.removeClass("open").trigger(t.Event("hidden.bs.dropdown",a)))))}))}function r(e){return this.each(function(){var n=t(this),r=n.data("bs.dropdown");r||n.data("bs.dropdown",r=new o(this)),"string"==typeof e&&r[e].call(n)})}var i=".dropdown-backdrop",a='[data-toggle="dropdown"]',o=function(e){t(e).on("click.bs.dropdown",this.toggle)};o.VERSION="3.3.7",o.prototype.toggle=function(r){var i=t(this);if(!i.is(".disabled, :disabled")){var a=e(i),o=a.hasClass("open");if(n(),!o){"ontouchstart"in document.documentElement&&!a.closest(".navbar-nav").length&&t(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(t(this)).on("click",n);var s={relatedTarget:this};if(a.trigger(r=t.Event("show.bs.dropdown",s)),r.isDefaultPrevented())return;i.trigger("focus").attr("aria-expanded","true"),a.toggleClass("open").trigger(t.Event("shown.bs.dropdown",s))}return!1}},o.prototype.keydown=function(n){if(/(38|40|27|32)/.test(n.which)&&!/input|textarea/i.test(n.target.tagName)){var r=t(this);if(n.preventDefault(),n.stopPropagation(),!r.is(".disabled, :disabled")){var i=e(r),o=i.hasClass("open");if(!o&&27!=n.which||o&&27==n.which)return 27==n.which&&i.find(a).trigger("focus"),r.trigger("click");var s=" li:not(.disabled):visible a",u=i.find(".dropdown-menu"+s);if(u.length){var c=u.index(n.target);38==n.which&&c>0&&c--,40==n.which&&c<u.length-1&&c++,~c||(c=0),u.eq(c).trigger("focus")}}}};var s=t.fn.dropdown;t.fn.dropdown=r,t.fn.dropdown.Constructor=o,t.fn.dropdown.noConflict=function(){return t.fn.dropdown=s,this},t(document).on("click.bs.dropdown.data-api",n).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",a,o.prototype.toggle).on("keydown.bs.dropdown.data-api",a,o.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",o.prototype.keydown)}(jQuery),+function(t){"use strict";function e(e,r){return this.each(function(){var i=t(this),a=i.data("bs.modal"),o=t.extend({},n.DEFAULTS,i.data(),"object"==typeof e&&e);a||i.data("bs.modal",a=new n(this,o)),"string"==typeof e?a[e](r):o.show&&a.show(r)})}var n=function(e,n){this.options=n,this.$body=t(document.body),this.$element=t(e),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};n.VERSION="3.3.7",n.TRANSITION_DURATION=300,n.BACKDROP_TRANSITION_DURATION=150,n.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},n.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},n.prototype.show=function(e){var r=this,i=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(i),this.isShown||i.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){r.$element.one("mouseup.dismiss.bs.modal",function(e){t(e.target).is(r.$element)&&(r.ignoreBackdropClick=!0)})}),this.backdrop(function(){var i=t.support.transition&&r.$element.hasClass("fade");r.$element.parent().length||r.$element.appendTo(r.$body),r.$element.show().scrollTop(0),r.adjustDialog(),i&&r.$element[0].offsetWidth,r.$element.addClass("in"),r.enforceFocus();var a=t.Event("shown.bs.modal",{relatedTarget:e});i?r.$dialog.one("bsTransitionEnd",function(){r.$element.trigger("focus").trigger(a)}).emulateTransitionEnd(n.TRANSITION_DURATION):r.$element.trigger("focus").trigger(a)}))},n.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(n.TRANSITION_DURATION):this.hideModal())},n.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){document===t.target||this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},n.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},n.prototype.resize=function(){this.isShown?t(window).on("resize.bs.modal",t.proxy(this.handleUpdate,this)):t(window).off("resize.bs.modal")},n.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},n.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},n.prototype.backdrop=function(e){var r=this,i=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var a=t.support.transition&&i;if(this.$backdrop=t(document.createElement("div")).addClass("modal-backdrop "+i).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),a&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;a?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(n.BACKDROP_TRANSITION_DURATION):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var o=function(){r.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",o).emulateTransitionEnd(n.BACKDROP_TRANSITION_DURATION):o()}else e&&e()},n.prototype.handleUpdate=function(){this.adjustDialog()},n.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},n.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},n.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},n.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",t+this.scrollbarWidth)},n.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},n.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var r=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=n,t.fn.modal.noConflict=function(){return t.fn.modal=r,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(n){var r=t(this),i=r.attr("href"),a=t(r.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,"")),o=a.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(i)&&i},a.data(),r.data());r.is("a")&&n.preventDefault(),a.one("show.bs.modal",function(t){t.isDefaultPrevented()||a.one("hidden.bs.modal",function(){r.is(":visible")&&r.trigger("focus")})}),e.call(a,o,this)})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var r=t(this),i=r.data("bs.tooltip"),a="object"==typeof e&&e;!i&&/destroy|hide/.test(e)||(i||r.data("bs.tooltip",i=new n(this,a)),"string"==typeof e&&i[e]())})}var n=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",t,e)};n.VERSION="3.3.7",n.TRANSITION_DURATION=150,n.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},n.prototype.init=function(e,n,r){if(this.enabled=!0,this.type=e,this.$element=t(n),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&t(t.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var i=this.options.trigger.split(" "),a=i.length;a--;){var o=i[a];if("click"==o)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=o){var s="hover"==o?"mouseenter":"focusin",u="hover"==o?"mouseleave":"focusout";this.$element.on(s+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(u+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},n.prototype.getDefaults=function(){return n.DEFAULTS},n.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},n.prototype.getDelegateOptions=function(){var e={},n=this.getDefaults();return this._options&&t.each(this._options,function(t,r){n[t]!=r&&(e[t]=r)}),e},n.prototype.enter=function(e){var n=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,n)),e instanceof t.Event&&(n.inState["focusin"==e.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState?void(n.hoverState="in"):(clearTimeout(n.timeout),n.hoverState="in",n.options.delay&&n.options.delay.show?void(n.timeout=setTimeout(function(){"in"==n.hoverState&&n.show()},n.options.delay.show)):n.show())},n.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},n.prototype.leave=function(e){var n=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,n)),e instanceof t.Event&&(n.inState["focusout"==e.type?"focus":"hover"]=!1),!n.isInStateTrue())return clearTimeout(n.timeout),n.hoverState="out",n.options.delay&&n.options.delay.hide?void(n.timeout=setTimeout(function(){"out"==n.hoverState&&n.hide()},n.options.delay.hide)):n.hide()},n.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var r=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!r)return;var i=this,a=this.tip(),o=this.getUID(this.type);this.setContent(),a.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&a.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,u=/\s?auto?\s?/i,c=u.test(s);c&&(s=s.replace(u,"")||"top"),a.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?a.appendTo(this.options.container):a.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),f=a[0].offsetWidth,h=a[0].offsetHeight;if(c){var d=s,p=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+h>p.bottom?"top":"top"==s&&l.top-h<p.top?"bottom":"right"==s&&l.right+f>p.width?"left":"left"==s&&l.left-f<p.left?"right":s,a.removeClass(d).addClass(s)}var g=this.getCalculatedOffset(s,l,f,h);this.applyPlacement(g,s);var v=function(){var t=i.hoverState;i.$element.trigger("shown.bs."+i.type),i.hoverState=null,"out"==t&&i.leave(i)};t.support.transition&&this.$tip.hasClass("fade")?a.one("bsTransitionEnd",v).emulateTransitionEnd(n.TRANSITION_DURATION):v()}},n.prototype.applyPlacement=function(e,n){var r=this.tip(),i=r[0].offsetWidth,a=r[0].offsetHeight,o=parseInt(r.css("margin-top"),10),s=parseInt(r.css("margin-left"),10);isNaN(o)&&(o=0),isNaN(s)&&(s=0),e.top+=o,e.left+=s,t.offset.setOffset(r[0],t.extend({using:function(t){r.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),r.addClass("in");var u=r[0].offsetWidth,c=r[0].offsetHeight;"top"==n&&c!=a&&(e.top=e.top+a-c);var l=this.getViewportAdjustedDelta(n,e,u,c);l.left?e.left+=l.left:e.top+=l.top;var f=/top|bottom/.test(n),h=f?2*l.left-i+u:2*l.top-a+c,d=f?"offsetWidth":"offsetHeight";r.offset(e),this.replaceArrow(h,r[0][d],f)},n.prototype.replaceArrow=function(t,e,n){this.arrow().css(n?"left":"top",50*(1-t/e)+"%").css(n?"top":"left","")},n.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},n.prototype.hide=function(e){function r(){"in"!=i.hoverState&&a.detach(),i.$element&&i.$element.removeAttr("aria-describedby").trigger("hidden.bs."+i.type),e&&e()}var i=this,a=t(this.$tip),o=t.Event("hide.bs."+this.type);if(this.$element.trigger(o),!o.isDefaultPrevented())return a.removeClass("in"),t.support.transition&&a.hasClass("fade")?a.one("bsTransitionEnd",r).emulateTransitionEnd(n.TRANSITION_DURATION):r(),this.hoverState=null,this},n.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},n.prototype.hasContent=function(){return this.getTitle()},n.prototype.getPosition=function(e){e=e||this.$element;var n=e[0],r="BODY"==n.tagName,i=n.getBoundingClientRect();null==i.width&&(i=t.extend({},i,{width:i.right-i.left,height:i.bottom-i.top}));var a=window.SVGElement&&n instanceof window.SVGElement,o=r?{top:0,left:0}:a?null:e.offset(),s={scroll:r?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop()},u=r?{width:t(window).width(),height:t(window).height()}:null;return t.extend({},i,s,u,o)},n.prototype.getCalculatedOffset=function(t,e,n,r){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-n/2}:"top"==t?{top:e.top-r,left:e.left+e.width/2-n/2}:"left"==t?{top:e.top+e.height/2-r/2,left:e.left-n}:{top:e.top+e.height/2-r/2,left:e.left+e.width}},n.prototype.getViewportAdjustedDelta=function(t,e,n,r){var i={top:0,left:0};if(!this.$viewport)return i;var a=this.options.viewport&&this.options.viewport.padding||0,o=this.getPosition(this.$viewport);if(/right|left/.test(t)){var s=e.top-a-o.scroll,u=e.top+a-o.scroll+r;s<o.top?i.top=o.top-s:u>o.top+o.height&&(i.top=o.top+o.height-u)}else{var c=e.left-a,l=e.left+a+n;c<o.left?i.left=o.left-c:l>o.right&&(i.left=o.left+o.width-l)}return i},n.prototype.getTitle=function(){var t,e=this.$element,n=this.options;return t=e.attr("data-original-title")||("function"==typeof n.title?n.title.call(e[0]):n.title)},n.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},n.prototype.tip=function(){if(!this.$tip&&(this.$tip=t(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},n.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},n.prototype.enable=function(){this.enabled=!0},n.prototype.disable=function(){this.enabled=!1},n.prototype.toggleEnabled=function(){this.enabled=!this.enabled},n.prototype.toggle=function(e){var n=this;e&&(n=t(e.currentTarget).data("bs."+this.type),n||(n=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,n))),e?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},n.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})};var r=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=n,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=r,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var r=t(this),i=r.data("bs.popover"),a="object"==typeof e&&e;!i&&/destroy|hide/.test(e)||(i||r.data("bs.popover",i=new n(this,a)),"string"==typeof e&&i[e]())})}var n=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");n.VERSION="3.3.7",n.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),n.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),n.prototype.constructor=n,n.prototype.getDefaults=function(){return n.DEFAULTS},n.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),n=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof n?"html":"append":"text"](n),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},n.prototype.hasContent=function(){return this.getTitle()||this.getContent()},n.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},n.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var r=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=n,t.fn.popover.noConflict=function(){return t.fn.popover=r,this}}(jQuery),+function(t){"use strict";function e(n,r){this.$body=t(document.body),this.$scrollElement=t(t(n).is(document.body)?window:n),this.options=t.extend({},e.DEFAULTS,r),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",t.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each(function(){var r=t(this),i=r.data("bs.scrollspy"),a="object"==typeof n&&n;i||r.data("bs.scrollspy",i=new e(this,a)),"string"==typeof n&&i[n]()})}e.VERSION="3.3.7",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,n="offset",r=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(n="position",r=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),i=e.data("target")||e.attr("href"),a=/^#./.test(i)&&t(i);return a&&a.length&&a.is(":visible")&&[[a[n]().top+r,i]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,n=this.getScrollHeight(),r=this.options.offset+n-this.$scrollElement.height(),i=this.offsets,a=this.targets,o=this.activeTarget;if(this.scrollHeight!=n&&this.refresh(),e>=r)return o!=(t=a[a.length-1])&&this.activate(t);if(o&&e<i[0])return this.activeTarget=null,this.clear();for(t=i.length;t--;)o!=a[t]&&e>=i[t]&&(void 0===i[t+1]||e<i[t+1])&&this.activate(a[t])},e.prototype.activate=function(e){this.activeTarget=e,this.clear();var n=this.selector+'[data-target="'+e+'"],'+this.selector+'[href="'+e+'"]',r=t(n).parents("li").addClass("active");r.parent(".dropdown-menu").length&&(r=r.closest("li.dropdown").addClass("active")),r.trigger("activate.bs.scrollspy")},e.prototype.clear=function(){t(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var r=t.fn.scrollspy;t.fn.scrollspy=n,t.fn.scrollspy.Constructor=e,t.fn.scrollspy.noConflict=function(){return t.fn.scrollspy=r,this},t(window).on("load.bs.scrollspy.data-api",function(){t('[data-spy="scroll"]').each(function(){var e=t(this);n.call(e,e.data())})})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var r=t(this),i=r.data("bs.tab");i||r.data("bs.tab",i=new n(this)),"string"==typeof e&&i[e]()})}var n=function(e){this.element=t(e)};n.VERSION="3.3.7",n.TRANSITION_DURATION=150,n.prototype.show=function(){var e=this.element,n=e.closest("ul:not(.dropdown-menu)"),r=e.data("target");if(r||(r=e.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var i=n.find(".active:last a"),a=t.Event("hide.bs.tab",{relatedTarget:e[0]}),o=t.Event("show.bs.tab",{relatedTarget:i[0]});if(i.trigger(a),e.trigger(o),!o.isDefaultPrevented()&&!a.isDefaultPrevented()){var s=t(r);this.activate(e.closest("li"),n),this.activate(s,s.parent(),function(){i.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:i[0]})})}}},n.prototype.activate=function(e,r,i){function a(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}var o=r.find("> .active"),s=i&&t.support.transition&&(o.length&&o.hasClass("fade")||!!r.find("> .fade").length);o.length&&s?o.one("bsTransitionEnd",a).emulateTransitionEnd(n.TRANSITION_DURATION):a(),o.removeClass("in")};var r=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=n,t.fn.tab.noConflict=function(){return t.fn.tab=r,this};var i=function(n){n.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var r=t(this),i=r.data("bs.affix"),a="object"==typeof e&&e;i||r.data("bs.affix",i=new n(this,a)),"string"==typeof e&&i[e]()})}var n=function(e,r){this.options=t.extend({},n.DEFAULTS,r),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};n.VERSION="3.3.7",n.RESET="affix affix-top affix-bottom",n.DEFAULTS={offset:0,target:window},n.prototype.getState=function(t,e,n,r){var i=this.$target.scrollTop(),a=this.$element.offset(),o=this.$target.height();if(null!=n&&"top"==this.affixed)return i<n&&"top";if("bottom"==this.affixed)return null!=n?!(i+this.unpin<=a.top)&&"bottom":!(i+o<=t-r)&&"bottom";var s=null==this.affixed,u=s?i:a.top,c=s?o:e;return null!=n&&i<=n?"top":null!=r&&u+c>=t-r&&"bottom"},n.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(n.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},n.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},n.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=this.$element.height(),r=this.options.offset,i=r.top,a=r.bottom,o=Math.max(t(document).height(),t(document.body).height());"object"!=typeof r&&(a=i=r),"function"==typeof i&&(i=r.top(this.$element)),"function"==typeof a&&(a=r.bottom(this.$element));var s=this.getState(o,e,i,a);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var u="affix"+(s?"-"+s:""),c=t.Event(u+".bs.affix");if(this.$element.trigger(c),c.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(n.RESET).addClass(u).trigger(u.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:o-e-a})}};var r=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=n,t.fn.affix.noConflict=function(){return t.fn.affix=r,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var n=t(this),r=n.data();r.offset=r.offset||{},null!=r.offsetBottom&&(r.offset.bottom=r.offsetBottom),null!=r.offsetTop&&(r.offset.top=r.offsetTop),e.call(n,r)})})}(jQuery),function(t){"use strict";function e(t,e){return t.module("angularSpinner",[]).constant("SpinJSSpinner",e).provider("usSpinnerConfig",function(){var t={},e={};return{setDefaults:function(e){t=e||t},setTheme:function(t,n){e[t]=n},$get:function(){return{config:t,themes:e}}}}).factory("usSpinnerService",["$rootScope",function(t){var e={};return e.spin=function(e){t.$broadcast("us-spinner:spin",e)},e.stop=function(e){t.$broadcast("us-spinner:stop",e)},e}]).directive("usSpinner",["SpinJSSpinner","usSpinnerConfig",function(e,n){return{scope:!0,link:function(r,i,a){function o(){r.spinner&&r.spinner.stop()}r.spinner=null,r.key=!!t.isDefined(a.spinnerKey)&&a.spinnerKey,r.startActive=t.isDefined(a.spinnerStartActive)?r.$eval(a.spinnerStartActive):!r.key,r.spin=function(){r.spinner&&r.spinner.spin(i[0])},r.stop=function(){r.startActive=!1,o()},r.$watch(a.usSpinner,function(s){o(),s=t.extend({},n.config,n.themes[a.spinnerTheme],s),r.spinner=new e(s),r.key&&!r.startActive||a.spinnerOn||r.spinner.spin(i[0])},!0),a.spinnerOn&&r.$watch(a.spinnerOn,function(t){t?r.spin():r.stop()}),r.$on("us-spinner:spin",function(t,e){e===r.key&&r.spin()}),r.$on("us-spinner:stop",function(t,e){e===r.key&&r.stop()}),r.$on("$destroy",function(){r.stop(),r.spinner=null})}}}])}"object"==typeof module&&module.exports?module.exports=e(require("angular"),require("spin.js")):"function"==typeof define&&define.amd?define(["angular","spin"],e):e(t.angular,t.Spinner)}(this),function(t){"use strict";function e(t){this.owner=t}function n(t,e){if(Object.create)e.prototype=Object.create(t.prototype);else{var n=function(){};n.prototype=t.prototype,e.prototype=new n}return e.prototype.constructor=e,e}function r(t){var e=this.internal=new i(this);e.loadConfig(t),e.beforeInit(t),e.init(),e.afterInit(t),function t(e,n,r){Object.keys(e).forEach(function(i){n[i]=e[i].bind(r),Object.keys(e[i]).length>0&&t(e[i],n[i],r)})}(s,this,this)}function i(e){var n=this;n.d3=t.d3?t.d3:"undefined"!=typeof require?require("d3"):void 0,n.api=e,n.config=n.getDefaultConfig(),n.data={},n.cache={},n.axes={}}function a(t){e.call(this,t)}function o(t,e){function n(t,e){t.attr("transform",function(t){return"translate("+Math.ceil(e(t)+_)+", 0)"})}function r(t,e){t.attr("transform",function(t){return"translate(0,"+Math.ceil(e(t))+")"})}function i(t){var e=t[0],n=t[t.length-1];return e<n?[e,n]:[n,e]}function a(t){var e,n,r=[];if(t.ticks)return t.ticks.apply(t,d);for(n=t.domain(),e=Math.ceil(n[0]);e<n[1];e++)r.push(e);return r.length>0&&r[0]>0&&r.unshift(r[0]-(r[1]-r[0])),r}function o(){var t,n=g.copy();return e.isCategory&&(t=g.domain(),n.domain([t[0],t[1]-1])),n}function s(t){var e=h?h(t):t;return"undefined"!=typeof e?e:""}function u(t){if(A)return A;var e={h:11.5,w:5.5};return t.select("text").text(s).each(function(t){var n=this.getBoundingClientRect(),r=s(t),i=n.height,a=r?n.width/r.length:void 0;i&&a&&(e.h=i,e.w=a)}).text(""),A=e,e}function c(n){return e.withoutTransition?n:t.transition(n)}function l(h){h.each(function(){function h(t,n){function r(t,e){a=void 0;for(var s=1;s<e.length;s++)if(" "===e.charAt(s)&&(a=s),i=e.substr(0,s+1),o=q.w*i.length,n<o)return r(t.concat(e.substr(0,a?a:s)),e.slice(a?a+1:s));return t.concat(e)}var i,a,o,u=s(t),c=[];return"[object Array]"===Object.prototype.toString.call(u)?u:((!n||n<=0)&&(n=X?95:e.isCategory?Math.ceil(P(O[1])-P(O[0]))-12:110),r(c,u+""))}function d(t,e){var n=q.h;return 0===e&&(n="left"===v||"right"===v?-((Y[t.index]-1)*(q.h/2)-3):".71em"),n}function b(t){var e=g(t)+(p?0:_);return I[0]<e&&e<I[1]?m:0}function $(t){return t?t>0?"start":"end":"middle"}function w(t){return t?"rotate("+t+")":""}function S(t){return t?8*Math.sin(Math.PI*(t/180)):0}function T(t){return t?11.5-2.5*(t/15)*(t>0?1:-1):W}var A,C,E,M=l.g=t.select(this),k=this.__chart__||g,P=this.__chart__=o(),O=x?x:a(P),L=M.selectAll(".tick").data(O,P),D=L.enter().insert("g",".domain").attr("class","tick").style("opacity",1e-6),V=L.exit().remove(),R=c(L).style("opacity",1),I=g.rangeExtent?g.rangeExtent():i(g.range()),N=M.selectAll(".domain").data([0]),j=(N.enter().append("path").attr("class","domain"),
c(N));D.append("line"),D.append("text");var F=D.select("line"),G=R.select("line"),H=D.select("text"),z=R.select("text");e.isCategory?(_=Math.ceil((P(1)-P(0))/2),C=p?0:_,E=p?_:0):_=C=0;var U,B,q=u(M.select(".tick")),Y=[],W=Math.max(m,0)+y,X="left"===v||"right"===v;U=L.select("text"),B=U.selectAll("tspan").data(function(t,n){var r=e.tickMultiline?h(t,e.tickWidth):[].concat(s(t));return Y[n]=r.length,r.map(function(t){return{index:n,splitted:t}})}),B.enter().append("tspan"),B.exit().remove(),B.text(function(t){return t.splitted});var Q=e.tickTextRotate;switch(v){case"bottom":A=n,F.attr("y2",m),H.attr("y",W),G.attr("x1",C).attr("x2",C).attr("y2",b),z.attr("x",0).attr("y",T(Q)).style("text-anchor",$(Q)).attr("transform",w(Q)),B.attr("x",0).attr("dy",d).attr("dx",S(Q)),j.attr("d","M"+I[0]+","+f+"V0H"+I[1]+"V"+f);break;case"top":A=n,F.attr("y2",-m),H.attr("y",-W),G.attr("x2",0).attr("y2",-m),z.attr("x",0).attr("y",-W),U.style("text-anchor","middle"),B.attr("x",0).attr("dy","0em"),j.attr("d","M"+I[0]+","+-f+"V0H"+I[1]+"V"+-f);break;case"left":A=r,F.attr("x2",-m),H.attr("x",-W),G.attr("x2",-m).attr("y1",E).attr("y2",E),z.attr("x",-W).attr("y",_),U.style("text-anchor","end"),B.attr("x",-W).attr("dy",d),j.attr("d","M"+-f+","+I[0]+"H0V"+I[1]+"H"+-f);break;case"right":A=r,F.attr("x2",m),H.attr("x",W),G.attr("x2",m).attr("y2",0),z.attr("x",W).attr("y",0),U.style("text-anchor","start"),B.attr("x",W).attr("dy",d),j.attr("d","M"+f+","+I[0]+"H0V"+I[1]+"H"+f)}if(P.rangeBand){var Z=P,J=Z.rangeBand()/2;k=P=function(t){return Z(t)+J}}else k.rangeBand?k=P:V.call(A,P);D.call(A,k),R.call(A,P)})}var f,h,d,p,g=t.scale.linear(),v="bottom",m=6,y=3,x=null,_=0,b=!0;return e=e||{},f=e.withOuterTick?6:0,l.scale=function(t){return arguments.length?(g=t,l):g},l.orient=function(t){return arguments.length?(v=t in{top:1,right:1,bottom:1,left:1}?t+"":"bottom",l):v},l.tickFormat=function(t){return arguments.length?(h=t,l):h},l.tickCentered=function(t){return arguments.length?(p=t,l):p},l.tickOffset=function(){return _},l.tickInterval=function(){var t,n;return e.isCategory?t=2*_:(n=l.g.select("path.domain").node().getTotalLength()-2*f,t=n/l.g.selectAll("line").size()),t===1/0?0:t},l.ticks=function(){return arguments.length?(d=arguments,l):d},l.tickCulling=function(t){return arguments.length?(b=t,l):b},l.tickValues=function(t){if("function"==typeof t)x=function(){return t(g.domain())};else{if(!arguments.length)return x;x=t}return l},l}var s,u,c,l={version:"0.4.11"};l.generate=function(t){return new r(t)},l.chart={fn:r.prototype,internal:{fn:i.prototype,axis:{fn:a.prototype}}},s=l.chart.fn,u=l.chart.internal.fn,c=l.chart.internal.axis.fn,u.beforeInit=function(){},u.afterInit=function(){},u.init=function(){var t=this,e=t.config;if(t.initParams(),e.data_url)t.convertUrlToData(e.data_url,e.data_mimeType,e.data_headers,e.data_keys,t.initWithData);else if(e.data_json)t.initWithData(t.convertJsonToData(e.data_json,e.data_keys));else if(e.data_rows)t.initWithData(t.convertRowsToData(e.data_rows));else{if(!e.data_columns)throw Error("url or json or rows or columns is required.");t.initWithData(t.convertColumnsToData(e.data_columns))}},u.initParams=function(){var t=this,e=t.d3,n=t.config;t.clipId="c3-"+ +new Date+"-clip",t.clipIdForXAxis=t.clipId+"-xaxis",t.clipIdForYAxis=t.clipId+"-yaxis",t.clipIdForGrid=t.clipId+"-grid",t.clipIdForSubchart=t.clipId+"-subchart",t.clipPath=t.getClipPath(t.clipId),t.clipPathForXAxis=t.getClipPath(t.clipIdForXAxis),t.clipPathForYAxis=t.getClipPath(t.clipIdForYAxis),t.clipPathForGrid=t.getClipPath(t.clipIdForGrid),t.clipPathForSubchart=t.getClipPath(t.clipIdForSubchart),t.dragStart=null,t.dragging=!1,t.flowing=!1,t.cancelClick=!1,t.mouseover=!1,t.transiting=!1,t.color=t.generateColor(),t.levelColor=t.generateLevelColor(),t.dataTimeFormat=n.data_xLocaltime?e.time.format:e.time.format.utc,t.axisTimeFormat=n.axis_x_localtime?e.time.format:e.time.format.utc,t.defaultAxisTimeFormat=t.axisTimeFormat.multi([[".%L",function(t){return t.getMilliseconds()}],[":%S",function(t){return t.getSeconds()}],["%I:%M",function(t){return t.getMinutes()}],["%I %p",function(t){return t.getHours()}],["%-m/%-d",function(t){return t.getDay()&&1!==t.getDate()}],["%-m/%-d",function(t){return 1!==t.getDate()}],["%-m/%-d",function(t){return t.getMonth()}],["%Y/%-m/%-d",function(){return!0}]]),t.hiddenTargetIds=[],t.hiddenLegendIds=[],t.focusedTargetIds=[],t.defocusedTargetIds=[],t.xOrient=n.axis_rotated?"left":"bottom",t.yOrient=n.axis_rotated?n.axis_y_inner?"top":"bottom":n.axis_y_inner?"right":"left",t.y2Orient=n.axis_rotated?n.axis_y2_inner?"bottom":"top":n.axis_y2_inner?"left":"right",t.subXOrient=n.axis_rotated?"left":"bottom",t.isLegendRight="right"===n.legend_position,t.isLegendInset="inset"===n.legend_position,t.isLegendTop="top-left"===n.legend_inset_anchor||"top-right"===n.legend_inset_anchor,t.isLegendLeft="top-left"===n.legend_inset_anchor||"bottom-left"===n.legend_inset_anchor,t.legendStep=0,t.legendItemWidth=0,t.legendItemHeight=0,t.currentMaxTickWidths={x:0,y:0,y2:0},t.rotated_padding_left=30,t.rotated_padding_right=n.axis_rotated&&!n.axis_x_show?0:30,t.rotated_padding_top=5,t.withoutFadeIn={},t.intervalForObserveInserted=void 0,t.axes.subx=e.selectAll([])},u.initChartElements=function(){this.initBar&&this.initBar(),this.initLine&&this.initLine(),this.initArc&&this.initArc(),this.initGauge&&this.initGauge(),this.initText&&this.initText()},u.initWithData=function(t){var e,n,r=this,i=r.d3,o=r.config,s=!0;r.axis=new a(r),r.initPie&&r.initPie(),r.initBrush&&r.initBrush(),r.initZoom&&r.initZoom(),o.bindto?"function"==typeof o.bindto.node?r.selectChart=o.bindto:r.selectChart=i.select(o.bindto):r.selectChart=i.selectAll([]),r.selectChart.empty()&&(r.selectChart=i.select(document.createElement("div")).style("opacity",0),r.observeInserted(r.selectChart),s=!1),r.selectChart.html("").classed("c3",!0),r.data.xs={},r.data.targets=r.convertDataToTargets(t),o.data_filter&&(r.data.targets=r.data.targets.filter(o.data_filter)),o.data_hide&&r.addHiddenTargetIds(o.data_hide===!0?r.mapToIds(r.data.targets):o.data_hide),o.legend_hide&&r.addHiddenLegendIds(o.legend_hide===!0?r.mapToIds(r.data.targets):o.legend_hide),r.hasType("gauge")&&(o.legend_show=!1),r.updateSizes(),r.updateScales(),r.x.domain(i.extent(r.getXDomain(r.data.targets))),r.y.domain(r.getYDomain(r.data.targets,"y")),r.y2.domain(r.getYDomain(r.data.targets,"y2")),r.subX.domain(r.x.domain()),r.subY.domain(r.y.domain()),r.subY2.domain(r.y2.domain()),r.orgXDomain=r.x.domain(),r.brush&&r.brush.scale(r.subX),o.zoom_enabled&&r.zoom.scale(r.x),r.svg=r.selectChart.append("svg").style("overflow","hidden").on("mouseenter",function(){return o.onmouseover.call(r)}).on("mouseleave",function(){return o.onmouseout.call(r)}),r.config.svg_classname&&r.svg.attr("class",r.config.svg_classname),e=r.svg.append("defs"),r.clipChart=r.appendClip(e,r.clipId),r.clipXAxis=r.appendClip(e,r.clipIdForXAxis),r.clipYAxis=r.appendClip(e,r.clipIdForYAxis),r.clipGrid=r.appendClip(e,r.clipIdForGrid),r.clipSubchart=r.appendClip(e,r.clipIdForSubchart),r.updateSvgSize(),n=r.main=r.svg.append("g").attr("transform",r.getTranslate("main")),r.initSubchart&&r.initSubchart(),r.initTooltip&&r.initTooltip(),r.initLegend&&r.initLegend(),r.initTitle&&r.initTitle(),n.append("text").attr("class",f.text+" "+f.empty).attr("text-anchor","middle").attr("dominant-baseline","middle"),r.initRegion(),r.initGrid(),n.append("g").attr("clip-path",r.clipPath).attr("class",f.chart),o.grid_lines_front&&r.initGridLines(),r.initEventRect(),r.initChartElements(),n.insert("rect",o.zoom_privileged?null:"g."+f.regions).attr("class",f.zoomRect).attr("width",r.width).attr("height",r.height).style("opacity",0).on("dblclick.zoom",null),o.axis_x_extent&&r.brush.extent(r.getDefaultExtent()),r.axis.init(),r.updateTargets(r.data.targets),s&&(r.updateDimension(),r.config.oninit.call(r),r.redraw({withTransition:!1,withTransform:!0,withUpdateXDomain:!0,withUpdateOrgXDomain:!0,withTransitionForAxis:!1})),r.bindResize(),r.api.element=r.selectChart.node()},u.smoothLines=function(t,e){var n=this;"grid"===e&&t.each(function(){var t=n.d3.select(this),e=t.attr("x1"),r=t.attr("x2"),i=t.attr("y1"),a=t.attr("y2");t.attr({x1:Math.ceil(e),x2:Math.ceil(r),y1:Math.ceil(i),y2:Math.ceil(a)})})},u.updateSizes=function(){var t=this,e=t.config,n=t.legend?t.getLegendHeight():0,r=t.legend?t.getLegendWidth():0,i=t.isLegendRight||t.isLegendInset?0:n,a=t.hasArcType(),o=e.axis_rotated||a?0:t.getHorizontalAxisHeight("x"),s=e.subchart_show&&!a?e.subchart_size_height+o:0;t.currentWidth=t.getCurrentWidth(),t.currentHeight=t.getCurrentHeight(),t.margin=e.axis_rotated?{top:t.getHorizontalAxisHeight("y2")+t.getCurrentPaddingTop(),right:a?0:t.getCurrentPaddingRight(),bottom:t.getHorizontalAxisHeight("y")+i+t.getCurrentPaddingBottom(),left:s+(a?0:t.getCurrentPaddingLeft())}:{top:4+t.getCurrentPaddingTop(),right:a?0:t.getCurrentPaddingRight(),bottom:o+s+i+t.getCurrentPaddingBottom(),left:a?0:t.getCurrentPaddingLeft()},t.margin2=e.axis_rotated?{top:t.margin.top,right:NaN,bottom:20+i,left:t.rotated_padding_left}:{top:t.currentHeight-s-i,right:NaN,bottom:o+i,left:t.margin.left},t.margin3={top:0,right:NaN,bottom:0,left:0},t.updateSizeForLegend&&t.updateSizeForLegend(n,r),t.width=t.currentWidth-t.margin.left-t.margin.right,t.height=t.currentHeight-t.margin.top-t.margin.bottom,t.width<0&&(t.width=0),t.height<0&&(t.height=0),t.width2=e.axis_rotated?t.margin.left-t.rotated_padding_left-t.rotated_padding_right:t.width,t.height2=e.axis_rotated?t.height:t.currentHeight-t.margin2.top-t.margin2.bottom,t.width2<0&&(t.width2=0),t.height2<0&&(t.height2=0),t.arcWidth=t.width-(t.isLegendRight?r+10:0),t.arcHeight=t.height-(t.isLegendRight?0:10),t.hasType("gauge")&&!e.gauge_fullCircle&&(t.arcHeight+=t.height-t.getGaugeLabelHeight()),t.updateRadius&&t.updateRadius(),t.isLegendRight&&a&&(t.margin3.left=t.arcWidth/2+1.1*t.radiusExpanded)},u.updateTargets=function(t){var e=this;e.updateTargetsForText(t),e.updateTargetsForBar(t),e.updateTargetsForLine(t),e.hasArcType()&&e.updateTargetsForArc&&e.updateTargetsForArc(t),e.updateTargetsForSubchart&&e.updateTargetsForSubchart(t),e.showTargets()},u.showTargets=function(){var t=this;t.svg.selectAll("."+f.target).filter(function(e){return t.isTargetToShow(e.id)}).transition().duration(t.config.transition_duration).style("opacity",1)},u.redraw=function(t,e){var n,r,i,a,o,s,u,c,l,h,d,p,g,v,m,y,x,_,b,w,S,T,A,C,E,M,k,P,O,L=this,D=L.main,V=L.d3,R=L.config,I=L.getShapeIndices(L.isAreaType),N=L.getShapeIndices(L.isBarType),j=L.getShapeIndices(L.isLineType),F=L.hasArcType(),G=L.filterTargetsToShow(L.data.targets),H=L.xv.bind(L);if(t=t||{},n=$(t,"withY",!0),r=$(t,"withSubchart",!0),i=$(t,"withTransition",!0),s=$(t,"withTransform",!1),u=$(t,"withUpdateXDomain",!1),c=$(t,"withUpdateOrgXDomain",!1),l=$(t,"withTrimXDomain",!0),g=$(t,"withUpdateXAxis",u),h=$(t,"withLegend",!1),d=$(t,"withEventRect",!0),p=$(t,"withDimension",!0),a=$(t,"withTransitionForExit",i),o=$(t,"withTransitionForAxis",i),b=i?R.transition_duration:0,w=a?b:0,S=o?b:0,e=e||L.axis.generateTransitions(S),h&&R.legend_show?L.updateLegend(L.mapToIds(L.data.targets),t,e):p&&L.updateDimension(!0),L.isCategorized()&&0===G.length&&L.x.domain([0,L.axes.x.selectAll(".tick").size()]),G.length?(L.updateXDomain(G,u,c,l),R.axis_x_tick_values||(C=L.axis.updateXAxisTickValues(G))):(L.xAxis.tickValues([]),L.subXAxis.tickValues([])),R.zoom_rescale&&!t.flow&&(k=L.x.orgDomain()),L.y.domain(L.getYDomain(G,"y",k)),L.y2.domain(L.getYDomain(G,"y2",k)),!R.axis_y_tick_values&&R.axis_y_tick_count&&L.yAxis.tickValues(L.axis.generateTickValues(L.y.domain(),R.axis_y_tick_count)),!R.axis_y2_tick_values&&R.axis_y2_tick_count&&L.y2Axis.tickValues(L.axis.generateTickValues(L.y2.domain(),R.axis_y2_tick_count)),L.axis.redraw(e,F),L.axis.updateLabels(i),(u||g)&&G.length)if(R.axis_x_tick_culling&&C){for(E=1;E<C.length;E++)if(C.length/E<R.axis_x_tick_culling_max){M=E;break}L.svg.selectAll("."+f.axisX+" .tick text").each(function(t){var e=C.indexOf(t);e>=0&&V.select(this).style("display",e%M?"none":"block")})}else L.svg.selectAll("."+f.axisX+" .tick text").style("display","block");v=L.generateDrawArea?L.generateDrawArea(I,!1):void 0,m=L.generateDrawBar?L.generateDrawBar(N):void 0,y=L.generateDrawLine?L.generateDrawLine(j,!1):void 0,x=L.generateXYForText(I,N,j,!0),_=L.generateXYForText(I,N,j,!1),n&&(L.subY.domain(L.getYDomain(G,"y")),L.subY2.domain(L.getYDomain(G,"y2"))),L.updateXgridFocus(),D.select("text."+f.text+"."+f.empty).attr("x",L.width/2).attr("y",L.height/2).text(R.data_empty_label_text).transition().style("opacity",G.length?0:1),L.updateGrid(b),L.updateRegion(b),L.updateBar(w),L.updateLine(w),L.updateArea(w),L.updateCircle(),L.hasDataLabel()&&L.updateText(w),L.redrawTitle&&L.redrawTitle(),L.redrawArc&&L.redrawArc(b,w,s),L.redrawSubchart&&L.redrawSubchart(r,e,b,w,I,N,j),D.selectAll("."+f.selectedCircles).filter(L.isBarType.bind(L)).selectAll("circle").remove(),R.interaction_enabled&&!t.flow&&d&&(L.redrawEventRect(),L.updateZoom&&L.updateZoom()),L.updateCircleY(),P=(L.config.axis_rotated?L.circleY:L.circleX).bind(L),O=(L.config.axis_rotated?L.circleX:L.circleY).bind(L),t.flow&&(A=L.generateFlow({targets:G,flow:t.flow,duration:t.flow.duration,drawBar:m,drawLine:y,drawArea:v,cx:P,cy:O,xv:H,xForText:x,yForText:_})),(b||A)&&L.isTabVisible()?V.transition().duration(b).each(function(){var e=[];[L.redrawBar(m,!0),L.redrawLine(y,!0),L.redrawArea(v,!0),L.redrawCircle(P,O,!0),L.redrawText(x,_,t.flow,!0),L.redrawRegion(!0),L.redrawGrid(!0)].forEach(function(t){t.forEach(function(t){e.push(t)})}),T=L.generateWait(),e.forEach(function(t){T.add(t)})}).call(T,function(){A&&A(),R.onrendered&&R.onrendered.call(L)}):(L.redrawBar(m),L.redrawLine(y),L.redrawArea(v),L.redrawCircle(P,O),L.redrawText(x,_,t.flow),L.redrawRegion(),L.redrawGrid(),R.onrendered&&R.onrendered.call(L)),L.mapToIds(L.data.targets).forEach(function(t){L.withoutFadeIn[t]=!0})},u.updateAndRedraw=function(t){var e,n=this,r=n.config;t=t||{},t.withTransition=$(t,"withTransition",!0),t.withTransform=$(t,"withTransform",!1),t.withLegend=$(t,"withLegend",!1),t.withUpdateXDomain=!0,t.withUpdateOrgXDomain=!0,t.withTransitionForExit=!1,t.withTransitionForTransform=$(t,"withTransitionForTransform",t.withTransition),n.updateSizes(),t.withLegend&&r.legend_show||(e=n.axis.generateTransitions(t.withTransitionForAxis?r.transition_duration:0),n.updateScales(),n.updateSvgSize(),n.transformAll(t.withTransitionForTransform,e)),n.redraw(t,e)},u.redrawWithoutRescale=function(){this.redraw({withY:!1,withSubchart:!1,withEventRect:!1,withTransitionForAxis:!1})},u.isTimeSeries=function(){return"timeseries"===this.config.axis_x_type},u.isCategorized=function(){return this.config.axis_x_type.indexOf("categor")>=0},u.isCustomX=function(){var t=this,e=t.config;return!t.isTimeSeries()&&(e.data_x||b(e.data_xs))},u.isTimeSeriesY=function(){return"timeseries"===this.config.axis_y_type},u.getTranslate=function(t){var e,n,r=this,i=r.config;return"main"===t?(e=y(r.margin.left),n=y(r.margin.top)):"context"===t?(e=y(r.margin2.left),n=y(r.margin2.top)):"legend"===t?(e=r.margin3.left,n=r.margin3.top):"x"===t?(e=0,n=i.axis_rotated?0:r.height):"y"===t?(e=0,n=i.axis_rotated?r.height:0):"y2"===t?(e=i.axis_rotated?0:r.width,n=i.axis_rotated?1:0):"subx"===t?(e=0,n=i.axis_rotated?0:r.height2):"arc"===t&&(e=r.arcWidth/2,n=r.arcHeight/2),"translate("+e+","+n+")"},u.initialOpacity=function(t){return null!==t.value&&this.withoutFadeIn[t.id]?1:0},u.initialOpacityForCircle=function(t){return null!==t.value&&this.withoutFadeIn[t.id]?this.opacityForCircle(t):0},u.opacityForCircle=function(t){var e=this.config.point_show?1:0;return h(t.value)?this.isScatterType(t)?.5:e:0},u.opacityForText=function(){return this.hasDataLabel()?1:0},u.xx=function(t){return t?this.x(t.x):null},u.xv=function(t){var e=this,n=t.value;return e.isTimeSeries()?n=e.parseDate(t.value):e.isCategorized()&&"string"==typeof t.value&&(n=e.config.axis_x_categories.indexOf(t.value)),Math.ceil(e.x(n))},u.yv=function(t){var e=this,n=t.axis&&"y2"===t.axis?e.y2:e.y;return Math.ceil(n(t.value))},u.subxx=function(t){return t?this.subX(t.x):null},u.transformMain=function(t,e){var n,r,i,a=this;e&&e.axisX?n=e.axisX:(n=a.main.select("."+f.axisX),t&&(n=n.transition())),e&&e.axisY?r=e.axisY:(r=a.main.select("."+f.axisY),t&&(r=r.transition())),e&&e.axisY2?i=e.axisY2:(i=a.main.select("."+f.axisY2),t&&(i=i.transition())),(t?a.main.transition():a.main).attr("transform",a.getTranslate("main")),n.attr("transform",a.getTranslate("x")),r.attr("transform",a.getTranslate("y")),i.attr("transform",a.getTranslate("y2")),a.main.select("."+f.chartArcs).attr("transform",a.getTranslate("arc"))},u.transformAll=function(t,e){var n=this;n.transformMain(t,e),n.config.subchart_show&&n.transformContext(t,e),n.legend&&n.transformLegend(t)},u.updateSvgSize=function(){var t=this,e=t.svg.select(".c3-brush .background");t.svg.attr("width",t.currentWidth).attr("height",t.currentHeight),t.svg.selectAll(["#"+t.clipId,"#"+t.clipIdForGrid]).select("rect").attr("width",t.width).attr("height",t.height),t.svg.select("#"+t.clipIdForXAxis).select("rect").attr("x",t.getXAxisClipX.bind(t)).attr("y",t.getXAxisClipY.bind(t)).attr("width",t.getXAxisClipWidth.bind(t)).attr("height",t.getXAxisClipHeight.bind(t)),t.svg.select("#"+t.clipIdForYAxis).select("rect").attr("x",t.getYAxisClipX.bind(t)).attr("y",t.getYAxisClipY.bind(t)).attr("width",t.getYAxisClipWidth.bind(t)).attr("height",t.getYAxisClipHeight.bind(t)),t.svg.select("#"+t.clipIdForSubchart).select("rect").attr("width",t.width).attr("height",e.size()?e.attr("height"):0),t.svg.select("."+f.zoomRect).attr("width",t.width).attr("height",t.height),t.selectChart.style("max-height",t.currentHeight+"px")},u.updateDimension=function(t){var e=this;t||(e.config.axis_rotated?(e.axes.x.call(e.xAxis),e.axes.subx.call(e.subXAxis)):(e.axes.y.call(e.yAxis),e.axes.y2.call(e.y2Axis))),e.updateSizes(),e.updateScales(),e.updateSvgSize(),e.transformAll(!1)},u.observeInserted=function(e){var n,r=this;return"undefined"==typeof MutationObserver?void t.console.error("MutationObserver not defined."):(n=new MutationObserver(function(i){i.forEach(function(i){"childList"===i.type&&i.previousSibling&&(n.disconnect(),r.intervalForObserveInserted=t.setInterval(function(){e.node().parentNode&&(t.clearInterval(r.intervalForObserveInserted),r.updateDimension(),r.brush&&r.brush.update(),r.config.oninit.call(r),r.redraw({withTransform:!0,withUpdateXDomain:!0,withUpdateOrgXDomain:!0,withTransition:!1,withTransitionForTransform:!1,withLegend:!0}),e.transition().style("opacity",1))},10))})}),void n.observe(e.node(),{attributes:!0,childList:!0,characterData:!0}))},u.bindResize=function(){var e=this,n=e.config;if(e.resizeFunction=e.generateResize(),e.resizeFunction.add(function(){n.onresize.call(e)}),n.resize_auto&&e.resizeFunction.add(function(){void 0!==e.resizeTimeout&&t.clearTimeout(e.resizeTimeout),e.resizeTimeout=t.setTimeout(function(){delete e.resizeTimeout,e.api.flush()},100)}),e.resizeFunction.add(function(){n.onresized.call(e)}),t.attachEvent)t.attachEvent("onresize",e.resizeFunction);else if(t.addEventListener)t.addEventListener("resize",e.resizeFunction,!1);else{var r=t.onresize;r?r.add&&r.remove||(r=e.generateResize(),r.add(t.onresize)):r=e.generateResize(),r.add(e.resizeFunction),t.onresize=r}},u.generateResize=function(){function t(){e.forEach(function(t){t()})}var e=[];return t.add=function(t){e.push(t)},t.remove=function(t){for(var n=0;n<e.length;n++)if(e[n]===t){e.splice(n,1);break}},t},u.endall=function(t,e){var n=0;t.each(function(){++n}).each("end",function(){--n||e.apply(this,arguments)})},u.generateWait=function(){var t=[],e=function(e,n){var r=setInterval(function(){var e=0;t.forEach(function(t){if(t.empty())return void(e+=1);try{t.transition()}catch(t){e+=1}}),e===t.length&&(clearInterval(r),n&&n())},10)};return e.add=function(e){t.push(e)},e},u.parseDate=function(e){var n,r=this;return e instanceof Date?n=e:"string"==typeof e?n=r.dataTimeFormat(r.config.data_xFormat).parse(e):"number"!=typeof e||isNaN(e)||(n=new Date((+e))),n&&!isNaN(+n)||t.console.error("Failed to parse x '"+e+"' to Date object"),n},u.isTabVisible=function(){var t;return"undefined"!=typeof document.hidden?t="hidden":"undefined"!=typeof document.mozHidden?t="mozHidden":"undefined"!=typeof document.msHidden?t="msHidden":"undefined"!=typeof document.webkitHidden&&(t="webkitHidden"),!document[t]},u.getDefaultConfig=function(){var t={bindto:"#chart",svg_classname:void 0,size_width:void 0,size_height:void 0,padding_left:void 0,padding_right:void 0,padding_top:void 0,padding_bottom:void 0,resize_auto:!0,zoom_enabled:!1,zoom_extent:void 0,zoom_privileged:!1,zoom_rescale:!1,zoom_onzoom:function(){},zoom_onzoomstart:function(){},zoom_onzoomend:function(){},zoom_x_min:void 0,zoom_x_max:void 0,interaction_brighten:!0,interaction_enabled:!0,onmouseover:function(){},onmouseout:function(){},onresize:function(){},onresized:function(){},oninit:function(){},onrendered:function(){},transition_duration:350,data_x:void 0,data_xs:{},data_xFormat:"%Y-%m-%d",data_xLocaltime:!0,data_xSort:!0,data_idConverter:function(t){return t},data_names:{},data_classes:{},data_groups:[],data_axes:{},data_type:void 0,data_types:{},data_labels:{},data_order:"desc",data_regions:{},data_color:void 0,data_colors:{},data_hide:!1,data_filter:void 0,data_selection_enabled:!1,data_selection_grouped:!1,data_selection_isselectable:function(){return!0},data_selection_multiple:!0,data_selection_draggable:!1,data_onclick:function(){},data_onmouseover:function(){},data_onmouseout:function(){},data_onselected:function(){},data_onunselected:function(){},data_url:void 0,data_headers:void 0,data_json:void 0,data_rows:void 0,data_columns:void 0,data_mimeType:void 0,data_keys:void 0,data_empty_label_text:"",subchart_show:!1,subchart_size_height:60,subchart_axis_x_show:!0,subchart_onbrush:function(){},color_pattern:[],color_threshold:{},legend_show:!0,legend_hide:!1,legend_position:"bottom",legend_inset_anchor:"top-left",legend_inset_x:10,legend_inset_y:0,legend_inset_step:void 0,legend_item_onclick:void 0,legend_item_onmouseover:void 0,legend_item_onmouseout:void 0,legend_equally:!1,legend_padding:0,legend_item_tile_width:10,legend_item_tile_height:10,axis_rotated:!1,axis_x_show:!0,axis_x_type:"indexed",axis_x_localtime:!0,axis_x_categories:[],axis_x_tick_centered:!1,axis_x_tick_format:void 0,axis_x_tick_culling:{},axis_x_tick_culling_max:10,axis_x_tick_count:void 0,axis_x_tick_fit:!0,axis_x_tick_values:null,axis_x_tick_rotate:0,axis_x_tick_outer:!0,axis_x_tick_multiline:!0,axis_x_tick_width:null,axis_x_max:void 0,axis_x_min:void 0,axis_x_padding:{},axis_x_height:void 0,axis_x_extent:void 0,axis_x_label:{},axis_y_show:!0,axis_y_type:void 0,axis_y_max:void 0,axis_y_min:void 0,axis_y_inverted:!1,axis_y_center:void 0,axis_y_inner:void 0,axis_y_label:{},axis_y_tick_format:void 0,axis_y_tick_outer:!0,axis_y_tick_values:null,axis_y_tick_rotate:0,axis_y_tick_count:void 0,axis_y_tick_time_value:void 0,axis_y_tick_time_interval:void 0,axis_y_padding:{},axis_y_default:void 0,axis_y2_show:!1,axis_y2_max:void 0,axis_y2_min:void 0,axis_y2_inverted:!1,axis_y2_center:void 0,axis_y2_inner:void 0,axis_y2_label:{},axis_y2_tick_format:void 0,axis_y2_tick_outer:!0,axis_y2_tick_values:null,axis_y2_tick_count:void 0,axis_y2_padding:{},axis_y2_default:void 0,grid_x_show:!1,grid_x_type:"tick",grid_x_lines:[],grid_y_show:!1,grid_y_lines:[],grid_y_ticks:10,grid_focus_show:!0,grid_lines_front:!0,point_show:!0,point_r:2.5,point_sensitivity:10,point_focus_expand_enabled:!0,point_focus_expand_r:void 0,point_select_r:void 0,line_connectNull:!1,line_step_type:"step",bar_width:void 0,bar_width_ratio:.6,bar_width_max:void 0,bar_zerobased:!0,area_zerobased:!0,area_above:!1,pie_label_show:!0,pie_label_format:void 0,pie_label_threshold:.05,pie_label_ratio:void 0,pie_expand:{},pie_expand_duration:50,gauge_fullCircle:!1,gauge_label_show:!0,gauge_label_format:void 0,gauge_min:0,gauge_max:100,gauge_startingAngle:-1*Math.PI/2,gauge_units:void 0,gauge_width:void 0,gauge_expand:{},gauge_expand_duration:50,donut_label_show:!0,donut_label_format:void 0,donut_label_threshold:.05,donut_label_ratio:void 0,donut_width:void 0,donut_title:"",donut_expand:{},donut_expand_duration:50,spline_interpolation_type:"cardinal",regions:[],tooltip_show:!0,tooltip_grouped:!0,tooltip_format_title:void 0,tooltip_format_name:void 0,tooltip_format_value:void 0,tooltip_position:void 0,tooltip_contents:function(t,e,n,r){return this.getTooltipContent?this.getTooltipContent(t,e,n,r):""},tooltip_init_show:!1,tooltip_init_x:0,tooltip_init_position:{top:"0px",left:"50px"},tooltip_onshow:function(){},tooltip_onhide:function(){},title_text:void 0,title_padding:{top:0,right:0,bottom:0,left:0},title_position:"top-center"};return Object.keys(this.additionalConfig).forEach(function(e){t[e]=this.additionalConfig[e]},this),t},u.additionalConfig={},u.loadConfig=function(t){function e(){var t=r.shift();return t&&n&&"object"==typeof n&&t in n?(n=n[t],e()):t?void 0:n}var n,r,i,a=this.config;Object.keys(a).forEach(function(o){n=t,r=o.split("_"),i=e(),v(i)&&(a[o]=i)})},u.getScale=function(t,e,n){return(n?this.d3.time.scale():this.d3.scale.linear()).range([t,e])},u.getX=function(t,e,n,r){var i,a=this,o=a.getScale(t,e,a.isTimeSeries()),s=n?o.domain(n):o;a.isCategorized()?(r=r||function(){return 0},o=function(t,e){var n=s(t)+r(t);return e?n:Math.ceil(n)}):o=function(t,e){var n=s(t);return e?n:Math.ceil(n)};for(i in s)o[i]=s[i];return o.orgDomain=function(){return s.domain()},a.isCategorized()&&(o.domain=function(t){return arguments.length?(s.domain(t),o):(t=this.orgDomain(),[t[0],t[1]+1])}),o},u.getY=function(t,e,n){var r=this.getScale(t,e,this.isTimeSeriesY());return n&&r.domain(n),r},u.getYScale=function(t){return"y2"===this.axis.getId(t)?this.y2:this.y},u.getSubYScale=function(t){return"y2"===this.axis.getId(t)?this.subY2:this.subY},u.updateScales=function(){var t=this,e=t.config,n=!t.x;t.xMin=e.axis_rotated?1:0,t.xMax=e.axis_rotated?t.height:t.width,t.yMin=e.axis_rotated?0:t.height,t.yMax=e.axis_rotated?t.width:1,t.subXMin=t.xMin,t.subXMax=t.xMax,t.subYMin=e.axis_rotated?0:t.height2,t.subYMax=e.axis_rotated?t.width2:1,t.x=t.getX(t.xMin,t.xMax,n?void 0:t.x.orgDomain(),function(){return t.xAxis.tickOffset()}),t.y=t.getY(t.yMin,t.yMax,n?e.axis_y_default:t.y.domain()),t.y2=t.getY(t.yMin,t.yMax,n?e.axis_y2_default:t.y2.domain()),t.subX=t.getX(t.xMin,t.xMax,t.orgXDomain,function(e){return e%1?0:t.subXAxis.tickOffset()}),t.subY=t.getY(t.subYMin,t.subYMax,n?e.axis_y_default:t.subY.domain()),t.subY2=t.getY(t.subYMin,t.subYMax,n?e.axis_y2_default:t.subY2.domain()),t.xAxisTickFormat=t.axis.getXAxisTickFormat(),t.xAxisTickValues=t.axis.getXAxisTickValues(),t.yAxisTickValues=t.axis.getYAxisTickValues(),t.y2AxisTickValues=t.axis.getY2AxisTickValues(),t.xAxis=t.axis.getXAxis(t.x,t.xOrient,t.xAxisTickFormat,t.xAxisTickValues,e.axis_x_tick_outer),t.subXAxis=t.axis.getXAxis(t.subX,t.subXOrient,t.xAxisTickFormat,t.xAxisTickValues,e.axis_x_tick_outer),t.yAxis=t.axis.getYAxis(t.y,t.yOrient,e.axis_y_tick_format,t.yAxisTickValues,e.axis_y_tick_outer),t.y2Axis=t.axis.getYAxis(t.y2,t.y2Orient,e.axis_y2_tick_format,t.y2AxisTickValues,e.axis_y2_tick_outer),n||(t.brush&&t.brush.scale(t.subX),e.zoom_enabled&&t.zoom.scale(t.x)),t.updateArc&&t.updateArc()},u.getYDomainMin=function(t){var e,n,r,i,a,o,s=this,u=s.config,c=s.mapToIds(t),l=s.getValuesAsIdKeyed(t);if(u.data_groups.length>0)for(o=s.hasNegativeValueInTargets(t),e=0;e<u.data_groups.length;e++)if(i=u.data_groups[e].filter(function(t){return c.indexOf(t)>=0}),0!==i.length)for(r=i[0],o&&l[r]&&l[r].forEach(function(t,e){l[r][e]=t<0?t:0}),n=1;n<i.length;n++)a=i[n],l[a]&&l[a].forEach(function(t,e){s.axis.getId(a)!==s.axis.getId(r)||!l[r]||o&&+t>0||(l[r][e]+=+t)});return s.d3.min(Object.keys(l).map(function(t){return s.d3.min(l[t])}))},u.getYDomainMax=function(t){var e,n,r,i,a,o,s=this,u=s.config,c=s.mapToIds(t),l=s.getValuesAsIdKeyed(t);if(u.data_groups.length>0)for(o=s.hasPositiveValueInTargets(t),e=0;e<u.data_groups.length;e++)if(i=u.data_groups[e].filter(function(t){return c.indexOf(t)>=0}),0!==i.length)for(r=i[0],o&&l[r]&&l[r].forEach(function(t,e){l[r][e]=t>0?t:0}),n=1;n<i.length;n++)a=i[n],l[a]&&l[a].forEach(function(t,e){s.axis.getId(a)!==s.axis.getId(r)||!l[r]||o&&+t<0||(l[r][e]+=+t)});return s.d3.max(Object.keys(l).map(function(t){return s.d3.max(l[t])}))},u.getYDomain=function(t,e,n){var r,i,a,o,s,u,c,l,f,d,p,g=this,v=g.config,m=t.filter(function(t){return g.axis.getId(t.id)===e}),y=n?g.filterByXDomain(m,n):m,_="y2"===e?v.axis_y2_min:v.axis_y_min,$="y2"===e?v.axis_y2_max:v.axis_y_max,w=g.getYDomainMin(y),S=g.getYDomainMax(y),T="y2"===e?v.axis_y2_center:v.axis_y_center,A=g.hasType("bar",y)&&v.bar_zerobased||g.hasType("area",y)&&v.area_zerobased,C="y2"===e?v.axis_y2_inverted:v.axis_y_inverted,E=g.hasDataLabel()&&v.axis_rotated,M=g.hasDataLabel()&&!v.axis_rotated;return w=h(_)?_:h($)?w<$?w:$-10:w,S=h($)?$:h(_)?_<S?S:_+10:S,0===y.length?"y2"===e?g.y2.domain():g.y.domain():(isNaN(w)&&(w=0),isNaN(S)&&(S=w),w===S&&(w<0?S=0:w=0),d=w>=0&&S>=0,p=w<=0&&S<=0,(h(_)&&d||h($)&&p)&&(A=!1),A&&(d&&(w=0),p&&(S=0)),i=Math.abs(S-w),a=o=s=.1*i,"undefined"!=typeof T&&(u=Math.max(Math.abs(w),Math.abs(S)),S=T+u,w=T-u),E?(c=g.getDataLabelLength(w,S,"width"),l=x(g.y.range()),f=[c[0]/l,c[1]/l],o+=i*(f[1]/(1-f[0]-f[1])),s+=i*(f[0]/(1-f[0]-f[1]))):M&&(c=g.getDataLabelLength(w,S,"height"),o+=g.axis.convertPixelsToAxisPadding(c[1],i),s+=g.axis.convertPixelsToAxisPadding(c[0],i)),"y"===e&&b(v.axis_y_padding)&&(o=g.axis.getPadding(v.axis_y_padding,"top",o,i),s=g.axis.getPadding(v.axis_y_padding,"bottom",s,i)),"y2"===e&&b(v.axis_y2_padding)&&(o=g.axis.getPadding(v.axis_y2_padding,"top",o,i),s=g.axis.getPadding(v.axis_y2_padding,"bottom",s,i)),A&&(d&&(s=w),p&&(o=-S)),r=[w-s,S+o],C?r.reverse():r)},u.getXDomainMin=function(t){var e=this,n=e.config;return v(n.axis_x_min)?e.isTimeSeries()?this.parseDate(n.axis_x_min):n.axis_x_min:e.d3.min(t,function(t){return e.d3.min(t.values,function(t){return t.x})})},u.getXDomainMax=function(t){var e=this,n=e.config;return v(n.axis_x_max)?e.isTimeSeries()?this.parseDate(n.axis_x_max):n.axis_x_max:e.d3.max(t,function(t){return e.d3.max(t.values,function(t){return t.x})})},u.getXDomainPadding=function(t){var e,n,r,i,a=this,o=a.config,s=t[1]-t[0];return a.isCategorized()?n=0:a.hasType("bar")?(e=a.getMaxDataCount(),n=e>1?s/(e-1)/2:.5):n=.01*s,"object"==typeof o.axis_x_padding&&b(o.axis_x_padding)?(r=h(o.axis_x_padding.left)?o.axis_x_padding.left:n,i=h(o.axis_x_padding.right)?o.axis_x_padding.right:n):r=i="number"==typeof o.axis_x_padding?o.axis_x_padding:n,{left:r,right:i}},u.getXDomain=function(t){var e=this,n=[e.getXDomainMin(t),e.getXDomainMax(t)],r=n[0],i=n[1],a=e.getXDomainPadding(n),o=0,s=0;return r-i!==0||e.isCategorized()||(e.isTimeSeries()?(r=new Date(.5*r.getTime()),i=new Date(1.5*i.getTime())):(r=0===r?1:.5*r,i=0===i?-1:1.5*i)),(r||0===r)&&(o=e.isTimeSeries()?new Date(r.getTime()-a.left):r-a.left),(i||0===i)&&(s=e.isTimeSeries()?new Date(i.getTime()+a.right):i+a.right),[o,s]},u.updateXDomain=function(t,e,n,r,i){var a=this,o=a.config;return n&&(a.x.domain(i?i:a.d3.extent(a.getXDomain(t))),a.orgXDomain=a.x.domain(),o.zoom_enabled&&a.zoom.scale(a.x).updateScaleExtent(),a.subX.domain(a.x.domain()),a.brush&&a.brush.scale(a.subX)),e&&(a.x.domain(i?i:!a.brush||a.brush.empty()?a.orgXDomain:a.brush.extent()),o.zoom_enabled&&a.zoom.scale(a.x).updateScaleExtent()),r&&a.x.domain(a.trimXDomain(a.x.orgDomain())),a.x.domain()},u.trimXDomain=function(t){var e=this.getZoomDomain(),n=e[0],r=e[1];return t[0]<=n&&(t[1]=+t[1]+(n-t[0]),t[0]=n),r<=t[1]&&(t[0]=+t[0]-(t[1]-r),t[1]=r),t},u.isX=function(t){var e=this,n=e.config;return n.data_x&&t===n.data_x||b(n.data_xs)&&w(n.data_xs,t)},u.isNotX=function(t){return!this.isX(t)},u.getXKey=function(t){var e=this,n=e.config;return n.data_x?n.data_x:b(n.data_xs)?n.data_xs[t]:null},u.getXValuesOfXKey=function(t,e){var n,r=this,i=e&&b(e)?r.mapToIds(e):[];
return i.forEach(function(e){r.getXKey(e)===t&&(n=r.data.xs[e])}),n},u.getIndexByX=function(t){var e=this,n=e.filterByX(e.data.targets,t);return n.length?n[0].index:null},u.getXValue=function(t,e){var n=this;return t in n.data.xs&&n.data.xs[t]&&h(n.data.xs[t][e])?n.data.xs[t][e]:e},u.getOtherTargetXs=function(){var t=this,e=Object.keys(t.data.xs);return e.length?t.data.xs[e[0]]:null},u.getOtherTargetX=function(t){var e=this.getOtherTargetXs();return e&&t<e.length?e[t]:null},u.addXs=function(t){var e=this;Object.keys(t).forEach(function(n){e.config.data_xs[n]=t[n]})},u.hasMultipleX=function(t){return this.d3.set(Object.keys(t).map(function(e){return t[e]})).size()>1},u.isMultipleX=function(){return b(this.config.data_xs)||!this.config.data_xSort||this.hasType("scatter")},u.addName=function(t){var e,n=this;return t&&(e=n.config.data_names[t.id],t.name=void 0!==e?e:t.id),t},u.getValueOnIndex=function(t,e){var n=t.filter(function(t){return t.index===e});return n.length?n[0]:null},u.updateTargetX=function(t,e){var n=this;t.forEach(function(t){t.values.forEach(function(r,i){r.x=n.generateTargetX(e[i],t.id,i)}),n.data.xs[t.id]=e})},u.updateTargetXs=function(t,e){var n=this;t.forEach(function(t){e[t.id]&&n.updateTargetX([t],e[t.id])})},u.generateTargetX=function(t,e,n){var r,i=this;return r=i.isTimeSeries()?t?i.parseDate(t):i.parseDate(i.getXValue(e,n)):i.isCustomX()&&!i.isCategorized()?h(t)?+t:i.getXValue(e,n):n},u.cloneTarget=function(t){return{id:t.id,id_org:t.id_org,values:t.values.map(function(t){return{x:t.x,value:t.value,id:t.id}})}},u.updateXs=function(){var t=this;t.data.targets.length&&(t.xs=[],t.data.targets[0].values.forEach(function(e){t.xs[e.index]=e.x}))},u.getPrevX=function(t){var e=this.xs[t-1];return"undefined"!=typeof e?e:null},u.getNextX=function(t){var e=this.xs[t+1];return"undefined"!=typeof e?e:null},u.getMaxDataCount=function(){var t=this;return t.d3.max(t.data.targets,function(t){return t.values.length})},u.getMaxDataCountTarget=function(t){var e,n=t.length,r=0;return n>1?t.forEach(function(t){t.values.length>r&&(e=t,r=t.values.length)}):e=n?t[0]:null,e},u.getEdgeX=function(t){var e=this;return t.length?[e.d3.min(t,function(t){return t.values[0].x}),e.d3.max(t,function(t){return t.values[t.values.length-1].x})]:[0,0]},u.mapToIds=function(t){return t.map(function(t){return t.id})},u.mapToTargetIds=function(t){var e=this;return t?[].concat(t):e.mapToIds(e.data.targets)},u.hasTarget=function(t,e){var n,r=this.mapToIds(t);for(n=0;n<r.length;n++)if(r[n]===e)return!0;return!1},u.isTargetToShow=function(t){return this.hiddenTargetIds.indexOf(t)<0},u.isLegendToShow=function(t){return this.hiddenLegendIds.indexOf(t)<0},u.filterTargetsToShow=function(t){var e=this;return t.filter(function(t){return e.isTargetToShow(t.id)})},u.mapTargetsToUniqueXs=function(t){var e=this,n=e.d3.set(e.d3.merge(t.map(function(t){return t.values.map(function(t){return+t.x})}))).values();return n=e.isTimeSeries()?n.map(function(t){return new Date((+t))}):n.map(function(t){return+t}),n.sort(function(t,e){return t<e?-1:t>e?1:t>=e?0:NaN})},u.addHiddenTargetIds=function(t){this.hiddenTargetIds=this.hiddenTargetIds.concat(t)},u.removeHiddenTargetIds=function(t){this.hiddenTargetIds=this.hiddenTargetIds.filter(function(e){return t.indexOf(e)<0})},u.addHiddenLegendIds=function(t){this.hiddenLegendIds=this.hiddenLegendIds.concat(t)},u.removeHiddenLegendIds=function(t){this.hiddenLegendIds=this.hiddenLegendIds.filter(function(e){return t.indexOf(e)<0})},u.getValuesAsIdKeyed=function(t){var e={};return t.forEach(function(t){e[t.id]=[],t.values.forEach(function(n){e[t.id].push(n.value)})}),e},u.checkValueInTargets=function(t,e){var n,r,i,a=Object.keys(t);for(n=0;n<a.length;n++)for(i=t[a[n]].values,r=0;r<i.length;r++)if(e(i[r].value))return!0;return!1},u.hasNegativeValueInTargets=function(t){return this.checkValueInTargets(t,function(t){return t<0})},u.hasPositiveValueInTargets=function(t){return this.checkValueInTargets(t,function(t){return t>0})},u.isOrderDesc=function(){var t=this.config;return"string"==typeof t.data_order&&"desc"===t.data_order.toLowerCase()},u.isOrderAsc=function(){var t=this.config;return"string"==typeof t.data_order&&"asc"===t.data_order.toLowerCase()},u.orderTargets=function(t){var e=this,n=e.config,r=e.isOrderAsc(),i=e.isOrderDesc();return r||i?t.sort(function(t,e){var n=function(t,e){return t+Math.abs(e.value)},i=t.values.reduce(n,0),a=e.values.reduce(n,0);return r?a-i:i-a}):d(n.data_order)&&t.sort(n.data_order),t},u.filterByX=function(t,e){return this.d3.merge(t.map(function(t){return t.values})).filter(function(t){return t.x-e===0})},u.filterRemoveNull=function(t){return t.filter(function(t){return h(t.value)})},u.filterByXDomain=function(t,e){return t.map(function(t){return{id:t.id,id_org:t.id_org,values:t.values.filter(function(t){return e[0]<=t.x&&t.x<=e[1]})}})},u.hasDataLabel=function(){var t=this.config;return!("boolean"!=typeof t.data_labels||!t.data_labels)||!("object"!=typeof t.data_labels||!b(t.data_labels))},u.getDataLabelLength=function(t,e,n){var r=this,i=[0,0],a=1.3;return r.selectChart.select("svg").selectAll(".dummy").data([t,e]).enter().append("text").text(function(t){return r.dataLabelFormat(t.id)(t)}).each(function(t,e){i[e]=this.getBoundingClientRect()[n]*a}).remove(),i},u.isNoneArc=function(t){return this.hasTarget(this.data.targets,t.id)},u.isArc=function(t){return"data"in t&&this.hasTarget(this.data.targets,t.data.id)},u.findSameXOfValues=function(t,e){var n,r=t[e].x,i=[];for(n=e-1;n>=0&&r===t[n].x;n--)i.push(t[n]);for(n=e;n<t.length&&r===t[n].x;n++)i.push(t[n]);return i},u.findClosestFromTargets=function(t,e){var n,r=this;return n=t.map(function(t){return r.findClosest(t.values,e)}),r.findClosest(n,e)},u.findClosest=function(t,e){var n,r=this,i=r.config.point_sensitivity;return t.filter(function(t){return t&&r.isBarType(t.id)}).forEach(function(t){var e=r.main.select("."+f.bars+r.getTargetSelectorSuffix(t.id)+" ."+f.bar+"-"+t.index).node();!n&&r.isWithinBar(e)&&(n=t)}),t.filter(function(t){return t&&!r.isBarType(t.id)}).forEach(function(t){var a=r.dist(t,e);a<i&&(i=a,n=t)}),n},u.dist=function(t,e){var n=this,r=n.config,i=r.axis_rotated?1:0,a=r.axis_rotated?0:1,o=n.circleY(t,t.index),s=n.x(t.x);return Math.sqrt(Math.pow(s-e[i],2)+Math.pow(o-e[a],2))},u.convertValuesToStep=function(t){var e,n=[].concat(t);if(!this.isCategorized())return t;for(e=t.length+1;0<e;e--)n[e]=n[e-1];return n[0]={x:n[0].x-1,value:n[0].value,id:n[0].id},n[t.length+1]={x:n[t.length].x+1,value:n[t.length].value,id:n[t.length].id},n},u.updateDataAttributes=function(t,e){var n=this,r=n.config,i=r["data_"+t];return"undefined"==typeof e?i:(Object.keys(e).forEach(function(t){i[t]=e[t]}),n.redraw({withLegend:!0}),i)},u.convertUrlToData=function(t,e,n,r,i){var a=this,o=e?e:"csv",s=a.d3.xhr(t);n&&Object.keys(n).forEach(function(t){s.header(t,n[t])}),s.get(function(t,e){var n;if(!e)throw new Error(t.responseURL+" "+t.status+" ("+t.statusText+")");n="json"===o?a.convertJsonToData(JSON.parse(e.response),r):"tsv"===o?a.convertTsvToData(e.response):a.convertCsvToData(e.response),i.call(a,n)})},u.convertXsvToData=function(t,e){var n,r=e.parseRows(t);return 1===r.length?(n=[{}],r[0].forEach(function(t){n[0][t]=null})):n=e.parse(t),n},u.convertCsvToData=function(t){return this.convertXsvToData(t,this.d3.csv)},u.convertTsvToData=function(t){return this.convertXsvToData(t,this.d3.tsv)},u.convertJsonToData=function(t,e){var n,r,i=this,a=[];return e?(e.x?(n=e.value.concat(e.x),i.config.data_x=e.x):n=e.value,a.push(n),t.forEach(function(t){var e=[];n.forEach(function(n){var r=i.findValueInJson(t,n);g(r)&&(r=null),e.push(r)}),a.push(e)}),r=i.convertRowsToData(a)):(Object.keys(t).forEach(function(e){a.push([e].concat(t[e]))}),r=i.convertColumnsToData(a)),r},u.findValueInJson=function(t,e){e=e.replace(/\[(\w+)\]/g,".$1"),e=e.replace(/^\./,"");for(var n=e.split("."),r=0;r<n.length;++r){var i=n[r];if(!(i in t))return;t=t[i]}return t},u.convertRowsToData=function(t){var e,n,r=t[0],i={},a=[];for(e=1;e<t.length;e++){for(i={},n=0;n<t[e].length;n++){if(g(t[e][n]))throw new Error("Source data is missing a component at ("+e+","+n+")!");i[r[n]]=t[e][n]}a.push(i)}return a},u.convertColumnsToData=function(t){var e,n,r,i=[];for(e=0;e<t.length;e++)for(r=t[e][0],n=1;n<t[e].length;n++){if(g(i[n-1])&&(i[n-1]={}),g(t[e][n]))throw new Error("Source data is missing a component at ("+e+","+n+")!");i[n-1][r]=t[e][n]}return i},u.convertDataToTargets=function(t,e){var n,r=this,i=r.config,a=r.d3.keys(t[0]).filter(r.isNotX,r),o=r.d3.keys(t[0]).filter(r.isX,r);return a.forEach(function(n){var a=r.getXKey(n);r.isCustomX()||r.isTimeSeries()?o.indexOf(a)>=0?r.data.xs[n]=(e&&r.data.xs[n]?r.data.xs[n]:[]).concat(t.map(function(t){return t[a]}).filter(h).map(function(t,e){return r.generateTargetX(t,n,e)})):i.data_x?r.data.xs[n]=r.getOtherTargetXs():b(i.data_xs)&&(r.data.xs[n]=r.getXValuesOfXKey(a,r.data.targets)):r.data.xs[n]=t.map(function(t,e){return e})}),a.forEach(function(t){if(!r.data.xs[t])throw new Error('x is not defined for id = "'+t+'".')}),n=a.map(function(e,n){var a=i.data_idConverter(e);return{id:a,id_org:e,values:t.map(function(t,o){var s,u=r.getXKey(e),c=t[u],l=null===t[e]||isNaN(t[e])?null:+t[e];return r.isCustomX()&&r.isCategorized()&&0===n&&!g(c)?(0===n&&0===o&&(i.axis_x_categories=[]),s=i.axis_x_categories.indexOf(c),s===-1&&(s=i.axis_x_categories.length,i.axis_x_categories.push(c))):s=r.generateTargetX(c,e,o),(g(t[e])||r.data.xs[e].length<=o)&&(s=void 0),{x:s,value:l,id:a}}).filter(function(t){return v(t.x)})}}),n.forEach(function(t){var e;i.data_xSort&&(t.values=t.values.sort(function(t,e){var n=t.x||0===t.x?t.x:1/0,r=e.x||0===e.x?e.x:1/0;return n-r})),e=0,t.values.forEach(function(t){t.index=e++}),r.data.xs[t.id].sort(function(t,e){return t-e})}),r.hasNegativeValue=r.hasNegativeValueInTargets(n),r.hasPositiveValue=r.hasPositiveValueInTargets(n),i.data_type&&r.setTargetType(r.mapToIds(n).filter(function(t){return!(t in i.data_types)}),i.data_type),n.forEach(function(t){r.addCache(t.id_org,t)}),n},u.load=function(t,e){var n=this;t&&(e.filter&&(t=t.filter(e.filter)),(e.type||e.types)&&t.forEach(function(t){var r=e.types&&e.types[t.id]?e.types[t.id]:e.type;n.setTargetType(t.id,r)}),n.data.targets.forEach(function(e){for(var n=0;n<t.length;n++)if(e.id===t[n].id){e.values=t[n].values,t.splice(n,1);break}}),n.data.targets=n.data.targets.concat(t)),n.updateTargets(n.data.targets),n.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0}),e.done&&e.done()},u.loadFromArgs=function(t){var e=this;t.data?e.load(e.convertDataToTargets(t.data),t):t.url?e.convertUrlToData(t.url,t.mimeType,t.headers,t.keys,function(n){e.load(e.convertDataToTargets(n),t)}):t.json?e.load(e.convertDataToTargets(e.convertJsonToData(t.json,t.keys)),t):t.rows?e.load(e.convertDataToTargets(e.convertRowsToData(t.rows)),t):t.columns?e.load(e.convertDataToTargets(e.convertColumnsToData(t.columns)),t):e.load(null,t)},u.unload=function(t,e){var n=this;return e||(e=function(){}),t=t.filter(function(t){return n.hasTarget(n.data.targets,t)}),t&&0!==t.length?(n.svg.selectAll(t.map(function(t){return n.selectorTarget(t)})).transition().style("opacity",0).remove().call(n.endall,e),void t.forEach(function(t){n.withoutFadeIn[t]=!1,n.legend&&n.legend.selectAll("."+f.legendItem+n.getTargetSelectorSuffix(t)).remove(),n.data.targets=n.data.targets.filter(function(e){return e.id!==t})})):void e()},u.categoryName=function(t){var e=this.config;return t<e.axis_x_categories.length?e.axis_x_categories[t]:t},u.initEventRect=function(){var t=this;t.main.select("."+f.chart).append("g").attr("class",f.eventRects).style("fill-opacity",0)},u.redrawEventRect=function(){var t,e,n=this,r=n.config,i=n.isMultipleX(),a=n.main.select("."+f.eventRects).style("cursor",r.zoom_enabled?r.axis_rotated?"ns-resize":"ew-resize":null).classed(f.eventRectsMultiple,i).classed(f.eventRectsSingle,!i);a.selectAll("."+f.eventRect).remove(),n.eventRect=a.selectAll("."+f.eventRect),i?(t=n.eventRect.data([0]),n.generateEventRectsForMultipleXs(t.enter()),n.updateEventRect(t)):(e=n.getMaxDataCountTarget(n.data.targets),a.datum(e?e.values:[]),n.eventRect=a.selectAll("."+f.eventRect),t=n.eventRect.data(function(t){return t}),n.generateEventRectsForSingleX(t.enter()),n.updateEventRect(t),t.exit().remove())},u.updateEventRect=function(t){var e,n,r,i,a,o,s=this,u=s.config;t=t||s.eventRect.data(function(t){return t}),s.isMultipleX()?(e=0,n=0,r=s.width,i=s.height):(!s.isCustomX()&&!s.isTimeSeries()||s.isCategorized()?(a=s.getEventRectWidth(),o=function(t){return s.x(t.x)-a/2}):(s.updateXs(),a=function(t){var e=s.getPrevX(t.index),n=s.getNextX(t.index);return null===e&&null===n?u.axis_rotated?s.height:s.width:(null===e&&(e=s.x.domain()[0]),null===n&&(n=s.x.domain()[1]),Math.max(0,(s.x(n)-s.x(e))/2))},o=function(t){var e=s.getPrevX(t.index),n=s.getNextX(t.index),r=s.data.xs[t.id][t.index];return null===e&&null===n?0:(null===e&&(e=s.x.domain()[0]),(s.x(r)+s.x(e))/2)}),e=u.axis_rotated?0:o,n=u.axis_rotated?o:0,r=u.axis_rotated?s.width:a,i=u.axis_rotated?a:s.height),t.attr("class",s.classEvent.bind(s)).attr("x",e).attr("y",n).attr("width",r).attr("height",i)},u.generateEventRectsForSingleX=function(t){var e=this,n=e.d3,r=e.config;t.append("rect").attr("class",e.classEvent.bind(e)).style("cursor",r.data_selection_enabled&&r.data_selection_grouped?"pointer":null).on("mouseover",function(t){var n=t.index;e.dragging||e.flowing||e.hasArcType()||(r.point_focus_expand_enabled&&e.expandCircles(n,null,!0),e.expandBars(n,null,!0),e.main.selectAll("."+f.shape+"-"+n).each(function(t){r.data_onmouseover.call(e.api,t)}))}).on("mouseout",function(t){var n=t.index;e.config&&(e.hasArcType()||(e.hideXGridFocus(),e.hideTooltip(),e.unexpandCircles(),e.unexpandBars(),e.main.selectAll("."+f.shape+"-"+n).each(function(t){r.data_onmouseout.call(e.api,t)})))}).on("mousemove",function(t){var i,a=t.index,o=e.svg.select("."+f.eventRect+"-"+a);e.dragging||e.flowing||e.hasArcType()||(e.isStepType(t)&&"step-after"===e.config.line_step_type&&n.mouse(this)[0]<e.x(e.getXValue(t.id,a))&&(a-=1),i=e.filterTargetsToShow(e.data.targets).map(function(t){return e.addName(e.getValueOnIndex(t.values,a))}),r.tooltip_grouped&&(e.showTooltip(i,this),e.showXGridFocus(i)),(!r.tooltip_grouped||r.data_selection_enabled&&!r.data_selection_grouped)&&e.main.selectAll("."+f.shape+"-"+a).each(function(){n.select(this).classed(f.EXPANDED,!0),r.data_selection_enabled&&o.style("cursor",r.data_selection_grouped?"pointer":null),r.tooltip_grouped||(e.hideXGridFocus(),e.hideTooltip(),r.data_selection_grouped||(e.unexpandCircles(a),e.unexpandBars(a)))}).filter(function(t){return e.isWithinShape(this,t)}).each(function(t){r.data_selection_enabled&&(r.data_selection_grouped||r.data_selection_isselectable(t))&&o.style("cursor","pointer"),r.tooltip_grouped||(e.showTooltip([t],this),e.showXGridFocus([t]),r.point_focus_expand_enabled&&e.expandCircles(a,t.id,!0),e.expandBars(a,t.id,!0))}))}).on("click",function(t){var i=t.index;if(!e.hasArcType()&&e.toggleShape){if(e.cancelClick)return void(e.cancelClick=!1);e.isStepType(t)&&"step-after"===r.line_step_type&&n.mouse(this)[0]<e.x(e.getXValue(t.id,i))&&(i-=1),e.main.selectAll("."+f.shape+"-"+i).each(function(t){(r.data_selection_grouped||e.isWithinShape(this,t))&&(e.toggleShape(this,t,i),e.config.data_onclick.call(e.api,t,this))})}}).call(r.data_selection_draggable&&e.drag?n.behavior.drag().origin(Object).on("drag",function(){e.drag(n.mouse(this))}).on("dragstart",function(){e.dragstart(n.mouse(this))}).on("dragend",function(){e.dragend()}):function(){})},u.generateEventRectsForMultipleXs=function(t){function e(){n.svg.select("."+f.eventRect).style("cursor",null),n.hideXGridFocus(),n.hideTooltip(),n.unexpandCircles(),n.unexpandBars()}var n=this,r=n.d3,i=n.config;t.append("rect").attr("x",0).attr("y",0).attr("width",n.width).attr("height",n.height).attr("class",f.eventRect).on("mouseout",function(){n.config&&(n.hasArcType()||e())}).on("mousemove",function(){var t,a,o,s,u=n.filterTargetsToShow(n.data.targets);if(!n.dragging&&!n.hasArcType(u)){if(t=r.mouse(this),a=n.findClosestFromTargets(u,t),!n.mouseover||a&&a.id===n.mouseover.id||(i.data_onmouseout.call(n.api,n.mouseover),n.mouseover=void 0),!a)return void e();o=n.isScatterType(a)||!i.tooltip_grouped?[a]:n.filterByX(u,a.x),s=o.map(function(t){return n.addName(t)}),n.showTooltip(s,this),i.point_focus_expand_enabled&&n.expandCircles(a.index,a.id,!0),n.expandBars(a.index,a.id,!0),n.showXGridFocus(s),(n.isBarType(a.id)||n.dist(a,t)<i.point_sensitivity)&&(n.svg.select("."+f.eventRect).style("cursor","pointer"),n.mouseover||(i.data_onmouseover.call(n.api,a),n.mouseover=a))}}).on("click",function(){var t,e,a=n.filterTargetsToShow(n.data.targets);n.hasArcType(a)||(t=r.mouse(this),e=n.findClosestFromTargets(a,t),e&&(n.isBarType(e.id)||n.dist(e,t)<i.point_sensitivity)&&n.main.selectAll("."+f.shapes+n.getTargetSelectorSuffix(e.id)).selectAll("."+f.shape+"-"+e.index).each(function(){(i.data_selection_grouped||n.isWithinShape(this,e))&&(n.toggleShape(this,e,e.index),n.config.data_onclick.call(n.api,e,this))}))}).call(i.data_selection_draggable&&n.drag?r.behavior.drag().origin(Object).on("drag",function(){n.drag(r.mouse(this))}).on("dragstart",function(){n.dragstart(r.mouse(this))}).on("dragend",function(){n.dragend()}):function(){})},u.dispatchEvent=function(e,n,r){var i=this,a="."+f.eventRect+(i.isMultipleX()?"":"-"+n),o=i.main.select(a).node(),s=o.getBoundingClientRect(),u=s.left+(r?r[0]:0),c=s.top+(r?r[1]:0),l=document.createEvent("MouseEvents");l.initMouseEvent(e,!0,!0,t,0,u,c,u,c,!1,!1,!1,!1,0,null),o.dispatchEvent(l)},u.getCurrentWidth=function(){var t=this,e=t.config;return e.size_width?e.size_width:t.getParentWidth()},u.getCurrentHeight=function(){var t=this,e=t.config,n=e.size_height?e.size_height:t.getParentHeight();return n>0?n:320/(t.hasType("gauge")&&!e.gauge_fullCircle?2:1)},u.getCurrentPaddingTop=function(){var t=this,e=t.config,n=h(e.padding_top)?e.padding_top:0;return t.title&&t.title.node()&&(n+=t.getTitlePadding()),n},u.getCurrentPaddingBottom=function(){var t=this.config;return h(t.padding_bottom)?t.padding_bottom:0},u.getCurrentPaddingLeft=function(t){var e=this,n=e.config;return h(n.padding_left)?n.padding_left:n.axis_rotated?n.axis_x_show?Math.max(m(e.getAxisWidthByAxisId("x",t)),40):1:!n.axis_y_show||n.axis_y_inner?e.axis.getYAxisLabelPosition().isOuter?30:1:m(e.getAxisWidthByAxisId("y",t))},u.getCurrentPaddingRight=function(){var t=this,e=t.config,n=10,r=t.isLegendRight?t.getLegendWidth()+20:0;return h(e.padding_right)?e.padding_right+1:e.axis_rotated?n+r:!e.axis_y2_show||e.axis_y2_inner?2+r+(t.axis.getY2AxisLabelPosition().isOuter?20:0):m(t.getAxisWidthByAxisId("y2"))+r},u.getParentRectValue=function(t){for(var e,n=this.selectChart.node();n&&"BODY"!==n.tagName;){try{e=n.getBoundingClientRect()[t]}catch(r){"width"===t&&(e=n.offsetWidth)}if(e)break;n=n.parentNode}return e},u.getParentWidth=function(){return this.getParentRectValue("width")},u.getParentHeight=function(){var t=this.selectChart.style("height");return t.indexOf("px")>0?+t.replace("px",""):0},u.getSvgLeft=function(t){var e=this,n=e.config,r=n.axis_rotated||!n.axis_rotated&&!n.axis_y_inner,i=n.axis_rotated?f.axisX:f.axisY,a=e.main.select("."+i).node(),o=a&&r?a.getBoundingClientRect():{right:0},s=e.selectChart.node().getBoundingClientRect(),u=e.hasArcType(),c=o.right-s.left-(u?0:e.getCurrentPaddingLeft(t));return c>0?c:0},u.getAxisWidthByAxisId=function(t,e){var n=this,r=n.axis.getLabelPositionById(t);return n.axis.getMaxTickWidth(t,e)+(r.isInner?20:40)},u.getHorizontalAxisHeight=function(t){var e=this,n=e.config,r=30;return"x"!==t||n.axis_x_show?"x"===t&&n.axis_x_height?n.axis_x_height:"y"!==t||n.axis_y_show?"y2"!==t||n.axis_y2_show?("x"===t&&!n.axis_rotated&&n.axis_x_tick_rotate&&(r=30+e.axis.getMaxTickWidth(t)*Math.cos(Math.PI*(90-n.axis_x_tick_rotate)/180)),"y"===t&&n.axis_rotated&&n.axis_y_tick_rotate&&(r=30+e.axis.getMaxTickWidth(t)*Math.cos(Math.PI*(90-n.axis_y_tick_rotate)/180)),r+(e.axis.getLabelPositionById(t).isInner?0:10)+("y2"===t?-10:0)):e.rotated_padding_top:!n.legend_show||e.isLegendRight||e.isLegendInset?1:10:8},u.getEventRectWidth=function(){return Math.max(0,this.xAxis.tickInterval())},u.getShapeIndices=function(t){var e,n,r=this,i=r.config,a={},o=0;return r.filterTargetsToShow(r.data.targets.filter(t,r)).forEach(function(t){for(e=0;e<i.data_groups.length;e++)if(!(i.data_groups[e].indexOf(t.id)<0))for(n=0;n<i.data_groups[e].length;n++)if(i.data_groups[e][n]in a){a[t.id]=a[i.data_groups[e][n]];break}g(a[t.id])&&(a[t.id]=o++)}),a.__max__=o-1,a},u.getShapeX=function(t,e,n,r){var i=this,a=r?i.subX:i.x;return function(r){var i=r.id in n?n[r.id]:0;return r.x||0===r.x?a(r.x)-t*(e/2-i):0}},u.getShapeY=function(t){var e=this;return function(n){var r=t?e.getSubYScale(n.id):e.getYScale(n.id);return r(n.value)}},u.getShapeOffset=function(t,e,n){var r=this,i=r.orderTargets(r.filterTargetsToShow(r.data.targets.filter(t,r))),a=i.map(function(t){return t.id});return function(t,o){var s=n?r.getSubYScale(t.id):r.getYScale(t.id),u=s(0),c=u;return i.forEach(function(n){var i=r.isStepType(t)?r.convertValuesToStep(n.values):n.values;n.id!==t.id&&e[n.id]===e[t.id]&&a.indexOf(n.id)<a.indexOf(t.id)&&("undefined"!=typeof i[o]&&+i[o].x===+t.x||(o=-1,i.forEach(function(e,n){e.x===t.x&&(o=n)})),o in i&&i[o].value*t.value>=0&&(c+=s(i[o].value)-u))}),c}},u.isWithinShape=function(t,e){var n,r=this,i=r.d3.select(t);return r.isTargetToShow(e.id)?"circle"===t.nodeName?n=r.isStepType(e)?r.isWithinStep(t,r.getYScale(e.id)(e.value)):r.isWithinCircle(t,1.5*r.pointSelectR(e)):"path"===t.nodeName&&(n=!i.classed(f.bar)||r.isWithinBar(t)):n=!1,n},u.getInterpolate=function(t){var e=this,n=e.isInterpolationType(e.config.spline_interpolation_type)?e.config.spline_interpolation_type:"cardinal";return e.isSplineType(t)?n:e.isStepType(t)?e.config.line_step_type:"linear"},u.initLine=function(){var t=this;t.main.select("."+f.chart).append("g").attr("class",f.chartLines)},u.updateTargetsForLine=function(t){var e,n,r=this,i=r.config,a=r.classChartLine.bind(r),o=r.classLines.bind(r),s=r.classAreas.bind(r),u=r.classCircles.bind(r),c=r.classFocus.bind(r);e=r.main.select("."+f.chartLines).selectAll("."+f.chartLine).data(t).attr("class",function(t){return a(t)+c(t)}),n=e.enter().append("g").attr("class",a).style("opacity",0).style("pointer-events","none"),n.append("g").attr("class",o),n.append("g").attr("class",s),n.append("g").attr("class",function(t){return r.generateClass(f.selectedCircles,t.id)}),n.append("g").attr("class",u).style("cursor",function(t){return i.data_selection_isselectable(t)?"pointer":null}),t.forEach(function(t){r.main.selectAll("."+f.selectedCircles+r.getTargetSelectorSuffix(t.id)).selectAll("."+f.selectedCircle).each(function(e){e.value=t.values[e.index].value})})},u.updateLine=function(t){var e=this;e.mainLine=e.main.selectAll("."+f.lines).selectAll("."+f.line).data(e.lineData.bind(e)),e.mainLine.enter().append("path").attr("class",e.classLine.bind(e)).style("stroke",e.color),e.mainLine.style("opacity",e.initialOpacity.bind(e)).style("shape-rendering",function(t){return e.isStepType(t)?"crispEdges":""}).attr("transform",null),e.mainLine.exit().transition().duration(t).style("opacity",0).remove()},u.redrawLine=function(t,e){return[(e?this.mainLine.transition(Math.random().toString()):this.mainLine).attr("d",t).style("stroke",this.color).style("opacity",1)]},u.generateDrawLine=function(t,e){var n=this,r=n.config,i=n.d3.svg.line(),a=n.generateGetLinePoints(t,e),o=e?n.getSubYScale:n.getYScale,s=function(t){return(e?n.subxx:n.xx).call(n,t)},u=function(t,e){return r.data_groups.length>0?a(t,e)[0][1]:o.call(n,t.id)(t.value)};return i=r.axis_rotated?i.x(u).y(s):i.x(s).y(u),r.line_connectNull||(i=i.defined(function(t){return null!=t.value})),function(t){var a,s=r.line_connectNull?n.filterRemoveNull(t.values):t.values,u=e?n.x:n.subX,c=o.call(n,t.id),l=0,f=0;return n.isLineType(t)?r.data_regions[t.id]?a=n.lineWithRegions(s,u,c,r.data_regions[t.id]):(n.isStepType(t)&&(s=n.convertValuesToStep(s)),a=i.interpolate(n.getInterpolate(t))(s)):(s[0]&&(l=u(s[0].x),f=c(s[0].value)),a=r.axis_rotated?"M "+f+" "+l:"M "+l+" "+f),a?a:"M 0 0"}},u.generateGetLinePoints=function(t,e){var n=this,r=n.config,i=t.__max__+1,a=n.getShapeX(0,i,t,!!e),o=n.getShapeY(!!e),s=n.getShapeOffset(n.isLineType,t,!!e),u=e?n.getSubYScale:n.getYScale;return function(t,e){var i=u.call(n,t.id)(0),c=s(t,e)||i,l=a(t),f=o(t);return r.axis_rotated&&(0<t.value&&f<i||t.value<0&&i<f)&&(f=i),[[l,f-(i-c)],[l,f-(i-c)],[l,f-(i-c)],[l,f-(i-c)]]}},u.lineWithRegions=function(t,e,n,r){function i(t,e){var n;for(n=0;n<e.length;n++)if(e[n].start<t&&t<=e[n].end)return!0;return!1}function a(t){return"M"+t[0][0]+" "+t[0][1]+" "+t[1][0]+" "+t[1][1]}var o,s,u,c,l,f,h,d,p,m,y,x,_=this,b=_.config,$=-1,w="M",S=_.isCategorized()?.5:0,T=[];if(v(r))for(o=0;o<r.length;o++)T[o]={},g(r[o].start)?T[o].start=t[0].x:T[o].start=_.isTimeSeries()?_.parseDate(r[o].start):r[o].start,g(r[o].end)?T[o].end=t[t.length-1].x:T[o].end=_.isTimeSeries()?_.parseDate(r[o].end):r[o].end;for(y=b.axis_rotated?function(t){return n(t.value)}:function(t){return e(t.x)},x=b.axis_rotated?function(t){return e(t.x)}:function(t){return n(t.value)},u=_.isTimeSeries()?function(t,r,i,o){var s,u=t.x.getTime(),c=r.x-t.x,f=new Date(u+c*i),h=new Date(u+c*(i+o));return s=b.axis_rotated?[[n(l(i)),e(f)],[n(l(i+o)),e(h)]]:[[e(f),n(l(i))],[e(h),n(l(i+o))]],a(s)}:function(t,r,i,o){var s;return s=b.axis_rotated?[[n(l(i),!0),e(c(i))],[n(l(i+o),!0),e(c(i+o))]]:[[e(c(i),!0),n(l(i))],[e(c(i+o),!0),n(l(i+o))]],a(s)},o=0;o<t.length;o++){if(g(T)||!i(t[o].x,T))w+=" "+y(t[o])+" "+x(t[o]);else for(c=_.getScale(t[o-1].x+S,t[o].x+S,_.isTimeSeries()),l=_.getScale(t[o-1].value,t[o].value),f=e(t[o].x)-e(t[o-1].x),h=n(t[o].value)-n(t[o-1].value),d=Math.sqrt(Math.pow(f,2)+Math.pow(h,2)),p=2/d,m=2*p,s=p;s<=1;s+=m)w+=u(t[o-1],t[o],s,p);$=t[o].x}return w},u.updateArea=function(t){var e=this,n=e.d3;e.mainArea=e.main.selectAll("."+f.areas).selectAll("."+f.area).data(e.lineData.bind(e)),e.mainArea.enter().append("path").attr("class",e.classArea.bind(e)).style("fill",e.color).style("opacity",function(){return e.orgAreaOpacity=+n.select(this).style("opacity"),0}),e.mainArea.style("opacity",e.orgAreaOpacity),e.mainArea.exit().transition().duration(t).style("opacity",0).remove()},u.redrawArea=function(t,e){return[(e?this.mainArea.transition(Math.random().toString()):this.mainArea).attr("d",t).style("fill",this.color).style("opacity",this.orgAreaOpacity)]},u.generateDrawArea=function(t,e){var n=this,r=n.config,i=n.d3.svg.area(),a=n.generateGetAreaPoints(t,e),o=e?n.getSubYScale:n.getYScale,s=function(t){return(e?n.subxx:n.xx).call(n,t)},u=function(t,e){return r.data_groups.length>0?a(t,e)[0][1]:o.call(n,t.id)(n.getAreaBaseValue(t.id))},c=function(t,e){return r.data_groups.length>0?a(t,e)[1][1]:o.call(n,t.id)(t.value)};return i=r.axis_rotated?i.x0(u).x1(c).y(s):i.x(s).y0(r.area_above?0:u).y1(c),r.line_connectNull||(i=i.defined(function(t){return null!==t.value})),function(t){var e,a=r.line_connectNull?n.filterRemoveNull(t.values):t.values,o=0,s=0;return n.isAreaType(t)?(n.isStepType(t)&&(a=n.convertValuesToStep(a)),e=i.interpolate(n.getInterpolate(t))(a)):(a[0]&&(o=n.x(a[0].x),s=n.getYScale(t.id)(a[0].value)),e=r.axis_rotated?"M "+s+" "+o:"M "+o+" "+s),e?e:"M 0 0"}},u.getAreaBaseValue=function(){return 0},u.generateGetAreaPoints=function(t,e){var n=this,r=n.config,i=t.__max__+1,a=n.getShapeX(0,i,t,!!e),o=n.getShapeY(!!e),s=n.getShapeOffset(n.isAreaType,t,!!e),u=e?n.getSubYScale:n.getYScale;return function(t,e){var i=u.call(n,t.id)(0),c=s(t,e)||i,l=a(t),f=o(t);return r.axis_rotated&&(0<t.value&&f<i||t.value<0&&i<f)&&(f=i),[[l,c],[l,f-(i-c)],[l,f-(i-c)],[l,c]]}},u.updateCircle=function(){var t=this;t.mainCircle=t.main.selectAll("."+f.circles).selectAll("."+f.circle).data(t.lineOrScatterData.bind(t)),t.mainCircle.enter().append("circle").attr("class",t.classCircle.bind(t)).attr("r",t.pointR.bind(t)).style("fill",t.color),t.mainCircle.style("opacity",t.initialOpacityForCircle.bind(t)),t.mainCircle.exit().remove()},u.redrawCircle=function(t,e,n){var r=this.main.selectAll("."+f.selectedCircle);return[(n?this.mainCircle.transition(Math.random().toString()):this.mainCircle).style("opacity",this.opacityForCircle.bind(this)).style("fill",this.color).attr("cx",t).attr("cy",e),(n?r.transition(Math.random().toString()):r).attr("cx",t).attr("cy",e)]},u.circleX=function(t){return t.x||0===t.x?this.x(t.x):null},u.updateCircleY=function(){var t,e,n=this;n.config.data_groups.length>0?(t=n.getShapeIndices(n.isLineType),e=n.generateGetLinePoints(t),n.circleY=function(t,n){return e(t,n)[0][1]}):n.circleY=function(t){return n.getYScale(t.id)(t.value)}},u.getCircles=function(t,e){var n=this;return(e?n.main.selectAll("."+f.circles+n.getTargetSelectorSuffix(e)):n.main).selectAll("."+f.circle+(h(t)?"-"+t:""))},u.expandCircles=function(t,e,n){var r=this,i=r.pointExpandedR.bind(r);n&&r.unexpandCircles(),r.getCircles(t,e).classed(f.EXPANDED,!0).attr("r",i)},u.unexpandCircles=function(t){var e=this,n=e.pointR.bind(e);e.getCircles(t).filter(function(){return e.d3.select(this).classed(f.EXPANDED)}).classed(f.EXPANDED,!1).attr("r",n)},u.pointR=function(t){var e=this,n=e.config;return e.isStepType(t)?0:d(n.point_r)?n.point_r(t):n.point_r},u.pointExpandedR=function(t){var e=this,n=e.config;return n.point_focus_expand_enabled?n.point_focus_expand_r?n.point_focus_expand_r:1.75*e.pointR(t):e.pointR(t)},u.pointSelectR=function(t){var e=this,n=e.config;return d(n.point_select_r)?n.point_select_r(t):n.point_select_r?n.point_select_r:4*e.pointR(t)},u.isWithinCircle=function(t,e){var n=this.d3,r=n.mouse(t),i=n.select(t),a=+i.attr("cx"),o=+i.attr("cy");return Math.sqrt(Math.pow(a-r[0],2)+Math.pow(o-r[1],2))<e},u.isWithinStep=function(t,e){return Math.abs(e-this.d3.mouse(t)[1])<30},u.initBar=function(){var t=this;t.main.select("."+f.chart).append("g").attr("class",f.chartBars)},u.updateTargetsForBar=function(t){var e,n,r=this,i=r.config,a=r.classChartBar.bind(r),o=r.classBars.bind(r),s=r.classFocus.bind(r);e=r.main.select("."+f.chartBars).selectAll("."+f.chartBar).data(t).attr("class",function(t){return a(t)+s(t)}),n=e.enter().append("g").attr("class",a).style("opacity",0).style("pointer-events","none"),n.append("g").attr("class",o).style("cursor",function(t){return i.data_selection_isselectable(t)?"pointer":null})},u.updateBar=function(t){var e=this,n=e.barData.bind(e),r=e.classBar.bind(e),i=e.initialOpacity.bind(e),a=function(t){return e.color(t.id)};e.mainBar=e.main.selectAll("."+f.bars).selectAll("."+f.bar).data(n),e.mainBar.enter().append("path").attr("class",r).style("stroke",a).style("fill",a),e.mainBar.style("opacity",i),e.mainBar.exit().transition().duration(t).style("opacity",0).remove()},u.redrawBar=function(t,e){return[(e?this.mainBar.transition(Math.random().toString()):this.mainBar).attr("d",t).style("fill",this.color).style("opacity",1)]},u.getBarW=function(t,e){var n=this,r=n.config,i="number"==typeof r.bar_width?r.bar_width:e?t.tickInterval()*r.bar_width_ratio/e:0;return r.bar_width_max&&i>r.bar_width_max?r.bar_width_max:i},u.getBars=function(t,e){var n=this;return(e?n.main.selectAll("."+f.bars+n.getTargetSelectorSuffix(e)):n.main).selectAll("."+f.bar+(h(t)?"-"+t:""))},u.expandBars=function(t,e,n){var r=this;n&&r.unexpandBars(),r.getBars(t,e).classed(f.EXPANDED,!0)},u.unexpandBars=function(t){var e=this;e.getBars(t).classed(f.EXPANDED,!1)},u.generateDrawBar=function(t,e){var n=this,r=n.config,i=n.generateGetBarPoints(t,e);return function(t,e){var n=i(t,e),a=r.axis_rotated?1:0,o=r.axis_rotated?0:1,s="M "+n[0][a]+","+n[0][o]+" L"+n[1][a]+","+n[1][o]+" L"+n[2][a]+","+n[2][o]+" L"+n[3][a]+","+n[3][o]+" z";return s}},u.generateGetBarPoints=function(t,e){var n=this,r=e?n.subXAxis:n.xAxis,i=t.__max__+1,a=n.getBarW(r,i),o=n.getShapeX(a,i,t,!!e),s=n.getShapeY(!!e),u=n.getShapeOffset(n.isBarType,t,!!e),c=e?n.getSubYScale:n.getYScale;
return function(t,e){var r=c.call(n,t.id)(0),i=u(t,e)||r,l=o(t),f=s(t);return n.config.axis_rotated&&(0<t.value&&f<r||t.value<0&&r<f)&&(f=r),[[l,i],[l,f-(r-i)],[l+a,f-(r-i)],[l+a,i]]}},u.isWithinBar=function(t){var e=this.d3.mouse(t),n=t.getBoundingClientRect(),r=t.pathSegList.getItem(0),i=t.pathSegList.getItem(1),a=Math.min(r.x,i.x),o=Math.min(r.y,i.y),s=n.width,u=n.height,c=2,l=a-c,f=a+s+c,h=o+u+c,d=o-c;return l<e[0]&&e[0]<f&&d<e[1]&&e[1]<h},u.initText=function(){var t=this;t.main.select("."+f.chart).append("g").attr("class",f.chartTexts),t.mainText=t.d3.selectAll([])},u.updateTargetsForText=function(t){var e,n,r=this,i=r.classChartText.bind(r),a=r.classTexts.bind(r),o=r.classFocus.bind(r);e=r.main.select("."+f.chartTexts).selectAll("."+f.chartText).data(t).attr("class",function(t){return i(t)+o(t)}),n=e.enter().append("g").attr("class",i).style("opacity",0).style("pointer-events","none"),n.append("g").attr("class",a)},u.updateText=function(t){var e=this,n=e.config,r=e.barOrLineData.bind(e),i=e.classText.bind(e);e.mainText=e.main.selectAll("."+f.texts).selectAll("."+f.text).data(r),e.mainText.enter().append("text").attr("class",i).attr("text-anchor",function(t){return n.axis_rotated?t.value<0?"end":"start":"middle"}).style("stroke","none").style("fill",function(t){return e.color(t)}).style("fill-opacity",0),e.mainText.text(function(t,n,r){return e.dataLabelFormat(t.id)(t.value,t.id,n,r)}),e.mainText.exit().transition().duration(t).style("fill-opacity",0).remove()},u.redrawText=function(t,e,n,r){return[(r?this.mainText.transition():this.mainText).attr("x",t).attr("y",e).style("fill",this.color).style("fill-opacity",n?0:this.opacityForText.bind(this))]},u.getTextRect=function(t,e,n){var r,i=this.d3.select("body").append("div").classed("c3",!0),a=i.append("svg").style("visibility","hidden").style("position","fixed").style("top",0).style("left",0),o=this.d3.select(n).style("font");return a.selectAll(".dummy").data([t]).enter().append("text").classed(e?e:"",!0).style("font",o).text(t).each(function(){r=this.getBoundingClientRect()}),i.remove(),r},u.generateXYForText=function(t,e,n,r){var i=this,a=i.generateGetAreaPoints(t,!1),o=i.generateGetBarPoints(e,!1),s=i.generateGetLinePoints(n,!1),u=r?i.getXForText:i.getYForText;return function(t,e){var n=i.isAreaType(t)?a:i.isBarType(t)?o:s;return u.call(i,n(t,e),t,this)}},u.getXForText=function(t,e,n){var r,i,a=this,o=n.getBoundingClientRect();return a.config.axis_rotated?(i=a.isBarType(e)?4:6,r=t[2][1]+i*(e.value<0?-1:1)):r=a.hasType("bar")?(t[2][0]+t[0][0])/2:t[0][0],null===e.value&&(r>a.width?r=a.width-o.width:r<0&&(r=4)),r},u.getYForText=function(t,e,n){var r,i=this,a=n.getBoundingClientRect();return i.config.axis_rotated?r=(t[0][0]+t[2][0]+.6*a.height)/2:(r=t[2][1],e.value<0||0===e.value&&!i.hasPositiveValue?(r+=a.height,i.isBarType(e)&&i.isSafari()?r-=3:!i.isBarType(e)&&i.isChrome()&&(r+=3)):r+=i.isBarType(e)?-3:-6),null!==e.value||i.config.axis_rotated||(r<a.height?r=a.height:r>this.height&&(r=this.height-4)),r},u.setTargetType=function(t,e){var n=this,r=n.config;n.mapToTargetIds(t).forEach(function(t){n.withoutFadeIn[t]=e===r.data_types[t],r.data_types[t]=e}),t||(r.data_type=e)},u.hasType=function(t,e){var n=this,r=n.config.data_types,i=!1;return e=e||n.data.targets,e&&e.length?e.forEach(function(e){var n=r[e.id];(n&&n.indexOf(t)>=0||!n&&"line"===t)&&(i=!0)}):Object.keys(r).length?Object.keys(r).forEach(function(e){r[e]===t&&(i=!0)}):i=n.config.data_type===t,i},u.hasArcType=function(t){return this.hasType("pie",t)||this.hasType("donut",t)||this.hasType("gauge",t)},u.isLineType=function(t){var e=this.config,n=p(t)?t:t.id;return!e.data_types[n]||["line","spline","area","area-spline","step","area-step"].indexOf(e.data_types[n])>=0},u.isStepType=function(t){var e=p(t)?t:t.id;return["step","area-step"].indexOf(this.config.data_types[e])>=0},u.isSplineType=function(t){var e=p(t)?t:t.id;return["spline","area-spline"].indexOf(this.config.data_types[e])>=0},u.isAreaType=function(t){var e=p(t)?t:t.id;return["area","area-spline","area-step"].indexOf(this.config.data_types[e])>=0},u.isBarType=function(t){var e=p(t)?t:t.id;return"bar"===this.config.data_types[e]},u.isScatterType=function(t){var e=p(t)?t:t.id;return"scatter"===this.config.data_types[e]},u.isPieType=function(t){var e=p(t)?t:t.id;return"pie"===this.config.data_types[e]},u.isGaugeType=function(t){var e=p(t)?t:t.id;return"gauge"===this.config.data_types[e]},u.isDonutType=function(t){var e=p(t)?t:t.id;return"donut"===this.config.data_types[e]},u.isArcType=function(t){return this.isPieType(t)||this.isDonutType(t)||this.isGaugeType(t)},u.lineData=function(t){return this.isLineType(t)?[t]:[]},u.arcData=function(t){return this.isArcType(t.data)?[t]:[]},u.barData=function(t){return this.isBarType(t)?t.values:[]},u.lineOrScatterData=function(t){return this.isLineType(t)||this.isScatterType(t)?t.values:[]},u.barOrLineData=function(t){return this.isBarType(t)||this.isLineType(t)?t.values:[]},u.isInterpolationType=function(t){return["linear","linear-closed","basis","basis-open","basis-closed","bundle","cardinal","cardinal-open","cardinal-closed","monotone"].indexOf(t)>=0},u.initGrid=function(){var t=this,e=t.config,n=t.d3;t.grid=t.main.append("g").attr("clip-path",t.clipPathForGrid).attr("class",f.grid),e.grid_x_show&&t.grid.append("g").attr("class",f.xgrids),e.grid_y_show&&t.grid.append("g").attr("class",f.ygrids),e.grid_focus_show&&t.grid.append("g").attr("class",f.xgridFocus).append("line").attr("class",f.xgridFocus),t.xgrid=n.selectAll([]),e.grid_lines_front||t.initGridLines()},u.initGridLines=function(){var t=this,e=t.d3;t.gridLines=t.main.append("g").attr("clip-path",t.clipPathForGrid).attr("class",f.grid+" "+f.gridLines),t.gridLines.append("g").attr("class",f.xgridLines),t.gridLines.append("g").attr("class",f.ygridLines),t.xgridLines=e.selectAll([])},u.updateXGrid=function(t){var e=this,n=e.config,r=e.d3,i=e.generateGridData(n.grid_x_type,e.x),a=e.isCategorized()?e.xAxis.tickOffset():0;e.xgridAttr=n.axis_rotated?{x1:0,x2:e.width,y1:function(t){return e.x(t)-a},y2:function(t){return e.x(t)-a}}:{x1:function(t){return e.x(t)+a},x2:function(t){return e.x(t)+a},y1:0,y2:e.height},e.xgrid=e.main.select("."+f.xgrids).selectAll("."+f.xgrid).data(i),e.xgrid.enter().append("line").attr("class",f.xgrid),t||e.xgrid.attr(e.xgridAttr).style("opacity",function(){return+r.select(this).attr(n.axis_rotated?"y1":"x1")===(n.axis_rotated?e.height:0)?0:1}),e.xgrid.exit().remove()},u.updateYGrid=function(){var t=this,e=t.config,n=t.yAxis.tickValues()||t.y.ticks(e.grid_y_ticks);t.ygrid=t.main.select("."+f.ygrids).selectAll("."+f.ygrid).data(n),t.ygrid.enter().append("line").attr("class",f.ygrid),t.ygrid.attr("x1",e.axis_rotated?t.y:0).attr("x2",e.axis_rotated?t.y:t.width).attr("y1",e.axis_rotated?0:t.y).attr("y2",e.axis_rotated?t.height:t.y),t.ygrid.exit().remove(),t.smoothLines(t.ygrid,"grid")},u.gridTextAnchor=function(t){return t.position?t.position:"end"},u.gridTextDx=function(t){return"start"===t.position?4:"middle"===t.position?0:-4},u.xGridTextX=function(t){return"start"===t.position?-this.height:"middle"===t.position?-this.height/2:0},u.yGridTextX=function(t){return"start"===t.position?0:"middle"===t.position?this.width/2:this.width},u.updateGrid=function(t){var e,n,r,i=this,a=i.main,o=i.config;i.grid.style("visibility",i.hasArcType()?"hidden":"visible"),a.select("line."+f.xgridFocus).style("visibility","hidden"),o.grid_x_show&&i.updateXGrid(),i.xgridLines=a.select("."+f.xgridLines).selectAll("."+f.xgridLine).data(o.grid_x_lines),e=i.xgridLines.enter().append("g").attr("class",function(t){return f.xgridLine+(t.class?" "+t.class:"")}),e.append("line").style("opacity",0),e.append("text").attr("text-anchor",i.gridTextAnchor).attr("transform",o.axis_rotated?"":"rotate(-90)").attr("dx",i.gridTextDx).attr("dy",-5).style("opacity",0),i.xgridLines.exit().transition().duration(t).style("opacity",0).remove(),o.grid_y_show&&i.updateYGrid(),i.ygridLines=a.select("."+f.ygridLines).selectAll("."+f.ygridLine).data(o.grid_y_lines),n=i.ygridLines.enter().append("g").attr("class",function(t){return f.ygridLine+(t.class?" "+t.class:"")}),n.append("line").style("opacity",0),n.append("text").attr("text-anchor",i.gridTextAnchor).attr("transform",o.axis_rotated?"rotate(-90)":"").attr("dx",i.gridTextDx).attr("dy",-5).style("opacity",0),r=i.yv.bind(i),i.ygridLines.select("line").transition().duration(t).attr("x1",o.axis_rotated?r:0).attr("x2",o.axis_rotated?r:i.width).attr("y1",o.axis_rotated?0:r).attr("y2",o.axis_rotated?i.height:r).style("opacity",1),i.ygridLines.select("text").transition().duration(t).attr("x",o.axis_rotated?i.xGridTextX.bind(i):i.yGridTextX.bind(i)).attr("y",r).text(function(t){return t.text}).style("opacity",1),i.ygridLines.exit().transition().duration(t).style("opacity",0).remove()},u.redrawGrid=function(t){var e=this,n=e.config,r=e.xv.bind(e),i=e.xgridLines.select("line"),a=e.xgridLines.select("text");return[(t?i.transition():i).attr("x1",n.axis_rotated?0:r).attr("x2",n.axis_rotated?e.width:r).attr("y1",n.axis_rotated?r:0).attr("y2",n.axis_rotated?r:e.height).style("opacity",1),(t?a.transition():a).attr("x",n.axis_rotated?e.yGridTextX.bind(e):e.xGridTextX.bind(e)).attr("y",r).text(function(t){return t.text}).style("opacity",1)]},u.showXGridFocus=function(t){var e=this,n=e.config,r=t.filter(function(t){return t&&h(t.value)}),i=e.main.selectAll("line."+f.xgridFocus),a=e.xx.bind(e);n.tooltip_show&&(e.hasType("scatter")||e.hasArcType()||(i.style("visibility","visible").data([r[0]]).attr(n.axis_rotated?"y1":"x1",a).attr(n.axis_rotated?"y2":"x2",a),e.smoothLines(i,"grid")))},u.hideXGridFocus=function(){this.main.select("line."+f.xgridFocus).style("visibility","hidden")},u.updateXgridFocus=function(){var t=this,e=t.config;t.main.select("line."+f.xgridFocus).attr("x1",e.axis_rotated?0:-10).attr("x2",e.axis_rotated?t.width:-10).attr("y1",e.axis_rotated?-10:0).attr("y2",e.axis_rotated?-10:t.height)},u.generateGridData=function(t,e){var n,r,i,a,o=this,s=[],u=o.main.select("."+f.axisX).selectAll(".tick").size();if("year"===t)for(n=o.getXDomain(),r=n[0].getFullYear(),i=n[1].getFullYear(),a=r;a<=i;a++)s.push(new Date(a+"-01-01 00:00:00"));else s=e.ticks(10),s.length>u&&(s=s.filter(function(t){return(""+t).indexOf(".")<0}));return s},u.getGridFilterToRemove=function(t){return t?function(e){var n=!1;return[].concat(t).forEach(function(t){("value"in t&&e.value===t.value||"class"in t&&e.class===t.class)&&(n=!0)}),n}:function(){return!0}},u.removeGridLines=function(t,e){var n=this,r=n.config,i=n.getGridFilterToRemove(t),a=function(t){return!i(t)},o=e?f.xgridLines:f.ygridLines,s=e?f.xgridLine:f.ygridLine;n.main.select("."+o).selectAll("."+s).filter(i).transition().duration(r.transition_duration).style("opacity",0).remove(),e?r.grid_x_lines=r.grid_x_lines.filter(a):r.grid_y_lines=r.grid_y_lines.filter(a)},u.initTooltip=function(){var t,e=this,n=e.config;if(e.tooltip=e.selectChart.style("position","relative").append("div").attr("class",f.tooltipContainer).style("position","absolute").style("pointer-events","none").style("display","none"),n.tooltip_init_show){if(e.isTimeSeries()&&p(n.tooltip_init_x)){for(n.tooltip_init_x=e.parseDate(n.tooltip_init_x),t=0;t<e.data.targets[0].values.length&&e.data.targets[0].values[t].x-n.tooltip_init_x!==0;t++);n.tooltip_init_x=t}e.tooltip.html(n.tooltip_contents.call(e,e.data.targets.map(function(t){return e.addName(t.values[n.tooltip_init_x])}),e.axis.getXAxisTickFormat(),e.getYFormat(e.hasArcType()),e.color)),e.tooltip.style("top",n.tooltip_init_position.top).style("left",n.tooltip_init_position.left).style("display","block")}},u.getTooltipContent=function(t,e,n,r){var i,a,o,s,u,c,l=this,f=l.config,h=f.tooltip_format_title||e,d=f.tooltip_format_name||function(t){return t},p=f.tooltip_format_value||n,g=l.isOrderAsc();if(0===f.data_groups.length)t.sort(function(t,e){var n=t?t.value:null,r=e?e.value:null;return g?n-r:r-n});else{var v=l.orderTargets(l.data.targets).map(function(t){return t.id});t.sort(function(t,e){var n=t?t.value:null,r=e?e.value:null;return n>0&&r>0&&(n=t?v.indexOf(t.id):null,r=e?v.indexOf(e.id):null),g?n-r:r-n})}for(a=0;a<t.length;a++)if(t[a]&&(t[a].value||0===t[a].value)&&(i||(o=S(h?h(t[a].x):t[a].x),i="<table class='"+l.CLASS.tooltip+"'>"+(o||0===o?"<tr><th colspan='2'>"+o+"</th></tr>":"")),s=S(p(t[a].value,t[a].ratio,t[a].id,t[a].index,t)),void 0!==s)){if(null===t[a].name)continue;u=S(d(t[a].name,t[a].ratio,t[a].id,t[a].index)),c=l.levelColor?l.levelColor(t[a].value):r(t[a].id),i+="<tr class='"+l.CLASS.tooltipName+"-"+l.getTargetSelectorSuffix(t[a].id)+"'>",i+="<td class='name'><span style='background-color:"+c+"'></span>"+u+"</td>",i+="<td class='value'>"+s+"</td>",i+="</tr>"}return i+"</table>"},u.tooltipPosition=function(t,e,n,r){var i,a,o,s,u,c=this,l=c.config,f=c.d3,h=c.hasArcType(),d=f.mouse(r);return h?(a=(c.width-(c.isLegendRight?c.getLegendWidth():0))/2+d[0],s=c.height/2+d[1]+20):(i=c.getSvgLeft(!0),l.axis_rotated?(a=i+d[0]+100,o=a+e,u=c.currentWidth-c.getCurrentPaddingRight(),s=c.x(t[0].x)+20):(a=i+c.getCurrentPaddingLeft(!0)+c.x(t[0].x)+20,o=a+e,u=i+c.currentWidth-c.getCurrentPaddingRight(),s=d[1]+15),o>u&&(a-=o-u+20),s+n>c.currentHeight&&(s-=n+30)),s<0&&(s=0),{top:s,left:a}},u.showTooltip=function(t,e){var n,r,i,a=this,o=a.config,s=a.hasArcType(),c=t.filter(function(t){return t&&h(t.value)}),l=o.tooltip_position||u.tooltipPosition;0!==c.length&&o.tooltip_show&&(a.tooltip.html(o.tooltip_contents.call(a,t,a.axis.getXAxisTickFormat(),a.getYFormat(s),a.color)).style("display","block"),n=a.tooltip.property("offsetWidth"),r=a.tooltip.property("offsetHeight"),i=l.call(this,c,n,r,e),a.tooltip.style("top",i.top+"px").style("left",i.left+"px"))},u.hideTooltip=function(){this.tooltip.style("display","none")},u.initLegend=function(){var t=this;return t.legendItemTextBox={},t.legendHasRendered=!1,t.legend=t.svg.append("g").attr("transform",t.getTranslate("legend")),t.config.legend_show?void t.updateLegendWithDefaults():(t.legend.style("visibility","hidden"),void(t.hiddenLegendIds=t.mapToIds(t.data.targets)))},u.updateLegendWithDefaults=function(){var t=this;t.updateLegend(t.mapToIds(t.data.targets),{withTransform:!1,withTransitionForTransform:!1,withTransition:!1})},u.updateSizeForLegend=function(t,e){var n=this,r=n.config,i={top:n.isLegendTop?n.getCurrentPaddingTop()+r.legend_inset_y+5.5:n.currentHeight-t-n.getCurrentPaddingBottom()-r.legend_inset_y,left:n.isLegendLeft?n.getCurrentPaddingLeft()+r.legend_inset_x+.5:n.currentWidth-e-n.getCurrentPaddingRight()-r.legend_inset_x+.5};n.margin3={top:n.isLegendRight?0:n.isLegendInset?i.top:n.currentHeight-t,right:NaN,bottom:0,left:n.isLegendRight?n.currentWidth-e:n.isLegendInset?i.left:0}},u.transformLegend=function(t){var e=this;(t?e.legend.transition():e.legend).attr("transform",e.getTranslate("legend"))},u.updateLegendStep=function(t){this.legendStep=t},u.updateLegendItemWidth=function(t){this.legendItemWidth=t},u.updateLegendItemHeight=function(t){this.legendItemHeight=t},u.getLegendWidth=function(){var t=this;return t.config.legend_show?t.isLegendRight||t.isLegendInset?t.legendItemWidth*(t.legendStep+1):t.currentWidth:0},u.getLegendHeight=function(){var t=this,e=0;return t.config.legend_show&&(e=t.isLegendRight?t.currentHeight:Math.max(20,t.legendItemHeight)*(t.legendStep+1)),e},u.opacityForLegend=function(t){return t.classed(f.legendItemHidden)?null:1},u.opacityForUnfocusedLegend=function(t){return t.classed(f.legendItemHidden)?null:.3},u.toggleFocusLegend=function(t,e){var n=this;t=n.mapToTargetIds(t),n.legend.selectAll("."+f.legendItem).filter(function(e){return t.indexOf(e)>=0}).classed(f.legendItemFocused,e).transition().duration(100).style("opacity",function(){var t=e?n.opacityForLegend:n.opacityForUnfocusedLegend;return t.call(n,n.d3.select(this))})},u.revertLegend=function(){var t=this,e=t.d3;t.legend.selectAll("."+f.legendItem).classed(f.legendItemFocused,!1).transition().duration(100).style("opacity",function(){return t.opacityForLegend(e.select(this))})},u.showLegend=function(t){var e=this,n=e.config;n.legend_show||(n.legend_show=!0,e.legend.style("visibility","visible"),e.legendHasRendered||e.updateLegendWithDefaults()),e.removeHiddenLegendIds(t),e.legend.selectAll(e.selectorLegends(t)).style("visibility","visible").transition().style("opacity",function(){return e.opacityForLegend(e.d3.select(this))})},u.hideLegend=function(t){var e=this,n=e.config;n.legend_show&&_(t)&&(n.legend_show=!1,e.legend.style("visibility","hidden")),e.addHiddenLegendIds(t),e.legend.selectAll(e.selectorLegends(t)).style("opacity",0).style("visibility","hidden")},u.clearLegendItemTextBoxCache=function(){this.legendItemTextBox={}},u.updateLegend=function(t,e,n){function r(t,e){return S.legendItemTextBox[e]||(S.legendItemTextBox[e]=S.getTextRect(t.textContent,f.legendItem,t)),S.legendItemTextBox[e]}function i(e,n,i){function a(t,e){e||(o=(p-O-d)/2,o<k&&(o=(p-d)/2,O=0,N++)),I[t]=N,R[N]=S.isLegendInset?10:o,L[t]=O,O+=d}var o,s,u=0===i,c=i===t.length-1,l=r(e,n),f=l.width+P+(!c||S.isLegendRight||S.isLegendInset?C:0)+T.legend_padding,h=l.height+A,d=S.isLegendRight||S.isLegendInset?h:f,p=S.isLegendRight||S.isLegendInset?S.getLegendHeight():S.getLegendWidth();return u&&(O=0,N=0,E=0,M=0),T.legend_show&&!S.isLegendToShow(n)?void(D[n]=V[n]=I[n]=L[n]=0):(D[n]=f,V[n]=h,(!E||f>=E)&&(E=f),(!M||h>=M)&&(M=h),s=S.isLegendRight||S.isLegendInset?M:E,void(T.legend_equally?(Object.keys(D).forEach(function(t){D[t]=E}),Object.keys(V).forEach(function(t){V[t]=M}),o=(p-s*t.length)/2,o<k?(O=0,N=0,t.forEach(function(t){a(t)})):a(n,!0)):a(n)))}var a,o,s,u,c,l,h,d,p,g,m,y,x,_,b,w,S=this,T=S.config,A=4,C=10,E=0,M=0,k=10,P=T.legend_item_tile_width+5,O=0,L={},D={},V={},R=[0],I={},N=0;t=t.filter(function(t){return!v(T.data_names[t])||null!==T.data_names[t]}),e=e||{},m=$(e,"withTransition",!0),y=$(e,"withTransitionForTransform",!0),S.isLegendInset&&(N=T.legend_inset_step?T.legend_inset_step:t.length,S.updateLegendStep(N)),S.isLegendRight?(a=function(t){return E*I[t]},u=function(t){return R[I[t]]+L[t]}):S.isLegendInset?(a=function(t){return E*I[t]+10},u=function(t){return R[I[t]]+L[t]}):(a=function(t){return R[I[t]]+L[t]},u=function(t){return M*I[t]}),o=function(t,e){return a(t,e)+4+T.legend_item_tile_width},c=function(t,e){return u(t,e)+9},s=function(t,e){return a(t,e)},l=function(t,e){return u(t,e)-5},h=function(t,e){return a(t,e)-2},d=function(t,e){return a(t,e)-2+T.legend_item_tile_width},p=function(t,e){return u(t,e)+4},g=S.legend.selectAll("."+f.legendItem).data(t).enter().append("g").attr("class",function(t){return S.generateClass(f.legendItem,t)}).style("visibility",function(t){return S.isLegendToShow(t)?"visible":"hidden"}).style("cursor","pointer").on("click",function(t){T.legend_item_onclick?T.legend_item_onclick.call(S,t):S.d3.event.altKey?(S.api.hide(),S.api.show(t)):(S.api.toggle(t),S.isTargetToShow(t)?S.api.focus(t):S.api.revert())}).on("mouseover",function(t){T.legend_item_onmouseover?T.legend_item_onmouseover.call(S,t):(S.d3.select(this).classed(f.legendItemFocused,!0),!S.transiting&&S.isTargetToShow(t)&&S.api.focus(t))}).on("mouseout",function(t){T.legend_item_onmouseout?T.legend_item_onmouseout.call(S,t):(S.d3.select(this).classed(f.legendItemFocused,!1),S.api.revert())}),g.append("text").text(function(t){return v(T.data_names[t])?T.data_names[t]:t}).each(function(t,e){i(this,t,e)}).style("pointer-events","none").attr("x",S.isLegendRight||S.isLegendInset?o:-200).attr("y",S.isLegendRight||S.isLegendInset?-200:c),g.append("rect").attr("class",f.legendItemEvent).style("fill-opacity",0).attr("x",S.isLegendRight||S.isLegendInset?s:-200).attr("y",S.isLegendRight||S.isLegendInset?-200:l),g.append("line").attr("class",f.legendItemTile).style("stroke",S.color).style("pointer-events","none").attr("x1",S.isLegendRight||S.isLegendInset?h:-200).attr("y1",S.isLegendRight||S.isLegendInset?-200:p).attr("x2",S.isLegendRight||S.isLegendInset?d:-200).attr("y2",S.isLegendRight||S.isLegendInset?-200:p).attr("stroke-width",T.legend_item_tile_height),w=S.legend.select("."+f.legendBackground+" rect"),S.isLegendInset&&E>0&&0===w.size()&&(w=S.legend.insert("g","."+f.legendItem).attr("class",f.legendBackground).append("rect")),x=S.legend.selectAll("text").data(t).text(function(t){return v(T.data_names[t])?T.data_names[t]:t}).each(function(t,e){i(this,t,e)}),(m?x.transition():x).attr("x",o).attr("y",c),_=S.legend.selectAll("rect."+f.legendItemEvent).data(t),(m?_.transition():_).attr("width",function(t){return D[t]}).attr("height",function(t){return V[t]}).attr("x",s).attr("y",l),b=S.legend.selectAll("line."+f.legendItemTile).data(t),(m?b.transition():b).style("stroke",S.color).attr("x1",h).attr("y1",p).attr("x2",d).attr("y2",p),w&&(m?w.transition():w).attr("height",S.getLegendHeight()-12).attr("width",E*(N+1)+10),S.legend.selectAll("."+f.legendItem).classed(f.legendItemHidden,function(t){return!S.isTargetToShow(t)}),S.updateLegendItemWidth(E),S.updateLegendItemHeight(M),S.updateLegendStep(N),S.updateSizes(),S.updateScales(),S.updateSvgSize(),S.transformAll(y,n),S.legendHasRendered=!0},u.initTitle=function(){var t=this;t.title=t.svg.append("text").text(t.config.title_text).attr("class",t.CLASS.title)},u.redrawTitle=function(){var t=this;t.title.attr("x",t.xForTitle.bind(t)).attr("y",t.yForTitle.bind(t))},u.xForTitle=function(){var t,e=this,n=e.config,r=n.title_position||"left";return t=r.indexOf("right")>=0?e.currentWidth-e.getTextRect(e.title.node().textContent,e.CLASS.title,e.title.node()).width-n.title_padding.right:r.indexOf("center")>=0?(e.currentWidth-e.getTextRect(e.title.node().textContent,e.CLASS.title,e.title.node()).width)/2:n.title_padding.left},u.yForTitle=function(){var t=this;return t.config.title_padding.top+t.getTextRect(t.title.node().textContent,t.CLASS.title,t.title.node()).height},u.getTitlePadding=function(){var t=this;return t.yForTitle()+t.config.title_padding.bottom},n(e,a),a.prototype.init=function(){var t=this.owner,e=t.config,n=t.main;t.axes.x=n.append("g").attr("class",f.axis+" "+f.axisX).attr("clip-path",t.clipPathForXAxis).attr("transform",t.getTranslate("x")).style("visibility",e.axis_x_show?"visible":"hidden"),t.axes.x.append("text").attr("class",f.axisXLabel).attr("transform",e.axis_rotated?"rotate(-90)":"").style("text-anchor",this.textAnchorForXAxisLabel.bind(this)),t.axes.y=n.append("g").attr("class",f.axis+" "+f.axisY).attr("clip-path",e.axis_y_inner?"":t.clipPathForYAxis).attr("transform",t.getTranslate("y")).style("visibility",e.axis_y_show?"visible":"hidden"),t.axes.y.append("text").attr("class",f.axisYLabel).attr("transform",e.axis_rotated?"":"rotate(-90)").style("text-anchor",this.textAnchorForYAxisLabel.bind(this)),t.axes.y2=n.append("g").attr("class",f.axis+" "+f.axisY2).attr("transform",t.getTranslate("y2")).style("visibility",e.axis_y2_show?"visible":"hidden"),t.axes.y2.append("text").attr("class",f.axisY2Label).attr("transform",e.axis_rotated?"":"rotate(-90)").style("text-anchor",this.textAnchorForY2AxisLabel.bind(this))},a.prototype.getXAxis=function(t,e,n,r,i,a,s){var u=this.owner,c=u.config,l={isCategory:u.isCategorized(),withOuterTick:i,tickMultiline:c.axis_x_tick_multiline,tickWidth:c.axis_x_tick_width,tickTextRotate:s?0:c.axis_x_tick_rotate,withoutTransition:a},f=o(u.d3,l).scale(t).orient(e);return u.isTimeSeries()&&r&&"function"!=typeof r&&(r=r.map(function(t){return u.parseDate(t)})),f.tickFormat(n).tickValues(r),u.isCategorized()&&(f.tickCentered(c.axis_x_tick_centered),_(c.axis_x_tick_culling)&&(c.axis_x_tick_culling=!1)),f},a.prototype.updateXAxisTickValues=function(t,e){var n,r=this.owner,i=r.config;return(i.axis_x_tick_fit||i.axis_x_tick_count)&&(n=this.generateTickValues(r.mapTargetsToUniqueXs(t),i.axis_x_tick_count,r.isTimeSeries())),e?e.tickValues(n):(r.xAxis.tickValues(n),r.subXAxis.tickValues(n)),n},a.prototype.getYAxis=function(t,e,n,r,i,a,s){var u=this.owner,c=u.config,l={withOuterTick:i,withoutTransition:a,tickTextRotate:s?0:c.axis_y_tick_rotate},f=o(u.d3,l).scale(t).orient(e).tickFormat(n);return u.isTimeSeriesY()?f.ticks(u.d3.time[c.axis_y_tick_time_value],c.axis_y_tick_time_interval):f.tickValues(r),f},a.prototype.getId=function(t){var e=this.owner.config;return t in e.data_axes?e.data_axes[t]:"y"},a.prototype.getXAxisTickFormat=function(){var t=this.owner,e=t.config,n=t.isTimeSeries()?t.defaultAxisTimeFormat:t.isCategorized()?t.categoryName:function(t){return t<0?t.toFixed(0):t};return e.axis_x_tick_format&&(d(e.axis_x_tick_format)?n=e.axis_x_tick_format:t.isTimeSeries()&&(n=function(n){return n?t.axisTimeFormat(e.axis_x_tick_format)(n):""})),d(n)?function(e){return n.call(t,e)}:n},a.prototype.getTickValues=function(t,e){return t?t:e?e.tickValues():void 0},a.prototype.getXAxisTickValues=function(){return this.getTickValues(this.owner.config.axis_x_tick_values,this.owner.xAxis)},a.prototype.getYAxisTickValues=function(){return this.getTickValues(this.owner.config.axis_y_tick_values,this.owner.yAxis)},a.prototype.getY2AxisTickValues=function(){return this.getTickValues(this.owner.config.axis_y2_tick_values,this.owner.y2Axis)},a.prototype.getLabelOptionByAxisId=function(t){var e,n=this.owner,r=n.config;return"y"===t?e=r.axis_y_label:"y2"===t?e=r.axis_y2_label:"x"===t&&(e=r.axis_x_label),e},a.prototype.getLabelText=function(t){var e=this.getLabelOptionByAxisId(t);return p(e)?e:e?e.text:null},a.prototype.setLabelText=function(t,e){var n=this.owner,r=n.config,i=this.getLabelOptionByAxisId(t);p(i)?"y"===t?r.axis_y_label=e:"y2"===t?r.axis_y2_label=e:"x"===t&&(r.axis_x_label=e):i&&(i.text=e)},a.prototype.getLabelPosition=function(t,e){var n=this.getLabelOptionByAxisId(t),r=n&&"object"==typeof n&&n.position?n.position:e;return{isInner:r.indexOf("inner")>=0,isOuter:r.indexOf("outer")>=0,isLeft:r.indexOf("left")>=0,isCenter:r.indexOf("center")>=0,isRight:r.indexOf("right")>=0,isTop:r.indexOf("top")>=0,isMiddle:r.indexOf("middle")>=0,isBottom:r.indexOf("bottom")>=0}},a.prototype.getXAxisLabelPosition=function(){return this.getLabelPosition("x",this.owner.config.axis_rotated?"inner-top":"inner-right")},a.prototype.getYAxisLabelPosition=function(){return this.getLabelPosition("y",this.owner.config.axis_rotated?"inner-right":"inner-top")},a.prototype.getY2AxisLabelPosition=function(){return this.getLabelPosition("y2",this.owner.config.axis_rotated?"inner-right":"inner-top")},a.prototype.getLabelPositionById=function(t){return"y2"===t?this.getY2AxisLabelPosition():"y"===t?this.getYAxisLabelPosition():this.getXAxisLabelPosition()},a.prototype.textForXAxisLabel=function(){return this.getLabelText("x")},a.prototype.textForYAxisLabel=function(){return this.getLabelText("y")},a.prototype.textForY2AxisLabel=function(){return this.getLabelText("y2")},a.prototype.xForAxisLabel=function(t,e){var n=this.owner;return t?e.isLeft?0:e.isCenter?n.width/2:n.width:e.isBottom?-n.height:e.isMiddle?-n.height/2:0},a.prototype.dxForAxisLabel=function(t,e){return t?e.isLeft?"0.5em":e.isRight?"-0.5em":"0":e.isTop?"-0.5em":e.isBottom?"0.5em":"0"},a.prototype.textAnchorForAxisLabel=function(t,e){return t?e.isLeft?"start":e.isCenter?"middle":"end":e.isBottom?"start":e.isMiddle?"middle":"end"},a.prototype.xForXAxisLabel=function(){return this.xForAxisLabel(!this.owner.config.axis_rotated,this.getXAxisLabelPosition())},a.prototype.xForYAxisLabel=function(){return this.xForAxisLabel(this.owner.config.axis_rotated,this.getYAxisLabelPosition())},a.prototype.xForY2AxisLabel=function(){return this.xForAxisLabel(this.owner.config.axis_rotated,this.getY2AxisLabelPosition())},a.prototype.dxForXAxisLabel=function(){return this.dxForAxisLabel(!this.owner.config.axis_rotated,this.getXAxisLabelPosition())},a.prototype.dxForYAxisLabel=function(){return this.dxForAxisLabel(this.owner.config.axis_rotated,this.getYAxisLabelPosition())},a.prototype.dxForY2AxisLabel=function(){return this.dxForAxisLabel(this.owner.config.axis_rotated,this.getY2AxisLabelPosition())},a.prototype.dyForXAxisLabel=function(){var t=this.owner,e=t.config,n=this.getXAxisLabelPosition();return e.axis_rotated?n.isInner?"1.2em":-25-this.getMaxTickWidth("x"):n.isInner?"-0.5em":e.axis_x_height?e.axis_x_height-10:"3em"},a.prototype.dyForYAxisLabel=function(){var t=this.owner,e=this.getYAxisLabelPosition();return t.config.axis_rotated?e.isInner?"-0.5em":"3em":e.isInner?"1.2em":-10-(t.config.axis_y_inner?0:this.getMaxTickWidth("y")+10)},a.prototype.dyForY2AxisLabel=function(){var t=this.owner,e=this.getY2AxisLabelPosition();return t.config.axis_rotated?e.isInner?"1.2em":"-2.2em":e.isInner?"-0.5em":15+(t.config.axis_y2_inner?0:this.getMaxTickWidth("y2")+15)},a.prototype.textAnchorForXAxisLabel=function(){var t=this.owner;return this.textAnchorForAxisLabel(!t.config.axis_rotated,this.getXAxisLabelPosition())},a.prototype.textAnchorForYAxisLabel=function(){var t=this.owner;return this.textAnchorForAxisLabel(t.config.axis_rotated,this.getYAxisLabelPosition())},a.prototype.textAnchorForY2AxisLabel=function(){var t=this.owner;return this.textAnchorForAxisLabel(t.config.axis_rotated,this.getY2AxisLabelPosition())},a.prototype.getMaxTickWidth=function(t,e){var n,r,i,a,o,s=this.owner,u=s.config,c=0;return e&&s.currentMaxTickWidths[t]?s.currentMaxTickWidths[t]:(s.svg&&(n=s.filterTargetsToShow(s.data.targets),"y"===t?(r=s.y.copy().domain(s.getYDomain(n,"y")),i=this.getYAxis(r,s.yOrient,u.axis_y_tick_format,s.yAxisTickValues,!1,!0,!0)):"y2"===t?(r=s.y2.copy().domain(s.getYDomain(n,"y2")),i=this.getYAxis(r,s.y2Orient,u.axis_y2_tick_format,s.y2AxisTickValues,!1,!0,!0)):(r=s.x.copy().domain(s.getXDomain(n)),i=this.getXAxis(r,s.xOrient,s.xAxisTickFormat,s.xAxisTickValues,!1,!0,!0),this.updateXAxisTickValues(n,i)),a=s.d3.select("body").append("div").classed("c3",!0),o=a.append("svg").style("visibility","hidden").style("position","fixed").style("top",0).style("left",0),o.append("g").call(i).each(function(){s.d3.select(this).selectAll("text").each(function(){var t=this.getBoundingClientRect();c<t.width&&(c=t.width)}),a.remove()})),s.currentMaxTickWidths[t]=c<=0?s.currentMaxTickWidths[t]:c,s.currentMaxTickWidths[t])},a.prototype.updateLabels=function(t){var e=this.owner,n=e.main.select("."+f.axisX+" ."+f.axisXLabel),r=e.main.select("."+f.axisY+" ."+f.axisYLabel),i=e.main.select("."+f.axisY2+" ."+f.axisY2Label);(t?n.transition():n).attr("x",this.xForXAxisLabel.bind(this)).attr("dx",this.dxForXAxisLabel.bind(this)).attr("dy",this.dyForXAxisLabel.bind(this)).text(this.textForXAxisLabel.bind(this)),(t?r.transition():r).attr("x",this.xForYAxisLabel.bind(this)).attr("dx",this.dxForYAxisLabel.bind(this)).attr("dy",this.dyForYAxisLabel.bind(this)).text(this.textForYAxisLabel.bind(this)),(t?i.transition():i).attr("x",this.xForY2AxisLabel.bind(this)).attr("dx",this.dxForY2AxisLabel.bind(this)).attr("dy",this.dyForY2AxisLabel.bind(this)).text(this.textForY2AxisLabel.bind(this))},a.prototype.getPadding=function(t,e,n,r){var i="number"==typeof t?t:t[e];return h(i)?"ratio"===t.unit?t[e]*r:this.convertPixelsToAxisPadding(i,r):n},a.prototype.convertPixelsToAxisPadding=function(t,e){var n=this.owner,r=n.config.axis_rotated?n.width:n.height;return e*(t/r)},a.prototype.generateTickValues=function(t,e,n){var r,i,a,o,s,u,c,l=t;if(e)if(r=d(e)?e():e,1===r)l=[t[0]];else if(2===r)l=[t[0],t[t.length-1]];else if(r>2){for(o=r-2,i=t[0],a=t[t.length-1],s=(a-i)/(o+1),l=[i],u=0;u<o;u++)c=+i+s*(u+1),l.push(n?new Date(c):c);l.push(a)}return n||(l=l.sort(function(t,e){return t-e})),l},a.prototype.generateTransitions=function(t){var e=this.owner,n=e.axes;return{axisX:t?n.x.transition().duration(t):n.x,axisY:t?n.y.transition().duration(t):n.y,axisY2:t?n.y2.transition().duration(t):n.y2,axisSubX:t?n.subx.transition().duration(t):n.subx}},a.prototype.redraw=function(t,e){var n=this.owner;n.axes.x.style("opacity",e?0:1),n.axes.y.style("opacity",e?0:1),n.axes.y2.style("opacity",e?0:1),n.axes.subx.style("opacity",e?0:1),t.axisX.call(n.xAxis),t.axisY.call(n.yAxis),t.axisY2.call(n.y2Axis),t.axisSubX.call(n.subXAxis)},u.getClipPath=function(e){var n=t.navigator.appVersion.toLowerCase().indexOf("msie 9.")>=0;
return"url("+(n?"":document.URL.split("#")[0])+"#"+e+")"},u.appendClip=function(t,e){return t.append("clipPath").attr("id",e).append("rect")},u.getAxisClipX=function(t){var e=Math.max(30,this.margin.left);return t?-(1+e):-(e-1)},u.getAxisClipY=function(t){return t?-20:-this.margin.top},u.getXAxisClipX=function(){var t=this;return t.getAxisClipX(!t.config.axis_rotated)},u.getXAxisClipY=function(){var t=this;return t.getAxisClipY(!t.config.axis_rotated)},u.getYAxisClipX=function(){var t=this;return t.config.axis_y_inner?-1:t.getAxisClipX(t.config.axis_rotated)},u.getYAxisClipY=function(){var t=this;return t.getAxisClipY(t.config.axis_rotated)},u.getAxisClipWidth=function(t){var e=this,n=Math.max(30,e.margin.left),r=Math.max(30,e.margin.right);return t?e.width+2+n+r:e.margin.left+20},u.getAxisClipHeight=function(t){return(t?this.margin.bottom:this.margin.top+this.height)+20},u.getXAxisClipWidth=function(){var t=this;return t.getAxisClipWidth(!t.config.axis_rotated)},u.getXAxisClipHeight=function(){var t=this;return t.getAxisClipHeight(!t.config.axis_rotated)},u.getYAxisClipWidth=function(){var t=this;return t.getAxisClipWidth(t.config.axis_rotated)+(t.config.axis_y_inner?20:0)},u.getYAxisClipHeight=function(){var t=this;return t.getAxisClipHeight(t.config.axis_rotated)},u.initPie=function(){var t=this,e=t.d3,n=t.config;t.pie=e.layout.pie().value(function(t){return t.values.reduce(function(t,e){return t+e.value},0)}),n.data_order||t.pie.sort(null)},u.updateRadius=function(){var t=this,e=t.config,n=e.gauge_width||e.donut_width;t.radiusExpanded=Math.min(t.arcWidth,t.arcHeight)/2,t.radius=.95*t.radiusExpanded,t.innerRadiusRatio=n?(t.radius-n)/t.radius:.6,t.innerRadius=t.hasType("donut")||t.hasType("gauge")?t.radius*t.innerRadiusRatio:0},u.updateArc=function(){var t=this;t.svgArc=t.getSvgArc(),t.svgArcExpanded=t.getSvgArcExpanded(),t.svgArcExpandedSub=t.getSvgArcExpanded(.98)},u.updateAngle=function(t){var e,n,r,i,a=this,o=a.config,s=!1,u=0;return o?(a.pie(a.filterTargetsToShow(a.data.targets)).forEach(function(e){s||e.data.id!==t.data.id||(s=!0,t=e,t.index=u),u++}),isNaN(t.startAngle)&&(t.startAngle=0),isNaN(t.endAngle)&&(t.endAngle=t.startAngle),a.isGaugeType(t.data)&&(e=o.gauge_min,n=o.gauge_max,r=Math.PI*(o.gauge_fullCircle?2:1)/(n-e),i=t.value<e?0:t.value<n?t.value-e:n-e,t.startAngle=o.gauge_startingAngle,t.endAngle=t.startAngle+r*i),s?t:null):null},u.getSvgArc=function(){var t=this,e=t.d3.svg.arc().outerRadius(t.radius).innerRadius(t.innerRadius),n=function(n,r){var i;return r?e(n):(i=t.updateAngle(n),i?e(i):"M 0 0")};return n.centroid=e.centroid,n},u.getSvgArcExpanded=function(t){var e=this,n=e.d3.svg.arc().outerRadius(e.radiusExpanded*(t?t:1)).innerRadius(e.innerRadius);return function(t){var r=e.updateAngle(t);return r?n(r):"M 0 0"}},u.getArc=function(t,e,n){return n||this.isArcType(t.data)?this.svgArc(t,e):"M 0 0"},u.transformForArcLabel=function(t){var e,n,r,i,a,o=this,s=o.config,u=o.updateAngle(t),c="";return u&&!o.hasType("gauge")&&(e=this.svgArc.centroid(u),n=isNaN(e[0])?0:e[0],r=isNaN(e[1])?0:e[1],i=Math.sqrt(n*n+r*r),a=o.hasType("donut")&&s.donut_label_ratio?d(s.donut_label_ratio)?s.donut_label_ratio(t,o.radius,i):s.donut_label_ratio:o.hasType("pie")&&s.pie_label_ratio?d(s.pie_label_ratio)?s.pie_label_ratio(t,o.radius,i):s.pie_label_ratio:o.radius&&i?(36/o.radius>.375?1.175-36/o.radius:.8)*o.radius/i:0,c="translate("+n*a+","+r*a+")"),c},u.getArcRatio=function(t){var e=this,n=e.config,r=Math.PI*(e.hasType("gauge")&&!n.gauge_fullCircle?1:2);return t?(t.endAngle-t.startAngle)/r:null},u.convertToArcData=function(t){return this.addName({id:t.data.id,value:t.value,ratio:this.getArcRatio(t),index:t.index})},u.textForArcLabel=function(t){var e,n,r,i,a,o=this;return o.shouldShowArcLabel()?(e=o.updateAngle(t),n=e?e.value:null,r=o.getArcRatio(e),i=t.data.id,o.hasType("gauge")||o.meetsArcLabelThreshold(r)?(a=o.getArcLabelFormat(),a?a(n,r,i):o.defaultArcValueFormat(n,r)):""):""},u.expandArc=function(e){var n,r=this;return r.transiting?void(n=t.setInterval(function(){r.transiting||(t.clearInterval(n),r.legend.selectAll(".c3-legend-item-focused").size()>0&&r.expandArc(e))},10)):(e=r.mapToTargetIds(e),void r.svg.selectAll(r.selectorTargets(e,"."+f.chartArc)).each(function(t){r.shouldExpand(t.data.id)&&r.d3.select(this).selectAll("path").transition().duration(r.expandDuration(t.data.id)).attr("d",r.svgArcExpanded).transition().duration(2*r.expandDuration(t.data.id)).attr("d",r.svgArcExpandedSub).each(function(t){r.isDonutType(t.data)})}))},u.unexpandArc=function(t){var e=this;e.transiting||(t=e.mapToTargetIds(t),e.svg.selectAll(e.selectorTargets(t,"."+f.chartArc)).selectAll("path").transition().duration(function(t){return e.expandDuration(t.data.id)}).attr("d",e.svgArc),e.svg.selectAll("."+f.arc).style("opacity",1))},u.expandDuration=function(t){var e=this,n=e.config;return e.isDonutType(t)?n.donut_expand_duration:e.isGaugeType(t)?n.gauge_expand_duration:e.isPieType(t)?n.pie_expand_duration:50},u.shouldExpand=function(t){var e=this,n=e.config;return e.isDonutType(t)&&n.donut_expand||e.isGaugeType(t)&&n.gauge_expand||e.isPieType(t)&&n.pie_expand},u.shouldShowArcLabel=function(){var t=this,e=t.config,n=!0;return t.hasType("donut")?n=e.donut_label_show:t.hasType("pie")&&(n=e.pie_label_show),n},u.meetsArcLabelThreshold=function(t){var e=this,n=e.config,r=e.hasType("donut")?n.donut_label_threshold:n.pie_label_threshold;return t>=r},u.getArcLabelFormat=function(){var t=this,e=t.config,n=e.pie_label_format;return t.hasType("gauge")?n=e.gauge_label_format:t.hasType("donut")&&(n=e.donut_label_format),n},u.getArcTitle=function(){var t=this;return t.hasType("donut")?t.config.donut_title:""},u.updateTargetsForArc=function(t){var e,n,r=this,i=r.main,a=r.classChartArc.bind(r),o=r.classArcs.bind(r),s=r.classFocus.bind(r);e=i.select("."+f.chartArcs).selectAll("."+f.chartArc).data(r.pie(t)).attr("class",function(t){return a(t)+s(t.data)}),n=e.enter().append("g").attr("class",a),n.append("g").attr("class",o),n.append("text").attr("dy",r.hasType("gauge")?"-.1em":".35em").style("opacity",0).style("text-anchor","middle").style("pointer-events","none")},u.initArc=function(){var t=this;t.arcs=t.main.select("."+f.chart).append("g").attr("class",f.chartArcs).attr("transform",t.getTranslate("arc")),t.arcs.append("text").attr("class",f.chartArcsTitle).style("text-anchor","middle").text(t.getArcTitle())},u.redrawArc=function(t,e,n){var r,i=this,a=i.d3,o=i.config,s=i.main;r=s.selectAll("."+f.arcs).selectAll("."+f.arc).data(i.arcData.bind(i)),r.enter().append("path").attr("class",i.classArc.bind(i)).style("fill",function(t){return i.color(t.data)}).style("cursor",function(t){return o.interaction_enabled&&o.data_selection_isselectable(t)?"pointer":null}).style("opacity",0).each(function(t){i.isGaugeType(t.data)&&(t.startAngle=t.endAngle=o.gauge_startingAngle),this._current=t}),r.attr("transform",function(t){return!i.isGaugeType(t.data)&&n?"scale(0)":""}).style("opacity",function(t){return t===this._current?0:1}).on("mouseover",o.interaction_enabled?function(t){var e,n;i.transiting||(e=i.updateAngle(t),e&&(n=i.convertToArcData(e),i.expandArc(e.data.id),i.api.focus(e.data.id),i.toggleFocusLegend(e.data.id,!0),i.config.data_onmouseover(n,this)))}:null).on("mousemove",o.interaction_enabled?function(t){var e,n,r=i.updateAngle(t);r&&(e=i.convertToArcData(r),n=[e],i.showTooltip(n,this))}:null).on("mouseout",o.interaction_enabled?function(t){var e,n;i.transiting||(e=i.updateAngle(t),e&&(n=i.convertToArcData(e),i.unexpandArc(e.data.id),i.api.revert(),i.revertLegend(),i.hideTooltip(),i.config.data_onmouseout(n,this)))}:null).on("click",o.interaction_enabled?function(t,e){var n,r=i.updateAngle(t);r&&(n=i.convertToArcData(r),i.toggleShape&&i.toggleShape(this,n,e),i.config.data_onclick.call(i.api,n,this))}:null).each(function(){i.transiting=!0}).transition().duration(t).attrTween("d",function(t){var e,n=i.updateAngle(t);return n?(isNaN(this._current.startAngle)&&(this._current.startAngle=0),isNaN(this._current.endAngle)&&(this._current.endAngle=this._current.startAngle),e=a.interpolate(this._current,n),this._current=e(0),function(n){var r=e(n);return r.data=t.data,i.getArc(r,!0)}):function(){return"M 0 0"}}).attr("transform",n?"scale(1)":"").style("fill",function(t){return i.levelColor?i.levelColor(t.data.values[0].value):i.color(t.data.id)}).style("opacity",1).call(i.endall,function(){i.transiting=!1}),r.exit().transition().duration(e).style("opacity",0).remove(),s.selectAll("."+f.chartArc).select("text").style("opacity",0).attr("class",function(t){return i.isGaugeType(t.data)?f.gaugeValue:""}).text(i.textForArcLabel.bind(i)).attr("transform",i.transformForArcLabel.bind(i)).style("font-size",function(t){return i.isGaugeType(t.data)?Math.round(i.radius/5)+"px":""}).transition().duration(t).style("opacity",function(t){return i.isTargetToShow(t.data.id)&&i.isArcType(t.data)?1:0}),s.select("."+f.chartArcsTitle).style("opacity",i.hasType("donut")||i.hasType("gauge")?1:0),i.hasType("gauge")&&(i.arcs.select("."+f.chartArcsBackground).attr("d",function(){var t={data:[{value:o.gauge_max}],startAngle:o.gauge_startingAngle,endAngle:-1*o.gauge_startingAngle};return i.getArc(t,!0,!0)}),i.arcs.select("."+f.chartArcsGaugeUnit).attr("dy",".75em").text(o.gauge_label_show?o.gauge_units:""),i.arcs.select("."+f.chartArcsGaugeMin).attr("dx",-1*(i.innerRadius+(i.radius-i.innerRadius)/(o.gauge_fullCircle?1:2))+"px").attr("dy","1.2em").text(o.gauge_label_show?o.gauge_min:""),i.arcs.select("."+f.chartArcsGaugeMax).attr("dx",i.innerRadius+(i.radius-i.innerRadius)/(o.gauge_fullCircle?1:2)+"px").attr("dy","1.2em").text(o.gauge_label_show?o.gauge_max:""))},u.initGauge=function(){var t=this.arcs;this.hasType("gauge")&&(t.append("path").attr("class",f.chartArcsBackground),t.append("text").attr("class",f.chartArcsGaugeUnit).style("text-anchor","middle").style("pointer-events","none"),t.append("text").attr("class",f.chartArcsGaugeMin).style("text-anchor","middle").style("pointer-events","none"),t.append("text").attr("class",f.chartArcsGaugeMax).style("text-anchor","middle").style("pointer-events","none"))},u.getGaugeLabelHeight=function(){return this.config.gauge_label_show?20:0},u.initRegion=function(){var t=this;t.region=t.main.append("g").attr("clip-path",t.clipPath).attr("class",f.regions)},u.updateRegion=function(t){var e=this,n=e.config;e.region.style("visibility",e.hasArcType()?"hidden":"visible"),e.mainRegion=e.main.select("."+f.regions).selectAll("."+f.region).data(n.regions),e.mainRegion.enter().append("g").append("rect").style("fill-opacity",0),e.mainRegion.attr("class",e.classRegion.bind(e)),e.mainRegion.exit().transition().duration(t).style("opacity",0).remove()},u.redrawRegion=function(t){var e=this,n=e.mainRegion.selectAll("rect").each(function(){var t=e.d3.select(this.parentNode).datum();e.d3.select(this).datum(t)}),r=e.regionX.bind(e),i=e.regionY.bind(e),a=e.regionWidth.bind(e),o=e.regionHeight.bind(e);return[(t?n.transition():n).attr("x",r).attr("y",i).attr("width",a).attr("height",o).style("fill-opacity",function(t){return h(t.opacity)?t.opacity:.1})]},u.regionX=function(t){var e,n=this,r=n.config,i="y"===t.axis?n.y:n.y2;return e="y"===t.axis||"y2"===t.axis?r.axis_rotated&&"start"in t?i(t.start):0:r.axis_rotated?0:"start"in t?n.x(n.isTimeSeries()?n.parseDate(t.start):t.start):0},u.regionY=function(t){var e,n=this,r=n.config,i="y"===t.axis?n.y:n.y2;return e="y"===t.axis||"y2"===t.axis?r.axis_rotated?0:"end"in t?i(t.end):0:r.axis_rotated&&"start"in t?n.x(n.isTimeSeries()?n.parseDate(t.start):t.start):0},u.regionWidth=function(t){var e,n=this,r=n.config,i=n.regionX(t),a="y"===t.axis?n.y:n.y2;return e="y"===t.axis||"y2"===t.axis?r.axis_rotated&&"end"in t?a(t.end):n.width:r.axis_rotated?n.width:"end"in t?n.x(n.isTimeSeries()?n.parseDate(t.end):t.end):n.width,e<i?0:e-i},u.regionHeight=function(t){var e,n=this,r=n.config,i=this.regionY(t),a="y"===t.axis?n.y:n.y2;return e="y"===t.axis||"y2"===t.axis?r.axis_rotated?n.height:"start"in t?a(t.start):n.height:r.axis_rotated&&"end"in t?n.x(n.isTimeSeries()?n.parseDate(t.end):t.end):n.height,e<i?0:e-i},u.isRegionOnX=function(t){return!t.axis||"x"===t.axis},u.drag=function(t){var e,n,r,i,a,o,s,u,c=this,l=c.config,h=c.main,d=c.d3;c.hasArcType()||l.data_selection_enabled&&(l.zoom_enabled&&!c.zoom.altDomain||l.data_selection_multiple&&(e=c.dragStart[0],n=c.dragStart[1],r=t[0],i=t[1],a=Math.min(e,r),o=Math.max(e,r),s=l.data_selection_grouped?c.margin.top:Math.min(n,i),u=l.data_selection_grouped?c.height:Math.max(n,i),h.select("."+f.dragarea).attr("x",a).attr("y",s).attr("width",o-a).attr("height",u-s),h.selectAll("."+f.shapes).selectAll("."+f.shape).filter(function(t){return l.data_selection_isselectable(t)}).each(function(t,e){var n,r,i,l,h,p,g=d.select(this),v=g.classed(f.SELECTED),m=g.classed(f.INCLUDED),y=!1;if(g.classed(f.circle))n=1*g.attr("cx"),r=1*g.attr("cy"),h=c.togglePoint,y=a<n&&n<o&&s<r&&r<u;else{if(!g.classed(f.bar))return;p=T(this),n=p.x,r=p.y,i=p.width,l=p.height,h=c.togglePath,y=!(o<n||n+i<a||u<r||r+l<s)}y^m&&(g.classed(f.INCLUDED,!m),g.classed(f.SELECTED,!v),h.call(c,!v,g,t,e))})))},u.dragstart=function(t){var e=this,n=e.config;e.hasArcType()||n.data_selection_enabled&&(e.dragStart=t,e.main.select("."+f.chart).append("rect").attr("class",f.dragarea).style("opacity",.1),e.dragging=!0)},u.dragend=function(){var t=this,e=t.config;t.hasArcType()||e.data_selection_enabled&&(t.main.select("."+f.dragarea).transition().duration(100).style("opacity",0).remove(),t.main.selectAll("."+f.shape).classed(f.INCLUDED,!1),t.dragging=!1)},u.selectPoint=function(t,e,n){var r=this,i=r.config,a=(i.axis_rotated?r.circleY:r.circleX).bind(r),o=(i.axis_rotated?r.circleX:r.circleY).bind(r),s=r.pointSelectR.bind(r);i.data_onselected.call(r.api,e,t.node()),r.main.select("."+f.selectedCircles+r.getTargetSelectorSuffix(e.id)).selectAll("."+f.selectedCircle+"-"+n).data([e]).enter().append("circle").attr("class",function(){return r.generateClass(f.selectedCircle,n)}).attr("cx",a).attr("cy",o).attr("stroke",function(){return r.color(e)}).attr("r",function(t){return 1.4*r.pointSelectR(t)}).transition().duration(100).attr("r",s)},u.unselectPoint=function(t,e,n){var r=this;r.config.data_onunselected.call(r.api,e,t.node()),r.main.select("."+f.selectedCircles+r.getTargetSelectorSuffix(e.id)).selectAll("."+f.selectedCircle+"-"+n).transition().duration(100).attr("r",0).remove()},u.togglePoint=function(t,e,n,r){t?this.selectPoint(e,n,r):this.unselectPoint(e,n,r)},u.selectPath=function(t,e){var n=this;n.config.data_onselected.call(n,e,t.node()),n.config.interaction_brighten&&t.transition().duration(100).style("fill",function(){return n.d3.rgb(n.color(e)).brighter(.75)})},u.unselectPath=function(t,e){var n=this;n.config.data_onunselected.call(n,e,t.node()),n.config.interaction_brighten&&t.transition().duration(100).style("fill",function(){return n.color(e)})},u.togglePath=function(t,e,n,r){t?this.selectPath(e,n,r):this.unselectPath(e,n,r)},u.getToggle=function(t,e){var n,r=this;return"circle"===t.nodeName?n=r.isStepType(e)?function(){}:r.togglePoint:"path"===t.nodeName&&(n=r.togglePath),n},u.toggleShape=function(t,e,n){var r=this,i=r.d3,a=r.config,o=i.select(t),s=o.classed(f.SELECTED),u=r.getToggle(t,e).bind(r);a.data_selection_enabled&&a.data_selection_isselectable(e)&&(a.data_selection_multiple||r.main.selectAll("."+f.shapes+(a.data_selection_grouped?r.getTargetSelectorSuffix(e.id):"")).selectAll("."+f.shape).each(function(t,e){var n=i.select(this);n.classed(f.SELECTED)&&u(!1,n.classed(f.SELECTED,!1),t,e)}),o.classed(f.SELECTED,!s),u(!s,o,e,n))},u.initBrush=function(){var t=this,e=t.d3;t.brush=e.svg.brush().on("brush",function(){t.redrawForBrush()}),t.brush.update=function(){return t.context&&t.context.select("."+f.brush).call(this),this},t.brush.scale=function(e){return t.config.axis_rotated?this.y(e):this.x(e)}},u.initSubchart=function(){var t=this,e=t.config,n=t.context=t.svg.append("g").attr("transform",t.getTranslate("context")),r=e.subchart_show?"visible":"hidden";n.style("visibility",r),n.append("g").attr("clip-path",t.clipPathForSubchart).attr("class",f.chart),n.select("."+f.chart).append("g").attr("class",f.chartBars),n.select("."+f.chart).append("g").attr("class",f.chartLines),n.append("g").attr("clip-path",t.clipPath).attr("class",f.brush).call(t.brush),t.axes.subx=n.append("g").attr("class",f.axisX).attr("transform",t.getTranslate("subx")).attr("clip-path",e.axis_rotated?"":t.clipPathForXAxis).style("visibility",e.subchart_axis_x_show?r:"hidden")},u.updateTargetsForSubchart=function(t){var e,n,r,i,a=this,o=a.context,s=a.config,u=a.classChartBar.bind(a),c=a.classBars.bind(a),l=a.classChartLine.bind(a),h=a.classLines.bind(a),d=a.classAreas.bind(a);s.subchart_show&&(i=o.select("."+f.chartBars).selectAll("."+f.chartBar).data(t).attr("class",u),r=i.enter().append("g").style("opacity",0).attr("class",u),r.append("g").attr("class",c),n=o.select("."+f.chartLines).selectAll("."+f.chartLine).data(t).attr("class",l),e=n.enter().append("g").style("opacity",0).attr("class",l),e.append("g").attr("class",h),e.append("g").attr("class",d),o.selectAll("."+f.brush+" rect").attr(s.axis_rotated?"width":"height",s.axis_rotated?a.width2:a.height2))},u.updateBarForSubchart=function(t){var e=this;e.contextBar=e.context.selectAll("."+f.bars).selectAll("."+f.bar).data(e.barData.bind(e)),e.contextBar.enter().append("path").attr("class",e.classBar.bind(e)).style("stroke","none").style("fill",e.color),e.contextBar.style("opacity",e.initialOpacity.bind(e)),e.contextBar.exit().transition().duration(t).style("opacity",0).remove()},u.redrawBarForSubchart=function(t,e,n){(e?this.contextBar.transition(Math.random().toString()).duration(n):this.contextBar).attr("d",t).style("opacity",1)},u.updateLineForSubchart=function(t){var e=this;e.contextLine=e.context.selectAll("."+f.lines).selectAll("."+f.line).data(e.lineData.bind(e)),e.contextLine.enter().append("path").attr("class",e.classLine.bind(e)).style("stroke",e.color),e.contextLine.style("opacity",e.initialOpacity.bind(e)),e.contextLine.exit().transition().duration(t).style("opacity",0).remove()},u.redrawLineForSubchart=function(t,e,n){(e?this.contextLine.transition(Math.random().toString()).duration(n):this.contextLine).attr("d",t).style("opacity",1)},u.updateAreaForSubchart=function(t){var e=this,n=e.d3;e.contextArea=e.context.selectAll("."+f.areas).selectAll("."+f.area).data(e.lineData.bind(e)),e.contextArea.enter().append("path").attr("class",e.classArea.bind(e)).style("fill",e.color).style("opacity",function(){return e.orgAreaOpacity=+n.select(this).style("opacity"),0}),e.contextArea.style("opacity",0),e.contextArea.exit().transition().duration(t).style("opacity",0).remove()},u.redrawAreaForSubchart=function(t,e,n){(e?this.contextArea.transition(Math.random().toString()).duration(n):this.contextArea).attr("d",t).style("fill",this.color).style("opacity",this.orgAreaOpacity)},u.redrawSubchart=function(t,e,n,r,i,a,o){var s,u,c,l=this,f=l.d3,h=l.config;l.context.style("visibility",h.subchart_show?"visible":"hidden"),h.subchart_show&&(f.event&&"zoom"===f.event.type&&l.brush.extent(l.x.orgDomain()).update(),t&&(l.brush.empty()||l.brush.extent(l.x.orgDomain()).update(),s=l.generateDrawArea(i,!0),u=l.generateDrawBar(a,!0),c=l.generateDrawLine(o,!0),l.updateBarForSubchart(n),l.updateLineForSubchart(n),l.updateAreaForSubchart(n),l.redrawBarForSubchart(u,n,n),l.redrawLineForSubchart(c,n,n),l.redrawAreaForSubchart(s,n,n)))},u.redrawForBrush=function(){var t=this,e=t.x;t.redraw({withTransition:!1,withY:t.config.zoom_rescale,withSubchart:!1,withUpdateXDomain:!0,withDimension:!1}),t.config.subchart_onbrush.call(t.api,e.orgDomain())},u.transformContext=function(t,e){var n,r=this;e&&e.axisSubX?n=e.axisSubX:(n=r.context.select("."+f.axisX),t&&(n=n.transition())),r.context.attr("transform",r.getTranslate("context")),n.attr("transform",r.getTranslate("subx"))},u.getDefaultExtent=function(){var t=this,e=t.config,n=d(e.axis_x_extent)?e.axis_x_extent(t.getXDomain(t.data.targets)):e.axis_x_extent;return t.isTimeSeries()&&(n=[t.parseDate(n[0]),t.parseDate(n[1])]),n},u.initZoom=function(){var t,e=this,n=e.d3,r=e.config;e.zoom=n.behavior.zoom().on("zoomstart",function(){t=n.event.sourceEvent,e.zoom.altDomain=n.event.sourceEvent.altKey?e.x.orgDomain():null,r.zoom_onzoomstart.call(e.api,n.event.sourceEvent)}).on("zoom",function(){e.redrawForZoom.call(e)}).on("zoomend",function(){var i=n.event.sourceEvent;i&&t.clientX===i.clientX&&t.clientY===i.clientY||(e.redrawEventRect(),e.updateZoom(),r.zoom_onzoomend.call(e.api,e.x.orgDomain()))}),e.zoom.scale=function(t){return r.axis_rotated?this.y(t):this.x(t)},e.zoom.orgScaleExtent=function(){var t=r.zoom_extent?r.zoom_extent:[1,10];return[t[0],Math.max(e.getMaxDataCount()/t[1],t[1])]},e.zoom.updateScaleExtent=function(){var t=x(e.x.orgDomain())/x(e.getZoomDomain()),n=this.orgScaleExtent();return this.scaleExtent([n[0]*t,n[1]*t]),this}},u.getZoomDomain=function(){var t=this,e=t.config,n=t.d3,r=n.min([t.orgXDomain[0],e.zoom_x_min]),i=n.max([t.orgXDomain[1],e.zoom_x_max]);return[r,i]},u.updateZoom=function(){var t=this,e=t.config.zoom_enabled?t.zoom:function(){};t.main.select("."+f.zoomRect).call(e).on("dblclick.zoom",null),t.main.selectAll("."+f.eventRect).call(e).on("dblclick.zoom",null)},u.redrawForZoom=function(){var t=this,e=t.d3,n=t.config,r=t.zoom,i=t.x;if(n.zoom_enabled&&0!==t.filterTargetsToShow(t.data.targets).length){if("mousemove"===e.event.sourceEvent.type&&r.altDomain)return i.domain(r.altDomain),void r.scale(i).updateScaleExtent();t.isCategorized()&&i.orgDomain()[0]===t.orgXDomain[0]&&i.domain([t.orgXDomain[0]-1e-10,i.orgDomain()[1]]),t.redraw({withTransition:!1,withY:n.zoom_rescale,withSubchart:!1,withEventRect:!1,withDimension:!1}),"mousemove"===e.event.sourceEvent.type&&(t.cancelClick=!0),n.zoom_onzoom.call(t.api,i.orgDomain())}},u.generateColor=function(){var t=this,e=t.config,n=t.d3,r=e.data_colors,i=b(e.color_pattern)?e.color_pattern:n.scale.category10().range(),a=e.data_color,o=[];return function(t){var e,n=t.id||t.data&&t.data.id||t;return r[n]instanceof Function?e=r[n](t):r[n]?e=r[n]:(o.indexOf(n)<0&&o.push(n),e=i[o.indexOf(n)%i.length],r[n]=e),a instanceof Function?a(e,t):e}},u.generateLevelColor=function(){var t=this,e=t.config,n=e.color_pattern,r=e.color_threshold,i="value"===r.unit,a=r.values&&r.values.length?r.values:[],o=r.max||100;return b(e.color_threshold)?function(t){var e,r,s=n[n.length-1];for(e=0;e<a.length;e++)if(r=i?t:100*t/o,r<a[e]){s=n[e];break}return s}:null},u.getYFormat=function(t){var e=this,n=t&&!e.hasType("gauge")?e.defaultArcValueFormat:e.yFormat,r=t&&!e.hasType("gauge")?e.defaultArcValueFormat:e.y2Format;return function(t,i,a){var o="y2"===e.axis.getId(a)?r:n;return o.call(e,t,i)}},u.yFormat=function(t){var e=this,n=e.config,r=n.axis_y_tick_format?n.axis_y_tick_format:e.defaultValueFormat;return r(t)},u.y2Format=function(t){var e=this,n=e.config,r=n.axis_y2_tick_format?n.axis_y2_tick_format:e.defaultValueFormat;return r(t)},u.defaultValueFormat=function(t){return h(t)?+t:""},u.defaultArcValueFormat=function(t,e){return(100*e).toFixed(1)+"%"},u.dataLabelFormat=function(t){var e,n=this,r=n.config.data_labels,i=function(t){return h(t)?+t:""};return e="function"==typeof r.format?r.format:"object"==typeof r.format?r.format[t]?r.format[t]===!0?i:r.format[t]:function(){return""}:i},u.hasCaches=function(t){for(var e=0;e<t.length;e++)if(!(t[e]in this.cache))return!1;return!0},u.addCache=function(t,e){this.cache[t]=this.cloneTarget(e)},u.getCaches=function(t){var e,n=[];for(e=0;e<t.length;e++)t[e]in this.cache&&n.push(this.cloneTarget(this.cache[t[e]]));return n};var f=u.CLASS={target:"c3-target",chart:"c3-chart",chartLine:"c3-chart-line",chartLines:"c3-chart-lines",chartBar:"c3-chart-bar",chartBars:"c3-chart-bars",chartText:"c3-chart-text",chartTexts:"c3-chart-texts",chartArc:"c3-chart-arc",chartArcs:"c3-chart-arcs",chartArcsTitle:"c3-chart-arcs-title",chartArcsBackground:"c3-chart-arcs-background",chartArcsGaugeUnit:"c3-chart-arcs-gauge-unit",chartArcsGaugeMax:"c3-chart-arcs-gauge-max",chartArcsGaugeMin:"c3-chart-arcs-gauge-min",selectedCircle:"c3-selected-circle",selectedCircles:"c3-selected-circles",eventRect:"c3-event-rect",eventRects:"c3-event-rects",eventRectsSingle:"c3-event-rects-single",eventRectsMultiple:"c3-event-rects-multiple",zoomRect:"c3-zoom-rect",brush:"c3-brush",focused:"c3-focused",defocused:"c3-defocused",region:"c3-region",regions:"c3-regions",title:"c3-title",tooltipContainer:"c3-tooltip-container",tooltip:"c3-tooltip",tooltipName:"c3-tooltip-name",shape:"c3-shape",shapes:"c3-shapes",line:"c3-line",lines:"c3-lines",bar:"c3-bar",bars:"c3-bars",circle:"c3-circle",circles:"c3-circles",arc:"c3-arc",arcs:"c3-arcs",area:"c3-area",areas:"c3-areas",empty:"c3-empty",text:"c3-text",texts:"c3-texts",gaugeValue:"c3-gauge-value",grid:"c3-grid",gridLines:"c3-grid-lines",xgrid:"c3-xgrid",xgrids:"c3-xgrids",xgridLine:"c3-xgrid-line",xgridLines:"c3-xgrid-lines",xgridFocus:"c3-xgrid-focus",ygrid:"c3-ygrid",ygrids:"c3-ygrids",ygridLine:"c3-ygrid-line",ygridLines:"c3-ygrid-lines",axis:"c3-axis",axisX:"c3-axis-x",axisXLabel:"c3-axis-x-label",axisY:"c3-axis-y",axisYLabel:"c3-axis-y-label",axisY2:"c3-axis-y2",axisY2Label:"c3-axis-y2-label",legendBackground:"c3-legend-background",legendItem:"c3-legend-item",legendItemEvent:"c3-legend-item-event",legendItemTile:"c3-legend-item-tile",legendItemHidden:"c3-legend-item-hidden",legendItemFocused:"c3-legend-item-focused",dragarea:"c3-dragarea",EXPANDED:"_expanded_",SELECTED:"_selected_",INCLUDED:"_included_"};u.generateClass=function(t,e){return" "+t+" "+t+this.getTargetSelectorSuffix(e)},u.classText=function(t){return this.generateClass(f.text,t.index)},u.classTexts=function(t){return this.generateClass(f.texts,t.id)},u.classShape=function(t){return this.generateClass(f.shape,t.index)},u.classShapes=function(t){return this.generateClass(f.shapes,t.id)},u.classLine=function(t){return this.classShape(t)+this.generateClass(f.line,t.id)},u.classLines=function(t){return this.classShapes(t)+this.generateClass(f.lines,t.id)},u.classCircle=function(t){return this.classShape(t)+this.generateClass(f.circle,t.index)},u.classCircles=function(t){return this.classShapes(t)+this.generateClass(f.circles,t.id)},u.classBar=function(t){return this.classShape(t)+this.generateClass(f.bar,t.index)},u.classBars=function(t){return this.classShapes(t)+this.generateClass(f.bars,t.id)},u.classArc=function(t){return this.classShape(t.data)+this.generateClass(f.arc,t.data.id)},u.classArcs=function(t){return this.classShapes(t.data)+this.generateClass(f.arcs,t.data.id)},u.classArea=function(t){return this.classShape(t)+this.generateClass(f.area,t.id)},u.classAreas=function(t){return this.classShapes(t)+this.generateClass(f.areas,t.id)},u.classRegion=function(t,e){return this.generateClass(f.region,e)+" "+("class"in t?t.class:"")},u.classEvent=function(t){return this.generateClass(f.eventRect,t.index)},u.classTarget=function(t){var e=this,n=e.config.data_classes[t],r="";return n&&(r=" "+f.target+"-"+n),e.generateClass(f.target,t)+r},u.classFocus=function(t){return this.classFocused(t)+this.classDefocused(t)},u.classFocused=function(t){return" "+(this.focusedTargetIds.indexOf(t.id)>=0?f.focused:"")},u.classDefocused=function(t){return" "+(this.defocusedTargetIds.indexOf(t.id)>=0?f.defocused:"")},u.classChartText=function(t){return f.chartText+this.classTarget(t.id)},u.classChartLine=function(t){return f.chartLine+this.classTarget(t.id)},u.classChartBar=function(t){return f.chartBar+this.classTarget(t.id)},u.classChartArc=function(t){return f.chartArc+this.classTarget(t.data.id)},u.getTargetSelectorSuffix=function(t){return t||0===t?("-"+t).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g,"-"):""},u.selectorTarget=function(t,e){return(e||"")+"."+f.target+this.getTargetSelectorSuffix(t)},u.selectorTargets=function(t,e){var n=this;return t=t||[],t.length?t.map(function(t){return n.selectorTarget(t,e)}):null},u.selectorLegend=function(t){return"."+f.legendItem+this.getTargetSelectorSuffix(t)},u.selectorLegends=function(t){var e=this;return t&&t.length?t.map(function(t){return e.selectorLegend(t)}):null};var h=u.isValue=function(t){return t||0===t},d=u.isFunction=function(t){return"function"==typeof t},p=u.isString=function(t){return"string"==typeof t},g=u.isUndefined=function(t){return"undefined"==typeof t},v=u.isDefined=function(t){return"undefined"!=typeof t},m=u.ceil10=function(t){return 10*Math.ceil(t/10)},y=u.asHalfPixel=function(t){return Math.ceil(t)+.5},x=u.diffDomain=function(t){return t[1]-t[0]},_=u.isEmpty=function(t){return"undefined"==typeof t||null===t||p(t)&&0===t.length||"object"==typeof t&&0===Object.keys(t).length},b=u.notEmpty=function(t){return!u.isEmpty(t)},$=u.getOption=function(t,e,n){return v(t[e])?t[e]:n},w=u.hasValue=function(t,e){var n=!1;return Object.keys(t).forEach(function(r){t[r]===e&&(n=!0)}),n},S=u.sanitise=function(t){return"string"==typeof t?t.replace(/</g,"&lt;").replace(/>/g,"&gt;"):t},T=u.getPathBox=function(t){var e=t.getBoundingClientRect(),n=[t.pathSegList.getItem(0),t.pathSegList.getItem(1)],r=n[0].x,i=Math.min(n[0].y,n[1].y);return{x:r,y:i,width:e.width,height:e.height}};s.focus=function(t){var e,n=this.internal;t=n.mapToTargetIds(t),e=n.svg.selectAll(n.selectorTargets(t.filter(n.isTargetToShow,n))),this.revert(),this.defocus(),e.classed(f.focused,!0).classed(f.defocused,!1),n.hasArcType()&&n.expandArc(t),n.toggleFocusLegend(t,!0),n.focusedTargetIds=t,n.defocusedTargetIds=n.defocusedTargetIds.filter(function(e){return t.indexOf(e)<0})},s.defocus=function(t){var e,n=this.internal;t=n.mapToTargetIds(t),e=n.svg.selectAll(n.selectorTargets(t.filter(n.isTargetToShow,n))),e.classed(f.focused,!1).classed(f.defocused,!0),n.hasArcType()&&n.unexpandArc(t),n.toggleFocusLegend(t,!1),n.focusedTargetIds=n.focusedTargetIds.filter(function(e){return t.indexOf(e)<0}),n.defocusedTargetIds=t},s.revert=function(t){var e,n=this.internal;t=n.mapToTargetIds(t),e=n.svg.selectAll(n.selectorTargets(t)),e.classed(f.focused,!1).classed(f.defocused,!1),n.hasArcType()&&n.unexpandArc(t),n.config.legend_show&&(n.showLegend(t.filter(n.isLegendToShow.bind(n))),n.legend.selectAll(n.selectorLegends(t)).filter(function(){return n.d3.select(this).classed(f.legendItemFocused)}).classed(f.legendItemFocused,!1)),n.focusedTargetIds=[],n.defocusedTargetIds=[]},s.show=function(t,e){var n,r=this.internal;t=r.mapToTargetIds(t),e=e||{},r.removeHiddenTargetIds(t),n=r.svg.selectAll(r.selectorTargets(t)),n.transition().style("opacity",1,"important").call(r.endall,function(){n.style("opacity",null).style("opacity",1)}),e.withLegend&&r.showLegend(t),r.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},s.hide=function(t,e){var n,r=this.internal;t=r.mapToTargetIds(t),e=e||{},r.addHiddenTargetIds(t),n=r.svg.selectAll(r.selectorTargets(t)),n.transition().style("opacity",0,"important").call(r.endall,function(){n.style("opacity",null).style("opacity",0)}),e.withLegend&&r.hideLegend(t),r.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},s.toggle=function(t,e){var n=this,r=this.internal;r.mapToTargetIds(t).forEach(function(t){r.isTargetToShow(t)?n.hide(t,e):n.show(t,e)})},s.zoom=function(t){var e=this.internal;return t&&(e.isTimeSeries()&&(t=t.map(function(t){return e.parseDate(t)})),e.brush.extent(t),e.redraw({withUpdateXDomain:!0,withY:e.config.zoom_rescale}),e.config.zoom_onzoom.call(this,e.x.orgDomain())),e.brush.extent()},s.zoom.enable=function(t){var e=this.internal;e.config.zoom_enabled=t,e.updateAndRedraw()},s.unzoom=function(){var t=this.internal;t.brush.clear().update(),t.redraw({withUpdateXDomain:!0})},s.zoom.max=function(t){var e=this.internal,n=e.config,r=e.d3;return 0===t||t?void(n.zoom_x_max=r.max([e.orgXDomain[1],t])):n.zoom_x_max},s.zoom.min=function(t){var e=this.internal,n=e.config,r=e.d3;return 0===t||t?void(n.zoom_x_min=r.min([e.orgXDomain[0],t])):n.zoom_x_min},s.zoom.range=function(t){return arguments.length?(v(t.max)&&this.domain.max(t.max),
void(v(t.min)&&this.domain.min(t.min))):{max:this.domain.max(),min:this.domain.min()}},s.load=function(t){var e=this.internal,n=e.config;return t.xs&&e.addXs(t.xs),"names"in t&&s.data.names.bind(this)(t.names),"classes"in t&&Object.keys(t.classes).forEach(function(e){n.data_classes[e]=t.classes[e]}),"categories"in t&&e.isCategorized()&&(n.axis_x_categories=t.categories),"axes"in t&&Object.keys(t.axes).forEach(function(e){n.data_axes[e]=t.axes[e]}),"colors"in t&&Object.keys(t.colors).forEach(function(e){n.data_colors[e]=t.colors[e]}),"cacheIds"in t&&e.hasCaches(t.cacheIds)?void e.load(e.getCaches(t.cacheIds),t.done):void("unload"in t?e.unload(e.mapToTargetIds("boolean"==typeof t.unload&&t.unload?null:t.unload),function(){e.loadFromArgs(t)}):e.loadFromArgs(t))},s.unload=function(t){var e=this.internal;t=t||{},t instanceof Array?t={ids:t}:"string"==typeof t&&(t={ids:[t]}),e.unload(e.mapToTargetIds(t.ids),function(){e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0}),t.done&&t.done()})},s.flow=function(t){var e,n,r,i,a,o,s,u,c=this.internal,l=[],f=c.getMaxDataCount(),d=0,p=0;if(t.json)n=c.convertJsonToData(t.json,t.keys);else if(t.rows)n=c.convertRowsToData(t.rows);else{if(!t.columns)return;n=c.convertColumnsToData(t.columns)}e=c.convertDataToTargets(n,!0),c.data.targets.forEach(function(t){var n,r,i=!1;for(n=0;n<e.length;n++)if(t.id===e[n].id){for(i=!0,t.values[t.values.length-1]&&(p=t.values[t.values.length-1].index+1),d=e[n].values.length,r=0;r<d;r++)e[n].values[r].index=p+r,c.isTimeSeries()||(e[n].values[r].x=p+r);t.values=t.values.concat(e[n].values),e.splice(n,1);break}i||l.push(t.id)}),c.data.targets.forEach(function(t){var e,n;for(e=0;e<l.length;e++)if(t.id===l[e])for(p=t.values[t.values.length-1].index+1,n=0;n<d;n++)t.values.push({id:t.id,index:p+n,x:c.isTimeSeries()?c.getOtherTargetX(p+n):p+n,value:null})}),c.data.targets.length&&e.forEach(function(t){var e,n=[];for(e=c.data.targets[0].values[0].index;e<p;e++)n.push({id:t.id,index:e,x:c.isTimeSeries()?c.getOtherTargetX(e):e,value:null});t.values.forEach(function(t){t.index+=p,c.isTimeSeries()||(t.x+=p)}),t.values=n.concat(t.values)}),c.data.targets=c.data.targets.concat(e),r=c.getMaxDataCount(),a=c.data.targets[0],o=a.values[0],v(t.to)?(d=0,u=c.isTimeSeries()?c.parseDate(t.to):t.to,a.values.forEach(function(t){t.x<u&&d++})):v(t.length)&&(d=t.length),f?1===f&&c.isTimeSeries()&&(s=(a.values[a.values.length-1].x-o.x)/2,i=[new Date(+o.x-s),new Date(+o.x+s)],c.updateXDomain(null,!0,!0,!1,i)):(s=c.isTimeSeries()?a.values.length>1?a.values[a.values.length-1].x-o.x:o.x-c.getXDomain(c.data.targets)[0]:1,i=[o.x-s,o.x],c.updateXDomain(null,!0,!0,!1,i)),c.updateTargets(c.data.targets),c.redraw({flow:{index:o.index,length:d,duration:h(t.duration)?t.duration:c.config.transition_duration,done:t.done,orgDataCount:f},withLegend:!0,withTransition:f>1,withTrimXDomain:!1,withUpdateXAxis:!0})},u.generateFlow=function(t){var e=this,n=e.config,r=e.d3;return function(){var i,a,o,s=t.targets,u=t.flow,c=t.drawBar,l=t.drawLine,h=t.drawArea,d=t.cx,p=t.cy,g=t.xv,v=t.xForText,m=t.yForText,y=t.duration,_=1,b=u.index,$=u.length,w=e.getValueOnIndex(e.data.targets[0].values,b),S=e.getValueOnIndex(e.data.targets[0].values,b+$),T=e.x.domain(),A=u.duration||y,C=u.done||function(){},E=e.generateWait(),M=e.xgrid||r.selectAll([]),k=e.xgridLines||r.selectAll([]),P=e.mainRegion||r.selectAll([]),O=e.mainText||r.selectAll([]),L=e.mainBar||r.selectAll([]),D=e.mainLine||r.selectAll([]),V=e.mainArea||r.selectAll([]),R=e.mainCircle||r.selectAll([]);e.flowing=!0,e.data.targets.forEach(function(t){t.values.splice(0,$)}),o=e.updateXDomain(s,!0,!0),e.updateXGrid&&e.updateXGrid(!0),u.orgDataCount?i=1===u.orgDataCount||(w&&w.x)===(S&&S.x)?e.x(T[0])-e.x(o[0]):e.isTimeSeries()?e.x(T[0])-e.x(o[0]):e.x(w.x)-e.x(S.x):1!==e.data.targets[0].values.length?i=e.x(T[0])-e.x(o[0]):e.isTimeSeries()?(w=e.getValueOnIndex(e.data.targets[0].values,0),S=e.getValueOnIndex(e.data.targets[0].values,e.data.targets[0].values.length-1),i=e.x(w.x)-e.x(S.x)):i=x(o)/2,_=x(T)/x(o),a="translate("+i+",0) scale("+_+",1)",e.hideXGridFocus(),r.transition().ease("linear").duration(A).each(function(){E.add(e.axes.x.transition().call(e.xAxis)),E.add(L.transition().attr("transform",a)),E.add(D.transition().attr("transform",a)),E.add(V.transition().attr("transform",a)),E.add(R.transition().attr("transform",a)),E.add(O.transition().attr("transform",a)),E.add(P.filter(e.isRegionOnX).transition().attr("transform",a)),E.add(M.transition().attr("transform",a)),E.add(k.transition().attr("transform",a))}).call(E,function(){var t,r=[],i=[],a=[];if($){for(t=0;t<$;t++)r.push("."+f.shape+"-"+(b+t)),i.push("."+f.text+"-"+(b+t)),a.push("."+f.eventRect+"-"+(b+t));e.svg.selectAll("."+f.shapes).selectAll(r).remove(),e.svg.selectAll("."+f.texts).selectAll(i).remove(),e.svg.selectAll("."+f.eventRects).selectAll(a).remove(),e.svg.select("."+f.xgrid).remove()}M.attr("transform",null).attr(e.xgridAttr),k.attr("transform",null),k.select("line").attr("x1",n.axis_rotated?0:g).attr("x2",n.axis_rotated?e.width:g),k.select("text").attr("x",n.axis_rotated?e.width:0).attr("y",g),L.attr("transform",null).attr("d",c),D.attr("transform",null).attr("d",l),V.attr("transform",null).attr("d",h),R.attr("transform",null).attr("cx",d).attr("cy",p),O.attr("transform",null).attr("x",v).attr("y",m).style("fill-opacity",e.opacityForText.bind(e)),P.attr("transform",null),P.select("rect").filter(e.isRegionOnX).attr("x",e.regionX.bind(e)).attr("width",e.regionWidth.bind(e)),n.interaction_enabled&&e.redrawEventRect(),C(),e.flowing=!1})}},s.selected=function(t){var e=this.internal,n=e.d3;return n.merge(e.main.selectAll("."+f.shapes+e.getTargetSelectorSuffix(t)).selectAll("."+f.shape).filter(function(){return n.select(this).classed(f.SELECTED)}).map(function(t){return t.map(function(t){var e=t.__data__;return e.data?e.data:e})}))},s.select=function(t,e,n){var r=this.internal,i=r.d3,a=r.config;a.data_selection_enabled&&r.main.selectAll("."+f.shapes).selectAll("."+f.shape).each(function(o,s){var u=i.select(this),c=o.data?o.data.id:o.id,l=r.getToggle(this,o).bind(r),h=a.data_selection_grouped||!t||t.indexOf(c)>=0,d=!e||e.indexOf(s)>=0,p=u.classed(f.SELECTED);u.classed(f.line)||u.classed(f.area)||(h&&d?a.data_selection_isselectable(o)&&!p&&l(!0,u.classed(f.SELECTED,!0),o,s):v(n)&&n&&p&&l(!1,u.classed(f.SELECTED,!1),o,s))})},s.unselect=function(t,e){var n=this.internal,r=n.d3,i=n.config;i.data_selection_enabled&&n.main.selectAll("."+f.shapes).selectAll("."+f.shape).each(function(a,o){var s=r.select(this),u=a.data?a.data.id:a.id,c=n.getToggle(this,a).bind(n),l=i.data_selection_grouped||!t||t.indexOf(u)>=0,h=!e||e.indexOf(o)>=0,d=s.classed(f.SELECTED);s.classed(f.line)||s.classed(f.area)||l&&h&&i.data_selection_isselectable(a)&&d&&c(!1,s.classed(f.SELECTED,!1),a,o)})},s.transform=function(t,e){var n=this.internal,r=["pie","donut"].indexOf(t)>=0?{withTransform:!0}:null;n.transformTo(e,t,r)},u.transformTo=function(t,e,n){var r=this,i=!r.hasArcType(),a=n||{withTransitionForAxis:i};a.withTransitionForTransform=!1,r.transiting=!1,r.setTargetType(t,e),r.updateTargets(r.data.targets),r.updateAndRedraw(a)},s.groups=function(t){var e=this.internal,n=e.config;return g(t)?n.data_groups:(n.data_groups=t,e.redraw(),n.data_groups)},s.xgrids=function(t){var e=this.internal,n=e.config;return t?(n.grid_x_lines=t,e.redrawWithoutRescale(),n.grid_x_lines):n.grid_x_lines},s.xgrids.add=function(t){var e=this.internal;return this.xgrids(e.config.grid_x_lines.concat(t?t:[]))},s.xgrids.remove=function(t){var e=this.internal;e.removeGridLines(t,!0)},s.ygrids=function(t){var e=this.internal,n=e.config;return t?(n.grid_y_lines=t,e.redrawWithoutRescale(),n.grid_y_lines):n.grid_y_lines},s.ygrids.add=function(t){var e=this.internal;return this.ygrids(e.config.grid_y_lines.concat(t?t:[]))},s.ygrids.remove=function(t){var e=this.internal;e.removeGridLines(t,!1)},s.regions=function(t){var e=this.internal,n=e.config;return t?(n.regions=t,e.redrawWithoutRescale(),n.regions):n.regions},s.regions.add=function(t){var e=this.internal,n=e.config;return t?(n.regions=n.regions.concat(t),e.redrawWithoutRescale(),n.regions):n.regions},s.regions.remove=function(t){var e,n,r,i=this.internal,a=i.config;return t=t||{},e=i.getOption(t,"duration",a.transition_duration),n=i.getOption(t,"classes",[f.region]),r=i.main.select("."+f.regions).selectAll(n.map(function(t){return"."+t})),(e?r.transition().duration(e):r).style("opacity",0).remove(),a.regions=a.regions.filter(function(t){var e=!1;return!t.class||(t.class.split(" ").forEach(function(t){n.indexOf(t)>=0&&(e=!0)}),!e)}),a.regions},s.data=function(t){var e=this.internal.data.targets;return"undefined"==typeof t?e:e.filter(function(e){return[].concat(t).indexOf(e.id)>=0})},s.data.shown=function(t){return this.internal.filterTargetsToShow(this.data(t))},s.data.values=function(t){var e,n=null;return t&&(e=this.data(t),n=e[0]?e[0].values.map(function(t){return t.value}):null),n},s.data.names=function(t){return this.internal.clearLegendItemTextBoxCache(),this.internal.updateDataAttributes("names",t)},s.data.colors=function(t){return this.internal.updateDataAttributes("colors",t)},s.data.axes=function(t){return this.internal.updateDataAttributes("axes",t)},s.category=function(t,e){var n=this.internal,r=n.config;return arguments.length>1&&(r.axis_x_categories[t]=e,n.redraw()),r.axis_x_categories[t]},s.categories=function(t){var e=this.internal,n=e.config;return arguments.length?(n.axis_x_categories=t,e.redraw(),n.axis_x_categories):n.axis_x_categories},s.color=function(t){var e=this.internal;return e.color(t)},s.x=function(t){var e=this.internal;return arguments.length&&(e.updateTargetX(e.data.targets,t),e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),e.data.xs},s.xs=function(t){var e=this.internal;return arguments.length&&(e.updateTargetXs(e.data.targets,t),e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),e.data.xs},s.axis=function(){},s.axis.labels=function(t){var e=this.internal;arguments.length&&(Object.keys(t).forEach(function(n){e.axis.setLabelText(n,t[n])}),e.axis.updateLabels())},s.axis.max=function(t){var e=this.internal,n=e.config;return arguments.length?("object"==typeof t?(h(t.x)&&(n.axis_x_max=t.x),h(t.y)&&(n.axis_y_max=t.y),h(t.y2)&&(n.axis_y2_max=t.y2)):n.axis_y_max=n.axis_y2_max=t,void e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})):{x:n.axis_x_max,y:n.axis_y_max,y2:n.axis_y2_max}},s.axis.min=function(t){var e=this.internal,n=e.config;return arguments.length?("object"==typeof t?(h(t.x)&&(n.axis_x_min=t.x),h(t.y)&&(n.axis_y_min=t.y),h(t.y2)&&(n.axis_y2_min=t.y2)):n.axis_y_min=n.axis_y2_min=t,void e.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})):{x:n.axis_x_min,y:n.axis_y_min,y2:n.axis_y2_min}},s.axis.range=function(t){return arguments.length?(v(t.max)&&this.axis.max(t.max),void(v(t.min)&&this.axis.min(t.min))):{max:this.axis.max(),min:this.axis.min()}},s.legend=function(){},s.legend.show=function(t){var e=this.internal;e.showLegend(e.mapToTargetIds(t)),e.updateAndRedraw({withLegend:!0})},s.legend.hide=function(t){var e=this.internal;e.hideLegend(e.mapToTargetIds(t)),e.updateAndRedraw({withLegend:!0})},s.resize=function(t){var e=this.internal,n=e.config;n.size_width=t?t.width:null,n.size_height=t?t.height:null,this.flush()},s.flush=function(){var t=this.internal;t.updateAndRedraw({withLegend:!0,withTransition:!1,withTransitionForTransform:!1})},s.destroy=function(){var e=this.internal;if(t.clearInterval(e.intervalForObserveInserted),void 0!==e.resizeTimeout&&t.clearTimeout(e.resizeTimeout),t.detachEvent)t.detachEvent("onresize",e.resizeFunction);else if(t.removeEventListener)t.removeEventListener("resize",e.resizeFunction);else{var n=t.onresize;n&&n.add&&n.remove&&n.remove(e.resizeFunction)}return e.selectChart.classed("c3",!1).html(""),Object.keys(e).forEach(function(t){e[t]=null}),null},s.tooltip=function(){},s.tooltip.show=function(t){var e,n,r=this.internal;t.mouse&&(n=t.mouse),t.data?r.isMultipleX()?(n=[r.x(t.data.x),r.getYScale(t.data.id)(t.data.value)],e=null):e=h(t.data.index)?t.data.index:r.getIndexByX(t.data.x):"undefined"!=typeof t.x?e=r.getIndexByX(t.x):"undefined"!=typeof t.index&&(e=t.index),r.dispatchEvent("mouseover",e,n),r.dispatchEvent("mousemove",e,n),r.config.tooltip_onshow.call(r,t.data)},s.tooltip.hide=function(){this.internal.dispatchEvent("mouseout",0),this.internal.config.tooltip_onhide.call(this)};var A;u.isSafari=function(){var e=t.navigator.userAgent;return e.indexOf("Safari")>=0&&e.indexOf("Chrome")<0},u.isChrome=function(){var e=t.navigator.userAgent;return e.indexOf("Chrome")>=0},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),n=this,r=function(){},i=function(){return n.apply(this instanceof r?this:t,e.concat(Array.prototype.slice.call(arguments)))};return r.prototype=this.prototype,i.prototype=new r,i}),function(){"SVGPathSeg"in t||(t.SVGPathSeg=function(t,e,n){this.pathSegType=t,this.pathSegTypeAsLetter=e,this._owningPathSegList=n},SVGPathSeg.PATHSEG_UNKNOWN=0,SVGPathSeg.PATHSEG_CLOSEPATH=1,SVGPathSeg.PATHSEG_MOVETO_ABS=2,SVGPathSeg.PATHSEG_MOVETO_REL=3,SVGPathSeg.PATHSEG_LINETO_ABS=4,SVGPathSeg.PATHSEG_LINETO_REL=5,SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS=6,SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL=7,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS=8,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL=9,SVGPathSeg.PATHSEG_ARC_ABS=10,SVGPathSeg.PATHSEG_ARC_REL=11,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS=12,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL=13,SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS=14,SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL=15,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS=16,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL=17,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS=18,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL=19,SVGPathSeg.prototype._segmentChanged=function(){this._owningPathSegList&&this._owningPathSegList.segmentChanged(this)},t.SVGPathSegClosePath=function(t){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CLOSEPATH,"z",t)},SVGPathSegClosePath.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegClosePath.prototype.toString=function(){return"[object SVGPathSegClosePath]"},SVGPathSegClosePath.prototype._asPathString=function(){return this.pathSegTypeAsLetter},SVGPathSegClosePath.prototype.clone=function(){return new SVGPathSegClosePath((void 0))},t.SVGPathSegMovetoAbs=function(t,e,n){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_MOVETO_ABS,"M",t),this._x=e,this._y=n},SVGPathSegMovetoAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegMovetoAbs.prototype.toString=function(){return"[object SVGPathSegMovetoAbs]"},SVGPathSegMovetoAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegMovetoAbs.prototype.clone=function(){return new SVGPathSegMovetoAbs((void 0),this._x,this._y)},Object.defineProperty(SVGPathSegMovetoAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegMovetoAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegMovetoRel=function(t,e,n){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_MOVETO_REL,"m",t),this._x=e,this._y=n},SVGPathSegMovetoRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegMovetoRel.prototype.toString=function(){return"[object SVGPathSegMovetoRel]"},SVGPathSegMovetoRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegMovetoRel.prototype.clone=function(){return new SVGPathSegMovetoRel((void 0),this._x,this._y)},Object.defineProperty(SVGPathSegMovetoRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegMovetoRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegLinetoAbs=function(t,e,n){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_ABS,"L",t),this._x=e,this._y=n},SVGPathSegLinetoAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoAbs.prototype.toString=function(){return"[object SVGPathSegLinetoAbs]"},SVGPathSegLinetoAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegLinetoAbs.prototype.clone=function(){return new SVGPathSegLinetoAbs((void 0),this._x,this._y)},Object.defineProperty(SVGPathSegLinetoAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegLinetoAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegLinetoRel=function(t,e,n){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_REL,"l",t),this._x=e,this._y=n},SVGPathSegLinetoRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoRel.prototype.toString=function(){return"[object SVGPathSegLinetoRel]"},SVGPathSegLinetoRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegLinetoRel.prototype.clone=function(){return new SVGPathSegLinetoRel((void 0),this._x,this._y)},Object.defineProperty(SVGPathSegLinetoRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegLinetoRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoCubicAbs=function(t,e,n,r,i,a,o){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS,"C",t),this._x=e,this._y=n,this._x1=r,this._y1=i,this._x2=a,this._y2=o},SVGPathSegCurvetoCubicAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicAbs]"},SVGPathSegCurvetoCubicAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicAbs.prototype.clone=function(){return new SVGPathSegCurvetoCubicAbs((void 0),this._x,this._y,this._x1,this._y1,this._x2,this._y2)},Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"x1",{get:function(){return this._x1},set:function(t){this._x1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"y1",{get:function(){return this._y1},set:function(t){this._y1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"x2",{get:function(){return this._x2},set:function(t){this._x2=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"y2",{get:function(){return this._y2},set:function(t){this._y2=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoCubicRel=function(t,e,n,r,i,a,o){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL,"c",t),this._x=e,this._y=n,this._x1=r,this._y1=i,this._x2=a,this._y2=o},SVGPathSegCurvetoCubicRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicRel.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicRel]"},SVGPathSegCurvetoCubicRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicRel.prototype.clone=function(){return new SVGPathSegCurvetoCubicRel((void 0),this._x,this._y,this._x1,this._y1,this._x2,this._y2)},Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"x1",{get:function(){return this._x1},set:function(t){this._x1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"y1",{get:function(){return this._y1},set:function(t){this._y1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"x2",{get:function(){return this._x2},set:function(t){this._x2=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"y2",{get:function(){return this._y2},set:function(t){this._y2=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoQuadraticAbs=function(t,e,n,r,i){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS,"Q",t),this._x=e,this._y=n,this._x1=r,this._y1=i},SVGPathSegCurvetoQuadraticAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticAbs]"},SVGPathSegCurvetoQuadraticAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticAbs.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticAbs((void 0),this._x,this._y,this._x1,this._y1)},Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"x1",{get:function(){return this._x1},set:function(t){this._x1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"y1",{get:function(){return this._y1},set:function(t){this._y1=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoQuadraticRel=function(t,e,n,r,i){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL,"q",t),this._x=e,this._y=n,this._x1=r,this._y1=i},SVGPathSegCurvetoQuadraticRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticRel.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticRel]"},SVGPathSegCurvetoQuadraticRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticRel.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticRel((void 0),this._x,this._y,this._x1,this._y1)},Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"x1",{get:function(){return this._x1},set:function(t){this._x1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"y1",{get:function(){return this._y1},set:function(t){this._y1=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegArcAbs=function(t,e,n,r,i,a,o,s){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_ARC_ABS,"A",t),this._x=e,this._y=n,this._r1=r,this._r2=i,this._angle=a,this._largeArcFlag=o,this._sweepFlag=s},SVGPathSegArcAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegArcAbs.prototype.toString=function(){return"[object SVGPathSegArcAbs]"},SVGPathSegArcAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._r1+" "+this._r2+" "+this._angle+" "+(this._largeArcFlag?"1":"0")+" "+(this._sweepFlag?"1":"0")+" "+this._x+" "+this._y},SVGPathSegArcAbs.prototype.clone=function(){return new SVGPathSegArcAbs((void 0),this._x,this._y,this._r1,this._r2,this._angle,this._largeArcFlag,this._sweepFlag)},Object.defineProperty(SVGPathSegArcAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"r1",{get:function(){return this._r1},set:function(t){this._r1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"r2",{get:function(){return this._r2},set:function(t){this._r2=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"angle",{get:function(){return this._angle},set:function(t){this._angle=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"largeArcFlag",{get:function(){return this._largeArcFlag},set:function(t){this._largeArcFlag=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"sweepFlag",{get:function(){return this._sweepFlag},set:function(t){this._sweepFlag=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegArcRel=function(t,e,n,r,i,a,o,s){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_ARC_REL,"a",t),this._x=e,this._y=n,this._r1=r,this._r2=i,this._angle=a,this._largeArcFlag=o,this._sweepFlag=s},SVGPathSegArcRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegArcRel.prototype.toString=function(){return"[object SVGPathSegArcRel]"},SVGPathSegArcRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._r1+" "+this._r2+" "+this._angle+" "+(this._largeArcFlag?"1":"0")+" "+(this._sweepFlag?"1":"0")+" "+this._x+" "+this._y},SVGPathSegArcRel.prototype.clone=function(){return new SVGPathSegArcRel((void 0),this._x,this._y,this._r1,this._r2,this._angle,this._largeArcFlag,this._sweepFlag)},Object.defineProperty(SVGPathSegArcRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"r1",{get:function(){return this._r1},set:function(t){this._r1=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"r2",{get:function(){return this._r2},set:function(t){this._r2=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"angle",{get:function(){return this._angle},set:function(t){this._angle=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"largeArcFlag",{get:function(){return this._largeArcFlag},set:function(t){this._largeArcFlag=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"sweepFlag",{get:function(){return this._sweepFlag},set:function(t){this._sweepFlag=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegLinetoHorizontalAbs=function(t,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS,"H",t),this._x=e},SVGPathSegLinetoHorizontalAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoHorizontalAbs.prototype.toString=function(){return"[object SVGPathSegLinetoHorizontalAbs]"},SVGPathSegLinetoHorizontalAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x},SVGPathSegLinetoHorizontalAbs.prototype.clone=function(){return new SVGPathSegLinetoHorizontalAbs((void 0),this._x)},Object.defineProperty(SVGPathSegLinetoHorizontalAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegLinetoHorizontalRel=function(t,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL,"h",t),this._x=e},SVGPathSegLinetoHorizontalRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoHorizontalRel.prototype.toString=function(){return"[object SVGPathSegLinetoHorizontalRel]"},SVGPathSegLinetoHorizontalRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x},SVGPathSegLinetoHorizontalRel.prototype.clone=function(){return new SVGPathSegLinetoHorizontalRel((void 0),this._x)},Object.defineProperty(SVGPathSegLinetoHorizontalRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegLinetoVerticalAbs=function(t,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS,"V",t),this._y=e},SVGPathSegLinetoVerticalAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoVerticalAbs.prototype.toString=function(){return"[object SVGPathSegLinetoVerticalAbs]"},SVGPathSegLinetoVerticalAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._y},SVGPathSegLinetoVerticalAbs.prototype.clone=function(){return new SVGPathSegLinetoVerticalAbs((void 0),this._y)},Object.defineProperty(SVGPathSegLinetoVerticalAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegLinetoVerticalRel=function(t,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL,"v",t),this._y=e},SVGPathSegLinetoVerticalRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoVerticalRel.prototype.toString=function(){return"[object SVGPathSegLinetoVerticalRel]"},SVGPathSegLinetoVerticalRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._y},SVGPathSegLinetoVerticalRel.prototype.clone=function(){return new SVGPathSegLinetoVerticalRel((void 0),this._y)},Object.defineProperty(SVGPathSegLinetoVerticalRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoCubicSmoothAbs=function(t,e,n,r,i){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS,"S",t),this._x=e,this._y=n,this._x2=r,this._y2=i},SVGPathSegCurvetoCubicSmoothAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicSmoothAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicSmoothAbs]"},SVGPathSegCurvetoCubicSmoothAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicSmoothAbs.prototype.clone=function(){return new SVGPathSegCurvetoCubicSmoothAbs((void 0),this._x,this._y,this._x2,this._y2)},Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"x2",{get:function(){return this._x2},set:function(t){this._x2=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"y2",{get:function(){return this._y2},set:function(t){this._y2=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoCubicSmoothRel=function(t,e,n,r,i){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL,"s",t),this._x=e,this._y=n,this._x2=r,this._y2=i},SVGPathSegCurvetoCubicSmoothRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicSmoothRel.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicSmoothRel]"},SVGPathSegCurvetoCubicSmoothRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicSmoothRel.prototype.clone=function(){return new SVGPathSegCurvetoCubicSmoothRel((void 0),this._x,this._y,this._x2,this._y2);
},Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"x2",{get:function(){return this._x2},set:function(t){this._x2=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"y2",{get:function(){return this._y2},set:function(t){this._y2=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoQuadraticSmoothAbs=function(t,e,n){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS,"T",t),this._x=e,this._y=n},SVGPathSegCurvetoQuadraticSmoothAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticSmoothAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticSmoothAbs]"},SVGPathSegCurvetoQuadraticSmoothAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticSmoothAbs.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticSmoothAbs((void 0),this._x,this._y)},Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),t.SVGPathSegCurvetoQuadraticSmoothRel=function(t,e,n){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL,"t",t),this._x=e,this._y=n},SVGPathSegCurvetoQuadraticSmoothRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticSmoothRel.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticSmoothRel]"},SVGPathSegCurvetoQuadraticSmoothRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticSmoothRel.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticSmoothRel((void 0),this._x,this._y)},Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype,"x",{get:function(){return this._x},set:function(t){this._x=t,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype,"y",{get:function(){return this._y},set:function(t){this._y=t,this._segmentChanged()},enumerable:!0}),SVGPathElement.prototype.createSVGPathSegClosePath=function(){return new SVGPathSegClosePath((void 0))},SVGPathElement.prototype.createSVGPathSegMovetoAbs=function(t,e){return new SVGPathSegMovetoAbs((void 0),t,e)},SVGPathElement.prototype.createSVGPathSegMovetoRel=function(t,e){return new SVGPathSegMovetoRel((void 0),t,e)},SVGPathElement.prototype.createSVGPathSegLinetoAbs=function(t,e){return new SVGPathSegLinetoAbs((void 0),t,e)},SVGPathElement.prototype.createSVGPathSegLinetoRel=function(t,e){return new SVGPathSegLinetoRel((void 0),t,e)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs=function(t,e,n,r,i,a){return new SVGPathSegCurvetoCubicAbs((void 0),t,e,n,r,i,a)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel=function(t,e,n,r,i,a){return new SVGPathSegCurvetoCubicRel((void 0),t,e,n,r,i,a)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs=function(t,e,n,r){return new SVGPathSegCurvetoQuadraticAbs((void 0),t,e,n,r)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel=function(t,e,n,r){return new SVGPathSegCurvetoQuadraticRel((void 0),t,e,n,r)},SVGPathElement.prototype.createSVGPathSegArcAbs=function(t,e,n,r,i,a,o){return new SVGPathSegArcAbs((void 0),t,e,n,r,i,a,o)},SVGPathElement.prototype.createSVGPathSegArcRel=function(t,e,n,r,i,a,o){return new SVGPathSegArcRel((void 0),t,e,n,r,i,a,o)},SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs=function(t){return new SVGPathSegLinetoHorizontalAbs((void 0),t)},SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel=function(t){return new SVGPathSegLinetoHorizontalRel((void 0),t)},SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs=function(t){return new SVGPathSegLinetoVerticalAbs((void 0),t)},SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel=function(t){return new SVGPathSegLinetoVerticalRel((void 0),t)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs=function(t,e,n,r){return new SVGPathSegCurvetoCubicSmoothAbs((void 0),t,e,n,r)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel=function(t,e,n,r){return new SVGPathSegCurvetoCubicSmoothRel((void 0),t,e,n,r)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs=function(t,e){return new SVGPathSegCurvetoQuadraticSmoothAbs((void 0),t,e)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel=function(t,e){return new SVGPathSegCurvetoQuadraticSmoothRel((void 0),t,e)}),"SVGPathSegList"in t||(t.SVGPathSegList=function(t){this._pathElement=t,this._list=this._parsePath(this._pathElement.getAttribute("d")),this._mutationObserverConfig={attributes:!0,attributeFilter:["d"]},this._pathElementMutationObserver=new MutationObserver(this._updateListFromPathMutations.bind(this)),this._pathElementMutationObserver.observe(this._pathElement,this._mutationObserverConfig)},Object.defineProperty(SVGPathSegList.prototype,"numberOfItems",{get:function(){return this._checkPathSynchronizedToList(),this._list.length},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"pathSegList",{get:function(){return this._pathSegList||(this._pathSegList=new SVGPathSegList(this)),this._pathSegList},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"normalizedPathSegList",{get:function(){return this.pathSegList},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"animatedPathSegList",{get:function(){return this.pathSegList},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"animatedNormalizedPathSegList",{get:function(){return this.pathSegList},enumerable:!0}),SVGPathSegList.prototype._checkPathSynchronizedToList=function(){this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords())},SVGPathSegList.prototype._updateListFromPathMutations=function(t){if(this._pathElement){var e=!1;t.forEach(function(t){"d"==t.attributeName&&(e=!0)}),e&&(this._list=this._parsePath(this._pathElement.getAttribute("d")))}},SVGPathSegList.prototype._writeListToPath=function(){this._pathElementMutationObserver.disconnect(),this._pathElement.setAttribute("d",SVGPathSegList._pathSegArrayAsString(this._list)),this._pathElementMutationObserver.observe(this._pathElement,this._mutationObserverConfig)},SVGPathSegList.prototype.segmentChanged=function(t){this._writeListToPath()},SVGPathSegList.prototype.clear=function(){this._checkPathSynchronizedToList(),this._list.forEach(function(t){t._owningPathSegList=null}),this._list=[],this._writeListToPath()},SVGPathSegList.prototype.initialize=function(t){return this._checkPathSynchronizedToList(),this._list=[t],t._owningPathSegList=this,this._writeListToPath(),t},SVGPathSegList.prototype._checkValidIndex=function(t){if(isNaN(t)||t<0||t>=this.numberOfItems)throw"INDEX_SIZE_ERR"},SVGPathSegList.prototype.getItem=function(t){return this._checkPathSynchronizedToList(),this._checkValidIndex(t),this._list[t]},SVGPathSegList.prototype.insertItemBefore=function(t,e){return this._checkPathSynchronizedToList(),e>this.numberOfItems&&(e=this.numberOfItems),t._owningPathSegList&&(t=t.clone()),this._list.splice(e,0,t),t._owningPathSegList=this,this._writeListToPath(),t},SVGPathSegList.prototype.replaceItem=function(t,e){return this._checkPathSynchronizedToList(),t._owningPathSegList&&(t=t.clone()),this._checkValidIndex(e),this._list[e]=t,t._owningPathSegList=this,this._writeListToPath(),t},SVGPathSegList.prototype.removeItem=function(t){this._checkPathSynchronizedToList(),this._checkValidIndex(t);var e=this._list[t];return this._list.splice(t,1),this._writeListToPath(),e},SVGPathSegList.prototype.appendItem=function(t){return this._checkPathSynchronizedToList(),t._owningPathSegList&&(t=t.clone()),this._list.push(t),t._owningPathSegList=this,this._writeListToPath(),t},SVGPathSegList._pathSegArrayAsString=function(t){var e="",n=!0;return t.forEach(function(t){n?(n=!1,e+=t._asPathString()):e+=" "+t._asPathString()}),e},SVGPathSegList.prototype._parsePath=function(t){if(!t||0==t.length)return[];var e=this,n=function(){this.pathSegList=[]};n.prototype.appendSegment=function(t){this.pathSegList.push(t)};var r=function(t){this._string=t,this._currentIndex=0,this._endIndex=this._string.length,this._previousCommand=SVGPathSeg.PATHSEG_UNKNOWN,this._skipOptionalSpaces()};r.prototype._isCurrentSpace=function(){var t=this._string[this._currentIndex];return t<=" "&&(" "==t||"\n"==t||"\t"==t||"\r"==t||"\f"==t)},r.prototype._skipOptionalSpaces=function(){for(;this._currentIndex<this._endIndex&&this._isCurrentSpace();)this._currentIndex++;return this._currentIndex<this._endIndex},r.prototype._skipOptionalSpacesOrDelimiter=function(){return!(this._currentIndex<this._endIndex&&!this._isCurrentSpace()&&","!=this._string.charAt(this._currentIndex))&&(this._skipOptionalSpaces()&&this._currentIndex<this._endIndex&&","==this._string.charAt(this._currentIndex)&&(this._currentIndex++,this._skipOptionalSpaces()),this._currentIndex<this._endIndex)},r.prototype.hasMoreData=function(){return this._currentIndex<this._endIndex},r.prototype.peekSegmentType=function(){var t=this._string[this._currentIndex];return this._pathSegTypeFromChar(t)},r.prototype._pathSegTypeFromChar=function(t){switch(t){case"Z":case"z":return SVGPathSeg.PATHSEG_CLOSEPATH;case"M":return SVGPathSeg.PATHSEG_MOVETO_ABS;case"m":return SVGPathSeg.PATHSEG_MOVETO_REL;case"L":return SVGPathSeg.PATHSEG_LINETO_ABS;case"l":return SVGPathSeg.PATHSEG_LINETO_REL;case"C":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS;case"c":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL;case"Q":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS;case"q":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL;case"A":return SVGPathSeg.PATHSEG_ARC_ABS;case"a":return SVGPathSeg.PATHSEG_ARC_REL;case"H":return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS;case"h":return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL;case"V":return SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS;case"v":return SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL;case"S":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS;case"s":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL;case"T":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS;case"t":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL;default:return SVGPathSeg.PATHSEG_UNKNOWN}},r.prototype._nextCommandHelper=function(t,e){return("+"==t||"-"==t||"."==t||t>="0"&&t<="9")&&e!=SVGPathSeg.PATHSEG_CLOSEPATH?e==SVGPathSeg.PATHSEG_MOVETO_ABS?SVGPathSeg.PATHSEG_LINETO_ABS:e==SVGPathSeg.PATHSEG_MOVETO_REL?SVGPathSeg.PATHSEG_LINETO_REL:e:SVGPathSeg.PATHSEG_UNKNOWN},r.prototype.initialCommandIsMoveTo=function(){if(!this.hasMoreData())return!0;var t=this.peekSegmentType();return t==SVGPathSeg.PATHSEG_MOVETO_ABS||t==SVGPathSeg.PATHSEG_MOVETO_REL},r.prototype._parseNumber=function(){var t=0,e=0,n=1,r=0,i=1,a=1,o=this._currentIndex;if(this._skipOptionalSpaces(),this._currentIndex<this._endIndex&&"+"==this._string.charAt(this._currentIndex)?this._currentIndex++:this._currentIndex<this._endIndex&&"-"==this._string.charAt(this._currentIndex)&&(this._currentIndex++,i=-1),!(this._currentIndex==this._endIndex||(this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")&&"."!=this._string.charAt(this._currentIndex))){for(var s=this._currentIndex;this._currentIndex<this._endIndex&&this._string.charAt(this._currentIndex)>="0"&&this._string.charAt(this._currentIndex)<="9";)this._currentIndex++;if(this._currentIndex!=s)for(var u=this._currentIndex-1,c=1;u>=s;)e+=c*(this._string.charAt(u--)-"0"),c*=10;if(this._currentIndex<this._endIndex&&"."==this._string.charAt(this._currentIndex)){if(this._currentIndex++,this._currentIndex>=this._endIndex||this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")return;for(;this._currentIndex<this._endIndex&&this._string.charAt(this._currentIndex)>="0"&&this._string.charAt(this._currentIndex)<="9";)r+=(this._string.charAt(this._currentIndex++)-"0")*(n*=.1)}if(this._currentIndex!=o&&this._currentIndex+1<this._endIndex&&("e"==this._string.charAt(this._currentIndex)||"E"==this._string.charAt(this._currentIndex))&&"x"!=this._string.charAt(this._currentIndex+1)&&"m"!=this._string.charAt(this._currentIndex+1)){if(this._currentIndex++,"+"==this._string.charAt(this._currentIndex)?this._currentIndex++:"-"==this._string.charAt(this._currentIndex)&&(this._currentIndex++,a=-1),this._currentIndex>=this._endIndex||this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")return;for(;this._currentIndex<this._endIndex&&this._string.charAt(this._currentIndex)>="0"&&this._string.charAt(this._currentIndex)<="9";)t*=10,t+=this._string.charAt(this._currentIndex)-"0",this._currentIndex++}var l=e+r;if(l*=i,t&&(l*=Math.pow(10,a*t)),o!=this._currentIndex)return this._skipOptionalSpacesOrDelimiter(),l}},r.prototype._parseArcFlag=function(){if(!(this._currentIndex>=this._endIndex)){var t=!1,e=this._string.charAt(this._currentIndex++);if("0"==e)t=!1;else{if("1"!=e)return;t=!0}return this._skipOptionalSpacesOrDelimiter(),t}},r.prototype.parseSegment=function(){var t=this._string[this._currentIndex],n=this._pathSegTypeFromChar(t);if(n==SVGPathSeg.PATHSEG_UNKNOWN){if(this._previousCommand==SVGPathSeg.PATHSEG_UNKNOWN)return null;if(n=this._nextCommandHelper(t,this._previousCommand),n==SVGPathSeg.PATHSEG_UNKNOWN)return null}else this._currentIndex++;switch(this._previousCommand=n,n){case SVGPathSeg.PATHSEG_MOVETO_REL:return new SVGPathSegMovetoRel(e,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_MOVETO_ABS:return new SVGPathSegMovetoAbs(e,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_REL:return new SVGPathSegLinetoRel(e,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_ABS:return new SVGPathSegLinetoAbs(e,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:return new SVGPathSegLinetoHorizontalRel(e,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:return new SVGPathSegLinetoHorizontalAbs(e,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:return new SVGPathSegLinetoVerticalRel(e,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:return new SVGPathSegLinetoVerticalAbs(e,this._parseNumber());case SVGPathSeg.PATHSEG_CLOSEPATH:return this._skipOptionalSpaces(),new SVGPathSegClosePath(e);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL:var r={x1:this._parseNumber(),y1:this._parseNumber(),x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicRel(e,r.x,r.y,r.x1,r.y1,r.x2,r.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS:var r={x1:this._parseNumber(),y1:this._parseNumber(),x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicAbs(e,r.x,r.y,r.x1,r.y1,r.x2,r.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL:var r={x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicSmoothRel(e,r.x,r.y,r.x2,r.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:var r={x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicSmoothAbs(e,r.x,r.y,r.x2,r.y2);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL:var r={x1:this._parseNumber(),y1:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoQuadraticRel(e,r.x,r.y,r.x1,r.y1);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS:var r={x1:this._parseNumber(),y1:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoQuadraticAbs(e,r.x,r.y,r.x1,r.y1);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:return new SVGPathSegCurvetoQuadraticSmoothRel(e,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:return new SVGPathSegCurvetoQuadraticSmoothAbs(e,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_ARC_REL:var r={x1:this._parseNumber(),y1:this._parseNumber(),arcAngle:this._parseNumber(),arcLarge:this._parseArcFlag(),arcSweep:this._parseArcFlag(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegArcRel(e,r.x,r.y,r.x1,r.y1,r.arcAngle,r.arcLarge,r.arcSweep);case SVGPathSeg.PATHSEG_ARC_ABS:var r={x1:this._parseNumber(),y1:this._parseNumber(),arcAngle:this._parseNumber(),arcLarge:this._parseArcFlag(),arcSweep:this._parseArcFlag(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegArcAbs(e,r.x,r.y,r.x1,r.y1,r.arcAngle,r.arcLarge,r.arcSweep);default:throw"Unknown path seg type."}};var i=new n,a=new r(t);if(!a.initialCommandIsMoveTo())return[];for(;a.hasMoreData();){var o=a.parseSegment();if(!o)return[];i.appendSegment(o)}return i.pathSegList})}(),"function"==typeof define&&define.amd?define("c3",["d3"],function(){return l}):"undefined"!=typeof exports&&"undefined"!=typeof module?module.exports=l:t.c3=l}(window),angular.module("watchmenControllers",[]),function(){"use strict";var t=angular.module("watchmenControllers");t.controller("ServiceAddCtrl",["$scope","$state","$filter","$stateParams","Service","Report",function(t,e,n,r,i,a){t.service=new i,t.editServiceTitle="New service",t.service.timeout=1e4,t.service.warningThreshold=5e3,t.service.interval=6e4,t.service.failureInterval=3e4,t.service.failuresToBeOutage=1,t.service.port=80,t.service.pingServiceName="http-head",t.save=function(){t.service.pingServiceOptions={},t.service.pingServiceOptions[t.service.pingServiceName]=t.selectedPingServiceOptions,t.service.$save(function(){a.clearCache(),e.go("services")},function(e){console.error(e),e&&e.data&&e.data.errors&&(t.serviceAddErrors=e.data.errors)})},t.cancel=function(){e.go("services")}}])}(),function(){"use strict";var t=angular.module("watchmenControllers");t.controller("ServiceDetailCtrl",["$scope","$filter","$stateParams","Report","ngTableUtils","usSpinnerService","$timeout",function(t,e,n,r,i,a,o){function s(){return{height:200,width:$(".chart-container").width()}}function u(){a.spin("spinner-1"),t.loading=!0}function c(){a.stop("spinner-1"),t.loading=!1}function l(e){console.log(e),c();var n=e.statusText;e.data&&e.data.error&&(n=e.data.error),t.errorLoadingService=n}u(),t.serviceDetails=r.get({id:n.id},function(e){c(),t.latestOutages=e.status.latestOutages;var n=e.status.lastHour.latency,r=e.status.last24Hours.latency,i=e.status.lastWeek.latency,a=_.max(n.list,function(t){return t.l}),u=_.max(r.list,function(t){return t.l}),l=_.max(i.list,function(t){return t.l}),f=_.max([a.l,u.l,l.l]),h=[];o(function(){function a(){for(var t=0;t<h.length;t++)h[t].resize(s())}var o=s();n.list.length>0&&(t.showLastHourChart=!0,h.push(Charting.render({threshold:e.service.warningThreshold,latency:n.list,outages:e.status.lastHour.outages,id:"#chart-last-hour",size:o,max:f}))),r.list.length>8&&(t.showLast24Chart=!0,h.push(Charting.render({threshold:e.service.warningThreshold,latency:r.list,outages:e.status.last24Hours.outages,id:"#chart-last-24-hours",size:o,max:f}))),i.list.length>1&&(t.showLastWeekChart=!0,h.push(Charting.render({threshold:e.service.warningThreshold,latency:i.list,outages:e.status.lastWeek.outages,id:"#chart-last-week",size:o,x_format:"%d/%m",max:f}))),t.$on("$destroy",function(){$(window).off("resize",a)}),$(window).resize(a)},0)},l),t.showConfig=!1,t.isAdmin=window.isAdmin,t.services=r.query(function(){t.services.sort(function(t,e){return t.status.last24Hours.uptime-e.status.last24Hours.uptime})})}])}(),function(){"use strict";var t=angular.module("watchmenControllers");t.controller("ServiceEditCtrl",["$scope","$state","$filter","$stateParams","Service","Report","usSpinnerService",function(t,e,n,r,i,a,o){function s(){o.spin("spinner-1"),t.loading=!0}function u(){o.stop("spinner-1"),t.loading=!1}s(),t.editServiceTitle="Update service",t.service=i.get({id:r.id},function(){u()},function(t){console.error(t),401===t.status&&e.go("services"),u()}),t.save=function(){t.service.pingServiceOptions={},t.service.pingServiceOptions[t.service.pingServiceName]=t.selectedPingServiceOptions,t.service.$save(function(){a.clearCache(),e.go("services")},function(e){console.error(e),e&&e.data&&e.data.errors&&(t.serviceAddErrors=e.data.errors)})},t.cancel=function(){e.go("services")}}])}(),function(){"use strict";var t,e=1e4,n=angular.module("watchmenControllers");n.controller("ServiceListCtrl",["$scope","$filter","$timeout","Report","Service","usSpinnerService","ngTableUtils",function(n,r,i,a,o,s,u){function c(){i.cancel(t),t=i(function(){f(c,l)},e)}function l(t){n.errorLoadingServices="Error loading data from remote server",console.error(t),c()}function f(t,e){a.clearCache(),n.services=a.query(function(e){n[d]=e,n.tableParams.reload(),n.errorLoadingServices=null,h.loaded(),t()},e)}var h={loading:function(){s.spin("spinner-1"),n.loading=!0},loaded:function(){s.stop("spinner-1"),n.loading=!1}},d="tableServicesData";n[d]=[],n.tableParams=u.createngTableParams(d,n,r);var p=document.getElementById("filterRestrictedToMe");if(p&&window.localStorage){var g="true"===window.localStorage.getItem("filterRestrictedToMe");i(function(){p.checked=g,n.filterRestrictedToMe=g},0)}n.$watch("filterRestrictedToMe",function(t){window.localStorage&&window.localStorage.setItem("filterRestrictedToMe",t)}),h.loading(),n.serviceFilter=function(t){return!(n.filterRestrictedToMe&&!t.service.isRestricted)&&t.service.name.indexOf(n.query||"")>-1},n.delete=function(t){confirm("Are you sure you want to delete this service and all its data?")&&o.delete({id:t},function(){f(function(){},function(){n.errorLoadingServices="Error loading data from remote server"})})},n.reset=function(t){confirm("Are you sure you want to reset this service's data?")&&o.reset({id:t},function(){f(function(){},function(){n.errorLoadingServices="Error loading data from remote server"})})},f(c,l)}])}(),function(){"use strict";function t(t,e,n){for(var r=[],i=[],a=0;a<t.length;a++)r.push([t[a][e]]),i.push(Math.round([t[a][n]]));return{time:r,data:i}}function e(t){return c3.generate({size:t.size,bindto:t.id,legend:{show:!1},data:{x:"x",columns:t.columns,types:{Latency:"area"},colors:{Latency:"green"}},axis:{y:{max:isNaN(t.max)?0:t.max,tick:{values:[200,500,1e3,2e3,3e3,4e3,5e3,7e3,1e4,15e3,2e4,3e4]}},x:{type:"timeseries",tick:{format:t.x_format||"%H:%M"}}},grid:t.grid,regions:t.regions,tooltip:{format:{title:function(t){return moment(t).format("DD/MMM/YY HH:mm")+" ("+moment(t).fromNow()+")"},value:function(t,e,n){return"Outages"==n?moment.duration(t).humanize():t+" ms."}}}})}window.Charting=window.Charting||{};Charting.render=function(n){var r=t(n.latency,"t","l"),i=r.data,a=r.time;a.splice(0,0,"x"),i.splice(0,0,"Latency");var o=[];if(n.outages)for(var s=0;s<n.outages.length;s++){var u=n.outages[s];o.push({axis:"x",start:u.timestamp,end:u.timestamp+u.downtime,class:"region-outage",opacity:1})}var c=[{axis:"y",start:n.threshold,class:"region-latency-warning"}].concat(o);return e({size:n.size,id:n.id,x_format:n.x_format,columns:[a,i],grid:{y:{lines:[{value:n.threshold,text:"latency threshold",class:"threshold"}]}},regions:c,max:n.max})}}(),angular.module("watchmenDirectives",[]);var watchmenDirectives=angular.module("watchmenDirectives");watchmenDirectives.directive("pingServiceOptions",["PingPlugins",function(t){return{restrict:"EA",templateUrl:"ping-service-options.html",scope:!1,link:function(e){function n(){for(var t=0;t<e.pingServices.length;t++)e.pingServices[t].name===e.service.pingServiceName&&(e.selectedPingServiceOptions=$.extend({},e.pingServices[t].options,(e.service.pingServiceOptions||{})[e.service.pingServiceName]))}e.pingServices=t.query(function(){e.$watch("service.pingServiceName",function(){n()})}),e.hasPingServiceOptions=function(){return!angular.equals({},e.selectedPingServiceOptions)}}}}]),function(){"use strict";var t=angular.module("watchmenApp",["ui.router","angularSpinner","ngTable","angularMoment","angularMSTime","watchmenControllers","watchmenDirectives","watchmenFactories","ngResource"]);t.config(["$stateProvider","$locationProvider","$urlRouterProvider",function(t,e,n){e.html5Mode(!0),t.state("services",{url:"/services",templateUrl:"service-list.html",controller:"ServiceListCtrl"}).state("viewService",{url:"/services/:id/view",templateUrl:"service-detail.html",controller:"ServiceDetailCtrl"}).state("newService",{url:"/services/add",templateUrl:"service-edit.html",controller:"ServiceAddCtrl"}).state("editService",{url:"/services/:id/edit",templateUrl:"service-edit.html",controller:"ServiceEditCtrl"}),n.when("/","/services")}])}(),function(){"use strict";angular.module("watchmenFactories",[]);var t,e,n=3e4,r=angular.module("watchmenFactories");r.factory("Report",["$resource","$cacheFactory",function(e,r){t=r("Services"),setInterval(function(){t.removeAll()},n);var i=e("/api/report/services/:id",{id:"@id"},{get:{method:"GET",cache:t},query:{method:"GET",isArray:!0,cache:t}});return i.clearCache=function(){t&&t.removeAll()},i}]),r.factory("Service",["$resource",function(t){return t("/api/services/:id",{id:"@id"},{reset:{method:"POST",url:"/api/services/:id/reset"}})}]),r.factory("PingPlugins",["$resource","$cacheFactory",function(t,n){return e=n("PingPlugins"),t("/api/plugins/:id",{id:"@id"},{query:{method:"GET",isArray:!0,cache:e}})}])}(),function(){"use strict";var t=!0;angular.module("watchmenFactories").factory("ngTableUtils",["ngTableParams",function(e){function n(e){var n={sorting:{"status.last24Hours.uptime":"asc"}};return t&&window.localStorage&&window.localStorage.getItem(e)?JSON.parse(window.localStorage.getItem(e)):n}function r(t,r,i){return new e(n(t),{total:r[t].length,counts:[],getData:function(e,n){var a=r[t],o=n.sorting()?i("orderBy")(a,n.orderBy()):a;e.resolve(o),window.localStorage&&window.localStorage.setItem(t,JSON.stringify({sorting:n.sorting()}))}})}return{createngTableParams:r}}])}();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb3RzdHJhcC5qcyIsImFuZ3VsYXIuanMiLCJhbmd1bGFyLXJlc291cmNlLmpzIiwibW9tZW50LmpzIiwibmctdGFibGUubWluLmpzIiwianF1ZXJ5LmpzIiwic3Bpbi5qcyIsImQzLmpzIiwiYW5ndWxhci11aS1yb3V0ZXIuanMiLCJhbmd1bGFyLW1zLXRpbWUuanMiLCJsb2Rhc2guanMiLCJhbmd1bGFyLW1vbWVudC5qcyIsImFuZ3VsYXItc3Bpbm5lci5qcyIsImMzLmpzIiwiY29udHJvbGxlcnMuanMiLCJzZXJ2aWNlLWFkZC5qcyIsInNlcnZpY2UtZGV0YWlscy5qcyIsInNlcnZpY2UtZWRpdC5qcyIsInNlcnZpY2VzLWxpc3QuanMiLCJjaGFydGluZy5qcyIsImRpcmVjdGl2ZXMuanMiLCJwaW5nLXNlcnZpY2Utb3B0aW9ucy5qcyIsImFwcC5qcyIsImZhY3Rvcmllcy5qcyIsIm5nVGFibGUtdXRpbHMuanMiXSwibmFtZXMiOlsid2luZG93IiwibWluRXJyIiwibW9kdWxlIiwiRXJyb3JDb25zdHJ1Y3RvciIsIkVycm9yIiwicGFyYW1QcmVmaXgiLCJpIiwiU0tJUF9JTkRFWEVTIiwidGVtcGxhdGVBcmdzIiwiYXJndW1lbnRzIiwiY29kZSIsIm1lc3NhZ2UiLCJ0ZW1wbGF0ZSIsInJlcGxhY2UiLCJtYXRjaCIsImluZGV4Iiwic2xpY2UiLCJzaGlmdGVkSW5kZXgiLCJsZW5ndGgiLCJ0b0RlYnVnU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaXNBcnJheUxpa2UiLCJvYmoiLCJpc1dpbmRvdyIsImlzQXJyYXkiLCJpc1N0cmluZyIsImpxTGl0ZSIsIk9iamVjdCIsImlzTnVtYmVyIiwiQXJyYXkiLCJpdGVtIiwiZm9yRWFjaCIsIml0ZXJhdG9yIiwiY29udGV4dCIsImtleSIsImlzRnVuY3Rpb24iLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpc1ByaW1pdGl2ZSIsImlzQmxhbmtPYmplY3QiLCJmb3JFYWNoU29ydGVkIiwia2V5cyIsInNvcnQiLCJyZXZlcnNlUGFyYW1zIiwiaXRlcmF0b3JGbiIsInZhbHVlIiwibmV4dFVpZCIsInVpZCIsInNldEhhc2hLZXkiLCJoIiwiJCRoYXNoS2V5IiwiYmFzZUV4dGVuZCIsImRzdCIsIm9ianMiLCJkZWVwIiwiaWkiLCJpc09iamVjdCIsImoiLCJqaiIsInNyYyIsImlzRGF0ZSIsIkRhdGUiLCJ2YWx1ZU9mIiwiaXNSZWdFeHAiLCJSZWdFeHAiLCJub2RlTmFtZSIsImNsb25lTm9kZSIsImlzRWxlbWVudCIsImNsb25lIiwiZXh0ZW5kIiwibWVyZ2UiLCJ0b0ludCIsInN0ciIsInBhcnNlSW50IiwiaW5oZXJpdCIsInBhcmVudCIsImV4dHJhIiwiY3JlYXRlIiwibm9vcCIsImlkZW50aXR5IiwiJCIsInZhbHVlRm4iLCJoYXNDdXN0b21Ub1N0cmluZyIsInRvU3RyaW5nIiwiaXNVbmRlZmluZWQiLCJpc0RlZmluZWQiLCJnZXRQcm90b3R5cGVPZiIsImlzU2NvcGUiLCIkZXZhbEFzeW5jIiwiJHdhdGNoIiwiaXNGaWxlIiwiaXNGb3JtRGF0YSIsImlzQmxvYiIsImlzQm9vbGVhbiIsImlzUHJvbWlzZUxpa2UiLCJ0aGVuIiwiaXNUeXBlZEFycmF5IiwiVFlQRURfQVJSQVlfUkVHRVhQIiwidGVzdCIsImlzQXJyYXlCdWZmZXIiLCJub2RlIiwicHJvcCIsImF0dHIiLCJmaW5kIiwibWFrZU1hcCIsIml0ZW1zIiwic3BsaXQiLCJub2RlTmFtZV8iLCJlbGVtZW50IiwibG93ZXJjYXNlIiwiaW5jbHVkZXMiLCJhcnJheSIsInByb3RvdHlwZSIsImluZGV4T2YiLCJhcnJheVJlbW92ZSIsInNwbGljZSIsImNvcHkiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsImNvcHlSZWN1cnNlIiwicHVzaCIsImNvcHlFbGVtZW50Iiwic3RhY2tTb3VyY2UiLCJzdGFja0Rlc3QiLCJuZ01pbkVyciIsIm5lZWRzUmVjdXJzZSIsImNvcHlUeXBlIiwidW5kZWZpbmVkIiwiY29uc3RydWN0b3IiLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiY29waWVkIiwiQXJyYXlCdWZmZXIiLCJieXRlTGVuZ3RoIiwiVWludDhBcnJheSIsInNldCIsInJlIiwibGFzdEluZGV4IiwidHlwZSIsImVxdWFscyIsIm8xIiwibzIiLCJrZXlTZXQiLCJ0MSIsInQyIiwiZ2V0VGltZSIsImNyZWF0ZU1hcCIsImNoYXJBdCIsImNvbmNhdCIsImFycmF5MSIsImFycmF5MiIsInNsaWNlQXJncyIsImFyZ3MiLCJzdGFydEluZGV4IiwiYmluZCIsInNlbGYiLCJmbiIsImN1cnJ5QXJncyIsImFwcGx5IiwidG9Kc29uUmVwbGFjZXIiLCJ2YWwiLCJkb2N1bWVudCIsInRvSnNvbiIsInByZXR0eSIsIkpTT04iLCJzdHJpbmdpZnkiLCJmcm9tSnNvbiIsImpzb24iLCJwYXJzZSIsInRpbWV6b25lVG9PZmZzZXQiLCJ0aW1lem9uZSIsImZhbGxiYWNrIiwiQUxMX0NPTE9OUyIsInJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0IiwiaXNOdW1iZXJOYU4iLCJhZGREYXRlTWludXRlcyIsImRhdGUiLCJtaW51dGVzIiwic2V0TWludXRlcyIsImdldE1pbnV0ZXMiLCJjb252ZXJ0VGltZXpvbmVUb0xvY2FsIiwicmV2ZXJzZSIsImRhdGVUaW1lem9uZU9mZnNldCIsImdldFRpbWV6b25lT2Zmc2V0IiwidGltZXpvbmVPZmZzZXQiLCJzdGFydGluZ1RhZyIsImVtcHR5IiwiZSIsImVsZW1IdG1sIiwiYXBwZW5kIiwiaHRtbCIsIm5vZGVUeXBlIiwiTk9ERV9UWVBFX1RFWFQiLCJ0cnlEZWNvZGVVUklDb21wb25lbnQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJwYXJzZUtleVZhbHVlIiwia2V5VmFsdWUiLCJzcGxpdFBvaW50Iiwic3Vic3RyaW5nIiwidG9LZXlWYWx1ZSIsInBhcnRzIiwiYXJyYXlWYWx1ZSIsImVuY29kZVVyaVF1ZXJ5Iiwiam9pbiIsImVuY29kZVVyaVNlZ21lbnQiLCJwY3RFbmNvZGVTcGFjZXMiLCJnZXROZ0F0dHJpYnV0ZSIsIm5nQXR0ciIsIm5nQXR0clByZWZpeGVzIiwiZ2V0QXR0cmlidXRlIiwiYWxsb3dBdXRvQm9vdHN0cmFwIiwiY3VycmVudFNjcmlwdCIsImxpbmsiLCJjcmVhdGVFbGVtZW50IiwiaHJlZiIsImxvY2F0aW9uIiwib3JpZ2luIiwicHJvdG9jb2wiLCJhbmd1bGFySW5pdCIsImJvb3RzdHJhcCIsImFwcEVsZW1lbnQiLCJjb25maWciLCJwcmVmaXgiLCJuYW1lIiwiaGFzQXR0cmlidXRlIiwiY2FuZGlkYXRlIiwicXVlcnlTZWxlY3RvciIsImlzQXV0b0Jvb3RzdHJhcEFsbG93ZWQiLCJjb25zb2xlIiwiZXJyb3IiLCJzdHJpY3REaSIsIm1vZHVsZXMiLCJkZWZhdWx0Q29uZmlnIiwiZG9Cb290c3RyYXAiLCJpbmplY3RvciIsInRhZyIsInVuc2hpZnQiLCIkcHJvdmlkZSIsImRlYnVnSW5mb0VuYWJsZWQiLCIkY29tcGlsZVByb3ZpZGVyIiwiY3JlYXRlSW5qZWN0b3IiLCJpbnZva2UiLCJzY29wZSIsImNvbXBpbGUiLCIkYXBwbHkiLCJkYXRhIiwiTkdfRU5BQkxFX0RFQlVHX0lORk8iLCJOR19ERUZFUl9CT09UU1RSQVAiLCJhbmd1bGFyIiwicmVzdW1lQm9vdHN0cmFwIiwiZXh0cmFNb2R1bGVzIiwicmVzdW1lRGVmZXJyZWRCb290c3RyYXAiLCJyZWxvYWRXaXRoRGVidWdJbmZvIiwicmVsb2FkIiwiZ2V0VGVzdGFiaWxpdHkiLCJyb290RWxlbWVudCIsImdldCIsInNuYWtlX2Nhc2UiLCJzZXBhcmF0b3IiLCJTTkFLRV9DQVNFX1JFR0VYUCIsImxldHRlciIsInBvcyIsInRvTG93ZXJDYXNlIiwiYmluZEpRdWVyeSIsIm9yaWdpbmFsQ2xlYW5EYXRhIiwiYmluZEpRdWVyeUZpcmVkIiwianFOYW1lIiwianEiLCJqUXVlcnkiLCJvbiIsIkpRTGl0ZVByb3RvdHlwZSIsImlzb2xhdGVTY29wZSIsImNvbnRyb2xsZXIiLCJpbmhlcml0ZWREYXRhIiwiY2xlYW5EYXRhIiwiZWxlbXMiLCJldmVudHMiLCJlbGVtIiwiX2RhdGEiLCIkZGVzdHJveSIsInRyaWdnZXJIYW5kbGVyIiwiSlFMaXRlIiwiYXNzZXJ0QXJnIiwiYXJnIiwicmVhc29uIiwiYXNzZXJ0QXJnRm4iLCJhY2NlcHRBcnJheUFubm90YXRpb24iLCJhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eSIsImdldHRlciIsInBhdGgiLCJiaW5kRm5Ub1Njb3BlIiwibGFzdEluc3RhbmNlIiwibGVuIiwiZ2V0QmxvY2tOb2RlcyIsIm5vZGVzIiwiYmxvY2tOb2RlcyIsImVuZE5vZGUiLCJuZXh0U2libGluZyIsInNldHVwTW9kdWxlTG9hZGVyIiwiZW5zdXJlIiwiZmFjdG9yeSIsIiRpbmplY3Rvck1pbkVyciIsIiQkbWluRXJyIiwicmVxdWlyZXMiLCJjb25maWdGbiIsImludm9rZUxhdGVyIiwicHJvdmlkZXIiLCJtZXRob2QiLCJpbnNlcnRNZXRob2QiLCJxdWV1ZSIsImludm9rZVF1ZXVlIiwibW9kdWxlSW5zdGFuY2UiLCJpbnZva2VMYXRlckFuZFNldE1vZHVsZU5hbWUiLCJyZWNpcGVOYW1lIiwiZmFjdG9yeUZ1bmN0aW9uIiwiJCRtb2R1bGVOYW1lIiwiY29uZmlnQmxvY2tzIiwicnVuQmxvY2tzIiwiX2ludm9rZVF1ZXVlIiwiX2NvbmZpZ0Jsb2NrcyIsIl9ydW5CbG9ja3MiLCJzZXJ2aWNlIiwiY29uc3RhbnQiLCJkZWNvcmF0b3IiLCJhbmltYXRpb24iLCJmaWx0ZXIiLCJkaXJlY3RpdmUiLCJjb21wb25lbnQiLCJydW4iLCJibG9jayIsInRoaXMiLCJzaGFsbG93Q29weSIsInNlcmlhbGl6ZU9iamVjdCIsInNlZW4iLCJwdWJsaXNoRXh0ZXJuYWxBUEkiLCJ2ZXJzaW9uIiwidXBwZXJjYXNlIiwiY2FsbGJhY2tzIiwiJCRjb3VudGVyIiwiJCRjc3AiLCJjc3AiLCIkJGVuY29kZVVyaVNlZ21lbnQiLCIkJGVuY29kZVVyaVF1ZXJ5IiwiJCRzdHJpbmdpZnkiLCJhbmd1bGFyTW9kdWxlIiwiJCRzYW5pdGl6ZVVyaSIsIiQkU2FuaXRpemVVcmlQcm92aWRlciIsIiRDb21waWxlUHJvdmlkZXIiLCJhIiwiaHRtbEFuY2hvckRpcmVjdGl2ZSIsImlucHV0IiwiaW5wdXREaXJlY3RpdmUiLCJ0ZXh0YXJlYSIsImZvcm0iLCJmb3JtRGlyZWN0aXZlIiwic2NyaXB0Iiwic2NyaXB0RGlyZWN0aXZlIiwic2VsZWN0Iiwic2VsZWN0RGlyZWN0aXZlIiwib3B0aW9uIiwib3B0aW9uRGlyZWN0aXZlIiwibmdCaW5kIiwibmdCaW5kRGlyZWN0aXZlIiwibmdCaW5kSHRtbCIsIm5nQmluZEh0bWxEaXJlY3RpdmUiLCJuZ0JpbmRUZW1wbGF0ZSIsIm5nQmluZFRlbXBsYXRlRGlyZWN0aXZlIiwibmdDbGFzcyIsIm5nQ2xhc3NEaXJlY3RpdmUiLCJuZ0NsYXNzRXZlbiIsIm5nQ2xhc3NFdmVuRGlyZWN0aXZlIiwibmdDbGFzc09kZCIsIm5nQ2xhc3NPZGREaXJlY3RpdmUiLCJuZ0Nsb2FrIiwibmdDbG9ha0RpcmVjdGl2ZSIsIm5nQ29udHJvbGxlciIsIm5nQ29udHJvbGxlckRpcmVjdGl2ZSIsIm5nRm9ybSIsIm5nRm9ybURpcmVjdGl2ZSIsIm5nSGlkZSIsIm5nSGlkZURpcmVjdGl2ZSIsIm5nSWYiLCJuZ0lmRGlyZWN0aXZlIiwibmdJbmNsdWRlIiwibmdJbmNsdWRlRGlyZWN0aXZlIiwibmdJbml0IiwibmdJbml0RGlyZWN0aXZlIiwibmdOb25CaW5kYWJsZSIsIm5nTm9uQmluZGFibGVEaXJlY3RpdmUiLCJuZ1BsdXJhbGl6ZSIsIm5nUGx1cmFsaXplRGlyZWN0aXZlIiwibmdSZXBlYXQiLCJuZ1JlcGVhdERpcmVjdGl2ZSIsIm5nU2hvdyIsIm5nU2hvd0RpcmVjdGl2ZSIsIm5nU3R5bGUiLCJuZ1N0eWxlRGlyZWN0aXZlIiwibmdTd2l0Y2giLCJuZ1N3aXRjaERpcmVjdGl2ZSIsIm5nU3dpdGNoV2hlbiIsIm5nU3dpdGNoV2hlbkRpcmVjdGl2ZSIsIm5nU3dpdGNoRGVmYXVsdCIsIm5nU3dpdGNoRGVmYXVsdERpcmVjdGl2ZSIsIm5nT3B0aW9ucyIsIm5nT3B0aW9uc0RpcmVjdGl2ZSIsIm5nVHJhbnNjbHVkZSIsIm5nVHJhbnNjbHVkZURpcmVjdGl2ZSIsIm5nTW9kZWwiLCJuZ01vZGVsRGlyZWN0aXZlIiwibmdMaXN0IiwibmdMaXN0RGlyZWN0aXZlIiwibmdDaGFuZ2UiLCJuZ0NoYW5nZURpcmVjdGl2ZSIsInBhdHRlcm4iLCJwYXR0ZXJuRGlyZWN0aXZlIiwibmdQYXR0ZXJuIiwicmVxdWlyZWQiLCJyZXF1aXJlZERpcmVjdGl2ZSIsIm5nUmVxdWlyZWQiLCJtaW5sZW5ndGgiLCJtaW5sZW5ndGhEaXJlY3RpdmUiLCJuZ01pbmxlbmd0aCIsIm1heGxlbmd0aCIsIm1heGxlbmd0aERpcmVjdGl2ZSIsIm5nTWF4bGVuZ3RoIiwibmdWYWx1ZSIsIm5nVmFsdWVEaXJlY3RpdmUiLCJuZ01vZGVsT3B0aW9ucyIsIm5nTW9kZWxPcHRpb25zRGlyZWN0aXZlIiwibmdJbmNsdWRlRmlsbENvbnRlbnREaXJlY3RpdmUiLCJuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlcyIsIm5nRXZlbnREaXJlY3RpdmVzIiwiJGFuY2hvclNjcm9sbCIsIiRBbmNob3JTY3JvbGxQcm92aWRlciIsIiRhbmltYXRlIiwiJEFuaW1hdGVQcm92aWRlciIsIiRhbmltYXRlQ3NzIiwiJENvcmVBbmltYXRlQ3NzUHJvdmlkZXIiLCIkJGFuaW1hdGVKcyIsIiQkQ29yZUFuaW1hdGVKc1Byb3ZpZGVyIiwiJCRhbmltYXRlUXVldWUiLCIkJENvcmVBbmltYXRlUXVldWVQcm92aWRlciIsIiQkQW5pbWF0ZVJ1bm5lciIsIiQkQW5pbWF0ZVJ1bm5lckZhY3RvcnlQcm92aWRlciIsIiQkYW5pbWF0ZUFzeW5jUnVuIiwiJCRBbmltYXRlQXN5bmNSdW5GYWN0b3J5UHJvdmlkZXIiLCIkYnJvd3NlciIsIiRCcm93c2VyUHJvdmlkZXIiLCIkY2FjaGVGYWN0b3J5IiwiJENhY2hlRmFjdG9yeVByb3ZpZGVyIiwiJGNvbnRyb2xsZXIiLCIkQ29udHJvbGxlclByb3ZpZGVyIiwiJGRvY3VtZW50IiwiJERvY3VtZW50UHJvdmlkZXIiLCIkJGlzRG9jdW1lbnRIaWRkZW4iLCIkJElzRG9jdW1lbnRIaWRkZW5Qcm92aWRlciIsIiRleGNlcHRpb25IYW5kbGVyIiwiJEV4Y2VwdGlvbkhhbmRsZXJQcm92aWRlciIsIiRmaWx0ZXIiLCIkRmlsdGVyUHJvdmlkZXIiLCIkJGZvcmNlUmVmbG93IiwiJCRGb3JjZVJlZmxvd1Byb3ZpZGVyIiwiJGludGVycG9sYXRlIiwiJEludGVycG9sYXRlUHJvdmlkZXIiLCIkaW50ZXJ2YWwiLCIkSW50ZXJ2YWxQcm92aWRlciIsIiRodHRwIiwiJEh0dHBQcm92aWRlciIsIiRodHRwUGFyYW1TZXJpYWxpemVyIiwiJEh0dHBQYXJhbVNlcmlhbGl6ZXJQcm92aWRlciIsIiRodHRwUGFyYW1TZXJpYWxpemVySlFMaWtlIiwiJEh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2VQcm92aWRlciIsIiRodHRwQmFja2VuZCIsIiRIdHRwQmFja2VuZFByb3ZpZGVyIiwiJHhockZhY3RvcnkiLCIkeGhyRmFjdG9yeVByb3ZpZGVyIiwiJGpzb25wQ2FsbGJhY2tzIiwiJGpzb25wQ2FsbGJhY2tzUHJvdmlkZXIiLCIkbG9jYXRpb24iLCIkTG9jYXRpb25Qcm92aWRlciIsIiRsb2ciLCIkTG9nUHJvdmlkZXIiLCIkcGFyc2UiLCIkUGFyc2VQcm92aWRlciIsIiRyb290U2NvcGUiLCIkUm9vdFNjb3BlUHJvdmlkZXIiLCIkcSIsIiRRUHJvdmlkZXIiLCIkJHEiLCIkJFFQcm92aWRlciIsIiRzY2UiLCIkU2NlUHJvdmlkZXIiLCIkc2NlRGVsZWdhdGUiLCIkU2NlRGVsZWdhdGVQcm92aWRlciIsIiRzbmlmZmVyIiwiJFNuaWZmZXJQcm92aWRlciIsIiR0ZW1wbGF0ZUNhY2hlIiwiJFRlbXBsYXRlQ2FjaGVQcm92aWRlciIsIiR0ZW1wbGF0ZVJlcXVlc3QiLCIkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIiLCIkJHRlc3RhYmlsaXR5IiwiJCRUZXN0YWJpbGl0eVByb3ZpZGVyIiwiJHRpbWVvdXQiLCIkVGltZW91dFByb3ZpZGVyIiwiJHdpbmRvdyIsIiRXaW5kb3dQcm92aWRlciIsIiQkckFGIiwiJCRSQUZQcm92aWRlciIsIiQkanFMaXRlIiwiJCRqcUxpdGVQcm92aWRlciIsIiQkSGFzaE1hcCIsIiQkSGFzaE1hcFByb3ZpZGVyIiwiJCRjb29raWVSZWFkZXIiLCIkJENvb2tpZVJlYWRlclByb3ZpZGVyIiwianFOZXh0SWQiLCJqcUlkIiwiY3NzS2ViYWJUb0NhbWVsIiwia2ViYWJUb0NhbWVsIiwiTVNfSEFDS19SRUdFWFAiLCJmbkNhbWVsQ2FzZVJlcGxhY2UiLCJhbGwiLCJ0b1VwcGVyQ2FzZSIsIkRBU0hfTE9XRVJDQVNFX1JFR0VYUCIsImpxTGl0ZUlzVGV4dE5vZGUiLCJIVE1MX1JFR0VYUCIsImpxTGl0ZUFjY2VwdHNEYXRhIiwiTk9ERV9UWVBFX0VMRU1FTlQiLCJOT0RFX1RZUEVfRE9DVU1FTlQiLCJqcUxpdGVIYXNEYXRhIiwianFDYWNoZSIsIm5nMzM5IiwianFMaXRlQ2xlYW5EYXRhIiwianFMaXRlUmVtb3ZlRGF0YSIsImpxTGl0ZUJ1aWxkRnJhZ21lbnQiLCJ0bXAiLCJ3cmFwIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiY3JlYXRlVGV4dE5vZGUiLCJhcHBlbmRDaGlsZCIsIlRBR19OQU1FX1JFR0VYUCIsImV4ZWMiLCJ3cmFwTWFwIiwiX2RlZmF1bHQiLCJpbm5lckhUTUwiLCJYSFRNTF9UQUdfUkVHRVhQIiwibGFzdENoaWxkIiwiY2hpbGROb2RlcyIsImZpcnN0Q2hpbGQiLCJ0ZXh0Q29udGVudCIsImpxTGl0ZVBhcnNlSFRNTCIsInBhcnNlZCIsIlNJTkdMRV9UQUdfUkVHRVhQIiwianFMaXRlV3JhcE5vZGUiLCJ3cmFwcGVyIiwicGFyZW50Tm9kZSIsInJlcGxhY2VDaGlsZCIsImFyZ0lzU3RyaW5nIiwidHJpbSIsImpxTGl0ZU1pbkVyciIsImpxTGl0ZUFkZE5vZGVzIiwianFMaXRlUmVhZHkiLCJqcUxpdGVDbG9uZSIsImpxTGl0ZURlYWxvYyIsIm9ubHlEZXNjZW5kYW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJkZXNjZW5kYW50cyIsImwiLCJqcUxpdGVPZmYiLCJ1bnN1cHBvcnRlZCIsImV4cGFuZG9TdG9yZSIsImpxTGl0ZUV4cGFuZG9TdG9yZSIsImhhbmRsZSIsInJlbW92ZUhhbmRsZXIiLCJsaXN0ZW5lckZucyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJNT1VTRV9FVkVOVF9NQVAiLCJleHBhbmRvSWQiLCJjcmVhdGVJZk5lY2Vzc2FyeSIsImpxTGl0ZURhdGEiLCJpc1NpbXBsZVNldHRlciIsImlzU2ltcGxlR2V0dGVyIiwibWFzc0dldHRlciIsImpxTGl0ZUhhc0NsYXNzIiwic2VsZWN0b3IiLCJqcUxpdGVSZW1vdmVDbGFzcyIsImNzc0NsYXNzZXMiLCJzZXRBdHRyaWJ1dGUiLCJjc3NDbGFzcyIsImpxTGl0ZUFkZENsYXNzIiwiZXhpc3RpbmdDbGFzc2VzIiwicm9vdCIsImVsZW1lbnRzIiwianFMaXRlQ29udHJvbGxlciIsImpxTGl0ZUluaGVyaXRlZERhdGEiLCJkb2N1bWVudEVsZW1lbnQiLCJuYW1lcyIsIk5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCIsImhvc3QiLCJqcUxpdGVFbXB0eSIsInJlbW92ZUNoaWxkIiwianFMaXRlUmVtb3ZlIiwia2VlcERhdGEiLCJqcUxpdGVEb2N1bWVudExvYWRlZCIsImFjdGlvbiIsIndpbiIsInJlYWR5U3RhdGUiLCJzZXRUaW1lb3V0IiwidHJpZ2dlciIsImFkZEV2ZW50TGlzdGVuZXIiLCJnZXRCb29sZWFuQXR0ck5hbWUiLCJib29sZWFuQXR0ciIsIkJPT0xFQU5fQVRUUiIsIkJPT0xFQU5fRUxFTUVOVFMiLCJnZXRBbGlhc2VkQXR0ck5hbWUiLCJBTElBU0VEX0FUVFIiLCJjcmVhdGVFdmVudEhhbmRsZXIiLCJldmVudEhhbmRsZXIiLCJldmVudCIsImlzRGVmYXVsdFByZXZlbnRlZCIsImRlZmF1bHRQcmV2ZW50ZWQiLCJldmVudEZucyIsImV2ZW50Rm5zTGVuZ3RoIiwiaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkIiwib3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzdG9wUHJvcGFnYXRpb24iLCJpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCIsImhhbmRsZXJXcmFwcGVyIiwic3BlY2lhbEhhbmRsZXJXcmFwcGVyIiwiZGVmYXVsdEhhbmRsZXJXcmFwcGVyIiwiaGFuZGxlciIsInNwZWNpYWxNb3VzZUhhbmRsZXJXcmFwcGVyIiwidGFyZ2V0IiwicmVsYXRlZCIsInJlbGF0ZWRUYXJnZXQiLCJqcUxpdGVDb250YWlucyIsIiRnZXQiLCJoYXNDbGFzcyIsImNsYXNzZXMiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiaGFzaEtleSIsIm5leHRVaWRGbiIsIm9ialR5cGUiLCJIYXNoTWFwIiwiaXNvbGF0ZWRVaWQiLCJwdXQiLCJzdHJpbmdpZnlGbiIsIkZ1bmN0aW9uIiwiZXh0cmFjdEFyZ3MiLCJmblRleHQiLCJTVFJJUF9DT01NRU5UUyIsIkFSUk9XX0FSRyIsIkZOX0FSR1MiLCJhbm9uRm4iLCJhbm5vdGF0ZSIsIiRpbmplY3QiLCJhcmdEZWNsIiwibGFzdCIsIkZOX0FSR19TUExJVCIsIkZOX0FSRyIsInVuZGVyc2NvcmUiLCJtb2R1bGVzVG9Mb2FkIiwic3VwcG9ydE9iamVjdCIsImRlbGVnYXRlIiwicHJvdmlkZXJfIiwicHJvdmlkZXJJbmplY3RvciIsImluc3RhbnRpYXRlIiwicHJvdmlkZXJDYWNoZSIsInByb3ZpZGVyU3VmZml4IiwiZW5mb3JjZVJldHVyblZhbHVlIiwicmVzdWx0IiwiaW5zdGFuY2VJbmplY3RvciIsImZhY3RvcnlGbiIsImVuZm9yY2UiLCIkaW5qZWN0b3IiLCJpbnN0YW5jZUNhY2hlIiwic2VydmljZU5hbWUiLCJkZWNvckZuIiwib3JpZ1Byb3ZpZGVyIiwib3JpZyRnZXQiLCJvcmlnSW5zdGFuY2UiLCIkZGVsZWdhdGUiLCJsb2FkTW9kdWxlcyIsIm1vZHVsZUZuIiwicnVuSW52b2tlUXVldWUiLCJpbnZva2VBcmdzIiwibG9hZGVkTW9kdWxlcyIsInN0YWNrIiwiY3JlYXRlSW50ZXJuYWxJbmplY3RvciIsImNhY2hlIiwiZ2V0U2VydmljZSIsImNhbGxlciIsIklOU1RBTlRJQVRJTkciLCJlcnIiLCJzaGlmdCIsImluamVjdGlvbkFyZ3MiLCJsb2NhbHMiLCIkJGFubm90YXRlIiwiaXNDbGFzcyIsImZ1bmMiLCJtc2llIiwiJCRuZ0lzQ2xhc3MiLCJUeXBlIiwiY3RvciIsImhhcyIsInByb3RvSW5zdGFuY2VJbmplY3RvciIsImF1dG9TY3JvbGxpbmdFbmFibGVkIiwiZGlzYWJsZUF1dG9TY3JvbGxpbmciLCJnZXRGaXJzdEFuY2hvciIsImxpc3QiLCJzb21lIiwiZ2V0WU9mZnNldCIsIm9mZnNldCIsInNjcm9sbCIsInlPZmZzZXQiLCJzdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJwb3NpdGlvbiIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImJvdHRvbSIsInNjcm9sbFRvIiwic2Nyb2xsSW50b1ZpZXciLCJlbGVtVG9wIiwidG9wIiwic2Nyb2xsQnkiLCJoYXNoIiwiZWxtIiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRFbGVtZW50c0J5TmFtZSIsIm5ld1ZhbCIsIm9sZFZhbCIsIm1lcmdlQ2xhc3NlcyIsImIiLCJleHRyYWN0RWxlbWVudE5vZGUiLCJFTEVNRU5UX05PREUiLCJzcGxpdENsYXNzZXMiLCJrbGFzcyIsInByZXBhcmVBbmltYXRlT3B0aW9ucyIsIm9wdGlvbnMiLCJCcm93c2VyIiwiY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QiLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsIm91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcyIsInBvcCIsImdldEhhc2giLCJ1cmwiLCJzdWJzdHIiLCJjYWNoZVN0YXRlQW5kRmlyZVVybENoYW5nZSIsInBlbmRpbmdMb2NhdGlvbiIsImNhY2hlU3RhdGUiLCJmaXJlVXJsQ2hhbmdlIiwiY2FjaGVkU3RhdGUiLCJnZXRDdXJyZW50U3RhdGUiLCJsYXN0Q2FjaGVkU3RhdGUiLCJsYXN0QnJvd3NlclVybCIsImxhc3RIaXN0b3J5U3RhdGUiLCJ1cmxDaGFuZ2VMaXN0ZW5lcnMiLCJsaXN0ZW5lciIsImhpc3RvcnkiLCJjbGVhclRpbWVvdXQiLCJwZW5kaW5nRGVmZXJJZHMiLCJpc01vY2siLCIkJGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0IiwiJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsIm5vdGlmeVdoZW5Ob091dHN0YW5kaW5nUmVxdWVzdHMiLCJjYWxsYmFjayIsImJhc2VFbGVtZW50Iiwic3RhdGUiLCJzYW1lU3RhdGUiLCJzYW1lQmFzZSIsInN0cmlwSGFzaCIsInVybENoYW5nZUluaXQiLCJvblVybENoYW5nZSIsIiQkYXBwbGljYXRpb25EZXN0cm95ZWQiLCJvZmYiLCIkJGNoZWNrVXJsQ2hhbmdlIiwiYmFzZUhyZWYiLCJkZWZlciIsImRlbGF5IiwidGltZW91dElkIiwiY2FuY2VsIiwiZGVmZXJJZCIsImNhY2hlRmFjdG9yeSIsImNhY2hlSWQiLCJyZWZyZXNoIiwiZW50cnkiLCJmcmVzaEVuZCIsInN0YWxlRW5kIiwibiIsInAiLCJuZXh0RW50cnkiLCJwcmV2RW50cnkiLCJjYWNoZXMiLCJzaXplIiwic3RhdHMiLCJpZCIsImNhcGFjaXR5IiwiTnVtYmVyIiwiTUFYX1ZBTFVFIiwibHJ1SGFzaCIsImxydUVudHJ5IiwicmVtb3ZlIiwicmVtb3ZlQWxsIiwiZGVzdHJveSIsImluZm8iLCJVTklOSVRJQUxJWkVEX1ZBTFVFIiwiJCRzYW5pdGl6ZVVyaVByb3ZpZGVyIiwicGFyc2VJc29sYXRlQmluZGluZ3MiLCJkaXJlY3RpdmVOYW1lIiwiaXNDb250cm9sbGVyIiwiTE9DQUxfUkVHRVhQIiwiYmluZGluZ3MiLCJkZWZpbml0aW9uIiwic2NvcGVOYW1lIiwiYmluZGluZ0NhY2hlIiwiJGNvbXBpbGVNaW5FcnIiLCJtb2RlIiwiY29sbGVjdGlvbiIsIm9wdGlvbmFsIiwiYXR0ck5hbWUiLCJwYXJzZURpcmVjdGl2ZUJpbmRpbmdzIiwiYmluZFRvQ29udHJvbGxlciIsImFzc2VydFZhbGlkRGlyZWN0aXZlTmFtZSIsImdldERpcmVjdGl2ZVJlcXVpcmUiLCJyZXF1aXJlIiwiUkVRVUlSRV9QUkVGSVhfUkVHRVhQIiwiZ2V0RGlyZWN0aXZlUmVzdHJpY3QiLCJyZXN0cmljdCIsImhhc0RpcmVjdGl2ZXMiLCJTdWZmaXgiLCJDT01NRU5UX0RJUkVDVElWRV9SRUdFWFAiLCJDTEFTU19ESVJFQ1RJVkVfUkVHRVhQIiwiQUxMX09SX05PVEhJTkdfQVRUUlMiLCJFVkVOVF9IQU5ETEVSX0FUVFJfUkVHRVhQIiwicmVnaXN0ZXJEaXJlY3RpdmUiLCJkaXJlY3RpdmVGYWN0b3J5IiwiZGlyZWN0aXZlcyIsInByaW9yaXR5IiwibWFrZUluamVjdGFibGUiLCJ0RWxlbWVudCIsInRBdHRycyIsIiRlbGVtZW50IiwiJGF0dHJzIiwidGVtcGxhdGVVcmwiLCJkZG8iLCJjb250cm9sbGVyQXMiLCJpZGVudGlmaWVyRm9yQ29udHJvbGxlciIsInRyYW5zY2x1ZGUiLCJhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCIsInJlZ2V4cCIsImltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCIsImVuYWJsZWQiLCJwcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWQiLCJUVEwiLCJvbkNoYW5nZXNUdGwiLCJjb21tZW50RGlyZWN0aXZlc0VuYWJsZWRDb25maWciLCJjb21tZW50RGlyZWN0aXZlc0VuYWJsZWQiLCJjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkQ29uZmlnIiwiY3NzQ2xhc3NEaXJlY3RpdmVzRW5hYmxlZCIsImZsdXNoT25DaGFuZ2VzUXVldWUiLCJvbkNoYW5nZXNRdWV1ZSIsImVycm9ycyIsIkF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzVG9Db3B5IiwiJGF0dHIiLCIkJGVsZW1lbnQiLCJzZXRTcGVjaWFsQXR0ciIsInNwZWNpYWxBdHRySG9sZGVyIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZSIsInJlbW92ZU5hbWVkSXRlbSIsInNldE5hbWVkSXRlbSIsInNhZmVBZGRDbGFzcyIsImNsYXNzTmFtZSIsIiRjb21waWxlTm9kZXMiLCJ0cmFuc2NsdWRlRm4iLCJtYXhQcmlvcml0eSIsImlnbm9yZURpcmVjdGl2ZSIsInByZXZpb3VzQ29tcGlsZUNvbnRleHQiLCJjb21wb3NpdGVMaW5rRm4iLCJjb21waWxlTm9kZXMiLCIkJGFkZFNjb3BlQ2xhc3MiLCJuYW1lc3BhY2UiLCJjbG9uZUNvbm5lY3RGbiIsIm5lZWRzTmV3U2NvcGUiLCIkcGFyZW50IiwiJG5ldyIsInBhcmVudEJvdW5kVHJhbnNjbHVkZUZuIiwidHJhbnNjbHVkZUNvbnRyb2xsZXJzIiwiZnV0dXJlUGFyZW50RWxlbWVudCIsIiQkYm91bmRUcmFuc2NsdWRlIiwiZGV0ZWN0TmFtZXNwYWNlRm9yQ2hpbGRFbGVtZW50cyIsIiRsaW5rTm9kZSIsIndyYXBUZW1wbGF0ZSIsImNvbnRyb2xsZXJOYW1lIiwiaW5zdGFuY2UiLCIkJGFkZFNjb3BlSW5mbyIsInBhcmVudEVsZW1lbnQiLCJub2RlTGlzdCIsIiRyb290RWxlbWVudCIsIm5vZGVMaW5rRm4iLCJjaGlsZExpbmtGbiIsImNoaWxkU2NvcGUiLCJpZHgiLCJjaGlsZEJvdW5kVHJhbnNjbHVkZUZuIiwic3RhYmxlTm9kZUxpc3QiLCJub2RlTGlua0ZuRm91bmQiLCJub2RlTGlzdExlbmd0aCIsImxpbmtGbnMiLCJ0cmFuc2NsdWRlT25UaGlzRWxlbWVudCIsImNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuIiwidGVtcGxhdGVPblRoaXNFbGVtZW50IiwiYXR0cnMiLCJsaW5rRm5Gb3VuZCIsIm5vdExpdmVMaXN0IiwibWVyZ2VDb25zZWN1dGl2ZVRleHROb2RlcyIsImNvbGxlY3REaXJlY3RpdmVzIiwiYXBwbHlEaXJlY3RpdmVzVG9Ob2RlIiwidGVybWluYWwiLCJzaWJsaW5nIiwibm9kZVZhbHVlIiwicHJldmlvdXNCb3VuZFRyYW5zY2x1ZGVGbiIsImJvdW5kVHJhbnNjbHVkZUZuIiwidHJhbnNjbHVkZWRTY29wZSIsImNsb25lRm4iLCJjb250cm9sbGVycyIsImNvbnRhaW5pbmdTY29wZSIsIiQkdHJhbnNjbHVkZWQiLCJib3VuZFNsb3RzIiwiJCRzbG90cyIsInNsb3ROYW1lIiwiYXR0cnNNYXAiLCJhZGREaXJlY3RpdmUiLCJkaXJlY3RpdmVOb3JtYWxpemUiLCJuTmFtZSIsIm5nQXR0ck5hbWUiLCJpc05nQXR0ciIsIm5BdHRycyIsImF0dHJTdGFydE5hbWUiLCJhdHRyRW5kTmFtZSIsIk5HX0FUVFJfQklORElORyIsIlBSRUZJWF9SRUdFWFAiLCJtdWx0aUVsZW1lbnRNYXRjaCIsIk1VTFRJX0VMRU1FTlRfRElSX1JFIiwiZGlyZWN0aXZlSXNNdWx0aUVsZW1lbnQiLCJhZGRBdHRySW50ZXJwb2xhdGVEaXJlY3RpdmUiLCJhbmltVmFsIiwiYWRkVGV4dEludGVycG9sYXRlRGlyZWN0aXZlIiwiTk9ERV9UWVBFX0NPTU1FTlQiLCJjb2xsZWN0Q29tbWVudERpcmVjdGl2ZXMiLCJieVByaW9yaXR5IiwiZ3JvdXBTY2FuIiwiYXR0clN0YXJ0IiwiYXR0ckVuZCIsImRlcHRoIiwiZ3JvdXBFbGVtZW50c0xpbmtGbldyYXBwZXIiLCJsaW5rRm4iLCJjb21waWxhdGlvbkdlbmVyYXRvciIsImVhZ2VyIiwiY29tcGlsZWQiLCJjb21waWxlTm9kZSIsInRlbXBsYXRlQXR0cnMiLCJqcUNvbGxlY3Rpb24iLCJvcmlnaW5hbFJlcGxhY2VEaXJlY3RpdmUiLCJwcmVMaW5rRm5zIiwicG9zdExpbmtGbnMiLCJhZGRMaW5rRm5zIiwicHJlIiwicG9zdCIsIm5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSIsIiQkaXNvbGF0ZVNjb3BlIiwiY2xvbmVBbmRBbm5vdGF0ZUZuIiwibGlua05vZGUiLCJjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZSIsImNsb25lQXR0YWNoRm4iLCJoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSIsImVsZW1lbnRDb250cm9sbGVycyIsInNjb3BlVG9DaGlsZCIsInNsb3RUcmFuc2NsdWRlRm4iLCJjb250cm9sbGVyU2NvcGUiLCJzY29wZUJpbmRpbmdJbmZvIiwibmV3U2NvcGVEaXJlY3RpdmUiLCJpc1Nsb3RGaWxsZWQiLCJjb250cm9sbGVyRGlyZWN0aXZlcyIsInNldHVwQ29udHJvbGxlcnMiLCJ0ZW1wbGF0ZURpcmVjdGl2ZSIsIiQkb3JpZ2luYWxEaXJlY3RpdmUiLCIkJGlzb2xhdGVCaW5kaW5ncyIsImluaXRpYWxpemVEaXJlY3RpdmVCaW5kaW5ncyIsInJlbW92ZVdhdGNoZXMiLCIkb24iLCJjb250cm9sbGVyRGlyZWN0aXZlIiwiJCRiaW5kaW5ncyIsImJpbmRpbmdJbmZvIiwiY29udHJvbGxlclJlc3VsdCIsImdldENvbnRyb2xsZXJzIiwiY29udHJvbGxlckluc3RhbmNlIiwiJG9uQ2hhbmdlcyIsImluaXRpYWxDaGFuZ2VzIiwiJG9uSW5pdCIsIiRkb0NoZWNrIiwiJG9uRGVzdHJveSIsImludm9rZUxpbmtGbiIsIiRwb3N0TGluayIsIiR0ZW1wbGF0ZSIsImRpcmVjdGl2ZVZhbHVlIiwidGVybWluYWxQcmlvcml0eSIsIm5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUiLCJoYXNUcmFuc2NsdWRlRGlyZWN0aXZlIiwiaGFzVGVtcGxhdGUiLCIkY29tcGlsZU5vZGUiLCJyZXBsYWNlRGlyZWN0aXZlIiwiY2hpbGRUcmFuc2NsdWRlRm4iLCJkaWRTY2FuRm9yTXVsdGlwbGVUcmFuc2NsdXNpb24iLCJtaWdodEhhdmVNdWx0aXBsZVRyYW5zY2x1c2lvbkVycm9yIiwiJCRzdGFydCIsIiQkZW5kIiwiYXNzZXJ0Tm9EdXBsaWNhdGUiLCIkJHRsYiIsImNhbmRpZGF0ZURpcmVjdGl2ZSIsInNjYW5uaW5nSW5kZXgiLCIkJGNyZWF0ZUNvbW1lbnQiLCJyZXBsYWNlV2l0aCIsIiQkcGFyZW50Tm9kZSIsInNsb3RzIiwic2xvdE1hcCIsImZpbGxlZFNsb3RzIiwiZWxlbWVudFNlbGVjdG9yIiwiY29udGVudHMiLCJmaWxsZWQiLCIkJG5ld1Njb3BlIiwiZGVub3JtYWxpemVUZW1wbGF0ZSIsInJlbW92ZUNvbW1lbnRzIiwidGVtcGxhdGVOYW1lc3BhY2UiLCJuZXdUZW1wbGF0ZUF0dHJzIiwidGVtcGxhdGVEaXJlY3RpdmVzIiwidW5wcm9jZXNzZWREaXJlY3RpdmVzIiwibWFya0RpcmVjdGl2ZVNjb3BlIiwibWVyZ2VUZW1wbGF0ZUF0dHJpYnV0ZXMiLCJjb21waWxlVGVtcGxhdGVVcmwiLCJNYXRoIiwibWF4IiwiaW5oZXJpdFR5cGUiLCJkYXRhTmFtZSIsInByb3BlcnR5IiwiY29udHJvbGxlcktleSIsIiRzY29wZSIsIiR0cmFuc2NsdWRlIiwibmV3U2NvcGUiLCJ0RGlyZWN0aXZlcyIsInN0YXJ0QXR0ck5hbWUiLCJlbmRBdHRyTmFtZSIsIm11bHRpRWxlbWVudCIsInNyY0F0dHIiLCJkc3RBdHRyIiwiJHNldCIsImFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuIiwiYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuIiwibGlua1F1ZXVlIiwiYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZSIsIm9yaWdBc3luY0RpcmVjdGl2ZSIsImRlcml2ZWRTeW5jRGlyZWN0aXZlIiwiY29udGVudCIsInRlbXBUZW1wbGF0ZUF0dHJzIiwiYmVmb3JlVGVtcGxhdGVMaW5rTm9kZSIsImxpbmtSb290RWxlbWVudCIsIiQkZGVzdHJveWVkIiwib2xkQ2xhc3NlcyIsImNhdGNoIiwiaWdub3JlQ2hpbGRMaW5rRm4iLCJkaWZmIiwid2hhdCIsInByZXZpb3VzRGlyZWN0aXZlIiwid3JhcE1vZHVsZU5hbWVJZkRlZmluZWQiLCJtb2R1bGVOYW1lIiwidGV4dCIsImludGVycG9sYXRlRm4iLCJ0ZW1wbGF0ZU5vZGUiLCJ0ZW1wbGF0ZU5vZGVQYXJlbnQiLCJoYXNDb21waWxlUGFyZW50IiwiJCRhZGRCaW5kaW5nQ2xhc3MiLCIkJGFkZEJpbmRpbmdJbmZvIiwiZXhwcmVzc2lvbnMiLCJnZXRUcnVzdGVkQ29udGV4dCIsImF0dHJOb3JtYWxpemVkTmFtZSIsIkhUTUwiLCJSRVNPVVJDRV9VUkwiLCJ0cnVzdGVkQ29udGV4dCIsIm11c3RIYXZlRXhwcmVzc2lvbiIsImFsbE9yTm90aGluZyIsIiQkb2JzZXJ2ZXJzIiwibmV3VmFsdWUiLCIkJGludGVyIiwiJCRzY29wZSIsIm9sZFZhbHVlIiwiJHVwZGF0ZUNsYXNzIiwiZWxlbWVudHNUb1JlbW92ZSIsIm5ld05vZGUiLCJmaXJzdEVsZW1lbnRUb1JlbW92ZSIsInJlbW92ZUNvdW50IiwiajIiLCJoYXNEYXRhIiwiYW5ub3RhdGlvbiIsInJlY29yZENoYW5nZXMiLCJjdXJyZW50VmFsdWUiLCJwcmV2aW91c1ZhbHVlIiwiJCRwb3N0RGlnZXN0IiwiY2hhbmdlcyIsInRyaWdnZXJPbkNoYW5nZXNIb29rIiwiU2ltcGxlQ2hhbmdlIiwicmVtb3ZlV2F0Y2hDb2xsZWN0aW9uIiwibGFzdFZhbHVlIiwicGFyZW50R2V0IiwicGFyZW50U2V0IiwiY29tcGFyZSIsInJlbW92ZVdhdGNoIiwiJG9ic2VydmUiLCJfVU5JTklUSUFMSVpFRF9WQUxVRSIsImxpdGVyYWwiLCJhc3NpZ24iLCJwYXJlbnRWYWx1ZVdhdGNoIiwicGFyZW50VmFsdWUiLCIkc3RhdGVmdWwiLCIkd2F0Y2hDb2xsZWN0aW9uIiwiZGVlcFdhdGNoIiwiaW5pdGlhbFZhbHVlIiwiU0lNUExFX0FUVFJfTkFNRSIsIiRub3JtYWxpemUiLCIkYWRkQ2xhc3MiLCJjbGFzc1ZhbCIsIiRyZW1vdmVDbGFzcyIsIm5ld0NsYXNzZXMiLCJ0b0FkZCIsInRva2VuRGlmZmVyZW5jZSIsInRvUmVtb3ZlIiwid3JpdGVBdHRyIiwiYm9vbGVhbktleSIsImFsaWFzZWRLZXkiLCJvYnNlcnZlciIsInRyaW1tZWRTcmNzZXQiLCJzcmNQYXR0ZXJuIiwicmF3VXJpcyIsIm5iclVyaXNXaXRoMnBhcnRzIiwiZmxvb3IiLCJpbm5lcklkeCIsImxhc3RUdXBsZSIsInJlbW92ZUF0dHIiLCJsaXN0ZW5lcnMiLCJzdGFydFN5bWJvbCIsImVuZFN5bWJvbCIsImJpbmRpbmciLCJpc29sYXRlZCIsIm5vVGVtcGxhdGUiLCJjb21tZW50IiwiY3JlYXRlQ29tbWVudCIsInByZXZpb3VzIiwiY3VycmVudCIsIlNQRUNJQUxfQ0hBUlNfUkVHRVhQIiwic3RyMSIsInN0cjIiLCJ2YWx1ZXMiLCJ0b2tlbnMxIiwidG9rZW5zMiIsIm91dGVyIiwidG9rZW4iLCJqcU5vZGVzIiwiaWRlbnQiLCJDTlRSTF9SRUciLCJnbG9iYWxzIiwicmVnaXN0ZXIiLCJhbGxvd0dsb2JhbHMiLCJhZGRJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsImV4cHJlc3Npb24iLCJsYXRlciIsIiRjb250cm9sbGVyTWluRXJyIiwiY29udHJvbGxlclByb3RvdHlwZSIsImNoYW5nZUxpc3RlbmVyIiwiaGlkZGVuIiwiZG9jIiwiZXhjZXB0aW9uIiwiY2F1c2UiLCJzZXJpYWxpemVWYWx1ZSIsInYiLCJ0b0lTT1N0cmluZyIsInBhcmFtcyIsInNlcmlhbGl6ZSIsInRvU2VyaWFsaXplIiwidG9wTGV2ZWwiLCJkZWZhdWx0SHR0cFJlc3BvbnNlVHJhbnNmb3JtIiwiaGVhZGVycyIsInRlbXBEYXRhIiwiSlNPTl9QUk9URUNUSU9OX1BSRUZJWCIsImNvbnRlbnRUeXBlIiwiQVBQTElDQVRJT05fSlNPTiIsImlzSnNvbkxpa2UiLCJqc29uU3RhcnQiLCJKU09OX1NUQVJUIiwiSlNPTl9FTkRTIiwicGFyc2VIZWFkZXJzIiwiZmlsbEluUGFyc2VkIiwibGluZSIsImhlYWRlclZhbCIsImhlYWRlcktleSIsImhlYWRlcnNHZXR0ZXIiLCJoZWFkZXJzT2JqIiwidHJhbnNmb3JtRGF0YSIsInN0YXR1cyIsImZucyIsImlzU3VjY2VzcyIsImRlZmF1bHRzIiwidHJhbnNmb3JtUmVzcG9uc2UiLCJ0cmFuc2Zvcm1SZXF1ZXN0IiwiZCIsImNvbW1vbiIsIkFjY2VwdCIsIkNPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OIiwicGF0Y2giLCJ4c3JmQ29va2llTmFtZSIsInhzcmZIZWFkZXJOYW1lIiwicGFyYW1TZXJpYWxpemVyIiwianNvbnBDYWxsYmFja1BhcmFtIiwidXNlQXBwbHlBc3luYyIsImludGVyY2VwdG9yRmFjdG9yaWVzIiwiaW50ZXJjZXB0b3JzIiwicmVxdWVzdENvbmZpZyIsImNoYWluSW50ZXJjZXB0b3JzIiwicHJvbWlzZSIsInRoZW5GbiIsInJlamVjdEZuIiwiZXhlY3V0ZUhlYWRlckZucyIsImhlYWRlckNvbnRlbnQiLCJwcm9jZXNzZWRIZWFkZXJzIiwiaGVhZGVyRm4iLCJoZWFkZXIiLCJtZXJnZUhlYWRlcnMiLCJkZWZIZWFkZXJOYW1lIiwibG93ZXJjYXNlRGVmSGVhZGVyTmFtZSIsInJlcUhlYWRlck5hbWUiLCJkZWZIZWFkZXJzIiwicmVxSGVhZGVycyIsImRlZmF1bHRIZWFkZXJzSXRlcmF0aW9uIiwic2VydmVyUmVxdWVzdCIsInJlcURhdGEiLCJ3aXRoQ3JlZGVudGlhbHMiLCJzZW5kUmVxIiwicmVzcG9uc2UiLCJyZXNwIiwicmVqZWN0IiwicmVxdWVzdEludGVyY2VwdG9ycyIsInJlc3BvbnNlSW50ZXJjZXB0b3JzIiwicmVzb2x2ZSIsInJldmVyc2VkSW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3IiLCJyZXF1ZXN0IiwicmVxdWVzdEVycm9yIiwicmVzcG9uc2VFcnJvciIsImZpbmFsbHkiLCJjcmVhdGVTaG9ydE1ldGhvZHMiLCJjcmVhdGVTaG9ydE1ldGhvZHNXaXRoRGF0YSIsImNyZWF0ZUFwcGx5SGFuZGxlcnMiLCJldmVudEhhbmRsZXJzIiwiYXBwbHlIYW5kbGVycyIsImNhbGxFdmVudEhhbmRsZXIiLCIkYXBwbHlBc3luYyIsIiQkcGhhc2UiLCJkb25lIiwiaGVhZGVyc1N0cmluZyIsInN0YXR1c1RleHQiLCJyZXNvbHZlSHR0cFByb21pc2UiLCJyZXNvbHZlUHJvbWlzZSIsImRlZmVycmVkIiwicmVzb2x2ZVByb21pc2VXaXRoUmVzdWx0IiwicmVtb3ZlUGVuZGluZ1JlcSIsInBlbmRpbmdSZXF1ZXN0cyIsImNhY2hlZFJlc3AiLCJpc0pzb25wIiwiZ2V0VHJ1c3RlZFJlc291cmNlVXJsIiwiYnVpbGRVcmwiLCJzYW5pdGl6ZUpzb25wQ2FsbGJhY2tQYXJhbSIsImRlZmF1bHRDYWNoZSIsInhzcmZWYWx1ZSIsInVybElzU2FtZU9yaWdpbiIsInRpbWVvdXQiLCJyZXNwb25zZVR5cGUiLCJ1cGxvYWRFdmVudEhhbmRsZXJzIiwic2VyaWFsaXplZFBhcmFtcyIsIiRodHRwTWluRXJyIiwiY2FsbGJhY2tQYXJhbVJlZ2V4IiwiaW50ZXJjZXB0b3JGYWN0b3J5IiwiWE1MSHR0cFJlcXVlc3QiLCJjcmVhdGVIdHRwQmFja2VuZCIsImNyZWF0ZVhociIsIiRicm93c2VyRGVmZXIiLCJyYXdEb2N1bWVudCIsImpzb25wUmVxIiwiY2FsbGJhY2tQYXRoIiwiYXN5bmMiLCJib2R5Iiwid2FzQ2FsbGVkIiwidGltZW91dFJlcXVlc3QiLCJqc29ucERvbmUiLCJ4aHIiLCJhYm9ydCIsImNvbXBsZXRlUmVxdWVzdCIsImNyZWF0ZUNhbGxiYWNrIiwiZ2V0UmVzcG9uc2UiLCJyZW1vdmVDYWxsYmFjayIsIm9wZW4iLCJzZXRSZXF1ZXN0SGVhZGVyIiwib25sb2FkIiwicmVzcG9uc2VUZXh0IiwidXJsUmVzb2x2ZSIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsIm9uZXJyb3IiLCJvbmFib3J0Iiwib250aW1lb3V0IiwidXBsb2FkIiwic2VuZCIsImVzY2FwZSIsImNoIiwidW5lc2NhcGVUZXh0IiwiZXNjYXBlZFN0YXJ0UmVnZXhwIiwiZXNjYXBlZEVuZFJlZ2V4cCIsImNvbnN0YW50V2F0Y2hEZWxlZ2F0ZSIsIm9iamVjdEVxdWFsaXR5IiwiY29uc3RhbnRJbnRlcnAiLCJ1bndhdGNoIiwicGFyc2VTdHJpbmdpZnlJbnRlcmNlcHRvciIsImdldFZhbHVlIiwiJGludGVycG9sYXRlTWluRXJyIiwiaW50ZXJyIiwidW5lc2NhcGVkVGV4dCIsImV4cCIsIiQkd2F0Y2hEZWxlZ2F0ZSIsImVuZEluZGV4IiwicGFyc2VGbnMiLCJ0ZXh0TGVuZ3RoIiwiZXhwcmVzc2lvblBvc2l0aW9ucyIsInN0YXJ0U3ltYm9sTGVuZ3RoIiwiZW5kU3ltYm9sTGVuZ3RoIiwidGhyb3dOb2NvbmNhdCIsImNvbXB1dGUiLCJnZXRUcnVzdGVkIiwiJHdhdGNoR3JvdXAiLCJvbGRWYWx1ZXMiLCJjdXJyVmFsdWUiLCJpbnRlcnZhbCIsImNvdW50IiwiaW52b2tlQXBwbHkiLCJoYXNQYXJhbXMiLCJpdGVyYXRpb24iLCJzZXRJbnRlcnZhbCIsImNsZWFySW50ZXJ2YWwiLCJza2lwQXBwbHkiLCIkJGludGVydmFsSWQiLCJub3RpZnkiLCJpbnRlcnZhbHMiLCJlbmNvZGVQYXRoIiwic2VnbWVudHMiLCJwYXJzZUFic29sdXRlVXJsIiwiYWJzb2x1dGVVcmwiLCJsb2NhdGlvbk9iaiIsInBhcnNlZFVybCIsIiQkcHJvdG9jb2wiLCIkJGhvc3QiLCJob3N0bmFtZSIsIiQkcG9ydCIsInBvcnQiLCJERUZBVUxUX1BPUlRTIiwicGFyc2VBcHBVcmwiLCJET1VCTEVfU0xBU0hfUkVHRVgiLCIkbG9jYXRpb25NaW5FcnIiLCJwcmVmaXhlZCIsIiQkcGF0aCIsInBhdGhuYW1lIiwiJCRzZWFyY2giLCJzZWFyY2giLCIkJGhhc2giLCJzdGFydHNXaXRoIiwic3RyaXBCYXNlVXJsIiwiYmFzZSIsInRyaW1FbXB0eUhhc2giLCJzdHJpcEZpbGUiLCJsYXN0SW5kZXhPZiIsInNlcnZlckJhc2UiLCJMb2NhdGlvbkh0bWw1VXJsIiwiYXBwQmFzZSIsImFwcEJhc2VOb0ZpbGUiLCJiYXNlUHJlZml4IiwiJCRodG1sNSIsIiQkcGFyc2UiLCJwYXRoVXJsIiwiJCRjb21wb3NlIiwiJCR1cmwiLCIkJGFic1VybCIsIiQkcGFyc2VMaW5rVXJsIiwicmVsSHJlZiIsImFwcFVybCIsInByZXZBcHBVcmwiLCJyZXdyaXR0ZW5VcmwiLCJMb2NhdGlvbkhhc2hiYW5nVXJsIiwiaGFzaFByZWZpeCIsInJlbW92ZVdpbmRvd3NEcml2ZU5hbWUiLCJmaXJzdFBhdGhTZWdtZW50TWF0Y2giLCJ3aW5kb3dzRmlsZVBhdGhFeHAiLCJ3aXRob3V0SGFzaFVybCIsIndpdGhvdXRCYXNlVXJsIiwiTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwiLCJsb2NhdGlvbkdldHRlciIsImxvY2F0aW9uR2V0dGVyU2V0dGVyIiwicHJlcHJvY2VzcyIsImh0bWw1TW9kZSIsInJlcXVpcmVCYXNlIiwicmV3cml0ZUxpbmtzIiwic2V0QnJvd3NlclVybFdpdGhGYWxsYmFjayIsIm9sZFVybCIsIm9sZFN0YXRlIiwiJCRzdGF0ZSIsImFmdGVyTG9jYXRpb25DaGFuZ2UiLCIkYnJvYWRjYXN0IiwiYWJzVXJsIiwiTG9jYXRpb25Nb2RlIiwiaW5pdGlhbFVybCIsIklHTk9SRV9VUklfUkVHRVhQIiwiY3RybEtleSIsIm1ldGFLZXkiLCJzaGlmdEtleSIsIndoaWNoIiwiYnV0dG9uIiwiYWJzSHJlZiIsInByZXZlbnREZWZhdWx0IiwiaW5pdGlhbGl6aW5nIiwibmV3VXJsIiwibmV3U3RhdGUiLCIkZGlnZXN0IiwiY3VycmVudFJlcGxhY2UiLCIkJHJlcGxhY2UiLCJ1cmxPclN0YXRlQ2hhbmdlZCIsImRlYnVnIiwiZGVidWdFbmFibGVkIiwiZmxhZyIsImZvcm1hdEVycm9yIiwic291cmNlVVJMIiwiY29uc29sZUxvZyIsImxvZ0ZuIiwibG9nIiwiaGFzQXBwbHkiLCJhcmcxIiwiYXJnMiIsIndhcm4iLCJnZXRTdHJpbmdWYWx1ZSIsImlmRGVmaW5lZCIsInBsdXNGbiIsInIiLCJpc1N0YXRlbGVzcyIsImZpbHRlck5hbWUiLCJmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zIiwiYXN0IiwiYWxsQ29uc3RhbnRzIiwiYXJnc1RvV2F0Y2giLCJpc1N0YXRlbGVzc0ZpbHRlciIsIkFTVCIsIlByb2dyYW0iLCJleHByIiwiTGl0ZXJhbCIsInRvV2F0Y2giLCJVbmFyeUV4cHJlc3Npb24iLCJhcmd1bWVudCIsIkJpbmFyeUV4cHJlc3Npb24iLCJsZWZ0IiwicmlnaHQiLCJMb2dpY2FsRXhwcmVzc2lvbiIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsImFsdGVybmF0ZSIsImNvbnNlcXVlbnQiLCJJZGVudGlmaWVyIiwiTWVtYmVyRXhwcmVzc2lvbiIsIm9iamVjdCIsImNvbXB1dGVkIiwiQ2FsbEV4cHJlc3Npb24iLCJjYWxsZWUiLCJBc3NpZ25tZW50RXhwcmVzc2lvbiIsIkFycmF5RXhwcmVzc2lvbiIsIk9iamVjdEV4cHJlc3Npb24iLCJwcm9wZXJ0aWVzIiwiVGhpc0V4cHJlc3Npb24iLCJMb2NhbHNFeHByZXNzaW9uIiwiZ2V0SW5wdXRzIiwibGFzdEV4cHJlc3Npb24iLCJpc0Fzc2lnbmFibGUiLCJhc3NpZ25hYmxlQVNUIiwiTkdWYWx1ZVBhcmFtZXRlciIsIm9wZXJhdG9yIiwiaXNMaXRlcmFsIiwiaXNDb25zdGFudCIsIkFTVENvbXBpbGVyIiwiYXN0QnVpbGRlciIsIkFTVEludGVycHJldGVyIiwiZ2V0VmFsdWVPZiIsIm9iamVjdFZhbHVlT2YiLCJpZGVudFN0YXJ0IiwiaWRlbnRDb250aW51ZSIsImxpdGVyYWxzIiwidHJ1ZSIsImZhbHNlIiwibnVsbCIsImFkZExpdGVyYWwiLCJsaXRlcmFsTmFtZSIsImxpdGVyYWxWYWx1ZSIsInNldElkZW50aWZpZXJGbnMiLCJpZGVudGlmaWVyU3RhcnQiLCJpZGVudGlmaWVyQ29udGludWUiLCJpbnRlcmNlcHRvckZuIiwicGFyc2VkRXhwcmVzc2lvbiIsIm9uZVRpbWUiLCJjYWNoZUtleSIsImxleGVyIiwiTGV4ZXIiLCIkcGFyc2VPcHRpb25zIiwicGFyc2VyIiwiUGFyc2VyIiwib25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlIiwib25lVGltZVdhdGNoRGVsZWdhdGUiLCJpbnB1dHMiLCJpbnB1dHNXYXRjaERlbGVnYXRlIiwiYWRkSW50ZXJjZXB0b3IiLCJleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrIiwib2xkVmFsdWVPZlZhbHVlIiwicHJldHR5UHJpbnRFeHByZXNzaW9uIiwibGFzdFJlc3VsdCIsImlucHV0RXhwcmVzc2lvbnMiLCJvbGRJbnB1dFZhbHVlT2YiLCJuZXdJbnB1dFZhbHVlIiwib2xkSW5wdXRWYWx1ZU9mVmFsdWVzIiwib2xkSW5wdXRWYWx1ZXMiLCJjaGFuZ2VkIiwib25lVGltZVdhdGNoIiwib25lVGltZUxpc3RlbmVyIiwib2xkIiwiaXNBbGxEZWZpbmVkIiwiYWxsRGVmaW5lZCIsIndhdGNoRGVsZWdhdGUiLCJ1c2VJbnB1dHMiLCJyZWd1bGFyV2F0Y2giLCJub1Vuc2FmZUV2YWwiLCJpc0lkZW50aWZpZXJTdGFydCIsImlzSWRlbnRpZmllckNvbnRpbnVlIiwiZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMiLCJxRmFjdG9yeSIsIm5leHRUaWNrIiwiZXhjZXB0aW9uSGFuZGxlciIsIkRlZmVycmVkIiwiUHJvbWlzZSIsInJlamVjdFByb21pc2UiLCJwcm9ncmVzcyIsIm5vdGlmeVByb21pc2UiLCJwcm9jZXNzUXVldWUiLCJwZW5kaW5nIiwicHJvY2Vzc1NjaGVkdWxlZCIsInB1ciIsInF1ZXVlU2l6ZSIsInByb2Nlc3NDaGVja3MiLCJjaGVja1F1ZXVlIiwidG9DaGVjayIsImVycm9yTWVzc2FnZSIsInNjaGVkdWxlUHJvY2Vzc1F1ZXVlIiwiJCRyZWplY3QiLCIkcU1pbkVyciIsIiQkcmVzb2x2ZSIsImRvUmVzb2x2ZSIsImRvUmVqZWN0IiwiZG9Ob3RpZnkiLCJoYW5kbGVDYWxsYmFjayIsInJlc29sdmVyIiwiY2FsbGJhY2tPdXRwdXQiLCJ3aGVuIiwiZXJyYmFjayIsInByb2dyZXNzQmFjayIsInByb21pc2VzIiwiY291bnRlciIsInJlc3VsdHMiLCJyYWNlIiwiJFEiLCJyZXNvbHZlRm4iLCJUeXBlRXJyb3IiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsIndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIiwid2Via2l0Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicmFmU3VwcG9ydGVkIiwicmFmIiwidGltZXIiLCJzdXBwb3J0ZWQiLCJjcmVhdGVDaGlsZFNjb3BlQ2xhc3MiLCJDaGlsZFNjb3BlIiwiJCR3YXRjaGVycyIsIiQkbmV4dFNpYmxpbmciLCIkJGNoaWxkSGVhZCIsIiQkY2hpbGRUYWlsIiwiJCRsaXN0ZW5lcnMiLCIkJGxpc3RlbmVyQ291bnQiLCIkJHdhdGNoZXJzQ291bnQiLCIkaWQiLCIkJENoaWxkU2NvcGUiLCIkcm9vdFNjb3BlTWluRXJyIiwibGFzdERpcnR5V2F0Y2giLCJhcHBseUFzeW5jSWQiLCJkaWdlc3RUdGwiLCJkZXN0cm95Q2hpbGRTY29wZSIsIiRldmVudCIsImN1cnJlbnRTY29wZSIsImNsZWFuVXBTY29wZSIsIiQkcHJldlNpYmxpbmciLCIkcm9vdCIsIlNjb3BlIiwiYmVnaW5QaGFzZSIsInBoYXNlIiwiY2xlYXJQaGFzZSIsImluY3JlbWVudFdhdGNoZXJzQ291bnQiLCJkZWNyZW1lbnRMaXN0ZW5lckNvdW50IiwiaW5pdFdhdGNoVmFsIiwiZmx1c2hBcHBseUFzeW5jIiwiYXBwbHlBc3luY1F1ZXVlIiwic2NoZWR1bGVBcHBseUFzeW5jIiwiaXNvbGF0ZSIsImNoaWxkIiwid2F0Y2hFeHAiLCJ3YXRjaGVyIiwiZXEiLCIkJGRpZ2VzdFdhdGNoSW5kZXgiLCJ3YXRjaEV4cHJlc3Npb25zIiwid2F0Y2hHcm91cEFjdGlvbiIsImNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkIiwiZmlyc3RSdW4iLCJuZXdWYWx1ZXMiLCJkZXJlZ2lzdGVyRm5zIiwic2hvdWxkQ2FsbCIsInVud2F0Y2hGbiIsIiR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvciIsIl92YWx1ZSIsIm5ld0xlbmd0aCIsImJvdGhOYU4iLCJuZXdJdGVtIiwib2xkSXRlbSIsImludGVybmFsQXJyYXkiLCJvbGRMZW5ndGgiLCJjaGFuZ2VEZXRlY3RlZCIsImludGVybmFsT2JqZWN0IiwiJHdhdGNoQ29sbGVjdGlvbkFjdGlvbiIsImluaXRSdW4iLCJ2ZXJ5T2xkVmFsdWUiLCJ0cmFja1ZlcnlPbGRWYWx1ZSIsImNoYW5nZURldGVjdG9yIiwid2F0Y2giLCJ3YXRjaGVycyIsImRpcnR5IiwibmV4dCIsImxvZ0lkeCIsImFzeW5jVGFzayIsInR0bCIsIndhdGNoTG9nIiwiYXN5bmNRdWV1ZVBvc2l0aW9uIiwiYXN5bmNRdWV1ZSIsIiRldmFsIiwidHJhdmVyc2VTY29wZXNMb29wIiwibXNnIiwicG9zdERpZ2VzdFF1ZXVlUG9zaXRpb24iLCJwb3N0RGlnZXN0UXVldWUiLCJldmVudE5hbWUiLCIkYXBwbHlBc3luY0V4cHJlc3Npb24iLCJuYW1lZExpc3RlbmVycyIsImluZGV4T2ZMaXN0ZW5lciIsIiRlbWl0IiwidGFyZ2V0U2NvcGUiLCJsaXN0ZW5lckFyZ3MiLCIkJGFzeW5jUXVldWUiLCIkJHBvc3REaWdlc3RRdWV1ZSIsIiQkYXBwbHlBc3luY1F1ZXVlIiwidXJpIiwiaXNJbWFnZSIsIm5vcm1hbGl6ZWRWYWwiLCJyZWdleCIsInNuYWtlVG9DYW1lbCIsIlVOREVSU0NPUkVfTE9XRVJDQVNFX1JFR0VYUCIsImFkanVzdE1hdGNoZXIiLCJtYXRjaGVyIiwiJHNjZU1pbkVyciIsImVzY2FwZUZvclJlZ2V4cCIsImFkanVzdE1hdGNoZXJzIiwibWF0Y2hlcnMiLCJhZGp1c3RlZE1hdGNoZXJzIiwiU0NFX0NPTlRFWFRTIiwicmVzb3VyY2VVcmxXaGl0ZWxpc3QiLCJyZXNvdXJjZVVybEJsYWNrbGlzdCIsIm1hdGNoVXJsIiwiaXNSZXNvdXJjZVVybEFsbG93ZWRCeVBvbGljeSIsImFsbG93ZWQiLCJnZW5lcmF0ZUhvbGRlclR5cGUiLCJCYXNlIiwiaG9sZGVyVHlwZSIsInRydXN0ZWRWYWx1ZSIsIiQkdW53cmFwVHJ1c3RlZFZhbHVlIiwidHJ1c3RBcyIsIkNvbnN0cnVjdG9yIiwiYnlUeXBlIiwibWF5YmVUcnVzdGVkIiwidHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSIsImh0bWxTYW5pdGl6ZXIiLCJDU1MiLCJVUkwiLCJKUyIsInNjZSIsImlzRW5hYmxlZCIsInBhcnNlQXMiLCJlbnVtVmFsdWUiLCJsTmFtZSIsImV2ZW50U3VwcG9ydCIsImlzQ2hyb21lUGFja2FnZWRBcHAiLCJjaHJvbWUiLCJhcHAiLCJydW50aW1lIiwiaGFzSGlzdG9yeVB1c2hTdGF0ZSIsInB1c2hTdGF0ZSIsImFuZHJvaWQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJib3hlZSIsImJvZHlTdHlsZSIsInRyYW5zaXRpb25zIiwiYW5pbWF0aW9ucyIsImhhc0V2ZW50IiwiZGl2RWxtIiwiaHR0cE9wdGlvbnMiLCJoYW5kbGVSZXF1ZXN0Rm4iLCJ0cGwiLCJpZ25vcmVSZXF1ZXN0RXJyb3IiLCJoYW5kbGVFcnJvciIsIiR0ZW1wbGF0ZVJlcXVlc3RNaW5FcnIiLCJ0b3RhbFBlbmRpbmdSZXF1ZXN0cyIsInRyYW5zZm9ybWVyIiwidGVzdGFiaWxpdHkiLCJmaW5kQmluZGluZ3MiLCJvcHRfZXhhY3RNYXRjaCIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJtYXRjaGVzIiwiZGF0YUJpbmRpbmciLCJiaW5kaW5nTmFtZSIsImZpbmRNb2RlbHMiLCJwcmVmaXhlcyIsImF0dHJpYnV0ZUVxdWFscyIsImdldExvY2F0aW9uIiwic2V0TG9jYXRpb24iLCJ3aGVuU3RhYmxlIiwiZGVmZXJyZWRzIiwiJCR0aW1lb3V0SWQiLCJ1cmxQYXJzaW5nTm9kZSIsInJlcXVlc3RVcmwiLCJvcmlnaW5VcmwiLCIkJENvb2tpZVJlYWRlciIsInNhZmVHZXRDb29raWUiLCJjb29raWUiLCJzYWZlRGVjb2RlVVJJQ29tcG9uZW50IiwibGFzdENvb2tpZXMiLCJsYXN0Q29va2llU3RyaW5nIiwiY29va2llQXJyYXkiLCJjdXJyZW50Q29va2llU3RyaW5nIiwiZmlsdGVycyIsInN1ZmZpeCIsImN1cnJlbmN5RmlsdGVyIiwiZGF0ZUZpbHRlciIsImZpbHRlckZpbHRlciIsImpzb25GaWx0ZXIiLCJsaW1pdFRvRmlsdGVyIiwibG93ZXJjYXNlRmlsdGVyIiwibnVtYmVyRmlsdGVyIiwib3JkZXJCeUZpbHRlciIsInVwcGVyY2FzZUZpbHRlciIsImNvbXBhcmF0b3IiLCJhbnlQcm9wZXJ0eUtleSIsInByZWRpY2F0ZUZuIiwibWF0Y2hBZ2FpbnN0QW55UHJvcCIsImV4cHJlc3Npb25UeXBlIiwiZ2V0VHlwZUZvckZpbHRlciIsImNyZWF0ZVByZWRpY2F0ZUZuIiwic2hvdWxkTWF0Y2hQcmltaXRpdmVzIiwiYWN0dWFsIiwiZXhwZWN0ZWQiLCJkZWVwQ29tcGFyZSIsImRvbnRNYXRjaFdob2xlT2JqZWN0IiwiYWN0dWFsVHlwZSIsImV4cGVjdGVkVHlwZSIsImV4cGVjdGVkVmFsIiwibWF0Y2hBbnlQcm9wZXJ0eSIsImFjdHVhbFZhbCIsIiRsb2NhbGUiLCJmb3JtYXRzIiwiTlVNQkVSX0ZPUk1BVFMiLCJhbW91bnQiLCJjdXJyZW5jeVN5bWJvbCIsImZyYWN0aW9uU2l6ZSIsIkNVUlJFTkNZX1NZTSIsIlBBVFRFUk5TIiwibWF4RnJhYyIsImZvcm1hdE51bWJlciIsIkdST1VQX1NFUCIsIkRFQ0lNQUxfU0VQIiwibnVtYmVyIiwibnVtU3RyIiwiZGlnaXRzIiwibnVtYmVyT2ZJbnRlZ2VyRGlnaXRzIiwiemVyb3MiLCJleHBvbmVudCIsIlpFUk9fQ0hBUiIsIk1BWF9ESUdJVFMiLCJyb3VuZE51bWJlciIsInBhcnNlZE51bWJlciIsIm1pbkZyYWMiLCJmcmFjdGlvbkxlbiIsIm1pbiIsInJvdW5kQXQiLCJkaWdpdCIsImsiLCJjYXJyeSIsInJlZHVjZVJpZ2h0IiwiZ3JvdXBTZXAiLCJkZWNpbWFsU2VwIiwiaXNOYU4iLCJpc0luZmluaXR5IiwiaXNGaW5pdGUiLCJpc1plcm8iLCJhYnMiLCJmb3JtYXR0ZWRUZXh0IiwiaW50ZWdlckxlbiIsImRlY2ltYWxzIiwicmVkdWNlIiwiZ3JvdXBzIiwibGdTaXplIiwiZ1NpemUiLCJuZWdQcmUiLCJuZWdTdWYiLCJwb3NQcmUiLCJwb3NTdWYiLCJwYWROdW1iZXIiLCJudW0iLCJuZWdXcmFwIiwibmVnIiwiZGF0ZUdldHRlciIsImRhdGVTdHJHZXR0ZXIiLCJzaG9ydEZvcm0iLCJzdGFuZEFsb25lIiwicHJvcFByZWZpeCIsInRpbWVab25lR2V0dGVyIiwiem9uZSIsInBhZGRlZFpvbmUiLCJnZXRGaXJzdFRodXJzZGF5T2ZZZWFyIiwieWVhciIsImRheU9mV2Vla09uRmlyc3QiLCJnZXREYXkiLCJnZXRUaHVyc2RheVRoaXNXZWVrIiwiZGF0ZXRpbWUiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsIndlZWtHZXR0ZXIiLCJmaXJzdFRodXJzIiwidGhpc1RodXJzIiwicm91bmQiLCJhbXBtR2V0dGVyIiwiZ2V0SG91cnMiLCJBTVBNUyIsImVyYUdldHRlciIsIkVSQVMiLCJsb25nRXJhR2V0dGVyIiwiRVJBTkFNRVMiLCJqc29uU3RyaW5nVG9EYXRlIiwic3RyaW5nIiwiUl9JU084NjAxX1NUUiIsInR6SG91ciIsInR6TWluIiwiZGF0ZVNldHRlciIsInNldFVUQ0Z1bGxZZWFyIiwic2V0RnVsbFllYXIiLCJ0aW1lU2V0dGVyIiwic2V0VVRDSG91cnMiLCJzZXRIb3VycyIsIm0iLCJzIiwibXMiLCJwYXJzZUZsb2F0IiwiZm9ybWF0IiwiREFURVRJTUVfRk9STUFUUyIsIk5VTUJFUl9TVFJJTkciLCJEQVRFX0ZPUk1BVFNfU1BMSVQiLCJEQVRFX0ZPUk1BVFMiLCJzcGFjaW5nIiwibGltaXQiLCJiZWdpbiIsIkluZmluaXR5Iiwic2xpY2VGbiIsImVuZCIsInByb2Nlc3NQcmVkaWNhdGVzIiwic29ydFByZWRpY2F0ZXMiLCJtYXAiLCJwcmVkaWNhdGUiLCJkZXNjZW5kaW5nIiwib2JqZWN0VmFsdWUiLCJnZXRQcmVkaWNhdGVWYWx1ZSIsImRlZmF1bHRDb21wYXJlIiwidjEiLCJ2MiIsInR5cGUxIiwidHlwZTIiLCJ2YWx1ZTEiLCJ2YWx1ZTIiLCJzb3J0UHJlZGljYXRlIiwicmV2ZXJzZU9yZGVyIiwiY29tcGFyZUZuIiwiZ2V0Q29tcGFyaXNvbk9iamVjdCIsInRpZUJyZWFrZXIiLCJwcmVkaWNhdGVWYWx1ZXMiLCJwcmVkaWNhdGVzIiwiZG9Db21wYXJpc29uIiwiY29tcGFyZVZhbHVlcyIsIm5nRGlyZWN0aXZlIiwibnVsbEZvcm1SZW5hbWVDb250cm9sIiwiY29udHJvbCIsIiRuYW1lIiwiRm9ybUNvbnRyb2xsZXIiLCIkJGNvbnRyb2xzIiwiJGVycm9yIiwiJCRzdWNjZXNzIiwiJHBlbmRpbmciLCIkZGlydHkiLCIkcHJpc3RpbmUiLCIkdmFsaWQiLCIkaW52YWxpZCIsIiRzdWJtaXR0ZWQiLCIkJHBhcmVudEZvcm0iLCJudWxsRm9ybUN0cmwiLCIkJGFuaW1hdGUiLCJzZXR1cFZhbGlkaXR5IiwiJCRjbGFzc0NhY2hlIiwiSU5WQUxJRF9DTEFTUyIsIlZBTElEX0NMQVNTIiwiYWRkU2V0VmFsaWRpdHlNZXRob2QiLCJjcmVhdGVBbmRTZXQiLCJjdHJsIiwidW5zZXRBbmRDbGVhbnVwIiwidW5zZXQiLCJpc09iamVjdEVtcHR5IiwiY2FjaGVkVG9nZ2xlQ2xhc3MiLCJzd2l0Y2hWYWx1ZSIsInRvZ2dsZVZhbGlkYXRpb25Dc3MiLCJ2YWxpZGF0aW9uRXJyb3JLZXkiLCJpc1ZhbGlkIiwiY2xhenoiLCIkc2V0VmFsaWRpdHkiLCJQRU5ESU5HX0NMQVNTIiwiY29tYmluZWRTdGF0ZSIsInN0cmluZ0Jhc2VkSW5wdXRUeXBlIiwiJGZvcm1hdHRlcnMiLCIkaXNFbXB0eSIsInRleHRJbnB1dFR5cGUiLCJiYXNlSW5wdXRUeXBlIiwiY29tcG9zaW5nIiwiZXYiLCJuZ1RyaW0iLCIkdmlld1ZhbHVlIiwiJCRoYXNOYXRpdmVWYWxpZGF0b3JzIiwiJHNldFZpZXdWYWx1ZSIsImRlZmVyTGlzdGVuZXIiLCJvcmlnVmFsdWUiLCJrZXlDb2RlIiwiUEFSVElBTF9WQUxJREFUSU9OX1RZUEVTIiwiUEFSVElBTF9WQUxJREFUSU9OX0VWRU5UUyIsInZhbGlkaXR5IiwiVkFMSURJVFlfU1RBVEVfUFJPUEVSVFkiLCJvcmlnQmFkSW5wdXQiLCJiYWRJbnB1dCIsIm9yaWdUeXBlTWlzbWF0Y2giLCJ0eXBlTWlzbWF0Y2giLCIkcmVuZGVyIiwid2Vla1BhcnNlciIsImlzb1dlZWsiLCJleGlzdGluZ0RhdGUiLCJXRUVLX1JFR0VYUCIsIndlZWsiLCJob3VycyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiLCJhZGREYXlzIiwiZ2V0U2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIk5hTiIsImNyZWF0ZURhdGVQYXJzZXIiLCJtYXBwaW5nIiwiaXNvIiwiSVNPX0RBVEVfUkVHRVhQIiwieXl5eSIsIk1NIiwiZGQiLCJISCIsIm1tIiwic3MiLCJzc3MiLCJwYXJ0IiwiY3JlYXRlRGF0ZUlucHV0VHlwZSIsInBhcnNlRGF0ZSIsImlzVmFsaWREYXRlIiwicGFyc2VPYnNlcnZlZERhdGVWYWx1ZSIsImJhZElucHV0Q2hlY2tlciIsInByZXZpb3VzRGF0ZSIsIiRvcHRpb25zIiwiZ2V0T3B0aW9uIiwiJCRwYXJzZXJOYW1lIiwiJHBhcnNlcnMiLCJwYXJzZWREYXRlIiwibmdNb2RlbE1pbkVyciIsIm5nTWluIiwibWluVmFsIiwiJHZhbGlkYXRvcnMiLCIkdmFsaWRhdGUiLCJuZ01heCIsIm1heFZhbCIsIm5hdGl2ZVZhbGlkYXRpb24iLCJudW1iZXJGb3JtYXR0ZXJQYXJzZXIiLCJOVU1CRVJfUkVHRVhQIiwicGFyc2VOdW1iZXJBdHRyVmFsIiwiaXNOdW1iZXJJbnRlZ2VyIiwiY291bnREZWNpbWFscyIsIm51bVN0cmluZyIsImRlY2ltYWxTeW1ib2xJbmRleCIsImlzVmFsaWRGb3JTdGVwIiwidmlld1ZhbHVlIiwic3RlcEJhc2UiLCJzdGVwIiwiZGVjaW1hbENvdW50IiwibXVsdGlwbGllciIsInBvdyIsIm51bWJlcklucHV0VHlwZSIsIm5nU3RlcCIsInN0ZXBWYWwiLCJtb2RlbFZhbHVlIiwicmFuZ2VJbnB1dFR5cGUiLCJzZXRJbml0aWFsVmFsdWVBbmRPYnNlcnZlciIsImh0bWxBdHRyTmFtZSIsImNoYW5nZUZuIiwibWluQ2hhbmdlIiwiJG1vZGVsVmFsdWUiLCJzdXBwb3J0c1JhbmdlIiwiZWxWYWwiLCJtYXhDaGFuZ2UiLCJzdGVwQ2hhbmdlIiwiaGFzTWluQXR0ciIsImhhc01heEF0dHIiLCJoYXNTdGVwQXR0ciIsIm9yaWdpbmFsUmVuZGVyIiwicmFuZ2VVbmRlcmZsb3ciLCJyYW5nZU92ZXJmbG93Iiwic3RlcE1pc21hdGNoIiwidXJsSW5wdXRUeXBlIiwiVVJMX1JFR0VYUCIsImVtYWlsSW5wdXRUeXBlIiwiZW1haWwiLCJFTUFJTF9SRUdFWFAiLCJyYWRpb0lucHV0VHlwZSIsImRvVHJpbSIsImNoZWNrZWQiLCJwYXJzZUNvbnN0YW50RXhwciIsInBhcnNlRm4iLCJjaGVja2JveElucHV0VHlwZSIsInRydWVWYWx1ZSIsIm5nVHJ1ZVZhbHVlIiwiZmFsc2VWYWx1ZSIsIm5nRmFsc2VWYWx1ZSIsImNsYXNzRGlyZWN0aXZlIiwiYXJyYXlEaWZmZXJlbmNlIiwiY2xhc3NTdHJpbmciLCJ0b0NsYXNzU3RyaW5nIiwiY2xhc3NWYWx1ZSIsInRvRmxhdFZhbHVlIiwiZmxhdFZhbHVlIiwiaGFzVW5kZWZpbmVkIiwiaW5kZXhXYXRjaEV4cHJlc3Npb24iLCJhZGRDbGFzc2VzIiwiZGlnZXN0Q2xhc3NDb3VudHMiLCJyZW1vdmVDbGFzc2VzIiwidXBkYXRlQ2xhc3NlcyIsIm9sZENsYXNzU3RyaW5nIiwibmV3Q2xhc3NTdHJpbmciLCJvbGRDbGFzc0FycmF5IiwibmV3Q2xhc3NBcnJheSIsInRvUmVtb3ZlQXJyYXkiLCJ0b0FkZEFycmF5IiwidG9SZW1vdmVTdHJpbmciLCJ0b0FkZFN0cmluZyIsImNsYXNzQXJyYXkiLCJjbGFzc2VzVG9VcGRhdGUiLCJjbGFzc0NvdW50cyIsIm5nQ2xhc3NJbmRleFdhdGNoQWN0aW9uIiwibmV3TW9kdWxvIiwib2xkTW9kdWxvIiwibmdDbGFzc09uZVRpbWVXYXRjaEFjdGlvbiIsIm5ld0NsYXNzVmFsdWUiLCJuZ0NsYXNzV2F0Y2hBY3Rpb24iLCJpc09uZVRpbWUiLCJ3YXRjaEludGVyY2VwdG9yIiwid2F0Y2hFeHByZXNzaW9uIiwid2F0Y2hBY3Rpb24iLCIkaW5kZXgiLCJOZ01vZGVsQ29udHJvbGxlciIsIiQkcmF3TW9kZWxWYWx1ZSIsIiRhc3luY1ZhbGlkYXRvcnMiLCIkdmlld0NoYW5nZUxpc3RlbmVycyIsIiR1bnRvdWNoZWQiLCIkdG91Y2hlZCIsImRlZmF1bHRNb2RlbE9wdGlvbnMiLCIkJHBhcnNlZE5nTW9kZWwiLCIkJHBhcnNlZE5nTW9kZWxBc3NpZ24iLCIkJG5nTW9kZWxHZXQiLCIkJG5nTW9kZWxTZXQiLCIkJHBlbmRpbmdEZWJvdW5jZSIsIiQkcGFyc2VyVmFsaWQiLCIkJGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQiLCIkJGF0dHIiLCIkJHRpbWVvdXQiLCIkJGV4Y2VwdGlvbkhhbmRsZXIiLCJzZXR1cE1vZGVsV2F0Y2hlciIsImZvcm1hdHRlcnMiLCIkJHVwZGF0ZUVtcHR5Q2xhc3NlcyIsIiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSIsIiQkcnVuVmFsaWRhdG9ycyIsIk1vZGVsT3B0aW9ucyIsIiQkb3B0aW9ucyIsIlJFR0VYX1NUUklOR19SRUdFWFAiLCJtYW51YWxMb3dlcmNhc2UiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjaGFyQ29kZUF0IiwibWFudWFsVXBwZXJjYXNlIiwiZG9jdW1lbnRNb2RlIiwicnVsZXMiLCJuZ0NzcEVsZW1lbnQiLCJuZ0NzcEF0dHJpYnV0ZSIsIm5vSW5saW5lU3R5bGUiLCJuYW1lXyIsImVsIiwiTk9ERV9UWVBFX0FUVFJJQlVURSIsImZ1bGwiLCJtYWpvciIsIm1pbm9yIiwiZG90IiwiY29kZU5hbWUiLCJleHBhbmRvIiwibW91c2VsZWF2ZSIsIm1vdXNlZW50ZXIiLCJ0aGVhZCIsImNvbCIsInRyIiwidGQiLCJvcHRncm91cCIsInRib2R5IiwidGZvb3QiLCJjb2xncm91cCIsImNhcHRpb24iLCJ0aCIsIk5vZGUiLCJjb250YWlucyIsImNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIiwicmVhZHkiLCJyZW1vdmVEYXRhIiwicmVtb3ZlQXR0cmlidXRlIiwiY3NzIiwicmV0IiwibG93ZXJjYXNlZE5hbWUiLCJpc0Jvb2xlYW5BdHRyIiwiZ2V0VGV4dCIsIiRkdiIsIm11bHRpcGxlIiwic2VsZWN0ZWQiLCJub2RlQ291bnQiLCJ0eXBlcyIsImFkZEhhbmRsZXIiLCJub0V2ZW50TGlzdGVuZXIiLCJvbmUiLCJvbkZuIiwicmVwbGFjZU5vZGUiLCJpbnNlcnRCZWZvcmUiLCJjaGlsZHJlbiIsImNvbnRlbnREb2N1bWVudCIsInByZXBlbmQiLCJ3cmFwTm9kZSIsImRldGFjaCIsImFmdGVyIiwibmV3RWxlbWVudCIsInRvZ2dsZUNsYXNzIiwiY29uZGl0aW9uIiwiY2xhc3NDb25kaXRpb24iLCJuZXh0RWxlbWVudFNpYmxpbmciLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImV4dHJhUGFyYW1ldGVycyIsImR1bW15RXZlbnQiLCJldmVudEZuc0NvcHkiLCJoYW5kbGVyQXJncyIsImFyZzMiLCJ1bmJpbmQiLCIkYW5pbWF0ZU1pbkVyciIsIk5HX0FOSU1BVEVfQ0xBU1NOQU1FIiwicG9zdERpZ2VzdEVsZW1lbnRzIiwidXBkYXRlRGF0YSIsImhhbmRsZUNTU0NsYXNzQ2hhbmdlcyIsImV4aXN0aW5nIiwiYWRkUmVtb3ZlQ2xhc3Nlc1Bvc3REaWdlc3QiLCJhZGQiLCJjbGFzc2VzQWRkZWQiLCJjbGFzc2VzUmVtb3ZlZCIsInBpbiIsImRvbU9wZXJhdGlvbiIsImZyb20iLCJ0byIsInJ1bm5lciIsImNvbXBsZXRlIiwiJCRyZWdpc3RlcmVkQW5pbWF0aW9ucyIsImNsYXNzTmFtZUZpbHRlciIsIiQkY2xhc3NOYW1lRmlsdGVyIiwicmVzZXJ2ZWRSZWdleCIsImRvbUluc2VydCIsImFmdGVyRWxlbWVudCIsImFmdGVyTm9kZSIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJlbnRlciIsIm1vdmUiLCJsZWF2ZSIsImFkZGNsYXNzIiwic2V0Q2xhc3MiLCJhbmltYXRlIiwidGVtcENsYXNzZXMiLCJ3YWl0Rm9yVGljayIsIndhaXRRdWV1ZSIsInBhc3NlZCIsIkFuaW1hdGVSdW5uZXIiLCJzZXRIb3N0IiwicmFmVGljayIsInRpbWVvdXRUaWNrIiwiX2RvbmVDYWxsYmFja3MiLCJfdGljayIsIl9zdGF0ZSIsIklOSVRJQUxfU1RBVEUiLCJET05FX1BFTkRJTkdfU1RBVEUiLCJET05FX0NPTVBMRVRFX1NUQVRFIiwiY2hhaW4iLCJydW5uZXJzIiwib25Qcm9ncmVzcyIsImdldFByb21pc2UiLCJyZXNvbHZlSGFuZGxlciIsInJlamVjdEhhbmRsZXIiLCJwYXVzZSIsInJlc3VtZSIsIl9yZXNvbHZlIiwiaW5pdGlhbE9wdGlvbnMiLCJhcHBseUFuaW1hdGlvbkNvbnRlbnRzIiwiY2xvc2VkIiwiJCRwcmVwYXJlZCIsImNsZWFudXBTdHlsZXMiLCJzdGFydCIsImlzRmlyc3RDaGFuZ2UiLCJkb21Ob2RlIiwib2Zmc2V0V2lkdGgiLCJDb250ZW50LVR5cGUiLCJbIiwieyIsImNhbGxiYWNrSWQiLCJjYWxsZWQiLCJjYWxsYmFja01hcCIsIlBBVEhfTUFUQ0giLCJodHRwIiwiaHR0cHMiLCJmdHAiLCJsb2NhdGlvblByb3RvdHlwZSIsInBhcmFtVmFsdWUiLCJMb2NhdGlvbiIsIiRwYXJzZU1pbkVyciIsIk9QRVJBVE9SUyIsIkVTQ0FQRSIsImYiLCJ0IiwiJyIsIlwiIiwibGV4IiwidG9rZW5zIiwicmVhZFN0cmluZyIsInBlZWsiLCJyZWFkTnVtYmVyIiwicGVla011bHRpY2hhciIsInJlYWRJZGVudCIsImlzIiwiaXNXaGl0ZXNwYWNlIiwiY2gyIiwiY2gzIiwib3AxIiwib3AyIiwib3AzIiwidGhyb3dFcnJvciIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJpc1ZhbGlkSWRlbnRpZmllclN0YXJ0IiwiaXNWYWxpZElkZW50aWZpZXJDb250aW51ZSIsImNwIiwiY3AxIiwiY3AyIiwiaXNFeHBPcGVyYXRvciIsImNvbFN0ciIsInBlZWtDaCIsInF1b3RlIiwicmF3U3RyaW5nIiwiaGV4IiwicmVwIiwiRXhwcmVzc2lvblN0YXRlbWVudCIsIlByb3BlcnR5IiwicHJvZ3JhbSIsImV4cHJlc3Npb25TdGF0ZW1lbnQiLCJleHBlY3QiLCJmaWx0ZXJDaGFpbiIsImFzc2lnbm1lbnQiLCJ0ZXJuYXJ5IiwibG9naWNhbE9SIiwiY29uc3VtZSIsImxvZ2ljYWxBTkQiLCJlcXVhbGl0eSIsInJlbGF0aW9uYWwiLCJhZGRpdGl2ZSIsIm11bHRpcGxpY2F0aXZlIiwidW5hcnkiLCJwcmltYXJ5IiwiYXJyYXlEZWNsYXJhdGlvbiIsInNlbGZSZWZlcmVudGlhbCIsInBhcnNlQXJndW1lbnRzIiwiYmFzZUV4cHJlc3Npb24iLCJwZWVrVG9rZW4iLCJraW5kIiwiZTEiLCJlMiIsImUzIiwiZTQiLCJwZWVrQWhlYWQiLCIkbG9jYWxzIiwibmV4dElkIiwidmFycyIsIm93biIsImFzc2lnbmFibGUiLCJzdGFnZSIsImNvbXB1dGluZyIsInJlY3Vyc2UiLCJyZXR1cm5fIiwiZ2VuZXJhdGVGdW5jdGlvbiIsImZuS2V5IiwiaW50b0lkIiwid2F0Y2hJZCIsImZuU3RyaW5nIiwiVVNFIiwiU1RSSUNUIiwiZmlsdGVyUHJlZml4Iiwid2F0Y2hGbnMiLCJ2YXJzUHJlZml4Iiwic2VjdGlvbiIsIm5hbWVJZCIsInJlY3Vyc2lvbkZuIiwic2tpcFdhdGNoSWRDaGVjayIsImlmXyIsImxhenlBc3NpZ24iLCJjb21wdXRlZE1lbWJlciIsImxhenlSZWN1cnNlIiwicGx1cyIsIm5vdCIsImdldEhhc093blByb3BlcnR5IiwiaXNOdWxsIiwibm9uQ29tcHV0ZWRNZW1iZXIiLCJub3ROdWxsIiwibWVtYmVyIiwiZGVmYXVsdFZhbHVlIiwiU0FGRV9JREVOVElGSUVSIiwiVU5TQUZFX0NIQVJBQ1RFUlMiLCJzdHJpbmdFc2NhcGVGbiIsInN0cmluZ0VzY2FwZVJlZ2V4IiwiYyIsInNraXAiLCJpbml0IiwicmhzIiwibGhzIiwidW5hcnkrIiwidW5hcnktIiwidW5hcnkhIiwiYmluYXJ5KyIsImJpbmFyeS0iLCJiaW5hcnkqIiwiYmluYXJ5LyIsImJpbmFyeSUiLCJiaW5hcnk9PT0iLCJiaW5hcnkhPT0iLCJiaW5hcnk9PSIsImJpbmFyeSE9IiwiYmluYXJ5PCIsImJpbmFyeT4iLCJiaW5hcnk8PSIsImJpbmFyeT49IiwiYmluYXJ5JiYiLCJiaW5hcnl8fCIsInRlcm5hcnk/OiIsImFzdENvbXBpbGVyIiwieXkiLCJ5IiwiTU1NTSIsIk1NTSIsIk0iLCJMTExMIiwiSCIsImhoIiwiRUVFRSIsIkVFRSIsIloiLCJ3dyIsInciLCJHIiwiR0ciLCJHR0ciLCJHR0dHIiwieGxpbmtIcmVmIiwicHJvcE5hbWUiLCJkZWZhdWx0TGlua0ZuIiwibm9ybWFsaXplZCIsImh0bWxBdHRyIiwiJGFkZENvbnRyb2wiLCIkJHJlbmFtZUNvbnRyb2wiLCIkcmVtb3ZlQ29udHJvbCIsIiRzZXREaXJ0eSIsIiRzZXRQcmlzdGluZSIsIiRzZXRTdWJtaXR0ZWQiLCJTVUJNSVRURURfQ0xBU1MiLCIkcm9sbGJhY2tWaWV3VmFsdWUiLCIkY29tbWl0Vmlld1ZhbHVlIiwibmV3TmFtZSIsIm9sZE5hbWUiLCJQUklTVElORV9DTEFTUyIsIkRJUlRZX0NMQVNTIiwiJHNldFVudG91Y2hlZCIsImZvcm1EaXJlY3RpdmVGYWN0b3J5IiwiaXNOZ0Zvcm0iLCJnZXRTZXR0ZXIiLCJmb3JtRWxlbWVudCIsIm5hbWVBdHRyIiwiY3RybHMiLCJoYW5kbGVGb3JtU3VibWlzc2lvbiIsInBhcmVudEZvcm1DdHJsIiwic2V0dGVyIiwiREFURV9SRUdFWFAiLCJEQVRFVElNRUxPQ0FMX1JFR0VYUCIsIk1PTlRIX1JFR0VYUCIsIlRJTUVfUkVHRVhQIiwiaW5wdXRUeXBlIiwiZGF0ZXRpbWUtbG9jYWwiLCJ0aW1lIiwibW9udGgiLCJyYWRpbyIsInJhbmdlIiwiY2hlY2tib3giLCJzdWJtaXQiLCJyZXNldCIsImZpbGUiLCJDT05TVEFOVF9WQUxVRV9SRUdFWFAiLCJ1cGRhdGVFbGVtZW50VmFsdWUiLCJ0cGxBdHRyIiwiJGNvbXBpbGUiLCJ0ZW1wbGF0ZUVsZW1lbnQiLCJuZ0JpbmRIdG1sR2V0dGVyIiwibmdCaW5kSHRtbFdhdGNoIiwiZ2V0VHJ1c3RlZEh0bWwiLCJmb3JjZUFzeW5jRXZlbnRzIiwiYmx1ciIsImZvY3VzIiwicHJldmlvdXNFbGVtZW50cyIsInNyY0V4cCIsIm9ubG9hZEV4cCIsImF1dG9TY3JvbGxFeHAiLCJhdXRvc2Nyb2xsIiwicHJldmlvdXNFbGVtZW50IiwiY3VycmVudEVsZW1lbnQiLCJjaGFuZ2VDb3VudGVyIiwiY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCIsImFmdGVyQW5pbWF0aW9uIiwidGhpc0NoYW5nZUlkIiwidHJpbVZhbHVlcyIsIlVOVE9VQ0hFRF9DTEFTUyIsIlRPVUNIRURfQ0xBU1MiLCJFTVBUWV9DTEFTUyIsIk5PVF9FTVBUWV9DTEFTUyIsIiQkaW5pdEdldHRlclNldHRlcnMiLCJpbnZva2VNb2RlbEdldHRlciIsImludm9rZU1vZGVsU2V0dGVyIiwiJCQkcCIsIiRzZXRUb3VjaGVkIiwicHJldlZhbGlkIiwicHJldk1vZGVsVmFsdWUiLCJhbGxvd0ludmFsaWQiLCJ0aGF0IiwiYWxsVmFsaWQiLCIkJHdyaXRlTW9kZWxUb1Njb3BlIiwiZG9uZUNhbGxiYWNrIiwicHJvY2Vzc1BhcnNlRXJyb3JzIiwiZXJyb3JLZXkiLCJzZXRWYWxpZGl0eSIsInByb2Nlc3NTeW5jVmFsaWRhdG9ycyIsInN5bmNWYWxpZGF0b3JzVmFsaWQiLCJ2YWxpZGF0b3IiLCJCb29sZWFuIiwicHJvY2Vzc0FzeW5jVmFsaWRhdG9ycyIsInZhbGlkYXRvclByb21pc2VzIiwidmFsaWRhdGlvbkRvbmUiLCJsb2NhbFZhbGlkYXRpb25SdW5JZCIsIiQkcGFyc2VBbmRWYWxpZGF0ZSIsIndyaXRlVG9Nb2RlbElmTmVlZGVkIiwiJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdCIsImRlYm91bmNlRGVsYXkiLCJtb2RlbEN0cmwiLCJmb3JtQ3RybCIsIm9wdGlvbnNDdHJsIiwic2V0VG91Y2hlZCIsIkRFRkFVTFRfUkVHRVhQIiwiY3JlYXRlQ2hpbGQiLCJpbmhlcml0QWxsIiwidXBkYXRlT25EZWZhdWx0IiwidXBkYXRlT24iLCJkZWJvdW5jZSIsImdldHRlclNldHRlciIsIk5nTW9kZWxPcHRpb25zQ29udHJvbGxlciIsIiQkYXR0cnMiLCJwYXJlbnRPcHRpb25zIiwicGFyZW50Q3RybCIsIm1vZGVsT3B0aW9uc0RlZmluaXRpb24iLCJuZ09wdGlvbnNNaW5FcnIiLCJOR19PUFRJT05TX1JFR0VYUCIsInBhcnNlT3B0aW9uc0V4cHJlc3Npb24iLCJvcHRpb25zRXhwIiwic2VsZWN0RWxlbWVudCIsIk9wdGlvbiIsInNlbGVjdFZhbHVlIiwibGFiZWwiLCJncm91cCIsImRpc2FibGVkIiwiZ2V0T3B0aW9uVmFsdWVzS2V5cyIsIm9wdGlvblZhbHVlcyIsIm9wdGlvblZhbHVlc0tleXMiLCJrZXlOYW1lIiwiaXRlbUtleSIsInZhbHVlTmFtZSIsInNlbGVjdEFzIiwidHJhY2tCeSIsInNlbGVjdEFzRm4iLCJ2aWV3VmFsdWVGbiIsInRyYWNrQnlGbiIsImdldFRyYWNrQnlWYWx1ZUZuIiwiZ2V0VHJhY2tCeVZhbHVlIiwiZ2V0TG9jYWxzIiwiZGlzcGxheUZuIiwiZ3JvdXBCeUZuIiwiZGlzYWJsZVdoZW5GbiIsInZhbHVlc0ZuIiwiZ2V0V2F0Y2hhYmxlcyIsIndhdGNoZWRBcnJheSIsIm9wdGlvblZhbHVlc0xlbmd0aCIsImRpc2FibGVXaGVuIiwiZ2V0T3B0aW9ucyIsIm9wdGlvbkl0ZW1zIiwic2VsZWN0VmFsdWVNYXAiLCJvcHRpb25JdGVtIiwiZ2V0T3B0aW9uRnJvbVZpZXdWYWx1ZSIsImdldFZpZXdWYWx1ZUZyb21PcHRpb24iLCJuZ09wdGlvbnNQb3N0TGluayIsImFkZE9wdGlvbkVsZW1lbnQiLCJvcHRpb25FbGVtZW50Iiwib3B0aW9uVGVtcGxhdGUiLCJ1cGRhdGVPcHRpb25FbGVtZW50IiwiZ2V0QW5kVXBkYXRlU2VsZWN0ZWRPcHRpb24iLCJ1cGRhdGVPcHRpb25zIiwic2VsZWN0Q3RybCIsInJlYWRWYWx1ZSIsImdyb3VwRWxlbWVudE1hcCIsInByb3ZpZGVkRW1wdHlPcHRpb24iLCJlbXB0eU9wdGlvbiIsImdyb3VwRWxlbWVudCIsIm9wdEdyb3VwVGVtcGxhdGUiLCJsaXN0RnJhZ21lbnQiLCJuZ01vZGVsQ3RybCIsIm5leHRWYWx1ZSIsImlzTm90UHJpbWl0aXZlIiwiaGFzRW1wdHlPcHRpb24iLCJ1bmtub3duT3B0aW9uIiwiZ2VuZXJhdGVVbmtub3duT3B0aW9uVmFsdWUiLCJ3cml0ZVZhbHVlIiwic2VsZWN0ZWRPcHRpb25zIiwic2VsZWN0ZWRWYWx1ZXMiLCJzZWxlY3Rpb25zIiwic2VsZWN0ZWRPcHRpb24iLCJyZW1vdmVVbmtub3duT3B0aW9uIiwidW5zZWxlY3RFbXB0eU9wdGlvbiIsInNlbGVjdEVtcHR5T3B0aW9uIiwidXBkYXRlVW5rbm93bk9wdGlvbiIsInJlbmRlclVua25vd25PcHRpb24iLCJyZWdpc3Rlck9wdGlvbiIsIm9wdGlvblNjb3BlIiwib3B0aW9uRWwiLCJCUkFDRSIsIklTX1dIRU4iLCJ1cGRhdGVFbGVtZW50VGV4dCIsIm5ld1RleHQiLCJsYXN0Q291bnQiLCJudW1iZXJFeHAiLCJ3aGVuRXhwIiwid2hlbnMiLCJ3aGVuc0V4cEZucyIsImJyYWNlUmVwbGFjZW1lbnQiLCJ3YXRjaFJlbW92ZXIiLCJhdHRyaWJ1dGVOYW1lIiwidG1wTWF0Y2giLCJ3aGVuS2V5IiwiY291bnRJc05hTiIsInBsdXJhbENhdCIsIndoZW5FeHBGbiIsIk5HX1JFTU9WRUQiLCJuZ1JlcGVhdE1pbkVyciIsInVwZGF0ZVNjb3BlIiwidmFsdWVJZGVudGlmaWVyIiwia2V5SWRlbnRpZmllciIsImFycmF5TGVuZ3RoIiwiJGZpcnN0IiwiJGxhc3QiLCIkbWlkZGxlIiwiJG9kZCIsIiRldmVuIiwiZ2V0QmxvY2tTdGFydCIsImdldEJsb2NrRW5kIiwibmdSZXBlYXRFbmRDb21tZW50IiwiYWxpYXNBcyIsInRyYWNrQnlFeHAiLCJ0cmFja0J5RXhwR2V0dGVyIiwidHJhY2tCeUlkRXhwRm4iLCJ0cmFja0J5SWRBcnJheUZuIiwidHJhY2tCeUlkT2JqRm4iLCJoYXNoRm5Mb2NhbHMiLCJsYXN0QmxvY2tNYXAiLCJuZXh0Tm9kZSIsImNvbGxlY3Rpb25MZW5ndGgiLCJ0cmFja0J5SWQiLCJ0cmFja0J5SWRGbiIsImNvbGxlY3Rpb25LZXlzIiwibmV4dEJsb2NrT3JkZXIiLCJwcmV2aW91c05vZGUiLCJuZXh0QmxvY2tNYXAiLCJibG9ja0tleSIsIk5HX0hJREVfQ0xBU1MiLCJOR19ISURFX0lOX1BST0dSRVNTX0NMQVNTIiwibmV3U3R5bGVzIiwib2xkU3R5bGVzIiwiY2FzZXMiLCJuZ1N3aXRjaENvbnRyb2xsZXIiLCJ3YXRjaEV4cHIiLCJzZWxlY3RlZFRyYW5zY2x1ZGVzIiwic2VsZWN0ZWRFbGVtZW50cyIsInByZXZpb3VzTGVhdmVBbmltYXRpb25zIiwic2VsZWN0ZWRTY29wZXMiLCJzcGxpY2VGYWN0b3J5Iiwic2VsZWN0ZWRUcmFuc2NsdWRlIiwiY2FzZUVsZW1lbnQiLCJzZWxlY3RlZFNjb3BlIiwiYW5jaG9yIiwibmdTd2l0Y2hXaGVuU2VwYXJhdG9yIiwid2hlbkNhc2UiLCJuZ1RyYW5zY2x1ZGVNaW5FcnIiLCJmYWxsYmFja0xpbmtGbiIsIm5nVHJhbnNjbHVkZUNsb25lQXR0YWNoRm4iLCJub3RXaGl0ZXNwYWNlIiwidXNlRmFsbGJhY2tDb250ZW50IiwibmdUcmFuc2NsdWRlU2xvdCIsIm5vb3BOZ01vZGVsQ29udHJvbGxlciIsIlNlbGVjdENvbnRyb2xsZXIiLCJzY2hlZHVsZVJlbmRlciIsInJlbmRlclNjaGVkdWxlZCIsInNjaGVkdWxlVmlld1ZhbHVlVXBkYXRlIiwicmVuZGVyQWZ0ZXIiLCJ1cGRhdGVTY2hlZHVsZWQiLCJzZXRPcHRpb25Bc1NlbGVjdGVkIiwib3B0aW9uc01hcCIsInVua25vd25WYWwiLCJyZWFsVmFsIiwiaGFzT3B0aW9uIiwiY3VycmVudGx5U2VsZWN0ZWRPcHRpb24iLCJzZWxlY3RlZEluZGV4IiwiaGFzaGVkVmFsIiwiYWRkT3B0aW9uIiwicmVtb3ZlT3B0aW9uIiwib3B0aW9uQXR0cnMiLCJpbnRlcnBvbGF0ZVZhbHVlRm4iLCJpbnRlcnBvbGF0ZVRleHRGbiIsInJlbW92YWwiLCJwcmV2aW91c2x5U2VsZWN0ZWQiLCJyZW1vdmVWYWx1ZSIsInNlbGVjdFByZUxpbmsiLCJsYXN0VmlldyIsImxhc3RWaWV3UmVmIiwic2VsZWN0UG9zdExpbmsiLCJzZWxlY3RDdHJsTmFtZSIsInBhdHRlcm5FeHAiLCJpbnRWYWwiLCJnZXREZWNpbWFscyIsImdldFZGIiwib3B0X3ByZWNpc2lvbiIsIlBMVVJBTF9DQVRFR09SWSIsIlpFUk8iLCJPTkUiLCJUV08iLCJGRVciLCJNQU5ZIiwiT1RIRVIiLCJEQVkiLCJGSVJTVERBWU9GV0VFSyIsIk1PTlRIIiwiU0hPUlREQVkiLCJTSE9SVE1PTlRIIiwiU1RBTkRBTE9ORU1PTlRIIiwiV0VFS0VORFJBTkdFIiwiZnVsbERhdGUiLCJsb25nRGF0ZSIsIm1lZGl1bSIsIm1lZGl1bURhdGUiLCJtZWRpdW1UaW1lIiwic2hvcnQiLCJzaG9ydERhdGUiLCJzaG9ydFRpbWUiLCJtaW5JbnQiLCJsb2NhbGVJRCIsInZmIiwiaGVhZCIsImlzVmFsaWREb3R0ZWRQYXRoIiwiTUVNQkVSX05BTUVfUkVHRVgiLCJsb29rdXBEb3R0ZWRQYXRoIiwiJHJlc291cmNlTWluRXJyIiwic2hhbGxvd0NsZWFyQW5kQ29weSIsIlBST1RPQ09MX0FORF9JUFY2X1JFR0VYIiwic3RyaXBUcmFpbGluZ1NsYXNoZXMiLCJjYW5jZWxsYWJsZSIsImFjdGlvbnMiLCJzYXZlIiwicXVlcnkiLCJkZWxldGUiLCJSb3V0ZSIsInVybFBhcmFtcyIsInJlc291cmNlRmFjdG9yeSIsInBhcmFtRGVmYXVsdHMiLCJleHRyYWN0UGFyYW1zIiwiYWN0aW9uUGFyYW1zIiwiaWRzIiwiZGVmYXVsdFJlc3BvbnNlSW50ZXJjZXB0b3IiLCJyZXNvdXJjZSIsIlJlc291cmNlIiwicm91dGUiLCJ0b0pTT04iLCIkcHJvbWlzZSIsIiRyZXNvbHZlZCIsImhhc0JvZHkiLCJudW1lcmljVGltZW91dCIsImExIiwiYTIiLCJhMyIsImE0IiwiY2FuY2VsUmVxdWVzdCIsInRpbWVvdXREZWZlcnJlZCIsInN1Y2Nlc3MiLCJudW1lcmljVGltZW91dFByb21pc2UiLCJpc0luc3RhbmNlQ2FsbCIsImh0dHBDb25maWciLCJyZXNwb25zZUludGVyY2VwdG9yIiwicmVzcG9uc2VFcnJvckludGVyY2VwdG9yIiwiaGFzRXJyb3IiLCJoYXNSZXNwb25zZUVycm9ySW50ZXJjZXB0b3IiLCJzZXRVcmxQYXJhbXMiLCIkY2FuY2VsUmVxdWVzdCIsImFkZGl0aW9uYWxQYXJhbURlZmF1bHRzIiwiZXh0ZW5kZWRQYXJhbURlZmF1bHRzIiwiYWN0aW9uVXJsIiwiZW5jb2RlZFZhbCIsInByb3RvY29sQW5kSXB2NiIsInBhcmFtIiwiaXNRdWVyeVBhcmFtVmFsdWUiLCJwYXJhbUluZm8iLCJ1cmxQYXJhbSIsInAxIiwibGVhZGluZ1NsYXNoZXMiLCJ0YWlsIiwiZ2xvYmFsIiwiZXhwb3J0cyIsImRlZmluZSIsImFtZCIsIm1vbWVudCIsImhvb2tzIiwiaG9va0NhbGxiYWNrIiwic2V0SG9va0NhbGxiYWNrIiwiYXJyIiwicmVzIiwiaGFzT3duUHJvcCIsImNyZWF0ZVVUQyIsImxvY2FsZSIsInN0cmljdCIsImNyZWF0ZUxvY2FsT3JVVEMiLCJ1dGMiLCJkZWZhdWx0UGFyc2luZ0ZsYWdzIiwidW51c2VkVG9rZW5zIiwidW51c2VkSW5wdXQiLCJvdmVyZmxvdyIsImNoYXJzTGVmdE92ZXIiLCJudWxsSW5wdXQiLCJpbnZhbGlkTW9udGgiLCJpbnZhbGlkRm9ybWF0IiwidXNlckludmFsaWRhdGVkIiwicGFyc2VkRGF0ZVBhcnRzIiwibWVyaWRpZW0iLCJnZXRQYXJzaW5nRmxhZ3MiLCJfcGYiLCJfaXNWYWxpZCIsImZsYWdzIiwicGFyc2VkUGFydHMiLCJzb21lJDEiLCJpc05vd1ZhbGlkIiwiX2QiLCJpbnZhbGlkV2Vla2RheSIsIl9zdHJpY3QiLCJiaWdIb3VyIiwiaXNGcm96ZW4iLCJjcmVhdGVJbnZhbGlkIiwiY29weUNvbmZpZyIsIl9pc0FNb21lbnRPYmplY3QiLCJfaSIsIl9mIiwiX2wiLCJfdHptIiwiX2lzVVRDIiwiX29mZnNldCIsIl9sb2NhbGUiLCJtb21lbnRQcm9wZXJ0aWVzIiwiTW9tZW50IiwidXBkYXRlSW5Qcm9ncmVzcyIsInVwZGF0ZU9mZnNldCIsImlzTW9tZW50IiwiYWJzRmxvb3IiLCJjZWlsIiwiYXJndW1lbnRGb3JDb2VyY2lvbiIsImNvZXJjZWROdW1iZXIiLCJjb21wYXJlQXJyYXlzIiwiZG9udENvbnZlcnQiLCJsZW5ndGhEaWZmIiwiZGlmZnMiLCJzdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MiLCJkZXByZWNhdGUiLCJmaXJzdFRpbWUiLCJkZXByZWNhdGlvbkhhbmRsZXIiLCJkZXByZWNhdGVTaW1wbGUiLCJkZXByZWNhdGlvbnMiLCJfY29uZmlnIiwiX29yZGluYWxQYXJzZUxlbmllbnQiLCJfb3JkaW5hbFBhcnNlIiwibWVyZ2VDb25maWdzIiwicGFyZW50Q29uZmlnIiwiY2hpbGRDb25maWciLCJMb2NhbGUiLCJjYWxlbmRhciIsIm1vbSIsIm5vdyIsIm91dHB1dCIsIl9jYWxlbmRhciIsImxvbmdEYXRlRm9ybWF0IiwiX2xvbmdEYXRlRm9ybWF0IiwiZm9ybWF0VXBwZXIiLCJpbnZhbGlkRGF0ZSIsIl9pbnZhbGlkRGF0ZSIsIm9yZGluYWwiLCJfb3JkaW5hbCIsInJlbGF0aXZlVGltZSIsIndpdGhvdXRTdWZmaXgiLCJpc0Z1dHVyZSIsIl9yZWxhdGl2ZVRpbWUiLCJwYXN0RnV0dXJlIiwiYWRkVW5pdEFsaWFzIiwidW5pdCIsInNob3J0aGFuZCIsImxvd2VyQ2FzZSIsImFsaWFzZXMiLCJub3JtYWxpemVVbml0cyIsInVuaXRzIiwibm9ybWFsaXplT2JqZWN0VW5pdHMiLCJpbnB1dE9iamVjdCIsIm5vcm1hbGl6ZWRQcm9wIiwibm9ybWFsaXplZElucHV0IiwiYWRkVW5pdFByaW9yaXR5IiwicHJpb3JpdGllcyIsImdldFByaW9yaXRpemVkVW5pdHMiLCJ1bml0c09iaiIsInUiLCJtYWtlR2V0U2V0Iiwia2VlcFRpbWUiLCJzZXQkMSIsInN0cmluZ0dldCIsInN0cmluZ1NldCIsInByaW9yaXRpemVkIiwiemVyb0ZpbGwiLCJ0YXJnZXRMZW5ndGgiLCJmb3JjZVNpZ24iLCJhYnNOdW1iZXIiLCJ6ZXJvc1RvRmlsbCIsInNpZ24iLCJhZGRGb3JtYXRUb2tlbiIsInBhZGRlZCIsImZvcm1hdFRva2VuRnVuY3Rpb25zIiwibG9jYWxlRGF0YSIsInJlbW92ZUZvcm1hdHRpbmdUb2tlbnMiLCJtYWtlRm9ybWF0RnVuY3Rpb24iLCJmb3JtYXR0aW5nVG9rZW5zIiwiZm9ybWF0TW9tZW50IiwiZXhwYW5kRm9ybWF0IiwiZm9ybWF0RnVuY3Rpb25zIiwicmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zIiwibG9jYWxGb3JtYXR0aW5nVG9rZW5zIiwiYWRkUmVnZXhUb2tlbiIsInN0cmljdFJlZ2V4IiwicmVnZXhlcyIsImlzU3RyaWN0IiwiZ2V0UGFyc2VSZWdleEZvclRva2VuIiwidW5lc2NhcGVGb3JtYXQiLCJyZWdleEVzY2FwZSIsIm1hdGNoZWQiLCJwMiIsInAzIiwicDQiLCJhZGRQYXJzZVRva2VuIiwiYWRkV2Vla1BhcnNlVG9rZW4iLCJfdyIsImFkZFRpbWVUb0FycmF5RnJvbVRva2VuIiwiX2EiLCJkYXlzSW5Nb250aCIsIlVUQyIsImdldFVUQ0RhdGUiLCJsb2NhbGVNb250aHMiLCJfbW9udGhzIiwiaXNGb3JtYXQiLCJNT05USFNfSU5fRk9STUFUIiwibG9jYWxlTW9udGhzU2hvcnQiLCJfbW9udGhzU2hvcnQiLCJoYW5kbGVTdHJpY3RQYXJzZSIsIm1vbnRoTmFtZSIsImxsYyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiX21vbnRoc1BhcnNlIiwiX2xvbmdNb250aHNQYXJzZSIsIl9zaG9ydE1vbnRoc1BhcnNlIiwibW9udGhzU2hvcnQiLCJtb250aHMiLCJpbmRleE9mJDEiLCJsb2NhbGVNb250aHNQYXJzZSIsIl9tb250aHNQYXJzZUV4YWN0Iiwic2V0TW9udGgiLCJkYXlPZk1vbnRoIiwibW9udGhzUGFyc2UiLCJnZXRTZXRNb250aCIsImdldERheXNJbk1vbnRoIiwibW9udGhzU2hvcnRSZWdleCIsImNvbXB1dGVNb250aHNQYXJzZSIsIl9tb250aHNTaG9ydFN0cmljdFJlZ2V4IiwiX21vbnRoc1Nob3J0UmVnZXgiLCJkZWZhdWx0TW9udGhzU2hvcnRSZWdleCIsIm1vbnRoc1JlZ2V4IiwiX21vbnRoc1N0cmljdFJlZ2V4IiwiX21vbnRoc1JlZ2V4IiwiZGVmYXVsdE1vbnRoc1JlZ2V4IiwiY21wTGVuUmV2Iiwic2hvcnRQaWVjZXMiLCJsb25nUGllY2VzIiwibWl4ZWRQaWVjZXMiLCJkYXlzSW5ZZWFyIiwiaXNMZWFwWWVhciIsImdldElzTGVhcFllYXIiLCJjcmVhdGVEYXRlIiwiY3JlYXRlVVRDRGF0ZSIsImdldFVUQ0Z1bGxZZWFyIiwiZmlyc3RXZWVrT2Zmc2V0IiwiZG93IiwiZG95IiwiZndkIiwiZndkbHciLCJnZXRVVENEYXkiLCJkYXlPZlllYXJGcm9tV2Vla3MiLCJ3ZWVrZGF5IiwicmVzWWVhciIsInJlc0RheU9mWWVhciIsImxvY2FsV2Vla2RheSIsIndlZWtPZmZzZXQiLCJkYXlPZlllYXIiLCJ3ZWVrT2ZZZWFyIiwicmVzV2VlayIsIndlZWtzSW5ZZWFyIiwid2Vla09mZnNldE5leHQiLCJsb2NhbGVXZWVrIiwiX3dlZWsiLCJsb2NhbGVGaXJzdERheU9mV2VlayIsImxvY2FsZUZpcnN0RGF5T2ZZZWFyIiwiZ2V0U2V0V2VlayIsImdldFNldElTT1dlZWsiLCJwYXJzZVdlZWtkYXkiLCJ3ZWVrZGF5c1BhcnNlIiwicGFyc2VJc29XZWVrZGF5IiwibG9jYWxlV2Vla2RheXMiLCJfd2Vla2RheXMiLCJkYXkiLCJsb2NhbGVXZWVrZGF5c1Nob3J0IiwiX3dlZWtkYXlzU2hvcnQiLCJsb2NhbGVXZWVrZGF5c01pbiIsIl93ZWVrZGF5c01pbiIsImhhbmRsZVN0cmljdFBhcnNlJDEiLCJ3ZWVrZGF5TmFtZSIsIl93ZWVrZGF5c1BhcnNlIiwiX3Nob3J0V2Vla2RheXNQYXJzZSIsIl9taW5XZWVrZGF5c1BhcnNlIiwid2Vla2RheXNNaW4iLCJ3ZWVrZGF5c1Nob3J0Iiwid2Vla2RheXMiLCJsb2NhbGVXZWVrZGF5c1BhcnNlIiwiX3dlZWtkYXlzUGFyc2VFeGFjdCIsIl9mdWxsV2Vla2RheXNQYXJzZSIsImdldFNldERheU9mV2VlayIsImdldFNldExvY2FsZURheU9mV2VlayIsImdldFNldElTT0RheU9mV2VlayIsIndlZWtkYXlzUmVnZXgiLCJjb21wdXRlV2Vla2RheXNQYXJzZSIsIl93ZWVrZGF5c1N0cmljdFJlZ2V4IiwiX3dlZWtkYXlzUmVnZXgiLCJkZWZhdWx0V2Vla2RheXNSZWdleCIsIndlZWtkYXlzU2hvcnRSZWdleCIsIl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXgiLCJfd2Vla2RheXNTaG9ydFJlZ2V4IiwiZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCIsIndlZWtkYXlzTWluUmVnZXgiLCJfd2Vla2RheXNNaW5TdHJpY3RSZWdleCIsIl93ZWVrZGF5c01pblJlZ2V4IiwiZGVmYXVsdFdlZWtkYXlzTWluUmVnZXgiLCJtaW5wIiwic2hvcnRwIiwibG9uZ3AiLCJtaW5QaWVjZXMiLCJoRm9ybWF0Iiwia0Zvcm1hdCIsIm1hdGNoTWVyaWRpZW0iLCJfbWVyaWRpZW1QYXJzZSIsImxvY2FsZUlzUE0iLCJsb2NhbGVNZXJpZGllbSIsImlzTG93ZXIiLCJub3JtYWxpemVMb2NhbGUiLCJjaG9vc2VMb2NhbGUiLCJsb2FkTG9jYWxlIiwib2xkTG9jYWxlIiwibG9jYWxlcyIsImdsb2JhbExvY2FsZSIsIl9hYmJyIiwiZ2V0U2V0R2xvYmFsTG9jYWxlIiwiZ2V0TG9jYWxlIiwiZGVmaW5lTG9jYWxlIiwiYmFzZUNvbmZpZyIsImFiYnIiLCJwYXJlbnRMb2NhbGUiLCJsb2NhbGVGYW1pbGllcyIsIngiLCJ1cGRhdGVMb2NhbGUiLCJsaXN0TG9jYWxlcyIsImtleXMkMSIsImNoZWNrT3ZlcmZsb3ciLCJEQVRFIiwiWUVBUiIsIkhPVVIiLCJNSU5VVEUiLCJTRUNPTkQiLCJNSUxMSVNFQ09ORCIsIl9vdmVyZmxvd0RheU9mWWVhciIsIl9vdmVyZmxvd1dlZWtzIiwiV0VFSyIsIl9vdmVyZmxvd1dlZWtkYXkiLCJXRUVLREFZIiwiY29uZmlnRnJvbUlTTyIsImFsbG93VGltZSIsImRhdGVGb3JtYXQiLCJ0aW1lRm9ybWF0IiwidHpGb3JtYXQiLCJleHRlbmRlZElzb1JlZ2V4IiwiYmFzaWNJc29SZWdleCIsImlzb0RhdGVzIiwiaXNvVGltZXMiLCJ0elJlZ2V4IiwiY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCIsImNvbmZpZ0Zyb21TdHJpbmciLCJhc3BOZXRKc29uUmVnZXgiLCJjcmVhdGVGcm9tSW5wdXRGYWxsYmFjayIsImN1cnJlbnREYXRlQXJyYXkiLCJub3dWYWx1ZSIsIl91c2VVVEMiLCJnZXRVVENNb250aCIsImNvbmZpZ0Zyb21BcnJheSIsImN1cnJlbnREYXRlIiwieWVhclRvVXNlIiwiZGF5T2ZZZWFyRnJvbVdlZWtJbmZvIiwiX2RheU9mWWVhciIsIl9uZXh0RGF5Iiwic2V0VVRDTWludXRlcyIsImdldFVUQ01pbnV0ZXMiLCJ3ZWVrWWVhciIsInRlbXAiLCJ3ZWVrZGF5T3ZlcmZsb3ciLCJXIiwiRSIsImNyZWF0ZUxvY2FsIiwiY3VyV2VlayIsImdnIiwiSVNPXzg2MDEiLCJwYXJzZWRJbnB1dCIsInNraXBwZWQiLCJzdHJpbmdMZW5ndGgiLCJ0b3RhbFBhcnNlZElucHV0TGVuZ3RoIiwiX21lcmlkaWVtIiwibWVyaWRpZW1GaXhXcmFwIiwiaG91ciIsImlzUG0iLCJtZXJpZGllbUhvdXIiLCJpc1BNIiwiY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5IiwidGVtcENvbmZpZyIsImJlc3RNb21lbnQiLCJzY29yZVRvQmVhdCIsImN1cnJlbnRTY29yZSIsInNjb3JlIiwiY29uZmlnRnJvbU9iamVjdCIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIiwiY3JlYXRlRnJvbUNvbmZpZyIsInByZXBhcmVDb25maWciLCJwcmVwYXJzZSIsImNvbmZpZ0Zyb21JbnB1dCIsImlzVVRDIiwicGlja0J5IiwibW9tZW50cyIsIkR1cmF0aW9uIiwiZHVyYXRpb24iLCJ5ZWFycyIsInF1YXJ0ZXJzIiwicXVhcnRlciIsIndlZWtzIiwiZGF5cyIsIl9taWxsaXNlY29uZHMiLCJfZGF5cyIsIl9idWJibGUiLCJpc0R1cmF0aW9uIiwiYWJzUm91bmQiLCJ1dGNPZmZzZXQiLCJvZmZzZXRGcm9tU3RyaW5nIiwiY2h1bmsiLCJjaHVua09mZnNldCIsImNsb25lV2l0aE9mZnNldCIsIm1vZGVsIiwic2V0VGltZSIsImxvY2FsIiwiZ2V0RGF0ZU9mZnNldCIsImdldFNldE9mZnNldCIsImtlZXBMb2NhbFRpbWUiLCJsb2NhbEFkanVzdCIsIm1hdGNoU2hvcnRPZmZzZXQiLCJfY2hhbmdlSW5Qcm9ncmVzcyIsImFkZFN1YnRyYWN0IiwiY3JlYXRlRHVyYXRpb24iLCJnZXRTZXRab25lIiwic2V0T2Zmc2V0VG9VVEMiLCJzZXRPZmZzZXRUb0xvY2FsIiwic3VidHJhY3QiLCJzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCIsInRab25lIiwibWF0Y2hPZmZzZXQiLCJoYXNBbGlnbmVkSG91ck9mZnNldCIsImlzRGF5bGlnaHRTYXZpbmdUaW1lIiwiaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkIiwiX2lzRFNUU2hpZnRlZCIsIm90aGVyIiwidG9BcnJheSIsImlzTG9jYWwiLCJpc1V0Y09mZnNldCIsImlzVXRjIiwiZGlmZlJlcyIsImFzcE5ldFJlZ2V4IiwiaXNvUmVnZXgiLCJwYXJzZUlzbyIsIm1vbWVudHNEaWZmZXJlbmNlIiwiaW5wIiwicG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZSIsImlzQWZ0ZXIiLCJpc0JlZm9yZSIsImNyZWF0ZUFkZGVyIiwiZGlyZWN0aW9uIiwicGVyaW9kIiwiZHVyIiwiaXNBZGRpbmciLCJnZXRDYWxlbmRhckZvcm1hdCIsIm15TW9tZW50IiwiY2FsZW5kYXIkMSIsInNvZCIsInN0YXJ0T2YiLCJjYWxlbmRhckZvcm1hdCIsImxvY2FsSW5wdXQiLCJlbmRPZiIsImlzQmV0d2VlbiIsImluY2x1c2l2aXR5IiwiaXNTYW1lIiwiaW5wdXRNcyIsImlzU2FtZU9yQWZ0ZXIiLCJpc1NhbWVPckJlZm9yZSIsImFzRmxvYXQiLCJ6b25lRGVsdGEiLCJkZWx0YSIsIm1vbnRoRGlmZiIsImFuY2hvcjIiLCJhZGp1c3QiLCJ3aG9sZU1vbnRoRGlmZiIsInRvRGF0ZSIsImluc3BlY3QiLCJpbnB1dFN0cmluZyIsImRlZmF1bHRGb3JtYXRVdGMiLCJkZWZhdWx0Rm9ybWF0IiwicG9zdGZvcm1hdCIsImh1bWFuaXplIiwiZnJvbU5vdyIsInRvTm93IiwibmV3TG9jYWxlRGF0YSIsImlzb1dlZWtkYXkiLCJ1bml4IiwidG9PYmplY3QiLCJpc1ZhbGlkJDEiLCJwYXJzaW5nRmxhZ3MiLCJpbnZhbGlkQXQiLCJjcmVhdGlvbkRhdGEiLCJhZGRXZWVrWWVhckZvcm1hdFRva2VuIiwiZ2V0U2V0V2Vla1llYXIiLCJnZXRTZXRXZWVrWWVhckhlbHBlciIsImdldFNldElTT1dlZWtZZWFyIiwiZ2V0SVNPV2Vla3NJblllYXIiLCJnZXRXZWVrc0luWWVhciIsIndlZWtJbmZvIiwid2Vla3NUYXJnZXQiLCJzZXRXZWVrQWxsIiwiZGF5T2ZZZWFyRGF0YSIsImdldFNldFF1YXJ0ZXIiLCJnZXRTZXREYXlPZlllYXIiLCJwYXJzZU1zIiwiZ2V0Wm9uZUFiYnIiLCJnZXRab25lTmFtZSIsImNyZWF0ZVVuaXgiLCJjcmVhdGVJblpvbmUiLCJwYXJzZVpvbmUiLCJwcmVQYXJzZVBvc3RGb3JtYXQiLCJnZXQkMSIsImZpZWxkIiwibGlzdE1vbnRoc0ltcGwiLCJvdXQiLCJsaXN0V2Vla2RheXNJbXBsIiwibG9jYWxlU29ydGVkIiwibGlzdE1vbnRocyIsImxpc3RNb250aHNTaG9ydCIsImxpc3RXZWVrZGF5cyIsImxpc3RXZWVrZGF5c1Nob3J0IiwibGlzdFdlZWtkYXlzTWluIiwibWF0aEFicyIsImFkZFN1YnRyYWN0JDEiLCJhZGQkMSIsInN1YnRyYWN0JDEiLCJhYnNDZWlsIiwiYnViYmxlIiwibW9udGhzRnJvbURheXMiLCJtb250aHNUb0RheXMiLCJkYXlzVG9Nb250aHMiLCJhcyIsInZhbHVlT2YkMSIsIm1ha2VBcyIsImFsaWFzIiwiZ2V0JDIiLCJtYWtlR2V0dGVyIiwic3Vic3RpdHV0ZVRpbWVBZ28iLCJyZWxhdGl2ZVRpbWUkMSIsInBvc05lZ0R1cmF0aW9uIiwidGhyZXNob2xkcyIsImdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nIiwicm91bmRpbmdGdW5jdGlvbiIsImdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCIsInRocmVzaG9sZCIsIndpdGhTdWZmaXgiLCJ0b0lTT1N0cmluZyQxIiwiYWJzJDEiLCJZIiwiRCIsInRvdGFsIiwiYXNTZWNvbmRzIiwiZnVuIiwiZGVmYXVsdENhbGVuZGFyIiwic2FtZURheSIsIm5leHREYXkiLCJuZXh0V2VlayIsImxhc3REYXkiLCJsYXN0V2VlayIsInNhbWVFbHNlIiwiZGVmYXVsdExvbmdEYXRlRm9ybWF0IiwiTFRTIiwiTFQiLCJMIiwiTEwiLCJMTEwiLCJkZWZhdWx0SW52YWxpZERhdGUiLCJkZWZhdWx0T3JkaW5hbCIsImRlZmF1bHRPcmRpbmFsUGFyc2UiLCJkZWZhdWx0UmVsYXRpdmVUaW1lIiwiZnV0dXJlIiwicGFzdCIsIm1hdGNoMSIsIm1hdGNoMiIsIm1hdGNoMyIsIm1hdGNoNCIsIm1hdGNoNiIsIm1hdGNoMXRvMiIsIm1hdGNoM3RvNCIsIm1hdGNoNXRvNiIsIm1hdGNoMXRvMyIsIm1hdGNoMXRvNCIsIm1hdGNoMXRvNiIsIm1hdGNoVW5zaWduZWQiLCJtYXRjaFNpZ25lZCIsIm1hdGNoVGltZXN0YW1wIiwibWF0Y2hXb3JkIiwibyIsImRlZmF1bHRMb2NhbGVNb250aHMiLCJkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQiLCJwYXJzZVR3b0RpZ2l0WWVhciIsImdldFNldFllYXIiLCJkZWZhdWx0TG9jYWxlV2VlayIsImRlZmF1bHRMb2NhbGVXZWVrZGF5cyIsImRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0IiwiZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluIiwiX2lzUG0iLCJwb3MxIiwicG9zMiIsImRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlIiwiZ2V0U2V0SG91ciIsIm9yZGluYWxQYXJzZSIsIm1lcmlkaWVtUGFyc2UiLCJwcm90b3R5cGVNaW4iLCJwcm90b3R5cGVNYXgiLCJsYW5nIiwiaXNvV2Vla1llYXIiLCJnZXRTZXREYXlPZk1vbnRoIiwiZ2V0U2V0TWludXRlIiwiZ2V0U2V0U2Vjb25kIiwiZ2V0U2V0TWlsbGlzZWNvbmQiLCJwcm90byIsImlzb1dlZWtzIiwiaXNvV2Vla3NJblllYXIiLCJpc0RTVCIsInpvbmVBYmJyIiwiem9uZU5hbWUiLCJkYXRlcyIsImlzRFNUU2hpZnRlZCIsInByb3RvJDEiLCJmaXJzdERheU9mWWVhciIsImZpcnN0RGF5T2ZXZWVrIiwibGFuZ0RhdGEiLCJhc01pbGxpc2Vjb25kcyIsImFzTWludXRlcyIsImFzSG91cnMiLCJhc0RheXMiLCJhc1dlZWtzIiwiYXNNb250aHMiLCJhc1llYXJzIiwicHJvdG8kMiIsInRvSXNvU3RyaW5nIiwiaW52YWxpZCIsInJlbGF0aXZlVGltZVJvdW5kaW5nIiwicmVsYXRpdmVUaW1lVGhyZXNob2xkIiwiZyIsImlzTnVsbEluc3RhbmNlIiwiYWxpYXNVcmxzIiwiZ2V0VXJsRm9yQWxpYXMiLCJkZWZhdWx0QmFzZVVybCIsImRlZmF1bHRFeHQiLCJnZXRUZW1wbGF0ZVVybCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsInJlc2V0Q29uZmlncyIsInNldENvbmZpZyIsImhhc0ZpbHRlciIsImZpbHRlckZpbHRlck5hbWUiLCJvcmRlckJ5Iiwic29ydGluZ0ZpbHRlck5hbWUiLCJwYWdlIiwic2V0dGluZ3MiLCJnZXREYXRhRm5BZGFwdG9yIiwiZ2V0RGF0YSIsImdldEdyb3Vwc0ZuQWRhcHRvciIsImdldEdyb3VwcyIsImdyb3VwQnkiLCJxIiwiZGVidWdNb2RlIiwicGFyYW1ldGVycyIsInB1Ymxpc2hEYXRhc2V0Q2hhbmdlZCIsInNvcnRpbmciLCJpc1NvcnRCeSIsImdlbmVyYXRlUGFnZXNBcnJheSIsImFjdGl2ZSIsInBhZ2luYXRpb25NYXhCbG9ja3MiLCJwYWdpbmF0aW9uTWluQmxvY2tzIiwiaXNEYXRhUmVsb2FkUmVxdWlyZWQiLCJoYXNGaWx0ZXJDaGFuZ2VzIiwiJGxvYWRpbmciLCJwdWJsaXNoQWZ0ZXJSZWxvYWREYXRhIiwicmVsb2FkUGFnZXMiLCJwdWJsaXNoUGFnZXNDaGFuZ2VkIiwiZGVmYXVsdFNvcnQiLCJmaWx0ZXJEZWxheSIsImNvdW50cyIsInNvcnRpbmdJbmRpY2F0b3IiLCJwdWJsaXNoQWZ0ZXJDcmVhdGVkIiwic29ydGFibGUiLCJzb3J0QnkiLCIkZ3JvdXBzIiwiJGRhdGEiLCJwYWdlcyIsIm9uQWZ0ZXJSZWxvYWREYXRhIiwib25QYWdlc0NoYW5nZWQiLCIkZmlsdGVyUm93IiwiY29tcGlsZURpcmVjdGl2ZVRlbXBsYXRlcyIsInRlbXBsYXRlcyIsInRlbXBsYXRlSGVhZGVyIiwicGFnaW5hdGlvbiIsInRlbXBsYXRlUGFnaW5hdGlvbiIsInRhZ05hbWUiLCJuZy10YWJsZS1wYWdpbmF0aW9uIiwidGVtcGxhdGUtdXJsIiwibG9hZEZpbHRlckRhdGEiLCJmaWx0ZXJEYXRhIiwiJGNvbHVtbiIsInRpdGxlIiwiYnVpbGRDb2x1bW5zIiwiYnVpbGRDb2x1bW4iLCJwYXJzZU5nVGFibGVEeW5hbWljRXhwciIsInRhYmxlUGFyYW1zIiwiY29sdW1ucyIsInNldHVwQmluZGluZ3NUb0ludGVybmFsU2NvcGUiLCJwYXJhbXNNb2RlbCIsInNob3dGaWx0ZXIiLCJzaG93X2ZpbHRlciIsImRpc2FibGVGaWx0ZXIiLCJjbGFzcyIsImhlYWRlclRlbXBsYXRlVVJMIiwiaGVhZGVyVGl0bGUiLCJzaG93IiwidGl0bGVBbHQiLCIkY29sdW1ucyIsIm5nVGFibGUiLCJuZ1RhYmxlRHluYW1pYyIsIm5nLWluY2x1ZGUiLCJub0dsb2JhbCIsIkRPTUV2YWwiLCJ3aW5ub3ciLCJxdWFsaWZpZXIiLCJncmVwIiwicmlzU2ltcGxlIiwiY3VyIiwiZGlyIiwiY3JlYXRlT3B0aW9ucyIsImVhY2giLCJybm90aHRtbHdoaXRlIiwiXyIsIklkZW50aXR5IiwiVGhyb3dlciIsImV4IiwiYWRvcHRWYWx1ZSIsImZhaWwiLCJjb21wbGV0ZWQiLCJEYXRhIiwicmJyYWNlIiwiZGF0YUF0dHIiLCJybXVsdGlEYXNoIiwiZGF0YVVzZXIiLCJhZGp1c3RDU1MiLCJ2YWx1ZVBhcnRzIiwidHdlZW4iLCJhZGp1c3RlZCIsInNjYWxlIiwibWF4SXRlcmF0aW9ucyIsImluaXRpYWwiLCJjc3NOdW1iZXIiLCJpbml0aWFsSW5Vbml0IiwicmNzc051bSIsImdldERlZmF1bHREaXNwbGF5Iiwib3duZXJEb2N1bWVudCIsImRpc3BsYXkiLCJkZWZhdWx0RGlzcGxheU1hcCIsInNob3dIaWRlIiwiZGF0YVByaXYiLCJpc0hpZGRlbldpdGhpblRyZWUiLCJnZXRBbGwiLCJzZXRHbG9iYWxFdmFsIiwicmVmRWxlbWVudHMiLCJidWlsZEZyYWdtZW50Iiwic2NyaXB0cyIsInNlbGVjdGlvbiIsImlnbm9yZWQiLCJyaHRtbCIsInJ0YWdOYW1lIiwiaHRtbFByZWZpbHRlciIsImluQXJyYXkiLCJyc2NyaXB0VHlwZSIsInJldHVyblRydWUiLCJyZXR1cm5GYWxzZSIsInNhZmVBY3RpdmVFbGVtZW50IiwiYWN0aXZlRWxlbWVudCIsIm9yaWdGbiIsImd1aWQiLCJtYW5pcHVsYXRpb25UYXJnZXQiLCJkaXNhYmxlU2NyaXB0IiwicmVzdG9yZVNjcmlwdCIsInJzY3JpcHRUeXBlTWFza2VkIiwiY2xvbmVDb3B5RXZlbnQiLCJkZXN0IiwicGRhdGFPbGQiLCJwZGF0YUN1ciIsInVkYXRhT2xkIiwidWRhdGFDdXIiLCJhY2Nlc3MiLCJmaXhJbnB1dCIsInJjaGVja2FibGVUeXBlIiwiZG9tTWFuaXAiLCJmaXJzdCIsImhhc1NjcmlwdHMiLCJpTm9DbG9uZSIsInN1cHBvcnQiLCJjaGVja0Nsb25lIiwicmNoZWNrZWQiLCJfZXZhbFVybCIsInJjbGVhblNjcmlwdCIsImN1ckNTUyIsIndpZHRoIiwibWluV2lkdGgiLCJtYXhXaWR0aCIsImdldFN0eWxlcyIsImdldFByb3BlcnR5VmFsdWUiLCJwaXhlbE1hcmdpblJpZ2h0Iiwicm51bW5vbnB4Iiwicm1hcmdpbiIsImFkZEdldEhvb2tJZiIsImNvbmRpdGlvbkZuIiwiaG9va0ZuIiwidmVuZG9yUHJvcE5hbWUiLCJlbXB0eVN0eWxlIiwiY2FwTmFtZSIsImNzc1ByZWZpeGVzIiwic2V0UG9zaXRpdmVOdW1iZXIiLCJhdWdtZW50V2lkdGhPckhlaWdodCIsImlzQm9yZGVyQm94Iiwic3R5bGVzIiwiY3NzRXhwYW5kIiwiZ2V0V2lkdGhPckhlaWdodCIsInZhbHVlSXNCb3JkZXJCb3giLCJnZXRDbGllbnRSZWN0cyIsImJveFNpemluZ1JlbGlhYmxlIiwiVHdlZW4iLCJlYXNpbmciLCJ0aW1lcklkIiwiZngiLCJ0aWNrIiwiY3JlYXRlRnhOb3ciLCJmeE5vdyIsImdlbkZ4IiwiaW5jbHVkZVdpZHRoIiwiaGVpZ2h0Iiwib3BhY2l0eSIsImNyZWF0ZVR3ZWVuIiwiQW5pbWF0aW9uIiwidHdlZW5lcnMiLCJkZWZhdWx0UHJlZmlsdGVyIiwicHJvcHMiLCJvcHRzIiwidG9nZ2xlIiwib2xkZmlyZSIsInByb3BUd2VlbiIsInJlc3RvcmVEaXNwbGF5IiwiaXNCb3giLCJhbmltIiwib3JpZyIsImRhdGFTaG93IiwiX3F1ZXVlSG9va3MiLCJ1bnF1ZXVlZCIsImZpcmUiLCJhbHdheXMiLCJyZnh0eXBlcyIsImlzRW1wdHlPYmplY3QiLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJwcm9wRmlsdGVyIiwic3BlY2lhbEVhc2luZyIsImNhbWVsQ2FzZSIsImNzc0hvb2tzIiwiZXhwYW5kIiwic3RvcHBlZCIsInByZWZpbHRlcnMiLCJjdXJyZW50VGltZSIsInJlbWFpbmluZyIsInN0YXJ0VGltZSIsInBlcmNlbnQiLCJ0d2VlbnMiLCJub3RpZnlXaXRoIiwicmVzb2x2ZVdpdGgiLCJvcmlnaW5hbFByb3BlcnRpZXMiLCJvcmlnaW5hbE9wdGlvbnMiLCJzdG9wIiwiZ290b0VuZCIsInJlamVjdFdpdGgiLCJwcm94eSIsInN0cmlwQW5kQ29sbGFwc2UiLCJnZXRDbGFzcyIsImJ1aWxkUGFyYW1zIiwidHJhZGl0aW9uYWwiLCJyYnJhY2tldCIsImFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyIsInN0cnVjdHVyZSIsImRhdGFUeXBlRXhwcmVzc2lvbiIsImRhdGFUeXBlIiwiZGF0YVR5cGVzIiwiaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMiLCJqcVhIUiIsImluc3BlY3RlZCIsInByZWZpbHRlck9yRmFjdG9yeSIsImRhdGFUeXBlT3JUcmFuc3BvcnQiLCJzZWVraW5nVHJhbnNwb3J0IiwidHJhbnNwb3J0cyIsImFqYXhFeHRlbmQiLCJmbGF0T3B0aW9ucyIsImFqYXhTZXR0aW5ncyIsImFqYXhIYW5kbGVSZXNwb25zZXMiLCJyZXNwb25zZXMiLCJjdCIsImZpbmFsRGF0YVR5cGUiLCJmaXJzdERhdGFUeXBlIiwibWltZVR5cGUiLCJnZXRSZXNwb25zZUhlYWRlciIsImNvbnZlcnRlcnMiLCJhamF4Q29udmVydCIsImNvbnYyIiwiY29udiIsInByZXYiLCJyZXNwb25zZUZpZWxkcyIsImRhdGFGaWx0ZXIiLCJ0aHJvd3MiLCJnZXRXaW5kb3ciLCJkZWZhdWx0VmlldyIsImdldFByb3RvIiwiY2xhc3MydHlwZSIsImhhc093biIsImZuVG9TdHJpbmciLCJPYmplY3RGdW5jdGlvblN0cmluZyIsInJ0cmltIiwicm1zUHJlZml4IiwicmRhc2hBbHBoYSIsImZjYW1lbENhc2UiLCJqcXVlcnkiLCJwdXNoU3RhY2siLCJwcmV2T2JqZWN0IiwiY29weUlzQXJyYXkiLCJpc1BsYWluT2JqZWN0IiwicmFuZG9tIiwiaXNSZWFkeSIsImlzTnVtZXJpYyIsIkN0b3IiLCJnbG9iYWxFdmFsIiwibWFrZUFycmF5IiwiaW52ZXJ0IiwiY2FsbGJhY2tJbnZlcnNlIiwiY2FsbGJhY2tFeHBlY3QiLCJTeW1ib2wiLCJTaXp6bGUiLCJzZWVkIiwibmlkIiwibmV3U2VsZWN0b3IiLCJuZXdDb250ZXh0IiwicHJlZmVycmVkRG9jIiwic2V0RG9jdW1lbnQiLCJkb2N1bWVudElzSFRNTCIsInJxdWlja0V4cHIiLCJxc2EiLCJjb21waWxlckNhY2hlIiwicmJ1Z2d5UVNBIiwicmNzc2VzY2FwZSIsImZjc3Nlc2NhcGUiLCJ0b2tlbml6ZSIsInRvU2VsZWN0b3IiLCJyc2libGluZyIsInRlc3RDb250ZXh0IiwicXNhRXJyb3IiLCJjcmVhdGVDYWNoZSIsIkV4cHIiLCJjYWNoZUxlbmd0aCIsIm1hcmtGdW5jdGlvbiIsImFzc2VydCIsImFkZEhhbmRsZSIsImF0dHJIYW5kbGUiLCJzaWJsaW5nQ2hlY2siLCJzb3VyY2VJbmRleCIsImNyZWF0ZUlucHV0UHNldWRvIiwiY3JlYXRlQnV0dG9uUHNldWRvIiwiY3JlYXRlRGlzYWJsZWRQc2V1ZG8iLCJpc0Rpc2FibGVkIiwiZGlzYWJsZWRBbmNlc3RvciIsImNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8iLCJtYXRjaEluZGV4ZXMiLCJzZXRGaWx0ZXJzIiwiYWRkQ29tYmluYXRvciIsImNvbWJpbmF0b3IiLCJjaGVja05vbkVsZW1lbnRzIiwiZG9uZU5hbWUiLCJ4bWwiLCJvbGRDYWNoZSIsInVuaXF1ZUNhY2hlIiwib3V0ZXJDYWNoZSIsIm5ld0NhY2hlIiwiZGlycnVucyIsInVuaXF1ZUlEIiwiZWxlbWVudE1hdGNoZXIiLCJtdWx0aXBsZUNvbnRleHRzIiwiY29udGV4dHMiLCJjb25kZW5zZSIsInVubWF0Y2hlZCIsIm5ld1VubWF0Y2hlZCIsIm1hcHBlZCIsInNldE1hdGNoZXIiLCJwcmVGaWx0ZXIiLCJwb3N0RmlsdGVyIiwicG9zdEZpbmRlciIsInBvc3RTZWxlY3RvciIsInByZU1hcCIsInBvc3RNYXAiLCJwcmVleGlzdGluZyIsIm1hdGNoZXJJbiIsIm1hdGNoZXJPdXQiLCJtYXRjaGVyRnJvbVRva2VucyIsImNoZWNrQ29udGV4dCIsImxlYWRpbmdSZWxhdGl2ZSIsInJlbGF0aXZlIiwiaW1wbGljaXRSZWxhdGl2ZSIsIm1hdGNoQ29udGV4dCIsIm1hdGNoQW55Q29udGV4dCIsIm91dGVybW9zdENvbnRleHQiLCJtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMiLCJlbGVtZW50TWF0Y2hlcnMiLCJzZXRNYXRjaGVycyIsImJ5U2V0IiwiYnlFbGVtZW50Iiwic3VwZXJNYXRjaGVyIiwib3V0ZXJtb3N0IiwibWF0Y2hlZENvdW50Iiwic2V0TWF0Y2hlZCIsImNvbnRleHRCYWNrdXAiLCJkaXJydW5zVW5pcXVlIiwidW5pcXVlU29ydCIsImlzWE1MIiwic29ydElucHV0IiwiaGFzRHVwbGljYXRlIiwiZG9jRWxlbSIsInJidWdneU1hdGNoZXMiLCJjbGFzc0NhY2hlIiwidG9rZW5DYWNoZSIsInNvcnRPcmRlciIsInB1c2hfbmF0aXZlIiwiYm9vbGVhbnMiLCJ3aGl0ZXNwYWNlIiwicHNldWRvcyIsInJ3aGl0ZXNwYWNlIiwicmNvbW1hIiwicmNvbWJpbmF0b3JzIiwicmF0dHJpYnV0ZVF1b3RlcyIsInJwc2V1ZG8iLCJyaWRlbnRpZmllciIsIm1hdGNoRXhwciIsIklEIiwiQ0xBU1MiLCJUQUciLCJBVFRSIiwiUFNFVURPIiwiQ0hJTEQiLCJib29sIiwibmVlZHNDb250ZXh0IiwicmlucHV0cyIsInJoZWFkZXIiLCJybmF0aXZlIiwicnVuZXNjYXBlIiwiZnVuZXNjYXBlIiwiZXNjYXBlZCIsImVzY2FwZWRXaGl0ZXNwYWNlIiwiaGlnaCIsImFzQ29kZVBvaW50IiwidW5sb2FkSGFuZGxlciIsImVscyIsImhhc0NvbXBhcmUiLCJzdWJXaW5kb3ciLCJhdHRhY2hFdmVudCIsImdldEJ5SWQiLCJhdHRySWQiLCJnZXRBdHRyaWJ1dGVOb2RlIiwibWF0Y2hlc1NlbGVjdG9yIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwibW96TWF0Y2hlc1NlbGVjdG9yIiwib01hdGNoZXNTZWxlY3RvciIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwiZGlzY29ubmVjdGVkTWF0Y2giLCJhZG93biIsImJ1cCIsInNvcnREZXRhY2hlZCIsImF1cCIsImFwIiwiYnAiLCJzcGVjaWZpZWQiLCJzZWwiLCJkdXBsaWNhdGVzIiwiZGV0ZWN0RHVwbGljYXRlcyIsInNvcnRTdGFibGUiLCJzZWxlY3RvcnMiLCJjcmVhdGVQc2V1ZG8iLCI+IiwiICIsIisiLCJ+IiwiZXhjZXNzIiwidW5xdW90ZWQiLCJub2RlTmFtZVNlbGVjdG9yIiwiY2hlY2siLCJzaW1wbGUiLCJmb3J3YXJkIiwib2ZUeXBlIiwibm9kZUluZGV4IiwidXNlQ2FjaGUiLCJwc2V1ZG8iLCJpbm5lclRleHQiLCJlbGVtTGFuZyIsImhhc0ZvY3VzIiwidGFiSW5kZXgiLCJldmVuIiwib2RkIiwibHQiLCJndCIsInBhc3N3b3JkIiwiaW1hZ2UiLCJwYXJzZU9ubHkiLCJzb0ZhciIsInByZUZpbHRlcnMiLCJjYWNoZWQiLCJ1bmlxdWUiLCJpc1hNTERvYyIsImVzY2FwZVNlbGVjdG9yIiwidW50aWwiLCJ0cnVuY2F0ZSIsInNpYmxpbmdzIiwicm5lZWRzQ29udGV4dCIsInJzaW5nbGVUYWciLCJyb290alF1ZXJ5IiwicGFyc2VIVE1MIiwicnBhcmVudHNwcmV2IiwiZ3VhcmFudGVlZFVuaXF1ZSIsInRhcmdldHMiLCJjbG9zZXN0IiwicHJldkFsbCIsImFkZEJhY2siLCJwYXJlbnRzIiwicGFyZW50c1VudGlsIiwibmV4dEFsbCIsIm5leHRVbnRpbCIsInByZXZVbnRpbCIsIkNhbGxiYWNrcyIsImZpcmluZyIsIm1lbW9yeSIsImZpcmVkIiwibG9ja2VkIiwiZmlyaW5nSW5kZXgiLCJvbmNlIiwic3RvcE9uRmFsc2UiLCJkaXNhYmxlIiwibG9jayIsImZpcmVXaXRoIiwidHVwbGVzIiwicGlwZSIsIm5ld0RlZmVyIiwidHVwbGUiLCJyZXR1cm5lZCIsInNwZWNpYWwiLCJtaWdodFRocm93IiwibWF4RGVwdGgiLCJwcm9jZXNzIiwiZXhjZXB0aW9uSG9vayIsInN0YWNrVHJhY2UiLCJnZXRTdGFja0hvb2siLCJzdGF0ZVN0cmluZyIsInNpbmdsZVZhbHVlIiwicmVzb2x2ZUNvbnRleHRzIiwicmVzb2x2ZVZhbHVlcyIsIm1hc3RlciIsInVwZGF0ZUZ1bmMiLCJyZXJyb3JOYW1lcyIsInJlYWR5RXhjZXB0aW9uIiwicmVhZHlMaXN0IiwicmVhZHlXYWl0IiwiaG9sZFJlYWR5IiwiaG9sZCIsIndhaXQiLCJkb1Njcm9sbCIsImNoYWluYWJsZSIsImVtcHR5R2V0IiwicmF3IiwiYnVsayIsImFjY2VwdERhdGEiLCJvd25lciIsImNvbmZpZ3VyYWJsZSIsIl9yZW1vdmVEYXRhIiwiZGVxdWV1ZSIsInN0YXJ0TGVuZ3RoIiwiY2xlYXJRdWV1ZSIsInBudW0iLCJzd2FwIiwiaGlkZSIsImRpdiIsIm5vQ2xvbmVDaGVja2VkIiwicmtleUV2ZW50Iiwicm1vdXNlRXZlbnQiLCJydHlwZW5hbWVzcGFjZSIsImhhbmRsZU9iakluIiwiZXZlbnRIYW5kbGUiLCJoYW5kbGVPYmoiLCJoYW5kbGVycyIsIm5hbWVzcGFjZXMiLCJvcmlnVHlwZSIsImVsZW1EYXRhIiwidHJpZ2dlcmVkIiwiZGlzcGF0Y2giLCJkZWxlZ2F0ZVR5cGUiLCJiaW5kVHlwZSIsImRlbGVnYXRlQ291bnQiLCJzZXR1cCIsIm1hcHBlZFR5cGVzIiwib3JpZ0NvdW50IiwidGVhcmRvd24iLCJyZW1vdmVFdmVudCIsIm5hdGl2ZUV2ZW50IiwiaGFuZGxlclF1ZXVlIiwiZml4IiwiZGVsZWdhdGVUYXJnZXQiLCJwcmVEaXNwYXRjaCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiY3VycmVudFRhcmdldCIsInJuYW1lc3BhY2UiLCJwb3N0RGlzcGF0Y2giLCJtYXRjaGVkSGFuZGxlcnMiLCJtYXRjaGVkU2VsZWN0b3JzIiwiYWRkUHJvcCIsImhvb2siLCJFdmVudCIsIm9yaWdpbmFsRXZlbnQiLCJ3cml0YWJsZSIsImxvYWQiLCJub0J1YmJsZSIsImNsaWNrIiwiYmVmb3JldW5sb2FkIiwicmV0dXJuVmFsdWUiLCJ0aW1lU3RhbXAiLCJpc1NpbXVsYXRlZCIsImFsdEtleSIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY2hhbmdlZFRvdWNoZXMiLCJkZXRhaWwiLCJldmVudFBoYXNlIiwicGFnZVgiLCJwYWdlWSIsInZpZXciLCJjaGFyIiwiY2hhckNvZGUiLCJidXR0b25zIiwiY2xpZW50WCIsImNsaWVudFkiLCJvZmZzZXRYIiwib2Zmc2V0WSIsInBvaW50ZXJJZCIsInBvaW50ZXJUeXBlIiwic2NyZWVuWCIsInNjcmVlblkiLCJ0YXJnZXRUb3VjaGVzIiwidG9FbGVtZW50IiwidG91Y2hlcyIsInBvaW50ZXJlbnRlciIsInBvaW50ZXJsZWF2ZSIsInJ4aHRtbFRhZyIsInJub0lubmVyaHRtbCIsImRhdGFBbmRFdmVudHMiLCJkZWVwRGF0YUFuZEV2ZW50cyIsInNyY0VsZW1lbnRzIiwiZGVzdEVsZW1lbnRzIiwiaW5QYWdlIiwiYmVmb3JlIiwiYXBwZW5kVG8iLCJwcmVwZW5kVG8iLCJpbnNlcnRBZnRlciIsInJlcGxhY2VBbGwiLCJvcmlnaW5hbCIsImluc2VydCIsIm9wZW5lciIsImNvbXB1dGVTdHlsZVRlc3RzIiwiY3NzVGV4dCIsImNvbnRhaW5lciIsImRpdlN0eWxlIiwicGl4ZWxQb3NpdGlvblZhbCIsInJlbGlhYmxlTWFyZ2luTGVmdFZhbCIsIm1hcmdpbkxlZnQiLCJib3hTaXppbmdSZWxpYWJsZVZhbCIsIm1hcmdpblJpZ2h0IiwicGl4ZWxNYXJnaW5SaWdodFZhbCIsImJhY2tncm91bmRDbGlwIiwiY2xlYXJDbG9uZVN0eWxlIiwicGl4ZWxQb3NpdGlvbiIsInJlbGlhYmxlTWFyZ2luTGVmdCIsInJkaXNwbGF5c3dhcCIsImNzc1Nob3ciLCJ2aXNpYmlsaXR5IiwiY3NzTm9ybWFsVHJhbnNmb3JtIiwibGV0dGVyU3BhY2luZyIsImZvbnRXZWlnaHQiLCJhbmltYXRpb25JdGVyYXRpb25Db3VudCIsImNvbHVtbkNvdW50IiwiZmlsbE9wYWNpdHkiLCJmbGV4R3JvdyIsImZsZXhTaHJpbmsiLCJsaW5lSGVpZ2h0Iiwib3JkZXIiLCJvcnBoYW5zIiwid2lkb3dzIiwiekluZGV4Iiwiem9vbSIsImNzc1Byb3BzIiwiZmxvYXQiLCJvcmlnTmFtZSIsIm1hcmdpbiIsInBhZGRpbmciLCJib3JkZXIiLCJleHBhbmRlZCIsInByb3BIb29rcyIsImVhc2VkIiwic2Nyb2xsVG9wIiwic2Nyb2xsTGVmdCIsImxpbmVhciIsInN3aW5nIiwiY29zIiwiUEkiLCJycnVuIiwiKiIsInR3ZWVuZXIiLCJwcmVmaWx0ZXIiLCJzcGVlZCIsIm9wdCIsInNwZWVkcyIsImZhZGVUbyIsIm9wdGFsbCIsImRvQW5pbWF0aW9uIiwiZmluaXNoIiwic3RvcFF1ZXVlIiwidGltZXJzIiwiY3NzRm4iLCJzbGlkZURvd24iLCJzbGlkZVVwIiwic2xpZGVUb2dnbGUiLCJmYWRlSW4iLCJmYWRlT3V0IiwiZmFkZVRvZ2dsZSIsInNsb3ciLCJmYXN0IiwiY2hlY2tPbiIsIm9wdFNlbGVjdGVkIiwicmFkaW9WYWx1ZSIsImJvb2xIb29rIiwiblR5cGUiLCJhdHRySG9va3MiLCJhdHRyTmFtZXMiLCJsb3dlcmNhc2VOYW1lIiwicmZvY3VzYWJsZSIsInJjbGlja2FibGUiLCJyZW1vdmVQcm9wIiwicHJvcEZpeCIsInRhYmluZGV4IiwiZm9yIiwiY3VyVmFsdWUiLCJmaW5hbFZhbHVlIiwic3RhdGVWYWwiLCJjbGFzc05hbWVzIiwicnJldHVybiIsInZhbEhvb2tzIiwib3B0aW9uU2V0IiwicmZvY3VzTW9ycGgiLCJvbmx5SGFuZGxlcnMiLCJidWJibGVUeXBlIiwib250eXBlIiwiZXZlbnRQYXRoIiwiaXNUcmlnZ2VyIiwicGFyZW50V2luZG93Iiwic2ltdWxhdGUiLCJob3ZlciIsImZuT3ZlciIsImZuT3V0IiwiZm9jdXNpbiIsImF0dGFjaGVzIiwibm9uY2UiLCJycXVlcnkiLCJwYXJzZVhNTCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsInJDUkxGIiwicnN1Ym1pdHRlclR5cGVzIiwicnN1Ym1pdHRhYmxlIiwidmFsdWVPckZ1bmN0aW9uIiwic2VyaWFsaXplQXJyYXkiLCJyMjAiLCJyaGFzaCIsInJhbnRpQ2FjaGUiLCJyaGVhZGVycyIsInJsb2NhbFByb3RvY29sIiwicm5vQ29udGVudCIsInJwcm90b2NvbCIsImFsbFR5cGVzIiwib3JpZ2luQW5jaG9yIiwibGFzdE1vZGlmaWVkIiwiZXRhZyIsInByb2Nlc3NEYXRhIiwiYWNjZXB0cyIsIiogdGV4dCIsInRleHQgaHRtbCIsInRleHQganNvbiIsInRleHQgeG1sIiwiYWpheFNldHVwIiwiYWpheFByZWZpbHRlciIsImFqYXhUcmFuc3BvcnQiLCJhamF4IiwibmF0aXZlU3RhdHVzVGV4dCIsIm1vZGlmaWVkIiwidGltZW91dFRpbWVyIiwidHJhbnNwb3J0IiwicmVzcG9uc2VIZWFkZXJzU3RyaW5nIiwiaWZNb2RpZmllZCIsImNhY2hlVVJMIiwiY2FsbGJhY2tDb250ZXh0Iiwic3RhdHVzQ29kZSIsImZpcmVHbG9iYWxzIiwiZ2xvYmFsRXZlbnRDb250ZXh0IiwiY29tcGxldGVEZWZlcnJlZCIsInJlc3BvbnNlSGVhZGVycyIsInVybEFuY2hvciIsInVuY2FjaGVkIiwicmVxdWVzdEhlYWRlcnMiLCJyZXF1ZXN0SGVhZGVyc05hbWVzIiwic3RyQWJvcnQiLCJvdmVycmlkZU1pbWVUeXBlIiwiZmluYWxUZXh0IiwiY3Jvc3NEb21haW4iLCJoYXNDb250ZW50IiwiYmVmb3JlU2VuZCIsImdldEpTT04iLCJnZXRTY3JpcHQiLCJ3cmFwQWxsIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJ3cmFwSW5uZXIiLCJ1bndyYXAiLCJ2aXNpYmxlIiwib2Zmc2V0SGVpZ2h0IiwieGhyU3VjY2Vzc1N0YXR1cyIsIjAiLCIxMjIzIiwieGhyU3VwcG9ydGVkIiwiY29ycyIsImVycm9yQ2FsbGJhY2siLCJ1c2VybmFtZSIsInhockZpZWxkcyIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsImJpbmFyeSIsInRleHQgc2NyaXB0IiwiY2hhcnNldCIsInNjcmlwdENoYXJzZXQiLCJldnQiLCJvbGRDYWxsYmFja3MiLCJyanNvbnAiLCJqc29ucCIsImpzb25wQ2FsbGJhY2siLCJvcmlnaW5hbFNldHRpbmdzIiwiY2FsbGJhY2tOYW1lIiwib3ZlcndyaXR0ZW4iLCJyZXNwb25zZUNvbnRhaW5lciIsImpzb25Qcm9wIiwiY3JlYXRlSFRNTERvY3VtZW50IiwiaW1wbGVtZW50YXRpb24iLCJrZWVwU2NyaXB0cyIsImFuaW1hdGVkIiwic2V0T2Zmc2V0IiwiY3VyUG9zaXRpb24iLCJjdXJMZWZ0IiwiY3VyQ1NTVG9wIiwiY3VyVG9wIiwiY3VyT2Zmc2V0IiwiY3VyQ1NTTGVmdCIsImNhbGN1bGF0ZVBvc2l0aW9uIiwiY3VyRWxlbSIsInVzaW5nIiwicmVjdCIsInBhZ2VZT2Zmc2V0IiwiY2xpZW50VG9wIiwicGFnZVhPZmZzZXQiLCJjbGllbnRMZWZ0Iiwib2Zmc2V0UGFyZW50IiwicGFyZW50T2Zmc2V0IiwiSGVpZ2h0IiwiV2lkdGgiLCIiLCJkZWZhdWx0RXh0cmEiLCJmdW5jTmFtZSIsInVuZGVsZWdhdGUiLCJwYXJzZUpTT04iLCJfalF1ZXJ5IiwiXyQiLCJub0NvbmZsaWN0IiwiU3Bpbm5lciIsImNyZWF0ZUVsIiwiaW5zIiwiYWRkQW5pbWF0aW9uIiwiYWxwaGEiLCJ0cmFpbCIsImxpbmVzIiwieiIsInVzZUNzc0FuaW1hdGlvbnMiLCJzaGVldCIsImluc2VydFJ1bGUiLCJjc3NSdWxlcyIsInZlbmRvciIsInBwIiwiZGVmIiwiZ2V0Q29sb3IiLCJjb2xvciIsImluaXRWTUwiLCJ2bWwiLCJhZGRSdWxlIiwiZ3JwIiwiY29vcmRzaXplIiwiY29vcmRvcmlnaW4iLCJzZWciLCJkeCIsInJvdGF0aW9uIiwiYXJjc2l6ZSIsImNvcm5lcnMiLCJyYWRpdXMiLCJzaGFkb3ciLCJyb3RhdGUiLCJmcHMiLCJod2FjY2VsIiwic3BpbiIsIm9zdGVwIiwiYXN0ZXAiLCJmaWxsIiwiYmFja2dyb3VuZCIsImJveFNoYWRvdyIsInRyYW5zZm9ybU9yaWdpbiIsInRyYW5zZm9ybSIsImJvcmRlclJhZGl1cyIsInN0eWxlU2hlZXQiLCJwcm9iZSIsImJlaGF2aW9yIiwiYWRqIiwiZDNfZG9jdW1lbnRFbGVtZW50IiwiZDNfd2luZG93IiwiZDNfYXNjZW5kaW5nIiwiZDNfbnVtYmVyIiwiZDNfbnVtZXJpYyIsImQzX2Jpc2VjdG9yIiwibG8iLCJoaSIsIm1pZCIsImQzX3RyYW5zcG9zZUxlbmd0aCIsImQzX3JhbmdlX2ludGVnZXJTY2FsZSIsImQzX2NsYXNzIiwiZDNfTWFwIiwiZDNfbWFwX2VzY2FwZSIsImQzX21hcF9wcm90byIsImQzX21hcF96ZXJvIiwiZDNfbWFwX3VuZXNjYXBlIiwiZDNfbWFwX2hhcyIsImQzX21hcF9yZW1vdmUiLCJkM19tYXBfa2V5cyIsImQzX21hcF9zaXplIiwiZDNfbWFwX2VtcHR5IiwiZDNfU2V0IiwiZDNfaWRlbnRpdHkiLCJkM19yZWJpbmQiLCJkM192ZW5kb3JTeW1ib2wiLCJkM192ZW5kb3JQcmVmaXhlcyIsInByZWZpeE5hbWUiLCJkM19ub29wIiwiZDNfZGlzcGF0Y2giLCJkM19kaXNwYXRjaF9ldmVudCIsImxpc3RlbmVyQnlOYW1lIiwiZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCIsImQzIiwiZDNfZXZlbnRTb3VyY2UiLCJzb3VyY2VFdmVudCIsImQzX2V2ZW50RGlzcGF0Y2giLCJvZiIsInRoaXoiLCJhcmd1bWVudHoiLCJlMCIsImQzX3NlbGVjdGlvbiIsImQzX3N1YmNsYXNzIiwiZDNfc2VsZWN0aW9uUHJvdG90eXBlIiwiZDNfc2VsZWN0aW9uX3NlbGVjdG9yIiwiZDNfc2VsZWN0IiwiZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsIiwiZDNfc2VsZWN0QWxsIiwiZDNfc2VsZWN0aW9uX2F0dHIiLCJhdHRyTnVsbCIsImF0dHJOdWxsTlMiLCJyZW1vdmVBdHRyaWJ1dGVOUyIsInNwYWNlIiwiYXR0ckNvbnN0YW50IiwiYXR0ckNvbnN0YW50TlMiLCJzZXRBdHRyaWJ1dGVOUyIsImF0dHJGdW5jdGlvbiIsImF0dHJGdW5jdGlvbk5TIiwibnMiLCJxdWFsaWZ5IiwiZDNfY29sbGFwc2UiLCJkM19zZWxlY3Rpb25fY2xhc3NlZFJlIiwicmVxdW90ZSIsImQzX3NlbGVjdGlvbl9jbGFzc2VzIiwiZDNfc2VsZWN0aW9uX2NsYXNzZWQiLCJjbGFzc2VkQ29uc3RhbnQiLCJjbGFzc2VkRnVuY3Rpb24iLCJkM19zZWxlY3Rpb25fY2xhc3NlZE5hbWUiLCJjbGFzc0xpc3QiLCJkM19zZWxlY3Rpb25fc3R5bGUiLCJzdHlsZU51bGwiLCJyZW1vdmVQcm9wZXJ0eSIsInN0eWxlQ29uc3RhbnQiLCJzZXRQcm9wZXJ0eSIsInN0eWxlRnVuY3Rpb24iLCJkM19zZWxlY3Rpb25fcHJvcGVydHkiLCJwcm9wZXJ0eU51bGwiLCJwcm9wZXJ0eUNvbnN0YW50IiwicHJvcGVydHlGdW5jdGlvbiIsImQzX3NlbGVjdGlvbl9jcmVhdG9yIiwibmFtZXNwYWNlVVJJIiwiZDNfbnNYaHRtbCIsImNyZWF0ZUVsZW1lbnROUyIsImNyZWF0ZU5TIiwiZDNfc2VsZWN0aW9uUmVtb3ZlIiwiZDNfc2VsZWN0aW9uX2RhdGFOb2RlIiwiX19kYXRhX18iLCJkM19zZWxlY3Rpb25fZmlsdGVyIiwiZDNfc2VsZWN0TWF0Y2hlcyIsImQzX3NlbGVjdGlvbl9zb3J0Q29tcGFyYXRvciIsImQzX3NlbGVjdGlvbl9lYWNoIiwiZDNfc2VsZWN0aW9uX2VudGVyIiwiZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlIiwiZDNfc2VsZWN0aW9uX2VudGVySW5zZXJ0QmVmb3JlIiwiaTAiLCJqMCIsInVwZGF0ZSIsImQzX3NlbGVjdGlvbl9vbiIsImNhcHR1cmUiLCJvblJlbW92ZSIsIm9uQWRkIiwiZDNfYXJyYXkiLCJkM19zZWxlY3Rpb25fb25MaXN0ZW5lciIsImQzX3NlbGVjdGlvbl9vbkZpbHRlcnMiLCJkM19zZWxlY3Rpb25fb25GaWx0ZXIiLCJkM19ldmVudF9kcmFnU3VwcHJlc3MiLCJkM19ldmVudF9kcmFnSWQiLCJkM19ldmVudF9kcmFnU2VsZWN0Iiwic3VwcHJlc3NDbGljayIsImQzX21vdXNlUG9pbnQiLCJzdmciLCJvd25lclNWR0VsZW1lbnQiLCJjcmVhdGVTVkdQb2ludCIsInBvaW50IiwiZDNfbW91c2VfYnVnNDQwODMiLCJzY3JvbGxYIiwic2Nyb2xsWSIsImN0bSIsImdldFNjcmVlbkNUTSIsIm1hdHJpeFRyYW5zZm9ybSIsImludmVyc2UiLCJkM19iZWhhdmlvcl9kcmFnVG91Y2hJZCIsImQzX3NnbiIsImQzX2Nyb3NzMmQiLCJkM19hY29zIiwiz4AiLCJhY29zIiwiZDNfYXNpbiIsImhhbGbPgCIsImFzaW4iLCJkM19zaW5oIiwiZDNfY29zaCIsImQzX3RhbmgiLCJkM19oYXZlcnNpbiIsInNpbiIsImQzX2NvbG9yIiwiZDNfaHNsIiwiZDNfcmdiX3BhcnNlIiwiZDNfcmdiX2hzbCIsImQzX2hzbF9yZ2IiLCJtMSIsIm0yIiwidnYiLCJkM19yZ2IiLCJkM19oY2wiLCJkM19sYWIiLCJkM19sYWJfaGNsIiwiZDNfcmdiX2xhYiIsInJnYiIsImQzX2hjbF9sYWIiLCJkM19yYWRpYW5zIiwiZDNfbGFiX3JnYiIsImQzX2xhYl94eXoiLCJkM19sYWJfWCIsImQzX2xhYl9ZIiwiZDNfbGFiX1oiLCJkM194eXpfcmdiIiwiYXRhbjIiLCJkM19kZWdyZWVzIiwic3FydCIsImQzX3h5el9sYWIiLCJkM19yZ2JOdW1iZXIiLCJkM19yZ2JTdHJpbmciLCJkM19yZ2JfaGV4IiwiaHNsIiwiZDNfcmdiX3BhcnNlTnVtYmVyIiwiZDNfcmdiX25hbWVzIiwiZDNfcmdiX3h5eiIsImQzX2Z1bmN0b3IiLCJkM194aHJUeXBlIiwiZDNfeGhyIiwicmVzcG9uZCIsImQzX3hockhhc1Jlc3BvbnNlIiwiWERvbWFpblJlcXVlc3QiLCJvbnByb2dyZXNzIiwiYmVmb3Jlc2VuZCIsInJlYmluZCIsImQzX3hocl9maXhDYWxsYmFjayIsImQzX3RpbWVyIiwiZDNfdGltZXJfcXVldWVUYWlsIiwiZDNfdGltZXJfcXVldWVIZWFkIiwiZDNfdGltZXJfaW50ZXJ2YWwiLCJkM190aW1lcl90aW1lb3V0IiwiZDNfdGltZXJfZnJhbWUiLCJkM190aW1lcl9zdGVwIiwiZDNfdGltZXJfbWFyayIsImQzX3RpbWVyX3N3ZWVwIiwidDAiLCJkM19mb3JtYXRfcHJlY2lzaW9uIiwiTE4xMCIsImQzX2Zvcm1hdFByZWZpeCIsInN5bWJvbCIsImQzX2xvY2FsZV9udW1iZXJGb3JtYXQiLCJsb2NhbGVfZGVjaW1hbCIsImRlY2ltYWwiLCJsb2NhbGVfdGhvdXNhbmRzIiwidGhvdXNhbmRzIiwibG9jYWxlX2dyb3VwaW5nIiwiZ3JvdXBpbmciLCJsb2NhbGVfY3VycmVuY3kiLCJjdXJyZW5jeSIsImZvcm1hdEdyb3VwIiwic3BlY2lmaWVyIiwiZDNfZm9ybWF0X3JlIiwiYWxpZ24iLCJ6ZmlsbCIsImNvbW1hIiwicHJlY2lzaW9uIiwiaW50ZWdlciIsImQzX2Zvcm1hdF90eXBlcyIsImQzX2Zvcm1hdF90eXBlRGVmYXVsdCIsInpjb21tYSIsImZ1bGxTdWZmaXgiLCJuZWdhdGl2ZSIsImZvcm1hdFByZWZpeCIsImQzX2RhdGVfdXRjIiwiZDNfdGltZV9pbnRlcnZhbCIsImQwIiwiZDEiLCJkM19kYXRlIiwiZHQiLCJ0aW1lcyIsInJhbmdlX3V0YyIsImQzX3RpbWVfaW50ZXJ2YWxfdXRjIiwiZDNfbG9jYWxlX3RpbWVGb3JtYXQiLCJkM190aW1lX2Zvcm1hdCIsImQzX3RpbWVfZm9ybWF0UGFkcyIsImQzX3RpbWVfZm9ybWF0cyIsIlMiLCJkM190aW1lX3BhcnNlIiwibG9jYWxaIiwiVSIsImQzX3RpbWVfcGFyc2VycyIsImQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2IiwiZDNfdGltZV9kYXlBYmJyZXZSZSIsImQzX3RpbWVfZGF5QWJicmV2TG9va3VwIiwiZDNfdGltZV9wYXJzZVdlZWtkYXkiLCJkM190aW1lX2RheVJlIiwiZDNfdGltZV9kYXlMb29rdXAiLCJkM190aW1lX3BhcnNlTW9udGhBYmJyZXYiLCJkM190aW1lX21vbnRoQWJicmV2UmUiLCJkM190aW1lX21vbnRoQWJicmV2TG9va3VwIiwiZDNfdGltZV9wYXJzZU1vbnRoIiwiZDNfdGltZV9tb250aFJlIiwiZDNfdGltZV9tb250aExvb2t1cCIsImQzX3RpbWVfcGFyc2VMb2NhbGVGdWxsIiwiZDNfdGltZV9wYXJzZUxvY2FsZURhdGUiLCJkM190aW1lX3BhcnNlTG9jYWxlVGltZSIsIlgiLCJkM190aW1lX3BhcnNlQW1QbSIsImQzX3RpbWVfcGVyaW9kTG9va3VwIiwibG9jYWxlX2RhdGVUaW1lIiwiZGF0ZVRpbWUiLCJsb2NhbGVfZGF0ZSIsImxvY2FsZV90aW1lIiwibG9jYWxlX3BlcmlvZHMiLCJwZXJpb2RzIiwibG9jYWxlX2RheXMiLCJsb2NhbGVfc2hvcnREYXlzIiwic2hvcnREYXlzIiwibG9jYWxlX21vbnRocyIsImxvY2FsZV9zaG9ydE1vbnRocyIsInNob3J0TW9udGhzIiwibXVsdGkiLCJkM190aW1lX2Zvcm1hdE11bHRpIiwiZDNfdGltZV9mb3JtYXRSZSIsImQzX3RpbWVfZm9ybWF0TG9va3VwIiwiQSIsIkIiLCJkM190aW1lX2Zvcm1hdFBhZCIsIkkiLCJkM190aW1lIiwic3VuZGF5T2ZZZWFyIiwibW9uZGF5T2ZZZWFyIiwiZDNfdGltZV96b25lIiwiJSIsImQzX3RpbWVfcGFyc2VEYXkiLCJkM190aW1lX3BhcnNlSG91cjI0IiwiZDNfdGltZV9wYXJzZURheU9mWWVhciIsImQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMiLCJkM190aW1lX3BhcnNlTW9udGhOdW1iZXIiLCJkM190aW1lX3BhcnNlTWludXRlcyIsImQzX3RpbWVfcGFyc2VTZWNvbmRzIiwiZDNfdGltZV9wYXJzZVdlZWtOdW1iZXJTdW5kYXkiLCJkM190aW1lX3BhcnNlV2Vla2RheU51bWJlciIsImQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyTW9uZGF5IiwiZDNfdGltZV9wYXJzZVllYXIiLCJkM190aW1lX3BhcnNlRnVsbFllYXIiLCJkM190aW1lX3BhcnNlWm9uZSIsImQzX3RpbWVfcGFyc2VMaXRlcmFsUGVyY2VudCIsImQzX3RpbWVfbnVtYmVyUmUiLCJkM190aW1lX2V4cGFuZFllYXIiLCJ6cyIsInpoIiwiem0iLCJkM190aW1lX3BlcmNlbnRSZSIsImQzX2FkZGVyIiwiZDNfYWRkZXJTdW0iLCJidiIsImF2IiwiZDNfZ2VvX3N0cmVhbUdlb21ldHJ5IiwiZ2VvbWV0cnkiLCJkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlIiwiZDNfZ2VvX3N0cmVhbUxpbmUiLCJjb29yZGluYXRlcyIsImNvb3JkaW5hdGUiLCJsaW5lU3RhcnQiLCJsaW5lRW5kIiwiZDNfZ2VvX3N0cmVhbVBvbHlnb24iLCJwb2x5Z29uU3RhcnQiLCJwb2x5Z29uRW5kIiwiZDNfZ2VvX2FyZWFSaW5nU3RhcnQiLCJuZXh0UG9pbnQiLCLOuyIsIs+GIiwiZM67IiwizrswIiwic2TOuyIsImFkzrsiLCJjb3PPhiIsInNpbs+GIiwic2luz4YwIiwiY29zz4YwIiwiZDNfZ2VvX2FyZWFSaW5nU3VtIiwizrswMCIsIs+GMDAiLCJkM19nZW9fYXJlYSIsImQzX2dlb19jYXJ0ZXNpYW4iLCJzcGhlcmljYWwiLCJkM19nZW9fY2FydGVzaWFuRG90IiwiZDNfZ2VvX2NhcnRlc2lhbkNyb3NzIiwiZDNfZ2VvX2NhcnRlc2lhbkFkZCIsImQzX2dlb19jYXJ0ZXNpYW5TY2FsZSIsInZlY3RvciIsImQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUiLCJkM19nZW9fc3BoZXJpY2FsIiwiY2FydGVzaWFuIiwiZDNfZ2VvX3NwaGVyaWNhbEVxdWFsIiwizrUiLCJkM19nZW9fY2VudHJvaWRQb2ludCIsImQzX2dlb19jZW50cm9pZFBvaW50WFlaIiwiZDNfZ2VvX2NlbnRyb2lkVzAiLCJkM19nZW9fY2VudHJvaWRYMCIsImQzX2dlb19jZW50cm9pZFkwIiwiZDNfZ2VvX2NlbnRyb2lkWjAiLCJkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQiLCJ5MCIsInowIiwieDAiLCJkM19nZW9fY2VudHJvaWRXMSIsImQzX2dlb19jZW50cm9pZFgxIiwiZDNfZ2VvX2NlbnRyb2lkWTEiLCJkM19nZW9fY2VudHJvaWRaMSIsImQzX2dlb19jZW50cm9pZCIsImQzX2dlb19jZW50cm9pZExpbmVFbmQiLCJkM19nZW9fY2VudHJvaWRSaW5nU3RhcnQiLCJjeCIsImN5IiwiY3oiLCJkM19nZW9fY2VudHJvaWRYMiIsImQzX2dlb19jZW50cm9pZFkyIiwiZDNfZ2VvX2NlbnRyb2lkWjIiLCJkM19nZW9fY29tcG9zZSIsImNvbXBvc2UiLCJkM190cnVlIiwiZDNfZ2VvX2NsaXBQb2x5Z29uIiwiY2xpcFN0YXJ0SW5zaWRlIiwiaW50ZXJwb2xhdGUiLCJzdWJqZWN0IiwiY2xpcCIsInNlZ21lbnQiLCJwMCIsImQzX2dlb19jbGlwUG9seWdvbkludGVyc2VjdGlvbiIsImQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhciIsInBvaW50cyIsImlzU3ViamVjdCIsImQzX2dlb19jbGlwIiwicG9pbnRWaXNpYmxlIiwiY2xpcExpbmUiLCJjbGlwU3RhcnQiLCJwb2ludExpbmUiLCJwb2ludFJpbmciLCJyaW5nIiwicmluZ0xpc3RlbmVyIiwicmluZ1N0YXJ0IiwicmluZ0VuZCIsImNsZWFuIiwicmluZ1NlZ21lbnRzIiwicG9seWdvbiIsInBvbHlnb25TdGFydGVkIiwiZDNfZ2VvX2NsaXBTZWdtZW50TGVuZ3RoMSIsInJvdGF0ZWRDbGlwU3RhcnQiLCJkM19nZW9fcG9pbnRJblBvbHlnb24iLCJkM19nZW9fY2xpcFNvcnQiLCJzcGhlcmUiLCJkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyIiwicmVqb2luIiwiZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5MaW5lIiwiz4YwIiwic867MCIsIs67MSIsIs+GMSIsInPOuzEiLCJkM19nZW9fY2xpcEFudGltZXJpZGlhbkludGVyc2VjdCIsImNvc8+GMSIsInNpbs67MF/OuzEiLCJhdGFuIiwiZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnBvbGF0ZSIsIm1lcmlkaWFuIiwicGFyYWxsZWwiLCJtZXJpZGlhbk5vcm1hbCIsInBvbGFyQW5nbGUiLCJ3aW5kaW5nIiwicG9pbnQwIiwiYW50aW1lcmlkaWFuIiwiz4QiLCJhcmMiLCJpbnRlcnNlY3Rpb24iLCLPhmFyYyIsImQzX2dlb19jbGlwQ2lyY2xlIiwiY3IiLCJjMCIsInYwIiwidjAwIiwicG9pbnQyIiwicG9pbnQxIiwic21hbGxSYWRpdXMiLCJpbnRlcnNlY3QiLCJub3RIZW1pc3BoZXJlIiwidHdvIiwicGEiLCJwYiIsIm4xIiwibjIiLCJuMm4yIiwibjFuMiIsImRldGVybWluYW50IiwiYzEiLCJjMiIsIm4xeG4yIiwidXUiLCLOtM67IiwicG9sYXIiLCJxMSIsImQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZSIsImQzX2dlb21fY2xpcExpbmUiLCJ4MSIsInkxIiwiYXgiLCJheSIsImJ4IiwiYnkiLCJkeSIsImQzX2dlb19jbGlwRXh0ZW50IiwiY29ybmVyIiwiY29tcGFyZVBvaW50cyIsImNhIiwiY2IiLCJpbnNpZGVQb2x5Z29uIiwid24iLCJsaW5lUG9pbnQiLCJ2XyIsInhfIiwieV8iLCJ4X18iLCJ5X18iLCJ2X18iLCJidWZmZXJMaXN0ZW5lciIsImQzX2dlb19jbGlwRXh0ZW50TUFYIiwibGlzdGVuZXJfIiwiaW5zaWRlIiwiZDNfZ2VvX2NvbmljIiwicHJvamVjdEF0IiwiZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yIiwicGFyYWxsZWxzIiwiZDNfZ2VvX2NvbmljRXF1YWxBcmVhIiwiz4EiLCJDIiwiz4EwIiwiz4EwX3kiLCJkM19nZW9fcGF0aEFyZWFSaW5nU3RhcnQiLCJkM19nZW9fcGF0aEFyZWFQb2x5Z29uIiwieDAwIiwieTAwIiwiZDNfZ2VvX3BhdGhBcmVhIiwiZDNfZ2VvX3BhdGhCb3VuZHNQb2ludCIsImQzX2dlb19wYXRoQm91bmRzWDAiLCJkM19nZW9fcGF0aEJvdW5kc1gxIiwiZDNfZ2VvX3BhdGhCb3VuZHNZMCIsImQzX2dlb19wYXRoQm91bmRzWTEiLCJkM19nZW9fcGF0aEJ1ZmZlciIsInBvaW50Q2lyY2xlIiwicG9pbnRMaW5lU3RhcnQiLCJzdHJlYW0iLCJsaW5lRW5kUG9seWdvbiIsImQzX2dlb19wYXRoQnVmZmVyQ2lyY2xlIiwicG9pbnRSYWRpdXMiLCJkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQiLCJkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0IiwiZDNfZ2VvX3BhdGhDZW50cm9pZCIsImQzX2dlb19wYXRoQ2VudHJvaWRMaW5lRW5kIiwiZDNfZ2VvX3BhdGhDZW50cm9pZFJpbmdTdGFydCIsImQzX2dlb19wYXRoQ29udGV4dCIsIm1vdmVUbyIsImxpbmVUbyIsImNsb3NlUGF0aCIsImQzX2dlb19yZXNhbXBsZSIsInByb2plY3QiLCJyZXNhbXBsZSIsInJlc2FtcGxlUmVjdXJzaXZlIiwicmVzYW1wbGVOb25lIiwiZDNfZ2VvX3RyYW5zZm9ybVBvaW50IiwicmVzYW1wbGVMaW5lVG8iLCJhMCIsImIwIiwicmluZ1BvaW50IiwiYTAwIiwiYjAwIiwiYzAwIiwiYjEiLCJkMiIsIs60MiIsIs+GMiIsIs67MiIsIngyIiwieTIiLCJkeDIiLCJkeTIiLCJkeiIsImNvc01pbkRpc3RhbmNlIiwiZDNfZ2VvX3BhdGhQcm9qZWN0U3RyZWFtIiwiZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zIiwiZDNfZ2VvX3RyYW5zZm9ybSIsImQzX2dlb19wcm9qZWN0aW9uIiwicHJvamVjdGlvbiIsInByb2plY3RSb3RhdGUiLCLOtHgiLCLOtHkiLCJkM19nZW9fcm90YXRpb24iLCLOtM+GIiwizrTOsyIsImNlbnRlciIsImludmFsaWRhdGUiLCJ2YWxpZCIsInByb2plY3RSZXNhbXBsZSIsInByZWNsaXAiLCJkM19nZW9fY2xpcEFudGltZXJpZGlhbiIsInBvc3RjbGlwIiwiY2xpcEFuZ2xlIiwiY2xpcEV4dGVudCIsInRyYW5zbGF0ZSIsImQzX2dlb19lcXVpcmVjdGFuZ3VsYXIiLCJkM19nZW9faWRlbnRpdHlSb3RhdGlvbiIsImQzX2dlb19yb3RhdGlvbs67IiwiZDNfZ2VvX3JvdGF0aW9uz4bOsyIsImQzX2dlb19mb3J3YXJkUm90YXRpb27OuyIsImNvc860z4YiLCJzaW7OtM+GIiwiY29zzrTOsyIsInNpbs60zrMiLCJzciIsImQzX2dlb19jaXJjbGVBbmdsZSIsImFuZ2xlIiwiZDNfZ2VvX2dyYXRpY3VsZVgiLCJkM19nZW9fZ3JhdGljdWxlWSIsImQzX3NvdXJjZSIsImQzX3RhcmdldCIsImQzX2dlb19pbnRlcnBvbGF0ZSIsImN5MCIsInN5MCIsImN5MSIsInN5MSIsImt4MCIsImt5MCIsImt4MSIsImt5MSIsImRpc3RhbmNlIiwiZDNfZ2VvX2xlbmd0aExpbmVTdGFydCIsImNvc86UzrsiLCJkM19nZW9fbGVuZ3RoU3VtIiwiZDNfZ2VvX2xlbmd0aCIsImQzX2dlb19hemltdXRoYWwiLCJhemltdXRoYWwiLCJjb3POuyIsInNpbmMiLCJjb3NjIiwiZDNfZ2VvX2NvbmljQ29uZm9ybWFsIiwiRiIsInRhbiIsImQzX2dlb19tZXJjYXRvciIsImQzX2dlb19jb25pY0VxdWlkaXN0YW50IiwiZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbiIsImNsaXBBdXRvIiwiZDNfZ2VvX3RyYW5zdmVyc2VNZXJjYXRvciIsImQzX2dlb21fcG9pbnRYIiwiZDNfZ2VvbV9wb2ludFkiLCJkM19nZW9tX2h1bGxVcHBlciIsImh1bGwiLCJocyIsImQzX2dlb21faHVsbE9yZGVyIiwiZDNfZ2VvbV9wb2x5Z29uSW5zaWRlIiwiZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0IiwieDMiLCJ4MjEiLCJ4NDMiLCJ5MyIsInkyMSIsInk0MyIsInVhIiwiZDNfZ2VvbV9wb2x5Z29uQ2xvc2VkIiwiZDNfZ2VvbV92b3Jvbm9pQmVhY2giLCJkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUiLCJlZGdlIiwic2l0ZSIsImNpcmNsZSIsImQzX2dlb21fdm9yb25vaUNyZWF0ZUJlYWNoIiwiYmVhY2giLCJkM19nZW9tX3Zvcm9ub2lCZWFjaFBvb2wiLCJkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaCIsImQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZSIsImQzX2dlb21fdm9yb25vaUJlYWNoZXMiLCJkM19nZW9tX3Zvcm9ub2lSZW1vdmVCZWFjaCIsInZlcnRleCIsIlAiLCJOIiwiZGlzYXBwZWFyaW5nIiwibEFyYyIsInJBcmMiLCJpQXJjIiwibkFyY3MiLCJkM19nZW9tX3Zvcm9ub2lTZXRFZGdlRW5kIiwiZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlRWRnZSIsImQzX2dlb21fdm9yb25vaUF0dGFjaENpcmNsZSIsImQzX2dlb21fdm9yb25vaUFkZEJlYWNoIiwiZHhsIiwiZHhyIiwiZGlyZWN0cml4IiwiZDNfZ2VvbV92b3Jvbm9pTGVmdEJyZWFrUG9pbnQiLCJkM19nZW9tX3Zvcm9ub2lSaWdodEJyZWFrUG9pbnQiLCJSIiwibmV3QXJjIiwibFNpdGUiLCJyU2l0ZSIsImhiIiwiaGMiLCJyZm9jeCIsInJmb2N5IiwicGJ5MiIsImxmb2N4IiwibGZvY3kiLCJwbGJ5MiIsImhsIiwiYWJ5MiIsImQzX2dlb21fdm9yb25vaUNlbGwiLCJlZGdlcyIsImQzX2dlb21fdm9yb25vaUNsb3NlQ2VsbHMiLCJleHRlbnQiLCJjZWxsIiwiaUhhbGZFZGdlIiwiaGFsZkVkZ2VzIiwibkhhbGZFZGdlcyIsImNlbGxzIiwiZDNfZ2VvbV92b3Jvbm9pQ2VsbHMiLCJpQ2VsbCIsInByZXBhcmUiLCJkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZSIsImQzX2dlb21fdm9yb25vaUNyZWF0ZUJvcmRlckVkZ2UiLCJkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZU9yZGVyIiwiZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlIiwiY1NpdGUiLCLOtTIiLCJoYSIsImQzX2dlb21fdm9yb25vaUNpcmNsZVBvb2wiLCJkM19nZW9tX3Zvcm9ub2lDaXJjbGVzIiwiZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGUiLCJkM19nZW9tX3Zvcm9ub2lDbGlwRWRnZXMiLCJkM19nZW9tX3Zvcm9ub2lFZGdlcyIsImQzX2dlb21fdm9yb25vaUNvbm5lY3RFZGdlIiwidmIiLCJmbSIsImZiIiwidmEiLCJseCIsImx5IiwicngiLCJyeSIsImZ5IiwiZDNfZ2VvbV92b3Jvbm9pRWRnZSIsImQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZSIsImQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCIsInRyZWUiLCJkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0IiwiZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tGaXJzdCIsImQzX2dlb21fdm9yb25vaSIsInNpdGVzIiwiYmJveCIsImQzX2dlb21fdm9yb25vaVZlcnRleE9yZGVyIiwiZGlhZ3JhbSIsImQzX2dlb21fdm9yb25vaVRyaWFuZ2xlQXJlYSIsImQzX2dlb21fcXVhZHRyZWVDb21wYXRYIiwiZDNfZ2VvbV9xdWFkdHJlZUNvbXBhdFkiLCJkM19nZW9tX3F1YWR0cmVlTm9kZSIsImxlYWYiLCJkM19nZW9tX3F1YWR0cmVlVmlzaXQiLCJzeCIsInN5IiwiZDNfZ2VvbV9xdWFkdHJlZUZpbmQiLCJjbG9zZXN0UG9pbnQiLCJtaW5EaXN0YW5jZTIiLCJkaXN0YW5jZTIiLCJ4bSIsInltIiwiYmVsb3ciLCJkM19pbnRlcnBvbGF0ZVJnYiIsImFyIiwiYWciLCJhYiIsImJyIiwiYmciLCJiYiIsImQzX2ludGVycG9sYXRlT2JqZWN0IiwiZDNfaW50ZXJwb2xhdGUiLCJkM19pbnRlcnBvbGF0ZU51bWJlciIsImQzX2ludGVycG9sYXRlU3RyaW5nIiwiYW0iLCJibSIsImJzIiwiYmkiLCJkM19pbnRlcnBvbGF0ZV9udW1iZXJBIiwiZDNfaW50ZXJwb2xhdGVfbnVtYmVyQiIsImludGVycG9sYXRvcnMiLCJkM19pbnRlcnBvbGF0ZUFycmF5IiwibmEiLCJuYiIsIm4wIiwiZDNfZWFzZV9jbGFtcCIsImQzX2Vhc2VfcmV2ZXJzZSIsImQzX2Vhc2VfcmVmbGVjdCIsImQzX2Vhc2VfcXVhZCIsImQzX2Vhc2VfY3ViaWMiLCJkM19lYXNlX2N1YmljSW5PdXQiLCJ0MyIsImQzX2Vhc2VfcG9seSIsImQzX2Vhc2Vfc2luIiwiZDNfZWFzZV9leHAiLCJkM19lYXNlX2NpcmNsZSIsImQzX2Vhc2VfZWxhc3RpYyIsImQzX2Vhc2VfYmFjayIsImQzX2Vhc2VfYm91bmNlIiwiZDNfaW50ZXJwb2xhdGVIY2wiLCJoY2wiLCJhaCIsImFjIiwiYWwiLCJiaCIsImJjIiwiYmwiLCJkM19pbnRlcnBvbGF0ZUhzbCIsImQzX2ludGVycG9sYXRlTGFiIiwibGFiIiwiYWEiLCJiYSIsImQzX2ludGVycG9sYXRlUm91bmQiLCJkM190cmFuc2Zvcm0iLCJyMCIsInIxIiwia3giLCJkM190cmFuc2Zvcm1Ob3JtYWxpemUiLCJreiIsImQzX3RyYW5zZm9ybURvdCIsImt5IiwiZDNfdHJhbnNmb3JtQ29tYmluZSIsInNrZXciLCJkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybVBvcCIsImQzX2ludGVycG9sYXRlVHJhbnNsYXRlIiwidGEiLCJ0YiIsImQzX2ludGVycG9sYXRlUm90YXRlIiwicmEiLCJyYiIsImQzX2ludGVycG9sYXRlU2tldyIsIndhIiwid2IiLCJkM19pbnRlcnBvbGF0ZVNjYWxlIiwia2EiLCJrYiIsImQzX2ludGVycG9sYXRlVHJhbnNmb3JtIiwiZDNfdW5pbnRlcnBvbGF0ZU51bWJlciIsImQzX3VuaW50ZXJwb2xhdGVDbGFtcCIsImQzX2xheW91dF9idW5kbGVQYXRoIiwibGNhIiwiZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3IiLCJkM19sYXlvdXRfYnVuZGxlQW5jZXN0b3JzIiwiYW5jZXN0b3JzIiwiYU5vZGVzIiwiYk5vZGVzIiwiYU5vZGUiLCJiTm9kZSIsInNoYXJlZE5vZGUiLCJkM19sYXlvdXRfZm9yY2VEcmFnc3RhcnQiLCJmaXhlZCIsImQzX2xheW91dF9mb3JjZURyYWdlbmQiLCJkM19sYXlvdXRfZm9yY2VNb3VzZW92ZXIiLCJweCIsInB5IiwiZDNfbGF5b3V0X2ZvcmNlTW91c2VvdXQiLCJkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlIiwicXVhZCIsImNoYXJnZXMiLCJjaGFyZ2UiLCJwb2ludENoYXJnZSIsImQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQiLCJoaWVyYXJjaHkiLCJsaW5rcyIsImQzX2xheW91dF9oaWVyYXJjaHlMaW5rcyIsImQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZSIsImQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyIiwibm9kZXMyIiwiZDNfbGF5b3V0X2hpZXJhcmNoeUNoaWxkcmVuIiwiZDNfbGF5b3V0X2hpZXJhcmNoeVZhbHVlIiwiZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQiLCJkM19sYXlvdXRfc3RhY2tYIiwiZDNfbGF5b3V0X3N0YWNrWSIsImQzX2xheW91dF9zdGFja091dCIsImQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdCIsImQzX2xheW91dF9zdGFja09mZnNldFplcm8iLCJkM19sYXlvdXRfc3RhY2tNYXhJbmRleCIsImQzX2xheW91dF9zdGFja1JlZHVjZVN1bSIsImQzX2xheW91dF9zdGFja1N1bSIsImQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzIiwiZDNfbGF5b3V0X2hpc3RvZ3JhbUJpbkZpeGVkIiwiTE4yIiwiZDNfbGF5b3V0X2hpc3RvZ3JhbVJhbmdlIiwiZDNfbGF5b3V0X3BhY2tTb3J0IiwiZDNfbGF5b3V0X3BhY2tJbnNlcnQiLCJfcGFja19uZXh0IiwiX3BhY2tfcHJldiIsImQzX2xheW91dF9wYWNrU3BsaWNlIiwiZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzIiwiZHIiLCJkM19sYXlvdXRfcGFja1NpYmxpbmdzIiwiYm91bmQiLCJ4TWluIiwieE1heCIsInlNaW4iLCJ5TWF4IiwiZDNfbGF5b3V0X3BhY2tMaW5rIiwiZDNfbGF5b3V0X3BhY2tQbGFjZSIsImlzZWN0IiwiczEiLCJzMiIsImQzX2xheW91dF9wYWNrVW5saW5rIiwiZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0iLCJkYiIsImRhIiwiZGMiLCJkM19sYXlvdXRfdHJlZVNlcGFyYXRpb24iLCJkM19sYXlvdXRfdHJlZUxlZnQiLCJkM19sYXlvdXRfdHJlZVJpZ2h0IiwiZDNfbGF5b3V0X3RyZWVNb3ZlIiwid20iLCJ3cCIsImNoYW5nZSIsImQzX2xheW91dF90cmVlU2hpZnQiLCJkM19sYXlvdXRfdHJlZUFuY2VzdG9yIiwidmltIiwiYW5jZXN0b3IiLCJkM19sYXlvdXRfY2x1c3RlclkiLCJkM19sYXlvdXRfY2x1c3RlclgiLCJkM19sYXlvdXRfY2x1c3RlckxlZnQiLCJkM19sYXlvdXRfY2x1c3RlclJpZ2h0IiwiZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsIiwiZDNfbGF5b3V0X3RyZWVtYXBQYWQiLCJkM19zY2FsZUV4dGVudCIsImRvbWFpbiIsImQzX3NjYWxlUmFuZ2UiLCJyYW5nZUV4dGVudCIsImQzX3NjYWxlX2JpbGluZWFyIiwidW5pbnRlcnBvbGF0ZSIsImQzX3NjYWxlX25pY2UiLCJuaWNlIiwiaTEiLCJkM19zY2FsZV9uaWNlU3RlcCIsImQzX3NjYWxlX25pY2VJZGVudGl0eSIsImQzX3NjYWxlX3BvbHlsaW5lYXIiLCJiaXNlY3QiLCJkM19zY2FsZV9saW5lYXIiLCJjbGFtcCIsInJlc2NhbGUiLCJyYW5nZVJvdW5kIiwidGlja3MiLCJkM19zY2FsZV9saW5lYXJUaWNrcyIsInRpY2tGb3JtYXQiLCJkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0IiwiZDNfc2NhbGVfbGluZWFyTmljZSIsImQzX3NjYWxlX2xpbmVhclJlYmluZCIsImQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZSIsInNwYW4iLCJkM19zY2FsZV9saW5lYXJQcmVjaXNpb24iLCJkM19zY2FsZV9saW5lYXJGb3JtYXRQcmVjaXNpb24iLCJkM19zY2FsZV9saW5lYXJGb3JtYXRTaWduaWZpY2FudCIsImQzX3NjYWxlX2xvZyIsInBvc2l0aXZlIiwibmljZWQiLCJkM19zY2FsZV9sb2dOaWNlTmVnYXRpdmUiLCJkM19zY2FsZV9sb2dGb3JtYXQiLCJkM19zY2FsZV9wb3ciLCJwb3dwIiwiZDNfc2NhbGVfcG93UG93IiwicG93YiIsImQzX3NjYWxlX29yZGluYWwiLCJyYW5nZXIiLCJzdGVwcyIsInJhbmdlQmFuZCIsInhpIiwicmFuZ2VQb2ludHMiLCJyYW5nZVJvdW5kUG9pbnRzIiwicmFuZ2VCYW5kcyIsIm91dGVyUGFkZGluZyIsInJhbmdlUm91bmRCYW5kcyIsImQzX3NjYWxlX3F1YW50aWxlIiwicXVhbnRpbGUiLCJxdWFudGlsZXMiLCJpbnZlcnRFeHRlbnQiLCJkM19zY2FsZV9xdWFudGl6ZSIsImQzX3NjYWxlX3RocmVzaG9sZCIsImQzX3NjYWxlX2lkZW50aXR5IiwiZDNfemVybyIsImQzX3N2Z19hcmNJbm5lclJhZGl1cyIsImlubmVyUmFkaXVzIiwiZDNfc3ZnX2FyY091dGVyUmFkaXVzIiwib3V0ZXJSYWRpdXMiLCJkM19zdmdfYXJjU3RhcnRBbmdsZSIsInN0YXJ0QW5nbGUiLCJkM19zdmdfYXJjRW5kQW5nbGUiLCJlbmRBbmdsZSIsImQzX3N2Z19hcmNQYWRBbmdsZSIsInBhZEFuZ2xlIiwiZDNfc3ZnX2FyY1N3ZWVwIiwiZDNfc3ZnX2FyY0Nvcm5lclRhbmdlbnRzIiwicmMiLCJjdyIsIngwMSIsInkwMSIsIm94Iiwib3kiLCJjeDAiLCJjeDEiLCJkeDAiLCJkeTAiLCJkeDEiLCJkeTEiLCJkM19zdmdfbGluZSIsInRlbnNpb24iLCJkZWZpbmVkIiwiZDNfc3ZnX2xpbmVMaW5lYXIiLCJpbnRlcnBvbGF0ZUtleSIsImQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycyIsImQzX3N2Z19saW5lTGluZWFyQ2xvc2VkIiwiZDNfc3ZnX2xpbmVTdGVwIiwiZDNfc3ZnX2xpbmVTdGVwQmVmb3JlIiwiZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIiLCJkM19zdmdfbGluZUNhcmRpbmFsT3BlbiIsImQzX3N2Z19saW5lSGVybWl0ZSIsImQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyIsImQzX3N2Z19saW5lQ2FyZGluYWxDbG9zZWQiLCJkM19zdmdfbGluZUNhcmRpbmFsIiwidGFuZ2VudHMiLCJwaSIsImxwIiwiZDNfc3ZnX2xpbmVCYXNpcyIsImQzX3N2Z19saW5lRG90NCIsImQzX3N2Z19saW5lQmFzaXNCZXppZXIzIiwiZDNfc3ZnX2xpbmVCYXNpc0JlemllciIsImQzX3N2Z19saW5lQmFzaXNPcGVuIiwiZDNfc3ZnX2xpbmVCYXNpc0Nsb3NlZCIsImQzX3N2Z19saW5lQnVuZGxlIiwiZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEiLCJkM19zdmdfbGluZUJhc2lzQmV6aWVyMiIsImQzX3N2Z19saW5lU2xvcGUiLCJkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzIiwiZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzIiwiZDNfc3ZnX2xpbmVNb25vdG9uZSIsImQzX3N2Z19saW5lUmFkaWFsIiwiZDNfc3ZnX2FyZWEiLCJhcmVhIiwicG9pbnRzMSIsImludGVycG9sYXRlUmV2ZXJzZSIsInBvaW50czAiLCJmeDAiLCJmeTAiLCJmeDEiLCJmeTEiLCJkM19zdmdfY2hvcmRSYWRpdXMiLCJkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uIiwiZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbiIsImQzX3N2Z19zeW1ib2xTaXplIiwiZDNfc3ZnX3N5bWJvbFR5cGUiLCJkM19zdmdfc3ltYm9sQ2lyY2xlIiwiZDNfc2VsZWN0aW9uX2ludGVycnVwdE5TIiwiYWN0aXZlSWQiLCJpbnRlcnJ1cHQiLCJkM190cmFuc2l0aW9uIiwiZDNfdHJhbnNpdGlvblByb3RvdHlwZSIsImQzX3RyYW5zaXRpb25fdHdlZW4iLCJkM190cmFuc2l0aW9uX3RleHQiLCJkM190cmFuc2l0aW9uTmFtZXNwYWNlIiwiZDNfdHJhbnNpdGlvbk5vZGUiLCJzY2hlZHVsZSIsImVsYXBzZWQiLCJ0cmFuc2l0aW9uIiwiY2FuY2VsSWQiLCJlYXNlIiwiZDNfc3ZnX2F4aXNYIiwiZDNfc3ZnX2F4aXNZIiwiZDNfdGltZV9mb3JtYXRJc29OYXRpdmUiLCJkM190aW1lX3NjYWxlIiwibWV0aG9kcyIsInRpY2tNZXRob2QiLCJkM190aW1lX3NjYWxlU3RlcHMiLCJkM190aW1lX3NjYWxlTWlsbGlzZWNvbmRzIiwiZDNfdGltZV9zY2FsZURhdGUiLCJkM19qc29uIiwiZDNfaHRtbCIsImQzX2RvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlIiwiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiwiZDNfYXJyYXlTbGljZSIsImQzX2VsZW1lbnRfcHJvdG90eXBlIiwiRWxlbWVudCIsImQzX2VsZW1lbnRfc2V0QXR0cmlidXRlIiwiZDNfZWxlbWVudF9zZXRBdHRyaWJ1dGVOUyIsImQzX3N0eWxlX3Byb3RvdHlwZSIsIkNTU1N0eWxlRGVjbGFyYXRpb24iLCJkM19zdHlsZV9zZXRQcm9wZXJ0eSIsImFzY2VuZGluZyIsInN1bSIsIm1lYW4iLCJtZWRpYW4iLCJudW1iZXJzIiwidmFyaWFuY2UiLCJkZXZpYXRpb24iLCJkM19iaXNlY3QiLCJiaXNlY3RMZWZ0IiwiYmlzZWN0UmlnaHQiLCJiaXNlY3RvciIsInNodWZmbGUiLCJwZXJtdXRlIiwiaW5kZXhlcyIsInBlcm11dGVzIiwicGFpcnMiLCJ0cmFuc3Bvc2UiLCJtYXRyaXgiLCJyb3ciLCJ6aXAiLCJlbnRyaWVzIiwiYXJyYXlzIiwibWVyZ2VkIiwibmVzdCIsIm1hcFR5cGUiLCJyb2xsdXAiLCJzb3J0VmFsdWVzIiwidmFsdWVzQnlLZXkiLCJzb3J0S2V5Iiwic29ydEtleXMiLCJrZXlNYXAiLCJkM19yZXF1b3RlX3JlIiwiX19wcm90b19fIiwiZDNfc2VsZWN0TWF0Y2hlciIsInN1Ymdyb3VwIiwic3Vibm9kZSIsInN1Ymdyb3VwcyIsInNlbGVjdEFsbCIsImQzX25zUHJlZml4IiwieGh0bWwiLCJ4bGluayIsInhtbG5zIiwiZ2V0QXR0cmlidXRlTlMiLCJjbGFzc2VkIiwiZ3JvdXBEYXRhIiwibm9kZURhdGEiLCJ1cGRhdGVOb2RlcyIsImVudGVyTm9kZXMiLCJleGl0Tm9kZXMiLCJub2RlQnlLZXlWYWx1ZSIsImtleVZhbHVlcyIsImV4aXQiLCJkYXR1bSIsInVwZ3JvdXAiLCJtb3VzZSIsInRvdWNoIiwiZHJhZyIsIm1vdXNlZG93biIsInRvdWNoc3RhcnQiLCJkcmFnc3RhcnQiLCJtb3ZlZCIsInBvc2l0aW9uMSIsImRyYWdJZCIsInBvc2l0aW9uMCIsImRyYWdnZWQiLCJkcmFnT2Zmc2V0IiwiZW5kZWQiLCJkcmFnU3ViamVjdCIsImRyYWdOYW1lIiwiZHJhZ1Jlc3RvcmUiLCJjb3JyZXNwb25kaW5nRWxlbWVudCIsIs+EzrUiLCJTUVJUMiIsIs+BMiIsIs+BNCIsImludGVycG9sYXRlWm9vbSIsInV4MCIsInV5MCIsIncwIiwidXgxIiwidXkxIiwidzEiLCJjb3NocjAiLCJtb3VzZWRvd25lZCIsImQzX2JlaGF2aW9yX3pvb21XaGVlbCIsIm1vdXNld2hlZWxlZCIsImRibGNsaWNrZWQiLCJ0b3VjaHN0YXJ0ZWQiLCJzY2FsZVRvIiwic2NhbGVFeHRlbnQiLCJ0cmFuc2xhdGVUbyIsInpvb21UbyIsIl9fY2hhcnRfXyIsImNlbnRlcjAiLCJ6b29tc3RhcnRlZCIsInpvb21pbmciLCJ6b29tZWQiLCJ6b29tZW5kZWQiLCJsb2NhdGlvbjAiLCJtb3VzZW1vdmUiLCJtb3VzZXVwIiwiZDNfc2VsZWN0aW9uX2ludGVycnVwdCIsInJlbG9jYXRlIiwic2NhbGUwIiwibG9jYXRpb25zMCIsInN0YXJ0ZWQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsInRvdWNodGltZSIsImRpc3RhbmNlMCIsImwwIiwibDEiLCJkaXN0YW5jZTEiLCJzY2FsZTEiLCJ6b29tTmFtZSIsIm1vdXNld2hlZWxUaW1lciIsInRyYW5zbGF0ZTAiLCJkM19iZWhhdmlvcl96b29tRGVsdGEiLCJkM19iZWhhdmlvcl96b29tSW5maW5pdHkiLCJkZWx0YVkiLCJkZWx0YU1vZGUiLCJ3aGVlbERlbHRhIiwidmlldzEiLCJkM190cmFuc2l0aW9uSW5oZXJpdElkIiwiZDNfaHNsUHJvdG90eXBlIiwiYnJpZ2h0ZXIiLCJkYXJrZXIiLCJkM19oY2xQcm90b3R5cGUiLCJkM19sYWJfSyIsImQzX2xhYlByb3RvdHlwZSIsImQzX3JnYlByb3RvdHlwZSIsImFsaWNlYmx1ZSIsImFudGlxdWV3aGl0ZSIsImFxdWEiLCJhcXVhbWFyaW5lIiwiYXp1cmUiLCJiZWlnZSIsImJpc3F1ZSIsImJsYWNrIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVlIiwiYmx1ZXZpb2xldCIsImJyb3duIiwiYnVybHl3b29kIiwiY2FkZXRibHVlIiwiY2hhcnRyZXVzZSIsImNob2NvbGF0ZSIsImNvcmFsIiwiY29ybmZsb3dlcmJsdWUiLCJjb3Juc2lsayIsImNyaW1zb24iLCJjeWFuIiwiZGFya2JsdWUiLCJkYXJrY3lhbiIsImRhcmtnb2xkZW5yb2QiLCJkYXJrZ3JheSIsImRhcmtncmVlbiIsImRhcmtncmV5IiwiZGFya2toYWtpIiwiZGFya21hZ2VudGEiLCJkYXJrb2xpdmVncmVlbiIsImRhcmtvcmFuZ2UiLCJkYXJrb3JjaGlkIiwiZGFya3JlZCIsImRhcmtzYWxtb24iLCJkYXJrc2VhZ3JlZW4iLCJkYXJrc2xhdGVibHVlIiwiZGFya3NsYXRlZ3JheSIsImRhcmtzbGF0ZWdyZXkiLCJkYXJrdHVycXVvaXNlIiwiZGFya3Zpb2xldCIsImRlZXBwaW5rIiwiZGVlcHNreWJsdWUiLCJkaW1ncmF5IiwiZGltZ3JleSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZWVuIiwiZ3JlZW55ZWxsb3ciLCJncmV5IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodGdyZXkiLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c2xhdGVncmV5IiwibGlnaHRzdGVlbGJsdWUiLCJsaWdodHllbGxvdyIsImxpbWUiLCJsaW1lZ3JlZW4iLCJsaW5lbiIsIm1hZ2VudGEiLCJtYXJvb24iLCJtZWRpdW1hcXVhbWFyaW5lIiwibWVkaXVtYmx1ZSIsIm1lZGl1bW9yY2hpZCIsIm1lZGl1bXB1cnBsZSIsIm1lZGl1bXNlYWdyZWVuIiwibWVkaXVtc2xhdGVibHVlIiwibWVkaXVtc3ByaW5nZ3JlZW4iLCJtZWRpdW10dXJxdW9pc2UiLCJtZWRpdW12aW9sZXRyZWQiLCJtaWRuaWdodGJsdWUiLCJtaW50Y3JlYW0iLCJtaXN0eXJvc2UiLCJtb2NjYXNpbiIsIm5hdmFqb3doaXRlIiwibmF2eSIsIm9sZGxhY2UiLCJvbGl2ZSIsIm9saXZlZHJhYiIsIm9yYW5nZSIsIm9yYW5nZXJlZCIsIm9yY2hpZCIsInBhbGVnb2xkZW5yb2QiLCJwYWxlZ3JlZW4iLCJwYWxldHVycXVvaXNlIiwicGFsZXZpb2xldHJlZCIsInBhcGF5YXdoaXAiLCJwZWFjaHB1ZmYiLCJwZXJ1IiwicGluayIsInBsdW0iLCJwb3dkZXJibHVlIiwicHVycGxlIiwicmViZWNjYXB1cnBsZSIsInJlZCIsInJvc3licm93biIsInJveWFsYmx1ZSIsInNhZGRsZWJyb3duIiwic2FsbW9uIiwic2FuZHlicm93biIsInNlYWdyZWVuIiwic2Vhc2hlbGwiLCJzaWVubmEiLCJzaWx2ZXIiLCJza3libHVlIiwic2xhdGVibHVlIiwic2xhdGVncmF5Iiwic2xhdGVncmV5Iiwic25vdyIsInNwcmluZ2dyZWVuIiwic3RlZWxibHVlIiwidGVhbCIsInRoaXN0bGUiLCJ0b21hdG8iLCJ0dXJxdW9pc2UiLCJ2aW9sZXQiLCJ3aGVhdCIsIndoaXRlIiwid2hpdGVzbW9rZSIsInllbGxvdyIsInllbGxvd2dyZWVuIiwiZnVuY3RvciIsImRzdiIsImRlbGltaXRlciIsInR5cGVkUmVzcG9uc2UiLCJmb3JtYXRSb3ciLCJmb3JtYXRWYWx1ZSIsInJlRm9ybWF0IiwiZGVsaW1pdGVyQ29kZSIsInBhcnNlUm93cyIsIkVPRiIsImVvbCIsIkVPTCIsInJvd3MiLCJmb3JtYXRSb3dzIiwiZmllbGRTZXQiLCJmaWVsZHMiLCJjc3YiLCJ0c3YiLCJmbHVzaCIsImQzX2Zvcm1hdFByZWZpeGVzIiwidG9QcmVjaXNpb24iLCJ0b0V4cG9uZW50aWFsIiwidG9GaXhlZCIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWlsbGlzZWNvbmRzIiwiZ2V0VVRDU2Vjb25kcyIsInNldERhdGUiLCJkM190aW1lX3Byb3RvdHlwZSIsInNldFVUQ0RhdGUiLCJzZXREYXkiLCJzZXRVVENEYXkiLCJzZXRNaWxsaXNlY29uZHMiLCJzZXRVVENNaWxsaXNlY29uZHMiLCJzZXRVVENNb250aCIsInNldFNlY29uZHMiLCJzZXRVVENTZWNvbmRzIiwic3VuZGF5IiwiLSIsIm51bWJlckZvcm1hdCIsImQzX2xvY2FsZV9lblVTIiwiZ2VvIiwiZDNfYWRkZXJUZW1wIiwiZDNfZ2VvX3N0cmVhbU9iamVjdFR5cGUiLCJGZWF0dXJlIiwiZmVhdHVyZSIsIkZlYXR1cmVDb2xsZWN0aW9uIiwiZmVhdHVyZXMiLCJTcGhlcmUiLCJQb2ludCIsIk11bHRpUG9pbnQiLCJMaW5lU3RyaW5nIiwiTXVsdGlMaW5lU3RyaW5nIiwiUG9seWdvbiIsIk11bHRpUG9seWdvbiIsIkdlb21ldHJ5Q29sbGVjdGlvbiIsImdlb21ldHJpZXMiLCJkM19nZW9fYXJlYVN1bSIsImJvdW5kcyIsInJhbmdlcyIsIm5vcm1hbCIsImVxdWF0b3JpYWwiLCJpbmZsZWN0aW9uIiwizrtfIiwizrtpIiwiz4ZpIiwiZM67U3VtIiwizrtfXyIsIs+GX18iLCJjb21wYXJlUmFuZ2VzIiwid2l0aGluUmFuZ2UiLCJiZXN0IiwiY2VudHJvaWQiLCJjb25pY0VxdWFsQXJlYSIsImFsYmVycyIsImFsYmVyc1VzYSIsImxvd2VyNDhQb2ludCIsImFsYXNrYVBvaW50IiwiaGF3YWlpUG9pbnQiLCJsb3dlcjQ4IiwiYWxhc2thIiwiaGF3YWlpIiwicG9pbnRTdHJlYW0iLCJsb3dlcjQ4U3RyZWFtIiwiYWxhc2thU3RyZWFtIiwiaGF3YWlpU3RyZWFtIiwiZDNfZ2VvX3BhdGhBcmVhU3VtIiwiZDNfZ2VvX3BhdGhCb3VuZHMiLCJjb250ZXh0U3RyZWFtIiwiY2FjaGVTdHJlYW0iLCJwcm9qZWN0U3RyZWFtIiwicHJvamVjdGlvbk11dGF0b3IiLCJlcXVpcmVjdGFuZ3VsYXIiLCLOlM67Iiwic2luzpTOuyIsInNpbs+GMSIsImdyYXRpY3VsZSIsIlgwIiwiRFgiLCJYMSIsIlkwIiwiRFkiLCJZMSIsIm91dGxpbmUiLCJtYWpvckV4dGVudCIsIm1pbm9yRXh0ZW50IiwibWFqb3JTdGVwIiwibWlub3JTdGVwIiwiZ3JlYXRBcmMiLCJzb3VyY2VfIiwidGFyZ2V0XyIsImQzX2dlb19hemltdXRoYWxFcXVhbEFyZWEiLCJjb3POu2Nvc8+GIiwiYXppbXV0aGFsRXF1YWxBcmVhIiwiZDNfZ2VvX2F6aW11dGhhbEVxdWlkaXN0YW50IiwiYXppbXV0aGFsRXF1aWRpc3RhbnQiLCJjb25pY0NvbmZvcm1hbCIsImNvbmljRXF1aWRpc3RhbnQiLCJkM19nZW9fZ25vbW9uaWMiLCJnbm9tb25pYyIsIm1lcmNhdG9yIiwiZDNfZ2VvX29ydGhvZ3JhcGhpYyIsIm9ydGhvZ3JhcGhpYyIsImQzX2dlb19zdGVyZW9ncmFwaGljIiwic3RlcmVvZ3JhcGhpYyIsInRyYW5zdmVyc2VNZXJjYXRvciIsImdlb20iLCJ2ZXJ0aWNlcyIsImZsaXBwZWRQb2ludHMiLCJ1cHBlciIsImxvd2VyIiwic2tpcExlZnQiLCJza2lwUmlnaHQiLCJkM19nZW9tX3BvbHlnb25Qcm90b3R5cGUiLCJncmFuZHBhIiwidW5jbGUiLCJ2b3Jvbm9pIiwicG9seWdvbnMiLCJkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50IiwidHJpYW5nbGVzIiwiczAiLCJkZWxhdW5heSIsInF1YWR0cmVlIiwibngiLCJueSIsImluc2VydENoaWxkIiwiblBvaW50IiwieHMiLCJ5cyIsIngxXyIsInkxXyIsIngyXyIsInkyXyIsImNvbXBhdCIsInZpc2l0IiwiaW50ZXJwb2xhdGVSZ2IiLCJpbnRlcnBvbGF0ZU9iamVjdCIsImludGVycG9sYXRlTnVtYmVyIiwiaW50ZXJwb2xhdGVTdHJpbmciLCJpbnRlcnBvbGF0ZUFycmF5IiwiZDNfZWFzZV9kZWZhdWx0IiwiZDNfZWFzZSIsInBvbHkiLCJjdWJpYyIsImVsYXN0aWMiLCJiYWNrIiwiYm91bmNlIiwiZDNfZWFzZV9tb2RlIiwiaW4iLCJpbi1vdXQiLCJvdXQtaW4iLCJpbnRlcnBvbGF0ZUhjbCIsImludGVycG9sYXRlSHNsIiwiaW50ZXJwb2xhdGVMYWIiLCJpbnRlcnBvbGF0ZVJvdW5kIiwiYmFzZVZhbCIsImNvbnNvbGlkYXRlIiwiZDNfdHJhbnNmb3JtSWRlbnRpdHkiLCJpbnRlcnBvbGF0ZVRyYW5zZm9ybSIsImxheW91dCIsImJ1bmRsZSIsInBhdGhzIiwiY2hvcmQiLCJyZWxheW91dCIsImdyb3VwU3VtcyIsImdyb3VwSW5kZXgiLCJzdWJncm91cEluZGV4IiwiY2hvcmRzIiwic29ydEdyb3VwcyIsInNvcnRTdWJncm91cHMiLCJkaSIsImRqIiwic3ViaW5kZXgiLCJzb3J0Q2hvcmRzIiwicmVzb3J0IiwiZm9yY2UiLCJyZXB1bHNlIiwiZHciLCJkbiIsInRoZXRhMiIsImNoYXJnZURpc3RhbmNlMiIsImRyYWdtb3ZlIiwiZGlzdGFuY2VzIiwic3RyZW5ndGhzIiwiZnJpY3Rpb24iLCJsaW5rRGlzdGFuY2UiLCJkM19sYXlvdXRfZm9yY2VMaW5rRGlzdGFuY2UiLCJsaW5rU3RyZW5ndGgiLCJkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgiLCJkM19sYXlvdXRfZm9yY2VDaGFyZ2VEaXN0YW5jZTIiLCJncmF2aXR5Iiwid2VpZ2h0IiwiY2hhcmdlRGlzdGFuY2UiLCJ0aGV0YSIsImRpbWVuc2lvbiIsIm5laWdoYm9ycyIsImNhbmRpZGF0ZXMiLCJjaGlsZHMiLCJyZXZhbHVlIiwicGFydGl0aW9uIiwicGllIiwiYXJjcyIsImQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSIsInNlcmllcyIsIm9yZGVycyIsIm9mZnNldHMiLCJkM19sYXlvdXRfc3RhY2tPcmRlcnMiLCJkM19sYXlvdXRfc3RhY2tPZmZzZXRzIiwiaW5zaWRlLW91dCIsInN1bXMiLCJ0b3BzIiwiYm90dG9tcyIsImRlZmF1bHQiLCJzaWxob3VldHRlIiwid2lnZ2xlIiwiczMiLCJvMCIsInplcm8iLCJoaXN0b2dyYW0iLCJiaW4iLCJiaW5zIiwidmFsdWVyIiwiYmlubmVyIiwiZnJlcXVlbmN5IiwicGFjayIsInJvb3QwIiwicm9vdDEiLCJ3cmFwVHJlZSIsImZpcnN0V2FsayIsInNlY29uZFdhbGsiLCJub2RlU2l6ZSIsInNpemVOb2RlIiwidHgiLCJzZXBhcmF0aW9uIiwibm9kZTEiLCJtaWRwb2ludCIsImFwcG9ydGlvbiIsInZpcCIsInZvcCIsInZvbSIsInNpcCIsInNvcCIsInNpbSIsInNvbSIsImNsdXN0ZXIiLCJ0cmVlbWFwIiwic3F1YXJpZnkiLCJwYWQiLCJ3b3JzdCIsInN0aWNraWZ5Iiwicm1heCIsInJtaW4iLCJyYXRpbyIsInN0aWNraWVzIiwic3RpY2t5IiwicGFkRnVuY3Rpb24iLCJwYWRDb25zdGFudCIsIsK1Iiwiz4MiLCJsb2dOb3JtYWwiLCJiYXRlcyIsImlyd2luSGFsbCIsImNhdGVnb3J5MTAiLCJkM19jYXRlZ29yeTEwIiwiY2F0ZWdvcnkyMCIsImQzX2NhdGVnb3J5MjAiLCJjYXRlZ29yeTIwYiIsImQzX2NhdGVnb3J5MjBiIiwiY2F0ZWdvcnkyMGMiLCJkM19jYXRlZ29yeTIwYyIsInF1YW50aXplIiwiY2lyY2xlU2VnbWVudCIsInJwIiwicGFkUmFkaXVzIiwiZDNfc3ZnX2FyY0F1dG8iLCJoMSIsImgwIiwiY29ybmVyUmFkaXVzIiwicmMxIiwicmMwIiwib2MiLCJrYyIsImxjIiwidDMwIiwidDEyIiwidDAzIiwidDIxIiwibGluZWFyLWNsb3NlZCIsInN0ZXAtYmVmb3JlIiwic3RlcC1hZnRlciIsImJhc2lzIiwiYmFzaXMtb3BlbiIsImJhc2lzLWNsb3NlZCIsImNhcmRpbmFsIiwiY2FyZGluYWwtb3BlbiIsImNhcmRpbmFsLWNsb3NlZCIsIm1vbm90b25lIiwicmFkaWFsIiwiY3VydmUiLCJkaWFnb25hbCIsInByb2plY3Rpb25fIiwiZDNfc3ZnX3N5bWJvbHMiLCJjcm9zcyIsImRpYW1vbmQiLCJkM19zdmdfc3ltYm9sVGFuMzAiLCJzcXVhcmUiLCJ0cmlhbmdsZS1kb3duIiwiZDNfc3ZnX3N5bWJvbFNxcnQzIiwidHJpYW5nbGUtdXAiLCJzeW1ib2xUeXBlcyIsImQzX3RyYW5zaXRpb25JZCIsImQzX3RyYW5zaXRpb25Jbmhlcml0Iiwic3Vibm9kZXMiLCJuYW1lTlMiLCJhdHRyVHdlZW4iLCJhdHRyVHdlZW5OUyIsInN0eWxlU3RyaW5nIiwic3R5bGVUd2VlbiIsImluaGVyaXRJZCIsImlkMCIsImlkMSIsImF4aXMiLCJ0aWNrVHJhbnNmb3JtIiwidGlja1ZhbHVlcyIsInRpY2tBcmd1bWVudHNfIiwidGlja0Zvcm1hdF8iLCJ0aWNrRW50ZXIiLCJ0aWNrRXhpdCIsInRpY2tVcGRhdGUiLCJ0aWNrU3BhY2luZyIsImlubmVyVGlja1NpemUiLCJ0aWNrUGFkZGluZyIsInBhdGhVcGRhdGUiLCJsaW5lRW50ZXIiLCJsaW5lVXBkYXRlIiwidGV4dEVudGVyIiwidGV4dFVwZGF0ZSIsIm9yaWVudCIsIm91dGVyVGlja1NpemUiLCJkM19zdmdfYXhpc0RlZmF1bHRPcmllbnQiLCJkM19zdmdfYXhpc09yaWVudHMiLCJ0aWNrU2l6ZSIsInRpY2tTdWJkaXZpZGUiLCJicnVzaCIsImJydXNoc3RhcnQiLCJyZXNpemUiLCJyZXNpemVzIiwiZDNfc3ZnX2JydXNoQ3Vyc29yIiwiZ1VwZGF0ZSIsImJhY2tncm91bmRVcGRhdGUiLCJyZWRyYXdYIiwicmVkcmF3WSIsInJlZHJhdyIsInhFeHRlbnQiLCJ5RXh0ZW50Iiwia2V5ZG93biIsImRyYWdnaW5nIiwia2V5dXAiLCJicnVzaG1vdmUiLCJyZXNpemluZ1giLCJtb3ZlMSIsInJlc2l6aW5nWSIsImV2ZW50XyIsInlDbGFtcCIsInhDbGFtcCIsInlFeHRlbnREb21haW4iLCJ4RXh0ZW50RG9tYWluIiwiYnJ1c2hlbmQiLCJldmVudFRhcmdldCIsInJlc2l6aW5nIiwiZXkiLCJkM19zdmdfYnJ1c2hSZXNpemVzIiwiZXh0ZW50MSIsImV4dGVudDAiLCJ5aSIsImNsZWFyIiwibnciLCJuZSIsInNlIiwic3ciLCJkM190aW1lX2Zvcm1hdFV0YyIsImQzX3RpbWVfZm9ybWF0SXNvIiwiZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcyIsImQzX3RpbWVfc2NhbGVMb2NhbEZvcm1hdCIsImQzX3RpbWVfc2NhbGVVdGNNZXRob2RzIiwiZDNfdGltZV9zY2FsZVV0Y0Zvcm1hdCIsInJlc3BvbnNlWE1MIiwib2JqZWN0S2V5cyIsImluaGVyaXRQYXJhbXMiLCJjdXJyZW50UGFyYW1zIiwibmV3UGFyYW1zIiwiJGN1cnJlbnQiLCIkdG8iLCJwYXJlbnRQYXJhbXMiLCJpbmhlcml0ZWQiLCJpbmhlcml0TGlzdCIsImVxdWFsRm9yS2V5cyIsImZpbHRlckJ5S2V5cyIsImZpbHRlcmVkIiwicGljayIsIm9taXQiLCJzaWxlbmNlVW5jYXVnaHRJblByb21pc2UiLCIkUmVzb2x2ZSIsIlZJU0lUX0lOX1BST0dSRVNTIiwiVklTSVRfRE9ORSIsIk5PVEhJTkciLCJOT19ERVBFTkRFTkNJRVMiLCJOT19MT0NBTFMiLCJOT19QQVJFTlQiLCIkJHByb21pc2VzIiwiJCR2YWx1ZXMiLCJzdHVkeSIsImludm9jYWJsZXMiLCJ2aXNpdGVkIiwiY3ljbGUiLCJwbGFuIiwiaXNSZXNvbHZlIiwiaW52b2NhYmxlS2V5cyIsIiQkaW5oZXJpdGVkVmFsdWVzIiwicmVzb2x1dGlvbiIsIiQkZmFpbHVyZSIsImludm9jYWJsZSIsIm9uZmFpbHVyZSIsImludm9jYXRpb24iLCJwcm9jZWVkIiwid2FpdFBhcmFtcyIsImRlcCIsIiRUZW1wbGF0ZUZhY3RvcnkiLCJmcm9tQ29uZmlnIiwiZnJvbVN0cmluZyIsImZyb21VcmwiLCJ0ZW1wbGF0ZVByb3ZpZGVyIiwiZnJvbVByb3ZpZGVyIiwiVXJsTWF0Y2hlciIsInBhcmVudE1hdGNoZXIiLCJhZGRQYXJhbWV0ZXIiLCJwYXJhbU5hbWVzIiwiJCRVTUZQIiwiUGFyYW0iLCJxdW90ZVJlZ0V4cCIsInNxdWFzaCIsInN1cnJvdW5kUGF0dGVybiIsIm1hdGNoRGV0YWlscyIsImlzU2VhcmNoIiwiY2ZnIiwiY2FzZUluc2Vuc2l0aXZlIiwicGxhY2Vob2xkZXIiLCJzZWFyY2hQbGFjZWhvbGRlciIsIiQkbmV3IiwiUGFyYW1TZXQiLCJpc09wdGlvbmFsIiwic291cmNlU2VhcmNoIiwic291cmNlUGF0aCIsIiQkcGFyYW1OYW1lcyIsIiRVcmxNYXRjaGVyRmFjdG9yeSIsInZhbFRvU3RyaW5nIiwiLyIsInZhbEZyb21TdHJpbmciLCJ+fiIsIn4yRiIsImdldERlZmF1bHRDb25maWciLCJpc1N0cmljdE1vZGUiLCJpc0Nhc2VJbnNlbnNpdGl2ZSIsImlzSW5qZWN0YWJsZSIsImZsdXNoVHlwZVF1ZXVlIiwidHlwZVF1ZXVlIiwiJHR5cGVzIiwiZGVmYXVsdFNxdWFzaFBvbGljeSIsImVucXVldWUiLCJkZWZhdWx0VHlwZXMiLCJlbmNvZGUiLCJkZWNvZGUiLCJpbnQiLCJhbnkiLCIkJGdldERlZmF1bHRWYWx1ZSIsInN0cmljdE1vZGUiLCJpc01hdGNoZXIiLCJkZWZpbml0aW9uRm4iLCJ1bndyYXBTaG9ydGhhbmQiLCJpc1Nob3J0aGFuZCIsIiQkZm4iLCJnZXRUeXBlIiwidXJsVHlwZSIsImdldEFycmF5TW9kZSIsImFycmF5RGVmYXVsdHMiLCJhcnJheVBhcmFtTm9tZW5jbGF0dXJlIiwiZ2V0U3F1YXNoUG9saWN5IiwiZ2V0UmVwbGFjZSIsImFycmF5TW9kZSIsImNvbmZpZ3VyZWRLZXlzIiwiZGVmYXVsdFBvbGljeSIsIiR2YWx1ZSIsImhhc1JlcGxhY2VWYWwiLCIkcmVwbGFjZSIsInJlcGxhY2VtZW50IiwiJGFzQXJyYXkiLCJkeW5hbWljIiwiJCRwYXJlbnQiLCIkJGtleXMiLCJpZ25vcmUiLCJwYXJhbXNldCIsInBhcmFtVmFsdWVzIiwiJCRlcXVhbHMiLCJwYXJhbVZhbHVlczEiLCJwYXJhbVZhbHVlczIiLCJlcXVhbCIsIiQkdmFsaWRhdGVzIiwicmF3VmFsIiwiZW5jb2RlZCIsIiRVcmxSb3V0ZXJQcm92aWRlciIsIiRsb2NhdGlvblByb3ZpZGVyIiwiJHVybE1hdGNoZXJGYWN0b3J5IiwicmVnRXhwUHJlZml4IiwiaGFuZGxlSWZNYXRjaCIsIiRtYXRjaCIsImFwcGVuZEJhc2VQYXRoIiwiaXNIdG1sNSIsImFic29sdXRlIiwicnVsZSIsImhhbmRsZWQiLCJsYXN0UHVzaGVkVXJsIiwib3RoZXJ3aXNlIiwibGlzdGVuIiwiaW50ZXJjZXB0RGVmZXJyZWQiLCJzeW5jIiwicmVhZCIsInVybE1hdGNoZXIiLCIkJGF2b2lkUmVzeW5jIiwidmFsaWRhdGVzIiwic2xhc2giLCJyZWRpcmVjdCIsImhhbmRsZXJJc1N0cmluZyIsInN0cmF0ZWdpZXMiLCJkZWZlckludGVyY2VwdCIsIiRTdGF0ZVByb3ZpZGVyIiwiJHVybFJvdXRlclByb3ZpZGVyIiwiaXNSZWxhdGl2ZSIsInN0YXRlTmFtZSIsImZpbmRTdGF0ZSIsInN0YXRlT3JOYW1lIiwiaXNTdHIiLCJyZWwiLCJwYXRoTGVuZ3RoIiwic3RhdGVzIiwicXVldWVTdGF0ZSIsInBhcmVudE5hbWUiLCJmbHVzaFF1ZXVlZENoaWxkcmVuIiwicXVldWVkIiwicmVnaXN0ZXJTdGF0ZSIsInN0YXRlQnVpbGRlciIsIiRkZWxlZ2F0ZXMiLCJhYnN0cmFjdEtleSIsIiRzdGF0ZVBhcmFtcyIsIiRzdGF0ZSIsIm5hdmlnYWJsZSIsInRyYW5zaXRpb25UbyIsImlzR2xvYiIsImRvZXNTdGF0ZU1hdGNoR2xvYiIsImdsb2IiLCJnbG9iU2VnbWVudHMiLCIkdmlldyIsIiRyZXNvbHZlIiwiJHVybFJvdXRlciIsImhhbmRsZVJlZGlyZWN0IiwiVHJhbnNpdGlvbkFib3J0ZWQiLCJyZXRyeSIsIiRyZXRyeSIsIlRyYW5zaXRpb25GYWlsZWQiLCJyZXRyeVRyYW5zaXRpb24iLCJ0b1BhcmFtcyIsIlRyYW5zaXRpb25TdXBlcnNlZGVkIiwicmVzb2x2ZVN0YXRlIiwicGFyYW1zQXJlRmlsdGVyZWQiLCJyZXNvbHZlVmlld3MiLCJ2aWV3c1Byb21pc2VzIiwidmlld3MiLCJpbmplY3RhYmxlcyIsImNvbnRyb2xsZXJQcm92aWRlciIsImluamVjdExvY2FscyIsIiQkY29udHJvbGxlciIsIiQkY29udHJvbGxlckFzIiwiJCRyZXNvbHZlQXMiLCJyZXNvbHZlQXMiLCJUcmFuc2l0aW9uU3VwZXJzZWRlZEVycm9yIiwiVHJhbnNpdGlvblByZXZlbnRlZCIsImdvIiwiZnJvbVBhcmFtcyIsImZyb21QYXRoIiwidG9TdGF0ZSIsInJlZGlyZWN0UmVzdWx0IiwidG9QYXRoIiwia2VlcCIsInRvTG9jYWxzIiwicmVsb2FkU3RhdGUiLCJvd25QYXJhbXMiLCJzaG91bGRTa2lwUmVsb2FkIiwicmVzb2x2ZWQiLCJlbnRlcmluZyIsImV4aXRpbmciLCJvbkV4aXQiLCJvbkVudGVyIiwicGFyYW1EZWYiLCJsb3NzeSIsIm5hdiIsIm5vblNlYXJjaFBhcmFtc0VxdWFsIiwiZnJvbUFuZFRvU3RhdGUiLCJub3RTZWFyY2hQYXJhbSIsIm5vblF1ZXJ5UGFyYW1LZXlzIiwibm9uUXVlcnlQYXJhbXMiLCJub25RdWVyeVBhcmFtU2V0IiwicmVsb2FkT25TZWFyY2giLCJjb21wb3NpdGVOYW1lIiwiYWJzdHJhY3QiLCIkVmlld1Byb3ZpZGVyIiwiJHRlbXBsYXRlRmFjdG9yeSIsIiRWaWV3U2Nyb2xsUHJvdmlkZXIiLCJ1c2VBbmNob3JTY3JvbGwiLCIkVmlld0RpcmVjdGl2ZSIsIiR1aVZpZXdTY3JvbGwiLCJnZXRSZW5kZXJlciIsInN0YXRpY3MiLCIkYW5pbWF0b3IiLCJjbGVhbnVwTGFzdFZpZXciLCJwcmV2aW91c0VsIiwiY3VycmVudEVsIiwiJHVpVmlld0RhdGEiLCJyZW5kZXJlciIsIiQkYW5pbUxlYXZlIiwidXBkYXRlVmlldyIsImdldFVpVmlld05hbWUiLCJwcmV2aW91c0xvY2FscyIsImxhdGVzdExvY2FscyIsImFuaW1FbnRlciIsImFuaW1MZWF2ZSIsInZpZXdBbmltRGF0YSIsIiRhbmltRW50ZXIiLCIkYW5pbUxlYXZlIiwiJFZpZXdEaXJlY3RpdmVGaWxsIiwicmVzb2x2ZURhdGEiLCJ1aVZpZXciLCJ1aVZpZXdDcmVhdGVkQnkiLCJwYXJzZVN0YXRlUmVmIiwicmVmIiwicHJlcGFyc2VkIiwicGFyYW1FeHByIiwic3RhdGVDb250ZXh0Iiwic3RhdGVEYXRhIiwiZ2V0VHlwZUluZm8iLCJpc1N2ZyIsImlzRm9ybSIsImlzQW5jaG9yIiwiY2xpY2thYmxlIiwiY2xpY2tIb29rIiwiaWdub3JlUHJldmVudERlZmF1bHRDb3VudCIsImRlZmF1bHRPcHRzIiwiJFN0YXRlUmVmRGlyZWN0aXZlIiwidWlTcmVmQWN0aXZlIiwidWlTcmVmIiwidW5saW5rSW5mb0ZuIiwidWlTcmVmT3B0cyIsIiQkYWRkU3RhdGVJbmZvIiwiJFN0YXRlUmVmRHluYW1pY0RpcmVjdGl2ZSIsInJ1blN0YXRlUmVmTGluayIsInVpU3RhdGUiLCJ1aVN0YXRlUGFyYW1zIiwidWlTdGF0ZU9wdHMiLCIkU3RhdGVSZWZBY3RpdmVEaXJlY3RpdmUiLCJhZGRTdGF0ZSIsInN0YXRlUGFyYW1zIiwiYWN0aXZlQ2xhc3MiLCJzdGF0ZUhhc2giLCJjcmVhdGVTdGF0ZUhhc2giLCJzdGF0ZUluZm8iLCJhY3RpdmVDbGFzc2VzIiwiYW55TWF0Y2giLCJleGFjdE1hdGNoIiwiYWN0aXZlRXFDbGFzcyIsInVpU3JlZkFjdGl2ZUVxIiwiZGVyZWdpc3RlciIsIiRJc1N0YXRlRmlsdGVyIiwiaXNGaWx0ZXIiLCIkSW5jbHVkZWRCeVN0YXRlRmlsdGVyIiwiaW5jbHVkZXNGaWx0ZXIiLCJzZWFyY2hQYXJhbXMiLCJkZWNvZGVQYXRoQXJyYXkiLCJyZXZlcnNlU3RyaW5nIiwidW5xdW90ZURhc2hlcyIsImFsbFJldmVyc2VkIiwicGFyYW1OYW1lIiwiblRvdGFsIiwiblBhdGgiLCJwYXJhbVZhbCIsImVuY29kZURhc2hlcyIsImlzUGF0aFBhcmFtIiwiaXNEZWZhdWx0VmFsdWUiLCJuZXh0U2VnbWVudCIsImlzRmluYWxQYXRoUGFyYW0iLCIkc3ViUGF0dGVybiIsInN1YiIsIkFycmF5VHlwZSIsImJpbmRUbyIsImFycmF5V3JhcCIsImFycmF5VW53cmFwIiwiZmFsc2V5IiwiYXJyYXlIYW5kbGVyIiwiYWxsVHJ1dGh5TW9kZSIsImFycmF5RXF1YWxzSGFuZGxlciIsInZhbDEiLCJ2YWwyIiwiJGFycmF5TW9kZSIsImF1dG9pbmplY3QiLCJtc01vZGVsIiwicHJlTXMiLCJwb3N0TXMiLCJtc1RvVGltZSIsImhycyIsInNlYyIsInRpbWVUb01zIiwic3BsaXRUaW1lIiwic3BsaXRUaW1lTGVuZ3RoIiwiaXNWYWxpZFRpbWUiLCJiaW5kVGltZSIsImFkZE1hcEVudHJ5IiwicGFpciIsImFkZFNldEVudHJ5IiwidGhpc0FyZyIsImFycmF5QWdncmVnYXRvciIsIml0ZXJhdGVlIiwiYWNjdW11bGF0b3IiLCJhcnJheUVhY2giLCJhcnJheUVhY2hSaWdodCIsImFycmF5RXZlcnkiLCJhcnJheUZpbHRlciIsInJlc0luZGV4IiwiYXJyYXlJbmNsdWRlcyIsImJhc2VJbmRleE9mIiwiYXJyYXlJbmNsdWRlc1dpdGgiLCJhcnJheU1hcCIsImFycmF5UHVzaCIsImFycmF5UmVkdWNlIiwiaW5pdEFjY3VtIiwiYXJyYXlSZWR1Y2VSaWdodCIsImFycmF5U29tZSIsImFzY2lpVG9BcnJheSIsImFzY2lpV29yZHMiLCJyZUFzY2lpV29yZCIsImJhc2VGaW5kS2V5IiwiZWFjaEZ1bmMiLCJiYXNlRmluZEluZGV4IiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0Iiwic3RyaWN0SW5kZXhPZiIsImJhc2VJc05hTiIsImJhc2VJbmRleE9mV2l0aCIsImJhc2VNZWFuIiwiYmFzZVN1bSIsIk5BTiIsImJhc2VQcm9wZXJ0eSIsImJhc2VQcm9wZXJ0eU9mIiwiYmFzZVJlZHVjZSIsImJhc2VTb3J0QnkiLCJjb21wYXJlciIsImJhc2VUaW1lcyIsImJhc2VUb1BhaXJzIiwiYmFzZVVuYXJ5IiwiYmFzZVZhbHVlcyIsImNhY2hlSGFzIiwiY2hhcnNTdGFydEluZGV4Iiwic3RyU3ltYm9scyIsImNoclN5bWJvbHMiLCJjaGFyc0VuZEluZGV4IiwiY291bnRIb2xkZXJzIiwiZXNjYXBlU3RyaW5nQ2hhciIsImNociIsInN0cmluZ0VzY2FwZXMiLCJoYXNVbmljb2RlIiwicmVIYXNVbmljb2RlIiwiaGFzVW5pY29kZVdvcmQiLCJyZUhhc1VuaWNvZGVXb3JkIiwiaXRlcmF0b3JUb0FycmF5IiwibWFwVG9BcnJheSIsIm92ZXJBcmciLCJyZXBsYWNlSG9sZGVycyIsIlBMQUNFSE9MREVSIiwic2V0VG9BcnJheSIsInNldFRvUGFpcnMiLCJzdHJpY3RMYXN0SW5kZXhPZiIsInN0cmluZ1NpemUiLCJ1bmljb2RlU2l6ZSIsImFzY2lpU2l6ZSIsInN0cmluZ1RvQXJyYXkiLCJ1bmljb2RlVG9BcnJheSIsInJlVW5pY29kZSIsInVuaWNvZGVXb3JkcyIsInJlVW5pY29kZVdvcmQiLCJWRVJTSU9OIiwiTEFSR0VfQVJSQVlfU0laRSIsIkNPUkVfRVJST1JfVEVYVCIsIkZVTkNfRVJST1JfVEVYVCIsIkhBU0hfVU5ERUZJTkVEIiwiTUFYX01FTU9JWkVfU0laRSIsIkNMT05FX0RFRVBfRkxBRyIsIkNMT05FX0ZMQVRfRkxBRyIsIkNMT05FX1NZTUJPTFNfRkxBRyIsIkNPTVBBUkVfUEFSVElBTF9GTEFHIiwiQ09NUEFSRV9VTk9SREVSRURfRkxBRyIsIldSQVBfQklORF9GTEFHIiwiV1JBUF9CSU5EX0tFWV9GTEFHIiwiV1JBUF9DVVJSWV9CT1VORF9GTEFHIiwiV1JBUF9DVVJSWV9GTEFHIiwiV1JBUF9DVVJSWV9SSUdIVF9GTEFHIiwiV1JBUF9QQVJUSUFMX0ZMQUciLCJXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyIsIldSQVBfQVJZX0ZMQUciLCJXUkFQX1JFQVJHX0ZMQUciLCJXUkFQX0ZMSVBfRkxBRyIsIkRFRkFVTFRfVFJVTkNfTEVOR1RIIiwiREVGQVVMVF9UUlVOQ19PTUlTU0lPTiIsIkhPVF9DT1VOVCIsIkhPVF9TUEFOIiwiTEFaWV9GSUxURVJfRkxBRyIsIkxBWllfTUFQX0ZMQUciLCJMQVpZX1dISUxFX0ZMQUciLCJJTkZJTklUWSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJNQVhfSU5URUdFUiIsIk1BWF9BUlJBWV9MRU5HVEgiLCJNQVhfQVJSQVlfSU5ERVgiLCJIQUxGX01BWF9BUlJBWV9MRU5HVEgiLCJ3cmFwRmxhZ3MiLCJhcmdzVGFnIiwiYXJyYXlUYWciLCJhc3luY1RhZyIsImJvb2xUYWciLCJkYXRlVGFnIiwiZG9tRXhjVGFnIiwiZXJyb3JUYWciLCJmdW5jVGFnIiwiZ2VuVGFnIiwibWFwVGFnIiwibnVtYmVyVGFnIiwibnVsbFRhZyIsIm9iamVjdFRhZyIsInByb21pc2VUYWciLCJwcm94eVRhZyIsInJlZ2V4cFRhZyIsInNldFRhZyIsInN0cmluZ1RhZyIsInN5bWJvbFRhZyIsInVuZGVmaW5lZFRhZyIsIndlYWtNYXBUYWciLCJ3ZWFrU2V0VGFnIiwiYXJyYXlCdWZmZXJUYWciLCJkYXRhVmlld1RhZyIsImZsb2F0MzJUYWciLCJmbG9hdDY0VGFnIiwiaW50OFRhZyIsImludDE2VGFnIiwiaW50MzJUYWciLCJ1aW50OFRhZyIsInVpbnQ4Q2xhbXBlZFRhZyIsInVpbnQxNlRhZyIsInVpbnQzMlRhZyIsInJlRW1wdHlTdHJpbmdMZWFkaW5nIiwicmVFbXB0eVN0cmluZ01pZGRsZSIsInJlRW1wdHlTdHJpbmdUcmFpbGluZyIsInJlRXNjYXBlZEh0bWwiLCJyZVVuZXNjYXBlZEh0bWwiLCJyZUhhc0VzY2FwZWRIdG1sIiwicmVIYXNVbmVzY2FwZWRIdG1sIiwicmVFc2NhcGUiLCJyZUV2YWx1YXRlIiwicmVJbnRlcnBvbGF0ZSIsInJlSXNEZWVwUHJvcCIsInJlSXNQbGFpblByb3AiLCJyZUxlYWRpbmdEb3QiLCJyZVByb3BOYW1lIiwicmVSZWdFeHBDaGFyIiwicmVIYXNSZWdFeHBDaGFyIiwicmVUcmltIiwicmVUcmltU3RhcnQiLCJyZVRyaW1FbmQiLCJyZVdyYXBDb21tZW50IiwicmVXcmFwRGV0YWlscyIsInJlU3BsaXREZXRhaWxzIiwicmVFc2NhcGVDaGFyIiwicmVFc1RlbXBsYXRlIiwicmVGbGFncyIsInJlSXNCYWRIZXgiLCJyZUlzQmluYXJ5IiwicmVJc0hvc3RDdG9yIiwicmVJc09jdGFsIiwicmVJc1VpbnQiLCJyZUxhdGluIiwicmVOb01hdGNoIiwicmVVbmVzY2FwZWRTdHJpbmciLCJyc0FzdHJhbFJhbmdlIiwicnNDb21ib01hcmtzUmFuZ2UiLCJyZUNvbWJvSGFsZk1hcmtzUmFuZ2UiLCJyc0NvbWJvU3ltYm9sc1JhbmdlIiwicnNDb21ib1JhbmdlIiwicnNEaW5nYmF0UmFuZ2UiLCJyc0xvd2VyUmFuZ2UiLCJyc01hdGhPcFJhbmdlIiwicnNOb25DaGFyUmFuZ2UiLCJyc1B1bmN0dWF0aW9uUmFuZ2UiLCJyc1NwYWNlUmFuZ2UiLCJyc1VwcGVyUmFuZ2UiLCJyc1ZhclJhbmdlIiwicnNCcmVha1JhbmdlIiwicnNBcG9zIiwicnNBc3RyYWwiLCJyc0JyZWFrIiwicnNDb21ibyIsInJzRGlnaXRzIiwicnNEaW5nYmF0IiwicnNMb3dlciIsInJzTWlzYyIsInJzRml0eiIsInJzTW9kaWZpZXIiLCJyc05vbkFzdHJhbCIsInJzUmVnaW9uYWwiLCJyc1N1cnJQYWlyIiwicnNVcHBlciIsInJzWldKIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJzT3B0Q29udHJMb3dlciIsInJzT3B0Q29udHJVcHBlciIsInJlT3B0TW9kIiwicnNPcHRWYXIiLCJyc09wdEpvaW4iLCJyc09yZExvd2VyIiwicnNPcmRVcHBlciIsInJzU2VxIiwicnNFbW9qaSIsInJzU3ltYm9sIiwicmVBcG9zIiwicmVDb21ib01hcmsiLCJjb250ZXh0UHJvcHMiLCJ0ZW1wbGF0ZUNvdW50ZXIiLCJ0eXBlZEFycmF5VGFncyIsImNsb25lYWJsZVRhZ3MiLCJkZWJ1cnJlZExldHRlcnMiLCLDgCIsIsOBIiwiw4IiLCLDgyIsIsOEIiwiw4UiLCLDoCIsIsOhIiwiw6IiLCLDoyIsIsOkIiwiw6UiLCLDhyIsIsOnIiwiw5AiLCLDsCIsIsOIIiwiw4kiLCLDiiIsIsOLIiwiw6giLCLDqSIsIsOqIiwiw6siLCLDjCIsIsONIiwiw44iLCLDjyIsIsOsIiwiw60iLCLDriIsIsOvIiwiw5EiLCLDsSIsIsOSIiwiw5MiLCLDlCIsIsOVIiwiw5YiLCLDmCIsIsOyIiwiw7MiLCLDtCIsIsO1Iiwiw7YiLCLDuCIsIsOZIiwiw5oiLCLDmyIsIsOcIiwiw7kiLCLDuiIsIsO7Iiwiw7wiLCLDnSIsIsO9Iiwiw78iLCLDhiIsIsOmIiwiw54iLCLDviIsIsOfIiwixIAiLCLEgiIsIsSEIiwixIEiLCLEgyIsIsSFIiwixIYiLCLEiCIsIsSKIiwixIwiLCLEhyIsIsSJIiwixIsiLCLEjSIsIsSOIiwixJAiLCLEjyIsIsSRIiwixJIiLCLElCIsIsSWIiwixJgiLCLEmiIsIsSTIiwixJUiLCLElyIsIsSZIiwixJsiLCLEnCIsIsSeIiwixKAiLCLEoiIsIsSdIiwixJ8iLCLEoSIsIsSjIiwixKQiLCLEpiIsIsSlIiwixKciLCLEqCIsIsSqIiwixKwiLCLEriIsIsSwIiwixKkiLCLEqyIsIsStIiwixK8iLCLEsSIsIsS0IiwixLUiLCLEtiIsIsS3IiwixLgiLCLEuSIsIsS7IiwixL0iLCLEvyIsIsWBIiwixLoiLCLEvCIsIsS+IiwixYAiLCLFgiIsIsWDIiwixYUiLCLFhyIsIsWKIiwixYQiLCLFhiIsIsWIIiwixYsiLCLFjCIsIsWOIiwixZAiLCLFjSIsIsWPIiwixZEiLCLFlCIsIsWWIiwixZgiLCLFlSIsIsWXIiwixZkiLCLFmiIsIsWcIiwixZ4iLCLFoCIsIsWbIiwixZ0iLCLFnyIsIsWhIiwixaIiLCLFpCIsIsWmIiwixaMiLCLFpSIsIsWnIiwixagiLCLFqiIsIsWsIiwixa4iLCLFsCIsIsWyIiwixakiLCLFqyIsIsWtIiwixa8iLCLFsSIsIsWzIiwixbQiLCLFtSIsIsW2IiwixbciLCLFuCIsIsW5IiwixbsiLCLFvSIsIsW6IiwixbwiLCLFviIsIsSyIiwixLMiLCLFkiIsIsWTIiwixYkiLCLFvyIsImh0bWxFc2NhcGVzIiwiJiIsIjwiLCJodG1sVW5lc2NhcGVzIiwiJmFtcDsiLCImbHQ7IiwiJmd0OyIsIiZxdW90OyIsIiYjMzk7IiwiXFwiLCJcbiIsIlxyIiwi4oCoIiwi4oCpIiwiZnJlZVBhcnNlRmxvYXQiLCJmcmVlUGFyc2VJbnQiLCJmcmVlR2xvYmFsIiwiZnJlZVNlbGYiLCJmcmVlRXhwb3J0cyIsImZyZWVNb2R1bGUiLCJtb2R1bGVFeHBvcnRzIiwiZnJlZVByb2Nlc3MiLCJub2RlVXRpbCIsIm5vZGVJc0FycmF5QnVmZmVyIiwibm9kZUlzRGF0ZSIsIm5vZGVJc01hcCIsImlzTWFwIiwibm9kZUlzUmVnRXhwIiwibm9kZUlzU2V0IiwiaXNTZXQiLCJub2RlSXNUeXBlZEFycmF5IiwiZGVidXJyTGV0dGVyIiwiZXNjYXBlSHRtbENoYXIiLCJ1bmVzY2FwZUh0bWxDaGFyIiwicnVuSW5Db250ZXh0IiwibG9kYXNoIiwiaXNPYmplY3RMaWtlIiwiTGF6eVdyYXBwZXIiLCJMb2Rhc2hXcmFwcGVyIiwid3JhcHBlckNsb25lIiwiYmFzZUxvZGFzaCIsImNoYWluQWxsIiwiX193cmFwcGVkX18iLCJfX2FjdGlvbnNfXyIsIl9fY2hhaW5fXyIsIl9faW5kZXhfXyIsIl9fdmFsdWVzX18iLCJfX2Rpcl9fIiwiX19maWx0ZXJlZF9fIiwiX19pdGVyYXRlZXNfXyIsIl9fdGFrZUNvdW50X18iLCJfX3ZpZXdzX18iLCJsYXp5Q2xvbmUiLCJjb3B5QXJyYXkiLCJsYXp5UmV2ZXJzZSIsImxhenlWYWx1ZSIsImlzQXJyIiwiaXNSaWdodCIsImFyckxlbmd0aCIsImdldFZpZXciLCJpdGVyYXRlZXMiLCJpdGVyTGVuZ3RoIiwidGFrZUNvdW50IiwibmF0aXZlTWluIiwiYmFzZVdyYXBwZXJWYWx1ZSIsIml0ZXJJbmRleCIsIkhhc2giLCJoYXNoQ2xlYXIiLCJuYXRpdmVDcmVhdGUiLCJoYXNoRGVsZXRlIiwiaGFzaEdldCIsImhhc2hIYXMiLCJoYXNoU2V0IiwiTGlzdENhY2hlIiwibGlzdENhY2hlQ2xlYXIiLCJsaXN0Q2FjaGVEZWxldGUiLCJhc3NvY0luZGV4T2YiLCJsaXN0Q2FjaGVHZXQiLCJsaXN0Q2FjaGVIYXMiLCJsaXN0Q2FjaGVTZXQiLCJNYXBDYWNoZSIsIm1hcENhY2hlQ2xlYXIiLCJNYXAiLCJtYXBDYWNoZURlbGV0ZSIsImdldE1hcERhdGEiLCJtYXBDYWNoZUdldCIsIm1hcENhY2hlSGFzIiwibWFwQ2FjaGVTZXQiLCJTZXRDYWNoZSIsInNldENhY2hlQWRkIiwic2V0Q2FjaGVIYXMiLCJTdGFjayIsInN0YWNrQ2xlYXIiLCJzdGFja0RlbGV0ZSIsInN0YWNrR2V0Iiwic3RhY2tIYXMiLCJzdGFja1NldCIsImFycmF5TGlrZUtleXMiLCJpc0FyZyIsImlzQXJndW1lbnRzIiwiaXNCdWZmIiwiaXNCdWZmZXIiLCJpc1R5cGUiLCJza2lwSW5kZXhlcyIsImlzSW5kZXgiLCJhcnJheVNhbXBsZSIsImJhc2VSYW5kb20iLCJhcnJheVNhbXBsZVNpemUiLCJzaHVmZmxlU2VsZiIsImJhc2VDbGFtcCIsImFycmF5U2h1ZmZsZSIsImFzc2lnbk1lcmdlVmFsdWUiLCJiYXNlQXNzaWduVmFsdWUiLCJhc3NpZ25WYWx1ZSIsIm9ialZhbHVlIiwiYmFzZUFnZ3JlZ2F0b3IiLCJiYXNlRWFjaCIsImJhc2VBc3NpZ24iLCJjb3B5T2JqZWN0IiwiYmFzZUFzc2lnbkluIiwia2V5c0luIiwiYmFzZUF0IiwiYmFzZUNsb25lIiwiYml0bWFzayIsImN1c3RvbWl6ZXIiLCJpc0RlZXAiLCJpc0ZsYXQiLCJpc0Z1bGwiLCJpbml0Q2xvbmVBcnJheSIsImdldFRhZyIsImlzRnVuYyIsImNsb25lQnVmZmVyIiwiaW5pdENsb25lT2JqZWN0IiwiY29weVN5bWJvbHNJbiIsImNvcHlTeW1ib2xzIiwiaW5pdENsb25lQnlUYWciLCJzdGFja2VkIiwia2V5c0Z1bmMiLCJnZXRBbGxLZXlzSW4iLCJnZXRBbGxLZXlzIiwic3ViVmFsdWUiLCJiYXNlQ29uZm9ybXMiLCJiYXNlQ29uZm9ybXNUbyIsImJhc2VEZWxheSIsImJhc2VEaWZmZXJlbmNlIiwiaXNDb21tb24iLCJ2YWx1ZXNMZW5ndGgiLCJ2YWx1ZXNJbmRleCIsImJhc2VFdmVyeSIsImJhc2VFeHRyZW11bSIsImlzU3ltYm9sIiwiYmFzZUZpbGwiLCJ0b0ludGVnZXIiLCJ0b0xlbmd0aCIsImJhc2VGaWx0ZXIiLCJiYXNlRmxhdHRlbiIsImlzRmxhdHRlbmFibGUiLCJiYXNlRm9yT3duIiwiYmFzZUZvciIsImJhc2VGb3JPd25SaWdodCIsImJhc2VGb3JSaWdodCIsImJhc2VGdW5jdGlvbnMiLCJiYXNlR2V0IiwiY2FzdFBhdGgiLCJ0b0tleSIsImJhc2VHZXRBbGxLZXlzIiwic3ltYm9sc0Z1bmMiLCJiYXNlR2V0VGFnIiwic3ltVG9TdHJpbmdUYWciLCJnZXRSYXdUYWciLCJvYmplY3RUb1N0cmluZyIsImJhc2VHdCIsImJhc2VIYXMiLCJiYXNlSGFzSW4iLCJiYXNlSW5SYW5nZSIsIm5hdGl2ZU1heCIsImJhc2VJbnRlcnNlY3Rpb24iLCJvdGhMZW5ndGgiLCJvdGhJbmRleCIsIm1heExlbmd0aCIsImJhc2VJbnZlcnRlciIsImJhc2VJbnZva2UiLCJiYXNlSXNBcmd1bWVudHMiLCJiYXNlSXNBcnJheUJ1ZmZlciIsImJhc2VJc0RhdGUiLCJiYXNlSXNFcXVhbCIsImJhc2VJc0VxdWFsRGVlcCIsImVxdWFsRnVuYyIsIm9iaklzQXJyIiwib3RoSXNBcnIiLCJvYmpUYWciLCJvdGhUYWciLCJvYmpJc09iaiIsIm90aElzT2JqIiwiaXNTYW1lVGFnIiwiZXF1YWxBcnJheXMiLCJlcXVhbEJ5VGFnIiwib2JqSXNXcmFwcGVkIiwib3RoSXNXcmFwcGVkIiwib2JqVW53cmFwcGVkIiwib3RoVW53cmFwcGVkIiwiZXF1YWxPYmplY3RzIiwiYmFzZUlzTWFwIiwiYmFzZUlzTWF0Y2giLCJtYXRjaERhdGEiLCJub0N1c3RvbWl6ZXIiLCJzcmNWYWx1ZSIsImJhc2VJc05hdGl2ZSIsImlzTWFza2VkIiwicmVJc05hdGl2ZSIsInRvU291cmNlIiwiYmFzZUlzUmVnRXhwIiwiYmFzZUlzU2V0IiwiYmFzZUlzVHlwZWRBcnJheSIsImlzTGVuZ3RoIiwiYmFzZUl0ZXJhdGVlIiwiYmFzZU1hdGNoZXNQcm9wZXJ0eSIsImJhc2VNYXRjaGVzIiwiYmFzZUtleXMiLCJpc1Byb3RvdHlwZSIsIm5hdGl2ZUtleXMiLCJiYXNlS2V5c0luIiwibmF0aXZlS2V5c0luIiwiaXNQcm90byIsImJhc2VMdCIsImJhc2VNYXAiLCJnZXRNYXRjaERhdGEiLCJtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSIsImlzS2V5IiwiaXNTdHJpY3RDb21wYXJhYmxlIiwiaGFzSW4iLCJiYXNlTWVyZ2UiLCJzcmNJbmRleCIsImJhc2VNZXJnZURlZXAiLCJtZXJnZUZ1bmMiLCJpc1R5cGVkIiwiaXNBcnJheUxpa2VPYmplY3QiLCJjbG9uZVR5cGVkQXJyYXkiLCJ0b1BsYWluT2JqZWN0IiwiYmFzZU50aCIsImJhc2VPcmRlckJ5IiwiZ2V0SXRlcmF0ZWUiLCJjcml0ZXJpYSIsImNvbXBhcmVNdWx0aXBsZSIsImJhc2VQaWNrIiwiYmFzZVBpY2tCeSIsImJhc2VTZXQiLCJiYXNlUHJvcGVydHlEZWVwIiwiYmFzZVB1bGxBbGwiLCJiYXNlUHVsbEF0IiwiYmFzZVVuc2V0IiwibmF0aXZlRmxvb3IiLCJuYXRpdmVSYW5kb20iLCJiYXNlUmFuZ2UiLCJuYXRpdmVDZWlsIiwiYmFzZVJlcGVhdCIsImJhc2VSZXN0Iiwic2V0VG9TdHJpbmciLCJvdmVyUmVzdCIsImJhc2VTYW1wbGUiLCJiYXNlU2FtcGxlU2l6ZSIsIm5lc3RlZCIsImJhc2VTaHVmZmxlIiwiYmFzZVNsaWNlIiwiYmFzZVNvbWUiLCJiYXNlU29ydGVkSW5kZXgiLCJyZXRIaWdoZXN0IiwibG93IiwiYmFzZVNvcnRlZEluZGV4QnkiLCJ2YWxJc05hTiIsInZhbElzTnVsbCIsInZhbElzU3ltYm9sIiwidmFsSXNVbmRlZmluZWQiLCJvdGhJc0RlZmluZWQiLCJvdGhJc051bGwiLCJvdGhJc1JlZmxleGl2ZSIsIm90aElzU3ltYm9sIiwic2V0TG93IiwiYmFzZVNvcnRlZFVuaXEiLCJiYXNlVG9OdW1iZXIiLCJiYXNlVG9TdHJpbmciLCJzeW1ib2xUb1N0cmluZyIsImJhc2VVbmlxIiwiY3JlYXRlU2V0Iiwic2VlbkluZGV4IiwiYmFzZVVwZGF0ZSIsInVwZGF0ZXIiLCJiYXNlV2hpbGUiLCJpc0Ryb3AiLCJiYXNlWG9yIiwiYmFzZVppcE9iamVjdCIsImFzc2lnbkZ1bmMiLCJ2YWxzTGVuZ3RoIiwiY2FzdEFycmF5TGlrZU9iamVjdCIsImNhc3RGdW5jdGlvbiIsInN0cmluZ1RvUGF0aCIsImNhc3RTbGljZSIsImFsbG9jVW5zYWZlIiwiY2xvbmVBcnJheUJ1ZmZlciIsImFycmF5QnVmZmVyIiwiY2xvbmVEYXRhVmlldyIsImRhdGFWaWV3IiwiY2xvbmVNYXAiLCJjbG9uZUZ1bmMiLCJjbG9uZVJlZ0V4cCIsImNsb25lU2V0IiwiY2xvbmVTeW1ib2wiLCJzeW1ib2xWYWx1ZU9mIiwidHlwZWRBcnJheSIsImNvbXBhcmVBc2NlbmRpbmciLCJ2YWxJc0RlZmluZWQiLCJ2YWxJc1JlZmxleGl2ZSIsIm9iakNyaXRlcmlhIiwib3RoQ3JpdGVyaWEiLCJvcmRlcnNMZW5ndGgiLCJjb21wb3NlQXJncyIsInBhcnRpYWxzIiwiaG9sZGVycyIsImlzQ3VycmllZCIsImFyZ3NJbmRleCIsImFyZ3NMZW5ndGgiLCJob2xkZXJzTGVuZ3RoIiwibGVmdEluZGV4IiwibGVmdExlbmd0aCIsInJhbmdlTGVuZ3RoIiwiaXNVbmN1cnJpZWQiLCJjb21wb3NlQXJnc1JpZ2h0IiwiaG9sZGVyc0luZGV4IiwicmlnaHRJbmRleCIsInJpZ2h0TGVuZ3RoIiwiaXNOZXciLCJnZXRTeW1ib2xzIiwiZ2V0U3ltYm9sc0luIiwiY3JlYXRlQWdncmVnYXRvciIsImluaXRpYWxpemVyIiwiY3JlYXRlQXNzaWduZXIiLCJhc3NpZ25lciIsInNvdXJjZXMiLCJndWFyZCIsImlzSXRlcmF0ZWVDYWxsIiwiY3JlYXRlQmFzZUVhY2giLCJpdGVyYWJsZSIsImNyZWF0ZUJhc2VGb3IiLCJjcmVhdGVCaW5kIiwiaXNCaW5kIiwiY3JlYXRlQ3RvciIsImNyZWF0ZUNhc2VGaXJzdCIsIm1ldGhvZE5hbWUiLCJ0cmFpbGluZyIsImNyZWF0ZUNvbXBvdW5kZXIiLCJ3b3JkcyIsImRlYnVyciIsInRoaXNCaW5kaW5nIiwiYmFzZUNyZWF0ZSIsImNyZWF0ZUN1cnJ5IiwiYXJpdHkiLCJnZXRIb2xkZXIiLCJjcmVhdGVSZWN1cnJ5IiwiY3JlYXRlSHlicmlkIiwiY3JlYXRlRmluZCIsImZpbmRJbmRleEZ1bmMiLCJjcmVhdGVGbG93IiwiZmxhdFJlc3QiLCJmdW5jcyIsInByZXJlcSIsInRocnUiLCJnZXRGdW5jTmFtZSIsImlzTGF6aWFibGUiLCJwbGFudCIsInBhcnRpYWxzUmlnaHQiLCJob2xkZXJzUmlnaHQiLCJhcmdQb3MiLCJhcnkiLCJob2xkZXJzQ291bnQiLCJuZXdIb2xkZXJzIiwiaXNCaW5kS2V5IiwicmVvcmRlciIsImlzRmxpcCIsImlzQXJ5IiwiY3JlYXRlSW52ZXJ0ZXIiLCJ0b0l0ZXJhdGVlIiwiY3JlYXRlTWF0aE9wZXJhdGlvbiIsImNyZWF0ZU92ZXIiLCJhcnJheUZ1bmMiLCJjcmVhdGVQYWRkaW5nIiwiY2hhcnNMZW5ndGgiLCJjcmVhdGVQYXJ0aWFsIiwidG9GaW5pdGUiLCJjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uIiwidG9OdW1iZXIiLCJ3cmFwRnVuYyIsImlzQ3VycnkiLCJuZXdIb2xkZXJzUmlnaHQiLCJuZXdQYXJ0aWFscyIsIm5ld1BhcnRpYWxzUmlnaHQiLCJuZXdEYXRhIiwic2V0RGF0YSIsInNldFdyYXBUb1N0cmluZyIsImNyZWF0ZVJvdW5kIiwiY3JlYXRlVG9QYWlycyIsImNyZWF0ZVdyYXAiLCJtZXJnZURhdGEiLCJiYXNlU2V0RGF0YSIsImN1c3RvbURlZmF1bHRzQXNzaWduSW4iLCJvYmplY3RQcm90byIsImN1c3RvbURlZmF1bHRzTWVyZ2UiLCJjdXN0b21PbWl0Q2xvbmUiLCJpc1BhcnRpYWwiLCJhcnJWYWx1ZSIsIm90aFZhbHVlIiwiY29tcGFyZWQiLCJjb252ZXJ0Iiwib2JqUHJvcHMiLCJvYmpMZW5ndGgiLCJvdGhQcm9wcyIsInNraXBDdG9yIiwib2JqQ3RvciIsIm90aEN0b3IiLCJmbGF0dGVuIiwicmVhbE5hbWVzIiwib3RoZXJGdW5jIiwiaXNLZXlhYmxlIiwiZ2V0TmF0aXZlIiwiaXNPd24iLCJ1bm1hc2tlZCIsIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwidHJhbnNmb3JtcyIsImdldFdyYXBEZXRhaWxzIiwiaGFzUGF0aCIsImhhc0Z1bmMiLCJnZXRQcm90b3R5cGUiLCJpbnNlcnRXcmFwRGV0YWlscyIsImRldGFpbHMiLCJzcHJlYWRhYmxlU3ltYm9sIiwibWFza1NyY0tleSIsIm1lbW9pemVDYXBwZWQiLCJtZW1vaXplIiwic3JjQml0bWFzayIsIm5ld0JpdG1hc2siLCJpc0NvbWJvIiwib3RoZXJBcmdzIiwib2xkQXJyYXkiLCJyZWZlcmVuY2UiLCJ1cGRhdGVXcmFwRGV0YWlscyIsInNob3J0T3V0IiwibGFzdENhbGxlZCIsInN0YW1wIiwibmF0aXZlTm93IiwicmFuZCIsImZ1bmNUb1N0cmluZyIsImNvbXBhY3QiLCJkcm9wIiwiZHJvcFJpZ2h0IiwiZHJvcFJpZ2h0V2hpbGUiLCJkcm9wV2hpbGUiLCJmaW5kSW5kZXgiLCJmaW5kTGFzdEluZGV4IiwiZmxhdHRlbkRlZXAiLCJmbGF0dGVuRGVwdGgiLCJmcm9tUGFpcnMiLCJuYXRpdmVKb2luIiwibnRoIiwicHVsbEFsbCIsInB1bGxBbGxCeSIsInB1bGxBbGxXaXRoIiwibmF0aXZlUmV2ZXJzZSIsInNvcnRlZEluZGV4Iiwic29ydGVkSW5kZXhCeSIsInNvcnRlZEluZGV4T2YiLCJzb3J0ZWRMYXN0SW5kZXgiLCJzb3J0ZWRMYXN0SW5kZXhCeSIsInNvcnRlZExhc3RJbmRleE9mIiwic29ydGVkVW5pcSIsInNvcnRlZFVuaXFCeSIsInRha2UiLCJ0YWtlUmlnaHQiLCJ0YWtlUmlnaHRXaGlsZSIsInRha2VXaGlsZSIsInVuaXEiLCJ1bmlxQnkiLCJ1bmlxV2l0aCIsInVuemlwIiwidW56aXBXaXRoIiwiemlwT2JqZWN0IiwiemlwT2JqZWN0RGVlcCIsInRhcCIsIndyYXBwZXJDaGFpbiIsIndyYXBwZXJDb21taXQiLCJ3cmFwcGVyTmV4dCIsIndyYXBwZXJUb0l0ZXJhdG9yIiwid3JhcHBlclBsYW50Iiwid3JhcHBlclJldmVyc2UiLCJ3cmFwcGVkIiwid3JhcHBlclZhbHVlIiwiZXZlcnkiLCJmbGF0TWFwIiwiZmxhdE1hcERlZXAiLCJmbGF0TWFwRGVwdGgiLCJmb3JFYWNoUmlnaHQiLCJiYXNlRWFjaFJpZ2h0IiwibmVnYXRlIiwic2FtcGxlIiwic2FtcGxlU2l6ZSIsImN1cnJ5IiwiY3VycnlSaWdodCIsImludm9rZUZ1bmMiLCJsYXN0QXJncyIsImxhc3RUaGlzIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nRWRnZSIsInRpbWVyRXhwaXJlZCIsImxlYWRpbmciLCJyZW1haW5pbmdXYWl0IiwidGltZVNpbmNlTGFzdENhbGwiLCJsYXN0Q2FsbFRpbWUiLCJ0aW1lU2luY2VMYXN0SW52b2tlIiwibWF4aW5nIiwibWF4V2FpdCIsInNob3VsZEludm9rZSIsInRyYWlsaW5nRWRnZSIsImRlYm91bmNlZCIsImlzSW52b2tpbmciLCJmbGlwIiwibWVtb2l6ZWQiLCJDYWNoZSIsInJlc3QiLCJzcHJlYWQiLCJ0aHJvdHRsZSIsInBhcnRpYWwiLCJjYXN0QXJyYXkiLCJjbG9uZVdpdGgiLCJjbG9uZURlZXAiLCJjbG9uZURlZXBXaXRoIiwiY29uZm9ybXNUbyIsImlzRW1wdHkiLCJpc0VxdWFsIiwiaXNFcXVhbFdpdGgiLCJpc0Vycm9yIiwibmF0aXZlSXNGaW5pdGUiLCJpc0ludGVnZXIiLCJpc01hdGNoIiwiaXNNYXRjaFdpdGgiLCJpc05hdGl2ZSIsImlzTWFza2FibGUiLCJpc05pbCIsIm9iamVjdEN0b3JTdHJpbmciLCJpc1NhZmVJbnRlZ2VyIiwiaXNXZWFrTWFwIiwiaXNXZWFrU2V0Iiwic3ltSXRlcmF0b3IiLCJyZW1haW5kZXIiLCJpc0JpbmFyeSIsInRvU2FmZUludGVnZXIiLCJmaW5kS2V5IiwiZmluZExhc3RLZXkiLCJmb3JJbiIsImZvckluUmlnaHQiLCJmb3JPd24iLCJmb3JPd25SaWdodCIsImZ1bmN0aW9ucyIsImZ1bmN0aW9uc0luIiwibWFwS2V5cyIsIm1hcFZhbHVlcyIsIm9taXRCeSIsInNldFdpdGgiLCJpc0Fyckxpa2UiLCJ1cGRhdGVXaXRoIiwidmFsdWVzSW4iLCJpblJhbmdlIiwiZmxvYXRpbmciLCJjYXBpdGFsaXplIiwidXBwZXJGaXJzdCIsImVuZHNXaXRoIiwiZXNjYXBlUmVnRXhwIiwic3RyTGVuZ3RoIiwicGFkRW5kIiwicGFkU3RhcnQiLCJyYWRpeCIsIm5hdGl2ZVBhcnNlSW50IiwicmVwZWF0IiwidGVtcGxhdGVTZXR0aW5ncyIsImFzc2lnbkluV2l0aCIsImlzRXNjYXBpbmciLCJpc0V2YWx1YXRpbmciLCJpbXBvcnRzIiwiaW1wb3J0c0tleXMiLCJpbXBvcnRzVmFsdWVzIiwicmVEZWxpbWl0ZXJzIiwiZXZhbHVhdGUiLCJlc2NhcGVWYWx1ZSIsImludGVycG9sYXRlVmFsdWUiLCJlc1RlbXBsYXRlVmFsdWUiLCJldmFsdWF0ZVZhbHVlIiwidmFyaWFibGUiLCJhdHRlbXB0IiwidG9Mb3dlciIsInRvVXBwZXIiLCJ0cmltRW5kIiwidHJpbVN0YXJ0Iiwib21pc3Npb24iLCJuZXdFbmQiLCJ1bmVzY2FwZSIsImNvbmQiLCJjb25mb3JtcyIsImRlZmF1bHRUbyIsIm1hdGNoZXNQcm9wZXJ0eSIsIm1peGluIiwibWV0aG9kTmFtZXMiLCJvbGREYXNoIiwibnRoQXJnIiwicHJvcGVydHlPZiIsInN0dWJBcnJheSIsInN0dWJGYWxzZSIsInN0dWJPYmplY3QiLCJzdHViU3RyaW5nIiwic3R1YlRydWUiLCJ1bmlxdWVJZCIsImlkQ291bnRlciIsIm1heEJ5IiwibWVhbkJ5IiwibWluQnkiLCJzdW1CeSIsImFycmF5UHJvdG8iLCJmdW5jUHJvdG8iLCJjb3JlSnNEYXRhIiwiSUVfUFJPVE8iLCJCdWZmZXIiLCJvYmplY3RDcmVhdGUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImlzQ29uY2F0U3ByZWFkYWJsZSIsInRvU3RyaW5nVGFnIiwiY3R4Q2xlYXJUaW1lb3V0IiwiY3R4Tm93IiwiY3R4U2V0VGltZW91dCIsIm5hdGl2ZUdldFN5bWJvbHMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJuYXRpdmVJc0J1ZmZlciIsIkRhdGFWaWV3IiwiU2V0IiwiV2Vha01hcCIsIm1ldGFNYXAiLCJkYXRhVmlld0N0b3JTdHJpbmciLCJtYXBDdG9yU3RyaW5nIiwicHJvbWlzZUN0b3JTdHJpbmciLCJzZXRDdG9yU3RyaW5nIiwid2Vha01hcEN0b3JTdHJpbmciLCJzeW1ib2xQcm90byIsImJhc2VTZXRUb1N0cmluZyIsImNhc3RSZXN0IiwiY3RvclN0cmluZyIsImRpZmZlcmVuY2UiLCJkaWZmZXJlbmNlQnkiLCJkaWZmZXJlbmNlV2l0aCIsImludGVyc2VjdGlvbkJ5IiwiaW50ZXJzZWN0aW9uV2l0aCIsInB1bGwiLCJwdWxsQXQiLCJ1bmlvbiIsInVuaW9uQnkiLCJ1bmlvbldpdGgiLCJ3aXRob3V0IiwieG9yIiwieG9yQnkiLCJ4b3JXaXRoIiwiemlwV2l0aCIsIndyYXBwZXJBdCIsImNvdW50QnkiLCJmaW5kTGFzdCIsImludm9rZU1hcCIsImtleUJ5IiwiYmluZEtleSIsIm92ZXJBcmdzIiwiZnVuY3NMZW5ndGgiLCJwYXJ0aWFsUmlnaHQiLCJyZWFyZyIsImd0ZSIsImx0ZSIsImFzc2lnbkluIiwiYXNzaWduV2l0aCIsImF0IiwiZGVmYXVsdHNEZWVwIiwibWVyZ2VXaXRoIiwiaW52ZXJ0QnkiLCJ0b1BhaXJzIiwidG9QYWlyc0luIiwid29yZCIsImtlYmFiQ2FzZSIsImxvd2VyRmlyc3QiLCJzbmFrZUNhc2UiLCJzdGFydENhc2UiLCJ1cHBlckNhc2UiLCJiaW5kQWxsIiwiZmxvdyIsImZsb3dSaWdodCIsIm1ldGhvZE9mIiwib3ZlciIsIm92ZXJFdmVyeSIsIm92ZXJTb21lIiwicmFuZ2VSaWdodCIsImF1Z2VuZCIsImFkZGVuZCIsImRpdmlkZSIsImRpdmlkZW5kIiwiZGl2aXNvciIsIm11bHRpcGx5IiwibXVsdGlwbGljYW5kIiwibWludWVuZCIsInN1YnRyYWhlbmQiLCJlbnRyaWVzSW4iLCJleHRlbmRXaXRoIiwiZWFjaFJpZ2h0IiwidGFrZU5hbWUiLCJkcm9wTmFtZSIsImNoZWNrSXRlcmF0ZWUiLCJpc1Rha2VyIiwibG9kYXNoRnVuYyIsInJldFVud3JhcHBlZCIsImlzTGF6eSIsInVzZUxhenkiLCJpc0h5YnJpZCIsImlzVW53cmFwcGVkIiwib25seUxhenkiLCJjaGFpbk5hbWUiLCJjb21taXQiLCJpc1VuZGVmaW5lZE9yTnVsbCIsInJlcXVpcmVNb21lbnQiLCJhbmd1bGFyTW9tZW50Iiwic3RhdGVmdWxGaWx0ZXJzIiwic2VydmVyVGltZSIsInRpdGxlRm9ybWF0IiwiZnVsbERhdGVUaHJlc2hvbGQiLCJmdWxsRGF0ZUZvcm1hdCIsImZ1bGxEYXRlVGhyZXNob2xkVW5pdCIsImFtTW9tZW50IiwiYW1UaW1lQWdvQ29uZmlnIiwiZ2V0Tm93IiwiY3VycmVudEZyb20iLCJsb2NhbE5vdyIsIm5vd01pbGxpcyIsImxvY2FsRGF0ZSIsImNhbmNlbFRpbWVyIiwiYWN0aXZlVGltZW91dCIsInVwZGF0ZVRpbWUiLCJtb21lbnRJbnN0YW5jZSIsInRpbWVBZ28iLCJzaG93RnVsbERhdGUiLCJzZXRUaXRsZVRpbWUiLCJob3dPbGQiLCJzZWNvbmRzVW50aWxVcGRhdGUiLCJ1cGRhdGVEYXRlVGltZUF0dHIiLCJpc1RpbWVFbGVtZW50IiwidXBkYXRlTW9tZW50IiwibW9tZW50VmFsdWUiLCJwcmVwcm9jZXNzRGF0ZSIsIm1vZGVsTmFtZSIsImFtVGltZUFnbyIsImFtRnJvbSIsImFtV2l0aG91dFN1ZmZpeCIsImFuZ3VsYXJNb21lbnRDb25maWciLCJkZWZhdWx0VGltZXpvbmUiLCJjaGFuZ2VMb2NhbGUiLCJjdXN0b21pemF0aW9uIiwiY2hhbmdlVGltZXpvbmUiLCJ0eiIsInNldERlZmF1bHQiLCJhbVV0Y09mZnNldCIsImFtVGltZXpvbmUiLCJhTW9tZW50IiwiYW1DYWxlbmRhckZpbHRlciIsInJlZmVyZW5jZVRpbWUiLCJhbURpZmZlcmVuY2VGaWx0ZXIiLCJvdGhlclZhbHVlIiwidXNlUHJlY2lzaW9uIiwiZGF0ZTIiLCJhbURhdGVGb3JtYXRGaWx0ZXIiLCJhbUR1cmF0aW9uRm9ybWF0RmlsdGVyIiwiYW1UaW1lQWdvRmlsdGVyIiwiZGF0ZUZyb20iLCJhbVN1YnRyYWN0RmlsdGVyIiwiYW1BZGRGaWx0ZXIiLCJhbVN0YXJ0T2ZGaWx0ZXIiLCJhbUVuZE9mRmlsdGVyIiwiaXNFbGVjdHJvbiIsInRyYW5zaXRpb25FbmQiLCJ0cmFuc0VuZEV2ZW50TmFtZXMiLCJXZWJraXRUcmFuc2l0aW9uIiwiTW96VHJhbnNpdGlvbiIsIk9UcmFuc2l0aW9uIiwiZW11bGF0ZVRyYW5zaXRpb25FbmQiLCIkZWwiLCJic1RyYW5zaXRpb25FbmQiLCJQbHVnaW4iLCIkdGhpcyIsIkFsZXJ0IiwiZGlzbWlzcyIsImNsb3NlIiwiVFJBTlNJVElPTl9EVVJBVElPTiIsInJlbW92ZUVsZW1lbnQiLCJhbGVydCIsIkJ1dHRvbiIsInNldFN0YXRlIiwiREVGQVVMVFMiLCJpc0xvYWRpbmciLCJsb2FkaW5nVGV4dCIsInJlc2V0VGV4dCIsIiRpbnB1dCIsIiRidG4iLCJDYXJvdXNlbCIsInNsaWRlIiwiJGluZGljYXRvcnMiLCJwYXVzZWQiLCJzbGlkaW5nIiwiJGFjdGl2ZSIsIiRpdGVtcyIsImtleWJvYXJkIiwiZ2V0SXRlbUluZGV4IiwiZ2V0SXRlbUZvckRpcmVjdGlvbiIsImFjdGl2ZUluZGV4Iiwid2lsbFdyYXAiLCJpdGVtSW5kZXgiLCIkbmV4dCIsImlzQ3ljbGluZyIsInNsaWRlRXZlbnQiLCIkbmV4dEluZGljYXRvciIsInNsaWRFdmVudCIsImNhcm91c2VsIiwiY2xpY2tIYW5kbGVyIiwiJHRhcmdldCIsInNsaWRlSW5kZXgiLCIkY2Fyb3VzZWwiLCJnZXRUYXJnZXRGcm9tVHJpZ2dlciIsIiR0cmlnZ2VyIiwiQ29sbGFwc2UiLCJ0cmFuc2l0aW9uaW5nIiwiZ2V0UGFyZW50IiwiYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzIiwiaGFzV2lkdGgiLCJhY3RpdmVzRGF0YSIsImFjdGl2ZXMiLCJzdGFydEV2ZW50Iiwic2Nyb2xsU2l6ZSIsImlzT3BlbiIsImNvbGxhcHNlIiwiY2xlYXJNZW51cyIsImJhY2tkcm9wIiwiRHJvcGRvd24iLCJpc0FjdGl2ZSIsImRlc2MiLCJkcm9wZG93biIsIl9yZWxhdGVkVGFyZ2V0IiwiTW9kYWwiLCIkYm9keSIsIiRkaWFsb2ciLCIkYmFja2Ryb3AiLCJpc1Nob3duIiwib3JpZ2luYWxCb2R5UGFkIiwic2Nyb2xsYmFyV2lkdGgiLCJpZ25vcmVCYWNrZHJvcENsaWNrIiwicmVtb3RlIiwiQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTiIsImNoZWNrU2Nyb2xsYmFyIiwic2V0U2Nyb2xsYmFyIiwiYWRqdXN0RGlhbG9nIiwiZW5mb3JjZUZvY3VzIiwiaGlkZU1vZGFsIiwiaGFuZGxlVXBkYXRlIiwicmVzZXRBZGp1c3RtZW50cyIsInJlc2V0U2Nyb2xsYmFyIiwicmVtb3ZlQmFja2Ryb3AiLCJkb0FuaW1hdGUiLCJjYWxsYmFja1JlbW92ZSIsIm1vZGFsSXNPdmVyZmxvd2luZyIsInNjcm9sbEhlaWdodCIsImNsaWVudEhlaWdodCIsInBhZGRpbmdMZWZ0IiwiYm9keUlzT3ZlcmZsb3dpbmciLCJwYWRkaW5nUmlnaHQiLCJmdWxsV2luZG93V2lkdGgiLCJpbm5lcldpZHRoIiwiZG9jdW1lbnRFbGVtZW50UmVjdCIsImNsaWVudFdpZHRoIiwibWVhc3VyZVNjcm9sbGJhciIsImJvZHlQYWQiLCJzY3JvbGxEaXYiLCJtb2RhbCIsInNob3dFdmVudCIsIlRvb2x0aXAiLCJob3ZlclN0YXRlIiwiaW5TdGF0ZSIsInBsYWNlbWVudCIsInZpZXdwb3J0IiwiJHZpZXdwb3J0IiwidHJpZ2dlcnMiLCJldmVudEluIiwiZXZlbnRPdXQiLCJfb3B0aW9ucyIsImZpeFRpdGxlIiwiZ2V0RGVmYXVsdHMiLCJnZXREZWxlZ2F0ZU9wdGlvbnMiLCJ0aXAiLCJpc0luU3RhdGVUcnVlIiwiaW5Eb20iLCIkdGlwIiwidGlwSWQiLCJnZXRVSUQiLCJzZXRDb250ZW50IiwiYXV0b1Rva2VuIiwiYXV0b1BsYWNlIiwiZ2V0UG9zaXRpb24iLCJhY3R1YWxXaWR0aCIsImFjdHVhbEhlaWdodCIsIm9yZ1BsYWNlbWVudCIsInZpZXdwb3J0RGltIiwiY2FsY3VsYXRlZE9mZnNldCIsImdldENhbGN1bGF0ZWRPZmZzZXQiLCJhcHBseVBsYWNlbWVudCIsInByZXZIb3ZlclN0YXRlIiwibWFyZ2luVG9wIiwiZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhIiwiaXNWZXJ0aWNhbCIsImFycm93RGVsdGEiLCJhcnJvd09mZnNldFBvc2l0aW9uIiwicmVwbGFjZUFycm93IiwiYXJyb3ciLCJnZXRUaXRsZSIsIiRlIiwiaXNCb2R5IiwiZWxSZWN0IiwiU1ZHRWxlbWVudCIsImVsT2Zmc2V0Iiwib3V0ZXJEaW1zIiwidmlld3BvcnRQYWRkaW5nIiwidmlld3BvcnREaW1lbnNpb25zIiwidG9wRWRnZU9mZnNldCIsImJvdHRvbUVkZ2VPZmZzZXQiLCJsZWZ0RWRnZU9mZnNldCIsInJpZ2h0RWRnZU9mZnNldCIsIiRhcnJvdyIsImVuYWJsZSIsInRvZ2dsZUVuYWJsZWQiLCJ0b29sdGlwIiwiUG9wb3ZlciIsImdldENvbnRlbnQiLCJwb3BvdmVyIiwiU2Nyb2xsU3B5IiwiJHNjcm9sbEVsZW1lbnQiLCJhY3RpdmVUYXJnZXQiLCJnZXRTY3JvbGxIZWlnaHQiLCJvZmZzZXRNZXRob2QiLCJvZmZzZXRCYXNlIiwiJGhyZWYiLCJtYXhTY3JvbGwiLCJhY3RpdmF0ZSIsInNjcm9sbHNweSIsIiRzcHkiLCJUYWIiLCIkdWwiLCIkcHJldmlvdXMiLCJoaWRlRXZlbnQiLCJ0YWIiLCJBZmZpeCIsImNoZWNrUG9zaXRpb24iLCJjaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcCIsImFmZml4ZWQiLCJ1bnBpbiIsInBpbm5lZE9mZnNldCIsIlJFU0VUIiwiZ2V0U3RhdGUiLCJvZmZzZXRUb3AiLCJvZmZzZXRCb3R0b20iLCJ0YXJnZXRIZWlnaHQiLCJjb2xsaWRlclRvcCIsImNvbGxpZGVySGVpZ2h0IiwiZ2V0UGlubmVkT2Zmc2V0IiwiYWZmaXgiLCJhZmZpeFR5cGUiLCJfdGhlbWVzIiwic2V0RGVmYXVsdHMiLCJzZXRUaGVtZSIsInRoZW1lcyIsIlNwaW5KU1NwaW5uZXIiLCJ1c1NwaW5uZXJDb25maWciLCJzdG9wU3Bpbm5lciIsInNwaW5uZXIiLCJzcGlubmVyS2V5Iiwic3RhcnRBY3RpdmUiLCJzcGlubmVyU3RhcnRBY3RpdmUiLCJ1c1NwaW5uZXIiLCJzcGlubmVyVGhlbWUiLCJzcGlubmVyT24iLCJBUEkiLCJkZXJpdmVkIiwiQ2hhcnQiLCIkJCIsImludGVybmFsIiwiQ2hhcnRJbnRlcm5hbCIsImxvYWRDb25maWciLCJiZWZvcmVJbml0IiwiYWZ0ZXJJbml0IiwiYmluZFRoaXMiLCJhcmdUaGlzIiwiYzNfY2hhcnRfZm4iLCJhcGkiLCJheGVzIiwiQXhpcyIsImMzX2F4aXMiLCJheGlzWCIsInRpY2tPZmZzZXQiLCJheGlzWSIsImdlbmVyYXRlVGlja3MiLCJ0aWNrQXJndW1lbnRzIiwiY29weVNjYWxlIiwibmV3U2NhbGUiLCJpc0NhdGVnb3J5IiwidGV4dEZvcm1hdHRlZCIsImZvcm1hdHRlZCIsImdldFNpemVGb3IxQ2hhciIsInRpY2tUZXh0Q2hhclNpemUiLCJib3giLCJ0cmFuc2l0aW9uaXNlIiwid2l0aG91dFRyYW5zaXRpb24iLCJzcGxpdFRpY2tUZXh0Iiwic3BsaXR0ZWQiLCJzcGFjZUluZGV4Iiwic3VidGV4dCIsInRleHRXaWR0aCIsInNpemVGb3IxQ2hhciIsInRpY2tUZXh0IiwidHNwYW5EeSIsInRpY2tQb3NpdGlvbiIsInRpY2tDZW50ZXJlZCIsInRleHRBbmNob3JGb3JUZXh0IiwidGV4dFRyYW5zZm9ybSIsImR4Rm9yVGV4dCIsInlGb3JUZXh0IiwidGlja0xlbmd0aCIsInRpY2tYIiwidGlja1kiLCJ0c3BhbiIsInRpY2tNdWx0aWxpbmUiLCJ0aWNrV2lkdGgiLCJ0aWNrVGV4dFJvdGF0ZSIsInRpY2tDdWxsaW5nIiwid2l0aE91dGVyVGljayIsImlzQ2VudGVyZWQiLCJ0aWNrSW50ZXJ2YWwiLCJnZXRUb3RhbExlbmd0aCIsImN1bGxpbmciLCJjM19jaGFydF9pbnRlcm5hbF9mbiIsImMzX2NoYXJ0X2ludGVybmFsX2F4aXNfZm4iLCJjMyIsImdlbmVyYXRlIiwiY2hhcnQiLCJpbml0UGFyYW1zIiwiZGF0YV91cmwiLCJjb252ZXJ0VXJsVG9EYXRhIiwiZGF0YV9taW1lVHlwZSIsImRhdGFfaGVhZGVycyIsImRhdGFfa2V5cyIsImluaXRXaXRoRGF0YSIsImRhdGFfanNvbiIsImNvbnZlcnRKc29uVG9EYXRhIiwiZGF0YV9yb3dzIiwiY29udmVydFJvd3NUb0RhdGEiLCJkYXRhX2NvbHVtbnMiLCJjb252ZXJ0Q29sdW1uc1RvRGF0YSIsImNsaXBJZCIsImNsaXBJZEZvclhBeGlzIiwiY2xpcElkRm9yWUF4aXMiLCJjbGlwSWRGb3JHcmlkIiwiY2xpcElkRm9yU3ViY2hhcnQiLCJjbGlwUGF0aCIsImdldENsaXBQYXRoIiwiY2xpcFBhdGhGb3JYQXhpcyIsImNsaXBQYXRoRm9yWUF4aXMiLCJjbGlwUGF0aEZvckdyaWQiLCJjbGlwUGF0aEZvclN1YmNoYXJ0IiwiZHJhZ1N0YXJ0IiwiZmxvd2luZyIsImNhbmNlbENsaWNrIiwibW91c2VvdmVyIiwidHJhbnNpdGluZyIsImdlbmVyYXRlQ29sb3IiLCJsZXZlbENvbG9yIiwiZ2VuZXJhdGVMZXZlbENvbG9yIiwiZGF0YVRpbWVGb3JtYXQiLCJkYXRhX3hMb2NhbHRpbWUiLCJheGlzVGltZUZvcm1hdCIsImF4aXNfeF9sb2NhbHRpbWUiLCJkZWZhdWx0QXhpc1RpbWVGb3JtYXQiLCJoaWRkZW5UYXJnZXRJZHMiLCJoaWRkZW5MZWdlbmRJZHMiLCJmb2N1c2VkVGFyZ2V0SWRzIiwiZGVmb2N1c2VkVGFyZ2V0SWRzIiwieE9yaWVudCIsImF4aXNfcm90YXRlZCIsInlPcmllbnQiLCJheGlzX3lfaW5uZXIiLCJ5Mk9yaWVudCIsImF4aXNfeTJfaW5uZXIiLCJzdWJYT3JpZW50IiwiaXNMZWdlbmRSaWdodCIsImxlZ2VuZF9wb3NpdGlvbiIsImlzTGVnZW5kSW5zZXQiLCJpc0xlZ2VuZFRvcCIsImxlZ2VuZF9pbnNldF9hbmNob3IiLCJpc0xlZ2VuZExlZnQiLCJsZWdlbmRTdGVwIiwibGVnZW5kSXRlbVdpZHRoIiwibGVnZW5kSXRlbUhlaWdodCIsImN1cnJlbnRNYXhUaWNrV2lkdGhzIiwicm90YXRlZF9wYWRkaW5nX2xlZnQiLCJyb3RhdGVkX3BhZGRpbmdfcmlnaHQiLCJheGlzX3hfc2hvdyIsInJvdGF0ZWRfcGFkZGluZ190b3AiLCJ3aXRob3V0RmFkZUluIiwiaW50ZXJ2YWxGb3JPYnNlcnZlSW5zZXJ0ZWQiLCJzdWJ4IiwiaW5pdENoYXJ0RWxlbWVudHMiLCJpbml0QmFyIiwiaW5pdExpbmUiLCJpbml0QXJjIiwiaW5pdEdhdWdlIiwiaW5pdFRleHQiLCJkZWZzIiwibWFpbiIsImluaXRQaWUiLCJpbml0QnJ1c2giLCJpbml0Wm9vbSIsImJpbmR0byIsInNlbGVjdENoYXJ0Iiwib2JzZXJ2ZUluc2VydGVkIiwiY29udmVydERhdGFUb1RhcmdldHMiLCJkYXRhX2ZpbHRlciIsImRhdGFfaGlkZSIsImFkZEhpZGRlblRhcmdldElkcyIsIm1hcFRvSWRzIiwibGVnZW5kX2hpZGUiLCJhZGRIaWRkZW5MZWdlbmRJZHMiLCJoYXNUeXBlIiwibGVnZW5kX3Nob3ciLCJ1cGRhdGVTaXplcyIsInVwZGF0ZVNjYWxlcyIsImdldFhEb21haW4iLCJnZXRZRG9tYWluIiwic3ViWCIsInN1YlkiLCJzdWJZMiIsIm9yZ1hEb21haW4iLCJ6b29tX2VuYWJsZWQiLCJvbm1vdXNlb3ZlciIsIm9ubW91c2VvdXQiLCJzdmdfY2xhc3NuYW1lIiwiY2xpcENoYXJ0IiwiYXBwZW5kQ2xpcCIsImNsaXBYQXhpcyIsImNsaXBZQXhpcyIsImNsaXBHcmlkIiwiY2xpcFN1YmNoYXJ0IiwidXBkYXRlU3ZnU2l6ZSIsImdldFRyYW5zbGF0ZSIsImluaXRTdWJjaGFydCIsImluaXRUb29sdGlwIiwiaW5pdExlZ2VuZCIsImluaXRUaXRsZSIsImluaXRSZWdpb24iLCJpbml0R3JpZCIsImdyaWRfbGluZXNfZnJvbnQiLCJpbml0R3JpZExpbmVzIiwiaW5pdEV2ZW50UmVjdCIsInpvb21fcHJpdmlsZWdlZCIsInJlZ2lvbnMiLCJ6b29tUmVjdCIsImF4aXNfeF9leHRlbnQiLCJnZXREZWZhdWx0RXh0ZW50IiwidXBkYXRlVGFyZ2V0cyIsInVwZGF0ZURpbWVuc2lvbiIsIm9uaW5pdCIsIndpdGhUcmFuc2l0aW9uIiwid2l0aFRyYW5zZm9ybSIsIndpdGhVcGRhdGVYRG9tYWluIiwid2l0aFVwZGF0ZU9yZ1hEb21haW4iLCJ3aXRoVHJhbnNpdGlvbkZvckF4aXMiLCJiaW5kUmVzaXplIiwic21vb3RoTGluZXMiLCJsZWdlbmRIZWlnaHQiLCJsZWdlbmQiLCJnZXRMZWdlbmRIZWlnaHQiLCJsZWdlbmRXaWR0aCIsImdldExlZ2VuZFdpZHRoIiwibGVnZW5kSGVpZ2h0Rm9yQm90dG9tIiwiaGFzQXJjIiwiaGFzQXJjVHlwZSIsInhBeGlzSGVpZ2h0IiwiZ2V0SG9yaXpvbnRhbEF4aXNIZWlnaHQiLCJzdWJjaGFydEhlaWdodCIsInN1YmNoYXJ0X3Nob3ciLCJzdWJjaGFydF9zaXplX2hlaWdodCIsImN1cnJlbnRXaWR0aCIsImdldEN1cnJlbnRXaWR0aCIsImN1cnJlbnRIZWlnaHQiLCJnZXRDdXJyZW50SGVpZ2h0IiwiZ2V0Q3VycmVudFBhZGRpbmdUb3AiLCJnZXRDdXJyZW50UGFkZGluZ1JpZ2h0IiwiZ2V0Q3VycmVudFBhZGRpbmdCb3R0b20iLCJnZXRDdXJyZW50UGFkZGluZ0xlZnQiLCJtYXJnaW4yIiwibWFyZ2luMyIsInVwZGF0ZVNpemVGb3JMZWdlbmQiLCJ3aWR0aDIiLCJoZWlnaHQyIiwiYXJjV2lkdGgiLCJhcmNIZWlnaHQiLCJnYXVnZV9mdWxsQ2lyY2xlIiwiZ2V0R2F1Z2VMYWJlbEhlaWdodCIsInVwZGF0ZVJhZGl1cyIsInJhZGl1c0V4cGFuZGVkIiwidXBkYXRlVGFyZ2V0c0ZvclRleHQiLCJ1cGRhdGVUYXJnZXRzRm9yQmFyIiwidXBkYXRlVGFyZ2V0c0ZvckxpbmUiLCJ1cGRhdGVUYXJnZXRzRm9yQXJjIiwidXBkYXRlVGFyZ2V0c0ZvclN1YmNoYXJ0Iiwic2hvd1RhcmdldHMiLCJpc1RhcmdldFRvU2hvdyIsInRyYW5zaXRpb25fZHVyYXRpb24iLCJ3aXRoWSIsIndpdGhTdWJjaGFydCIsIndpdGhUcmFuc2l0aW9uRm9yRXhpdCIsIndpdGhUcmltWERvbWFpbiIsIndpdGhMZWdlbmQiLCJ3aXRoRXZlbnRSZWN0Iiwid2l0aERpbWVuc2lvbiIsIndpdGhVcGRhdGVYQXhpcyIsImRyYXdBcmVhIiwiZHJhd0JhciIsImRyYXdMaW5lIiwieEZvclRleHQiLCJkdXJhdGlvbkZvckV4aXQiLCJkdXJhdGlvbkZvckF4aXMiLCJ3YWl0Rm9yRHJhdyIsImludGVydmFsRm9yQ3VsbGluZyIsInhEb21haW5Gb3Jab29tIiwiYXJlYUluZGljZXMiLCJnZXRTaGFwZUluZGljZXMiLCJpc0FyZWFUeXBlIiwiYmFySW5kaWNlcyIsImlzQmFyVHlwZSIsImxpbmVJbmRpY2VzIiwiaXNMaW5lVHlwZSIsImhpZGVBeGlzIiwidGFyZ2V0c1RvU2hvdyIsImZpbHRlclRhcmdldHNUb1Nob3ciLCJ4diIsImdlbmVyYXRlVHJhbnNpdGlvbnMiLCJ1cGRhdGVMZWdlbmQiLCJpc0NhdGVnb3JpemVkIiwidXBkYXRlWERvbWFpbiIsImF4aXNfeF90aWNrX3ZhbHVlcyIsInVwZGF0ZVhBeGlzVGlja1ZhbHVlcyIsInhBeGlzIiwic3ViWEF4aXMiLCJ6b29tX3Jlc2NhbGUiLCJvcmdEb21haW4iLCJheGlzX3lfdGlja192YWx1ZXMiLCJheGlzX3lfdGlja19jb3VudCIsInlBeGlzIiwiZ2VuZXJhdGVUaWNrVmFsdWVzIiwiYXhpc195Ml90aWNrX3ZhbHVlcyIsImF4aXNfeTJfdGlja19jb3VudCIsInkyQXhpcyIsInVwZGF0ZUxhYmVscyIsImF4aXNfeF90aWNrX2N1bGxpbmciLCJheGlzX3hfdGlja19jdWxsaW5nX21heCIsImdlbmVyYXRlRHJhd0FyZWEiLCJnZW5lcmF0ZURyYXdCYXIiLCJnZW5lcmF0ZURyYXdMaW5lIiwiZ2VuZXJhdGVYWUZvclRleHQiLCJ1cGRhdGVYZ3JpZEZvY3VzIiwiZGF0YV9lbXB0eV9sYWJlbF90ZXh0IiwidXBkYXRlR3JpZCIsInVwZGF0ZVJlZ2lvbiIsInVwZGF0ZUJhciIsInVwZGF0ZUxpbmUiLCJ1cGRhdGVBcmVhIiwidXBkYXRlQ2lyY2xlIiwiaGFzRGF0YUxhYmVsIiwidXBkYXRlVGV4dCIsInJlZHJhd1RpdGxlIiwicmVkcmF3QXJjIiwicmVkcmF3U3ViY2hhcnQiLCJzZWxlY3RlZENpcmNsZXMiLCJpbnRlcmFjdGlvbl9lbmFibGVkIiwicmVkcmF3RXZlbnRSZWN0IiwidXBkYXRlWm9vbSIsInVwZGF0ZUNpcmNsZVkiLCJjaXJjbGVZIiwiY2lyY2xlWCIsImdlbmVyYXRlRmxvdyIsImlzVGFiVmlzaWJsZSIsInRyYW5zaXRpb25zVG9XYWl0IiwicmVkcmF3QmFyIiwicmVkcmF3TGluZSIsInJlZHJhd0FyZWEiLCJyZWRyYXdDaXJjbGUiLCJyZWRyYXdUZXh0IiwicmVkcmF3UmVnaW9uIiwicmVkcmF3R3JpZCIsImdlbmVyYXRlV2FpdCIsIm9ucmVuZGVyZWQiLCJ1cGRhdGVBbmRSZWRyYXciLCJ3aXRoVHJhbnNpdGlvbkZvclRyYW5zZm9ybSIsInRyYW5zZm9ybUFsbCIsInJlZHJhd1dpdGhvdXRSZXNjYWxlIiwiaXNUaW1lU2VyaWVzIiwiYXhpc194X3R5cGUiLCJpc0N1c3RvbVgiLCJkYXRhX3giLCJub3RFbXB0eSIsImRhdGFfeHMiLCJpc1RpbWVTZXJpZXNZIiwiYXhpc195X3R5cGUiLCJhc0hhbGZQaXhlbCIsImluaXRpYWxPcGFjaXR5IiwiaW5pdGlhbE9wYWNpdHlGb3JDaXJjbGUiLCJvcGFjaXR5Rm9yQ2lyY2xlIiwicG9pbnRfc2hvdyIsImlzVmFsdWUiLCJpc1NjYXR0ZXJUeXBlIiwib3BhY2l0eUZvclRleHQiLCJ4eCIsImF4aXNfeF9jYXRlZ29yaWVzIiwieXYiLCJ5U2NhbGUiLCJzdWJ4eCIsInRyYW5zZm9ybU1haW4iLCJheGlzWTIiLCJjaGFydEFyY3MiLCJ0cmFuc2Zvcm1Db250ZXh0IiwidHJhbnNmb3JtTGVnZW5kIiwiZ2V0WEF4aXNDbGlwWCIsImdldFhBeGlzQ2xpcFkiLCJnZXRYQXhpc0NsaXBXaWR0aCIsImdldFhBeGlzQ2xpcEhlaWdodCIsImdldFlBeGlzQ2xpcFgiLCJnZXRZQXhpc0NsaXBZIiwiZ2V0WUF4aXNDbGlwV2lkdGgiLCJnZXRZQXhpc0NsaXBIZWlnaHQiLCJ3aXRob3V0QXhpcyIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtdXRhdGlvbiIsInByZXZpb3VzU2libGluZyIsImRpc2Nvbm5lY3QiLCJvYnNlcnZlIiwiY2hpbGRMaXN0IiwiY2hhcmFjdGVyRGF0YSIsInJlc2l6ZUZ1bmN0aW9uIiwiZ2VuZXJhdGVSZXNpemUiLCJvbnJlc2l6ZSIsInJlc2l6ZV9hdXRvIiwicmVzaXplVGltZW91dCIsIm9ucmVzaXplZCIsImNhbGxSZXNpemVGdW5jdGlvbnMiLCJyZXNpemVGdW5jdGlvbnMiLCJlbmRhbGwiLCJkYXRhX3hGb3JtYXQiLCJtb3pIaWRkZW4iLCJtc0hpZGRlbiIsIndlYmtpdEhpZGRlbiIsInNpemVfd2lkdGgiLCJzaXplX2hlaWdodCIsInBhZGRpbmdfbGVmdCIsInBhZGRpbmdfcmlnaHQiLCJwYWRkaW5nX3RvcCIsInBhZGRpbmdfYm90dG9tIiwiem9vbV9leHRlbnQiLCJ6b29tX29uem9vbSIsInpvb21fb256b29tc3RhcnQiLCJ6b29tX29uem9vbWVuZCIsInpvb21feF9taW4iLCJ6b29tX3hfbWF4IiwiaW50ZXJhY3Rpb25fYnJpZ2h0ZW4iLCJkYXRhX3hTb3J0IiwiZGF0YV9pZENvbnZlcnRlciIsImRhdGFfbmFtZXMiLCJkYXRhX2NsYXNzZXMiLCJkYXRhX2dyb3VwcyIsImRhdGFfYXhlcyIsImRhdGFfdHlwZSIsImRhdGFfdHlwZXMiLCJkYXRhX2xhYmVscyIsImRhdGFfb3JkZXIiLCJkYXRhX3JlZ2lvbnMiLCJkYXRhX2NvbG9yIiwiZGF0YV9jb2xvcnMiLCJkYXRhX3NlbGVjdGlvbl9lbmFibGVkIiwiZGF0YV9zZWxlY3Rpb25fZ3JvdXBlZCIsImRhdGFfc2VsZWN0aW9uX2lzc2VsZWN0YWJsZSIsImRhdGFfc2VsZWN0aW9uX211bHRpcGxlIiwiZGF0YV9zZWxlY3Rpb25fZHJhZ2dhYmxlIiwiZGF0YV9vbmNsaWNrIiwiZGF0YV9vbm1vdXNlb3ZlciIsImRhdGFfb25tb3VzZW91dCIsImRhdGFfb25zZWxlY3RlZCIsImRhdGFfb251bnNlbGVjdGVkIiwic3ViY2hhcnRfYXhpc194X3Nob3ciLCJzdWJjaGFydF9vbmJydXNoIiwiY29sb3JfcGF0dGVybiIsImNvbG9yX3RocmVzaG9sZCIsImxlZ2VuZF9pbnNldF94IiwibGVnZW5kX2luc2V0X3kiLCJsZWdlbmRfaW5zZXRfc3RlcCIsImxlZ2VuZF9pdGVtX29uY2xpY2siLCJsZWdlbmRfaXRlbV9vbm1vdXNlb3ZlciIsImxlZ2VuZF9pdGVtX29ubW91c2VvdXQiLCJsZWdlbmRfZXF1YWxseSIsImxlZ2VuZF9wYWRkaW5nIiwibGVnZW5kX2l0ZW1fdGlsZV93aWR0aCIsImxlZ2VuZF9pdGVtX3RpbGVfaGVpZ2h0IiwiYXhpc194X3RpY2tfY2VudGVyZWQiLCJheGlzX3hfdGlja19mb3JtYXQiLCJheGlzX3hfdGlja19jb3VudCIsImF4aXNfeF90aWNrX2ZpdCIsImF4aXNfeF90aWNrX3JvdGF0ZSIsImF4aXNfeF90aWNrX291dGVyIiwiYXhpc194X3RpY2tfbXVsdGlsaW5lIiwiYXhpc194X3RpY2tfd2lkdGgiLCJheGlzX3hfbWF4IiwiYXhpc194X21pbiIsImF4aXNfeF9wYWRkaW5nIiwiYXhpc194X2hlaWdodCIsImF4aXNfeF9sYWJlbCIsImF4aXNfeV9zaG93IiwiYXhpc195X21heCIsImF4aXNfeV9taW4iLCJheGlzX3lfaW52ZXJ0ZWQiLCJheGlzX3lfY2VudGVyIiwiYXhpc195X2xhYmVsIiwiYXhpc195X3RpY2tfZm9ybWF0IiwiYXhpc195X3RpY2tfb3V0ZXIiLCJheGlzX3lfdGlja19yb3RhdGUiLCJheGlzX3lfdGlja190aW1lX3ZhbHVlIiwiYXhpc195X3RpY2tfdGltZV9pbnRlcnZhbCIsImF4aXNfeV9wYWRkaW5nIiwiYXhpc195X2RlZmF1bHQiLCJheGlzX3kyX3Nob3ciLCJheGlzX3kyX21heCIsImF4aXNfeTJfbWluIiwiYXhpc195Ml9pbnZlcnRlZCIsImF4aXNfeTJfY2VudGVyIiwiYXhpc195Ml9sYWJlbCIsImF4aXNfeTJfdGlja19mb3JtYXQiLCJheGlzX3kyX3RpY2tfb3V0ZXIiLCJheGlzX3kyX3BhZGRpbmciLCJheGlzX3kyX2RlZmF1bHQiLCJncmlkX3hfc2hvdyIsImdyaWRfeF90eXBlIiwiZ3JpZF94X2xpbmVzIiwiZ3JpZF95X3Nob3ciLCJncmlkX3lfbGluZXMiLCJncmlkX3lfdGlja3MiLCJncmlkX2ZvY3VzX3Nob3ciLCJwb2ludF9yIiwicG9pbnRfc2Vuc2l0aXZpdHkiLCJwb2ludF9mb2N1c19leHBhbmRfZW5hYmxlZCIsInBvaW50X2ZvY3VzX2V4cGFuZF9yIiwicG9pbnRfc2VsZWN0X3IiLCJsaW5lX2Nvbm5lY3ROdWxsIiwibGluZV9zdGVwX3R5cGUiLCJiYXJfd2lkdGgiLCJiYXJfd2lkdGhfcmF0aW8iLCJiYXJfd2lkdGhfbWF4IiwiYmFyX3plcm9iYXNlZCIsImFyZWFfemVyb2Jhc2VkIiwiYXJlYV9hYm92ZSIsInBpZV9sYWJlbF9zaG93IiwicGllX2xhYmVsX2Zvcm1hdCIsInBpZV9sYWJlbF90aHJlc2hvbGQiLCJwaWVfbGFiZWxfcmF0aW8iLCJwaWVfZXhwYW5kIiwicGllX2V4cGFuZF9kdXJhdGlvbiIsImdhdWdlX2xhYmVsX3Nob3ciLCJnYXVnZV9sYWJlbF9mb3JtYXQiLCJnYXVnZV9taW4iLCJnYXVnZV9tYXgiLCJnYXVnZV9zdGFydGluZ0FuZ2xlIiwiZ2F1Z2VfdW5pdHMiLCJnYXVnZV93aWR0aCIsImdhdWdlX2V4cGFuZCIsImdhdWdlX2V4cGFuZF9kdXJhdGlvbiIsImRvbnV0X2xhYmVsX3Nob3ciLCJkb251dF9sYWJlbF9mb3JtYXQiLCJkb251dF9sYWJlbF90aHJlc2hvbGQiLCJkb251dF9sYWJlbF9yYXRpbyIsImRvbnV0X3dpZHRoIiwiZG9udXRfdGl0bGUiLCJkb251dF9leHBhbmQiLCJkb251dF9leHBhbmRfZHVyYXRpb24iLCJzcGxpbmVfaW50ZXJwb2xhdGlvbl90eXBlIiwidG9vbHRpcF9zaG93IiwidG9vbHRpcF9ncm91cGVkIiwidG9vbHRpcF9mb3JtYXRfdGl0bGUiLCJ0b29sdGlwX2Zvcm1hdF9uYW1lIiwidG9vbHRpcF9mb3JtYXRfdmFsdWUiLCJ0b29sdGlwX3Bvc2l0aW9uIiwidG9vbHRpcF9jb250ZW50cyIsImRlZmF1bHRUaXRsZUZvcm1hdCIsImRlZmF1bHRWYWx1ZUZvcm1hdCIsImdldFRvb2x0aXBDb250ZW50IiwidG9vbHRpcF9pbml0X3Nob3ciLCJ0b29sdGlwX2luaXRfeCIsInRvb2x0aXBfaW5pdF9wb3NpdGlvbiIsInRvb2x0aXBfb25zaG93IiwidG9vbHRpcF9vbmhpZGUiLCJ0aXRsZV90ZXh0IiwidGl0bGVfcGFkZGluZyIsInRpdGxlX3Bvc2l0aW9uIiwiYWRkaXRpb25hbENvbmZpZyIsInRoaXNfY29uZmlnIiwiZ2V0U2NhbGUiLCJmb3JUaW1lc2VyaWVzIiwiZ2V0WCIsIl9zY2FsZSIsImdldFkiLCJnZXRZU2NhbGUiLCJnZXRJZCIsImdldFN1YllTY2FsZSIsImZvckluaXQiLCJzdWJYTWluIiwic3ViWE1heCIsInN1YllNaW4iLCJzdWJZTWF4IiwieEF4aXNUaWNrRm9ybWF0IiwiZ2V0WEF4aXNUaWNrRm9ybWF0IiwieEF4aXNUaWNrVmFsdWVzIiwiZ2V0WEF4aXNUaWNrVmFsdWVzIiwieUF4aXNUaWNrVmFsdWVzIiwiZ2V0WUF4aXNUaWNrVmFsdWVzIiwieTJBeGlzVGlja1ZhbHVlcyIsImdldFkyQXhpc1RpY2tWYWx1ZXMiLCJnZXRYQXhpcyIsImdldFlBeGlzIiwidXBkYXRlQXJjIiwiZ2V0WURvbWFpbk1pbiIsImJhc2VJZCIsImlkc0luR3JvdXAiLCJoYXNOZWdhdGl2ZVZhbHVlIiwiZ2V0VmFsdWVzQXNJZEtleWVkIiwiaGFzTmVnYXRpdmVWYWx1ZUluVGFyZ2V0cyIsImdldFlEb21haW5NYXgiLCJoYXNQb3NpdGl2ZVZhbHVlIiwiaGFzUG9zaXRpdmVWYWx1ZUluVGFyZ2V0cyIsImF4aXNJZCIsInhEb21haW4iLCJkb21haW5MZW5ndGgiLCJ5RG9tYWluQWJzIiwibGVuZ3RocyIsImlzQWxsUG9zaXRpdmUiLCJpc0FsbE5lZ2F0aXZlIiwidGFyZ2V0c0J5QXhpc0lkIiwieVRhcmdldHMiLCJmaWx0ZXJCeVhEb21haW4iLCJ5RG9tYWluTWluIiwieURvbWFpbk1heCIsImlzWmVyb0Jhc2VkIiwiaXNJbnZlcnRlZCIsInNob3dIb3Jpem9udGFsRGF0YUxhYmVsIiwic2hvd1ZlcnRpY2FsRGF0YUxhYmVsIiwiZ2V0RGF0YUxhYmVsTGVuZ3RoIiwiZGlmZkRvbWFpbiIsImNvbnZlcnRQaXhlbHNUb0F4aXNQYWRkaW5nIiwiZ2V0UGFkZGluZyIsImdldFhEb21haW5NaW4iLCJnZXRYRG9tYWluTWF4IiwiZ2V0WERvbWFpblBhZGRpbmciLCJtYXhEYXRhQ291bnQiLCJnZXRNYXhEYXRhQ291bnQiLCJmaXJzdFgiLCJsYXN0WCIsIndpdGhUcmltIiwidXBkYXRlU2NhbGVFeHRlbnQiLCJ0cmltWERvbWFpbiIsInpvb21Eb21haW4iLCJnZXRab29tRG9tYWluIiwiaXNYIiwiaGFzVmFsdWUiLCJpc05vdFgiLCJnZXRYS2V5IiwiZ2V0WFZhbHVlc09mWEtleSIsInhWYWx1ZXMiLCJnZXRJbmRleEJ5WCIsImZpbHRlckJ5WCIsImdldFhWYWx1ZSIsImdldE90aGVyVGFyZ2V0WHMiLCJpZHNGb3JYIiwiZ2V0T3RoZXJUYXJnZXRYIiwiYWRkWHMiLCJoYXNNdWx0aXBsZVgiLCJpc011bHRpcGxlWCIsImFkZE5hbWUiLCJnZXRWYWx1ZU9uSW5kZXgiLCJ2YWx1ZU9uSW5kZXgiLCJ1cGRhdGVUYXJnZXRYIiwiZ2VuZXJhdGVUYXJnZXRYIiwidXBkYXRlVGFyZ2V0WHMiLCJyYXdYIiwiY2xvbmVUYXJnZXQiLCJpZF9vcmciLCJ1cGRhdGVYcyIsImdldFByZXZYIiwiZ2V0TmV4dFgiLCJnZXRNYXhEYXRhQ291bnRUYXJnZXQiLCJtYXhUYXJnZXQiLCJnZXRFZGdlWCIsIm1hcFRvVGFyZ2V0SWRzIiwiaGFzVGFyZ2V0IiwidGFyZ2V0SWQiLCJpc0xlZ2VuZFRvU2hvdyIsIm1hcFRhcmdldHNUb1VuaXF1ZVhzIiwidGFyZ2V0SWRzIiwicmVtb3ZlSGlkZGVuVGFyZ2V0SWRzIiwicmVtb3ZlSGlkZGVuTGVnZW5kSWRzIiwiY2hlY2tWYWx1ZUluVGFyZ2V0cyIsImNoZWNrZXIiLCJpc09yZGVyRGVzYyIsImlzT3JkZXJBc2MiLCJvcmRlclRhcmdldHMiLCJvcmRlckFzYyIsIm9yZGVyRGVzYyIsInJlZHVjZXIiLCJ0MVN1bSIsInQyU3VtIiwiZmlsdGVyUmVtb3ZlTnVsbCIsInBhZGRpbmdDb2VmIiwiZGF0YUxhYmVsRm9ybWF0IiwiaXNOb25lQXJjIiwiaXNBcmMiLCJmaW5kU2FtZVhPZlZhbHVlcyIsInRhcmdldFgiLCJzYW1lcyIsImZpbmRDbG9zZXN0RnJvbVRhcmdldHMiLCJmaW5kQ2xvc2VzdCIsIm1pbkRpc3QiLCJzaGFwZSIsImJhcnMiLCJnZXRUYXJnZXRTZWxlY3RvclN1ZmZpeCIsImJhciIsImlzV2l0aGluQmFyIiwiZGlzdCIsInhJbmRleCIsInlJbmRleCIsImNvbnZlcnRWYWx1ZXNUb1N0ZXAiLCJjb252ZXJ0ZWQiLCJ1cGRhdGVEYXRhQXR0cmlidXRlcyIsInJlcSIsInJlc3BvbnNlVVJMIiwiY29udmVydFRzdlRvRGF0YSIsImNvbnZlcnRDc3ZUb0RhdGEiLCJjb252ZXJ0WHN2VG9EYXRhIiwieHN2IiwidGFyZ2V0S2V5cyIsIm5ld19yb3dzIiwibmV3X3JvdyIsImZpbmRWYWx1ZUluSnNvbiIsInBhdGhBcnJheSIsImFwcGVuZFhzIiwieEtleSIsImNvbnZlcnRlZElkIiwic2V0VGFyZ2V0VHlwZSIsImFkZENhY2hlIiwibG9hZEZyb21BcmdzIiwidW5sb2FkIiwic2VsZWN0b3JUYXJnZXQiLCJsZWdlbmRJdGVtIiwiY2F0ZWdvcnlOYW1lIiwiZXZlbnRSZWN0cyIsImV2ZW50UmVjdFVwZGF0ZSIsIm1heERhdGFDb3VudFRhcmdldCIsImV2ZW50UmVjdHNNdWx0aXBsZSIsImV2ZW50UmVjdHNTaW5nbGUiLCJldmVudFJlY3QiLCJnZW5lcmF0ZUV2ZW50UmVjdHNGb3JNdWx0aXBsZVhzIiwidXBkYXRlRXZlbnRSZWN0IiwiZ2VuZXJhdGVFdmVudFJlY3RzRm9yU2luZ2xlWCIsInJlY3RXIiwicmVjdFgiLCJnZXRFdmVudFJlY3RXaWR0aCIsInByZXZYIiwibmV4dFgiLCJ0aGlzWCIsImNsYXNzRXZlbnQiLCJldmVudFJlY3RFbnRlciIsImV4cGFuZENpcmNsZXMiLCJleHBhbmRCYXJzIiwiaGlkZVhHcmlkRm9jdXMiLCJoaWRlVG9vbHRpcCIsInVuZXhwYW5kQ2lyY2xlcyIsInVuZXhwYW5kQmFycyIsInNlbGVjdGVkRGF0YSIsImlzU3RlcFR5cGUiLCJzaG93VG9vbHRpcCIsInNob3dYR3JpZEZvY3VzIiwiRVhQQU5ERUQiLCJpc1dpdGhpblNoYXBlIiwidG9nZ2xlU2hhcGUiLCJkcmFnZW5kIiwibW91c2VvdXQiLCJzYW1lWERhdGEiLCJzaGFwZXMiLCJkaXNwYXRjaEV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0TW91c2VFdmVudCIsImdldFBhcmVudFdpZHRoIiwiZ2V0UGFyZW50SGVpZ2h0IiwiZ2V0VGl0bGVQYWRkaW5nIiwid2l0aG91dFJlY29tcHV0ZSIsImNlaWwxMCIsImdldEF4aXNXaWR0aEJ5QXhpc0lkIiwiZ2V0WUF4aXNMYWJlbFBvc2l0aW9uIiwiaXNPdXRlciIsImRlZmF1bHRQYWRkaW5nIiwibGVnZW5kV2lkdGhPblJpZ2h0IiwiZ2V0WTJBeGlzTGFiZWxQb3NpdGlvbiIsImdldFBhcmVudFJlY3RWYWx1ZSIsImdldFN2Z0xlZnQiLCJoYXNMZWZ0QXhpc1JlY3QiLCJsZWZ0QXhpc0NsYXNzIiwibGVmdEF4aXMiLCJzdmdSZWN0IiwiY2hhcnRSZWN0Iiwic3ZnTGVmdCIsImdldExhYmVsUG9zaXRpb25CeUlkIiwiZ2V0TWF4VGlja1dpZHRoIiwiaXNJbm5lciIsInR5cGVGaWx0ZXIiLCJpbmRpY2VzIiwiX19tYXhfXyIsImdldFNoYXBlWCIsInRhcmdldHNOdW0iLCJpc1N1YiIsImdldFNoYXBlWSIsImdldFNoYXBlT2Zmc2V0IiwiaXNXaXRoaW4iLCJpc1dpdGhpblN0ZXAiLCJpc1dpdGhpbkNpcmNsZSIsInBvaW50U2VsZWN0UiIsImdldEludGVycG9sYXRlIiwiaW50ZXJwb2xhdGlvbiIsImlzSW50ZXJwb2xhdGlvblR5cGUiLCJpc1NwbGluZVR5cGUiLCJjaGFydExpbmVzIiwibWFpbkxpbmVVcGRhdGUiLCJtYWluTGluZUVudGVyIiwiY2xhc3NDaGFydExpbmUiLCJjbGFzc0xpbmVzIiwiY2xhc3NBcmVhcyIsImNsYXNzQ2lyY2xlcyIsImNsYXNzRm9jdXMiLCJjaGFydExpbmUiLCJnZW5lcmF0ZUNsYXNzIiwic2VsZWN0ZWRDaXJjbGUiLCJtYWluTGluZSIsImxpbmVEYXRhIiwiY2xhc3NMaW5lIiwiZ2V0UG9pbnRzIiwiZ2VuZXJhdGVHZXRMaW5lUG9pbnRzIiwieVNjYWxlR2V0dGVyIiwieFZhbHVlIiwieVZhbHVlIiwibGluZVdpdGhSZWdpb25zIiwibGluZVRhcmdldHNOdW0iLCJsaW5lT2Zmc2V0IiwicG9zWCIsInBvc1kiLCJfcmVnaW9ucyIsImlzV2l0aGluUmVnaW9ucyIsImdlbmVyYXRlTSIsInNXaXRoUmVnaW9uIiwieHAiLCJ5cCIsImRpZmZ4MiIsInhPZmZzZXQiLCJ4X2RpZmYiLCJ4djAiLCJ4djEiLCJtYWluQXJlYSIsImFyZWFzIiwiY2xhc3NBcmVhIiwib3JnQXJlYU9wYWNpdHkiLCJnZW5lcmF0ZUdldEFyZWFQb2ludHMiLCJ2YWx1ZTAiLCJnZXRBcmVhQmFzZVZhbHVlIiwiYXJlYVRhcmdldHNOdW0iLCJhcmVhT2Zmc2V0IiwibWFpbkNpcmNsZSIsImNpcmNsZXMiLCJsaW5lT3JTY2F0dGVyRGF0YSIsImNsYXNzQ2lyY2xlIiwicG9pbnRSIiwiZ2V0Q2lyY2xlcyIsInBvaW50RXhwYW5kZWRSIiwiZDNfdGhpcyIsImNoYXJ0QmFycyIsIm1haW5CYXJVcGRhdGUiLCJtYWluQmFyRW50ZXIiLCJjbGFzc0NoYXJ0QmFyIiwiY2xhc3NCYXJzIiwiY2hhcnRCYXIiLCJiYXJEYXRhIiwiY2xhc3NCYXIiLCJtYWluQmFyIiwiZ2V0QmFyVyIsImJhclRhcmdldHNOdW0iLCJnZXRCYXJzIiwiZ2VuZXJhdGVHZXRCYXJQb2ludHMiLCJpbmRleFgiLCJpbmRleFkiLCJiYXJXIiwiYmFyWCIsImJhclkiLCJiYXJPZmZzZXQiLCJzZWcwIiwicGF0aFNlZ0xpc3QiLCJnZXRJdGVtIiwic2VnMSIsImNoYXJ0VGV4dHMiLCJtYWluVGV4dCIsIm1haW5UZXh0VXBkYXRlIiwibWFpblRleHRFbnRlciIsImNsYXNzQ2hhcnRUZXh0IiwiY2xhc3NUZXh0cyIsImNoYXJ0VGV4dCIsImJhck9yTGluZURhdGEiLCJjbGFzc1RleHQiLCJ0ZXh0cyIsImZvckZsb3ciLCJnZXRUZXh0UmVjdCIsImNscyIsImR1bW15IiwiZm9udCIsImZvclgiLCJnZXRBcmVhUG9pbnRzIiwiZ2V0QmFyUG9pbnRzIiwiZ2V0TGluZVBvaW50cyIsImdldFhGb3JUZXh0IiwiZ2V0WUZvclRleHQiLCJ0ZXh0RWxlbWVudCIsInhQb3MiLCJ5UG9zIiwiaXNTYWZhcmkiLCJpc0Nocm9tZSIsImlzUGllVHlwZSIsImlzR2F1Z2VUeXBlIiwiaXNEb251dFR5cGUiLCJpc0FyY1R5cGUiLCJhcmNEYXRhIiwiZ3JpZCIsInhncmlkcyIsInlncmlkcyIsInhncmlkRm9jdXMiLCJ4Z3JpZCIsImdyaWRMaW5lcyIsInhncmlkTGluZXMiLCJ5Z3JpZExpbmVzIiwidXBkYXRlWEdyaWQiLCJ3aXRob3V0VXBkYXRlIiwieGdyaWREYXRhIiwiZ2VuZXJhdGVHcmlkRGF0YSIsInhncmlkQXR0ciIsInVwZGF0ZVlHcmlkIiwiZ3JpZFZhbHVlcyIsInlncmlkIiwiZ3JpZFRleHRBbmNob3IiLCJncmlkVGV4dER4IiwieEdyaWRUZXh0WCIsInlHcmlkVGV4dFgiLCJ4Z3JpZExpbmUiLCJ5Z3JpZExpbmUiLCJkYXRhVG9TaG93IiwiZm9jdXNFbCIsImZpcnN0WWVhciIsImxhc3RZZWFyIiwiZ3JpZERhdGEiLCJ0aWNrTnVtIiwiZ2V0R3JpZEZpbHRlclRvUmVtb3ZlIiwiZm91bmQiLCJyZW1vdmVHcmlkTGluZXMiLCJ0b1Nob3ciLCJ0b29sdGlwQ29udGFpbmVyIiwiZ2V0WUZvcm1hdCIsImJnY29sb3IiLCJuYW1lRm9ybWF0IiwidmFsdWVGb3JtYXQiLCJzYW5pdGlzZSIsInRvb2x0aXBOYW1lIiwidG9vbHRpcFBvc2l0aW9uIiwidFdpZHRoIiwidEhlaWdodCIsInRvb2x0aXBMZWZ0IiwidG9vbHRpcFJpZ2h0IiwidG9vbHRpcFRvcCIsImNoYXJ0UmlnaHQiLCJmb3JBcmMiLCJwb3NpdGlvbkZ1bmN0aW9uIiwibGVnZW5kSXRlbVRleHRCb3giLCJsZWdlbmRIYXNSZW5kZXJlZCIsInVwZGF0ZUxlZ2VuZFdpdGhEZWZhdWx0cyIsImluc2V0TGVnZW5kUG9zaXRpb24iLCJ1cGRhdGVMZWdlbmRTdGVwIiwidXBkYXRlTGVnZW5kSXRlbVdpZHRoIiwidXBkYXRlTGVnZW5kSXRlbUhlaWdodCIsIm9wYWNpdHlGb3JMZWdlbmQiLCJsZWdlbmRJdGVtSGlkZGVuIiwib3BhY2l0eUZvclVuZm9jdXNlZExlZ2VuZCIsInRvZ2dsZUZvY3VzTGVnZW5kIiwibGVnZW5kSXRlbUZvY3VzZWQiLCJyZXZlcnRMZWdlbmQiLCJzaG93TGVnZW5kIiwic2VsZWN0b3JMZWdlbmRzIiwiaGlkZUxlZ2VuZCIsImNsZWFyTGVnZW5kSXRlbVRleHRCb3hDYWNoZSIsImdldFRleHRCb3giLCJ1cGRhdGVQb3NpdGlvbnMiLCJ1cGRhdGVWYWx1ZXMiLCJ3aXRob3V0U3RlcCIsImFyZWFMZW5ndGgiLCJ0b3RhbExlbmd0aCIsIml0ZW1MZW5ndGgiLCJwb3NNaW4iLCJtYXJnaW5zIiwiaXNMYXN0IiwiaXRlbVdpZHRoIiwidGlsZVdpZHRoIiwiaXRlbUhlaWdodCIsInBhZGRpbmdUb3AiLCJtYXhIZWlnaHQiLCJ3aWR0aHMiLCJoZWlnaHRzIiwieEZvckxlZ2VuZCIsInhGb3JMZWdlbmRUZXh0IiwieEZvckxlZ2VuZFJlY3QiLCJ5Rm9yTGVnZW5kIiwieUZvckxlZ2VuZFRleHQiLCJ5Rm9yTGVnZW5kUmVjdCIsIngxRm9yTGVnZW5kVGlsZSIsIngyRm9yTGVnZW5kVGlsZSIsInlGb3JMZWdlbmRUaWxlIiwicmVjdHMiLCJ0aWxlcyIsInJldmVydCIsImxlZ2VuZEl0ZW1FdmVudCIsImxlZ2VuZEl0ZW1UaWxlIiwibGVnZW5kQmFja2dyb3VuZCIsInhGb3JUaXRsZSIsInlGb3JUaXRsZSIsImF4aXNYTGFiZWwiLCJ0ZXh0QW5jaG9yRm9yWEF4aXNMYWJlbCIsImF4aXNZTGFiZWwiLCJ0ZXh0QW5jaG9yRm9yWUF4aXNMYWJlbCIsImF4aXNZMkxhYmVsIiwidGV4dEFuY2hvckZvclkyQXhpc0xhYmVsIiwid2l0aG91dFJvdGF0ZVRpY2tUZXh0IiwiYXhpc1BhcmFtcyIsImdldFRpY2tWYWx1ZXMiLCJnZXRMYWJlbE9wdGlvbkJ5QXhpc0lkIiwiZ2V0TGFiZWxUZXh0Iiwic2V0TGFiZWxUZXh0IiwiZ2V0TGFiZWxQb3NpdGlvbiIsImRlZmF1bHRQb3NpdGlvbiIsImlzTGVmdCIsImlzQ2VudGVyIiwiaXNUb3AiLCJpc01pZGRsZSIsImlzQm90dG9tIiwiZ2V0WEF4aXNMYWJlbFBvc2l0aW9uIiwidGV4dEZvclhBeGlzTGFiZWwiLCJ0ZXh0Rm9yWUF4aXNMYWJlbCIsInRleHRGb3JZMkF4aXNMYWJlbCIsInhGb3JBeGlzTGFiZWwiLCJmb3JIb3Jpem9udGFsIiwiZHhGb3JBeGlzTGFiZWwiLCJ0ZXh0QW5jaG9yRm9yQXhpc0xhYmVsIiwieEZvclhBeGlzTGFiZWwiLCJ4Rm9yWUF4aXNMYWJlbCIsInhGb3JZMkF4aXNMYWJlbCIsImR4Rm9yWEF4aXNMYWJlbCIsImR4Rm9yWUF4aXNMYWJlbCIsImR4Rm9yWTJBeGlzTGFiZWwiLCJkeUZvclhBeGlzTGFiZWwiLCJkeUZvcllBeGlzTGFiZWwiLCJkeUZvclkyQXhpc0xhYmVsIiwicGl4ZWxzIiwidGlja0NvdW50IiwiZm9yVGltZVNlcmllcyIsInRhcmdldENvdW50IiwidGlja1ZhbHVlIiwiYXhpc1N1YlgiLCJpc0hpZGRlbiIsImlzSUU5IiwiYXBwVmVyc2lvbiIsImdldEF4aXNDbGlwWCIsImdldEF4aXNDbGlwWSIsImdldEF4aXNDbGlwV2lkdGgiLCJnZXRBeGlzQ2xpcEhlaWdodCIsImlubmVyUmFkaXVzUmF0aW8iLCJzdmdBcmMiLCJnZXRTdmdBcmMiLCJzdmdBcmNFeHBhbmRlZCIsImdldFN2Z0FyY0V4cGFuZGVkIiwic3ZnQXJjRXhwYW5kZWRTdWIiLCJ1cGRhdGVBbmdsZSIsImdNaW4iLCJnTWF4IiwiZ1RpYyIsImdWYWx1ZSIsInVwZGF0ZWQiLCJyYXRlIiwiZ2V0QXJjIiwidHJhbnNmb3JtRm9yQXJjTGFiZWwiLCJnZXRBcmNSYXRpbyIsIndob2xlIiwiY29udmVydFRvQXJjRGF0YSIsInRleHRGb3JBcmNMYWJlbCIsInNob3VsZFNob3dBcmNMYWJlbCIsIm1lZXRzQXJjTGFiZWxUaHJlc2hvbGQiLCJnZXRBcmNMYWJlbEZvcm1hdCIsImRlZmF1bHRBcmNWYWx1ZUZvcm1hdCIsImV4cGFuZEFyYyIsInNlbGVjdG9yVGFyZ2V0cyIsImNoYXJ0QXJjIiwic2hvdWxkRXhwYW5kIiwiZXhwYW5kRHVyYXRpb24iLCJ1bmV4cGFuZEFyYyIsInNob3VsZFNob3ciLCJnZXRBcmNUaXRsZSIsIm1haW5QaWVVcGRhdGUiLCJtYWluUGllRW50ZXIiLCJjbGFzc0NoYXJ0QXJjIiwiY2xhc3NBcmNzIiwiY2hhcnRBcmNzVGl0bGUiLCJtYWluQXJjIiwiY2xhc3NBcmMiLCJfY3VycmVudCIsImludGVycG9sYXRlZCIsImdhdWdlVmFsdWUiLCJjaGFydEFyY3NCYWNrZ3JvdW5kIiwiY2hhcnRBcmNzR2F1Z2VVbml0IiwiY2hhcnRBcmNzR2F1Z2VNaW4iLCJjaGFydEFyY3NHYXVnZU1heCIsInJlZ2lvbiIsIm1haW5SZWdpb24iLCJjbGFzc1JlZ2lvbiIsInBhcmVudERhdGEiLCJyZWdpb25YIiwicmVnaW9uWSIsInJlZ2lvbldpZHRoIiwicmVnaW9uSGVpZ2h0IiwiaXNSZWdpb25PblgiLCJteCIsIm15IiwibWluWCIsIm1heFgiLCJtaW5ZIiwibWF4WSIsImFsdERvbWFpbiIsImRyYWdhcmVhIiwiX3giLCJfeSIsIl9oIiwiaXNTZWxlY3RlZCIsIlNFTEVDVEVEIiwiaXNJbmNsdWRlZCIsIklOQ0xVREVEIiwidG9nZ2xlUG9pbnQiLCJnZXRQYXRoQm94IiwidG9nZ2xlUGF0aCIsInNlbGVjdFBvaW50IiwidW5zZWxlY3RQb2ludCIsInNlbGVjdFBhdGgiLCJ1bnNlbGVjdFBhdGgiLCJnZXRUb2dnbGUiLCJyZWRyYXdGb3JCcnVzaCIsImNvbnRleHRMaW5lRW50ZXIiLCJjb250ZXh0TGluZVVwZGF0ZSIsImNvbnRleHRCYXJFbnRlciIsImNvbnRleHRCYXJVcGRhdGUiLCJ1cGRhdGVCYXJGb3JTdWJjaGFydCIsImNvbnRleHRCYXIiLCJyZWRyYXdCYXJGb3JTdWJjaGFydCIsImRyYXdCYXJPblN1YiIsInVwZGF0ZUxpbmVGb3JTdWJjaGFydCIsImNvbnRleHRMaW5lIiwicmVkcmF3TGluZUZvclN1YmNoYXJ0IiwiZHJhd0xpbmVPblN1YiIsInVwZGF0ZUFyZWFGb3JTdWJjaGFydCIsImNvbnRleHRBcmVhIiwicmVkcmF3QXJlYUZvclN1YmNoYXJ0IiwiZHJhd0FyZWFPblN1YiIsInJlZHJhd0Zvclpvb20iLCJvcmdTY2FsZUV4dGVudCIsImNvbG9ycyIsImFzVmFsdWUiLCJmb3JtYXRGb3JZIiwieUZvcm1hdCIsImZvcm1hdEZvclkyIiwieTJGb3JtYXQiLCJoYXNDYWNoZXMiLCJnZXRDYWNoZXMiLCJmb2N1c2VkIiwiZGVmb2N1c2VkIiwiY2xhc3NTaGFwZSIsImNsYXNzU2hhcGVzIiwiY2xhc3NUYXJnZXQiLCJhZGRpdGlvbmFsQ2xhc3NTdWZmaXgiLCJhZGRpdGlvbmFsQ2xhc3MiLCJjbGFzc0ZvY3VzZWQiLCJjbGFzc0RlZm9jdXNlZCIsInNlbGVjdG9yTGVnZW5kIiwiZGljdCIsImRlZm9jdXMiLCJ1bnpvb20iLCJjYXRlZ29yaWVzIiwiY2FjaGVJZHMiLCJkYXRhQ291bnQiLCJiYXNlVGFyZ2V0IiwiYmFzZVZhbHVlIiwibm90Zm91bmRJZHMiLCJvcmdEYXRhQ291bnQiLCJtaXNzaW5nIiwidHJhbnNsYXRlWCIsInNjYWxlWCIsImZsb3dJbmRleCIsImZsb3dMZW5ndGgiLCJmbG93U3RhcnQiLCJmbG93RW5kIiwiZHVyYXRpb25Gb3JGbG93IiwicmVzZXRPdGhlciIsImlzVGFyZ2V0SWQiLCJpc1RhcmdldEluZGV4IiwidW5zZWxlY3QiLCJ0cmFuc2Zvcm1UbyIsIm9wdGlvbnNGb3JSZWRyYXciLCJncmlkcyIsInNob3duIiwiY2F0ZWdvcnkiLCJsYWJlbHMiLCJkZXRhY2hFdmVudCIsIm9UaGlzIiwiYUFyZ3MiLCJmVG9CaW5kIiwiZk5PUCIsImZCb3VuZCIsIlNWR1BhdGhTZWciLCJ0eXBlQXNMZXR0ZXIiLCJvd25pbmdQYXRoU2VnTGlzdCIsInBhdGhTZWdUeXBlIiwicGF0aFNlZ1R5cGVBc0xldHRlciIsIl9vd25pbmdQYXRoU2VnTGlzdCIsIlBBVEhTRUdfVU5LTk9XTiIsIlBBVEhTRUdfQ0xPU0VQQVRIIiwiUEFUSFNFR19NT1ZFVE9fQUJTIiwiUEFUSFNFR19NT1ZFVE9fUkVMIiwiUEFUSFNFR19MSU5FVE9fQUJTIiwiUEFUSFNFR19MSU5FVE9fUkVMIiwiUEFUSFNFR19DVVJWRVRPX0NVQklDX0FCUyIsIlBBVEhTRUdfQ1VSVkVUT19DVUJJQ19SRUwiLCJQQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX0FCUyIsIlBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfUkVMIiwiUEFUSFNFR19BUkNfQUJTIiwiUEFUSFNFR19BUkNfUkVMIiwiUEFUSFNFR19MSU5FVE9fSE9SSVpPTlRBTF9BQlMiLCJQQVRIU0VHX0xJTkVUT19IT1JJWk9OVEFMX1JFTCIsIlBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX0FCUyIsIlBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX1JFTCIsIlBBVEhTRUdfQ1VSVkVUT19DVUJJQ19TTU9PVEhfQUJTIiwiUEFUSFNFR19DVVJWRVRPX0NVQklDX1NNT09USF9SRUwiLCJQQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX1NNT09USF9BQlMiLCJQQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX1NNT09USF9SRUwiLCJfc2VnbWVudENoYW5nZWQiLCJzZWdtZW50Q2hhbmdlZCIsIlNWR1BhdGhTZWdDbG9zZVBhdGgiLCJfYXNQYXRoU3RyaW5nIiwiU1ZHUGF0aFNlZ01vdmV0b0FicyIsIlNWR1BhdGhTZWdNb3ZldG9SZWwiLCJTVkdQYXRoU2VnTGluZXRvQWJzIiwiU1ZHUGF0aFNlZ0xpbmV0b1JlbCIsIlNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnMiLCJfeDEiLCJfeTEiLCJfeDIiLCJfeTIiLCJTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsIiwiU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMiLCJTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbCIsIlNWR1BhdGhTZWdBcmNBYnMiLCJyMiIsImxhcmdlQXJjRmxhZyIsInN3ZWVwRmxhZyIsIl9yMSIsIl9yMiIsIl9hbmdsZSIsIl9sYXJnZUFyY0ZsYWciLCJfc3dlZXBGbGFnIiwiU1ZHUGF0aFNlZ0FyY1JlbCIsIlNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzIiwiU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwiLCJTVkdQYXRoU2VnTGluZXRvVmVydGljYWxBYnMiLCJTVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWwiLCJTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzIiwiU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aFJlbCIsIlNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoQWJzIiwiU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwiLCJTVkdQYXRoRWxlbWVudCIsImNyZWF0ZVNWR1BhdGhTZWdDbG9zZVBhdGgiLCJjcmVhdGVTVkdQYXRoU2VnTW92ZXRvQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ01vdmV0b1JlbCIsImNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9BYnMiLCJjcmVhdGVTVkdQYXRoU2VnTGluZXRvUmVsIiwiY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0FicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNSZWwiLCJjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0FicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljUmVsIiwiY3JlYXRlU1ZHUGF0aFNlZ0FyY0FicyIsImNyZWF0ZVNWR1BhdGhTZWdBcmNSZWwiLCJjcmVhdGVTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicyIsImNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsUmVsIiwiY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsUmVsIiwiY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhSZWwiLCJjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoUmVsIiwiU1ZHUGF0aFNlZ0xpc3QiLCJwYXRoRWxlbWVudCIsIl9wYXRoRWxlbWVudCIsIl9saXN0IiwiX3BhcnNlUGF0aCIsIl9tdXRhdGlvbk9ic2VydmVyQ29uZmlnIiwiYXR0cmlidXRlRmlsdGVyIiwiX3BhdGhFbGVtZW50TXV0YXRpb25PYnNlcnZlciIsIl91cGRhdGVMaXN0RnJvbVBhdGhNdXRhdGlvbnMiLCJfY2hlY2tQYXRoU3luY2hyb25pemVkVG9MaXN0IiwiX3BhdGhTZWdMaXN0IiwidGFrZVJlY29yZHMiLCJtdXRhdGlvblJlY29yZHMiLCJoYXNQYXRoTXV0YXRpb25zIiwicmVjb3JkIiwiX3dyaXRlTGlzdFRvUGF0aCIsIl9wYXRoU2VnQXJyYXlBc1N0cmluZyIsInBhdGhTZWciLCJpbml0aWFsaXplIiwiX2NoZWNrVmFsaWRJbmRleCIsIm51bWJlck9mSXRlbXMiLCJpbnNlcnRJdGVtQmVmb3JlIiwicmVwbGFjZUl0ZW0iLCJyZW1vdmVJdGVtIiwiYXBwZW5kSXRlbSIsInBhdGhTZWdBcnJheSIsIkJ1aWxkZXIiLCJhcHBlbmRTZWdtZW50IiwiU291cmNlIiwiX3N0cmluZyIsIl9jdXJyZW50SW5kZXgiLCJfZW5kSW5kZXgiLCJfcHJldmlvdXNDb21tYW5kIiwiX3NraXBPcHRpb25hbFNwYWNlcyIsIl9pc0N1cnJlbnRTcGFjZSIsImNoYXJhY3RlciIsIl9za2lwT3B0aW9uYWxTcGFjZXNPckRlbGltaXRlciIsImhhc01vcmVEYXRhIiwicGVla1NlZ21lbnRUeXBlIiwibG9va2FoZWFkIiwiX3BhdGhTZWdUeXBlRnJvbUNoYXIiLCJfbmV4dENvbW1hbmRIZWxwZXIiLCJwcmV2aW91c0NvbW1hbmQiLCJpbml0aWFsQ29tbWFuZElzTW92ZVRvIiwiY29tbWFuZCIsIl9wYXJzZU51bWJlciIsImZyYWMiLCJleHBzaWduIiwic3RhcnRJbnRQYXJ0SW5kZXgiLCJzY2FuSW50UGFydEluZGV4IiwiX3BhcnNlQXJjRmxhZyIsImZsYWdDaGFyIiwicGFyc2VTZWdtZW50IiwiYXJjQW5nbGUiLCJhcmNMYXJnZSIsImFyY1N3ZWVwIiwiYnVpbGRlciIsIndhdGNobWVuQ29udHJvbGxlcnMiLCJTZXJ2aWNlIiwiUmVwb3J0IiwiZWRpdFNlcnZpY2VUaXRsZSIsIndhcm5pbmdUaHJlc2hvbGQiLCJmYWlsdXJlSW50ZXJ2YWwiLCJmYWlsdXJlc1RvQmVPdXRhZ2UiLCJwaW5nU2VydmljZU5hbWUiLCJwaW5nU2VydmljZU9wdGlvbnMiLCJzZWxlY3RlZFBpbmdTZXJ2aWNlT3B0aW9ucyIsIiRzYXZlIiwiY2xlYXJDYWNoZSIsInNlcnZpY2VBZGRFcnJvcnMiLCJuZ1RhYmxlVXRpbHMiLCJ1c1NwaW5uZXJTZXJ2aWNlIiwiZ2V0Q2hhcnRTaXplIiwibG9hZGluZyIsImxvYWRlZCIsImVyckhhbmRsZXIiLCJlcnJvckxvYWRpbmdTZXJ2aWNlIiwic2VydmljZURldGFpbHMiLCJsYXRlc3RPdXRhZ2VzIiwibGF0ZW5jeUxhc3RIb3VyIiwibGFzdEhvdXIiLCJsYXRlbmN5IiwibGF0ZW5jeUxhc3QyNEhvdXJzIiwibGFzdDI0SG91cnMiLCJsYXRlbmN5TGFzdFdlZWsiLCJtYXhMYXN0SG91ciIsIm1heExhc3QyNEhvdXJzIiwibWF4TGFzdFdlZWsiLCJjaGFydHMiLCJvbldpbmRvd1Jlc2l6ZSIsImNoYXJ0U2l6ZSIsInNob3dMYXN0SG91ckNoYXJ0IiwiQ2hhcnRpbmciLCJyZW5kZXIiLCJvdXRhZ2VzIiwic2hvd0xhc3QyNENoYXJ0Iiwic2hvd0xhc3RXZWVrQ2hhcnQiLCJ4X2Zvcm1hdCIsInNob3dDb25maWciLCJpc0FkbWluIiwic2VydmljZXMiLCJ1cHRpbWUiLCJTRVJWSUNFU19QT0xMSU5HX0lOVEVSVkFMIiwic2NoZWR1bGVOZXh0VGljayIsImxvYWRTZXJ2aWNlc0VyckhhbmRsZXIiLCJlcnJvckxvYWRpbmdTZXJ2aWNlcyIsImRvbmVDYiIsImVycm9ySGFuZGxlciIsImNyZWF0ZW5nVGFibGVQYXJhbXMiLCJmaWx0ZXJUb01lQ2hlY2tib3hJc1ByZXNlbnQiLCJsb2NhbFN0b3JhZ2UiLCJmaWx0ZXJUb01lU3RvcmVkVmFsdWUiLCJmaWx0ZXJSZXN0cmljdGVkVG9NZSIsInNldEl0ZW0iLCJzZXJ2aWNlRmlsdGVyIiwiaXNSZXN0cmljdGVkIiwiY29uZmlybSIsInBhcnNlQXJyYXlPYmplY3RzRm9yQ2hhcnRpbmciLCJmaWVsZFRpbWUiLCJmaWVsZERhdGEiLCJnZW5lcmF0ZUxhdGVuY3lDaGFydCIsIkxhdGVuY3kiLCJsYXRlbmN5RGF0YSIsImxhdGVuY3lTZXJpZSIsInRpbWVTZXJpZSIsIm91dGFnZXNSZWdpb25zIiwib3V0YWdlIiwidGltZXN0YW1wIiwiZG93bnRpbWUiLCJ3YXRjaG1lbkRpcmVjdGl2ZXMiLCJQaW5nUGx1Z2lucyIsInBpbmdTZXJ2aWNlcyIsImhhc1BpbmdTZXJ2aWNlT3B0aW9ucyIsIndhdGNobWVuQXBwIiwiJHN0YXRlUHJvdmlkZXIiLCJyZXBvcnRDYWNoZSIsInBpbmdQbHVnaW5zQ2FjaGUiLCJDQUNIRV9FWFBJUkFUSU9OIiwiZmFjdG9yaWVzIiwiJHJlc291cmNlIiwiU0FWRV9QQVJBTVNfSU5fTE9DQUxTVE9SQUdFIiwibmdUYWJsZVBhcmFtcyIsImdldERlZmF1bHRQYXJhbWV0ZXJzIiwic3RhdHVz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QUEsRUFDQUMsZUFBQSxTQUNBQyxLQUFBLElBQ0FDLFdBQUEsUUFDQUMsTUFBQSxTQUNBQyxVQUFBLFNBQ0FDLFVBQUEsUUFDQUMsV0FBQSxRQUNBQyxVQUFBLFNBQ0FDLE1BQUEsU0FDQUMsZUFBQSxRQUNBQyxTQUFBLFNBQ0FDLFFBQUEsU0FDQUMsS0FBQSxNQUNBQyxTQUFBLElBQ0FDLFNBQUEsTUFDQUMsY0FBQSxTQUNBQyxTQUFBLFNBQ0FDLFVBQUEsTUFDQUMsU0FBQSxTQUNBQyxVQUFBLFNBQ0FDLFlBQUEsUUFDQUMsZUFBQSxRQUNBQyxXQUFBLFNBQ0FDLFdBQUEsU0FDQUMsUUFBQSxRQUNBQyxXQUFBLFNBQ0FDLGFBQUEsUUFDQUMsY0FBQSxRQUNBQyxjQUFBLFFBQ0FDLGNBQUEsUUFDQUMsY0FBQSxNQUNBQyxXQUFBLFFBQ0FDLFNBQUEsU0FDQUMsWUFBQSxNQUNBQyxRQUFBLFFBQ0FDLFFBQUEsUUFDQUMsV0FBQSxRQUNBQyxVQUFBLFNBQ0FDLFlBQUEsU0FDQUMsWUFBQSxRQUNBQyxRQUFBLFNBQ0FDLFVBQUEsU0FDQUMsV0FBQSxTQUNBQyxLQUFBLFNBQ0FDLFVBQUEsU0FDQUMsS0FBQSxRQUNBQyxNQUFBLE1BQ0FDLFlBQUEsU0FDQUMsS0FBQSxRQUNBQyxTQUFBLFNBQ0FDLFFBQUEsU0FDQUMsVUFBQSxTQUNBQyxPQUFBLFFBQ0FDLE1BQUEsU0FDQUMsTUFBQSxTQUNBQyxTQUFBLFNBQ0FDLGNBQUEsU0FDQUMsVUFBQSxRQUNBQyxhQUFBLFNBQ0FDLFVBQUEsU0FDQUMsV0FBQSxTQUNBQyxVQUFBLFNBQ0FDLHFCQUFBLFNBQ0FDLFVBQUEsU0FDQUMsV0FBQSxRQUNBQyxVQUFBLFNBQ0FDLFVBQUEsU0FDQUMsWUFBQSxTQUNBQyxjQUFBLFFBQ0FDLGFBQUEsUUFDQUMsZUFBQSxRQUNBQyxlQUFBLFFBQ0FDLGVBQUEsU0FDQUMsWUFBQSxTQUNBQyxLQUFBLE1BQ0FDLFVBQUEsUUFDQUMsTUFBQSxTQUNBQyxRQUFBLFNBQ0FDLE9BQUEsUUFDQUMsaUJBQUEsUUFDQUMsV0FBQSxJQUNB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SUFDQXVGLEdBQUF0RixJQUFBc0YsR0FBQXJGLElBQ0FxRixHQUFBcEYsSUFBQW9GLEdBQUF2RyxJQUNBdUcsR0FBQXRHLElBQUFzRyxHQUFBcEcsSUFDQW9HLEdBQUFqRyxJQUFBaUcsR0FBQWhHLElBQ0FnRyxHQUFBL0YsSUFBQStGLEdBQUE5RixJQUNBOEYsR0FBQW5GLElBQUFtRixHQUFBbEYsSUFDQWtGLEdBQUFqRixJQUFBaUYsR0FBQWhGLEtBQUEsRUFDQWdGLEdBQUExRyxJQUFBMEcsR0FBQXpHLElBQ0F5RyxHQUFBNUYsS0FBQSxDQUdBLElBQUE2RixLQUVBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLEtBQUFDLElBQUEsS0FDQUMsSUFBQSxLQUFBQyxJQUFBLEtBQ0FDLElBQUEsS0FFQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEs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QXRyUixTQUFBdFAsT0FBQSxxQkFBQTBTLFFBQUEsZ0JBQUEsZ0JBQUEsU0FBQW1vUixHQVNBLFFBQUFDLEdBQUE5NFIsR0FDQSxHQUFBMHBDLElBQUFvcUUsU0FBQWlsTCw0QkFBQSxPQUVBLE9BQUFILElBQUE5NlIsT0FBQWc1UixjQUNBaDVSLE9BQUFnNVIsYUFBQXZnQixRQUFBdjJRLEdBQ0FrSSxLQUFBSSxNQUFBeEssT0FBQWc1UixhQUFBdmdCLFFBQUF2MlEsSUFNQTBwQyxFQUlBLFFBQUFrdFAsR0FBQTUyUixFQUFBcy9CLEVBQUE5a0IsR0FDQSxNQUFBLElBQUFxK1EsR0FBQUMsRUFBQTk0UixJQUVBK3NHLE1BQUF6dEUsRUFBQXQvQixHQUFBaEIsT0FDQTQxRyxVQUNBdEIsUUFBQSxTQUFBMGxMLEVBQUEvd1AsR0FDQSxHQUFBOTZCLEdBQUFteUIsRUFBQXQvQixHQUNBaTVSLEVBQUFoeFAsRUFBQTZyRSxVQUFBdDVGLEVBQUEsV0FBQXJOLEVBQUE4NkIsRUFBQWdyRSxXQUFBOWxHLENBQ0E2clIsR0FBQTdzUCxRQUFBOHNQLEdBRUFuN1IsT0FBQWc1UixjQUNBaDVSLE9BQUFnNVIsYUFBQUcsUUFBQWozUixFQUFBa0ksS0FBQUMsV0FDQTJyRyxRQUFBN3JFLEVBQUE2ckUsZ0JBT0EsT0FDQThpTCxvQkFBQUEiLCJmaWxlIjoic2NyaXB0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQm9vdHN0cmFwIHYzLjMuNyAoaHR0cDovL2dldGJvb3RzdHJhcC5jb20pXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG5cbmlmICh0eXBlb2YgalF1ZXJ5ID09PSAndW5kZWZpbmVkJykge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBqUXVlcnknKVxufVxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgdmVyc2lvbiA9ICQuZm4uanF1ZXJ5LnNwbGl0KCcgJylbMF0uc3BsaXQoJy4nKVxuICBpZiAoKHZlcnNpb25bMF0gPCAyICYmIHZlcnNpb25bMV0gPCA5KSB8fCAodmVyc2lvblswXSA9PSAxICYmIHZlcnNpb25bMV0gPT0gOSAmJiB2ZXJzaW9uWzJdIDwgMSkgfHwgKHZlcnNpb25bMF0gPiAzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeSB2ZXJzaW9uIDEuOS4xIG9yIGhpZ2hlciwgYnV0IGxvd2VyIHRoYW4gdmVyc2lvbiA0JylcbiAgfVxufShqUXVlcnkpO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogdHJhbnNpdGlvbi5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3RyYW5zaXRpb25zXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gQ1NTIFRSQU5TSVRJT04gU1VQUE9SVCAoU2hvdXRvdXQ6IGh0dHA6Ly93d3cubW9kZXJuaXpyLmNvbS8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9vdHN0cmFwJylcblxuICAgIHZhciB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XG4gICAgICBXZWJraXRUcmFuc2l0aW9uIDogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICAgICAgTW96VHJhbnNpdGlvbiAgICA6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAgIE9UcmFuc2l0aW9uICAgICAgOiAnb1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmQnLFxuICAgICAgdHJhbnNpdGlvbiAgICAgICA6ICd0cmFuc2l0aW9uZW5kJ1xuICAgIH1cblxuICAgIGZvciAodmFyIG5hbWUgaW4gdHJhbnNFbmRFdmVudE5hbWVzKSB7XG4gICAgICBpZiAoZWwuc3R5bGVbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBlbmQ6IHRyYW5zRW5kRXZlbnROYW1lc1tuYW1lXSB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlIC8vIGV4cGxpY2l0IGZvciBpZTggKCAgLl8uKVxuICB9XG5cbiAgLy8gaHR0cDovL2Jsb2cuYWxleG1hY2Nhdy5jb20vY3NzLXRyYW5zaXRpb25zXG4gICQuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICB2YXIgY2FsbGVkID0gZmFsc2VcbiAgICB2YXIgJGVsID0gdGhpc1xuICAgICQodGhpcykub25lKCdic1RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbiAoKSB7IGNhbGxlZCA9IHRydWUgfSlcbiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IGlmICghY2FsbGVkKSAkKCRlbCkudHJpZ2dlcigkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpIH1cbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkdXJhdGlvbilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgJChmdW5jdGlvbiAoKSB7XG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRW5kKClcblxuICAgIGlmICghJC5zdXBwb3J0LnRyYW5zaXRpb24pIHJldHVyblxuXG4gICAgJC5ldmVudC5zcGVjaWFsLmJzVHJhbnNpdGlvbkVuZCA9IHtcbiAgICAgIGJpbmRUeXBlOiAkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsXG4gICAgICBkZWxlZ2F0ZVR5cGU6ICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxcbiAgICAgIGhhbmRsZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCQoZS50YXJnZXQpLmlzKHRoaXMpKSByZXR1cm4gZS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG59KGpRdWVyeSk7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBhbGVydC5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI2FsZXJ0c1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIEFMRVJUIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBkaXNtaXNzID0gJ1tkYXRhLWRpc21pc3M9XCJhbGVydFwiXSdcbiAgdmFyIEFsZXJ0ICAgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAkKGVsKS5vbignY2xpY2snLCBkaXNtaXNzLCB0aGlzLmNsb3NlKVxuICB9XG5cbiAgQWxlcnQuVkVSU0lPTiA9ICczLjMuNydcblxuICBBbGVydC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXG5cbiAgQWxlcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgJHRoaXMgICAgPSAkKHRoaXMpXG4gICAgdmFyIHNlbGVjdG9yID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxuXG4gICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2VsZWN0b3IucmVwbGFjZSgvLiooPz0jW15cXHNdKiQpLywgJycpIC8vIHN0cmlwIGZvciBpZTdcbiAgICB9XG5cbiAgICB2YXIgJHBhcmVudCA9ICQoc2VsZWN0b3IgPT09ICcjJyA/IFtdIDogc2VsZWN0b3IpXG5cbiAgICBpZiAoZSkgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBpZiAoISRwYXJlbnQubGVuZ3RoKSB7XG4gICAgICAkcGFyZW50ID0gJHRoaXMuY2xvc2VzdCgnLmFsZXJ0JylcbiAgICB9XG5cbiAgICAkcGFyZW50LnRyaWdnZXIoZSA9ICQuRXZlbnQoJ2Nsb3NlLmJzLmFsZXJ0JykpXG5cbiAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdpbicpXG5cbiAgICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KCkge1xuICAgICAgLy8gZGV0YWNoIGZyb20gcGFyZW50LCBmaXJlIGV2ZW50IHRoZW4gY2xlYW4gdXAgZGF0YVxuICAgICAgJHBhcmVudC5kZXRhY2goKS50cmlnZ2VyKCdjbG9zZWQuYnMuYWxlcnQnKS5yZW1vdmUoKVxuICAgIH1cblxuICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmICRwYXJlbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/XG4gICAgICAkcGFyZW50XG4gICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIHJlbW92ZUVsZW1lbnQpXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChBbGVydC5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICByZW1vdmVFbGVtZW50KClcbiAgfVxuXG5cbiAgLy8gQUxFUlQgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgPSAkdGhpcy5kYXRhKCdicy5hbGVydCcpXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuYWxlcnQnLCAoZGF0YSA9IG5ldyBBbGVydCh0aGlzKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dLmNhbGwoJHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmFsZXJ0XG5cbiAgJC5mbi5hbGVydCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmFsZXJ0LkNvbnN0cnVjdG9yID0gQWxlcnRcblxuXG4gIC8vIEFMRVJUIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5hbGVydC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uYWxlcnQgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBBTEVSVCBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PVxuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljay5icy5hbGVydC5kYXRhLWFwaScsIGRpc21pc3MsIEFsZXJ0LnByb3RvdHlwZS5jbG9zZSlcblxufShqUXVlcnkpO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogYnV0dG9uLmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jYnV0dG9uc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIEJVVFRPTiBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgQnV0dG9uID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLiRlbGVtZW50ICA9ICQoZWxlbWVudClcbiAgICB0aGlzLm9wdGlvbnMgICA9ICQuZXh0ZW5kKHt9LCBCdXR0b24uREVGQVVMVFMsIG9wdGlvbnMpXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxuICB9XG5cbiAgQnV0dG9uLlZFUlNJT04gID0gJzMuMy43J1xuXG4gIEJ1dHRvbi5ERUZBVUxUUyA9IHtcbiAgICBsb2FkaW5nVGV4dDogJ2xvYWRpbmcuLi4nXG4gIH1cblxuICBCdXR0b24ucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgdmFyIGQgICAgPSAnZGlzYWJsZWQnXG4gICAgdmFyICRlbCAgPSB0aGlzLiRlbGVtZW50XG4gICAgdmFyIHZhbCAgPSAkZWwuaXMoJ2lucHV0JykgPyAndmFsJyA6ICdodG1sJ1xuICAgIHZhciBkYXRhID0gJGVsLmRhdGEoKVxuXG4gICAgc3RhdGUgKz0gJ1RleHQnXG5cbiAgICBpZiAoZGF0YS5yZXNldFRleHQgPT0gbnVsbCkgJGVsLmRhdGEoJ3Jlc2V0VGV4dCcsICRlbFt2YWxdKCkpXG5cbiAgICAvLyBwdXNoIHRvIGV2ZW50IGxvb3AgdG8gYWxsb3cgZm9ybXMgdG8gc3VibWl0XG4gICAgc2V0VGltZW91dCgkLnByb3h5KGZ1bmN0aW9uICgpIHtcbiAgICAgICRlbFt2YWxdKGRhdGFbc3RhdGVdID09IG51bGwgPyB0aGlzLm9wdGlvbnNbc3RhdGVdIDogZGF0YVtzdGF0ZV0pXG5cbiAgICAgIGlmIChzdGF0ZSA9PSAnbG9hZGluZ1RleHQnKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZVxuICAgICAgICAkZWwuYWRkQ2xhc3MoZCkuYXR0cihkLCBkKS5wcm9wKGQsIHRydWUpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNMb2FkaW5nKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgJGVsLnJlbW92ZUNsYXNzKGQpLnJlbW92ZUF0dHIoZCkucHJvcChkLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9LCB0aGlzKSwgMClcbiAgfVxuXG4gIEJ1dHRvbi5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjaGFuZ2VkID0gdHJ1ZVxuICAgIHZhciAkcGFyZW50ID0gdGhpcy4kZWxlbWVudC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9XCJidXR0b25zXCJdJylcblxuICAgIGlmICgkcGFyZW50Lmxlbmd0aCkge1xuICAgICAgdmFyICRpbnB1dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnaW5wdXQnKVxuICAgICAgaWYgKCRpbnB1dC5wcm9wKCd0eXBlJykgPT0gJ3JhZGlvJykge1xuICAgICAgICBpZiAoJGlucHV0LnByb3AoJ2NoZWNrZWQnKSkgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgICRwYXJlbnQuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgICB0aGlzLiRlbGVtZW50LmFkZENsYXNzKCdhY3RpdmUnKVxuICAgICAgfSBlbHNlIGlmICgkaW5wdXQucHJvcCgndHlwZScpID09ICdjaGVja2JveCcpIHtcbiAgICAgICAgaWYgKCgkaW5wdXQucHJvcCgnY2hlY2tlZCcpKSAhPT0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnYWN0aXZlJykpIGNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgfVxuICAgICAgJGlucHV0LnByb3AoJ2NoZWNrZWQnLCB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdhY3RpdmUnKSlcbiAgICAgIGlmIChjaGFuZ2VkKSAkaW5wdXQudHJpZ2dlcignY2hhbmdlJylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4kZWxlbWVudC5hdHRyKCdhcmlhLXByZXNzZWQnLCAhdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnYWN0aXZlJykpXG4gICAgICB0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKCdhY3RpdmUnKVxuICAgIH1cbiAgfVxuXG5cbiAgLy8gQlVUVE9OIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgICAgPSAkdGhpcy5kYXRhKCdicy5idXR0b24nKVxuICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmJ1dHRvbicsIChkYXRhID0gbmV3IEJ1dHRvbih0aGlzLCBvcHRpb25zKSkpXG5cbiAgICAgIGlmIChvcHRpb24gPT0gJ3RvZ2dsZScpIGRhdGEudG9nZ2xlKClcbiAgICAgIGVsc2UgaWYgKG9wdGlvbikgZGF0YS5zZXRTdGF0ZShvcHRpb24pXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmJ1dHRvblxuXG4gICQuZm4uYnV0dG9uICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uYnV0dG9uLkNvbnN0cnVjdG9yID0gQnV0dG9uXG5cblxuICAvLyBCVVRUT04gTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5idXR0b24ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLmJ1dHRvbiA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIEJVVFRPTiBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PT1cblxuICAkKGRvY3VtZW50KVxuICAgIC5vbignY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyICRidG4gPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCcuYnRuJylcbiAgICAgIFBsdWdpbi5jYWxsKCRidG4sICd0b2dnbGUnKVxuICAgICAgaWYgKCEoJChlLnRhcmdldCkuaXMoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXSwgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykpKSB7XG4gICAgICAgIC8vIFByZXZlbnQgZG91YmxlIGNsaWNrIG9uIHJhZGlvcywgYW5kIHRoZSBkb3VibGUgc2VsZWN0aW9ucyAoc28gY2FuY2VsbGF0aW9uKSBvbiBjaGVja2JveGVzXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAvLyBUaGUgdGFyZ2V0IGNvbXBvbmVudCBzdGlsbCByZWNlaXZlIHRoZSBmb2N1c1xuICAgICAgICBpZiAoJGJ0bi5pcygnaW5wdXQsYnV0dG9uJykpICRidG4udHJpZ2dlcignZm9jdXMnKVxuICAgICAgICBlbHNlICRidG4uZmluZCgnaW5wdXQ6dmlzaWJsZSxidXR0b246dmlzaWJsZScpLmZpcnN0KCkudHJpZ2dlcignZm9jdXMnKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uKCdmb2N1cy5icy5idXR0b24uZGF0YS1hcGkgYmx1ci5icy5idXR0b24uZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlXj1cImJ1dHRvblwiXScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAkKGUudGFyZ2V0KS5jbG9zZXN0KCcuYnRuJykudG9nZ2xlQ2xhc3MoJ2ZvY3VzJywgL15mb2N1cyhpbik/JC8udGVzdChlLnR5cGUpKVxuICAgIH0pXG5cbn0oalF1ZXJ5KTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IGNhcm91c2VsLmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jY2Fyb3VzZWxcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBDQVJPVVNFTCBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgQ2Fyb3VzZWwgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgICAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy4kaW5kaWNhdG9ycyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmNhcm91c2VsLWluZGljYXRvcnMnKVxuICAgIHRoaXMub3B0aW9ucyAgICAgPSBvcHRpb25zXG4gICAgdGhpcy5wYXVzZWQgICAgICA9IG51bGxcbiAgICB0aGlzLnNsaWRpbmcgICAgID0gbnVsbFxuICAgIHRoaXMuaW50ZXJ2YWwgICAgPSBudWxsXG4gICAgdGhpcy4kYWN0aXZlICAgICA9IG51bGxcbiAgICB0aGlzLiRpdGVtcyAgICAgID0gbnVsbFxuXG4gICAgdGhpcy5vcHRpb25zLmtleWJvYXJkICYmIHRoaXMuJGVsZW1lbnQub24oJ2tleWRvd24uYnMuY2Fyb3VzZWwnLCAkLnByb3h5KHRoaXMua2V5ZG93biwgdGhpcykpXG5cbiAgICB0aGlzLm9wdGlvbnMucGF1c2UgPT0gJ2hvdmVyJyAmJiAhKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgJiYgdGhpcy4kZWxlbWVudFxuICAgICAgLm9uKCdtb3VzZWVudGVyLmJzLmNhcm91c2VsJywgJC5wcm94eSh0aGlzLnBhdXNlLCB0aGlzKSlcbiAgICAgIC5vbignbW91c2VsZWF2ZS5icy5jYXJvdXNlbCcsICQucHJveHkodGhpcy5jeWNsZSwgdGhpcykpXG4gIH1cblxuICBDYXJvdXNlbC5WRVJTSU9OICA9ICczLjMuNydcblxuICBDYXJvdXNlbC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gNjAwXG5cbiAgQ2Fyb3VzZWwuREVGQVVMVFMgPSB7XG4gICAgaW50ZXJ2YWw6IDUwMDAsXG4gICAgcGF1c2U6ICdob3ZlcicsXG4gICAgd3JhcDogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpKSByZXR1cm5cbiAgICBzd2l0Y2ggKGUud2hpY2gpIHtcbiAgICAgIGNhc2UgMzc6IHRoaXMucHJldigpOyBicmVha1xuICAgICAgY2FzZSAzOTogdGhpcy5uZXh0KCk7IGJyZWFrXG4gICAgICBkZWZhdWx0OiByZXR1cm5cbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5jeWNsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZSB8fCAodGhpcy5wYXVzZWQgPSBmYWxzZSlcblxuICAgIHRoaXMuaW50ZXJ2YWwgJiYgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKVxuXG4gICAgdGhpcy5vcHRpb25zLmludGVydmFsXG4gICAgICAmJiAhdGhpcy5wYXVzZWRcbiAgICAgICYmICh0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoJC5wcm94eSh0aGlzLm5leHQsIHRoaXMpLCB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5nZXRJdGVtSW5kZXggPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHRoaXMuJGl0ZW1zID0gaXRlbS5wYXJlbnQoKS5jaGlsZHJlbignLml0ZW0nKVxuICAgIHJldHVybiB0aGlzLiRpdGVtcy5pbmRleChpdGVtIHx8IHRoaXMuJGFjdGl2ZSlcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5nZXRJdGVtRm9yRGlyZWN0aW9uID0gZnVuY3Rpb24gKGRpcmVjdGlvbiwgYWN0aXZlKSB7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgoYWN0aXZlKVxuICAgIHZhciB3aWxsV3JhcCA9IChkaXJlY3Rpb24gPT0gJ3ByZXYnICYmIGFjdGl2ZUluZGV4ID09PSAwKVxuICAgICAgICAgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gJ25leHQnICYmIGFjdGl2ZUluZGV4ID09ICh0aGlzLiRpdGVtcy5sZW5ndGggLSAxKSlcbiAgICBpZiAod2lsbFdyYXAgJiYgIXRoaXMub3B0aW9ucy53cmFwKSByZXR1cm4gYWN0aXZlXG4gICAgdmFyIGRlbHRhID0gZGlyZWN0aW9uID09ICdwcmV2JyA/IC0xIDogMVxuICAgIHZhciBpdGVtSW5kZXggPSAoYWN0aXZlSW5kZXggKyBkZWx0YSkgJSB0aGlzLiRpdGVtcy5sZW5ndGhcbiAgICByZXR1cm4gdGhpcy4kaXRlbXMuZXEoaXRlbUluZGV4KVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnRvID0gZnVuY3Rpb24gKHBvcykge1xuICAgIHZhciB0aGF0ICAgICAgICA9IHRoaXNcbiAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleCh0aGlzLiRhY3RpdmUgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pdGVtLmFjdGl2ZScpKVxuXG4gICAgaWYgKHBvcyA+ICh0aGlzLiRpdGVtcy5sZW5ndGggLSAxKSB8fCBwb3MgPCAwKSByZXR1cm5cblxuICAgIGlmICh0aGlzLnNsaWRpbmcpICAgICAgIHJldHVybiB0aGlzLiRlbGVtZW50Lm9uZSgnc2xpZC5icy5jYXJvdXNlbCcsIGZ1bmN0aW9uICgpIHsgdGhhdC50byhwb3MpIH0pIC8vIHllcywgXCJzbGlkXCJcbiAgICBpZiAoYWN0aXZlSW5kZXggPT0gcG9zKSByZXR1cm4gdGhpcy5wYXVzZSgpLmN5Y2xlKClcblxuICAgIHJldHVybiB0aGlzLnNsaWRlKHBvcyA+IGFjdGl2ZUluZGV4ID8gJ25leHQnIDogJ3ByZXYnLCB0aGlzLiRpdGVtcy5lcShwb3MpKVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlIHx8ICh0aGlzLnBhdXNlZCA9IHRydWUpXG5cbiAgICBpZiAodGhpcy4kZWxlbWVudC5maW5kKCcubmV4dCwgLnByZXYnKS5sZW5ndGggJiYgJC5zdXBwb3J0LnRyYW5zaXRpb24pIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpXG4gICAgICB0aGlzLmN5Y2xlKHRydWUpXG4gICAgfVxuXG4gICAgdGhpcy5pbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbClcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm5cbiAgICByZXR1cm4gdGhpcy5zbGlkZSgnbmV4dCcpXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm5cbiAgICByZXR1cm4gdGhpcy5zbGlkZSgncHJldicpXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUuc2xpZGUgPSBmdW5jdGlvbiAodHlwZSwgbmV4dCkge1xuICAgIHZhciAkYWN0aXZlICAgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pdGVtLmFjdGl2ZScpXG4gICAgdmFyICRuZXh0ICAgICA9IG5leHQgfHwgdGhpcy5nZXRJdGVtRm9yRGlyZWN0aW9uKHR5cGUsICRhY3RpdmUpXG4gICAgdmFyIGlzQ3ljbGluZyA9IHRoaXMuaW50ZXJ2YWxcbiAgICB2YXIgZGlyZWN0aW9uID0gdHlwZSA9PSAnbmV4dCcgPyAnbGVmdCcgOiAncmlnaHQnXG4gICAgdmFyIHRoYXQgICAgICA9IHRoaXNcblxuICAgIGlmICgkbmV4dC5oYXNDbGFzcygnYWN0aXZlJykpIHJldHVybiAodGhpcy5zbGlkaW5nID0gZmFsc2UpXG5cbiAgICB2YXIgcmVsYXRlZFRhcmdldCA9ICRuZXh0WzBdXG4gICAgdmFyIHNsaWRlRXZlbnQgPSAkLkV2ZW50KCdzbGlkZS5icy5jYXJvdXNlbCcsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXQsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgIH0pXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHNsaWRlRXZlbnQpXG4gICAgaWYgKHNsaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgdGhpcy5zbGlkaW5nID0gdHJ1ZVxuXG4gICAgaXNDeWNsaW5nICYmIHRoaXMucGF1c2UoKVxuXG4gICAgaWYgKHRoaXMuJGluZGljYXRvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLiRpbmRpY2F0b3JzLmZpbmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgIHZhciAkbmV4dEluZGljYXRvciA9ICQodGhpcy4kaW5kaWNhdG9ycy5jaGlsZHJlbigpW3RoaXMuZ2V0SXRlbUluZGV4KCRuZXh0KV0pXG4gICAgICAkbmV4dEluZGljYXRvciAmJiAkbmV4dEluZGljYXRvci5hZGRDbGFzcygnYWN0aXZlJylcbiAgICB9XG5cbiAgICB2YXIgc2xpZEV2ZW50ID0gJC5FdmVudCgnc2xpZC5icy5jYXJvdXNlbCcsIHsgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldCwgZGlyZWN0aW9uOiBkaXJlY3Rpb24gfSkgLy8geWVzLCBcInNsaWRcIlxuICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdzbGlkZScpKSB7XG4gICAgICAkbmV4dC5hZGRDbGFzcyh0eXBlKVxuICAgICAgJG5leHRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XG4gICAgICAkYWN0aXZlLmFkZENsYXNzKGRpcmVjdGlvbilcbiAgICAgICRuZXh0LmFkZENsYXNzKGRpcmVjdGlvbilcbiAgICAgICRhY3RpdmVcbiAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICRuZXh0LnJlbW92ZUNsYXNzKFt0eXBlLCBkaXJlY3Rpb25dLmpvaW4oJyAnKSkuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAgICAgJGFjdGl2ZS5yZW1vdmVDbGFzcyhbJ2FjdGl2ZScsIGRpcmVjdGlvbl0uam9pbignICcpKVxuICAgICAgICAgIHRoYXQuc2xpZGluZyA9IGZhbHNlXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoc2xpZEV2ZW50KVxuICAgICAgICAgIH0sIDApXG4gICAgICAgIH0pXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChDYXJvdXNlbC5UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgIH0gZWxzZSB7XG4gICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgJG5leHQuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICB0aGlzLnNsaWRpbmcgPSBmYWxzZVxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHNsaWRFdmVudClcbiAgICB9XG5cbiAgICBpc0N5Y2xpbmcgJiYgdGhpcy5jeWNsZSgpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBDQVJPVVNFTCBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgICAgPSAkdGhpcy5kYXRhKCdicy5jYXJvdXNlbCcpXG4gICAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBDYXJvdXNlbC5ERUZBVUxUUywgJHRoaXMuZGF0YSgpLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbilcbiAgICAgIHZhciBhY3Rpb24gID0gdHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJyA/IG9wdGlvbiA6IG9wdGlvbnMuc2xpZGVcblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5jYXJvdXNlbCcsIChkYXRhID0gbmV3IENhcm91c2VsKHRoaXMsIG9wdGlvbnMpKSlcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdudW1iZXInKSBkYXRhLnRvKG9wdGlvbilcbiAgICAgIGVsc2UgaWYgKGFjdGlvbikgZGF0YVthY3Rpb25dKClcbiAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaW50ZXJ2YWwpIGRhdGEucGF1c2UoKS5jeWNsZSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmNhcm91c2VsXG5cbiAgJC5mbi5jYXJvdXNlbCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmNhcm91c2VsLkNvbnN0cnVjdG9yID0gQ2Fyb3VzZWxcblxuXG4gIC8vIENBUk9VU0VMIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5jYXJvdXNlbC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uY2Fyb3VzZWwgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBDQVJPVVNFTCBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PT09PVxuXG4gIHZhciBjbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBocmVmXG4gICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgdmFyICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgPSAkdGhpcy5hdHRyKCdocmVmJykpICYmIGhyZWYucmVwbGFjZSgvLiooPz0jW15cXHNdKyQpLywgJycpKSAvLyBzdHJpcCBmb3IgaWU3XG4gICAgaWYgKCEkdGFyZ2V0Lmhhc0NsYXNzKCdjYXJvdXNlbCcpKSByZXR1cm5cbiAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkdGFyZ2V0LmRhdGEoKSwgJHRoaXMuZGF0YSgpKVxuICAgIHZhciBzbGlkZUluZGV4ID0gJHRoaXMuYXR0cignZGF0YS1zbGlkZS10bycpXG4gICAgaWYgKHNsaWRlSW5kZXgpIG9wdGlvbnMuaW50ZXJ2YWwgPSBmYWxzZVxuXG4gICAgUGx1Z2luLmNhbGwoJHRhcmdldCwgb3B0aW9ucylcblxuICAgIGlmIChzbGlkZUluZGV4KSB7XG4gICAgICAkdGFyZ2V0LmRhdGEoJ2JzLmNhcm91c2VsJykudG8oc2xpZGVJbmRleClcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gICQoZG9jdW1lbnQpXG4gICAgLm9uKCdjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaScsICdbZGF0YS1zbGlkZV0nLCBjbGlja0hhbmRsZXIpXG4gICAgLm9uKCdjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaScsICdbZGF0YS1zbGlkZS10b10nLCBjbGlja0hhbmRsZXIpXG5cbiAgJCh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICQoJ1tkYXRhLXJpZGU9XCJjYXJvdXNlbFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRjYXJvdXNlbCA9ICQodGhpcylcbiAgICAgIFBsdWdpbi5jYWxsKCRjYXJvdXNlbCwgJGNhcm91c2VsLmRhdGEoKSlcbiAgICB9KVxuICB9KVxuXG59KGpRdWVyeSk7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBjb2xsYXBzZS5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI2NvbGxhcHNlXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBqc2hpbnQgbGF0ZWRlZjogZmFsc2UgKi9cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBDT0xMQVBTRSBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCAgICAgID0gJChlbGVtZW50KVxuICAgIHRoaXMub3B0aW9ucyAgICAgICA9ICQuZXh0ZW5kKHt9LCBDb2xsYXBzZS5ERUZBVUxUUywgb3B0aW9ucylcbiAgICB0aGlzLiR0cmlnZ2VyICAgICAgPSAkKCdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXVtocmVmPVwiIycgKyBlbGVtZW50LmlkICsgJ1wiXSwnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXVtkYXRhLXRhcmdldD1cIiMnICsgZWxlbWVudC5pZCArICdcIl0nKVxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IG51bGxcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGFyZW50KSB7XG4gICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuJGVsZW1lbnQsIHRoaXMuJHRyaWdnZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2dnbGUpIHRoaXMudG9nZ2xlKClcbiAgfVxuXG4gIENvbGxhcHNlLlZFUlNJT04gID0gJzMuMy43J1xuXG4gIENvbGxhcHNlLlRSQU5TSVRJT05fRFVSQVRJT04gPSAzNTBcblxuICBDb2xsYXBzZS5ERUZBVUxUUyA9IHtcbiAgICB0b2dnbGU6IHRydWVcbiAgfVxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhc1dpZHRoID0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnd2lkdGgnKVxuICAgIHJldHVybiBoYXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0J1xuICB9XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudHJhbnNpdGlvbmluZyB8fCB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdpbicpKSByZXR1cm5cblxuICAgIHZhciBhY3RpdmVzRGF0YVxuICAgIHZhciBhY3RpdmVzID0gdGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5jaGlsZHJlbignLnBhbmVsJykuY2hpbGRyZW4oJy5pbiwgLmNvbGxhcHNpbmcnKVxuXG4gICAgaWYgKGFjdGl2ZXMgJiYgYWN0aXZlcy5sZW5ndGgpIHtcbiAgICAgIGFjdGl2ZXNEYXRhID0gYWN0aXZlcy5kYXRhKCdicy5jb2xsYXBzZScpXG4gICAgICBpZiAoYWN0aXZlc0RhdGEgJiYgYWN0aXZlc0RhdGEudHJhbnNpdGlvbmluZykgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0RXZlbnQgPSAkLkV2ZW50KCdzaG93LmJzLmNvbGxhcHNlJylcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoc3RhcnRFdmVudClcbiAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICBpZiAoYWN0aXZlcyAmJiBhY3RpdmVzLmxlbmd0aCkge1xuICAgICAgUGx1Z2luLmNhbGwoYWN0aXZlcywgJ2hpZGUnKVxuICAgICAgYWN0aXZlc0RhdGEgfHwgYWN0aXZlcy5kYXRhKCdicy5jb2xsYXBzZScsIG51bGwpXG4gICAgfVxuXG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKClcblxuICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgIC5yZW1vdmVDbGFzcygnY29sbGFwc2UnKVxuICAgICAgLmFkZENsYXNzKCdjb2xsYXBzaW5nJylbZGltZW5zaW9uXSgwKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy4kdHJpZ2dlclxuICAgICAgLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMVxuXG4gICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNpbmcnKVxuICAgICAgICAuYWRkQ2xhc3MoJ2NvbGxhcHNlIGluJylbZGltZW5zaW9uXSgnJylcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IDBcbiAgICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgICAgLnRyaWdnZXIoJ3Nob3duLmJzLmNvbGxhcHNlJylcbiAgICB9XG5cbiAgICBpZiAoISQuc3VwcG9ydC50cmFuc2l0aW9uKSByZXR1cm4gY29tcGxldGUuY2FsbCh0aGlzKVxuXG4gICAgdmFyIHNjcm9sbFNpemUgPSAkLmNhbWVsQ2FzZShbJ3Njcm9sbCcsIGRpbWVuc2lvbl0uam9pbignLScpKVxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgJC5wcm94eShjb21wbGV0ZSwgdGhpcykpXG4gICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoQ29sbGFwc2UuVFJBTlNJVElPTl9EVVJBVElPTilbZGltZW5zaW9uXSh0aGlzLiRlbGVtZW50WzBdW3Njcm9sbFNpemVdKVxuICB9XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudHJhbnNpdGlvbmluZyB8fCAhdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaW4nKSkgcmV0dXJuXG5cbiAgICB2YXIgc3RhcnRFdmVudCA9ICQuRXZlbnQoJ2hpZGUuYnMuY29sbGFwc2UnKVxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihzdGFydEV2ZW50KVxuICAgIGlmIChzdGFydEV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cblxuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpXG5cbiAgICB0aGlzLiRlbGVtZW50W2RpbWVuc2lvbl0odGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKCkpWzBdLm9mZnNldEhlaWdodFxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLmFkZENsYXNzKCdjb2xsYXBzaW5nJylcbiAgICAgIC5yZW1vdmVDbGFzcygnY29sbGFwc2UgaW4nKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSlcblxuICAgIHRoaXMuJHRyaWdnZXJcbiAgICAgIC5hZGRDbGFzcygnY29sbGFwc2VkJylcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpXG5cbiAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSAxXG5cbiAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSAwXG4gICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC5yZW1vdmVDbGFzcygnY29sbGFwc2luZycpXG4gICAgICAgIC5hZGRDbGFzcygnY29sbGFwc2UnKVxuICAgICAgICAudHJpZ2dlcignaGlkZGVuLmJzLmNvbGxhcHNlJylcbiAgICB9XG5cbiAgICBpZiAoISQuc3VwcG9ydC50cmFuc2l0aW9uKSByZXR1cm4gY29tcGxldGUuY2FsbCh0aGlzKVxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgW2RpbWVuc2lvbl0oMClcbiAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsICQucHJveHkoY29tcGxldGUsIHRoaXMpKVxuICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKENvbGxhcHNlLlRSQU5TSVRJT05fRFVSQVRJT04pXG4gIH1cblxuICBDb2xsYXBzZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXNbdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaW4nKSA/ICdoaWRlJyA6ICdzaG93J10oKVxuICB9XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMucGFyZW50KVxuICAgICAgLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdW2RhdGEtcGFyZW50PVwiJyArIHRoaXMub3B0aW9ucy5wYXJlbnQgKyAnXCJdJylcbiAgICAgIC5lYWNoKCQucHJveHkoZnVuY3Rpb24gKGksIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJChlbGVtZW50KVxuICAgICAgICB0aGlzLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhnZXRUYXJnZXRGcm9tVHJpZ2dlcigkZWxlbWVudCksICRlbGVtZW50KVxuICAgICAgfSwgdGhpcykpXG4gICAgICAuZW5kKClcbiAgfVxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MgPSBmdW5jdGlvbiAoJGVsZW1lbnQsICR0cmlnZ2VyKSB7XG4gICAgdmFyIGlzT3BlbiA9ICRlbGVtZW50Lmhhc0NsYXNzKCdpbicpXG5cbiAgICAkZWxlbWVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKVxuICAgICR0cmlnZ2VyXG4gICAgICAudG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZCcsICFpc09wZW4pXG4gICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIGlzT3BlbilcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRhcmdldEZyb21UcmlnZ2VyKCR0cmlnZ2VyKSB7XG4gICAgdmFyIGhyZWZcbiAgICB2YXIgdGFyZ2V0ID0gJHRyaWdnZXIuYXR0cignZGF0YS10YXJnZXQnKVxuICAgICAgfHwgKGhyZWYgPSAkdHJpZ2dlci5hdHRyKCdocmVmJykpICYmIGhyZWYucmVwbGFjZSgvLiooPz0jW15cXHNdKyQpLywgJycpIC8vIHN0cmlwIGZvciBpZTdcblxuICAgIHJldHVybiAkKHRhcmdldClcbiAgfVxuXG5cbiAgLy8gQ09MTEFQU0UgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMuY29sbGFwc2UnKVxuICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQ29sbGFwc2UuREVGQVVMVFMsICR0aGlzLmRhdGEoKSwgdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb24pXG5cbiAgICAgIGlmICghZGF0YSAmJiBvcHRpb25zLnRvZ2dsZSAmJiAvc2hvd3xoaWRlLy50ZXN0KG9wdGlvbikpIG9wdGlvbnMudG9nZ2xlID0gZmFsc2VcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuY29sbGFwc2UnLCAoZGF0YSA9IG5ldyBDb2xsYXBzZSh0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4uY29sbGFwc2VcblxuICAkLmZuLmNvbGxhcHNlICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uY29sbGFwc2UuQ29uc3RydWN0b3IgPSBDb2xsYXBzZVxuXG5cbiAgLy8gQ09MTEFQU0UgTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLmNvbGxhcHNlLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5jb2xsYXBzZSA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIENPTExBUFNFIERBVEEtQVBJXG4gIC8vID09PT09PT09PT09PT09PT09XG5cbiAgJChkb2N1bWVudCkub24oJ2NsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdJywgZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcblxuICAgIGlmICghJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKSkgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICB2YXIgJHRhcmdldCA9IGdldFRhcmdldEZyb21UcmlnZ2VyKCR0aGlzKVxuICAgIHZhciBkYXRhICAgID0gJHRhcmdldC5kYXRhKCdicy5jb2xsYXBzZScpXG4gICAgdmFyIG9wdGlvbiAgPSBkYXRhID8gJ3RvZ2dsZScgOiAkdGhpcy5kYXRhKClcblxuICAgIFBsdWdpbi5jYWxsKCR0YXJnZXQsIG9wdGlvbilcbiAgfSlcblxufShqUXVlcnkpO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogZHJvcGRvd24uanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNkcm9wZG93bnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBEUk9QRE9XTiBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgYmFja2Ryb3AgPSAnLmRyb3Bkb3duLWJhY2tkcm9wJ1xuICB2YXIgdG9nZ2xlICAgPSAnW2RhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIl0nXG4gIHZhciBEcm9wZG93biA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgJChlbGVtZW50KS5vbignY2xpY2suYnMuZHJvcGRvd24nLCB0aGlzLnRvZ2dsZSlcbiAgfVxuXG4gIERyb3Bkb3duLlZFUlNJT04gPSAnMy4zLjcnXG5cbiAgZnVuY3Rpb24gZ2V0UGFyZW50KCR0aGlzKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxuXG4gICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgLyNbQS1aYS16XS8udGVzdChzZWxlY3RvcikgJiYgc2VsZWN0b3IucmVwbGFjZSgvLiooPz0jW15cXHNdKiQpLywgJycpIC8vIHN0cmlwIGZvciBpZTdcbiAgICB9XG5cbiAgICB2YXIgJHBhcmVudCA9IHNlbGVjdG9yICYmICQoc2VsZWN0b3IpXG5cbiAgICByZXR1cm4gJHBhcmVudCAmJiAkcGFyZW50Lmxlbmd0aCA/ICRwYXJlbnQgOiAkdGhpcy5wYXJlbnQoKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJNZW51cyhlKSB7XG4gICAgaWYgKGUgJiYgZS53aGljaCA9PT0gMykgcmV0dXJuXG4gICAgJChiYWNrZHJvcCkucmVtb3ZlKClcbiAgICAkKHRvZ2dsZSkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICAgICAgICA9ICQodGhpcylcbiAgICAgIHZhciAkcGFyZW50ICAgICAgID0gZ2V0UGFyZW50KCR0aGlzKVxuICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7IHJlbGF0ZWRUYXJnZXQ6IHRoaXMgfVxuXG4gICAgICBpZiAoISRwYXJlbnQuaGFzQ2xhc3MoJ29wZW4nKSkgcmV0dXJuXG5cbiAgICAgIGlmIChlICYmIGUudHlwZSA9PSAnY2xpY2snICYmIC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZS50YXJnZXQudGFnTmFtZSkgJiYgJC5jb250YWlucygkcGFyZW50WzBdLCBlLnRhcmdldCkpIHJldHVyblxuXG4gICAgICAkcGFyZW50LnRyaWdnZXIoZSA9ICQuRXZlbnQoJ2hpZGUuYnMuZHJvcGRvd24nLCByZWxhdGVkVGFyZ2V0KSlcblxuICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgICAkdGhpcy5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJylcbiAgICAgICRwYXJlbnQucmVtb3ZlQ2xhc3MoJ29wZW4nKS50cmlnZ2VyKCQuRXZlbnQoJ2hpZGRlbi5icy5kcm9wZG93bicsIHJlbGF0ZWRUYXJnZXQpKVxuICAgIH0pXG4gIH1cblxuICBEcm9wZG93bi5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXG5cbiAgICBpZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVyblxuXG4gICAgdmFyICRwYXJlbnQgID0gZ2V0UGFyZW50KCR0aGlzKVxuICAgIHZhciBpc0FjdGl2ZSA9ICRwYXJlbnQuaGFzQ2xhc3MoJ29wZW4nKVxuXG4gICAgY2xlYXJNZW51cygpXG5cbiAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICEkcGFyZW50LmNsb3Nlc3QoJy5uYXZiYXItbmF2JykubGVuZ3RoKSB7XG4gICAgICAgIC8vIGlmIG1vYmlsZSB3ZSB1c2UgYSBiYWNrZHJvcCBiZWNhdXNlIGNsaWNrIGV2ZW50cyBkb24ndCBkZWxlZ2F0ZVxuICAgICAgICAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxuICAgICAgICAgIC5hZGRDbGFzcygnZHJvcGRvd24tYmFja2Ryb3AnKVxuICAgICAgICAgIC5pbnNlcnRBZnRlcigkKHRoaXMpKVxuICAgICAgICAgIC5vbignY2xpY2snLCBjbGVhck1lbnVzKVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVsYXRlZFRhcmdldCA9IHsgcmVsYXRlZFRhcmdldDogdGhpcyB9XG4gICAgICAkcGFyZW50LnRyaWdnZXIoZSA9ICQuRXZlbnQoJ3Nob3cuYnMuZHJvcGRvd24nLCByZWxhdGVkVGFyZ2V0KSlcblxuICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgICAkdGhpc1xuICAgICAgICAudHJpZ2dlcignZm9jdXMnKVxuICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJylcblxuICAgICAgJHBhcmVudFxuICAgICAgICAudG9nZ2xlQ2xhc3MoJ29wZW4nKVxuICAgICAgICAudHJpZ2dlcigkLkV2ZW50KCdzaG93bi5icy5kcm9wZG93bicsIHJlbGF0ZWRUYXJnZXQpKVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghLygzOHw0MHwyN3wzMikvLnRlc3QoZS53aGljaCkgfHwgL2lucHV0fHRleHRhcmVhL2kudGVzdChlLnRhcmdldC50YWdOYW1lKSkgcmV0dXJuXG5cbiAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICBpZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVyblxuXG4gICAgdmFyICRwYXJlbnQgID0gZ2V0UGFyZW50KCR0aGlzKVxuICAgIHZhciBpc0FjdGl2ZSA9ICRwYXJlbnQuaGFzQ2xhc3MoJ29wZW4nKVxuXG4gICAgaWYgKCFpc0FjdGl2ZSAmJiBlLndoaWNoICE9IDI3IHx8IGlzQWN0aXZlICYmIGUud2hpY2ggPT0gMjcpIHtcbiAgICAgIGlmIChlLndoaWNoID09IDI3KSAkcGFyZW50LmZpbmQodG9nZ2xlKS50cmlnZ2VyKCdmb2N1cycpXG4gICAgICByZXR1cm4gJHRoaXMudHJpZ2dlcignY2xpY2snKVxuICAgIH1cblxuICAgIHZhciBkZXNjID0gJyBsaTpub3QoLmRpc2FibGVkKTp2aXNpYmxlIGEnXG4gICAgdmFyICRpdGVtcyA9ICRwYXJlbnQuZmluZCgnLmRyb3Bkb3duLW1lbnUnICsgZGVzYylcblxuICAgIGlmICghJGl0ZW1zLmxlbmd0aCkgcmV0dXJuXG5cbiAgICB2YXIgaW5kZXggPSAkaXRlbXMuaW5kZXgoZS50YXJnZXQpXG5cbiAgICBpZiAoZS53aGljaCA9PSAzOCAmJiBpbmRleCA+IDApICAgICAgICAgICAgICAgICBpbmRleC0tICAgICAgICAgLy8gdXBcbiAgICBpZiAoZS53aGljaCA9PSA0MCAmJiBpbmRleCA8ICRpdGVtcy5sZW5ndGggLSAxKSBpbmRleCsrICAgICAgICAgLy8gZG93blxuICAgIGlmICghfmluZGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMFxuXG4gICAgJGl0ZW1zLmVxKGluZGV4KS50cmlnZ2VyKCdmb2N1cycpXG4gIH1cblxuXG4gIC8vIERST1BET1dOIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgID0gJHRoaXMuZGF0YSgnYnMuZHJvcGRvd24nKVxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmRyb3Bkb3duJywgKGRhdGEgPSBuZXcgRHJvcGRvd24odGhpcykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXS5jYWxsKCR0aGlzKVxuICAgIH0pXG4gIH1cblxuICB2YXIgb2xkID0gJC5mbi5kcm9wZG93blxuXG4gICQuZm4uZHJvcGRvd24gICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi5kcm9wZG93bi5Db25zdHJ1Y3RvciA9IERyb3Bkb3duXG5cblxuICAvLyBEUk9QRE9XTiBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PT09PVxuXG4gICQuZm4uZHJvcGRvd24ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLmRyb3Bkb3duID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG5cbiAgLy8gQVBQTFkgVE8gU1RBTkRBUkQgRFJPUERPV04gRUxFTUVOVFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAkKGRvY3VtZW50KVxuICAgIC5vbignY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGknLCBjbGVhck1lbnVzKVxuICAgIC5vbignY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGknLCAnLmRyb3Bkb3duIGZvcm0nLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpIH0pXG4gICAgLm9uKCdjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaScsIHRvZ2dsZSwgRHJvcGRvd24ucHJvdG90eXBlLnRvZ2dsZSlcbiAgICAub24oJ2tleWRvd24uYnMuZHJvcGRvd24uZGF0YS1hcGknLCB0b2dnbGUsIERyb3Bkb3duLnByb3RvdHlwZS5rZXlkb3duKVxuICAgIC5vbigna2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaScsICcuZHJvcGRvd24tbWVudScsIERyb3Bkb3duLnByb3RvdHlwZS5rZXlkb3duKVxuXG59KGpRdWVyeSk7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBtb2RhbC5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI21vZGFsc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIE1PREFMIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBNb2RhbCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zICAgICAgICAgICAgID0gb3B0aW9uc1xuICAgIHRoaXMuJGJvZHkgICAgICAgICAgICAgICA9ICQoZG9jdW1lbnQuYm9keSlcbiAgICB0aGlzLiRlbGVtZW50ICAgICAgICAgICAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy4kZGlhbG9nICAgICAgICAgICAgID0gdGhpcy4kZWxlbWVudC5maW5kKCcubW9kYWwtZGlhbG9nJylcbiAgICB0aGlzLiRiYWNrZHJvcCAgICAgICAgICAgPSBudWxsXG4gICAgdGhpcy5pc1Nob3duICAgICAgICAgICAgID0gbnVsbFxuICAgIHRoaXMub3JpZ2luYWxCb2R5UGFkICAgICA9IG51bGxcbiAgICB0aGlzLnNjcm9sbGJhcldpZHRoICAgICAgPSAwXG4gICAgdGhpcy5pZ25vcmVCYWNrZHJvcENsaWNrID0gZmFsc2VcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3RlKSB7XG4gICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC5maW5kKCcubW9kYWwtY29udGVudCcpXG4gICAgICAgIC5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUsICQucHJveHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignbG9hZGVkLmJzLm1vZGFsJylcbiAgICAgICAgfSwgdGhpcykpXG4gICAgfVxuICB9XG5cbiAgTW9kYWwuVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgTW9kYWwuVFJBTlNJVElPTl9EVVJBVElPTiA9IDMwMFxuICBNb2RhbC5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXG5cbiAgTW9kYWwuREVGQVVMVFMgPSB7XG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgc2hvdzogdHJ1ZVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChfcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmlzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhfcmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKF9yZWxhdGVkVGFyZ2V0KSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgdmFyIGUgICAgPSAkLkV2ZW50KCdzaG93LmJzLm1vZGFsJywgeyByZWxhdGVkVGFyZ2V0OiBfcmVsYXRlZFRhcmdldCB9KVxuXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXG5cbiAgICBpZiAodGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgdGhpcy5pc1Nob3duID0gdHJ1ZVxuXG4gICAgdGhpcy5jaGVja1Njcm9sbGJhcigpXG4gICAgdGhpcy5zZXRTY3JvbGxiYXIoKVxuICAgIHRoaXMuJGJvZHkuYWRkQ2xhc3MoJ21vZGFsLW9wZW4nKVxuXG4gICAgdGhpcy5lc2NhcGUoKVxuICAgIHRoaXMucmVzaXplKClcblxuICAgIHRoaXMuJGVsZW1lbnQub24oJ2NsaWNrLmRpc21pc3MuYnMubW9kYWwnLCAnW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJywgJC5wcm94eSh0aGlzLmhpZGUsIHRoaXMpKVxuXG4gICAgdGhpcy4kZGlhbG9nLm9uKCdtb3VzZWRvd24uZGlzbWlzcy5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoYXQuJGVsZW1lbnQub25lKCdtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoJChlLnRhcmdldCkuaXModGhhdC4kZWxlbWVudCkpIHRoYXQuaWdub3JlQmFja2Ryb3BDbGljayA9IHRydWVcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuYmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGF0LiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJylcblxuICAgICAgaWYgKCF0aGF0LiRlbGVtZW50LnBhcmVudCgpLmxlbmd0aCkge1xuICAgICAgICB0aGF0LiRlbGVtZW50LmFwcGVuZFRvKHRoYXQuJGJvZHkpIC8vIGRvbid0IG1vdmUgbW9kYWxzIGRvbSBwb3NpdGlvblxuICAgICAgfVxuXG4gICAgICB0aGF0LiRlbGVtZW50XG4gICAgICAgIC5zaG93KClcbiAgICAgICAgLnNjcm9sbFRvcCgwKVxuXG4gICAgICB0aGF0LmFkanVzdERpYWxvZygpXG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIHRoYXQuJGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XG4gICAgICB9XG5cbiAgICAgIHRoYXQuJGVsZW1lbnQuYWRkQ2xhc3MoJ2luJylcblxuICAgICAgdGhhdC5lbmZvcmNlRm9jdXMoKVxuXG4gICAgICB2YXIgZSA9ICQuRXZlbnQoJ3Nob3duLmJzLm1vZGFsJywgeyByZWxhdGVkVGFyZ2V0OiBfcmVsYXRlZFRhcmdldCB9KVxuXG4gICAgICB0cmFuc2l0aW9uID9cbiAgICAgICAgdGhhdC4kZGlhbG9nIC8vIHdhaXQgZm9yIG1vZGFsIHRvIHNsaWRlIGluXG4gICAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdmb2N1cycpLnRyaWdnZXIoZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChNb2RhbC5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignZm9jdXMnKS50cmlnZ2VyKGUpXG4gICAgfSlcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZSkgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBlID0gJC5FdmVudCgnaGlkZS5icy5tb2RhbCcpXG5cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcblxuICAgIGlmICghdGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgdGhpcy5pc1Nob3duID0gZmFsc2VcblxuICAgIHRoaXMuZXNjYXBlKClcbiAgICB0aGlzLnJlc2l6ZSgpXG5cbiAgICAkKGRvY3VtZW50KS5vZmYoJ2ZvY3VzaW4uYnMubW9kYWwnKVxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLnJlbW92ZUNsYXNzKCdpbicpXG4gICAgICAub2ZmKCdjbGljay5kaXNtaXNzLmJzLm1vZGFsJylcbiAgICAgIC5vZmYoJ21vdXNldXAuZGlzbWlzcy5icy5tb2RhbCcpXG5cbiAgICB0aGlzLiRkaWFsb2cub2ZmKCdtb3VzZWRvd24uZGlzbWlzcy5icy5tb2RhbCcpXG5cbiAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJykgP1xuICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCAkLnByb3h5KHRoaXMuaGlkZU1vZGFsLCB0aGlzKSlcbiAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgIHRoaXMuaGlkZU1vZGFsKClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5lbmZvcmNlRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgJChkb2N1bWVudClcbiAgICAgIC5vZmYoJ2ZvY3VzaW4uYnMubW9kYWwnKSAvLyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGZvY3VzIGxvb3BcbiAgICAgIC5vbignZm9jdXNpbi5icy5tb2RhbCcsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50ICE9PSBlLnRhcmdldCAmJlxuICAgICAgICAgICAgdGhpcy4kZWxlbWVudFswXSAhPT0gZS50YXJnZXQgJiZcbiAgICAgICAgICAgICF0aGlzLiRlbGVtZW50LmhhcyhlLnRhcmdldCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdmb2N1cycpXG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpKVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLmVzY2FwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc1Nob3duICYmIHRoaXMub3B0aW9ucy5rZXlib2FyZCkge1xuICAgICAgdGhpcy4kZWxlbWVudC5vbigna2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLndoaWNoID09IDI3ICYmIHRoaXMuaGlkZSgpXG4gICAgICB9LCB0aGlzKSlcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2hvd24pIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQub2ZmKCdrZXlkb3duLmRpc21pc3MuYnMubW9kYWwnKVxuICAgIH1cbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuaXNTaG93bikge1xuICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuYnMubW9kYWwnLCAkLnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLCB0aGlzKSlcbiAgICB9IGVsc2Uge1xuICAgICAgJCh3aW5kb3cpLm9mZigncmVzaXplLmJzLm1vZGFsJylcbiAgICB9XG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuaGlkZU1vZGFsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIHRoaXMuJGVsZW1lbnQuaGlkZSgpXG4gICAgdGhpcy5iYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICB0aGF0LiRib2R5LnJlbW92ZUNsYXNzKCdtb2RhbC1vcGVuJylcbiAgICAgIHRoYXQucmVzZXRBZGp1c3RtZW50cygpXG4gICAgICB0aGF0LnJlc2V0U2Nyb2xsYmFyKClcbiAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignaGlkZGVuLmJzLm1vZGFsJylcbiAgICB9KVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuJGJhY2tkcm9wICYmIHRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpXG4gICAgdGhpcy4kYmFja2Ryb3AgPSBudWxsXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuYmFja2Ryb3AgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICB2YXIgYW5pbWF0ZSA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/ICdmYWRlJyA6ICcnXG5cbiAgICBpZiAodGhpcy5pc1Nob3duICYmIHRoaXMub3B0aW9ucy5iYWNrZHJvcCkge1xuICAgICAgdmFyIGRvQW5pbWF0ZSA9ICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIGFuaW1hdGVcblxuICAgICAgdGhpcy4kYmFja2Ryb3AgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxuICAgICAgICAuYWRkQ2xhc3MoJ21vZGFsLWJhY2tkcm9wICcgKyBhbmltYXRlKVxuICAgICAgICAuYXBwZW5kVG8odGhpcy4kYm9keSlcblxuICAgICAgdGhpcy4kZWxlbWVudC5vbignY2xpY2suZGlzbWlzcy5icy5tb2RhbCcsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaykge1xuICAgICAgICAgIHRoaXMuaWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQpIHJldHVyblxuICAgICAgICB0aGlzLm9wdGlvbnMuYmFja2Ryb3AgPT0gJ3N0YXRpYydcbiAgICAgICAgICA/IHRoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKVxuICAgICAgICAgIDogdGhpcy5oaWRlKClcbiAgICAgIH0sIHRoaXMpKVxuXG4gICAgICBpZiAoZG9BbmltYXRlKSB0aGlzLiRiYWNrZHJvcFswXS5vZmZzZXRXaWR0aCAvLyBmb3JjZSByZWZsb3dcblxuICAgICAgdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoJ2luJylcblxuICAgICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuXG5cbiAgICAgIGRvQW5pbWF0ZSA/XG4gICAgICAgIHRoaXMuJGJhY2tkcm9wXG4gICAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgY2FsbGJhY2spXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgICAgY2FsbGJhY2soKVxuXG4gICAgfSBlbHNlIGlmICghdGhpcy5pc1Nob3duICYmIHRoaXMuJGJhY2tkcm9wKSB7XG4gICAgICB0aGlzLiRiYWNrZHJvcC5yZW1vdmVDbGFzcygnaW4nKVxuXG4gICAgICB2YXIgY2FsbGJhY2tSZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoYXQucmVtb3ZlQmFja2Ryb3AoKVxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJykgP1xuICAgICAgICB0aGlzLiRiYWNrZHJvcFxuICAgICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGNhbGxiYWNrUmVtb3ZlKVxuICAgICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChNb2RhbC5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICAgIGNhbGxiYWNrUmVtb3ZlKClcblxuICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICAvLyB0aGVzZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG5cbiAgTW9kYWwucHJvdG90eXBlLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFkanVzdERpYWxvZygpXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtb2RhbElzT3ZlcmZsb3dpbmcgPSB0aGlzLiRlbGVtZW50WzBdLnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcblxuICAgIHRoaXMuJGVsZW1lbnQuY3NzKHtcbiAgICAgIHBhZGRpbmdMZWZ0OiAgIXRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgJiYgbW9kYWxJc092ZXJmbG93aW5nID8gdGhpcy5zY3JvbGxiYXJXaWR0aCA6ICcnLFxuICAgICAgcGFkZGluZ1JpZ2h0OiB0aGlzLmJvZHlJc092ZXJmbG93aW5nICYmICFtb2RhbElzT3ZlcmZsb3dpbmcgPyB0aGlzLnNjcm9sbGJhcldpZHRoIDogJydcbiAgICB9KVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnJlc2V0QWRqdXN0bWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy4kZWxlbWVudC5jc3Moe1xuICAgICAgcGFkZGluZ0xlZnQ6ICcnLFxuICAgICAgcGFkZGluZ1JpZ2h0OiAnJ1xuICAgIH0pXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZ1bGxXaW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgaWYgKCFmdWxsV2luZG93V2lkdGgpIHsgLy8gd29ya2Fyb3VuZCBmb3IgbWlzc2luZyB3aW5kb3cuaW5uZXJXaWR0aCBpbiBJRThcbiAgICAgIHZhciBkb2N1bWVudEVsZW1lbnRSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBmdWxsV2luZG93V2lkdGggPSBkb2N1bWVudEVsZW1lbnRSZWN0LnJpZ2h0IC0gTWF0aC5hYnMoZG9jdW1lbnRFbGVtZW50UmVjdC5sZWZ0KVxuICAgIH1cbiAgICB0aGlzLmJvZHlJc092ZXJmbG93aW5nID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IGZ1bGxXaW5kb3dXaWR0aFxuICAgIHRoaXMuc2Nyb2xsYmFyV2lkdGggPSB0aGlzLm1lYXN1cmVTY3JvbGxiYXIoKVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnNldFNjcm9sbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYm9keVBhZCA9IHBhcnNlSW50KCh0aGlzLiRib2R5LmNzcygncGFkZGluZy1yaWdodCcpIHx8IDApLCAxMClcbiAgICB0aGlzLm9yaWdpbmFsQm9keVBhZCA9IGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0IHx8ICcnXG4gICAgaWYgKHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcpIHRoaXMuJGJvZHkuY3NzKCdwYWRkaW5nLXJpZ2h0JywgYm9keVBhZCArIHRoaXMuc2Nyb2xsYmFyV2lkdGgpXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUucmVzZXRTY3JvbGxiYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy4kYm9keS5jc3MoJ3BhZGRpbmctcmlnaHQnLCB0aGlzLm9yaWdpbmFsQm9keVBhZClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5tZWFzdXJlU2Nyb2xsYmFyID0gZnVuY3Rpb24gKCkgeyAvLyB0aHggd2Fsc2hcbiAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gJ21vZGFsLXNjcm9sbGJhci1tZWFzdXJlJ1xuICAgIHRoaXMuJGJvZHkuYXBwZW5kKHNjcm9sbERpdilcbiAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYub2Zmc2V0V2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGhcbiAgICB0aGlzLiRib2R5WzBdLnJlbW92ZUNoaWxkKHNjcm9sbERpdilcbiAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGhcbiAgfVxuXG5cbiAgLy8gTU9EQUwgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uLCBfcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLm1vZGFsJylcbiAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIE1vZGFsLkRFRkFVTFRTLCAkdGhpcy5kYXRhKCksIHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uKVxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLm1vZGFsJywgKGRhdGEgPSBuZXcgTW9kYWwodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXShfcmVsYXRlZFRhcmdldClcbiAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2hvdykgZGF0YS5zaG93KF9yZWxhdGVkVGFyZ2V0KVxuICAgIH0pXG4gIH1cblxuICB2YXIgb2xkID0gJC5mbi5tb2RhbFxuXG4gICQuZm4ubW9kYWwgICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi5tb2RhbC5Db25zdHJ1Y3RvciA9IE1vZGFsXG5cblxuICAvLyBNT0RBTCBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PVxuXG4gICQuZm4ubW9kYWwubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLm1vZGFsID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG5cbiAgLy8gTU9EQUwgREFUQS1BUElcbiAgLy8gPT09PT09PT09PT09PT1cblxuICAkKGRvY3VtZW50KS5vbignY2xpY2suYnMubW9kYWwuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwibW9kYWxcIl0nLCBmdW5jdGlvbiAoZSkge1xuICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxuICAgIHZhciBocmVmICAgID0gJHRoaXMuYXR0cignaHJlZicpXG4gICAgdmFyICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykpKSAvLyBzdHJpcCBmb3IgaWU3XG4gICAgdmFyIG9wdGlvbiAgPSAkdGFyZ2V0LmRhdGEoJ2JzLm1vZGFsJykgPyAndG9nZ2xlJyA6ICQuZXh0ZW5kKHsgcmVtb3RlOiAhLyMvLnRlc3QoaHJlZikgJiYgaHJlZiB9LCAkdGFyZ2V0LmRhdGEoKSwgJHRoaXMuZGF0YSgpKVxuXG4gICAgaWYgKCR0aGlzLmlzKCdhJykpIGUucHJldmVudERlZmF1bHQoKVxuXG4gICAgJHRhcmdldC5vbmUoJ3Nob3cuYnMubW9kYWwnLCBmdW5jdGlvbiAoc2hvd0V2ZW50KSB7XG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm4gLy8gb25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgJHRhcmdldC5vbmUoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJHRoaXMuaXMoJzp2aXNpYmxlJykgJiYgJHRoaXMudHJpZ2dlcignZm9jdXMnKVxuICAgICAgfSlcbiAgICB9KVxuICAgIFBsdWdpbi5jYWxsKCR0YXJnZXQsIG9wdGlvbiwgdGhpcylcbiAgfSlcblxufShqUXVlcnkpO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogdG9vbHRpcC5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3Rvb2x0aXBcbiAqIEluc3BpcmVkIGJ5IHRoZSBvcmlnaW5hbCBqUXVlcnkudGlwc3kgYnkgSmFzb24gRnJhbWVcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBUT09MVElQIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlICAgICAgID0gbnVsbFxuICAgIHRoaXMub3B0aW9ucyAgICA9IG51bGxcbiAgICB0aGlzLmVuYWJsZWQgICAgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0ICAgID0gbnVsbFxuICAgIHRoaXMuaG92ZXJTdGF0ZSA9IG51bGxcbiAgICB0aGlzLiRlbGVtZW50ICAgPSBudWxsXG4gICAgdGhpcy5pblN0YXRlICAgID0gbnVsbFxuXG4gICAgdGhpcy5pbml0KCd0b29sdGlwJywgZWxlbWVudCwgb3B0aW9ucylcbiAgfVxuXG4gIFRvb2x0aXAuVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgVG9vbHRpcC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXG5cbiAgVG9vbHRpcC5ERUZBVUxUUyA9IHtcbiAgICBhbmltYXRpb246IHRydWUsXG4gICAgcGxhY2VtZW50OiAndG9wJyxcbiAgICBzZWxlY3RvcjogZmFsc2UsXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+PGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj48ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PjwvZGl2PicsXG4gICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcbiAgICB0aXRsZTogJycsXG4gICAgZGVsYXk6IDAsXG4gICAgaHRtbDogZmFsc2UsXG4gICAgY29udGFpbmVyOiBmYWxzZSxcbiAgICB2aWV3cG9ydDoge1xuICAgICAgc2VsZWN0b3I6ICdib2R5JyxcbiAgICAgIHBhZGRpbmc6IDBcbiAgICB9XG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKHR5cGUsIGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVuYWJsZWQgICA9IHRydWVcbiAgICB0aGlzLnR5cGUgICAgICA9IHR5cGVcbiAgICB0aGlzLiRlbGVtZW50ICA9ICQoZWxlbWVudClcbiAgICB0aGlzLm9wdGlvbnMgICA9IHRoaXMuZ2V0T3B0aW9ucyhvcHRpb25zKVxuICAgIHRoaXMuJHZpZXdwb3J0ID0gdGhpcy5vcHRpb25zLnZpZXdwb3J0ICYmICQoJC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy52aWV3cG9ydCkgPyB0aGlzLm9wdGlvbnMudmlld3BvcnQuY2FsbCh0aGlzLCB0aGlzLiRlbGVtZW50KSA6ICh0aGlzLm9wdGlvbnMudmlld3BvcnQuc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLnZpZXdwb3J0KSlcbiAgICB0aGlzLmluU3RhdGUgICA9IHsgY2xpY2s6IGZhbHNlLCBob3ZlcjogZmFsc2UsIGZvY3VzOiBmYWxzZSB9XG5cbiAgICBpZiAodGhpcy4kZWxlbWVudFswXSBpbnN0YW5jZW9mIGRvY3VtZW50LmNvbnN0cnVjdG9yICYmICF0aGlzLm9wdGlvbnMuc2VsZWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHNlbGVjdG9yYCBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBpbml0aWFsaXppbmcgJyArIHRoaXMudHlwZSArICcgb24gdGhlIHdpbmRvdy5kb2N1bWVudCBvYmplY3QhJylcbiAgICB9XG5cbiAgICB2YXIgdHJpZ2dlcnMgPSB0aGlzLm9wdGlvbnMudHJpZ2dlci5zcGxpdCgnICcpXG5cbiAgICBmb3IgKHZhciBpID0gdHJpZ2dlcnMubGVuZ3RoOyBpLS07KSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IHRyaWdnZXJzW2ldXG5cbiAgICAgIGlmICh0cmlnZ2VyID09ICdjbGljaycpIHtcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbignY2xpY2suJyArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCAkLnByb3h5KHRoaXMudG9nZ2xlLCB0aGlzKSlcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPSAnbWFudWFsJykge1xuICAgICAgICB2YXIgZXZlbnRJbiAgPSB0cmlnZ2VyID09ICdob3ZlcicgPyAnbW91c2VlbnRlcicgOiAnZm9jdXNpbidcbiAgICAgICAgdmFyIGV2ZW50T3V0ID0gdHJpZ2dlciA9PSAnaG92ZXInID8gJ21vdXNlbGVhdmUnIDogJ2ZvY3Vzb3V0J1xuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQub24oZXZlbnRJbiAgKyAnLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgJC5wcm94eSh0aGlzLmVudGVyLCB0aGlzKSlcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbihldmVudE91dCArICcuJyArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCAkLnByb3h5KHRoaXMubGVhdmUsIHRoaXMpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5zZWxlY3RvciA/XG4gICAgICAodGhpcy5fb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIHsgdHJpZ2dlcjogJ21hbnVhbCcsIHNlbGVjdG9yOiAnJyB9KSkgOlxuICAgICAgdGhpcy5maXhUaXRsZSgpXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXREZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVG9vbHRpcC5ERUZBVUxUU1xuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmdldERlZmF1bHRzKCksIHRoaXMuJGVsZW1lbnQuZGF0YSgpLCBvcHRpb25zKVxuXG4gICAgaWYgKG9wdGlvbnMuZGVsYXkgJiYgdHlwZW9mIG9wdGlvbnMuZGVsYXkgPT0gJ251bWJlcicpIHtcbiAgICAgIG9wdGlvbnMuZGVsYXkgPSB7XG4gICAgICAgIHNob3c6IG9wdGlvbnMuZGVsYXksXG4gICAgICAgIGhpZGU6IG9wdGlvbnMuZGVsYXlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uc1xuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0RGVsZWdhdGVPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvcHRpb25zICA9IHt9XG4gICAgdmFyIGRlZmF1bHRzID0gdGhpcy5nZXREZWZhdWx0cygpXG5cbiAgICB0aGlzLl9vcHRpb25zICYmICQuZWFjaCh0aGlzLl9vcHRpb25zLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT0gdmFsdWUpIG9wdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgfSlcblxuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5lbnRlciA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgc2VsZiA9IG9iaiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IgP1xuICAgICAgb2JqIDogJChvYmouY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSlcblxuICAgIGlmICghc2VsZikge1xuICAgICAgc2VsZiA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKG9iai5jdXJyZW50VGFyZ2V0LCB0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKVxuICAgICAgJChvYmouY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSwgc2VsZilcbiAgICB9XG5cbiAgICBpZiAob2JqIGluc3RhbmNlb2YgJC5FdmVudCkge1xuICAgICAgc2VsZi5pblN0YXRlW29iai50eXBlID09ICdmb2N1c2luJyA/ICdmb2N1cycgOiAnaG92ZXInXSA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAoc2VsZi50aXAoKS5oYXNDbGFzcygnaW4nKSB8fCBzZWxmLmhvdmVyU3RhdGUgPT0gJ2luJykge1xuICAgICAgc2VsZi5ob3ZlclN0YXRlID0gJ2luJ1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dClcblxuICAgIHNlbGYuaG92ZXJTdGF0ZSA9ICdpbidcblxuICAgIGlmICghc2VsZi5vcHRpb25zLmRlbGF5IHx8ICFzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdykgcmV0dXJuIHNlbGYuc2hvdygpXG5cbiAgICBzZWxmLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLmhvdmVyU3RhdGUgPT0gJ2luJykgc2VsZi5zaG93KClcbiAgICB9LCBzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdylcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmlzSW5TdGF0ZVRydWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaW5TdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuaW5TdGF0ZVtrZXldKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUubGVhdmUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIHNlbGYgPSBvYmogaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yID9cbiAgICAgIG9iaiA6ICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUpXG5cbiAgICBpZiAoIXNlbGYpIHtcbiAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihvYmouY3VycmVudFRhcmdldCwgdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSlcbiAgICAgICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUsIHNlbGYpXG4gICAgfVxuXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mICQuRXZlbnQpIHtcbiAgICAgIHNlbGYuaW5TdGF0ZVtvYmoudHlwZSA9PSAnZm9jdXNvdXQnID8gJ2ZvY3VzJyA6ICdob3ZlciddID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5pc0luU3RhdGVUcnVlKCkpIHJldHVyblxuXG4gICAgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dClcblxuICAgIHNlbGYuaG92ZXJTdGF0ZSA9ICdvdXQnXG5cbiAgICBpZiAoIXNlbGYub3B0aW9ucy5kZWxheSB8fCAhc2VsZi5vcHRpb25zLmRlbGF5LmhpZGUpIHJldHVybiBzZWxmLmhpZGUoKVxuXG4gICAgc2VsZi50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5ob3ZlclN0YXRlID09ICdvdXQnKSBzZWxmLmhpZGUoKVxuICAgIH0sIHNlbGYub3B0aW9ucy5kZWxheS5oaWRlKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZSA9ICQuRXZlbnQoJ3Nob3cuYnMuJyArIHRoaXMudHlwZSlcblxuICAgIGlmICh0aGlzLmhhc0NvbnRlbnQoKSAmJiB0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxuXG4gICAgICB2YXIgaW5Eb20gPSAkLmNvbnRhaW5zKHRoaXMuJGVsZW1lbnRbMF0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHRoaXMuJGVsZW1lbnRbMF0pXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCAhaW5Eb20pIHJldHVyblxuICAgICAgdmFyIHRoYXQgPSB0aGlzXG5cbiAgICAgIHZhciAkdGlwID0gdGhpcy50aXAoKVxuXG4gICAgICB2YXIgdGlwSWQgPSB0aGlzLmdldFVJRCh0aGlzLnR5cGUpXG5cbiAgICAgIHRoaXMuc2V0Q29udGVudCgpXG4gICAgICAkdGlwLmF0dHIoJ2lkJywgdGlwSWQpXG4gICAgICB0aGlzLiRlbGVtZW50LmF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXBJZClcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pICR0aXAuYWRkQ2xhc3MoJ2ZhZGUnKVxuXG4gICAgICB2YXIgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQgPT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLCAkdGlwWzBdLCB0aGlzLiRlbGVtZW50WzBdKSA6XG4gICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZW1lbnRcblxuICAgICAgdmFyIGF1dG9Ub2tlbiA9IC9cXHM/YXV0bz9cXHM/L2lcbiAgICAgIHZhciBhdXRvUGxhY2UgPSBhdXRvVG9rZW4udGVzdChwbGFjZW1lbnQpXG4gICAgICBpZiAoYXV0b1BsYWNlKSBwbGFjZW1lbnQgPSBwbGFjZW1lbnQucmVwbGFjZShhdXRvVG9rZW4sICcnKSB8fCAndG9wJ1xuXG4gICAgICAkdGlwXG4gICAgICAgIC5kZXRhY2goKVxuICAgICAgICAuY3NzKHsgdG9wOiAwLCBsZWZ0OiAwLCBkaXNwbGF5OiAnYmxvY2snIH0pXG4gICAgICAgIC5hZGRDbGFzcyhwbGFjZW1lbnQpXG4gICAgICAgIC5kYXRhKCdicy4nICsgdGhpcy50eXBlLCB0aGlzKVxuXG4gICAgICB0aGlzLm9wdGlvbnMuY29udGFpbmVyID8gJHRpcC5hcHBlbmRUbyh0aGlzLm9wdGlvbnMuY29udGFpbmVyKSA6ICR0aXAuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudClcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignaW5zZXJ0ZWQuYnMuJyArIHRoaXMudHlwZSlcblxuICAgICAgdmFyIHBvcyAgICAgICAgICA9IHRoaXMuZ2V0UG9zaXRpb24oKVxuICAgICAgdmFyIGFjdHVhbFdpZHRoICA9ICR0aXBbMF0ub2Zmc2V0V2lkdGhcbiAgICAgIHZhciBhY3R1YWxIZWlnaHQgPSAkdGlwWzBdLm9mZnNldEhlaWdodFxuXG4gICAgICBpZiAoYXV0b1BsYWNlKSB7XG4gICAgICAgIHZhciBvcmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRcbiAgICAgICAgdmFyIHZpZXdwb3J0RGltID0gdGhpcy5nZXRQb3NpdGlvbih0aGlzLiR2aWV3cG9ydClcblxuICAgICAgICBwbGFjZW1lbnQgPSBwbGFjZW1lbnQgPT0gJ2JvdHRvbScgJiYgcG9zLmJvdHRvbSArIGFjdHVhbEhlaWdodCA+IHZpZXdwb3J0RGltLmJvdHRvbSA/ICd0b3AnICAgIDpcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50ID09ICd0b3AnICAgICYmIHBvcy50b3AgICAgLSBhY3R1YWxIZWlnaHQgPCB2aWV3cG9ydERpbS50b3AgICAgPyAnYm90dG9tJyA6XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudCA9PSAncmlnaHQnICAmJiBwb3MucmlnaHQgICsgYWN0dWFsV2lkdGggID4gdmlld3BvcnREaW0ud2lkdGggID8gJ2xlZnQnICAgOlxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQgPT0gJ2xlZnQnICAgJiYgcG9zLmxlZnQgICAtIGFjdHVhbFdpZHRoICA8IHZpZXdwb3J0RGltLmxlZnQgICA/ICdyaWdodCcgIDpcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50XG5cbiAgICAgICAgJHRpcFxuICAgICAgICAgIC5yZW1vdmVDbGFzcyhvcmdQbGFjZW1lbnQpXG4gICAgICAgICAgLmFkZENsYXNzKHBsYWNlbWVudClcbiAgICAgIH1cblxuICAgICAgdmFyIGNhbGN1bGF0ZWRPZmZzZXQgPSB0aGlzLmdldENhbGN1bGF0ZWRPZmZzZXQocGxhY2VtZW50LCBwb3MsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpXG5cbiAgICAgIHRoaXMuYXBwbHlQbGFjZW1lbnQoY2FsY3VsYXRlZE9mZnNldCwgcGxhY2VtZW50KVxuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcmV2SG92ZXJTdGF0ZSA9IHRoYXQuaG92ZXJTdGF0ZVxuICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoJ3Nob3duLmJzLicgKyB0aGF0LnR5cGUpXG4gICAgICAgIHRoYXQuaG92ZXJTdGF0ZSA9IG51bGxcblxuICAgICAgICBpZiAocHJldkhvdmVyU3RhdGUgPT0gJ291dCcpIHRoYXQubGVhdmUodGhhdClcbiAgICAgIH1cblxuICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kdGlwLmhhc0NsYXNzKCdmYWRlJykgP1xuICAgICAgICAkdGlwXG4gICAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgY29tcGxldGUpXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRvb2x0aXAuVFJBTlNJVElPTl9EVVJBVElPTikgOlxuICAgICAgICBjb21wbGV0ZSgpXG4gICAgfVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuYXBwbHlQbGFjZW1lbnQgPSBmdW5jdGlvbiAob2Zmc2V0LCBwbGFjZW1lbnQpIHtcbiAgICB2YXIgJHRpcCAgID0gdGhpcy50aXAoKVxuICAgIHZhciB3aWR0aCAgPSAkdGlwWzBdLm9mZnNldFdpZHRoXG4gICAgdmFyIGhlaWdodCA9ICR0aXBbMF0ub2Zmc2V0SGVpZ2h0XG5cbiAgICAvLyBtYW51YWxseSByZWFkIG1hcmdpbnMgYmVjYXVzZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaW5jbHVkZXMgZGlmZmVyZW5jZVxuICAgIHZhciBtYXJnaW5Ub3AgPSBwYXJzZUludCgkdGlwLmNzcygnbWFyZ2luLXRvcCcpLCAxMClcbiAgICB2YXIgbWFyZ2luTGVmdCA9IHBhcnNlSW50KCR0aXAuY3NzKCdtYXJnaW4tbGVmdCcpLCAxMClcblxuICAgIC8vIHdlIG11c3QgY2hlY2sgZm9yIE5hTiBmb3IgaWUgOC85XG4gICAgaWYgKGlzTmFOKG1hcmdpblRvcCkpICBtYXJnaW5Ub3AgID0gMFxuICAgIGlmIChpc05hTihtYXJnaW5MZWZ0KSkgbWFyZ2luTGVmdCA9IDBcblxuICAgIG9mZnNldC50b3AgICs9IG1hcmdpblRvcFxuICAgIG9mZnNldC5sZWZ0ICs9IG1hcmdpbkxlZnRcblxuICAgIC8vICQuZm4ub2Zmc2V0IGRvZXNuJ3Qgcm91bmQgcGl4ZWwgdmFsdWVzXG4gICAgLy8gc28gd2UgdXNlIHNldE9mZnNldCBkaXJlY3RseSB3aXRoIG91ciBvd24gZnVuY3Rpb24gQi0wXG4gICAgJC5vZmZzZXQuc2V0T2Zmc2V0KCR0aXBbMF0sICQuZXh0ZW5kKHtcbiAgICAgIHVzaW5nOiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgJHRpcC5jc3Moe1xuICAgICAgICAgIHRvcDogTWF0aC5yb3VuZChwcm9wcy50b3ApLFxuICAgICAgICAgIGxlZnQ6IE1hdGgucm91bmQocHJvcHMubGVmdClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LCBvZmZzZXQpLCAwKVxuXG4gICAgJHRpcC5hZGRDbGFzcygnaW4nKVxuXG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIHBsYWNpbmcgdGlwIGluIG5ldyBvZmZzZXQgY2F1c2VkIHRoZSB0aXAgdG8gcmVzaXplIGl0c2VsZlxuICAgIHZhciBhY3R1YWxXaWR0aCAgPSAkdGlwWzBdLm9mZnNldFdpZHRoXG4gICAgdmFyIGFjdHVhbEhlaWdodCA9ICR0aXBbMF0ub2Zmc2V0SGVpZ2h0XG5cbiAgICBpZiAocGxhY2VtZW50ID09ICd0b3AnICYmIGFjdHVhbEhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgIG9mZnNldC50b3AgPSBvZmZzZXQudG9wICsgaGVpZ2h0IC0gYWN0dWFsSGVpZ2h0XG4gICAgfVxuXG4gICAgdmFyIGRlbHRhID0gdGhpcy5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEocGxhY2VtZW50LCBvZmZzZXQsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpXG5cbiAgICBpZiAoZGVsdGEubGVmdCkgb2Zmc2V0LmxlZnQgKz0gZGVsdGEubGVmdFxuICAgIGVsc2Ugb2Zmc2V0LnRvcCArPSBkZWx0YS50b3BcblxuICAgIHZhciBpc1ZlcnRpY2FsICAgICAgICAgID0gL3RvcHxib3R0b20vLnRlc3QocGxhY2VtZW50KVxuICAgIHZhciBhcnJvd0RlbHRhICAgICAgICAgID0gaXNWZXJ0aWNhbCA/IGRlbHRhLmxlZnQgKiAyIC0gd2lkdGggKyBhY3R1YWxXaWR0aCA6IGRlbHRhLnRvcCAqIDIgLSBoZWlnaHQgKyBhY3R1YWxIZWlnaHRcbiAgICB2YXIgYXJyb3dPZmZzZXRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyAnb2Zmc2V0V2lkdGgnIDogJ29mZnNldEhlaWdodCdcblxuICAgICR0aXAub2Zmc2V0KG9mZnNldClcbiAgICB0aGlzLnJlcGxhY2VBcnJvdyhhcnJvd0RlbHRhLCAkdGlwWzBdW2Fycm93T2Zmc2V0UG9zaXRpb25dLCBpc1ZlcnRpY2FsKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUucmVwbGFjZUFycm93ID0gZnVuY3Rpb24gKGRlbHRhLCBkaW1lbnNpb24sIGlzVmVydGljYWwpIHtcbiAgICB0aGlzLmFycm93KClcbiAgICAgIC5jc3MoaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnLCA1MCAqICgxIC0gZGVsdGEgLyBkaW1lbnNpb24pICsgJyUnKVxuICAgICAgLmNzcyhpc1ZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCcsICcnKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuc2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHRpcCAgPSB0aGlzLnRpcCgpXG4gICAgdmFyIHRpdGxlID0gdGhpcy5nZXRUaXRsZSgpXG5cbiAgICAkdGlwLmZpbmQoJy50b29sdGlwLWlubmVyJylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAndGV4dCddKHRpdGxlKVxuICAgICR0aXAucmVtb3ZlQ2xhc3MoJ2ZhZGUgaW4gdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0JylcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICB2YXIgJHRpcCA9ICQodGhpcy4kdGlwKVxuICAgIHZhciBlICAgID0gJC5FdmVudCgnaGlkZS5icy4nICsgdGhpcy50eXBlKVxuXG4gICAgZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICBpZiAodGhhdC5ob3ZlclN0YXRlICE9ICdpbicpICR0aXAuZGV0YWNoKClcbiAgICAgIGlmICh0aGF0LiRlbGVtZW50KSB7IC8vIFRPRE86IENoZWNrIHdoZXRoZXIgZ3VhcmRpbmcgdGhpcyBjb2RlIHdpdGggdGhpcyBgaWZgIGlzIHJlYWxseSBuZWNlc3NhcnkuXG4gICAgICAgIHRoYXQuJGVsZW1lbnRcbiAgICAgICAgICAucmVtb3ZlQXR0cignYXJpYS1kZXNjcmliZWRieScpXG4gICAgICAgICAgLnRyaWdnZXIoJ2hpZGRlbi5icy4nICsgdGhhdC50eXBlKVxuICAgICAgfVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxuXG4gICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgJHRpcC5yZW1vdmVDbGFzcygnaW4nKVxuXG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgJHRpcC5oYXNDbGFzcygnZmFkZScpID9cbiAgICAgICR0aXBcbiAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgY29tcGxldGUpXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChUb29sdGlwLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgIGNvbXBsZXRlKClcblxuICAgIHRoaXMuaG92ZXJTdGF0ZSA9IG51bGxcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5maXhUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJGUgPSB0aGlzLiRlbGVtZW50XG4gICAgaWYgKCRlLmF0dHIoJ3RpdGxlJykgfHwgdHlwZW9mICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKSAhPSAnc3RyaW5nJykge1xuICAgICAgJGUuYXR0cignZGF0YS1vcmlnaW5hbC10aXRsZScsICRlLmF0dHIoJ3RpdGxlJykgfHwgJycpLmF0dHIoJ3RpdGxlJywgJycpXG4gICAgfVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuaGFzQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgkZWxlbWVudCkge1xuICAgICRlbGVtZW50ICAgPSAkZWxlbWVudCB8fCB0aGlzLiRlbGVtZW50XG5cbiAgICB2YXIgZWwgICAgID0gJGVsZW1lbnRbMF1cbiAgICB2YXIgaXNCb2R5ID0gZWwudGFnTmFtZSA9PSAnQk9EWSdcblxuICAgIHZhciBlbFJlY3QgICAgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGlmIChlbFJlY3Qud2lkdGggPT0gbnVsbCkge1xuICAgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgbWlzc2luZyBpbiBJRTgsIHNvIGNvbXB1dGUgdGhlbSBtYW51YWxseTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTQwOTNcbiAgICAgIGVsUmVjdCA9ICQuZXh0ZW5kKHt9LCBlbFJlY3QsIHsgd2lkdGg6IGVsUmVjdC5yaWdodCAtIGVsUmVjdC5sZWZ0LCBoZWlnaHQ6IGVsUmVjdC5ib3R0b20gLSBlbFJlY3QudG9wIH0pXG4gICAgfVxuICAgIHZhciBpc1N2ZyA9IHdpbmRvdy5TVkdFbGVtZW50ICYmIGVsIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnRcbiAgICAvLyBBdm9pZCB1c2luZyAkLm9mZnNldCgpIG9uIFNWR3Mgc2luY2UgaXQgZ2l2ZXMgaW5jb3JyZWN0IHJlc3VsdHMgaW4galF1ZXJ5IDMuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMjAyODBcbiAgICB2YXIgZWxPZmZzZXQgID0gaXNCb2R5ID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IChpc1N2ZyA/IG51bGwgOiAkZWxlbWVudC5vZmZzZXQoKSlcbiAgICB2YXIgc2Nyb2xsICAgID0geyBzY3JvbGw6IGlzQm9keSA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgOiAkZWxlbWVudC5zY3JvbGxUb3AoKSB9XG4gICAgdmFyIG91dGVyRGltcyA9IGlzQm9keSA/IHsgd2lkdGg6ICQod2luZG93KS53aWR0aCgpLCBoZWlnaHQ6ICQod2luZG93KS5oZWlnaHQoKSB9IDogbnVsbFxuXG4gICAgcmV0dXJuICQuZXh0ZW5kKHt9LCBlbFJlY3QsIHNjcm9sbCwgb3V0ZXJEaW1zLCBlbE9mZnNldClcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldENhbGN1bGF0ZWRPZmZzZXQgPSBmdW5jdGlvbiAocGxhY2VtZW50LCBwb3MsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpIHtcbiAgICByZXR1cm4gcGxhY2VtZW50ID09ICdib3R0b20nID8geyB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0LCAgIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRoIC8gMiAtIGFjdHVhbFdpZHRoIC8gMiB9IDpcbiAgICAgICAgICAgcGxhY2VtZW50ID09ICd0b3AnICAgID8geyB0b3A6IHBvcy50b3AgLSBhY3R1YWxIZWlnaHQsIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRoIC8gMiAtIGFjdHVhbFdpZHRoIC8gMiB9IDpcbiAgICAgICAgICAgcGxhY2VtZW50ID09ICdsZWZ0JyAgID8geyB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0IC8gMiAtIGFjdHVhbEhlaWdodCAvIDIsIGxlZnQ6IHBvcy5sZWZ0IC0gYWN0dWFsV2lkdGggfSA6XG4gICAgICAgIC8qIHBsYWNlbWVudCA9PSAncmlnaHQnICovIHsgdG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCAvIDIgLSBhY3R1YWxIZWlnaHQgLyAyLCBsZWZ0OiBwb3MubGVmdCArIHBvcy53aWR0aCB9XG5cbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldFZpZXdwb3J0QWRqdXN0ZWREZWx0YSA9IGZ1bmN0aW9uIChwbGFjZW1lbnQsIHBvcywgYWN0dWFsV2lkdGgsIGFjdHVhbEhlaWdodCkge1xuICAgIHZhciBkZWx0YSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH1cbiAgICBpZiAoIXRoaXMuJHZpZXdwb3J0KSByZXR1cm4gZGVsdGFcblxuICAgIHZhciB2aWV3cG9ydFBhZGRpbmcgPSB0aGlzLm9wdGlvbnMudmlld3BvcnQgJiYgdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmcgfHwgMFxuICAgIHZhciB2aWV3cG9ydERpbWVuc2lvbnMgPSB0aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KVxuXG4gICAgaWYgKC9yaWdodHxsZWZ0Ly50ZXN0KHBsYWNlbWVudCkpIHtcbiAgICAgIHZhciB0b3BFZGdlT2Zmc2V0ICAgID0gcG9zLnRvcCAtIHZpZXdwb3J0UGFkZGluZyAtIHZpZXdwb3J0RGltZW5zaW9ucy5zY3JvbGxcbiAgICAgIHZhciBib3R0b21FZGdlT2Zmc2V0ID0gcG9zLnRvcCArIHZpZXdwb3J0UGFkZGluZyAtIHZpZXdwb3J0RGltZW5zaW9ucy5zY3JvbGwgKyBhY3R1YWxIZWlnaHRcbiAgICAgIGlmICh0b3BFZGdlT2Zmc2V0IDwgdmlld3BvcnREaW1lbnNpb25zLnRvcCkgeyAvLyB0b3Agb3ZlcmZsb3dcbiAgICAgICAgZGVsdGEudG9wID0gdmlld3BvcnREaW1lbnNpb25zLnRvcCAtIHRvcEVkZ2VPZmZzZXRcbiAgICAgIH0gZWxzZSBpZiAoYm90dG9tRWRnZU9mZnNldCA+IHZpZXdwb3J0RGltZW5zaW9ucy50b3AgKyB2aWV3cG9ydERpbWVuc2lvbnMuaGVpZ2h0KSB7IC8vIGJvdHRvbSBvdmVyZmxvd1xuICAgICAgICBkZWx0YS50b3AgPSB2aWV3cG9ydERpbWVuc2lvbnMudG9wICsgdmlld3BvcnREaW1lbnNpb25zLmhlaWdodCAtIGJvdHRvbUVkZ2VPZmZzZXRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGxlZnRFZGdlT2Zmc2V0ICA9IHBvcy5sZWZ0IC0gdmlld3BvcnRQYWRkaW5nXG4gICAgICB2YXIgcmlnaHRFZGdlT2Zmc2V0ID0gcG9zLmxlZnQgKyB2aWV3cG9ydFBhZGRpbmcgKyBhY3R1YWxXaWR0aFxuICAgICAgaWYgKGxlZnRFZGdlT2Zmc2V0IDwgdmlld3BvcnREaW1lbnNpb25zLmxlZnQpIHsgLy8gbGVmdCBvdmVyZmxvd1xuICAgICAgICBkZWx0YS5sZWZ0ID0gdmlld3BvcnREaW1lbnNpb25zLmxlZnQgLSBsZWZ0RWRnZU9mZnNldFxuICAgICAgfSBlbHNlIGlmIChyaWdodEVkZ2VPZmZzZXQgPiB2aWV3cG9ydERpbWVuc2lvbnMucmlnaHQpIHsgLy8gcmlnaHQgb3ZlcmZsb3dcbiAgICAgICAgZGVsdGEubGVmdCA9IHZpZXdwb3J0RGltZW5zaW9ucy5sZWZ0ICsgdmlld3BvcnREaW1lbnNpb25zLndpZHRoIC0gcmlnaHRFZGdlT2Zmc2V0XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbHRhXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGl0bGVcbiAgICB2YXIgJGUgPSB0aGlzLiRlbGVtZW50XG4gICAgdmFyIG8gID0gdGhpcy5vcHRpb25zXG5cbiAgICB0aXRsZSA9ICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKVxuICAgICAgfHwgKHR5cGVvZiBvLnRpdGxlID09ICdmdW5jdGlvbicgPyBvLnRpdGxlLmNhbGwoJGVbMF0pIDogIG8udGl0bGUpXG5cbiAgICByZXR1cm4gdGl0bGVcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldFVJRCA9IGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBkbyBwcmVmaXggKz0gfn4oTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApXG4gICAgd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpXG4gICAgcmV0dXJuIHByZWZpeFxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUudGlwID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy4kdGlwKSB7XG4gICAgICB0aGlzLiR0aXAgPSAkKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSlcbiAgICAgIGlmICh0aGlzLiR0aXAubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSArICcgYHRlbXBsYXRlYCBvcHRpb24gbXVzdCBjb25zaXN0IG9mIGV4YWN0bHkgMSB0b3AtbGV2ZWwgZWxlbWVudCEnKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy4kdGlwXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5hcnJvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMuJGFycm93ID0gdGhpcy4kYXJyb3cgfHwgdGhpcy50aXAoKS5maW5kKCcudG9vbHRpcC1hcnJvdycpKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbmFibGVkID0gIXRoaXMuZW5hYmxlZFxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICBpZiAoZSkge1xuICAgICAgc2VsZiA9ICQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCdicy4nICsgdGhpcy50eXBlKVxuICAgICAgaWYgKCFzZWxmKSB7XG4gICAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihlLmN1cnJlbnRUYXJnZXQsIHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpXG4gICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCdicy4nICsgdGhpcy50eXBlLCBzZWxmKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlKSB7XG4gICAgICBzZWxmLmluU3RhdGUuY2xpY2sgPSAhc2VsZi5pblN0YXRlLmNsaWNrXG4gICAgICBpZiAoc2VsZi5pc0luU3RhdGVUcnVlKCkpIHNlbGYuZW50ZXIoc2VsZilcbiAgICAgIGVsc2Ugc2VsZi5sZWF2ZShzZWxmKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnRpcCgpLmhhc0NsYXNzKCdpbicpID8gc2VsZi5sZWF2ZShzZWxmKSA6IHNlbGYuZW50ZXIoc2VsZilcbiAgICB9XG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXG4gICAgdGhpcy5oaWRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoYXQuJGVsZW1lbnQub2ZmKCcuJyArIHRoYXQudHlwZSkucmVtb3ZlRGF0YSgnYnMuJyArIHRoYXQudHlwZSlcbiAgICAgIGlmICh0aGF0LiR0aXApIHtcbiAgICAgICAgdGhhdC4kdGlwLmRldGFjaCgpXG4gICAgICB9XG4gICAgICB0aGF0LiR0aXAgPSBudWxsXG4gICAgICB0aGF0LiRhcnJvdyA9IG51bGxcbiAgICAgIHRoYXQuJHZpZXdwb3J0ID0gbnVsbFxuICAgICAgdGhhdC4kZWxlbWVudCA9IG51bGxcbiAgICB9KVxuICB9XG5cblxuICAvLyBUT09MVElQIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMudG9vbHRpcCcpXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXG5cbiAgICAgIGlmICghZGF0YSAmJiAvZGVzdHJveXxoaWRlLy50ZXN0KG9wdGlvbikpIHJldHVyblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy50b29sdGlwJywgKGRhdGEgPSBuZXcgVG9vbHRpcCh0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4udG9vbHRpcFxuXG4gICQuZm4udG9vbHRpcCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLnRvb2x0aXAuQ29uc3RydWN0b3IgPSBUb29sdGlwXG5cblxuICAvLyBUT09MVElQIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLnRvb2x0aXAubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLnRvb2x0aXAgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbn0oalF1ZXJ5KTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IHBvcG92ZXIuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNwb3BvdmVyc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFBPUE9WRVIgUFVCTElDIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmluaXQoJ3BvcG92ZXInLCBlbGVtZW50LCBvcHRpb25zKVxuICB9XG5cbiAgaWYgKCEkLmZuLnRvb2x0aXApIHRocm93IG5ldyBFcnJvcignUG9wb3ZlciByZXF1aXJlcyB0b29sdGlwLmpzJylcblxuICBQb3BvdmVyLlZFUlNJT04gID0gJzMuMy43J1xuXG4gIFBvcG92ZXIuREVGQVVMVFMgPSAkLmV4dGVuZCh7fSwgJC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLkRFRkFVTFRTLCB7XG4gICAgcGxhY2VtZW50OiAncmlnaHQnLFxuICAgIHRyaWdnZXI6ICdjbGljaycsXG4gICAgY29udGVudDogJycsXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+PGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+PGgzIGNsYXNzPVwicG9wb3Zlci10aXRsZVwiPjwvaDM+PGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPjwvZGl2PjwvZGl2PidcbiAgfSlcblxuXG4gIC8vIE5PVEU6IFBPUE9WRVIgRVhURU5EUyB0b29sdGlwLmpzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgUG9wb3Zlci5wcm90b3R5cGUgPSAkLmV4dGVuZCh7fSwgJC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSlcblxuICBQb3BvdmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvcG92ZXJcblxuICBQb3BvdmVyLnByb3RvdHlwZS5nZXREZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUG9wb3Zlci5ERUZBVUxUU1xuICB9XG5cbiAgUG9wb3Zlci5wcm90b3R5cGUuc2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHRpcCAgICA9IHRoaXMudGlwKClcbiAgICB2YXIgdGl0bGUgICA9IHRoaXMuZ2V0VGl0bGUoKVxuICAgIHZhciBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50KClcblxuICAgICR0aXAuZmluZCgnLnBvcG92ZXItdGl0bGUnKVt0aGlzLm9wdGlvbnMuaHRtbCA/ICdodG1sJyA6ICd0ZXh0J10odGl0bGUpXG4gICAgJHRpcC5maW5kKCcucG9wb3Zlci1jb250ZW50JykuY2hpbGRyZW4oKS5kZXRhY2goKS5lbmQoKVsgLy8gd2UgdXNlIGFwcGVuZCBmb3IgaHRtbCBvYmplY3RzIHRvIG1haW50YWluIGpzIGV2ZW50c1xuICAgICAgdGhpcy5vcHRpb25zLmh0bWwgPyAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycgPyAnaHRtbCcgOiAnYXBwZW5kJykgOiAndGV4dCdcbiAgICBdKGNvbnRlbnQpXG5cbiAgICAkdGlwLnJlbW92ZUNsYXNzKCdmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbicpXG5cbiAgICAvLyBJRTggZG9lc24ndCBhY2NlcHQgaGlkaW5nIHZpYSB0aGUgYDplbXB0eWAgcHNldWRvIHNlbGVjdG9yLCB3ZSBoYXZlIHRvIGRvXG4gICAgLy8gdGhpcyBtYW51YWxseSBieSBjaGVja2luZyB0aGUgY29udGVudHMuXG4gICAgaWYgKCEkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJykuaHRtbCgpKSAkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJykuaGlkZSgpXG4gIH1cblxuICBQb3BvdmVyLnByb3RvdHlwZS5oYXNDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5nZXRDb250ZW50KClcbiAgfVxuXG4gIFBvcG92ZXIucHJvdG90eXBlLmdldENvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRlID0gdGhpcy4kZWxlbWVudFxuICAgIHZhciBvICA9IHRoaXMub3B0aW9uc1xuXG4gICAgcmV0dXJuICRlLmF0dHIoJ2RhdGEtY29udGVudCcpXG4gICAgICB8fCAodHlwZW9mIG8uY29udGVudCA9PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgIG8uY29udGVudC5jYWxsKCRlWzBdKSA6XG4gICAgICAgICAgICBvLmNvbnRlbnQpXG4gIH1cblxuICBQb3BvdmVyLnByb3RvdHlwZS5hcnJvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMuJGFycm93ID0gdGhpcy4kYXJyb3cgfHwgdGhpcy50aXAoKS5maW5kKCcuYXJyb3cnKSlcbiAgfVxuXG5cbiAgLy8gUE9QT1ZFUiBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLnBvcG92ZXInKVxuICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxuXG4gICAgICBpZiAoIWRhdGEgJiYgL2Rlc3Ryb3l8aGlkZS8udGVzdChvcHRpb24pKSByZXR1cm5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMucG9wb3ZlcicsIChkYXRhID0gbmV3IFBvcG92ZXIodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLnBvcG92ZXJcblxuICAkLmZuLnBvcG92ZXIgICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi5wb3BvdmVyLkNvbnN0cnVjdG9yID0gUG9wb3ZlclxuXG5cbiAgLy8gUE9QT1ZFUiBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5wb3BvdmVyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5wb3BvdmVyID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG59KGpRdWVyeSk7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBzY3JvbGxzcHkuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNzY3JvbGxzcHlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBTQ1JPTExTUFkgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFNjcm9sbFNweShlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kYm9keSAgICAgICAgICA9ICQoZG9jdW1lbnQuYm9keSlcbiAgICB0aGlzLiRzY3JvbGxFbGVtZW50ID0gJChlbGVtZW50KS5pcyhkb2N1bWVudC5ib2R5KSA/ICQod2luZG93KSA6ICQoZWxlbWVudClcbiAgICB0aGlzLm9wdGlvbnMgICAgICAgID0gJC5leHRlbmQoe30sIFNjcm9sbFNweS5ERUZBVUxUUywgb3B0aW9ucylcbiAgICB0aGlzLnNlbGVjdG9yICAgICAgID0gKHRoaXMub3B0aW9ucy50YXJnZXQgfHwgJycpICsgJyAubmF2IGxpID4gYSdcbiAgICB0aGlzLm9mZnNldHMgICAgICAgID0gW11cbiAgICB0aGlzLnRhcmdldHMgICAgICAgID0gW11cbiAgICB0aGlzLmFjdGl2ZVRhcmdldCAgID0gbnVsbFxuICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ICAgPSAwXG5cbiAgICB0aGlzLiRzY3JvbGxFbGVtZW50Lm9uKCdzY3JvbGwuYnMuc2Nyb2xsc3B5JywgJC5wcm94eSh0aGlzLnByb2Nlc3MsIHRoaXMpKVxuICAgIHRoaXMucmVmcmVzaCgpXG4gICAgdGhpcy5wcm9jZXNzKClcbiAgfVxuXG4gIFNjcm9sbFNweS5WRVJTSU9OICA9ICczLjMuNydcblxuICBTY3JvbGxTcHkuREVGQVVMVFMgPSB7XG4gICAgb2Zmc2V0OiAxMFxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuJHNjcm9sbEVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0IHx8IE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KVxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGF0ICAgICAgICAgID0gdGhpc1xuICAgIHZhciBvZmZzZXRNZXRob2QgID0gJ29mZnNldCdcbiAgICB2YXIgb2Zmc2V0QmFzZSAgICA9IDBcblxuICAgIHRoaXMub2Zmc2V0cyAgICAgID0gW11cbiAgICB0aGlzLnRhcmdldHMgICAgICA9IFtdXG4gICAgdGhpcy5zY3JvbGxIZWlnaHQgPSB0aGlzLmdldFNjcm9sbEhlaWdodCgpXG5cbiAgICBpZiAoISQuaXNXaW5kb3codGhpcy4kc2Nyb2xsRWxlbWVudFswXSkpIHtcbiAgICAgIG9mZnNldE1ldGhvZCA9ICdwb3NpdGlvbidcbiAgICAgIG9mZnNldEJhc2UgICA9IHRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKClcbiAgICB9XG5cbiAgICB0aGlzLiRib2R5XG4gICAgICAuZmluZCh0aGlzLnNlbGVjdG9yKVxuICAgICAgLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWwgICA9ICQodGhpcylcbiAgICAgICAgdmFyIGhyZWYgID0gJGVsLmRhdGEoJ3RhcmdldCcpIHx8ICRlbC5hdHRyKCdocmVmJylcbiAgICAgICAgdmFyICRocmVmID0gL14jLi8udGVzdChocmVmKSAmJiAkKGhyZWYpXG5cbiAgICAgICAgcmV0dXJuICgkaHJlZlxuICAgICAgICAgICYmICRocmVmLmxlbmd0aFxuICAgICAgICAgICYmICRocmVmLmlzKCc6dmlzaWJsZScpXG4gICAgICAgICAgJiYgW1skaHJlZltvZmZzZXRNZXRob2RdKCkudG9wICsgb2Zmc2V0QmFzZSwgaHJlZl1dKSB8fCBudWxsXG4gICAgICB9KVxuICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGFbMF0gLSBiWzBdIH0pXG4gICAgICAuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoYXQub2Zmc2V0cy5wdXNoKHRoaXNbMF0pXG4gICAgICAgIHRoYXQudGFyZ2V0cy5wdXNoKHRoaXNbMV0pXG4gICAgICB9KVxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzY3JvbGxUb3AgICAgPSB0aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpICsgdGhpcy5vcHRpb25zLm9mZnNldFxuICAgIHZhciBzY3JvbGxIZWlnaHQgPSB0aGlzLmdldFNjcm9sbEhlaWdodCgpXG4gICAgdmFyIG1heFNjcm9sbCAgICA9IHRoaXMub3B0aW9ucy5vZmZzZXQgKyBzY3JvbGxIZWlnaHQgLSB0aGlzLiRzY3JvbGxFbGVtZW50LmhlaWdodCgpXG4gICAgdmFyIG9mZnNldHMgICAgICA9IHRoaXMub2Zmc2V0c1xuICAgIHZhciB0YXJnZXRzICAgICAgPSB0aGlzLnRhcmdldHNcbiAgICB2YXIgYWN0aXZlVGFyZ2V0ID0gdGhpcy5hY3RpdmVUYXJnZXRcbiAgICB2YXIgaVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsSGVpZ2h0ICE9IHNjcm9sbEhlaWdodCkge1xuICAgICAgdGhpcy5yZWZyZXNoKClcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG9wID49IG1heFNjcm9sbCkge1xuICAgICAgcmV0dXJuIGFjdGl2ZVRhcmdldCAhPSAoaSA9IHRhcmdldHNbdGFyZ2V0cy5sZW5ndGggLSAxXSkgJiYgdGhpcy5hY3RpdmF0ZShpKVxuICAgIH1cblxuICAgIGlmIChhY3RpdmVUYXJnZXQgJiYgc2Nyb2xsVG9wIDwgb2Zmc2V0c1swXSkge1xuICAgICAgdGhpcy5hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgICByZXR1cm4gdGhpcy5jbGVhcigpXG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0cy5sZW5ndGg7IGktLTspIHtcbiAgICAgIGFjdGl2ZVRhcmdldCAhPSB0YXJnZXRzW2ldXG4gICAgICAgICYmIHNjcm9sbFRvcCA+PSBvZmZzZXRzW2ldXG4gICAgICAgICYmIChvZmZzZXRzW2kgKyAxXSA9PT0gdW5kZWZpbmVkIHx8IHNjcm9sbFRvcCA8IG9mZnNldHNbaSArIDFdKVxuICAgICAgICAmJiB0aGlzLmFjdGl2YXRlKHRhcmdldHNbaV0pXG4gICAgfVxuICB9XG5cbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB0aGlzLmFjdGl2ZVRhcmdldCA9IHRhcmdldFxuXG4gICAgdGhpcy5jbGVhcigpXG5cbiAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICtcbiAgICAgICdbZGF0YS10YXJnZXQ9XCInICsgdGFyZ2V0ICsgJ1wiXSwnICtcbiAgICAgIHRoaXMuc2VsZWN0b3IgKyAnW2hyZWY9XCInICsgdGFyZ2V0ICsgJ1wiXSdcblxuICAgIHZhciBhY3RpdmUgPSAkKHNlbGVjdG9yKVxuICAgICAgLnBhcmVudHMoJ2xpJylcbiAgICAgIC5hZGRDbGFzcygnYWN0aXZlJylcblxuICAgIGlmIChhY3RpdmUucGFyZW50KCcuZHJvcGRvd24tbWVudScpLmxlbmd0aCkge1xuICAgICAgYWN0aXZlID0gYWN0aXZlXG4gICAgICAgIC5jbG9zZXN0KCdsaS5kcm9wZG93bicpXG4gICAgICAgIC5hZGRDbGFzcygnYWN0aXZlJylcbiAgICB9XG5cbiAgICBhY3RpdmUudHJpZ2dlcignYWN0aXZhdGUuYnMuc2Nyb2xsc3B5JylcbiAgfVxuXG4gIFNjcm9sbFNweS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgJCh0aGlzLnNlbGVjdG9yKVxuICAgICAgLnBhcmVudHNVbnRpbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCAnLmFjdGl2ZScpXG4gICAgICAucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gIH1cblxuXG4gIC8vIFNDUk9MTFNQWSBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMuc2Nyb2xsc3B5JylcbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5zY3JvbGxzcHknLCAoZGF0YSA9IG5ldyBTY3JvbGxTcHkodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLnNjcm9sbHNweVxuXG4gICQuZm4uc2Nyb2xsc3B5ICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yID0gU2Nyb2xsU3B5XG5cblxuICAvLyBTQ1JPTExTUFkgTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5zY3JvbGxzcHkubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLnNjcm9sbHNweSA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIFNDUk9MTFNQWSBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PT09PT1cblxuICAkKHdpbmRvdykub24oJ2xvYWQuYnMuc2Nyb2xsc3B5LmRhdGEtYXBpJywgZnVuY3Rpb24gKCkge1xuICAgICQoJ1tkYXRhLXNweT1cInNjcm9sbFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRzcHkgPSAkKHRoaXMpXG4gICAgICBQbHVnaW4uY2FsbCgkc3B5LCAkc3B5LmRhdGEoKSlcbiAgICB9KVxuICB9KVxuXG59KGpRdWVyeSk7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiB0YWIuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyN0YWJzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gVEFCIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgVGFiID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAvLyBqc2NzOmRpc2FibGUgcmVxdWlyZURvbGxhckJlZm9yZWpRdWVyeUFzc2lnbm1lbnRcbiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpXG4gICAgLy8ganNjczplbmFibGUgcmVxdWlyZURvbGxhckJlZm9yZWpRdWVyeUFzc2lnbm1lbnRcbiAgfVxuXG4gIFRhYi5WRVJTSU9OID0gJzMuMy43J1xuXG4gIFRhYi5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXG5cbiAgVGFiLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciAkdGhpcyAgICA9IHRoaXMuZWxlbWVudFxuICAgIHZhciAkdWwgICAgICA9ICR0aGlzLmNsb3Nlc3QoJ3VsOm5vdCguZHJvcGRvd24tbWVudSknKVxuICAgIHZhciBzZWxlY3RvciA9ICR0aGlzLmRhdGEoJ3RhcmdldCcpXG5cbiAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2hyZWYnKVxuICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvciAmJiBzZWxlY3Rvci5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLCAnJykgLy8gc3RyaXAgZm9yIGllN1xuICAgIH1cblxuICAgIGlmICgkdGhpcy5wYXJlbnQoJ2xpJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSByZXR1cm5cblxuICAgIHZhciAkcHJldmlvdXMgPSAkdWwuZmluZCgnLmFjdGl2ZTpsYXN0IGEnKVxuICAgIHZhciBoaWRlRXZlbnQgPSAkLkV2ZW50KCdoaWRlLmJzLnRhYicsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6ICR0aGlzWzBdXG4gICAgfSlcbiAgICB2YXIgc2hvd0V2ZW50ID0gJC5FdmVudCgnc2hvdy5icy50YWInLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiAkcHJldmlvdXNbMF1cbiAgICB9KVxuXG4gICAgJHByZXZpb3VzLnRyaWdnZXIoaGlkZUV2ZW50KVxuICAgICR0aGlzLnRyaWdnZXIoc2hvd0V2ZW50KVxuXG4gICAgaWYgKHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCBoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgdmFyICR0YXJnZXQgPSAkKHNlbGVjdG9yKVxuXG4gICAgdGhpcy5hY3RpdmF0ZSgkdGhpcy5jbG9zZXN0KCdsaScpLCAkdWwpXG4gICAgdGhpcy5hY3RpdmF0ZSgkdGFyZ2V0LCAkdGFyZ2V0LnBhcmVudCgpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkcHJldmlvdXMudHJpZ2dlcih7XG4gICAgICAgIHR5cGU6ICdoaWRkZW4uYnMudGFiJyxcbiAgICAgICAgcmVsYXRlZFRhcmdldDogJHRoaXNbMF1cbiAgICAgIH0pXG4gICAgICAkdGhpcy50cmlnZ2VyKHtcbiAgICAgICAgdHlwZTogJ3Nob3duLmJzLnRhYicsXG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6ICRwcmV2aW91c1swXVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgVGFiLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyICRhY3RpdmUgICAgPSBjb250YWluZXIuZmluZCgnPiAuYWN0aXZlJylcbiAgICB2YXIgdHJhbnNpdGlvbiA9IGNhbGxiYWNrXG4gICAgICAmJiAkLnN1cHBvcnQudHJhbnNpdGlvblxuICAgICAgJiYgKCRhY3RpdmUubGVuZ3RoICYmICRhY3RpdmUuaGFzQ2xhc3MoJ2ZhZGUnKSB8fCAhIWNvbnRhaW5lci5maW5kKCc+IC5mYWRlJykubGVuZ3RoKVxuXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICRhY3RpdmVcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgICAuZmluZCgnPiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUnKVxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgICAgLmVuZCgpXG4gICAgICAgIC5maW5kKCdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKVxuICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpXG5cbiAgICAgIGVsZW1lbnRcbiAgICAgICAgLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgICAgICAuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJylcbiAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpXG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gcmVmbG93IGZvciB0cmFuc2l0aW9uXG4gICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJ2luJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2ZhZGUnKVxuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnQoJy5kcm9wZG93bi1tZW51JykubGVuZ3RoKSB7XG4gICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAuY2xvc2VzdCgnbGkuZHJvcGRvd24nKVxuICAgICAgICAgICAgLmFkZENsYXNzKCdhY3RpdmUnKVxuICAgICAgICAgIC5lbmQoKVxuICAgICAgICAgIC5maW5kKCdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKVxuICAgICAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuICAgICAgfVxuXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfVxuXG4gICAgJGFjdGl2ZS5sZW5ndGggJiYgdHJhbnNpdGlvbiA/XG4gICAgICAkYWN0aXZlXG4gICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIG5leHQpXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChUYWIuVFJBTlNJVElPTl9EVVJBVElPTikgOlxuICAgICAgbmV4dCgpXG5cbiAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdpbicpXG4gIH1cblxuXG4gIC8vIFRBQiBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgPSAkdGhpcy5kYXRhKCdicy50YWInKVxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLnRhYicsIChkYXRhID0gbmV3IFRhYih0aGlzKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4udGFiXG5cbiAgJC5mbi50YWIgICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi50YWIuQ29uc3RydWN0b3IgPSBUYWJcblxuXG4gIC8vIFRBQiBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT1cblxuICAkLmZuLnRhYi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4udGFiID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG5cbiAgLy8gVEFCIERBVEEtQVBJXG4gIC8vID09PT09PT09PT09PVxuXG4gIHZhciBjbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIFBsdWdpbi5jYWxsKCQodGhpcyksICdzaG93JylcbiAgfVxuXG4gICQoZG9jdW1lbnQpXG4gICAgLm9uKCdjbGljay5icy50YWIuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJywgY2xpY2tIYW5kbGVyKVxuICAgIC5vbignY2xpY2suYnMudGFiLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZT1cInBpbGxcIl0nLCBjbGlja0hhbmRsZXIpXG5cbn0oalF1ZXJ5KTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IGFmZml4LmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jYWZmaXhcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBBRkZJWCBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgQWZmaXggPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBBZmZpeC5ERUZBVUxUUywgb3B0aW9ucylcblxuICAgIHRoaXMuJHRhcmdldCA9ICQodGhpcy5vcHRpb25zLnRhcmdldClcbiAgICAgIC5vbignc2Nyb2xsLmJzLmFmZml4LmRhdGEtYXBpJywgJC5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sIHRoaXMpKVxuICAgICAgLm9uKCdjbGljay5icy5hZmZpeC5kYXRhLWFwaScsICAkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AsIHRoaXMpKVxuXG4gICAgdGhpcy4kZWxlbWVudCAgICAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy5hZmZpeGVkICAgICAgPSBudWxsXG4gICAgdGhpcy51bnBpbiAgICAgICAgPSBudWxsXG4gICAgdGhpcy5waW5uZWRPZmZzZXQgPSBudWxsXG5cbiAgICB0aGlzLmNoZWNrUG9zaXRpb24oKVxuICB9XG5cbiAgQWZmaXguVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgQWZmaXguUkVTRVQgICAgPSAnYWZmaXggYWZmaXgtdG9wIGFmZml4LWJvdHRvbSdcblxuICBBZmZpeC5ERUZBVUxUUyA9IHtcbiAgICBvZmZzZXQ6IDAsXG4gICAgdGFyZ2V0OiB3aW5kb3dcbiAgfVxuXG4gIEFmZml4LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uIChzY3JvbGxIZWlnaHQsIGhlaWdodCwgb2Zmc2V0VG9wLCBvZmZzZXRCb3R0b20pIHtcbiAgICB2YXIgc2Nyb2xsVG9wICAgID0gdGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpXG4gICAgdmFyIHBvc2l0aW9uICAgICA9IHRoaXMuJGVsZW1lbnQub2Zmc2V0KClcbiAgICB2YXIgdGFyZ2V0SGVpZ2h0ID0gdGhpcy4kdGFyZ2V0LmhlaWdodCgpXG5cbiAgICBpZiAob2Zmc2V0VG9wICE9IG51bGwgJiYgdGhpcy5hZmZpeGVkID09ICd0b3AnKSByZXR1cm4gc2Nyb2xsVG9wIDwgb2Zmc2V0VG9wID8gJ3RvcCcgOiBmYWxzZVxuXG4gICAgaWYgKHRoaXMuYWZmaXhlZCA9PSAnYm90dG9tJykge1xuICAgICAgaWYgKG9mZnNldFRvcCAhPSBudWxsKSByZXR1cm4gKHNjcm9sbFRvcCArIHRoaXMudW5waW4gPD0gcG9zaXRpb24udG9wKSA/IGZhbHNlIDogJ2JvdHRvbSdcbiAgICAgIHJldHVybiAoc2Nyb2xsVG9wICsgdGFyZ2V0SGVpZ2h0IDw9IHNjcm9sbEhlaWdodCAtIG9mZnNldEJvdHRvbSkgPyBmYWxzZSA6ICdib3R0b20nXG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxpemluZyAgID0gdGhpcy5hZmZpeGVkID09IG51bGxcbiAgICB2YXIgY29sbGlkZXJUb3AgICAgPSBpbml0aWFsaXppbmcgPyBzY3JvbGxUb3AgOiBwb3NpdGlvbi50b3BcbiAgICB2YXIgY29sbGlkZXJIZWlnaHQgPSBpbml0aWFsaXppbmcgPyB0YXJnZXRIZWlnaHQgOiBoZWlnaHRcblxuICAgIGlmIChvZmZzZXRUb3AgIT0gbnVsbCAmJiBzY3JvbGxUb3AgPD0gb2Zmc2V0VG9wKSByZXR1cm4gJ3RvcCdcbiAgICBpZiAob2Zmc2V0Qm90dG9tICE9IG51bGwgJiYgKGNvbGxpZGVyVG9wICsgY29sbGlkZXJIZWlnaHQgPj0gc2Nyb2xsSGVpZ2h0IC0gb2Zmc2V0Qm90dG9tKSkgcmV0dXJuICdib3R0b20nXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIEFmZml4LnByb3RvdHlwZS5nZXRQaW5uZWRPZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMucGlubmVkT2Zmc2V0KSByZXR1cm4gdGhpcy5waW5uZWRPZmZzZXRcbiAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKEFmZml4LlJFU0VUKS5hZGRDbGFzcygnYWZmaXgnKVxuICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLiR0YXJnZXQuc2Nyb2xsVG9wKClcbiAgICB2YXIgcG9zaXRpb24gID0gdGhpcy4kZWxlbWVudC5vZmZzZXQoKVxuICAgIHJldHVybiAodGhpcy5waW5uZWRPZmZzZXQgPSBwb3NpdGlvbi50b3AgLSBzY3JvbGxUb3ApXG4gIH1cblxuICBBZmZpeC5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCgkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbiwgdGhpcyksIDEpXG4gIH1cblxuICBBZmZpeC5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHJldHVyblxuXG4gICAgdmFyIGhlaWdodCAgICAgICA9IHRoaXMuJGVsZW1lbnQuaGVpZ2h0KClcbiAgICB2YXIgb2Zmc2V0ICAgICAgID0gdGhpcy5vcHRpb25zLm9mZnNldFxuICAgIHZhciBvZmZzZXRUb3AgICAgPSBvZmZzZXQudG9wXG4gICAgdmFyIG9mZnNldEJvdHRvbSA9IG9mZnNldC5ib3R0b21cbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gTWF0aC5tYXgoJChkb2N1bWVudCkuaGVpZ2h0KCksICQoZG9jdW1lbnQuYm9keSkuaGVpZ2h0KCkpXG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCAhPSAnb2JqZWN0JykgICAgICAgICBvZmZzZXRCb3R0b20gPSBvZmZzZXRUb3AgPSBvZmZzZXRcbiAgICBpZiAodHlwZW9mIG9mZnNldFRvcCA9PSAnZnVuY3Rpb24nKSAgICBvZmZzZXRUb3AgICAgPSBvZmZzZXQudG9wKHRoaXMuJGVsZW1lbnQpXG4gICAgaWYgKHR5cGVvZiBvZmZzZXRCb3R0b20gPT0gJ2Z1bmN0aW9uJykgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0LmJvdHRvbSh0aGlzLiRlbGVtZW50KVxuXG4gICAgdmFyIGFmZml4ID0gdGhpcy5nZXRTdGF0ZShzY3JvbGxIZWlnaHQsIGhlaWdodCwgb2Zmc2V0VG9wLCBvZmZzZXRCb3R0b20pXG5cbiAgICBpZiAodGhpcy5hZmZpeGVkICE9IGFmZml4KSB7XG4gICAgICBpZiAodGhpcy51bnBpbiAhPSBudWxsKSB0aGlzLiRlbGVtZW50LmNzcygndG9wJywgJycpXG5cbiAgICAgIHZhciBhZmZpeFR5cGUgPSAnYWZmaXgnICsgKGFmZml4ID8gJy0nICsgYWZmaXggOiAnJylcbiAgICAgIHZhciBlICAgICAgICAgPSAkLkV2ZW50KGFmZml4VHlwZSArICcuYnMuYWZmaXgnKVxuXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcblxuICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgICB0aGlzLmFmZml4ZWQgPSBhZmZpeFxuICAgICAgdGhpcy51bnBpbiA9IGFmZml4ID09ICdib3R0b20nID8gdGhpcy5nZXRQaW5uZWRPZmZzZXQoKSA6IG51bGxcblxuICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICAucmVtb3ZlQ2xhc3MoQWZmaXguUkVTRVQpXG4gICAgICAgIC5hZGRDbGFzcyhhZmZpeFR5cGUpXG4gICAgICAgIC50cmlnZ2VyKGFmZml4VHlwZS5yZXBsYWNlKCdhZmZpeCcsICdhZmZpeGVkJykgKyAnLmJzLmFmZml4JylcbiAgICB9XG5cbiAgICBpZiAoYWZmaXggPT0gJ2JvdHRvbScpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQub2Zmc2V0KHtcbiAgICAgICAgdG9wOiBzY3JvbGxIZWlnaHQgLSBoZWlnaHQgLSBvZmZzZXRCb3R0b21cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cblxuICAvLyBBRkZJWCBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgICAgPSAkdGhpcy5kYXRhKCdicy5hZmZpeCcpXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuYWZmaXgnLCAoZGF0YSA9IG5ldyBBZmZpeCh0aGlzLCBvcHRpb25zKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4uYWZmaXhcblxuICAkLmZuLmFmZml4ICAgICAgICAgICAgID0gUGx1Z2luXG4gICQuZm4uYWZmaXguQ29uc3RydWN0b3IgPSBBZmZpeFxuXG5cbiAgLy8gQUZGSVggTk8gQ09ORkxJQ1RcbiAgLy8gPT09PT09PT09PT09PT09PT1cblxuICAkLmZuLmFmZml4Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5hZmZpeCA9IG9sZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuXG4gIC8vIEFGRklYIERBVEEtQVBJXG4gIC8vID09PT09PT09PT09PT09XG5cbiAgJCh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICQoJ1tkYXRhLXNweT1cImFmZml4XCJdJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHNweSA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhID0gJHNweS5kYXRhKClcblxuICAgICAgZGF0YS5vZmZzZXQgPSBkYXRhLm9mZnNldCB8fCB7fVxuXG4gICAgICBpZiAoZGF0YS5vZmZzZXRCb3R0b20gIT0gbnVsbCkgZGF0YS5vZmZzZXQuYm90dG9tID0gZGF0YS5vZmZzZXRCb3R0b21cbiAgICAgIGlmIChkYXRhLm9mZnNldFRvcCAgICAhPSBudWxsKSBkYXRhLm9mZnNldC50b3AgICAgPSBkYXRhLm9mZnNldFRvcFxuXG4gICAgICBQbHVnaW4uY2FsbCgkc3B5LCBkYXRhKVxuICAgIH0pXG4gIH0pXG5cbn0oalF1ZXJ5KTtcbiIsIi8qKlxuICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjYuMVxuICogKGMpIDIwMTAtMjAxNiBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmdcbiAqIExpY2Vuc2U6IE1JVFxuICovXG4oZnVuY3Rpb24od2luZG93KSB7J3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGEgdXRpbGl0eSBmb3IgcHJvZHVjaW5nIHJpY2ggRXJyb3IgbWVzc2FnZXMgd2l0aGluXG4gKiBBbmd1bGFyLiBJdCBjYW4gYmUgY2FsbGVkIGFzIGZvbGxvd3M6XG4gKlxuICogdmFyIGV4YW1wbGVNaW5FcnIgPSBtaW5FcnIoJ2V4YW1wbGUnKTtcbiAqIHRocm93IGV4YW1wbGVNaW5FcnIoJ29uZScsICdUaGlzIHswfSBpcyB7MX0nLCBmb28sIGJhcik7XG4gKlxuICogVGhlIGFib3ZlIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgbWluRXJyIGluIHRoZSBleGFtcGxlIG5hbWVzcGFjZS4gVGhlXG4gKiByZXN1bHRpbmcgZXJyb3Igd2lsbCBoYXZlIGEgbmFtZXNwYWNlZCBlcnJvciBjb2RlIG9mIGV4YW1wbGUub25lLiAgVGhlXG4gKiByZXN1bHRpbmcgZXJyb3Igd2lsbCByZXBsYWNlIHswfSB3aXRoIHRoZSB2YWx1ZSBvZiBmb28sIGFuZCB7MX0gd2l0aCB0aGVcbiAqIHZhbHVlIG9mIGJhci4gVGhlIG9iamVjdCBpcyBub3QgcmVzdHJpY3RlZCBpbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpdCBjYW5cbiAqIHRha2UuXG4gKlxuICogSWYgZmV3ZXIgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgdGhhbiBuZWNlc3NhcnkgZm9yIGludGVycG9sYXRpb24sIHRoZSBleHRyYVxuICogaW50ZXJwb2xhdGlvbiBtYXJrZXJzIHdpbGwgYmUgcHJlc2VydmVkIGluIHRoZSBmaW5hbCBzdHJpbmcuXG4gKlxuICogU2luY2UgZGF0YSB3aWxsIGJlIHBhcnNlZCBzdGF0aWNhbGx5IGR1cmluZyBhIGJ1aWxkIHN0ZXAsIHNvbWUgcmVzdHJpY3Rpb25zXG4gKiBhcmUgYXBwbGllZCB3aXRoIHJlc3BlY3QgdG8gaG93IG1pbkVyciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYW5kIGNhbGxlZC5cbiAqIEluc3RhbmNlcyBzaG91bGQgaGF2ZSBuYW1lcyBvZiB0aGUgZm9ybSBuYW1lc3BhY2VNaW5FcnIgZm9yIGEgbWluRXJyIGNyZWF0ZWRcbiAqIHVzaW5nIG1pbkVycignbmFtZXNwYWNlJykgLiBFcnJvciBjb2RlcywgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGUgc3RyaW5nc1xuICogc2hvdWxkIGFsbCBiZSBzdGF0aWMgc3RyaW5ncywgbm90IHZhcmlhYmxlcyBvciBnZW5lcmFsIGV4cHJlc3Npb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgVGhlIG5hbWVzcGFjZSB0byB1c2UgZm9yIHRoZSBuZXcgbWluRXJyIGluc3RhbmNlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gRXJyb3JDb25zdHJ1Y3RvciBDdXN0b20gZXJyb3IgY29uc3RydWN0b3IgdG8gYmUgaW5zdGFudGlhdGVkIHdoZW4gcmV0dXJuaW5nXG4gKiAgIGVycm9yIGZyb20gcmV0dXJuZWQgZnVuY3Rpb24sIGZvciBjYXNlcyB3aGVuIGEgcGFydGljdWxhciB0eXBlIG9mIGVycm9yIGlzIHVzZWZ1bC5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbihjb2RlOnN0cmluZywgdGVtcGxhdGU6c3RyaW5nLCAuLi50ZW1wbGF0ZUFyZ3MpOiBFcnJvcn0gbWluRXJyIGluc3RhbmNlXG4gKi9cblxuZnVuY3Rpb24gbWluRXJyKG1vZHVsZSwgRXJyb3JDb25zdHJ1Y3Rvcikge1xuICBFcnJvckNvbnN0cnVjdG9yID0gRXJyb3JDb25zdHJ1Y3RvciB8fCBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBTS0lQX0lOREVYRVMgPSAyO1xuXG4gICAgdmFyIHRlbXBsYXRlQXJncyA9IGFyZ3VtZW50cyxcbiAgICAgIGNvZGUgPSB0ZW1wbGF0ZUFyZ3NbMF0sXG4gICAgICBtZXNzYWdlID0gJ1snICsgKG1vZHVsZSA/IG1vZHVsZSArICc6JyA6ICcnKSArIGNvZGUgKyAnXSAnLFxuICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZUFyZ3NbMV0sXG4gICAgICBwYXJhbVByZWZpeCwgaTtcblxuICAgIG1lc3NhZ2UgKz0gdGVtcGxhdGUucmVwbGFjZSgvXFx7XFxkK1xcfS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgICAgdmFyIGluZGV4ID0gK21hdGNoLnNsaWNlKDEsIC0xKSxcbiAgICAgICAgc2hpZnRlZEluZGV4ID0gaW5kZXggKyBTS0lQX0lOREVYRVM7XG5cbiAgICAgIGlmIChzaGlmdGVkSW5kZXggPCB0ZW1wbGF0ZUFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0b0RlYnVnU3RyaW5nKHRlbXBsYXRlQXJnc1tzaGlmdGVkSW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgbWVzc2FnZSArPSAnXFxuaHR0cDovL2Vycm9ycy5hbmd1bGFyanMub3JnLzEuNi4xLycgK1xuICAgICAgKG1vZHVsZSA/IG1vZHVsZSArICcvJyA6ICcnKSArIGNvZGU7XG5cbiAgICBmb3IgKGkgPSBTS0lQX0lOREVYRVMsIHBhcmFtUHJlZml4ID0gJz8nOyBpIDwgdGVtcGxhdGVBcmdzLmxlbmd0aDsgaSsrLCBwYXJhbVByZWZpeCA9ICcmJykge1xuICAgICAgbWVzc2FnZSArPSBwYXJhbVByZWZpeCArICdwJyArIChpIC0gU0tJUF9JTkRFWEVTKSArICc9JyArXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0b0RlYnVnU3RyaW5nKHRlbXBsYXRlQXJnc1tpXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRXJyb3JDb25zdHJ1Y3RvcihtZXNzYWdlKTtcbiAgfTtcbn1cblxuLyogV2UgbmVlZCB0byB0ZWxsIEVTTGludCB3aGF0IHZhcmlhYmxlcyBhcmUgYmVpbmcgZXhwb3J0ZWQgKi9cbi8qIGV4cG9ydGVkXG4gIGFuZ3VsYXIsXG4gIG1zaWUsXG4gIGpxTGl0ZSxcbiAgalF1ZXJ5LFxuICBzbGljZSxcbiAgc3BsaWNlLFxuICBwdXNoLFxuICB0b1N0cmluZyxcbiAgbmdNaW5FcnIsXG4gIGFuZ3VsYXJNb2R1bGUsXG4gIHVpZCxcbiAgUkVHRVhfU1RSSU5HX1JFR0VYUCxcbiAgVkFMSURJVFlfU1RBVEVfUFJPUEVSVFksXG5cbiAgbG93ZXJjYXNlLFxuICB1cHBlcmNhc2UsXG4gIG1hbnVhbExvd2VyY2FzZSxcbiAgbWFudWFsVXBwZXJjYXNlLFxuICBub2RlTmFtZV8sXG4gIGlzQXJyYXlMaWtlLFxuICBmb3JFYWNoLFxuICBmb3JFYWNoU29ydGVkLFxuICByZXZlcnNlUGFyYW1zLFxuICBuZXh0VWlkLFxuICBzZXRIYXNoS2V5LFxuICBleHRlbmQsXG4gIHRvSW50LFxuICBpbmhlcml0LFxuICBtZXJnZSxcbiAgbm9vcCxcbiAgaWRlbnRpdHksXG4gIHZhbHVlRm4sXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RlZmluZWQsXG4gIGlzT2JqZWN0LFxuICBpc0JsYW5rT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNOdW1iZXIsXG4gIGlzTnVtYmVyTmFOLFxuICBpc0RhdGUsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUmVnRXhwLFxuICBpc1dpbmRvdyxcbiAgaXNTY29wZSxcbiAgaXNGaWxlLFxuICBpc0Zvcm1EYXRhLFxuICBpc0Jsb2IsXG4gIGlzQm9vbGVhbixcbiAgaXNQcm9taXNlTGlrZSxcbiAgdHJpbSxcbiAgZXNjYXBlRm9yUmVnZXhwLFxuICBpc0VsZW1lbnQsXG4gIG1ha2VNYXAsXG4gIGluY2x1ZGVzLFxuICBhcnJheVJlbW92ZSxcbiAgY29weSxcbiAgZXF1YWxzLFxuICBjc3AsXG4gIGpxLFxuICBjb25jYXQsXG4gIHNsaWNlQXJncyxcbiAgYmluZCxcbiAgdG9Kc29uUmVwbGFjZXIsXG4gIHRvSnNvbixcbiAgZnJvbUpzb24sXG4gIGNvbnZlcnRUaW1lem9uZVRvTG9jYWwsXG4gIHRpbWV6b25lVG9PZmZzZXQsXG4gIHN0YXJ0aW5nVGFnLFxuICB0cnlEZWNvZGVVUklDb21wb25lbnQsXG4gIHBhcnNlS2V5VmFsdWUsXG4gIHRvS2V5VmFsdWUsXG4gIGVuY29kZVVyaVNlZ21lbnQsXG4gIGVuY29kZVVyaVF1ZXJ5LFxuICBhbmd1bGFySW5pdCxcbiAgYm9vdHN0cmFwLFxuICBnZXRUZXN0YWJpbGl0eSxcbiAgc25ha2VfY2FzZSxcbiAgYmluZEpRdWVyeSxcbiAgYXNzZXJ0QXJnLFxuICBhc3NlcnRBcmdGbixcbiAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHksXG4gIGdldHRlcixcbiAgZ2V0QmxvY2tOb2RlcyxcbiAgaGFzT3duUHJvcGVydHksXG4gIGNyZWF0ZU1hcCxcbiAgc3RyaW5naWZ5LFxuXG4gIE5PREVfVFlQRV9FTEVNRU5ULFxuICBOT0RFX1RZUEVfQVRUUklCVVRFLFxuICBOT0RFX1RZUEVfVEVYVCxcbiAgTk9ERV9UWVBFX0NPTU1FTlQsXG4gIE5PREVfVFlQRV9ET0NVTUVOVCxcbiAgTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UXG4qL1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBAbmdkb2MgbW9kdWxlXG4gKiBAbmFtZSBuZ1xuICogQG1vZHVsZSBuZ1xuICogQGluc3RhbGxhdGlvblxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogIyBuZyAoY29yZSBtb2R1bGUpXG4gKiBUaGUgbmcgbW9kdWxlIGlzIGxvYWRlZCBieSBkZWZhdWx0IHdoZW4gYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQuIFRoZSBtb2R1bGUgaXRzZWxmXG4gKiBjb250YWlucyB0aGUgZXNzZW50aWFsIGNvbXBvbmVudHMgZm9yIGFuIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbiB0byBmdW5jdGlvbi4gVGhlIHRhYmxlIGJlbG93XG4gKiBsaXN0cyBhIGhpZ2ggbGV2ZWwgYnJlYWtkb3duIG9mIGVhY2ggb2YgdGhlIHNlcnZpY2VzL2ZhY3RvcmllcywgZmlsdGVycywgZGlyZWN0aXZlcyBhbmQgdGVzdGluZ1xuICogY29tcG9uZW50cyBhdmFpbGFibGUgd2l0aGluIHRoaXMgY29yZSBtb2R1bGUuXG4gKlxuICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9XCJuZ1wiPjwvZGl2PlxuICovXG5cbnZhciBSRUdFWF9TVFJJTkdfUkVHRVhQID0gL15cXC8oLispXFwvKFthLXpdKikkLztcblxuLy8gVGhlIG5hbWUgb2YgYSBmb3JtIGNvbnRyb2wncyBWYWxpZGl0eVN0YXRlIHByb3BlcnR5LlxuLy8gVGhpcyBpcyB1c2VkIHNvIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgaW50ZXJuYWwgdGVzdHMgdG8gY3JlYXRlIG1vY2sgVmFsaWRpdHlTdGF0ZXMuXG52YXIgVkFMSURJVFlfU1RBVEVfUFJPUEVSVFkgPSAndmFsaWRpdHknO1xuXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmxvd2VyY2FzZVxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogc2luY2VWZXJzaW9uPVwiMS41LjBcIlxuICogcmVtb3ZlVmVyc2lvbj1cIjEuNy4wXCJcbiAqIFVzZSBbU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL3RvTG93ZXJDYXNlKSBpbnN0ZWFkLlxuICpcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBsb3dlcmNhc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuICogQHJldHVybnMge3N0cmluZ30gTG93ZXJjYXNlZCBzdHJpbmcuXG4gKi9cbnZhciBsb3dlcmNhc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtyZXR1cm4gaXNTdHJpbmcoc3RyaW5nKSA/IHN0cmluZy50b0xvd2VyQ2FzZSgpIDogc3RyaW5nO307XG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLnVwcGVyY2FzZVxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogc2luY2VWZXJzaW9uPVwiMS41LjBcIlxuICogcmVtb3ZlVmVyc2lvbj1cIjEuNy4wXCJcbiAqIFVzZSBbU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL3RvVXBwZXJDYXNlKSBpbnN0ZWFkLlxuICpcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB1cHBlcmNhc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLlxuICogQHJldHVybnMge3N0cmluZ30gVXBwZXJjYXNlZCBzdHJpbmcuXG4gKi9cbnZhciB1cHBlcmNhc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtyZXR1cm4gaXNTdHJpbmcoc3RyaW5nKSA/IHN0cmluZy50b1VwcGVyQ2FzZSgpIDogc3RyaW5nO307XG5cblxudmFyIG1hbnVhbExvd2VyY2FzZSA9IGZ1bmN0aW9uKHMpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICByZXR1cm4gaXNTdHJpbmcocylcbiAgICAgID8gcy5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihjaCkge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgfCAzMik7fSlcbiAgICAgIDogcztcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xufTtcbnZhciBtYW51YWxVcHBlcmNhc2UgPSBmdW5jdGlvbihzKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgcmV0dXJuIGlzU3RyaW5nKHMpXG4gICAgICA/IHMucmVwbGFjZSgvW2Etel0vZywgZnVuY3Rpb24oY2gpIHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApICYgfjMyKTt9KVxuICAgICAgOiBzO1xuICAvKiBlc2xpbnQtZW5hYmxlICovXG59O1xuXG5cbi8vIFN0cmluZyN0b0xvd2VyQ2FzZSBhbmQgU3RyaW5nI3RvVXBwZXJDYXNlIGRvbid0IHByb2R1Y2UgY29ycmVjdCByZXN1bHRzIGluIGJyb3dzZXJzIHdpdGggVHVya2lzaFxuLy8gbG9jYWxlLCBmb3IgdGhpcyByZWFzb24gd2UgbmVlZCB0byBkZXRlY3QgdGhpcyBjYXNlIGFuZCByZWRlZmluZSBsb3dlcmNhc2UvdXBwZXJjYXNlIG1ldGhvZHNcbi8vIHdpdGggY29ycmVjdCBidXQgc2xvd2VyIGFsdGVybmF0aXZlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzExMzg3XG5pZiAoJ2knICE9PSAnSScudG9Mb3dlckNhc2UoKSkge1xuICBsb3dlcmNhc2UgPSBtYW51YWxMb3dlcmNhc2U7XG4gIHVwcGVyY2FzZSA9IG1hbnVhbFVwcGVyY2FzZTtcbn1cblxuXG52YXJcbiAgICBtc2llLCAgICAgICAgICAgICAvLyBob2xkcyBtYWpvciB2ZXJzaW9uIG51bWJlciBmb3IgSUUsIG9yIE5hTiBpZiBVQSBpcyBub3QgSUUuXG4gICAganFMaXRlLCAgICAgICAgICAgLy8gZGVsYXkgYmluZGluZyBzaW5jZSBqUXVlcnkgY291bGQgYmUgbG9hZGVkIGFmdGVyIHVzLlxuICAgIGpRdWVyeSwgICAgICAgICAgIC8vIGRlbGF5IGJpbmRpbmdcbiAgICBzbGljZSAgICAgICAgICAgICA9IFtdLnNsaWNlLFxuICAgIHNwbGljZSAgICAgICAgICAgID0gW10uc3BsaWNlLFxuICAgIHB1c2ggICAgICAgICAgICAgID0gW10ucHVzaCxcbiAgICB0b1N0cmluZyAgICAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgZ2V0UHJvdG90eXBlT2YgICAgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsXG4gICAgbmdNaW5FcnIgICAgICAgICAgPSBtaW5FcnIoJ25nJyksXG5cbiAgICAvKiogQG5hbWUgYW5ndWxhciAqL1xuICAgIGFuZ3VsYXIgICAgICAgICAgID0gd2luZG93LmFuZ3VsYXIgfHwgKHdpbmRvdy5hbmd1bGFyID0ge30pLFxuICAgIGFuZ3VsYXJNb2R1bGUsXG4gICAgdWlkICAgICAgICAgICAgICAgPSAwO1xuXG4vLyBTdXBwb3J0OiBJRSA5LTExIG9ubHlcbi8qKlxuICogZG9jdW1lbnRNb2RlIGlzIGFuIElFLW9ubHkgcHJvcGVydHlcbiAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9jYzE5Njk4OCh2PXZzLjg1KS5hc3B4XG4gKi9cbm1zaWUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYG9iamAgaXMgYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QgKE5vZGVMaXN0LCBBcmd1bWVudHMsXG4gKiAgICAgICAgICAgICAgICAgICBTdHJpbmcgLi4uKVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZShvYmopIHtcblxuICAvLyBgbnVsbGAsIGB1bmRlZmluZWRgIGFuZCBgd2luZG93YCBhcmUgbm90IGFycmF5LWxpa2VcbiAgaWYgKG9iaiA9PSBudWxsIHx8IGlzV2luZG93KG9iaikpIHJldHVybiBmYWxzZTtcblxuICAvLyBhcnJheXMsIHN0cmluZ3MgYW5kIGpRdWVyeS9qcUxpdGUgb2JqZWN0cyBhcmUgYXJyYXkgbGlrZVxuICAvLyAqIGpxTGl0ZSBpcyBlaXRoZXIgdGhlIGpRdWVyeSBvciBqcUxpdGUgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAgLy8gKiB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YganFMaXRlIGZpcnN0IGFzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAvLyAgIHZpYSB0aGUgZm9yRWFjaCBtZXRob2Qgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGpxTGl0ZSBvYmplY3QgaW4gdGhlIGZpcnN0IHBsYWNlXG4gIGlmIChpc0FycmF5KG9iaikgfHwgaXNTdHJpbmcob2JqKSB8fCAoanFMaXRlICYmIG9iaiBpbnN0YW5jZW9mIGpxTGl0ZSkpIHJldHVybiB0cnVlO1xuXG4gIC8vIFN1cHBvcnQ6IGlPUyA4LjIgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuICAvLyBcImxlbmd0aFwiIGluIG9iaiB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0xMTUwOClcbiAgdmFyIGxlbmd0aCA9ICdsZW5ndGgnIGluIE9iamVjdChvYmopICYmIG9iai5sZW5ndGg7XG5cbiAgLy8gTm9kZUxpc3Qgb2JqZWN0cyAod2l0aCBgaXRlbWAgbWV0aG9kKSBhbmRcbiAgLy8gb3RoZXIgb2JqZWN0cyB3aXRoIHN1aXRhYmxlIGxlbmd0aCBjaGFyYWN0ZXJpc3RpY3MgYXJlIGFycmF5LWxpa2VcbiAgcmV0dXJuIGlzTnVtYmVyKGxlbmd0aCkgJiZcbiAgICAobGVuZ3RoID49IDAgJiYgKChsZW5ndGggLSAxKSBpbiBvYmogfHwgb2JqIGluc3RhbmNlb2YgQXJyYXkpIHx8IHR5cGVvZiBvYmouaXRlbSA9PT0gJ2Z1bmN0aW9uJyk7XG5cbn1cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuZm9yRWFjaFxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEludm9rZXMgdGhlIGBpdGVyYXRvcmAgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBpdGVtIGluIGBvYmpgIGNvbGxlY3Rpb24sIHdoaWNoIGNhbiBiZSBlaXRoZXIgYW5cbiAqIG9iamVjdCBvciBhbiBhcnJheS4gVGhlIGBpdGVyYXRvcmAgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIGBpdGVyYXRvcih2YWx1ZSwga2V5LCBvYmopYCwgd2hlcmUgYHZhbHVlYFxuICogaXMgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eSBvciBhbiBhcnJheSBlbGVtZW50LCBga2V5YCBpcyB0aGUgb2JqZWN0IHByb3BlcnR5IGtleSBvclxuICogYXJyYXkgZWxlbWVudCBpbmRleCBhbmQgb2JqIGlzIHRoZSBgb2JqYCBpdHNlbGYuIFNwZWNpZnlpbmcgYSBgY29udGV4dGAgZm9yIHRoZSBmdW5jdGlvbiBpcyBvcHRpb25hbC5cbiAqXG4gKiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBgLmZvckVhY2hgIGRvZXMgbm90IGl0ZXJhdGUgb3ZlciBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWNhdXNlIGl0IGZpbHRlcnNcbiAqIHVzaW5nIHRoZSBgaGFzT3duUHJvcGVydHlgIG1ldGhvZC5cbiAqXG4gKiBVbmxpa2UgRVMyNjInc1xuICogW0FycmF5LnByb3RvdHlwZS5mb3JFYWNoXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuNC40LjE4KSxcbiAqIHByb3ZpZGluZyAndW5kZWZpbmVkJyBvciAnbnVsbCcgdmFsdWVzIGZvciBgb2JqYCB3aWxsIG5vdCB0aHJvdyBhIFR5cGVFcnJvciwgYnV0IHJhdGhlciBqdXN0XG4gKiByZXR1cm4gdGhlIHZhbHVlIHByb3ZpZGVkLlxuICpcbiAgIGBgYGpzXG4gICAgIHZhciB2YWx1ZXMgPSB7bmFtZTogJ21pc2tvJywgZ2VuZGVyOiAnbWFsZSd9O1xuICAgICB2YXIgbG9nID0gW107XG4gICAgIGFuZ3VsYXIuZm9yRWFjaCh2YWx1ZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICB0aGlzLnB1c2goa2V5ICsgJzogJyArIHZhbHVlKTtcbiAgICAgfSwgbG9nKTtcbiAgICAgZXhwZWN0KGxvZykudG9FcXVhbChbJ25hbWU6IG1pc2tvJywgJ2dlbmRlcjogbWFsZSddKTtcbiAgIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogT2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yIEl0ZXJhdG9yIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb250ZXh0IE9iamVjdCB0byBiZWNvbWUgY29udGV4dCAoYHRoaXNgKSBmb3IgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnMge09iamVjdHxBcnJheX0gUmVmZXJlbmNlIHRvIGBvYmpgLlxuICovXG5cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICB2YXIga2V5LCBsZW5ndGg7XG4gIGlmIChvYmopIHtcbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ3Byb3RvdHlwZScgJiYga2V5ICE9PSAnbGVuZ3RoJyAmJiBrZXkgIT09ICduYW1lJyAmJiBvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmopIHx8IGlzQXJyYXlMaWtlKG9iaikpIHtcbiAgICAgIHZhciBpc1ByaW1pdGl2ZSA9IHR5cGVvZiBvYmogIT09ICdvYmplY3QnO1xuICAgICAgZm9yIChrZXkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZSB8fCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvYmouZm9yRWFjaCAmJiBvYmouZm9yRWFjaCAhPT0gZm9yRWFjaCkge1xuICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCwgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQmxhbmtPYmplY3Qob2JqKSkge1xuICAgICAgLy8gY3JlYXRlTWFwKCkgZmFzdCBwYXRoIC0tLSBTYWZlIHRvIGF2b2lkIGhhc093blByb3BlcnR5IGNoZWNrIGJlY2F1c2UgcHJvdG90eXBlIGNoYWluIGlzIGVtcHR5XG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iai5oYXNPd25Qcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU2xvdyBwYXRoIGZvciBvYmplY3RzIGluaGVyaXRpbmcgT2JqZWN0LnByb3RvdHlwZSwgaGFzT3duUHJvcGVydHkgY2hlY2sgbmVlZGVkXG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNsb3cgcGF0aCBmb3Igb2JqZWN0cyB3aGljaCBkbyBub3QgaGF2ZSBhIG1ldGhvZCBgaGFzT3duUHJvcGVydHlgXG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hTb3J0ZWQob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaikuc29ydCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXlzW2ldXSwga2V5c1tpXSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5cblxuLyoqXG4gKiB3aGVuIHVzaW5nIGZvckVhY2ggdGhlIHBhcmFtcyBhcmUgdmFsdWUsIGtleSwgYnV0IGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBoYXZlIGtleSwgdmFsdWUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZywgKil9IGl0ZXJhdG9yRm5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqLCBzdHJpbmcpfVxuICovXG5mdW5jdGlvbiByZXZlcnNlUGFyYW1zKGl0ZXJhdG9yRm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtpdGVyYXRvckZuKGtleSwgdmFsdWUpO307XG59XG5cbi8qKlxuICogQSBjb25zaXN0ZW50IHdheSBvZiBjcmVhdGluZyB1bmlxdWUgSURzIGluIGFuZ3VsYXIuXG4gKlxuICogVXNpbmcgc2ltcGxlIG51bWJlcnMgYWxsb3dzIHVzIHRvIGdlbmVyYXRlIDI4LjYgbWlsbGlvbiB1bmlxdWUgaWRzIHBlciBzZWNvbmQgZm9yIDEwIHllYXJzIGJlZm9yZVxuICogd2UgaGl0IG51bWJlciBwcmVjaXNpb24gaXNzdWVzIGluIEphdmFTY3JpcHQuXG4gKlxuICogTWF0aC5wb3coMiw1MykgLyA2MCAvIDYwIC8gMjQgLyAzNjUgLyAxMCA9IDI4LjZNXG4gKlxuICogQHJldHVybnMge251bWJlcn0gYW4gdW5pcXVlIGFscGhhLW51bWVyaWMgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIG5leHRVaWQoKSB7XG4gIHJldHVybiArK3VpZDtcbn1cblxuXG4vKipcbiAqIFNldCBvciBjbGVhciB0aGUgaGFzaGtleSBmb3IgYW4gb2JqZWN0LlxuICogQHBhcmFtIG9iaiBvYmplY3RcbiAqIEBwYXJhbSBoIHRoZSBoYXNoa2V5ICghdHJ1dGh5IHRvIGRlbGV0ZSB0aGUgaGFzaGtleSlcbiAqL1xuZnVuY3Rpb24gc2V0SGFzaEtleShvYmosIGgpIHtcbiAgaWYgKGgpIHtcbiAgICBvYmouJCRoYXNoS2V5ID0gaDtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgb2JqLiQkaGFzaEtleTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGJhc2VFeHRlbmQoZHN0LCBvYmpzLCBkZWVwKSB7XG4gIHZhciBoID0gZHN0LiQkaGFzaEtleTtcblxuICBmb3IgKHZhciBpID0gMCwgaWkgPSBvYmpzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICB2YXIgb2JqID0gb2Jqc1tpXTtcbiAgICBpZiAoIWlzT2JqZWN0KG9iaikgJiYgIWlzRnVuY3Rpb24ob2JqKSkgY29udGludWU7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGtleXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICB2YXIgc3JjID0gb2JqW2tleV07XG5cbiAgICAgIGlmIChkZWVwICYmIGlzT2JqZWN0KHNyYykpIHtcbiAgICAgICAgaWYgKGlzRGF0ZShzcmMpKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBuZXcgRGF0ZShzcmMudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1JlZ0V4cChzcmMpKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBuZXcgUmVnRXhwKHNyYyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjLm5vZGVOYW1lKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBzcmMuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRWxlbWVudChzcmMpKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBzcmMuY2xvbmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRzdFtrZXldKSkgZHN0W2tleV0gPSBpc0FycmF5KHNyYykgPyBbXSA6IHt9O1xuICAgICAgICAgIGJhc2VFeHRlbmQoZHN0W2tleV0sIFtzcmNdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHN0W2tleV0gPSBzcmM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0SGFzaEtleShkc3QsIGgpO1xuICByZXR1cm4gZHN0O1xufVxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5leHRlbmRcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeHRlbmRzIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgYGRzdGAgYnkgY29weWluZyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGBzcmNgIG9iamVjdChzKVxuICogdG8gYGRzdGAuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBgc3JjYCBvYmplY3RzLiBJZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBvcmlnaW5hbCBvYmplY3RzLCB5b3UgY2FuIGRvIHNvXG4gKiBieSBwYXNzaW5nIGFuIGVtcHR5IG9iamVjdCBhcyB0aGUgdGFyZ2V0OiBgdmFyIG9iamVjdCA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvYmplY3QxLCBvYmplY3QyKWAuXG4gKlxuICogKipOb3RlOioqIEtlZXAgaW4gbWluZCB0aGF0IGBhbmd1bGFyLmV4dGVuZGAgZG9lcyBub3Qgc3VwcG9ydCByZWN1cnNpdmUgbWVyZ2UgKGRlZXAgY29weSkuIFVzZVxuICoge0BsaW5rIGFuZ3VsYXIubWVyZ2V9IGZvciB0aGlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkc3QgRGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IHNyYyBTb3VyY2Ugb2JqZWN0KHMpLlxuICogQHJldHVybnMge09iamVjdH0gUmVmZXJlbmNlIHRvIGBkc3RgLlxuICovXG5mdW5jdGlvbiBleHRlbmQoZHN0KSB7XG4gIHJldHVybiBiYXNlRXh0ZW5kKGRzdCwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBmYWxzZSk7XG59XG5cblxuLyoqXG4qIEBuZ2RvYyBmdW5jdGlvblxuKiBAbmFtZSBhbmd1bGFyLm1lcmdlXG4qIEBtb2R1bGUgbmdcbiogQGtpbmQgZnVuY3Rpb25cbipcbiogQGRlc2NyaXB0aW9uXG4qIERlZXBseSBleHRlbmRzIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgYGRzdGAgYnkgY29weWluZyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGBzcmNgIG9iamVjdChzKVxuKiB0byBgZHN0YC4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGBzcmNgIG9iamVjdHMuIElmIHlvdSB3YW50IHRvIHByZXNlcnZlIG9yaWdpbmFsIG9iamVjdHMsIHlvdSBjYW4gZG8gc29cbiogYnkgcGFzc2luZyBhbiBlbXB0eSBvYmplY3QgYXMgdGhlIHRhcmdldDogYHZhciBvYmplY3QgPSBhbmd1bGFyLm1lcmdlKHt9LCBvYmplY3QxLCBvYmplY3QyKWAuXG4qXG4qIFVubGlrZSB7QGxpbmsgYW5ndWxhci5leHRlbmQgZXh0ZW5kKCl9LCBgbWVyZ2UoKWAgcmVjdXJzaXZlbHkgZGVzY2VuZHMgaW50byBvYmplY3QgcHJvcGVydGllcyBvZiBzb3VyY2Vcbiogb2JqZWN0cywgcGVyZm9ybWluZyBhIGRlZXAgY29weS5cbipcbiogQHBhcmFtIHtPYmplY3R9IGRzdCBEZXN0aW5hdGlvbiBvYmplY3QuXG4qIEBwYXJhbSB7Li4uT2JqZWN0fSBzcmMgU291cmNlIG9iamVjdChzKS5cbiogQHJldHVybnMge09iamVjdH0gUmVmZXJlbmNlIHRvIGBkc3RgLlxuKi9cbmZ1bmN0aW9uIG1lcmdlKGRzdCkge1xuICByZXR1cm4gYmFzZUV4dGVuZChkc3QsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgdHJ1ZSk7XG59XG5cblxuXG5mdW5jdGlvbiB0b0ludChzdHIpIHtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ciwgMTApO1xufVxuXG52YXIgaXNOdW1iZXJOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNOdW1iZXJOYU4obnVtKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuIG51bSAhPT0gbnVtO1xufTtcblxuXG5mdW5jdGlvbiBpbmhlcml0KHBhcmVudCwgZXh0cmEpIHtcbiAgcmV0dXJuIGV4dGVuZChPYmplY3QuY3JlYXRlKHBhcmVudCksIGV4dHJhKTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIubm9vcFxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBubyBvcGVyYXRpb25zLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiB3cml0aW5nIGNvZGUgaW4gdGhlXG4gKiBmdW5jdGlvbmFsIHN0eWxlLlxuICAgYGBganNcbiAgICAgZnVuY3Rpb24gZm9vKGNhbGxiYWNrKSB7XG4gICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVJlc3VsdCgpO1xuICAgICAgIChjYWxsYmFjayB8fCBhbmd1bGFyLm5vb3ApKHJlc3VsdCk7XG4gICAgIH1cbiAgIGBgYFxuICovXG5mdW5jdGlvbiBub29wKCkge31cbm5vb3AuJGluamVjdCA9IFtdO1xuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlkZW50aXR5XG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXRzIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY29kZSBpbiB0aGVcbiAqIGZ1bmN0aW9uYWwgc3R5bGUuXG4gKlxuICAgYGBganNcbiAgIGZ1bmN0aW9uIHRyYW5zZm9ybWVyKHRyYW5zZm9ybWF0aW9uRm4sIHZhbHVlKSB7XG4gICAgIHJldHVybiAodHJhbnNmb3JtYXRpb25GbiB8fCBhbmd1bGFyLmlkZW50aXR5KSh2YWx1ZSk7XG4gICB9O1xuXG4gICAvLyBFLmcuXG4gICBmdW5jdGlvbiBnZXRSZXN1bHQoZm4sIGlucHV0KSB7XG4gICAgIHJldHVybiAoZm4gfHwgYW5ndWxhci5pZGVudGl0eSkoaW5wdXQpO1xuICAgfTtcblxuICAgZ2V0UmVzdWx0KGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiAyOyB9LCAyMSk7ICAgLy8gcmV0dXJucyA0MlxuICAgZ2V0UmVzdWx0KG51bGwsIDIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyAyMVxuICAgZ2V0UmVzdWx0KHVuZGVmaW5lZCwgMjEpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyAyMVxuICAgYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgcGFzc2VkIGluLlxuICovXG5mdW5jdGlvbiBpZGVudGl0eSgkKSB7cmV0dXJuICQ7fVxuaWRlbnRpdHkuJGluamVjdCA9IFtdO1xuXG5cbmZ1bmN0aW9uIHZhbHVlRm4odmFsdWUpIHtyZXR1cm4gZnVuY3Rpb24gdmFsdWVSZWYoKSB7cmV0dXJuIHZhbHVlO307fVxuXG5mdW5jdGlvbiBoYXNDdXN0b21Ub1N0cmluZyhvYmopIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqLnRvU3RyaW5nKSAmJiBvYmoudG9TdHJpbmcgIT09IHRvU3RyaW5nO1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlzVW5kZWZpbmVkXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJzt9XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNEZWZpbmVkXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBkZWZpbmVkLlxuICovXG5mdW5jdGlvbiBpc0RlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJzt9XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNPYmplY3RcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGFuIGBPYmplY3RgLiBVbmxpa2UgYHR5cGVvZmAgaW4gSmF2YVNjcmlwdCwgYG51bGxgcyBhcmUgbm90XG4gKiBjb25zaWRlcmVkIHRvIGJlIG9iamVjdHMuIE5vdGUgdGhhdCBKYXZhU2NyaXB0IGFycmF5cyBhcmUgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYW4gYE9iamVjdGAgYnV0IG5vdCBgbnVsbGAuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2lzb2JqZWN0NFxuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGEgbnVsbCBwcm90b3R5cGVcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGBPYmplY3RgIHdpdGggYSBudWxsIHByb3RvdHlwZVxuICovXG5mdW5jdGlvbiBpc0JsYW5rT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFnZXRQcm90b3R5cGVPZih2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNTdHJpbmdcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGEgYFN0cmluZ2AuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGEgYFN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7fVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlzTnVtYmVyXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIGBOdW1iZXJgLlxuICpcbiAqIFRoaXMgaW5jbHVkZXMgdGhlIFwic3BlY2lhbFwiIG51bWJlcnMgYE5hTmAsIGArSW5maW5pdHlgIGFuZCBgLUluZmluaXR5YC5cbiAqXG4gKiBJZiB5b3Ugd2lzaCB0byBleGNsdWRlIHRoZXNlIHRoZW4geW91IGNhbiB1c2UgdGhlIG5hdGl2ZVxuICogW2Bpc0Zpbml0ZSddKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2lzRmluaXRlKVxuICogbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBOdW1iZXJgLlxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO31cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5pc0RhdGVcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSBkYXRlLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBEYXRlYC5cbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlzQXJyYXlcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGFuIGBBcnJheWAuIEFsaWFzIG9mIEFycmF5LmlzQXJyYXkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGBBcnJheWAuXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNGdW5jdGlvblxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYSBgRnVuY3Rpb25gLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBGdW5jdGlvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO31cblxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBSZWdFeHBgLlxuICovXG5mdW5jdGlvbiBpc1JlZ0V4cCh2YWx1ZSkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIGBvYmpgIGlzIGEgd2luZG93IG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqYCBpcyBhIHdpbmRvdyBvYmouXG4gKi9cbmZ1bmN0aW9uIGlzV2luZG93KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai53aW5kb3cgPT09IG9iajtcbn1cblxuXG5mdW5jdGlvbiBpc1Njb3BlKG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai4kZXZhbEFzeW5jICYmIG9iai4kd2F0Y2g7XG59XG5cblxuZnVuY3Rpb24gaXNGaWxlKG9iaikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBGaWxlXSc7XG59XG5cblxuZnVuY3Rpb24gaXNGb3JtRGF0YShvYmopIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJztcbn1cblxuXG5mdW5jdGlvbiBpc0Jsb2Iob2JqKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2Uob2JqKSB7XG4gIHJldHVybiBvYmogJiYgaXNGdW5jdGlvbihvYmoudGhlbik7XG59XG5cblxudmFyIFRZUEVEX0FSUkFZX1JFR0VYUCA9IC9eXFxbb2JqZWN0ICg/OlVpbnQ4fFVpbnQ4Q2xhbXBlZHxVaW50MTZ8VWludDMyfEludDh8SW50MTZ8SW50MzJ8RmxvYXQzMnxGbG9hdDY0KUFycmF5XSQvO1xuZnVuY3Rpb24gaXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiBpc051bWJlcih2YWx1ZS5sZW5ndGgpICYmIFRZUEVEX0FSUkFZX1JFR0VYUC50ZXN0KHRvU3RyaW5nLmNhbGwodmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcihvYmopIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuXG52YXIgdHJpbSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS50cmltKCkgOiB2YWx1ZTtcbn07XG5cbi8vIENvcGllZCBmcm9tOlxuLy8gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9sb2NhbF9jbG9zdXJlX2dvb2dfc3RyaW5nX3N0cmluZy5qcy5zb3VyY2UuaHRtbCNsaW5lMTAyMVxuLy8gUHJlcmVxOiBzIGlzIGEgc3RyaW5nLlxudmFyIGVzY2FwZUZvclJlZ2V4cCA9IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvKFstKClbXFxde30rPyouJF58LDojPCFcXFxcXSkvZywgJ1xcXFwkMScpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICAucmVwbGFjZSgvXFx4MDgvZywgJ1xcXFx4MDgnKTtcbn07XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNFbGVtZW50XG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIERPTSBlbGVtZW50IChvciB3cmFwcGVkIGpRdWVyeSBlbGVtZW50KS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCAob3Igd3JhcHBlZCBqUXVlcnkgZWxlbWVudCkuXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmXG4gICAgKG5vZGUubm9kZU5hbWUgIC8vIFdlIGFyZSBhIGRpcmVjdCBlbGVtZW50LlxuICAgIHx8IChub2RlLnByb3AgJiYgbm9kZS5hdHRyICYmIG5vZGUuZmluZCkpKTsgIC8vIFdlIGhhdmUgYW4gb24gYW5kIGZpbmQgbWV0aG9kIHBhcnQgb2YgalF1ZXJ5IEFQSS5cbn1cblxuLyoqXG4gKiBAcGFyYW0gc3RyICdrZXkxLGtleTIsLi4uJ1xuICogQHJldHVybnMge29iamVjdH0gaW4gdGhlIGZvcm0gb2Yge2tleTE6dHJ1ZSwga2V5Mjp0cnVlLCAuLi59XG4gKi9cbmZ1bmN0aW9uIG1ha2VNYXAoc3RyKSB7XG4gIHZhciBvYmogPSB7fSwgaXRlbXMgPSBzdHIuc3BsaXQoJywnKSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgb2JqW2l0ZW1zW2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuXG5mdW5jdGlvbiBub2RlTmFtZV8oZWxlbWVudCkge1xuICByZXR1cm4gbG93ZXJjYXNlKGVsZW1lbnQubm9kZU5hbWUgfHwgKGVsZW1lbnRbMF0gJiYgZWxlbWVudFswXS5ub2RlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlcyhhcnJheSwgb2JqKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBvYmopICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gYXJyYXlSZW1vdmUoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBpbmRleCA9IGFycmF5LmluZGV4T2YodmFsdWUpO1xuICBpZiAoaW5kZXggPj0gMCkge1xuICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5jb3B5XG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBgc291cmNlYCwgd2hpY2ggc2hvdWxkIGJlIGFuIG9iamVjdCBvciBhbiBhcnJheS5cbiAqXG4gKiAqIElmIG5vIGRlc3RpbmF0aW9uIGlzIHN1cHBsaWVkLCBhIGNvcHkgb2YgdGhlIG9iamVjdCBvciBhcnJheSBpcyBjcmVhdGVkLlxuICogKiBJZiBhIGRlc3RpbmF0aW9uIGlzIHByb3ZpZGVkLCBhbGwgb2YgaXRzIGVsZW1lbnRzIChmb3IgYXJyYXlzKSBvciBwcm9wZXJ0aWVzIChmb3Igb2JqZWN0cylcbiAqICAgYXJlIGRlbGV0ZWQgYW5kIHRoZW4gYWxsIGVsZW1lbnRzL3Byb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gaXQuXG4gKiAqIElmIGBzb3VyY2VgIGlzIG5vdCBhbiBvYmplY3Qgb3IgYXJyYXkgKGluYy4gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCksIGBzb3VyY2VgIGlzIHJldHVybmVkLlxuICogKiBJZiBgc291cmNlYCBpcyBpZGVudGljYWwgdG8gYGRlc3RpbmF0aW9uYCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG4gKlxuICogPGJyIC8+XG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogICBPbmx5IGVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgdGFrZW4gaW50byBhY2NvdW50LiBOb24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIChib3RoIG9uIGBzb3VyY2VgXG4gKiAgIGFuZCBvbiBgZGVzdGluYXRpb25gKSB3aWxsIGJlIGlnbm9yZWQuXG4gKiA8L2Rpdj5cbiAqXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBUaGUgc291cmNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1ha2UgYSBjb3B5LlxuICogICAgICAgICAgICAgICAgICAgQ2FuIGJlIGFueSB0eXBlLCBpbmNsdWRpbmcgcHJpbWl0aXZlcywgYG51bGxgLCBhbmQgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0geyhPYmplY3R8QXJyYXkpPX0gZGVzdGluYXRpb24gRGVzdGluYXRpb24gaW50byB3aGljaCB0aGUgc291cmNlIGlzIGNvcGllZC4gSWZcbiAqICAgICBwcm92aWRlZCwgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIGBzb3VyY2VgLlxuICogQHJldHVybnMgeyp9IFRoZSBjb3B5IG9yIHVwZGF0ZWQgYGRlc3RpbmF0aW9uYCwgaWYgYGRlc3RpbmF0aW9uYCB3YXMgc3BlY2lmaWVkLlxuICpcbiAqIEBleGFtcGxlXG4gIDxleGFtcGxlIG1vZHVsZT1cImNvcHlFeGFtcGxlXCIgbmFtZT1cImFuZ3VsYXItY29weVwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIGNsYXNzPVwic2ltcGxlLWZvcm1cIj5cbiAgICAgICAgICA8bGFiZWw+TmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJ1c2VyLm5hbWVcIiAvPjwvbGFiZWw+PGJyIC8+XG4gICAgICAgICAgPGxhYmVsPkFnZTogIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbmctbW9kZWw9XCJ1c2VyLmFnZVwiIC8+PC9sYWJlbD48YnIgLz5cbiAgICAgICAgICBHZW5kZXI6IDxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmctbW9kZWw9XCJ1c2VyLmdlbmRlclwiIHZhbHVlPVwibWFsZVwiIC8+bWFsZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5nLW1vZGVsPVwidXNlci5nZW5kZXJcIiB2YWx1ZT1cImZlbWFsZVwiIC8+ZmVtYWxlPC9sYWJlbD48YnIgLz5cbiAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwicmVzZXQoKVwiPlJFU0VUPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInVwZGF0ZSh1c2VyKVwiPlNBVkU8L2J1dHRvbj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgICA8cHJlPmZvcm0gPSB7e3VzZXIgfCBqc29ufX08L3ByZT5cbiAgICAgICAgPHByZT5tYXN0ZXIgPSB7e21hc3RlciB8IGpzb259fTwvcHJlPlxuICAgICAgPC9kaXY+XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgIC8vIE1vZHVsZTogY29weUV4YW1wbGVcbiAgICAgIGFuZ3VsYXIuXG4gICAgICAgIG1vZHVsZSgnY29weUV4YW1wbGUnLCBbXSkuXG4gICAgICAgIGNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAkc2NvcGUubWFzdGVyID0ge307XG5cbiAgICAgICAgICAkc2NvcGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIEV4YW1wbGUgd2l0aCAxIGFyZ3VtZW50XG4gICAgICAgICAgICAkc2NvcGUudXNlciA9IGFuZ3VsYXIuY29weSgkc2NvcGUubWFzdGVyKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgJHNjb3BlLnVwZGF0ZSA9IGZ1bmN0aW9uKHVzZXIpIHtcbiAgICAgICAgICAgIC8vIEV4YW1wbGUgd2l0aCAyIGFyZ3VtZW50c1xuICAgICAgICAgICAgYW5ndWxhci5jb3B5KHVzZXIsICRzY29wZS5tYXN0ZXIpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAkc2NvcGUucmVzZXQoKTtcbiAgICAgICAgfV0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiBjb3B5KHNvdXJjZSwgZGVzdGluYXRpb24pIHtcbiAgdmFyIHN0YWNrU291cmNlID0gW107XG4gIHZhciBzdGFja0Rlc3QgPSBbXTtcblxuICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICBpZiAoaXNUeXBlZEFycmF5KGRlc3RpbmF0aW9uKSB8fCBpc0FycmF5QnVmZmVyKGRlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmdNaW5FcnIoJ2NwdGEnLCAnQ2FuXFwndCBjb3B5ISBUeXBlZEFycmF5IGRlc3RpbmF0aW9uIGNhbm5vdCBiZSBtdXRhdGVkLicpO1xuICAgIH1cbiAgICBpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikge1xuICAgICAgdGhyb3cgbmdNaW5FcnIoJ2NwaScsICdDYW5cXCd0IGNvcHkhIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGlkZW50aWNhbC4nKTtcbiAgICB9XG5cbiAgICAvLyBFbXB0eSB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG4gICAgaWYgKGlzQXJyYXkoZGVzdGluYXRpb24pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JFYWNoKGRlc3RpbmF0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChrZXkgIT09ICckJGhhc2hLZXknKSB7XG4gICAgICAgICAgZGVsZXRlIGRlc3RpbmF0aW9uW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YWNrU291cmNlLnB1c2goc291cmNlKTtcbiAgICBzdGFja0Rlc3QucHVzaChkZXN0aW5hdGlvbik7XG4gICAgcmV0dXJuIGNvcHlSZWN1cnNlKHNvdXJjZSwgZGVzdGluYXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIGNvcHlFbGVtZW50KHNvdXJjZSk7XG5cbiAgZnVuY3Rpb24gY29weVJlY3Vyc2Uoc291cmNlLCBkZXN0aW5hdGlvbikge1xuICAgIHZhciBoID0gZGVzdGluYXRpb24uJCRoYXNoS2V5O1xuICAgIHZhciBrZXk7XG4gICAgaWYgKGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc291cmNlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgZGVzdGluYXRpb24ucHVzaChjb3B5RWxlbWVudChzb3VyY2VbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQmxhbmtPYmplY3Qoc291cmNlKSkge1xuICAgICAgLy8gY3JlYXRlTWFwKCkgZmFzdCBwYXRoIC0tLSBTYWZlIHRvIGF2b2lkIGhhc093blByb3BlcnR5IGNoZWNrIGJlY2F1c2UgcHJvdG90eXBlIGNoYWluIGlzIGVtcHR5XG4gICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KHNvdXJjZVtrZXldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvdXJjZSAmJiB0eXBlb2Ygc291cmNlLmhhc093blByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBTbG93IHBhdGgsIHdoaWNoIG11c3QgcmVseSBvbiBoYXNPd25Qcm9wZXJ0eVxuICAgICAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjb3B5RWxlbWVudChzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2xvd2VzdCBwYXRoIC0tLSBoYXNPd25Qcm9wZXJ0eSBjYW4ndCBiZSBjYWxsZWQgYXMgYSBtZXRob2RcbiAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICBkZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNldEhhc2hLZXkoZGVzdGluYXRpb24sIGgpO1xuICAgIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlFbGVtZW50KHNvdXJjZSkge1xuICAgIC8vIFNpbXBsZSB2YWx1ZXNcbiAgICBpZiAoIWlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBjb3BpZWQgdmFsdWVzXG4gICAgdmFyIGluZGV4ID0gc3RhY2tTb3VyY2UuaW5kZXhPZihzb3VyY2UpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBzdGFja0Rlc3RbaW5kZXhdO1xuICAgIH1cblxuICAgIGlmIChpc1dpbmRvdyhzb3VyY2UpIHx8IGlzU2NvcGUoc291cmNlKSkge1xuICAgICAgdGhyb3cgbmdNaW5FcnIoJ2Nwd3MnLFxuICAgICAgICAnQ2FuXFwndCBjb3B5ISBNYWtpbmcgY29waWVzIG9mIFdpbmRvdyBvciBTY29wZSBpbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZWN1cnNlID0gZmFsc2U7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gY29weVR5cGUoc291cmNlKTtcblxuICAgIGlmIChkZXN0aW5hdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbiA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDogT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICAgIG5lZWRzUmVjdXJzZSA9IHRydWU7XG4gICAgfVxuXG4gICAgc3RhY2tTb3VyY2UucHVzaChzb3VyY2UpO1xuICAgIHN0YWNrRGVzdC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuICAgIHJldHVybiBuZWVkc1JlY3Vyc2VcbiAgICAgID8gY29weVJlY3Vyc2Uoc291cmNlLCBkZXN0aW5hdGlvbilcbiAgICAgIDogZGVzdGluYXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBjb3B5VHlwZShzb3VyY2UpIHtcbiAgICBzd2l0Y2ggKHRvU3RyaW5nLmNhbGwoc291cmNlKSkge1xuICAgICAgY2FzZSAnW29iamVjdCBJbnQ4QXJyYXldJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgSW50MTZBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBJbnQzMkFycmF5XSc6XG4gICAgICBjYXNlICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBGbG9hdDY0QXJyYXldJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgVWludDhBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBVaW50MTZBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBVaW50MzJBcnJheV0nOlxuICAgICAgICByZXR1cm4gbmV3IHNvdXJjZS5jb25zdHJ1Y3Rvcihjb3B5RWxlbWVudChzb3VyY2UuYnVmZmVyKSwgc291cmNlLmJ5dGVPZmZzZXQsIHNvdXJjZS5sZW5ndGgpO1xuXG4gICAgICBjYXNlICdbb2JqZWN0IEFycmF5QnVmZmVyXSc6XG4gICAgICAgIC8vIFN1cHBvcnQ6IElFMTBcbiAgICAgICAgaWYgKCFzb3VyY2Uuc2xpY2UpIHtcbiAgICAgICAgICAvLyBJZiB3ZSdyZSBpbiB0aGlzIGNhc2Ugd2Uga25vdyB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydHMgQXJyYXlCdWZmZXJcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgIHZhciBjb3BpZWQgPSBuZXcgQXJyYXlCdWZmZXIoc291cmNlLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgIG5ldyBVaW50OEFycmF5KGNvcGllZCkuc2V0KG5ldyBVaW50OEFycmF5KHNvdXJjZSkpO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICAgICAgICByZXR1cm4gY29waWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoMCk7XG5cbiAgICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG4gICAgICBjYXNlICdbb2JqZWN0IERhdGVdJzpcbiAgICAgICAgcmV0dXJuIG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLnZhbHVlT2YoKSk7XG5cbiAgICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6XG4gICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLnRvU3RyaW5nKCkubWF0Y2goL1teL10qJC8pWzBdKTtcbiAgICAgICAgcmUubGFzdEluZGV4ID0gc291cmNlLmxhc3RJbmRleDtcbiAgICAgICAgcmV0dXJuIHJlO1xuXG4gICAgICBjYXNlICdbb2JqZWN0IEJsb2JdJzpcbiAgICAgICAgcmV0dXJuIG5ldyBzb3VyY2UuY29uc3RydWN0b3IoW3NvdXJjZV0sIHt0eXBlOiBzb3VyY2UudHlwZX0pO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKHNvdXJjZS5jbG9uZU5vZGUpKSB7XG4gICAgICByZXR1cm4gc291cmNlLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5lcXVhbHNcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIHR3byBvYmplY3RzIG9yIHR3byB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQuIFN1cHBvcnRzIHZhbHVlIHR5cGVzLCByZWd1bGFyXG4gKiBleHByZXNzaW9ucywgYXJyYXlzIGFuZCBvYmplY3RzLlxuICpcbiAqIFR3byBvYmplY3RzIG9yIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gKlxuICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIHBhc3MgYD09PWAgY29tcGFyaXNvbi5cbiAqICogQm90aCBvYmplY3RzIG9yIHZhbHVlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgYXJlIGVxdWFsIGJ5XG4gKiAgIGNvbXBhcmluZyB0aGVtIHdpdGggYGFuZ3VsYXIuZXF1YWxzYC5cbiAqICogQm90aCB2YWx1ZXMgYXJlIE5hTi4gKEluIEphdmFTY3JpcHQsIE5hTiA9PSBOYU4gPT4gZmFsc2UuIEJ1dCB3ZSBjb25zaWRlciB0d28gTmFOIGFzIGVxdWFsKVxuICogKiBCb3RoIHZhbHVlcyByZXByZXNlbnQgdGhlIHNhbWUgcmVndWxhciBleHByZXNzaW9uIChJbiBKYXZhU2NyaXB0LFxuICogICAvYWJjLyA9PSAvYWJjLyA9PiBmYWxzZS4gQnV0IHdlIGNvbnNpZGVyIHR3byByZWd1bGFyIGV4cHJlc3Npb25zIGFzIGVxdWFsIHdoZW4gdGhlaXIgdGV4dHVhbFxuICogICByZXByZXNlbnRhdGlvbiBtYXRjaGVzKS5cbiAqXG4gKiBEdXJpbmcgYSBwcm9wZXJ0eSBjb21wYXJpc29uLCBwcm9wZXJ0aWVzIG9mIGBmdW5jdGlvbmAgdHlwZSBhbmQgcHJvcGVydGllcyB3aXRoIG5hbWVzXG4gKiB0aGF0IGJlZ2luIHdpdGggYCRgIGFyZSBpZ25vcmVkLlxuICpcbiAqIFNjb3BlIGFuZCBET01XaW5kb3cgb2JqZWN0cyBhcmUgYmVpbmcgY29tcGFyZWQgb25seSBieSBpZGVudGlmeSAoYD09PWApLlxuICpcbiAqIEBwYXJhbSB7Kn0gbzEgT2JqZWN0IG9yIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG8yIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYXJndW1lbnRzIGFyZSBlcXVhbC5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwiZXF1YWxzRXhhbXBsZVwiIG5hbWU9XCJlcXVhbHNFeGFtcGxlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlPlxuICAgICAgICAgIDxoMz5Vc2VyIDE8L2gzPlxuICAgICAgICAgIE5hbWU6IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwidXNlcjEubmFtZVwiPlxuICAgICAgICAgIEFnZTogPGlucHV0IHR5cGU9XCJudW1iZXJcIiBuZy1tb2RlbD1cInVzZXIxLmFnZVwiPlxuXG4gICAgICAgICAgPGgzPlVzZXIgMjwvaDM+XG4gICAgICAgICAgTmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJ1c2VyMi5uYW1lXCI+XG4gICAgICAgICAgQWdlOiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwidXNlcjIuYWdlXCI+XG5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJDb21wYXJlXCIgbmctY2xpY2s9XCJjb21wYXJlKClcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBVc2VyIDE6IDxwcmU+e3t1c2VyMSB8IGpzb259fTwvcHJlPlxuICAgICAgICAgIFVzZXIgMjogPHByZT57e3VzZXIyIHwganNvbn19PC9wcmU+XG4gICAgICAgICAgRXF1YWw6IDxwcmU+e3tyZXN1bHR9fTwvcHJlPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgICBhbmd1bGFyLm1vZHVsZSgnZXF1YWxzRXhhbXBsZScsIFtdKS5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLnVzZXIxID0ge307XG4gICAgICAgICAgJHNjb3BlLnVzZXIyID0ge307XG4gICAgICAgICAgJHNjb3BlLmNvbXBhcmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICRzY29wZS5yZXN1bHQgPSBhbmd1bGFyLmVxdWFscygkc2NvcGUudXNlcjEsICRzY29wZS51c2VyMik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfV0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiBlcXVhbHMobzEsIG8yKSB7XG4gIGlmIChvMSA9PT0gbzIpIHJldHVybiB0cnVlO1xuICBpZiAobzEgPT09IG51bGwgfHwgbzIgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICBpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikgcmV0dXJuIHRydWU7IC8vIE5hTiA9PT0gTmFOXG4gIHZhciB0MSA9IHR5cGVvZiBvMSwgdDIgPSB0eXBlb2YgbzIsIGxlbmd0aCwga2V5LCBrZXlTZXQ7XG4gIGlmICh0MSA9PT0gdDIgJiYgdDEgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGlzQXJyYXkobzEpKSB7XG4gICAgICBpZiAoIWlzQXJyYXkobzIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoKGxlbmd0aCA9IG8xLmxlbmd0aCkgPT09IG8yLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHtcbiAgICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNEYXRlKG8xKSkge1xuICAgICAgaWYgKCFpc0RhdGUobzIpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZXF1YWxzKG8xLmdldFRpbWUoKSwgbzIuZ2V0VGltZSgpKTtcbiAgICB9IGVsc2UgaWYgKGlzUmVnRXhwKG8xKSkge1xuICAgICAgaWYgKCFpc1JlZ0V4cChvMikpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBvMS50b1N0cmluZygpID09PSBvMi50b1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNTY29wZShvMSkgfHwgaXNTY29wZShvMikgfHwgaXNXaW5kb3cobzEpIHx8IGlzV2luZG93KG8yKSB8fFxuICAgICAgICBpc0FycmF5KG8yKSB8fCBpc0RhdGUobzIpIHx8IGlzUmVnRXhwKG8yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAga2V5U2V0ID0gY3JlYXRlTWFwKCk7XG4gICAgICBmb3IgKGtleSBpbiBvMSkge1xuICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSA9PT0gJyQnIHx8IGlzRnVuY3Rpb24obzFba2V5XSkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGtleSBpbiBvMikge1xuICAgICAgICBpZiAoIShrZXkgaW4ga2V5U2V0KSAmJlxuICAgICAgICAgICAga2V5LmNoYXJBdCgwKSAhPT0gJyQnICYmXG4gICAgICAgICAgICBpc0RlZmluZWQobzJba2V5XSkgJiZcbiAgICAgICAgICAgICFpc0Z1bmN0aW9uKG8yW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgY3NwID0gZnVuY3Rpb24oKSB7XG4gIGlmICghaXNEZWZpbmVkKGNzcC5ydWxlcykpIHtcblxuXG4gICAgdmFyIG5nQ3NwRWxlbWVudCA9ICh3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25nLWNzcF0nKSB8fFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbmctY3NwXScpKTtcblxuICAgIGlmIChuZ0NzcEVsZW1lbnQpIHtcbiAgICAgIHZhciBuZ0NzcEF0dHJpYnV0ZSA9IG5nQ3NwRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25nLWNzcCcpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5nQ3NwRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmctY3NwJyk7XG4gICAgICBjc3AucnVsZXMgPSB7XG4gICAgICAgIG5vVW5zYWZlRXZhbDogIW5nQ3NwQXR0cmlidXRlIHx8IChuZ0NzcEF0dHJpYnV0ZS5pbmRleE9mKCduby11bnNhZmUtZXZhbCcpICE9PSAtMSksXG4gICAgICAgIG5vSW5saW5lU3R5bGU6ICFuZ0NzcEF0dHJpYnV0ZSB8fCAobmdDc3BBdHRyaWJ1dGUuaW5kZXhPZignbm8taW5saW5lLXN0eWxlJykgIT09IC0xKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3NwLnJ1bGVzID0ge1xuICAgICAgICBub1Vuc2FmZUV2YWw6IG5vVW5zYWZlRXZhbCgpLFxuICAgICAgICBub0lubGluZVN0eWxlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3NwLnJ1bGVzO1xuXG4gIGZ1bmN0aW9uIG5vVW5zYWZlRXZhbCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldywgbm8tbmV3LWZ1bmNcbiAgICAgIG5ldyBGdW5jdGlvbignJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBtb2R1bGUgbmdcbiAqIEBuYW1lIG5nSnFcbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdKcSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBhdmFpbGFibGUgdW5kZXIgYHdpbmRvd2BcbiAqIHRvIGJlIHVzZWQgZm9yIGFuZ3VsYXIuZWxlbWVudFxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2UgdGhpcyBkaXJlY3RpdmUgdG8gZm9yY2UgdGhlIGFuZ3VsYXIuZWxlbWVudCBsaWJyYXJ5LiAgVGhpcyBzaG91bGQgYmVcbiAqIHVzZWQgdG8gZm9yY2UgZWl0aGVyIGpxTGl0ZSBieSBsZWF2aW5nIG5nLWpxIGJsYW5rIG9yIHNldHRpbmcgdGhlIG5hbWUgb2ZcbiAqIHRoZSBqcXVlcnkgdmFyaWFibGUgdW5kZXIgd2luZG93IChlZy4galF1ZXJ5KS5cbiAqXG4gKiBTaW5jZSBhbmd1bGFyIGxvb2tzIGZvciB0aGlzIGRpcmVjdGl2ZSB3aGVuIGl0IGlzIGxvYWRlZCAoZG9lc24ndCB3YWl0IGZvciB0aGVcbiAqIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQpLCBpdCBtdXN0IGJlIHBsYWNlZCBvbiBhbiBlbGVtZW50IHRoYXQgY29tZXMgYmVmb3JlIHRoZSBzY3JpcHRcbiAqIHdoaWNoIGxvYWRzIGFuZ3VsYXIuIEFsc28sIG9ubHkgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGBuZy1qcWAgd2lsbCBiZSB1c2VkIGFuZCBhbGxcbiAqIG90aGVycyBpZ25vcmVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGZvcmNlIGpxTGl0ZSB1c2luZyB0aGUgYG5nSnFgIGRpcmVjdGl2ZSB0byB0aGUgYGh0bWxgIHRhZy5cbiBgYGBodG1sXG4gPCFkb2N0eXBlIGh0bWw+XG4gPGh0bWwgbmctYXBwIG5nLWpxPlxuIC4uLlxuIC4uLlxuIDwvaHRtbD5cbiBgYGBcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIGpRdWVyeSBiYXNlZCBsaWJyYXJ5IG9mIGEgZGlmZmVyZW50IG5hbWUuXG4gKiBUaGUgbGlicmFyeSBuYW1lIG11c3QgYmUgYXZhaWxhYmxlIGF0IHRoZSB0b3AgbW9zdCAnd2luZG93Jy5cbiBgYGBodG1sXG4gPCFkb2N0eXBlIGh0bWw+XG4gPGh0bWwgbmctYXBwIG5nLWpxPVwialF1ZXJ5TGliXCI+XG4gLi4uXG4gLi4uXG4gPC9odG1sPlxuIGBgYFxuICovXG52YXIganEgPSBmdW5jdGlvbigpIHtcbiAgaWYgKGlzRGVmaW5lZChqcS5uYW1lXykpIHJldHVybiBqcS5uYW1lXztcbiAgdmFyIGVsO1xuICB2YXIgaSwgaWkgPSBuZ0F0dHJQcmVmaXhlcy5sZW5ndGgsIHByZWZpeCwgbmFtZTtcbiAgZm9yIChpID0gMDsgaSA8IGlpOyArK2kpIHtcbiAgICBwcmVmaXggPSBuZ0F0dHJQcmVmaXhlc1tpXTtcbiAgICBlbCA9IHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbJyArIHByZWZpeC5yZXBsYWNlKCc6JywgJ1xcXFw6JykgKyAnanFdJyk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBuYW1lID0gZWwuZ2V0QXR0cmlidXRlKHByZWZpeCArICdqcScpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChqcS5uYW1lXyA9IG5hbWUpO1xufTtcblxuZnVuY3Rpb24gY29uY2F0KGFycmF5MSwgYXJyYXkyLCBpbmRleCkge1xuICByZXR1cm4gYXJyYXkxLmNvbmNhdChzbGljZS5jYWxsKGFycmF5MiwgaW5kZXgpKTtcbn1cblxuZnVuY3Rpb24gc2xpY2VBcmdzKGFyZ3MsIHN0YXJ0SW5kZXgpIHtcbiAgcmV0dXJuIHNsaWNlLmNhbGwoYXJncywgc3RhcnRJbmRleCB8fCAwKTtcbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5iaW5kXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIGZ1bmN0aW9uIGBmbmAgYm91bmQgdG8gYHNlbGZgIChgc2VsZmAgYmVjb21lcyB0aGUgYHRoaXNgIGZvclxuICogYGZuYCkuIFlvdSBjYW4gc3VwcGx5IG9wdGlvbmFsIGBhcmdzYCB0aGF0IGFyZSBwcmVib3VuZCB0byB0aGUgZnVuY3Rpb24uIFRoaXMgZmVhdHVyZSBpcyBhbHNvXG4gKiBrbm93biBhcyBbcGFydGlhbCBhcHBsaWNhdGlvbl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJ0aWFsX2FwcGxpY2F0aW9uKSwgYXNcbiAqIGRpc3Rpbmd1aXNoZWQgZnJvbSBbZnVuY3Rpb24gY3VycnlpbmddKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3VycnlpbmcjQ29udHJhc3Rfd2l0aF9wYXJ0aWFsX2Z1bmN0aW9uX2FwcGxpY2F0aW9uKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBDb250ZXh0IHdoaWNoIGBmbmAgc2hvdWxkIGJlIGV2YWx1YXRlZCBpbi5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZm4gRnVuY3Rpb24gdG8gYmUgYm91bmQuXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHByZWJvdW5kIHRvIHRoZSBgZm5gIGZ1bmN0aW9uIGNhbGwuXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gRnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgYGZuYCB3aXRoIGFsbCB0aGUgc3BlY2lmaWVkIGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiBiaW5kKHNlbGYsIGZuKSB7XG4gIHZhciBjdXJyeUFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IHNsaWNlQXJncyhhcmd1bWVudHMsIDIpIDogW107XG4gIGlmIChpc0Z1bmN0aW9uKGZuKSAmJiAhKGZuIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgIHJldHVybiBjdXJyeUFyZ3MubGVuZ3RoXG4gICAgICA/IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICAgICA/IGZuLmFwcGx5KHNlbGYsIGNvbmNhdChjdXJyeUFyZ3MsIGFyZ3VtZW50cywgMCkpXG4gICAgICAgICAgICA6IGZuLmFwcGx5KHNlbGYsIGN1cnJ5QXJncyk7XG4gICAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgICAgID8gZm4uYXBwbHkoc2VsZiwgYXJndW1lbnRzKVxuICAgICAgICAgICAgOiBmbi5jYWxsKHNlbGYpO1xuICAgICAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIEluIElFLCBuYXRpdmUgbWV0aG9kcyBhcmUgbm90IGZ1bmN0aW9ucyBzbyB0aGV5IGNhbm5vdCBiZSBib3VuZCAobm90ZTogdGhleSBkb24ndCBuZWVkIHRvIGJlKS5cbiAgICByZXR1cm4gZm47XG4gIH1cbn1cblxuXG5mdW5jdGlvbiB0b0pzb25SZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gIHZhciB2YWwgPSB2YWx1ZTtcblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LmNoYXJBdCgwKSA9PT0gJyQnICYmIGtleS5jaGFyQXQoMSkgPT09ICckJykge1xuICAgIHZhbCA9IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChpc1dpbmRvdyh2YWx1ZSkpIHtcbiAgICB2YWwgPSAnJFdJTkRPVyc7XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgIHdpbmRvdy5kb2N1bWVudCA9PT0gdmFsdWUpIHtcbiAgICB2YWwgPSAnJERPQ1VNRU5UJztcbiAgfSBlbHNlIGlmIChpc1Njb3BlKHZhbHVlKSkge1xuICAgIHZhbCA9ICckU0NPUEUnO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci50b0pzb25cbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXJpYWxpemVzIGlucHV0IGludG8gYSBKU09OLWZvcm1hdHRlZCBzdHJpbmcuIFByb3BlcnRpZXMgd2l0aCBsZWFkaW5nICQkIGNoYXJhY3RlcnMgd2lsbCBiZVxuICogc3RyaXBwZWQgc2luY2UgYW5ndWxhciB1c2VzIHRoaXMgbm90YXRpb24gaW50ZXJuYWxseS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxEYXRlfHN0cmluZ3xudW1iZXJ8Ym9vbGVhbn0gb2JqIElucHV0IHRvIGJlIHNlcmlhbGl6ZWQgaW50byBKU09OLlxuICogQHBhcmFtIHtib29sZWFufG51bWJlcn0gW3ByZXR0eT0yXSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIEpTT04gb3V0cHV0IHdpbGwgY29udGFpbiBuZXdsaW5lcyBhbmQgd2hpdGVzcGFjZS5cbiAqICAgIElmIHNldCB0byBhbiBpbnRlZ2VyLCB0aGUgSlNPTiBvdXRwdXQgd2lsbCBjb250YWluIHRoYXQgbWFueSBzcGFjZXMgcGVyIGluZGVudGF0aW9uLlxuICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IEpTT04taWZpZWQgc3RyaW5nIHJlcHJlc2VudGluZyBgb2JqYC5cbiAqIEBrbm93bklzc3VlXG4gKlxuICogVGhlIFNhZmFyaSBicm93c2VyIHRocm93cyBhIGBSYW5nZUVycm9yYCBpbnN0ZWFkIG9mIHJldHVybmluZyBgbnVsbGAgd2hlbiBpdCB0cmllcyB0byBzdHJpbmdpZnkgYSBgRGF0ZWBcbiAqIG9iamVjdCB3aXRoIGFuIGludmFsaWQgZGF0ZSB2YWx1ZS4gVGhlIG9ubHkgcmVsaWFibGUgd2F5IHRvIHByZXZlbnQgdGhpcyBpcyB0byBtb25rZXlwYXRjaCB0aGVcbiAqIGBEYXRlLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZCBhcyBmb2xsb3dzOlxuICpcbiAqIGBgYFxuICogdmFyIF9EYXRldG9KU09OID0gRGF0ZS5wcm90b3R5cGUudG9KU09OO1xuICogRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gKiAgIHRyeSB7XG4gKiAgICAgcmV0dXJuIF9EYXRldG9KU09OLmNhbGwodGhpcyk7XG4gKiAgIH0gY2F0Y2goZSkge1xuICogICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikge1xuICogICAgICAgcmV0dXJuIG51bGw7XG4gKiAgICAgfVxuICogICAgIHRocm93IGU7XG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzE0MjIxIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5mdW5jdGlvbiB0b0pzb24ob2JqLCBwcmV0dHkpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKG9iaikpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghaXNOdW1iZXIocHJldHR5KSkge1xuICAgIHByZXR0eSA9IHByZXR0eSA/IDIgOiBudWxsO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIHRvSnNvblJlcGxhY2VyLCBwcmV0dHkpO1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmZyb21Kc29uXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGVzZXJpYWxpemVzIGEgSlNPTiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGpzb24gSlNPTiBzdHJpbmcgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fEFycmF5fHN0cmluZ3xudW1iZXJ9IERlc2VyaWFsaXplZCBKU09OIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZnJvbUpzb24oanNvbikge1xuICByZXR1cm4gaXNTdHJpbmcoanNvbilcbiAgICAgID8gSlNPTi5wYXJzZShqc29uKVxuICAgICAgOiBqc29uO1xufVxuXG5cbnZhciBBTExfQ09MT05TID0gLzovZztcbmZ1bmN0aW9uIHRpbWV6b25lVG9PZmZzZXQodGltZXpvbmUsIGZhbGxiYWNrKSB7XG4gIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seSwgRWRnZSAxMy0xNCtcbiAgLy8gSUUvRWRnZSBkbyBub3QgXCJ1bmRlcnN0YW5kXCIgY29sb24gKGA6YCkgaW4gdGltZXpvbmVcbiAgdGltZXpvbmUgPSB0aW1lem9uZS5yZXBsYWNlKEFMTF9DT0xPTlMsICcnKTtcbiAgdmFyIHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0ID0gRGF0ZS5wYXJzZSgnSmFuIDAxLCAxOTcwIDAwOjAwOjAwICcgKyB0aW1lem9uZSkgLyA2MDAwMDtcbiAgcmV0dXJuIGlzTnVtYmVyTmFOKHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0KSA/IGZhbGxiYWNrIDogcmVxdWVzdGVkVGltZXpvbmVPZmZzZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkRGF0ZU1pbnV0ZXMoZGF0ZSwgbWludXRlcykge1xuICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyBtaW51dGVzKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cblxuZnVuY3Rpb24gY29udmVydFRpbWV6b25lVG9Mb2NhbChkYXRlLCB0aW1lem9uZSwgcmV2ZXJzZSkge1xuICByZXZlcnNlID0gcmV2ZXJzZSA/IC0xIDogMTtcbiAgdmFyIGRhdGVUaW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZGF0ZVRpbWV6b25lT2Zmc2V0KTtcbiAgcmV0dXJuIGFkZERhdGVNaW51dGVzKGRhdGUsIHJldmVyc2UgKiAodGltZXpvbmVPZmZzZXQgLSBkYXRlVGltZXpvbmVPZmZzZXQpKTtcbn1cblxuXG4vKipcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gc3RhcnRpbmdUYWcoZWxlbWVudCkge1xuICBlbGVtZW50ID0ganFMaXRlKGVsZW1lbnQpLmNsb25lKCk7XG4gIHRyeSB7XG4gICAgLy8gdHVybnMgb3V0IElFIGRvZXMgbm90IGxldCB5b3Ugc2V0IC5odG1sKCkgb24gZWxlbWVudHMgd2hpY2hcbiAgICAvLyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBjaGlsZHJlbi4gU28gd2UganVzdCBpZ25vcmUgaXQuXG4gICAgZWxlbWVudC5lbXB0eSgpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgdmFyIGVsZW1IdG1sID0ganFMaXRlKCc8ZGl2PicpLmFwcGVuZChlbGVtZW50KS5odG1sKCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVsZW1lbnRbMF0ubm9kZVR5cGUgPT09IE5PREVfVFlQRV9URVhUID8gbG93ZXJjYXNlKGVsZW1IdG1sKSA6XG4gICAgICAgIGVsZW1IdG1sLlxuICAgICAgICAgIG1hdGNoKC9eKDxbXj5dKz4pLylbMV0uXG4gICAgICAgICAgcmVwbGFjZSgvXjwoW1xcdy1dKykvLCBmdW5jdGlvbihtYXRjaCwgbm9kZU5hbWUpIHtyZXR1cm4gJzwnICsgbG93ZXJjYXNlKG5vZGVOYW1lKTt9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBsb3dlcmNhc2UoZWxlbUh0bWwpO1xuICB9XG5cbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogVHJpZXMgdG8gZGVjb2RlIHRoZSBVUkkgY29tcG9uZW50IHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc3RyIHZhbHVlIHBvdGVudGlhbCBVUkkgY29tcG9uZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBjYW4gYmUgZGVjb2RlZFxuICogd2l0aCB0aGUgZGVjb2RlVVJJQ29tcG9uZW50IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZSBhbnkgaW52YWxpZCB1cmkgY29tcG9uZW50LlxuICB9XG59XG5cblxuLyoqXG4gKiBQYXJzZXMgYW4gZXNjYXBlZCB1cmwgcXVlcnkgc3RyaW5nIGludG8ga2V5LXZhbHVlIHBhaXJzLlxuICogQHJldHVybnMge09iamVjdC48c3RyaW5nLGJvb2xlYW58QXJyYXk+fVxuICovXG5mdW5jdGlvbiBwYXJzZUtleVZhbHVlKC8qKnN0cmluZyova2V5VmFsdWUpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICBmb3JFYWNoKChrZXlWYWx1ZSB8fCAnJykuc3BsaXQoJyYnKSwgZnVuY3Rpb24oa2V5VmFsdWUpIHtcbiAgICB2YXIgc3BsaXRQb2ludCwga2V5LCB2YWw7XG4gICAgaWYgKGtleVZhbHVlKSB7XG4gICAgICBrZXkgPSBrZXlWYWx1ZSA9IGtleVZhbHVlLnJlcGxhY2UoL1xcKy9nLCclMjAnKTtcbiAgICAgIHNwbGl0UG9pbnQgPSBrZXlWYWx1ZS5pbmRleE9mKCc9Jyk7XG4gICAgICBpZiAoc3BsaXRQb2ludCAhPT0gLTEpIHtcbiAgICAgICAga2V5ID0ga2V5VmFsdWUuc3Vic3RyaW5nKDAsIHNwbGl0UG9pbnQpO1xuICAgICAgICB2YWwgPSBrZXlWYWx1ZS5zdWJzdHJpbmcoc3BsaXRQb2ludCArIDEpO1xuICAgICAgfVxuICAgICAga2V5ID0gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICBpZiAoaXNEZWZpbmVkKGtleSkpIHtcbiAgICAgICAgdmFsID0gaXNEZWZpbmVkKHZhbCkgPyB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsKSA6IHRydWU7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KG9ialtrZXldKSkge1xuICAgICAgICAgIG9ialtrZXldLnB1c2godmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmpba2V5XSA9IFtvYmpba2V5XSx2YWxdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gdG9LZXlWYWx1ZShvYmopIHtcbiAgdmFyIHBhcnRzID0gW107XG4gIGZvckVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbihhcnJheVZhbHVlKSB7XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5LCB0cnVlKSArXG4gICAgICAgICAgICAgICAgICAgKGFycmF5VmFsdWUgPT09IHRydWUgPyAnJyA6ICc9JyArIGVuY29kZVVyaVF1ZXJ5KGFycmF5VmFsdWUsIHRydWUpKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5LCB0cnVlKSArXG4gICAgICAgICAgICAgICAodmFsdWUgPT09IHRydWUgPyAnJyA6ICc9JyArIGVuY29kZVVyaVF1ZXJ5KHZhbHVlLCB0cnVlKSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPyBwYXJ0cy5qb2luKCcmJykgOiAnJztcbn1cblxuXG4vKipcbiAqIFdlIG5lZWQgb3VyIGN1c3RvbSBtZXRob2QgYmVjYXVzZSBlbmNvZGVVUklDb21wb25lbnQgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIGRvZXNuJ3QgZm9sbG93XG4gKiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTg2LnR4dCB3aXRoIHJlZ2FyZHMgdG8gdGhlIGNoYXJhY3RlciBzZXQgKHBjaGFyKSBhbGxvd2VkIGluIHBhdGhcbiAqIHNlZ21lbnRzOlxuICogICAgc2VnbWVudCAgICAgICA9ICpwY2hhclxuICogICAgcGNoYXIgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyBcIjpcIiAvIFwiQFwiXG4gKiAgICBwY3QtZW5jb2RlZCAgID0gXCIlXCIgSEVYRElHIEhFWERJR1xuICogICAgdW5yZXNlcnZlZCAgICA9IEFMUEhBIC8gRElHSVQgLyBcIi1cIiAvIFwiLlwiIC8gXCJfXCIgLyBcIn5cIlxuICogICAgc3ViLWRlbGltcyAgICA9IFwiIVwiIC8gXCIkXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIoXCIgLyBcIilcIlxuICogICAgICAgICAgICAgICAgICAgICAvIFwiKlwiIC8gXCIrXCIgLyBcIixcIiAvIFwiO1wiIC8gXCI9XCJcbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJpU2VnbWVudCh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVyaVF1ZXJ5KHZhbCwgdHJ1ZSkuXG4gICAgICAgICAgICAgcmVwbGFjZSgvJTI2L2dpLCAnJicpLlxuICAgICAgICAgICAgIHJlcGxhY2UoLyUzRC9naSwgJz0nKS5cbiAgICAgICAgICAgICByZXBsYWNlKC8lMkIvZ2ksICcrJyk7XG59XG5cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZW5jb2RpbmcgKmtleSogb3IgKnZhbHVlKiBwYXJ0cyBvZiBxdWVyeSBjb21wb25lbnQuIFdlIG5lZWQgYSBjdXN0b21cbiAqIG1ldGhvZCBiZWNhdXNlIGVuY29kZVVSSUNvbXBvbmVudCBpcyB0b28gYWdncmVzc2l2ZSBhbmQgZW5jb2RlcyBzdHVmZiB0aGF0IGRvZXNuJ3QgaGF2ZSB0byBiZVxuICogZW5jb2RlZCBwZXIgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NjpcbiAqICAgIHF1ZXJ5ICAgICAgICAgPSAqKCBwY2hhciAvIFwiL1wiIC8gXCI/XCIgKVxuICogICAgcGNoYXIgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyBcIjpcIiAvIFwiQFwiXG4gKiAgICB1bnJlc2VydmVkICAgID0gQUxQSEEgLyBESUdJVCAvIFwiLVwiIC8gXCIuXCIgLyBcIl9cIiAvIFwiflwiXG4gKiAgICBwY3QtZW5jb2RlZCAgID0gXCIlXCIgSEVYRElHIEhFWERJR1xuICogICAgc3ViLWRlbGltcyAgICA9IFwiIVwiIC8gXCIkXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIoXCIgLyBcIilcIlxuICogICAgICAgICAgICAgICAgICAgICAvIFwiKlwiIC8gXCIrXCIgLyBcIixcIiAvIFwiO1wiIC8gXCI9XCJcbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJpUXVlcnkodmFsLCBwY3RFbmNvZGVTcGFjZXMpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgICAgICAgICAgIHJlcGxhY2UoLyU0MC9naSwgJ0AnKS5cbiAgICAgICAgICAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgICAgICAgICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgICAgICAgICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgICAgICAgICAgIHJlcGxhY2UoLyUzQi9naSwgJzsnKS5cbiAgICAgICAgICAgICByZXBsYWNlKC8lMjAvZywgKHBjdEVuY29kZVNwYWNlcyA/ICclMjAnIDogJysnKSk7XG59XG5cbnZhciBuZ0F0dHJQcmVmaXhlcyA9IFsnbmctJywgJ2RhdGEtbmctJywgJ25nOicsICd4LW5nLSddO1xuXG5mdW5jdGlvbiBnZXROZ0F0dHJpYnV0ZShlbGVtZW50LCBuZ0F0dHIpIHtcbiAgdmFyIGF0dHIsIGksIGlpID0gbmdBdHRyUHJlZml4ZXMubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgaWk7ICsraSkge1xuICAgIGF0dHIgPSBuZ0F0dHJQcmVmaXhlc1tpXSArIG5nQXR0cjtcbiAgICBpZiAoaXNTdHJpbmcoYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpKSkge1xuICAgICAgcmV0dXJuIGF0dHI7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhbGxvd0F1dG9Cb290c3RyYXAoZG9jdW1lbnQpIHtcbiAgaWYgKCFkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGxpbmsuaHJlZiA9IHNyYztcbiAgaWYgKGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbiA9PT0gbGluay5vcmlnaW4pIHtcbiAgICAvLyBTYW1lLW9yaWdpbiByZXNvdXJjZXMgYXJlIGFsd2F5cyBhbGxvd2VkLCBldmVuIGZvciBub24td2hpdGVsaXN0ZWQgc2NoZW1lcy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBEaXNhYmxlZCBib290c3RyYXBwaW5nIHVubGVzcyBhbmd1bGFyLmpzIHdhcyBsb2FkZWQgZnJvbSBhIGtub3duIHNjaGVtZSB1c2VkIG9uIHRoZSB3ZWIuXG4gIC8vIFRoaXMgaXMgdG8gcHJldmVudCBhbmd1bGFyLmpzIGJ1bmRsZWQgd2l0aCBicm93c2VyIGV4dGVuc2lvbnMgZnJvbSBiZWluZyB1c2VkIHRvIGJ5cGFzcyB0aGVcbiAgLy8gY29udGVudCBzZWN1cml0eSBwb2xpY3kgaW4gd2ViIHBhZ2VzIGFuZCBvdGhlciBicm93c2VyIGV4dGVuc2lvbnMuXG4gIHN3aXRjaCAobGluay5wcm90b2NvbCkge1xuICAgIGNhc2UgJ2h0dHA6JzpcbiAgICBjYXNlICdodHRwczonOlxuICAgIGNhc2UgJ2Z0cDonOlxuICAgIGNhc2UgJ2Jsb2I6JzpcbiAgICBjYXNlICdmaWxlOic6XG4gICAgY2FzZSAnZGF0YTonOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBDYWNoZWQgYXMgaXQgaGFzIHRvIHJ1biBkdXJpbmcgbG9hZGluZyBzbyB0aGF0IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgaXMgYXZhaWxhYmxlLlxudmFyIGlzQXV0b0Jvb3RzdHJhcEFsbG93ZWQgPSBhbGxvd0F1dG9Cb290c3RyYXAod2luZG93LmRvY3VtZW50KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0FwcFxuICogQG1vZHVsZSBuZ1xuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHBhcmFtIHthbmd1bGFyLk1vZHVsZX0gbmdBcHAgYW4gb3B0aW9uYWwgYXBwbGljYXRpb25cbiAqICAge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZX0gbmFtZSB0byBsb2FkLlxuICogQHBhcmFtIHtib29sZWFuPX0gbmdTdHJpY3REaSBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBwcmVzZW50IG9uIHRoZSBhcHAgZWxlbWVudCwgdGhlIGluamVjdG9yIHdpbGwgYmVcbiAqICAgY3JlYXRlZCBpbiBcInN0cmljdC1kaVwiIG1vZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBmYWlsIHRvIGludm9rZSBmdW5jdGlvbnMgd2hpY2hcbiAqICAgZG8gbm90IHVzZSBleHBsaWNpdCBmdW5jdGlvbiBhbm5vdGF0aW9uIChhbmQgYXJlIHRodXMgdW5zdWl0YWJsZSBmb3IgbWluaWZpY2F0aW9uKSwgYXMgZGVzY3JpYmVkXG4gKiAgIGluIHtAbGluayBndWlkZS9kaSB0aGUgRGVwZW5kZW5jeSBJbmplY3Rpb24gZ3VpZGV9LCBhbmQgdXNlZnVsIGRlYnVnZ2luZyBpbmZvIHdpbGwgYXNzaXN0IGluXG4gKiAgIHRyYWNraW5nIGRvd24gdGhlIHJvb3Qgb2YgdGhlc2UgYnVncy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBVc2UgdGhpcyBkaXJlY3RpdmUgdG8gKiphdXRvLWJvb3RzdHJhcCoqIGFuIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbi4gVGhlIGBuZ0FwcGAgZGlyZWN0aXZlXG4gKiBkZXNpZ25hdGVzIHRoZSAqKnJvb3QgZWxlbWVudCoqIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgaXMgdHlwaWNhbGx5IHBsYWNlZCBuZWFyIHRoZSByb290IGVsZW1lbnRcbiAqIG9mIHRoZSBwYWdlIC0gZS5nLiBvbiB0aGUgYDxib2R5PmAgb3IgYDxodG1sPmAgdGFncy5cbiAqXG4gKiBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHRvIGtlZXAgaW4gbWluZCB3aGVuIHVzaW5nIGBuZ0FwcGA6XG4gKiAtIG9ubHkgb25lIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbiBjYW4gYmUgYXV0by1ib290c3RyYXBwZWQgcGVyIEhUTUwgZG9jdW1lbnQuIFRoZSBmaXJzdCBgbmdBcHBgXG4gKiAgIGZvdW5kIGluIHRoZSBkb2N1bWVudCB3aWxsIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSByb290IGVsZW1lbnQgdG8gYXV0by1ib290c3RyYXAgYXMgYW5cbiAqICAgYXBwbGljYXRpb24uIFRvIHJ1biBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgaW4gYW4gSFRNTCBkb2N1bWVudCB5b3UgbXVzdCBtYW51YWxseSBib290c3RyYXAgdGhlbSB1c2luZ1xuICogICB7QGxpbmsgYW5ndWxhci5ib290c3RyYXB9IGluc3RlYWQuXG4gKiAtIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbnMgY2Fubm90IGJlIG5lc3RlZCB3aXRoaW4gZWFjaCBvdGhlci5cbiAqIC0gRG8gbm90IHVzZSBhIGRpcmVjdGl2ZSB0aGF0IHVzZXMge0BsaW5rIG5nLiRjb21waWxlI3RyYW5zY2x1c2lvbiB0cmFuc2NsdXNpb259IG9uIHRoZSBzYW1lIGVsZW1lbnQgYXMgYG5nQXBwYC5cbiAqICAgVGhpcyBpbmNsdWRlcyBkaXJlY3RpdmVzIHN1Y2ggYXMge0BsaW5rIG5nLm5nSWYgYG5nSWZgfSwge0BsaW5rIG5nLm5nSW5jbHVkZSBgbmdJbmNsdWRlYH0gYW5kXG4gKiAgIHtAbGluayBuZ1JvdXRlLm5nVmlldyBgbmdWaWV3YH0uXG4gKiAgIERvaW5nIHRoaXMgbWlzcGxhY2VzIHRoZSBhcHAge0BsaW5rIG5nLiRyb290RWxlbWVudCBgJHJvb3RFbGVtZW50YH0gYW5kIHRoZSBhcHAncyB7QGxpbmsgYXV0by4kaW5qZWN0b3IgaW5qZWN0b3J9LFxuICogICBjYXVzaW5nIGFuaW1hdGlvbnMgdG8gc3RvcCB3b3JraW5nIGFuZCBtYWtpbmcgdGhlIGluamVjdG9yIGluYWNjZXNzaWJsZSBmcm9tIG91dHNpZGUgdGhlIGFwcC5cbiAqXG4gKiBZb3UgY2FuIHNwZWNpZnkgYW4gKipBbmd1bGFySlMgbW9kdWxlKiogdG8gYmUgdXNlZCBhcyB0aGUgcm9vdCBtb2R1bGUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXNcbiAqIG1vZHVsZSB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3J9IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGJvb3RzdHJhcHBlZC4gSXRcbiAqIHNob3VsZCBjb250YWluIHRoZSBhcHBsaWNhdGlvbiBjb2RlIG5lZWRlZCBvciBoYXZlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBtb2R1bGVzIHRoYXQgd2lsbFxuICogY29udGFpbiB0aGUgY29kZS4gU2VlIHtAbGluayBhbmd1bGFyLm1vZHVsZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogSW4gdGhlIGV4YW1wbGUgYmVsb3cgaWYgdGhlIGBuZ0FwcGAgZGlyZWN0aXZlIHdlcmUgbm90IHBsYWNlZCBvbiB0aGUgYGh0bWxgIGVsZW1lbnQgdGhlbiB0aGVcbiAqIGRvY3VtZW50IHdvdWxkIG5vdCBiZSBjb21waWxlZCwgdGhlIGBBcHBDb250cm9sbGVyYCB3b3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGFuZCB0aGUgYHt7IGErYiB9fWBcbiAqIHdvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBgM2AuXG4gKlxuICogYG5nQXBwYCBpcyB0aGUgZWFzaWVzdCwgYW5kIG1vc3QgY29tbW9uIHdheSB0byBib290c3RyYXAgYW4gYXBwbGljYXRpb24uXG4gKlxuIDxleGFtcGxlIG1vZHVsZT1cIm5nQXBwRGVtb1wiIG5hbWU9XCJuZy1hcHBcIj5cbiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJuZ0FwcERlbW9Db250cm9sbGVyXCI+XG4gICAgIEkgY2FuIGFkZDoge3thfX0gKyB7e2J9fSA9ICB7eyBhK2IgfX1cbiAgIDwvZGl2PlxuICAgPC9maWxlPlxuICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgYW5ndWxhci5tb2R1bGUoJ25nQXBwRGVtbycsIFtdKS5jb250cm9sbGVyKCduZ0FwcERlbW9Db250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICRzY29wZS5hID0gMTtcbiAgICAgJHNjb3BlLmIgPSAyO1xuICAgfSk7XG4gICA8L2ZpbGU+XG4gPC9leGFtcGxlPlxuICpcbiAqIFVzaW5nIGBuZ1N0cmljdERpYCwgeW91IHdvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzOlxuICpcbiA8ZXhhbXBsZSBuZy1hcHAtaW5jbHVkZWQ9XCJ0cnVlXCIgbmFtZT1cInN0cmljdC1kaVwiPlxuICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgIDxkaXYgbmctYXBwPVwibmdBcHBTdHJpY3REZW1vXCIgbmctc3RyaWN0LWRpPlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkdvb2RDb250cm9sbGVyMVwiPlxuICAgICAgICAgICBJIGNhbiBhZGQ6IHt7YX19ICsge3tifX0gPSAge3sgYStiIH19XG5cbiAgICAgICAgICAgPHA+VGhpcyByZW5kZXJzIGJlY2F1c2UgdGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgZmFpbCB0b1xuICAgICAgICAgICAgICBpbnN0YW50aWF0ZSwgYnkgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBzdHlsZSAoc2VlXG4gICAgICAgICAgICAgIHNjcmlwdC5qcyBmb3IgZGV0YWlscylcbiAgICAgICAgICAgPC9wPlxuICAgICAgIDwvZGl2PlxuXG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiR29vZENvbnRyb2xsZXIyXCI+XG4gICAgICAgICAgIE5hbWU6IDxpbnB1dCBuZy1tb2RlbD1cIm5hbWVcIj48YnIgLz5cbiAgICAgICAgICAgSGVsbG8sIHt7bmFtZX19IVxuXG4gICAgICAgICAgIDxwPlRoaXMgcmVuZGVycyBiZWNhdXNlIHRoZSBjb250cm9sbGVyIGRvZXMgbm90IGZhaWwgdG9cbiAgICAgICAgICAgICAgaW5zdGFudGlhdGUsIGJ5IHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb24gc3R5bGVcbiAgICAgICAgICAgICAgKHNlZSBzY3JpcHQuanMgZm9yIGRldGFpbHMpXG4gICAgICAgICAgIDwvcD5cbiAgICAgICA8L2Rpdj5cblxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkJhZENvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgSSBjYW4gYWRkOiB7e2F9fSArIHt7Yn19ID0gIHt7IGErYiB9fVxuXG4gICAgICAgICAgIDxwPlRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQsIGR1ZSB0byByZWx5aW5nXG4gICAgICAgICAgICAgIG9uIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9ucyAod2hpY2ggYXJlIGRpc2FibGVkIGluXG4gICAgICAgICAgICAgIHN0cmljdCBtb2RlKS4gQXMgc3VjaCwgdGhlIGNvbnRlbnQgb2YgdGhpcyBzZWN0aW9uIGlzIG5vdFxuICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWQsIGFuZCB0aGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgaW4geW91ciB3ZWIgY29uc29sZS5cbiAgICAgICAgICAgPC9wPlxuICAgICAgIDwvZGl2PlxuICAgPC9kaXY+XG4gICA8L2ZpbGU+XG4gICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICBhbmd1bGFyLm1vZHVsZSgnbmdBcHBTdHJpY3REZW1vJywgW10pXG4gICAgIC8vIEJhZENvbnRyb2xsZXIgd2lsbCBmYWlsIHRvIGluc3RhbnRpYXRlLCBkdWUgdG8gcmVseWluZyBvbiBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbixcbiAgICAgLy8gcmF0aGVyIHRoYW4gYW4gZXhwbGljaXQgYW5ub3RhdGlvblxuICAgICAuY29udHJvbGxlcignQmFkQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICRzY29wZS5hID0gMTtcbiAgICAgICAkc2NvcGUuYiA9IDI7XG4gICAgIH0pXG4gICAgIC8vIFVubGlrZSBCYWRDb250cm9sbGVyLCBHb29kQ29udHJvbGxlcjEgYW5kIEdvb2RDb250cm9sbGVyMiB3aWxsIG5vdCBmYWlsIHRvIGJlIGluc3RhbnRpYXRlZCxcbiAgICAgLy8gZHVlIHRvIHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb25zIHVzaW5nIHRoZSBhcnJheSBzdHlsZSBhbmQgJGluamVjdCBwcm9wZXJ0eSwgcmVzcGVjdGl2ZWx5LlxuICAgICAuY29udHJvbGxlcignR29vZENvbnRyb2xsZXIxJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAkc2NvcGUuYSA9IDE7XG4gICAgICAgJHNjb3BlLmIgPSAyO1xuICAgICB9XSlcbiAgICAgLmNvbnRyb2xsZXIoJ0dvb2RDb250cm9sbGVyMicsIEdvb2RDb250cm9sbGVyMik7XG4gICAgIGZ1bmN0aW9uIEdvb2RDb250cm9sbGVyMigkc2NvcGUpIHtcbiAgICAgICAkc2NvcGUubmFtZSA9ICdXb3JsZCc7XG4gICAgIH1cbiAgICAgR29vZENvbnRyb2xsZXIyLiRpbmplY3QgPSBbJyRzY29wZSddO1xuICAgPC9maWxlPlxuICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgZGl2W25nLWNvbnRyb2xsZXJdIHtcbiAgICAgICBtYXJnaW4tYm90dG9tOiAxZW07XG4gICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgIGJvcmRlcjogMXB4IHNvbGlkO1xuICAgICAgIHBhZGRpbmc6IC41ZW07XG4gICB9XG4gICBkaXZbbmctY29udHJvbGxlcl49R29vZF0ge1xuICAgICAgIGJvcmRlci1jb2xvcjogI2Q2ZTljNjtcbiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xuICAgICAgIGNvbG9yOiAjM2M3NjNkO1xuICAgfVxuICAgZGl2W25nLWNvbnRyb2xsZXJePUJhZF0ge1xuICAgICAgIGJvcmRlci1jb2xvcjogI2ViY2NkMTtcbiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xuICAgICAgIGNvbG9yOiAjYTk0NDQyO1xuICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICB9XG4gICA8L2ZpbGU+XG4gPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiBhbmd1bGFySW5pdChlbGVtZW50LCBib290c3RyYXApIHtcbiAgdmFyIGFwcEVsZW1lbnQsXG4gICAgICBtb2R1bGUsXG4gICAgICBjb25maWcgPSB7fTtcblxuICAvLyBUaGUgZWxlbWVudCBgZWxlbWVudGAgaGFzIHByaW9yaXR5IG92ZXIgYW55IG90aGVyIGVsZW1lbnQuXG4gIGZvckVhY2gobmdBdHRyUHJlZml4ZXMsIGZ1bmN0aW9uKHByZWZpeCkge1xuICAgIHZhciBuYW1lID0gcHJlZml4ICsgJ2FwcCc7XG5cbiAgICBpZiAoIWFwcEVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIGFwcEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgbW9kdWxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgfVxuICB9KTtcbiAgZm9yRWFjaChuZ0F0dHJQcmVmaXhlcywgZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnYXBwJztcbiAgICB2YXIgY2FuZGlkYXRlO1xuXG4gICAgaWYgKCFhcHBFbGVtZW50ICYmIChjYW5kaWRhdGUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1snICsgbmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JykgKyAnXScpKSkge1xuICAgICAgYXBwRWxlbWVudCA9IGNhbmRpZGF0ZTtcbiAgICAgIG1vZHVsZSA9IGNhbmRpZGF0ZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKGFwcEVsZW1lbnQpIHtcbiAgICBpZiAoIWlzQXV0b0Jvb3RzdHJhcEFsbG93ZWQpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yKCdBbmd1bGFyOiBkaXNhYmxpbmcgYXV0b21hdGljIGJvb3RzdHJhcC4gPHNjcmlwdD4gcHJvdG9jb2wgaW5kaWNhdGVzICcgK1xuICAgICAgICAgICdhbiBleHRlbnNpb24sIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgZG9lcyBub3QgbWF0Y2guJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbmZpZy5zdHJpY3REaSA9IGdldE5nQXR0cmlidXRlKGFwcEVsZW1lbnQsICdzdHJpY3QtZGknKSAhPT0gbnVsbDtcbiAgICBib290c3RyYXAoYXBwRWxlbWVudCwgbW9kdWxlID8gW21vZHVsZV0gOiBbXSwgY29uZmlnKTtcbiAgfVxufVxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5ib290c3RyYXBcbiAqIEBtb2R1bGUgbmdcbiAqIEBkZXNjcmlwdGlvblxuICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB7QGxpbmsgZ3VpZGUvYm9vdHN0cmFwIEJvb3RzdHJhcCBndWlkZX0uXG4gKlxuICogQW5ndWxhciB3aWxsIGRldGVjdCBpZiBpdCBoYXMgYmVlbiBsb2FkZWQgaW50byB0aGUgYnJvd3NlciBtb3JlIHRoYW4gb25jZSBhbmQgb25seSBhbGxvdyB0aGVcbiAqIGZpcnN0IGxvYWRlZCBzY3JpcHQgdG8gYmUgYm9vdHN0cmFwcGVkIGFuZCB3aWxsIHJlcG9ydCBhIHdhcm5pbmcgdG8gdGhlIGJyb3dzZXIgY29uc29sZSBmb3JcbiAqIGVhY2ggb2YgdGhlIHN1YnNlcXVlbnQgc2NyaXB0cy4gVGhpcyBwcmV2ZW50cyBzdHJhbmdlIHJlc3VsdHMgaW4gYXBwbGljYXRpb25zLCB3aGVyZSBvdGhlcndpc2VcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBBbmd1bGFyIHRyeSB0byB3b3JrIG9uIHRoZSBET00uXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqTm90ZToqKiBQcm90cmFjdG9yIGJhc2VkIGVuZC10by1lbmQgdGVzdHMgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGJvb3RzdHJhcCBtYW51YWxseS5cbiAqIFRoZXkgbXVzdCB1c2Uge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0FwcCBuZ0FwcH0uXG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIERvIG5vdCBib290c3RyYXAgdGhlIGFwcCBvbiBhbiBlbGVtZW50IHdpdGggYSBkaXJlY3RpdmUgdGhhdCB1c2VzIHtAbGluayBuZy4kY29tcGlsZSN0cmFuc2NsdXNpb24gdHJhbnNjbHVzaW9ufSxcbiAqIHN1Y2ggYXMge0BsaW5rIG5nLm5nSWYgYG5nSWZgfSwge0BsaW5rIG5nLm5nSW5jbHVkZSBgbmdJbmNsdWRlYH0gYW5kIHtAbGluayBuZ1JvdXRlLm5nVmlldyBgbmdWaWV3YH0uXG4gKiBEb2luZyB0aGlzIG1pc3BsYWNlcyB0aGUgYXBwIHtAbGluayBuZy4kcm9vdEVsZW1lbnQgYCRyb290RWxlbWVudGB9IGFuZCB0aGUgYXBwJ3Mge0BsaW5rIGF1dG8uJGluamVjdG9yIGluamVjdG9yfSxcbiAqIGNhdXNpbmcgYW5pbWF0aW9ucyB0byBzdG9wIHdvcmtpbmcgYW5kIG1ha2luZyB0aGUgaW5qZWN0b3IgaW5hY2Nlc3NpYmxlIGZyb20gb3V0c2lkZSB0aGUgYXBwLlxuICogPC9kaXY+XG4gKlxuICogYGBgaHRtbFxuICogPCFkb2N0eXBlIGh0bWw+XG4gKiA8aHRtbD5cbiAqIDxib2R5PlxuICogPGRpdiBuZy1jb250cm9sbGVyPVwiV2VsY29tZUNvbnRyb2xsZXJcIj5cbiAqICAge3tncmVldGluZ319XG4gKiA8L2Rpdj5cbiAqXG4gKiA8c2NyaXB0IHNyYz1cImFuZ3VsYXIuanNcIj48L3NjcmlwdD5cbiAqIDxzY3JpcHQ+XG4gKiAgIHZhciBhcHAgPSBhbmd1bGFyLm1vZHVsZSgnZGVtbycsIFtdKVxuICogICAuY29udHJvbGxlcignV2VsY29tZUNvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICRzY29wZS5ncmVldGluZyA9ICdXZWxjb21lISc7XG4gKiAgIH0pO1xuICogICBhbmd1bGFyLmJvb3RzdHJhcChkb2N1bWVudCwgWydkZW1vJ10pO1xuICogPC9zY3JpcHQ+XG4gKiA8L2JvZHk+XG4gKiA8L2h0bWw+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfEZ1bmN0aW9ufEFycmF5Pj19IG1vZHVsZXMgYW4gYXJyYXkgb2YgbW9kdWxlcyB0byBsb2FkIGludG8gdGhlIGFwcGxpY2F0aW9uLlxuICogICAgIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgcHJlZGVmaW5lZCBtb2R1bGUgb3IgYSAoREkgYW5ub3RhdGVkKVxuICogICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBpbmplY3RvciBhcyBhIGBjb25maWdgIGJsb2NrLlxuICogICAgIFNlZToge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZXN9XG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBhbiBvYmplY3QgZm9yIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGVcbiAqICAgICBmb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqICogYHN0cmljdERpYCAtIGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0b1xuICogICBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKlxuICogQHJldHVybnMge2F1dG8uJGluamVjdG9yfSBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIGluamVjdG9yIGZvciB0aGlzIGFwcC5cbiAqL1xuZnVuY3Rpb24gYm9vdHN0cmFwKGVsZW1lbnQsIG1vZHVsZXMsIGNvbmZpZykge1xuICBpZiAoIWlzT2JqZWN0KGNvbmZpZykpIGNvbmZpZyA9IHt9O1xuICB2YXIgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBzdHJpY3REaTogZmFsc2VcbiAgfTtcbiAgY29uZmlnID0gZXh0ZW5kKGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG4gIHZhciBkb0Jvb3RzdHJhcCA9IGZ1bmN0aW9uKCkge1xuICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudC5pbmplY3RvcigpKSB7XG4gICAgICB2YXIgdGFnID0gKGVsZW1lbnRbMF0gPT09IHdpbmRvdy5kb2N1bWVudCkgPyAnZG9jdW1lbnQnIDogc3RhcnRpbmdUYWcoZWxlbWVudCk7XG4gICAgICAvLyBFbmNvZGUgYW5nbGUgYnJhY2tldHMgdG8gcHJldmVudCBpbnB1dCBmcm9tIGJlaW5nIHNhbml0aXplZCB0byBlbXB0eSBzdHJpbmcgIzg2ODMuXG4gICAgICB0aHJvdyBuZ01pbkVycihcbiAgICAgICAgICAnYnRzdHJwZCcsXG4gICAgICAgICAgJ0FwcCBhbHJlYWR5IGJvb3RzdHJhcHBlZCB3aXRoIHRoaXMgZWxlbWVudCBcXCd7MH1cXCcnLFxuICAgICAgICAgIHRhZy5yZXBsYWNlKC88LywnJmx0OycpLnJlcGxhY2UoLz4vLCcmZ3Q7JykpO1xuICAgIH1cblxuICAgIG1vZHVsZXMgPSBtb2R1bGVzIHx8IFtdO1xuICAgIG1vZHVsZXMudW5zaGlmdChbJyRwcm92aWRlJywgZnVuY3Rpb24oJHByb3ZpZGUpIHtcbiAgICAgICRwcm92aWRlLnZhbHVlKCckcm9vdEVsZW1lbnQnLCBlbGVtZW50KTtcbiAgICB9XSk7XG5cbiAgICBpZiAoY29uZmlnLmRlYnVnSW5mb0VuYWJsZWQpIHtcbiAgICAgIC8vIFB1c2hpbmcgc28gdGhhdCB0aGlzIG92ZXJyaWRlcyBgZGVidWdJbmZvRW5hYmxlZGAgc2V0dGluZyBkZWZpbmVkIGluIHVzZXIncyBgbW9kdWxlc2AuXG4gICAgICBtb2R1bGVzLnB1c2goWyckY29tcGlsZVByb3ZpZGVyJywgZnVuY3Rpb24oJGNvbXBpbGVQcm92aWRlcikge1xuICAgICAgICAkY29tcGlsZVByb3ZpZGVyLmRlYnVnSW5mb0VuYWJsZWQodHJ1ZSk7XG4gICAgICB9XSk7XG4gICAgfVxuXG4gICAgbW9kdWxlcy51bnNoaWZ0KCduZycpO1xuICAgIHZhciBpbmplY3RvciA9IGNyZWF0ZUluamVjdG9yKG1vZHVsZXMsIGNvbmZpZy5zdHJpY3REaSk7XG4gICAgaW5qZWN0b3IuaW52b2tlKFsnJHJvb3RTY29wZScsICckcm9vdEVsZW1lbnQnLCAnJGNvbXBpbGUnLCAnJGluamVjdG9yJyxcbiAgICAgICBmdW5jdGlvbiBib290c3RyYXBBcHBseShzY29wZSwgZWxlbWVudCwgY29tcGlsZSwgaW5qZWN0b3IpIHtcbiAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW1lbnQuZGF0YSgnJGluamVjdG9yJywgaW5qZWN0b3IpO1xuICAgICAgICAgIGNvbXBpbGUoZWxlbWVudCkoc2NvcGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1dXG4gICAgKTtcbiAgICByZXR1cm4gaW5qZWN0b3I7XG4gIH07XG5cbiAgdmFyIE5HX0VOQUJMRV9ERUJVR19JTkZPID0gL15OR19FTkFCTEVfREVCVUdfSU5GTyEvO1xuICB2YXIgTkdfREVGRVJfQk9PVFNUUkFQID0gL15OR19ERUZFUl9CT09UU1RSQVAhLztcblxuICBpZiAod2luZG93ICYmIE5HX0VOQUJMRV9ERUJVR19JTkZPLnRlc3Qod2luZG93Lm5hbWUpKSB7XG4gICAgY29uZmlnLmRlYnVnSW5mb0VuYWJsZWQgPSB0cnVlO1xuICAgIHdpbmRvdy5uYW1lID0gd2luZG93Lm5hbWUucmVwbGFjZShOR19FTkFCTEVfREVCVUdfSU5GTywgJycpO1xuICB9XG5cbiAgaWYgKHdpbmRvdyAmJiAhTkdfREVGRVJfQk9PVFNUUkFQLnRlc3Qod2luZG93Lm5hbWUpKSB7XG4gICAgcmV0dXJuIGRvQm9vdHN0cmFwKCk7XG4gIH1cblxuICB3aW5kb3cubmFtZSA9IHdpbmRvdy5uYW1lLnJlcGxhY2UoTkdfREVGRVJfQk9PVFNUUkFQLCAnJyk7XG4gIGFuZ3VsYXIucmVzdW1lQm9vdHN0cmFwID0gZnVuY3Rpb24oZXh0cmFNb2R1bGVzKSB7XG4gICAgZm9yRWFjaChleHRyYU1vZHVsZXMsIGZ1bmN0aW9uKG1vZHVsZSkge1xuICAgICAgbW9kdWxlcy5wdXNoKG1vZHVsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvQm9vdHN0cmFwKCk7XG4gIH07XG5cbiAgaWYgKGlzRnVuY3Rpb24oYW5ndWxhci5yZXN1bWVEZWZlcnJlZEJvb3RzdHJhcCkpIHtcbiAgICBhbmd1bGFyLnJlc3VtZURlZmVycmVkQm9vdHN0cmFwKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIucmVsb2FkV2l0aERlYnVnSW5mb1xuICogQG1vZHVsZSBuZ1xuICogQGRlc2NyaXB0aW9uXG4gKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZWxvYWQgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbiB0dXJuZWQgb24uXG4gKiBUaGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhIGNhbGwgdG8gYCRjb21waWxlUHJvdmlkZXIuZGVidWdJbmZvRW5hYmxlZChmYWxzZSlgLlxuICpcbiAqIFNlZSB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkZWJ1Z0luZm9FbmFibGVkfSBmb3IgbW9yZS5cbiAqL1xuZnVuY3Rpb24gcmVsb2FkV2l0aERlYnVnSW5mbygpIHtcbiAgd2luZG93Lm5hbWUgPSAnTkdfRU5BQkxFX0RFQlVHX0lORk8hJyArIHdpbmRvdy5uYW1lO1xuICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG59XG5cbi8qKlxuICogQG5hbWUgYW5ndWxhci5nZXRUZXN0YWJpbGl0eVxuICogQG1vZHVsZSBuZ1xuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHRlc3RhYmlsaXR5IHNlcnZpY2UgZm9yIHRoZSBpbnN0YW5jZSBvZiBBbmd1bGFyIG9uIHRoZSBnaXZlblxuICogZWxlbWVudC5cbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLlxuICovXG5mdW5jdGlvbiBnZXRUZXN0YWJpbGl0eShyb290RWxlbWVudCkge1xuICB2YXIgaW5qZWN0b3IgPSBhbmd1bGFyLmVsZW1lbnQocm9vdEVsZW1lbnQpLmluamVjdG9yKCk7XG4gIGlmICghaW5qZWN0b3IpIHtcbiAgICB0aHJvdyBuZ01pbkVycigndGVzdCcsXG4gICAgICAnbm8gaW5qZWN0b3IgZm91bmQgZm9yIGVsZW1lbnQgYXJndW1lbnQgdG8gZ2V0VGVzdGFiaWxpdHknKTtcbiAgfVxuICByZXR1cm4gaW5qZWN0b3IuZ2V0KCckJHRlc3RhYmlsaXR5Jyk7XG59XG5cbnZhciBTTkFLRV9DQVNFX1JFR0VYUCA9IC9bQS1aXS9nO1xuZnVuY3Rpb24gc25ha2VfY2FzZShuYW1lLCBzZXBhcmF0b3IpIHtcbiAgc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICdfJztcbiAgcmV0dXJuIG5hbWUucmVwbGFjZShTTkFLRV9DQVNFX1JFR0VYUCwgZnVuY3Rpb24obGV0dGVyLCBwb3MpIHtcbiAgICByZXR1cm4gKHBvcyA/IHNlcGFyYXRvciA6ICcnKSArIGxldHRlci50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxudmFyIGJpbmRKUXVlcnlGaXJlZCA9IGZhbHNlO1xuZnVuY3Rpb24gYmluZEpRdWVyeSgpIHtcbiAgdmFyIG9yaWdpbmFsQ2xlYW5EYXRhO1xuXG4gIGlmIChiaW5kSlF1ZXJ5RmlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBiaW5kIHRvIGpRdWVyeSBpZiBwcmVzZW50O1xuICB2YXIganFOYW1lID0ganEoKTtcbiAgalF1ZXJ5ID0gaXNVbmRlZmluZWQoanFOYW1lKSA/IHdpbmRvdy5qUXVlcnkgOiAgIC8vIHVzZSBqUXVlcnkgKGlmIHByZXNlbnQpXG4gICAgICAgICAgICFqcU5hbWUgICAgICAgICAgICAgPyB1bmRlZmluZWQgICAgIDogICAvLyB1c2UganFMaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbanFOYW1lXTsgICAvLyB1c2UgalF1ZXJ5IHNwZWNpZmllZCBieSBgbmdKcWBcblxuICAvLyBVc2UgalF1ZXJ5IGlmIGl0IGV4aXN0cyB3aXRoIHByb3BlciBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2UgZGVmYXVsdCB0byB1cy5cbiAgLy8gQW5ndWxhciAxLjIrIHJlcXVpcmVzIGpRdWVyeSAxLjcrIGZvciBvbigpL29mZigpIHN1cHBvcnQuXG4gIC8vIEFuZ3VsYXIgMS4zKyB0ZWNobmljYWxseSByZXF1aXJlcyBhdCBsZWFzdCBqUXVlcnkgMi4xKyBidXQgaXQgbWF5IHdvcmsgd2l0aCBvbGRlclxuICAvLyB2ZXJzaW9ucy4gSXQgd2lsbCBub3Qgd29yayBmb3Igc3VyZSB3aXRoIGpRdWVyeSA8MS43LCB0aG91Z2guXG4gIGlmIChqUXVlcnkgJiYgalF1ZXJ5LmZuLm9uKSB7XG4gICAganFMaXRlID0galF1ZXJ5O1xuICAgIGV4dGVuZChqUXVlcnkuZm4sIHtcbiAgICAgIHNjb3BlOiBKUUxpdGVQcm90b3R5cGUuc2NvcGUsXG4gICAgICBpc29sYXRlU2NvcGU6IEpRTGl0ZVByb3RvdHlwZS5pc29sYXRlU2NvcGUsXG4gICAgICBjb250cm9sbGVyOiBKUUxpdGVQcm90b3R5cGUuY29udHJvbGxlcixcbiAgICAgIGluamVjdG9yOiBKUUxpdGVQcm90b3R5cGUuaW5qZWN0b3IsXG4gICAgICBpbmhlcml0ZWREYXRhOiBKUUxpdGVQcm90b3R5cGUuaW5oZXJpdGVkRGF0YVxuICAgIH0pO1xuXG4gICAgLy8gQWxsIG5vZGVzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIHZpYSB2YXJpb3VzIGpRdWVyeSBBUElzIGxpa2UgLnJlbW92ZSgpXG4gICAgLy8gYXJlIHBhc3NlZCB0aHJvdWdoIGpRdWVyeS5jbGVhbkRhdGEuIE1vbmtleS1wYXRjaCB0aGlzIG1ldGhvZCB0byBmaXJlXG4gICAgLy8gdGhlICRkZXN0cm95IGV2ZW50IG9uIGFsbCByZW1vdmVkIG5vZGVzLlxuICAgIG9yaWdpbmFsQ2xlYW5EYXRhID0galF1ZXJ5LmNsZWFuRGF0YTtcbiAgICBqUXVlcnkuY2xlYW5EYXRhID0gZnVuY3Rpb24oZWxlbXMpIHtcbiAgICAgIHZhciBldmVudHM7XG4gICAgICBmb3IgKHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrKSB7XG4gICAgICAgIGV2ZW50cyA9IGpRdWVyeS5fZGF0YShlbGVtLCAnZXZlbnRzJyk7XG4gICAgICAgIGlmIChldmVudHMgJiYgZXZlbnRzLiRkZXN0cm95KSB7XG4gICAgICAgICAgalF1ZXJ5KGVsZW0pLnRyaWdnZXJIYW5kbGVyKCckZGVzdHJveScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvcmlnaW5hbENsZWFuRGF0YShlbGVtcyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBqcUxpdGUgPSBKUUxpdGU7XG4gIH1cblxuICBhbmd1bGFyLmVsZW1lbnQgPSBqcUxpdGU7XG5cbiAgLy8gUHJldmVudCBkb3VibGUtcHJveHlpbmcuXG4gIGJpbmRKUXVlcnlGaXJlZCA9IHRydWU7XG59XG5cbi8qKlxuICogdGhyb3cgZXJyb3IgaWYgdGhlIGFyZ3VtZW50IGlzIGZhbHN5LlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcmcoYXJnLCBuYW1lLCByZWFzb24pIHtcbiAgaWYgKCFhcmcpIHtcbiAgICB0aHJvdyBuZ01pbkVycignYXJlcScsICdBcmd1bWVudCBcXCd7MH1cXCcgaXMgezF9JywgKG5hbWUgfHwgJz8nKSwgKHJlYXNvbiB8fCAncmVxdWlyZWQnKSk7XG4gIH1cbiAgcmV0dXJuIGFyZztcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QXJnRm4oYXJnLCBuYW1lLCBhY2NlcHRBcnJheUFubm90YXRpb24pIHtcbiAgaWYgKGFjY2VwdEFycmF5QW5ub3RhdGlvbiAmJiBpc0FycmF5KGFyZykpIHtcbiAgICAgIGFyZyA9IGFyZ1thcmcubGVuZ3RoIC0gMV07XG4gIH1cblxuICBhc3NlcnRBcmcoaXNGdW5jdGlvbihhcmcpLCBuYW1lLCAnbm90IGEgZnVuY3Rpb24sIGdvdCAnICtcbiAgICAgIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBhcmcuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JyA6IHR5cGVvZiBhcmcpKTtcbiAgcmV0dXJuIGFyZztcbn1cblxuLyoqXG4gKiB0aHJvdyBlcnJvciBpZiB0aGUgbmFtZSBnaXZlbiBpcyBoYXNPd25Qcm9wZXJ0eVxuICogQHBhcmFtICB7U3RyaW5nfSBuYW1lICAgIHRoZSBuYW1lIHRvIHRlc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gY29udGV4dCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbmFtZSBpcyB1c2VkLCBzdWNoIGFzIG1vZHVsZSBvciBkaXJlY3RpdmVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgY29udGV4dCkge1xuICBpZiAobmFtZSA9PT0gJ2hhc093blByb3BlcnR5Jykge1xuICAgIHRocm93IG5nTWluRXJyKCdiYWRuYW1lJywgJ2hhc093blByb3BlcnR5IGlzIG5vdCBhIHZhbGlkIHswfSBuYW1lJywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHZhbHVlIGFjY2Vzc2libGUgZnJvbSB0aGUgb2JqZWN0IGJ5IHBhdGguIEFueSB1bmRlZmluZWQgdHJhdmVyc2FscyBhcmUgaWdub3JlZFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBzdGFydGluZyBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHBhdGggdG8gdHJhdmVyc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JpbmRGblRvU2NvcGU9dHJ1ZV1cbiAqIEByZXR1cm5zIHtPYmplY3R9IHZhbHVlIGFzIGFjY2Vzc2libGUgYnkgcGF0aFxuICovXG4vL1RPRE8obWlza28pOiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJlbW92ZWRcbmZ1bmN0aW9uIGdldHRlcihvYmosIHBhdGgsIGJpbmRGblRvU2NvcGUpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gb2JqO1xuICB2YXIga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIGtleTtcbiAgdmFyIGxhc3RJbnN0YW5jZSA9IG9iajtcbiAgdmFyIGxlbiA9IGtleXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChvYmopIHtcbiAgICAgIG9iaiA9IChsYXN0SW5zdGFuY2UgPSBvYmopW2tleV07XG4gICAgfVxuICB9XG4gIGlmICghYmluZEZuVG9TY29wZSAmJiBpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICByZXR1cm4gYmluZChsYXN0SW5zdGFuY2UsIG9iaik7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIERPTSBzaWJsaW5ncyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IGxpa2Ugb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9IHRoZSBpbnB1dHRlZCBvYmplY3Qgb3IgYSBqcUxpdGUgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBub2Rlc1xuICovXG5mdW5jdGlvbiBnZXRCbG9ja05vZGVzKG5vZGVzKSB7XG4gIC8vIFRPRE8ocGVyZik6IHVwZGF0ZSBgbm9kZXNgIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb2JqZWN0P1xuICB2YXIgbm9kZSA9IG5vZGVzWzBdO1xuICB2YXIgZW5kTm9kZSA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xuICB2YXIgYmxvY2tOb2RlcztcblxuICBmb3IgKHZhciBpID0gMTsgbm9kZSAhPT0gZW5kTm9kZSAmJiAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpOyBpKyspIHtcbiAgICBpZiAoYmxvY2tOb2RlcyB8fCBub2Rlc1tpXSAhPT0gbm9kZSkge1xuICAgICAgaWYgKCFibG9ja05vZGVzKSB7XG4gICAgICAgIGJsb2NrTm9kZXMgPSBqcUxpdGUoc2xpY2UuY2FsbChub2RlcywgMCwgaSkpO1xuICAgICAgfVxuICAgICAgYmxvY2tOb2Rlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBibG9ja05vZGVzIHx8IG5vZGVzO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aG91dCBhIHByb3RvdHlwZS4gVGhpcyBvYmplY3QgaXMgdXNlZnVsIGZvciBsb29rdXAgd2l0aG91dCBoYXZpbmcgdG9cbiAqIGd1YXJkIGFnYWluc3QgcHJvdG90eXBpY2FsbHkgaW5oZXJpdGVkIHByb3BlcnRpZXMgdmlhIGhhc093blByb3BlcnR5LlxuICpcbiAqIFJlbGF0ZWQgbWljcm8tYmVuY2htYXJrczpcbiAqIC0gaHR0cDovL2pzcGVyZi5jb20vb2JqZWN0LWNyZWF0ZTJcbiAqIC0gaHR0cDovL2pzcGVyZi5jb20vcHJvdG8tbWFwLWxvb2t1cC8yXG4gKiAtIGh0dHA6Ly9qc3BlcmYuY29tL2Zvci1pbi12cy1vYmplY3Qta2V5czJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBjcmVhdGVNYXAoKSB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHsgLy8gbnVsbCB8fCB1bmRlZmluZWRcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoaGFzQ3VzdG9tVG9TdHJpbmcodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHRvSnNvbih2YWx1ZSk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBOT0RFX1RZUEVfRUxFTUVOVCA9IDE7XG52YXIgTk9ERV9UWVBFX0FUVFJJQlVURSA9IDI7XG52YXIgTk9ERV9UWVBFX1RFWFQgPSAzO1xudmFyIE5PREVfVFlQRV9DT01NRU5UID0gODtcbnZhciBOT0RFX1RZUEVfRE9DVU1FTlQgPSA5O1xudmFyIE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCA9IDExO1xuXG4vKipcbiAqIEBuZ2RvYyB0eXBlXG4gKiBAbmFtZSBhbmd1bGFyLk1vZHVsZVxuICogQG1vZHVsZSBuZ1xuICogQGRlc2NyaXB0aW9uXG4gKlxuICogSW50ZXJmYWNlIGZvciBjb25maWd1cmluZyBhbmd1bGFyIHtAbGluayBhbmd1bGFyLm1vZHVsZSBtb2R1bGVzfS5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cE1vZHVsZUxvYWRlcih3aW5kb3cpIHtcblxuICB2YXIgJGluamVjdG9yTWluRXJyID0gbWluRXJyKCckaW5qZWN0b3InKTtcbiAgdmFyIG5nTWluRXJyID0gbWluRXJyKCduZycpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZShvYmosIG5hbWUsIGZhY3RvcnkpIHtcbiAgICByZXR1cm4gb2JqW25hbWVdIHx8IChvYmpbbmFtZV0gPSBmYWN0b3J5KCkpO1xuICB9XG5cbiAgdmFyIGFuZ3VsYXIgPSBlbnN1cmUod2luZG93LCAnYW5ndWxhcicsIE9iamVjdCk7XG5cbiAgLy8gV2UgbmVlZCB0byBleHBvc2UgYGFuZ3VsYXIuJCRtaW5FcnJgIHRvIG1vZHVsZXMgc3VjaCBhcyBgbmdSZXNvdXJjZWAgdGhhdCByZWZlcmVuY2UgaXQgZHVyaW5nIGJvb3RzdHJhcFxuICBhbmd1bGFyLiQkbWluRXJyID0gYW5ndWxhci4kJG1pbkVyciB8fCBtaW5FcnI7XG5cbiAgcmV0dXJuIGVuc3VyZShhbmd1bGFyLCAnbW9kdWxlJywgZnVuY3Rpb24oKSB7XG4gICAgLyoqIEB0eXBlIHtPYmplY3QuPHN0cmluZywgYW5ndWxhci5Nb2R1bGU+fSAqL1xuICAgIHZhciBtb2R1bGVzID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgZnVuY3Rpb25cbiAgICAgKiBAbmFtZSBhbmd1bGFyLm1vZHVsZVxuICAgICAqIEBtb2R1bGUgbmdcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKlxuICAgICAqIFRoZSBgYW5ndWxhci5tb2R1bGVgIGlzIGEgZ2xvYmFsIHBsYWNlIGZvciBjcmVhdGluZywgcmVnaXN0ZXJpbmcgYW5kIHJldHJpZXZpbmcgQW5ndWxhclxuICAgICAqIG1vZHVsZXMuXG4gICAgICogQWxsIG1vZHVsZXMgKGFuZ3VsYXIgY29yZSBvciAzcmQgcGFydHkpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSB0byBhbiBhcHBsaWNhdGlvbiBtdXN0IGJlXG4gICAgICogcmVnaXN0ZXJlZCB1c2luZyB0aGlzIG1lY2hhbmlzbS5cbiAgICAgKlxuICAgICAqIFBhc3Npbmcgb25lIGFyZ3VtZW50IHJldHJpZXZlcyBhbiBleGlzdGluZyB7QGxpbmsgYW5ndWxhci5Nb2R1bGV9LFxuICAgICAqIHdoZXJlYXMgcGFzc2luZyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNyZWF0ZXMgYSBuZXcge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfVxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIE1vZHVsZVxuICAgICAqXG4gICAgICogQSBtb2R1bGUgaXMgYSBjb2xsZWN0aW9uIG9mIHNlcnZpY2VzLCBkaXJlY3RpdmVzLCBjb250cm9sbGVycywgZmlsdGVycywgYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uXG4gICAgICogYGFuZ3VsYXIubW9kdWxlYCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uXG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGVcbiAgICAgKiB2YXIgbXlNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlNb2R1bGUnLCBbXSk7XG4gICAgICpcbiAgICAgKiAvLyByZWdpc3RlciBhIG5ldyBzZXJ2aWNlXG4gICAgICogbXlNb2R1bGUudmFsdWUoJ2FwcE5hbWUnLCAnTXlDb29sQXBwJyk7XG4gICAgICpcbiAgICAgKiAvLyBjb25maWd1cmUgZXhpc3Rpbmcgc2VydmljZXMgaW5zaWRlIGluaXRpYWxpemF0aW9uIGJsb2Nrcy5cbiAgICAgKiBteU1vZHVsZS5jb25maWcoWyckbG9jYXRpb25Qcm92aWRlcicsIGZ1bmN0aW9uKCRsb2NhdGlvblByb3ZpZGVyKSB7XG4gICAgICogICAvLyBDb25maWd1cmUgZXhpc3RpbmcgcHJvdmlkZXJzXG4gICAgICogICAkbG9jYXRpb25Qcm92aWRlci5oYXNoUHJlZml4KCchJyk7XG4gICAgICogfV0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlbiB5b3UgY2FuIGNyZWF0ZSBhbiBpbmplY3RvciBhbmQgbG9hZCB5b3VyIG1vZHVsZXMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiB2YXIgaW5qZWN0b3IgPSBhbmd1bGFyLmluamVjdG9yKFsnbmcnLCAnbXlNb2R1bGUnXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEhvd2V2ZXIgaXQncyBtb3JlIGxpa2VseSB0aGF0IHlvdSdsbCBqdXN0IHVzZVxuICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdBcHAgbmdBcHB9IG9yXG4gICAgICoge0BsaW5rIGFuZ3VsYXIuYm9vdHN0cmFwfSB0byBzaW1wbGlmeSB0aGlzIHByb2Nlc3MgZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGNyZWF0ZSBvciByZXRyaWV2ZS5cbiAgICAgKiBAcGFyYW0geyFBcnJheS48c3RyaW5nPj19IHJlcXVpcmVzIElmIHNwZWNpZmllZCB0aGVuIG5ldyBtb2R1bGUgaXMgYmVpbmcgY3JlYXRlZC4gSWZcbiAgICAgKiAgICAgICAgdW5zcGVjaWZpZWQgdGhlbiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJldHJpZXZlZCBmb3IgZnVydGhlciBjb25maWd1cmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb249fSBjb25maWdGbiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlLiBTYW1lIGFzXG4gICAgICogICAgICAgIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWcgTW9kdWxlI2NvbmZpZygpfS5cbiAgICAgKiBAcmV0dXJucyB7YW5ndWxhci5Nb2R1bGV9IG5ldyBtb2R1bGUgd2l0aCB0aGUge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfSBhcGkuXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1vZHVsZShuYW1lLCByZXF1aXJlcywgY29uZmlnRm4pIHtcbiAgICAgIHZhciBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdoYXNPd25Qcm9wZXJ0eScpIHtcbiAgICAgICAgICB0aHJvdyBuZ01pbkVycignYmFkbmFtZScsICdoYXNPd25Qcm9wZXJ0eSBpcyBub3QgYSB2YWxpZCB7MH0gbmFtZScsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnbW9kdWxlJyk7XG4gICAgICBpZiAocmVxdWlyZXMgJiYgbW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBtb2R1bGVzW25hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnN1cmUobW9kdWxlcywgbmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghcmVxdWlyZXMpIHtcbiAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ25vbW9kJywgJ01vZHVsZSBcXCd7MH1cXCcgaXMgbm90IGF2YWlsYWJsZSEgWW91IGVpdGhlciBtaXNzcGVsbGVkICcgK1xuICAgICAgICAgICAgICd0aGUgbW9kdWxlIG5hbWUgb3IgZm9yZ290IHRvIGxvYWQgaXQuIElmIHJlZ2lzdGVyaW5nIGEgbW9kdWxlIGVuc3VyZSB0aGF0IHlvdSAnICtcbiAgICAgICAgICAgICAnc3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuJywgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogQHR5cGUgeyFBcnJheS48QXJyYXkuPCo+Pn0gKi9cbiAgICAgICAgdmFyIGludm9rZVF1ZXVlID0gW107XG5cbiAgICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPEZ1bmN0aW9uPn0gKi9cbiAgICAgICAgdmFyIGNvbmZpZ0Jsb2NrcyA9IFtdO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7IUFycmF5LjxGdW5jdGlvbj59ICovXG4gICAgICAgIHZhciBydW5CbG9ja3MgPSBbXTtcblxuICAgICAgICB2YXIgY29uZmlnID0gaW52b2tlTGF0ZXIoJyRpbmplY3RvcicsICdpbnZva2UnLCAncHVzaCcsIGNvbmZpZ0Jsb2Nrcyk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHthbmd1bGFyLk1vZHVsZX0gKi9cbiAgICAgICAgdmFyIG1vZHVsZUluc3RhbmNlID0ge1xuICAgICAgICAgIC8vIFByaXZhdGUgc3RhdGVcbiAgICAgICAgICBfaW52b2tlUXVldWU6IGludm9rZVF1ZXVlLFxuICAgICAgICAgIF9jb25maWdCbG9ja3M6IGNvbmZpZ0Jsb2NrcyxcbiAgICAgICAgICBfcnVuQmxvY2tzOiBydW5CbG9ja3MsXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNyZXF1aXJlc1xuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIEhvbGRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgd2hpY2ggdGhlIGluamVjdG9yIHdpbGwgbG9hZCBiZWZvcmUgdGhlIGN1cnJlbnQgbW9kdWxlIGlzXG4gICAgICAgICAgICogbG9hZGVkLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHJlcXVpcmVzOiByZXF1aXJlcyxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eVxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI25hbWVcbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBOYW1lIG9mIHRoZSBtb2R1bGUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbmFtZTogbmFtZSxcblxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3Byb3ZpZGVyXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHNlcnZpY2UgbmFtZVxuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByb3ZpZGVyVHlwZSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiB0aGVcbiAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5cbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjcHJvdmlkZXIgJHByb3ZpZGUucHJvdmlkZXIoKX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgcHJvdmlkZXI6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJHByb3ZpZGUnLCAncHJvdmlkZXInKSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNmYWN0b3J5XG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHNlcnZpY2UgbmFtZVxuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByb3ZpZGVyRnVuY3Rpb24gRnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2VydmljZS5cbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSAkcHJvdmlkZS5mYWN0b3J5KCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZhY3Rvcnk6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJHByb3ZpZGUnLCAnZmFjdG9yeScpLFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3NlcnZpY2VcbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lXG4gICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW5zdGFudGlhdGVkLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlICRwcm92aWRlLnNlcnZpY2UoKX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgc2VydmljZTogaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKCckcHJvdmlkZScsICdzZXJ2aWNlJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjdmFsdWVcbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lXG4gICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgU2VydmljZSBpbnN0YW5jZSBvYmplY3QuXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlICRwcm92aWRlLnZhbHVlKCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHZhbHVlOiBpbnZva2VMYXRlcignJHByb3ZpZGUnLCAndmFsdWUnKSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNjb25zdGFudFxuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBjb25zdGFudCBuYW1lXG4gICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgQ29uc3RhbnQgdmFsdWUuXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogQmVjYXVzZSB0aGUgY29uc3RhbnRzIGFyZSBmaXhlZCwgdGhleSBnZXQgYXBwbGllZCBiZWZvcmUgb3RoZXIgcHJvdmlkZSBtZXRob2RzLlxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNjb25zdGFudCAkcHJvdmlkZS5jb25zdGFudCgpfS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdGFudDogaW52b2tlTGF0ZXIoJyRwcm92aWRlJywgJ2NvbnN0YW50JywgJ3Vuc2hpZnQnKSxcblxuICAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjZGVjb3JhdG9yXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGRlY29yYXRlLlxuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRlY29yRm4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgc2VydmljZSBuZWVkcyB0byBiZVxuICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkIGFuZCBzaG91bGQgcmV0dXJuIHRoZSBkZWNvcmF0ZWQgc2VydmljZSBpbnN0YW5jZS5cbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjZGVjb3JhdG9yICRwcm92aWRlLmRlY29yYXRvcigpfS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBkZWNvcmF0b3I6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJHByb3ZpZGUnLCAnZGVjb3JhdG9yJywgY29uZmlnQmxvY2tzKSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNhbmltYXRpb25cbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgYW5pbWF0aW9uIG5hbWVcbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhbmltYXRpb25GYWN0b3J5IEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiBhblxuICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqXG4gICAgICAgICAgICogKipOT1RFKio6IGFuaW1hdGlvbnMgdGFrZSBlZmZlY3Qgb25seSBpZiB0aGUgKipuZ0FuaW1hdGUqKiBtb2R1bGUgaXMgbG9hZGVkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEZWZpbmVzIGFuIGFuaW1hdGlvbiBob29rIHRoYXQgY2FuIGJlIGxhdGVyIHVzZWQgd2l0aFxuICAgICAgICAgICAqIHtAbGluayAkYW5pbWF0ZSAkYW5pbWF0ZX0gc2VydmljZSBhbmQgZGlyZWN0aXZlcyB0aGF0IHVzZSB0aGlzIHNlcnZpY2UuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBgYGBqc1xuICAgICAgICAgICAqIG1vZHVsZS5hbmltYXRpb24oJy5hbmltYXRpb24tbmFtZScsIGZ1bmN0aW9uKCRpbmplY3QxLCAkaW5qZWN0Mikge1xuICAgICAgICAgICAqICAgcmV0dXJuIHtcbiAgICAgICAgICAgKiAgICAgZXZlbnROYW1lIDogZnVuY3Rpb24oZWxlbWVudCwgZG9uZSkge1xuICAgICAgICAgICAqICAgICAgIC8vY29kZSB0byBydW4gdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAqICAgICAgIC8vb25jZSBjb21wbGV0ZSwgdGhlbiBydW4gZG9uZSgpXG4gICAgICAgICAgICogICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNhbmNlbGxhdGlvbkZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgKiAgICAgICAgIC8vY29kZSB0byBjYW5jZWwgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAqICAgICAgIH1cbiAgICAgICAgICAgKiAgICAgfVxuICAgICAgICAgICAqICAgfVxuICAgICAgICAgICAqIH0pXG4gICAgICAgICAgICogYGBgXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRhbmltYXRlUHJvdmlkZXIjcmVnaXN0ZXIgJGFuaW1hdGVQcm92aWRlci5yZWdpc3RlcigpfSBhbmRcbiAgICAgICAgICAgKiB7QGxpbmsgbmdBbmltYXRlIG5nQW5pbWF0ZSBtb2R1bGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGFuaW1hdGlvbjogaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKCckYW5pbWF0ZVByb3ZpZGVyJywgJ3JlZ2lzdGVyJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjZmlsdGVyXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEZpbHRlciBuYW1lIC0gdGhpcyBtdXN0IGJlIGEgdmFsaWQgYW5ndWxhciBleHByZXNzaW9uIGlkZW50aWZpZXJcbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXJGYWN0b3J5IEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiBmaWx0ZXIuXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogU2VlIHtAbGluayBuZy4kZmlsdGVyUHJvdmlkZXIjcmVnaXN0ZXIgJGZpbHRlclByb3ZpZGVyLnJlZ2lzdGVyKCl9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAgICAgICAgICAgKiAqKk5vdGU6KiogRmlsdGVyIG5hbWVzIG11c3QgYmUgdmFsaWQgYW5ndWxhciB7QGxpbmsgZXhwcmVzc2lvbn0gaWRlbnRpZmllcnMsIHN1Y2ggYXMgYHVwcGVyY2FzZWAgb3IgYG9yZGVyQnlgLlxuICAgICAgICAgICAqIE5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGh5cGhlbnMgYW5kIGRvdHMsIGFyZSBub3QgYWxsb3dlZC4gSWYgeW91IHdpc2ggdG8gbmFtZXNwYWNlXG4gICAgICAgICAgICogeW91ciBmaWx0ZXJzLCB0aGVuIHlvdSBjYW4gdXNlIGNhcGl0YWxpemF0aW9uIChgbXlhcHBTdWJzZWN0aW9uRmlsdGVyeGApIG9yIHVuZGVyc2NvcmVzXG4gICAgICAgICAgICogKGBteWFwcF9zdWJzZWN0aW9uX2ZpbHRlcnhgKS5cbiAgICAgICAgICAgKiA8L2Rpdj5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmaWx0ZXI6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJGZpbHRlclByb3ZpZGVyJywgJ3JlZ2lzdGVyJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjY29udHJvbGxlclxuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgQ29udHJvbGxlciBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGNvbnRyb2xsZXJzIHdoZXJlIHRoZVxuICAgICAgICAgICAqICAgIGtleXMgYXJlIHRoZSBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGNvbnN0cnVjdG9ycy5cbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBDb250cm9sbGVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciNyZWdpc3RlciAkY29udHJvbGxlclByb3ZpZGVyLnJlZ2lzdGVyKCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnRyb2xsZXI6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJGNvbnRyb2xsZXJQcm92aWRlcicsICdyZWdpc3RlcicpLFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2RpcmVjdGl2ZVxuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgRGlyZWN0aXZlIG5hbWUsIG9yIGFuIG9iamVjdCBtYXAgb2YgZGlyZWN0aXZlcyB3aGVyZSB0aGVcbiAgICAgICAgICAgKiAgICBrZXlzIGFyZSB0aGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBmYWN0b3JpZXMuXG4gICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZGlyZWN0aXZlRmFjdG9yeSBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2Ugb2ZcbiAgICAgICAgICAgKiBkaXJlY3RpdmVzLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgJGNvbXBpbGVQcm92aWRlci5kaXJlY3RpdmUoKX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgZGlyZWN0aXZlOiBpbnZva2VMYXRlckFuZFNldE1vZHVsZU5hbWUoJyRjb21waWxlUHJvdmlkZXInLCAnZGlyZWN0aXZlJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjY29tcG9uZW50XG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbiBjYW1lbC1jYXNlIChpLmUuIG15Q29tcCB3aGljaCB3aWxsIG1hdGNoIGFzIG15LWNvbXApXG4gICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQ29tcG9uZW50IGRlZmluaXRpb24gb2JqZWN0IChhIHNpbXBsaWZpZWRcbiAgICAgICAgICAgKiAgICB7QGxpbmsgbmcuJGNvbXBpbGUjZGlyZWN0aXZlLWRlZmluaXRpb24tb2JqZWN0IGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdH0pXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjY29tcG9uZW50ICRjb21waWxlUHJvdmlkZXIuY29tcG9uZW50KCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbXBvbmVudDogaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKCckY29tcGlsZVByb3ZpZGVyJywgJ2NvbXBvbmVudCcpLFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2NvbmZpZ1xuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25maWdGbiBFeGVjdXRlIHRoaXMgZnVuY3Rpb24gb24gbW9kdWxlIGxvYWQuIFVzZWZ1bCBmb3Igc2VydmljZVxuICAgICAgICAgICAqICAgIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHdvcmsgd2hpY2ggbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIG1vZHVsZSBsb2FkaW5nLlxuICAgICAgICAgICAqIEZvciBtb3JlIGFib3V0IGhvdyB0byBjb25maWd1cmUgc2VydmljZXMsIHNlZVxuICAgICAgICAgICAqIHtAbGluayBwcm92aWRlcnMjcHJvdmlkZXItcmVjaXBlIFByb3ZpZGVyIFJlY2lwZX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uZmlnOiBjb25maWcsXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjcnVuXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXRpYWxpemF0aW9uRm4gRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIGFmdGVyIGluamVjdG9yIGNyZWF0aW9uLlxuICAgICAgICAgICAqICAgIFVzZWZ1bCBmb3IgYXBwbGljYXRpb24gaW5pdGlhbGl6YXRpb24uXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHdvcmsgd2hpY2ggc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBpbmplY3RvciBpcyBkb25lXG4gICAgICAgICAgICogbG9hZGluZyBhbGwgbW9kdWxlcy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBydW46IGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgICAgICAgICBydW5CbG9ja3MucHVzaChibG9jayk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZuKSB7XG4gICAgICAgICAgY29uZmlnKGNvbmZpZ0ZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb2R1bGVJbnN0YW5jZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmc9fSBpbnNlcnRNZXRob2RcbiAgICAgICAgICogQHJldHVybnMge2FuZ3VsYXIuTW9kdWxlfVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaW52b2tlTGF0ZXIocHJvdmlkZXIsIG1ldGhvZCwgaW5zZXJ0TWV0aG9kLCBxdWV1ZSkge1xuICAgICAgICAgIGlmICghcXVldWUpIHF1ZXVlID0gaW52b2tlUXVldWU7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcXVldWVbaW5zZXJ0TWV0aG9kIHx8ICdwdXNoJ10oW3Byb3ZpZGVyLCBtZXRob2QsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUluc3RhbmNlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAgICAgICAgICogQHJldHVybnMge2FuZ3VsYXIuTW9kdWxlfVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKHByb3ZpZGVyLCBtZXRob2QsIHF1ZXVlKSB7XG4gICAgICAgICAgaWYgKCFxdWV1ZSkgcXVldWUgPSBpbnZva2VRdWV1ZTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24ocmVjaXBlTmFtZSwgZmFjdG9yeUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZmFjdG9yeUZ1bmN0aW9uICYmIGlzRnVuY3Rpb24oZmFjdG9yeUZ1bmN0aW9uKSkgZmFjdG9yeUZ1bmN0aW9uLiQkbW9kdWxlTmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKFtwcm92aWRlciwgbWV0aG9kLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbnN0YW5jZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9KTtcblxufVxuXG4vKiBnbG9iYWwgc2hhbGxvd0NvcHk6IHRydWUgKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mIGFuIG9iamVjdCwgYW4gYXJyYXkgb3IgYSBwcmltaXRpdmUuXG4gKlxuICogQXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBubyBwcm90byBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBzaGFsbG93Q29weShzcmMsIGRzdCkge1xuICBpZiAoaXNBcnJheShzcmMpKSB7XG4gICAgZHN0ID0gZHN0IHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGRzdFtpXSA9IHNyY1tpXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSkge1xuICAgIGRzdCA9IGRzdCB8fCB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIGlmICghKGtleS5jaGFyQXQoMCkgPT09ICckJyAmJiBrZXkuY2hhckF0KDEpID09PSAnJCcpKSB7XG4gICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdCB8fCBzcmM7XG59XG5cbi8qIGdsb2JhbCB0b0RlYnVnU3RyaW5nOiB0cnVlICovXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZU9iamVjdChvYmopIHtcbiAgdmFyIHNlZW4gPSBbXTtcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrZXksIHZhbCkge1xuICAgIHZhbCA9IHRvSnNvblJlcGxhY2VyKGtleSwgdmFsKTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuXG4gICAgICBpZiAoc2Vlbi5pbmRleE9mKHZhbCkgPj0gMCkgcmV0dXJuICcuLi4nO1xuXG4gICAgICBzZWVuLnB1c2godmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGVidWdTdHJpbmcob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9iai50b1N0cmluZygpLnJlcGxhY2UoLyBcXHtbXFxzXFxTXSokLywgJycpO1xuICB9IGVsc2UgaWYgKGlzVW5kZWZpbmVkKG9iaikpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplT2JqZWN0KG9iaik7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyogZ2xvYmFsIGFuZ3VsYXJNb2R1bGU6IHRydWUsXG4gIHZlcnNpb246IHRydWUsXG5cbiAgJENvbXBpbGVQcm92aWRlcixcblxuICBodG1sQW5jaG9yRGlyZWN0aXZlLFxuICBpbnB1dERpcmVjdGl2ZSxcbiAgaW5wdXREaXJlY3RpdmUsXG4gIGZvcm1EaXJlY3RpdmUsXG4gIHNjcmlwdERpcmVjdGl2ZSxcbiAgc2VsZWN0RGlyZWN0aXZlLFxuICBvcHRpb25EaXJlY3RpdmUsXG4gIG5nQmluZERpcmVjdGl2ZSxcbiAgbmdCaW5kSHRtbERpcmVjdGl2ZSxcbiAgbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUsXG4gIG5nQ2xhc3NEaXJlY3RpdmUsXG4gIG5nQ2xhc3NFdmVuRGlyZWN0aXZlLFxuICBuZ0NsYXNzT2RkRGlyZWN0aXZlLFxuICBuZ0Nsb2FrRGlyZWN0aXZlLFxuICBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIG5nRm9ybURpcmVjdGl2ZSxcbiAgbmdIaWRlRGlyZWN0aXZlLFxuICBuZ0lmRGlyZWN0aXZlLFxuICBuZ0luY2x1ZGVEaXJlY3RpdmUsXG4gIG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlLFxuICBuZ0luaXREaXJlY3RpdmUsXG4gIG5nTm9uQmluZGFibGVEaXJlY3RpdmUsXG4gIG5nUGx1cmFsaXplRGlyZWN0aXZlLFxuICBuZ1JlcGVhdERpcmVjdGl2ZSxcbiAgbmdTaG93RGlyZWN0aXZlLFxuICBuZ1N0eWxlRGlyZWN0aXZlLFxuICBuZ1N3aXRjaERpcmVjdGl2ZSxcbiAgbmdTd2l0Y2hXaGVuRGlyZWN0aXZlLFxuICBuZ1N3aXRjaERlZmF1bHREaXJlY3RpdmUsXG4gIG5nT3B0aW9uc0RpcmVjdGl2ZSxcbiAgbmdUcmFuc2NsdWRlRGlyZWN0aXZlLFxuICBuZ01vZGVsRGlyZWN0aXZlLFxuICBuZ0xpc3REaXJlY3RpdmUsXG4gIG5nQ2hhbmdlRGlyZWN0aXZlLFxuICBwYXR0ZXJuRGlyZWN0aXZlLFxuICBwYXR0ZXJuRGlyZWN0aXZlLFxuICByZXF1aXJlZERpcmVjdGl2ZSxcbiAgcmVxdWlyZWREaXJlY3RpdmUsXG4gIG1pbmxlbmd0aERpcmVjdGl2ZSxcbiAgbWlubGVuZ3RoRGlyZWN0aXZlLFxuICBtYXhsZW5ndGhEaXJlY3RpdmUsXG4gIG1heGxlbmd0aERpcmVjdGl2ZSxcbiAgbmdWYWx1ZURpcmVjdGl2ZSxcbiAgbmdNb2RlbE9wdGlvbnNEaXJlY3RpdmUsXG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzLFxuICBuZ0V2ZW50RGlyZWN0aXZlcyxcblxuICAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIsXG4gICRBbmltYXRlUHJvdmlkZXIsXG4gICRDb3JlQW5pbWF0ZUNzc1Byb3ZpZGVyLFxuICAkJENvcmVBbmltYXRlSnNQcm92aWRlcixcbiAgJCRDb3JlQW5pbWF0ZVF1ZXVlUHJvdmlkZXIsXG4gICQkQW5pbWF0ZVJ1bm5lckZhY3RvcnlQcm92aWRlcixcbiAgJCRBbmltYXRlQXN5bmNSdW5GYWN0b3J5UHJvdmlkZXIsXG4gICRCcm93c2VyUHJvdmlkZXIsXG4gICRDYWNoZUZhY3RvcnlQcm92aWRlcixcbiAgJENvbnRyb2xsZXJQcm92aWRlcixcbiAgJERhdGVQcm92aWRlcixcbiAgJERvY3VtZW50UHJvdmlkZXIsXG4gICQkSXNEb2N1bWVudEhpZGRlblByb3ZpZGVyLFxuICAkRXhjZXB0aW9uSGFuZGxlclByb3ZpZGVyLFxuICAkRmlsdGVyUHJvdmlkZXIsXG4gICQkRm9yY2VSZWZsb3dQcm92aWRlcixcbiAgJEludGVycG9sYXRlUHJvdmlkZXIsXG4gICRJbnRlcnZhbFByb3ZpZGVyLFxuICAkJEhhc2hNYXBQcm92aWRlcixcbiAgJEh0dHBQcm92aWRlcixcbiAgJEh0dHBQYXJhbVNlcmlhbGl6ZXJQcm92aWRlcixcbiAgJEh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2VQcm92aWRlcixcbiAgJEh0dHBCYWNrZW5kUHJvdmlkZXIsXG4gICR4aHJGYWN0b3J5UHJvdmlkZXIsXG4gICRqc29ucENhbGxiYWNrc1Byb3ZpZGVyLFxuICAkTG9jYXRpb25Qcm92aWRlcixcbiAgJExvZ1Byb3ZpZGVyLFxuICAkUGFyc2VQcm92aWRlcixcbiAgJFJvb3RTY29wZVByb3ZpZGVyLFxuICAkUVByb3ZpZGVyLFxuICAkJFFQcm92aWRlcixcbiAgJCRTYW5pdGl6ZVVyaVByb3ZpZGVyLFxuICAkU2NlUHJvdmlkZXIsXG4gICRTY2VEZWxlZ2F0ZVByb3ZpZGVyLFxuICAkU25pZmZlclByb3ZpZGVyLFxuICAkVGVtcGxhdGVDYWNoZVByb3ZpZGVyLFxuICAkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIsXG4gICQkVGVzdGFiaWxpdHlQcm92aWRlcixcbiAgJFRpbWVvdXRQcm92aWRlcixcbiAgJCRSQUZQcm92aWRlcixcbiAgJFdpbmRvd1Byb3ZpZGVyLFxuICAkJGpxTGl0ZVByb3ZpZGVyLFxuICAkJENvb2tpZVJlYWRlclByb3ZpZGVyXG4qL1xuXG5cbi8qKlxuICogQG5nZG9jIG9iamVjdFxuICogQG5hbWUgYW5ndWxhci52ZXJzaW9uXG4gKiBAbW9kdWxlIG5nXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IEFuZ3VsYXJKUyB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgZnVsbGAg4oCTIGB7c3RyaW5nfWAg4oCTIEZ1bGwgdmVyc2lvbiBzdHJpbmcsIHN1Y2ggYXMgXCIwLjkuMThcIi5cbiAqIC0gYG1ham9yYCDigJMgYHtudW1iZXJ9YCDigJMgTWFqb3IgdmVyc2lvbiBudW1iZXIsIHN1Y2ggYXMgXCIwXCIuXG4gKiAtIGBtaW5vcmAg4oCTIGB7bnVtYmVyfWAg4oCTIE1pbm9yIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIFwiOVwiLlxuICogLSBgZG90YCDigJMgYHtudW1iZXJ9YCDigJMgRG90IHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIFwiMThcIi5cbiAqIC0gYGNvZGVOYW1lYCDigJMgYHtzdHJpbmd9YCDigJMgQ29kZSBuYW1lIG9mIHRoZSByZWxlYXNlLCBzdWNoIGFzIFwiamlnZ2xpbmctYXJtZmF0XCIuXG4gKi9cbnZhciB2ZXJzaW9uID0ge1xuICAvLyBUaGVzZSBwbGFjZWhvbGRlciBzdHJpbmdzIHdpbGwgYmUgcmVwbGFjZWQgYnkgZ3J1bnQncyBgYnVpbGRgIHRhc2suXG4gIC8vIFRoZXkgbmVlZCB0byBiZSBkb3VibGUtIG9yIHNpbmdsZS1xdW90ZWQuXG4gIGZ1bGw6ICcxLjYuMScsXG4gIG1ham9yOiAxLFxuICBtaW5vcjogNixcbiAgZG90OiAxLFxuICBjb2RlTmFtZTogJ3Byb21pc2UtcmVjdGlmaWNhdGlvbidcbn07XG5cblxuZnVuY3Rpb24gcHVibGlzaEV4dGVybmFsQVBJKGFuZ3VsYXIpIHtcbiAgZXh0ZW5kKGFuZ3VsYXIsIHtcbiAgICAnYm9vdHN0cmFwJzogYm9vdHN0cmFwLFxuICAgICdjb3B5JzogY29weSxcbiAgICAnZXh0ZW5kJzogZXh0ZW5kLFxuICAgICdtZXJnZSc6IG1lcmdlLFxuICAgICdlcXVhbHMnOiBlcXVhbHMsXG4gICAgJ2VsZW1lbnQnOiBqcUxpdGUsXG4gICAgJ2ZvckVhY2gnOiBmb3JFYWNoLFxuICAgICdpbmplY3Rvcic6IGNyZWF0ZUluamVjdG9yLFxuICAgICdub29wJzogbm9vcCxcbiAgICAnYmluZCc6IGJpbmQsXG4gICAgJ3RvSnNvbic6IHRvSnNvbixcbiAgICAnZnJvbUpzb24nOiBmcm9tSnNvbixcbiAgICAnaWRlbnRpdHknOiBpZGVudGl0eSxcbiAgICAnaXNVbmRlZmluZWQnOiBpc1VuZGVmaW5lZCxcbiAgICAnaXNEZWZpbmVkJzogaXNEZWZpbmVkLFxuICAgICdpc1N0cmluZyc6IGlzU3RyaW5nLFxuICAgICdpc0Z1bmN0aW9uJzogaXNGdW5jdGlvbixcbiAgICAnaXNPYmplY3QnOiBpc09iamVjdCxcbiAgICAnaXNOdW1iZXInOiBpc051bWJlcixcbiAgICAnaXNFbGVtZW50JzogaXNFbGVtZW50LFxuICAgICdpc0FycmF5JzogaXNBcnJheSxcbiAgICAndmVyc2lvbic6IHZlcnNpb24sXG4gICAgJ2lzRGF0ZSc6IGlzRGF0ZSxcbiAgICAnbG93ZXJjYXNlJzogbG93ZXJjYXNlLFxuICAgICd1cHBlcmNhc2UnOiB1cHBlcmNhc2UsXG4gICAgJ2NhbGxiYWNrcyc6IHskJGNvdW50ZXI6IDB9LFxuICAgICdnZXRUZXN0YWJpbGl0eSc6IGdldFRlc3RhYmlsaXR5LFxuICAgICdyZWxvYWRXaXRoRGVidWdJbmZvJzogcmVsb2FkV2l0aERlYnVnSW5mbyxcbiAgICAnJCRtaW5FcnInOiBtaW5FcnIsXG4gICAgJyQkY3NwJzogY3NwLFxuICAgICckJGVuY29kZVVyaVNlZ21lbnQnOiBlbmNvZGVVcmlTZWdtZW50LFxuICAgICckJGVuY29kZVVyaVF1ZXJ5JzogZW5jb2RlVXJpUXVlcnksXG4gICAgJyQkc3RyaW5naWZ5Jzogc3RyaW5naWZ5XG4gIH0pO1xuXG4gIGFuZ3VsYXJNb2R1bGUgPSBzZXR1cE1vZHVsZUxvYWRlcih3aW5kb3cpO1xuXG4gIGFuZ3VsYXJNb2R1bGUoJ25nJywgWyduZ0xvY2FsZSddLCBbJyRwcm92aWRlJyxcbiAgICBmdW5jdGlvbiBuZ01vZHVsZSgkcHJvdmlkZSkge1xuICAgICAgLy8gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyIG5lZWRzIHRvIGJlIGJlZm9yZSAkY29tcGlsZVByb3ZpZGVyIGFzIGl0IGlzIHVzZWQgYnkgaXQuXG4gICAgICAkcHJvdmlkZS5wcm92aWRlcih7XG4gICAgICAgICQkc2FuaXRpemVVcmk6ICQkU2FuaXRpemVVcmlQcm92aWRlclxuICAgICAgfSk7XG4gICAgICAkcHJvdmlkZS5wcm92aWRlcignJGNvbXBpbGUnLCAkQ29tcGlsZVByb3ZpZGVyKS5cbiAgICAgICAgZGlyZWN0aXZlKHtcbiAgICAgICAgICAgIGE6IGh0bWxBbmNob3JEaXJlY3RpdmUsXG4gICAgICAgICAgICBpbnB1dDogaW5wdXREaXJlY3RpdmUsXG4gICAgICAgICAgICB0ZXh0YXJlYTogaW5wdXREaXJlY3RpdmUsXG4gICAgICAgICAgICBmb3JtOiBmb3JtRGlyZWN0aXZlLFxuICAgICAgICAgICAgc2NyaXB0OiBzY3JpcHREaXJlY3RpdmUsXG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG9wdGlvbjogb3B0aW9uRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdCaW5kOiBuZ0JpbmREaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0JpbmRIdG1sOiBuZ0JpbmRIdG1sRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdCaW5kVGVtcGxhdGU6IG5nQmluZFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdDbGFzczogbmdDbGFzc0RpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nQ2xhc3NFdmVuOiBuZ0NsYXNzRXZlbkRpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nQ2xhc3NPZGQ6IG5nQ2xhc3NPZGREaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0Nsb2FrOiBuZ0Nsb2FrRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdDb250cm9sbGVyOiBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0Zvcm06IG5nRm9ybURpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nSGlkZTogbmdIaWRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdJZjogbmdJZkRpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nSW5jbHVkZTogbmdJbmNsdWRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdJbml0OiBuZ0luaXREaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ05vbkJpbmRhYmxlOiBuZ05vbkJpbmRhYmxlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdQbHVyYWxpemU6IG5nUGx1cmFsaXplRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdSZXBlYXQ6IG5nUmVwZWF0RGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdTaG93OiBuZ1Nob3dEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ1N0eWxlOiBuZ1N0eWxlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdTd2l0Y2g6IG5nU3dpdGNoRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdTd2l0Y2hXaGVuOiBuZ1N3aXRjaFdoZW5EaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ1N3aXRjaERlZmF1bHQ6IG5nU3dpdGNoRGVmYXVsdERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nT3B0aW9uczogbmdPcHRpb25zRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdUcmFuc2NsdWRlOiBuZ1RyYW5zY2x1ZGVEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ01vZGVsOiBuZ01vZGVsRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdMaXN0OiBuZ0xpc3REaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0NoYW5nZTogbmdDaGFuZ2VEaXJlY3RpdmUsXG4gICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdQYXR0ZXJuOiBwYXR0ZXJuRGlyZWN0aXZlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdSZXF1aXJlZDogcmVxdWlyZWREaXJlY3RpdmUsXG4gICAgICAgICAgICBtaW5sZW5ndGg6IG1pbmxlbmd0aERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nTWlubGVuZ3RoOiBtaW5sZW5ndGhEaXJlY3RpdmUsXG4gICAgICAgICAgICBtYXhsZW5ndGg6IG1heGxlbmd0aERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nTWF4bGVuZ3RoOiBtYXhsZW5ndGhEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ1ZhbHVlOiBuZ1ZhbHVlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdNb2RlbE9wdGlvbnM6IG5nTW9kZWxPcHRpb25zRGlyZWN0aXZlXG4gICAgICAgIH0pLlxuICAgICAgICBkaXJlY3RpdmUoe1xuICAgICAgICAgIG5nSW5jbHVkZTogbmdJbmNsdWRlRmlsbENvbnRlbnREaXJlY3RpdmVcbiAgICAgICAgfSkuXG4gICAgICAgIGRpcmVjdGl2ZShuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlcykuXG4gICAgICAgIGRpcmVjdGl2ZShuZ0V2ZW50RGlyZWN0aXZlcyk7XG4gICAgICAkcHJvdmlkZS5wcm92aWRlcih7XG4gICAgICAgICRhbmNob3JTY3JvbGw6ICRBbmNob3JTY3JvbGxQcm92aWRlcixcbiAgICAgICAgJGFuaW1hdGU6ICRBbmltYXRlUHJvdmlkZXIsXG4gICAgICAgICRhbmltYXRlQ3NzOiAkQ29yZUFuaW1hdGVDc3NQcm92aWRlcixcbiAgICAgICAgJCRhbmltYXRlSnM6ICQkQ29yZUFuaW1hdGVKc1Byb3ZpZGVyLFxuICAgICAgICAkJGFuaW1hdGVRdWV1ZTogJCRDb3JlQW5pbWF0ZVF1ZXVlUHJvdmlkZXIsXG4gICAgICAgICQkQW5pbWF0ZVJ1bm5lcjogJCRBbmltYXRlUnVubmVyRmFjdG9yeVByb3ZpZGVyLFxuICAgICAgICAkJGFuaW1hdGVBc3luY1J1bjogJCRBbmltYXRlQXN5bmNSdW5GYWN0b3J5UHJvdmlkZXIsXG4gICAgICAgICRicm93c2VyOiAkQnJvd3NlclByb3ZpZGVyLFxuICAgICAgICAkY2FjaGVGYWN0b3J5OiAkQ2FjaGVGYWN0b3J5UHJvdmlkZXIsXG4gICAgICAgICRjb250cm9sbGVyOiAkQ29udHJvbGxlclByb3ZpZGVyLFxuICAgICAgICAkZG9jdW1lbnQ6ICREb2N1bWVudFByb3ZpZGVyLFxuICAgICAgICAkJGlzRG9jdW1lbnRIaWRkZW46ICQkSXNEb2N1bWVudEhpZGRlblByb3ZpZGVyLFxuICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcjogJEV4Y2VwdGlvbkhhbmRsZXJQcm92aWRlcixcbiAgICAgICAgJGZpbHRlcjogJEZpbHRlclByb3ZpZGVyLFxuICAgICAgICAkJGZvcmNlUmVmbG93OiAkJEZvcmNlUmVmbG93UHJvdmlkZXIsXG4gICAgICAgICRpbnRlcnBvbGF0ZTogJEludGVycG9sYXRlUHJvdmlkZXIsXG4gICAgICAgICRpbnRlcnZhbDogJEludGVydmFsUHJvdmlkZXIsXG4gICAgICAgICRodHRwOiAkSHR0cFByb3ZpZGVyLFxuICAgICAgICAkaHR0cFBhcmFtU2VyaWFsaXplcjogJEh0dHBQYXJhbVNlcmlhbGl6ZXJQcm92aWRlcixcbiAgICAgICAgJGh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2U6ICRIdHRwUGFyYW1TZXJpYWxpemVySlFMaWtlUHJvdmlkZXIsXG4gICAgICAgICRodHRwQmFja2VuZDogJEh0dHBCYWNrZW5kUHJvdmlkZXIsXG4gICAgICAgICR4aHJGYWN0b3J5OiAkeGhyRmFjdG9yeVByb3ZpZGVyLFxuICAgICAgICAkanNvbnBDYWxsYmFja3M6ICRqc29ucENhbGxiYWNrc1Byb3ZpZGVyLFxuICAgICAgICAkbG9jYXRpb246ICRMb2NhdGlvblByb3ZpZGVyLFxuICAgICAgICAkbG9nOiAkTG9nUHJvdmlkZXIsXG4gICAgICAgICRwYXJzZTogJFBhcnNlUHJvdmlkZXIsXG4gICAgICAgICRyb290U2NvcGU6ICRSb290U2NvcGVQcm92aWRlcixcbiAgICAgICAgJHE6ICRRUHJvdmlkZXIsXG4gICAgICAgICQkcTogJCRRUHJvdmlkZXIsXG4gICAgICAgICRzY2U6ICRTY2VQcm92aWRlcixcbiAgICAgICAgJHNjZURlbGVnYXRlOiAkU2NlRGVsZWdhdGVQcm92aWRlcixcbiAgICAgICAgJHNuaWZmZXI6ICRTbmlmZmVyUHJvdmlkZXIsXG4gICAgICAgICR0ZW1wbGF0ZUNhY2hlOiAkVGVtcGxhdGVDYWNoZVByb3ZpZGVyLFxuICAgICAgICAkdGVtcGxhdGVSZXF1ZXN0OiAkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIsXG4gICAgICAgICQkdGVzdGFiaWxpdHk6ICQkVGVzdGFiaWxpdHlQcm92aWRlcixcbiAgICAgICAgJHRpbWVvdXQ6ICRUaW1lb3V0UHJvdmlkZXIsXG4gICAgICAgICR3aW5kb3c6ICRXaW5kb3dQcm92aWRlcixcbiAgICAgICAgJCRyQUY6ICQkUkFGUHJvdmlkZXIsXG4gICAgICAgICQkanFMaXRlOiAkJGpxTGl0ZVByb3ZpZGVyLFxuICAgICAgICAkJEhhc2hNYXA6ICQkSGFzaE1hcFByb3ZpZGVyLFxuICAgICAgICAkJGNvb2tpZVJlYWRlcjogJCRDb29raWVSZWFkZXJQcm92aWRlclxuICAgICAgfSk7XG4gICAgfVxuICBdKTtcbn1cblxuLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKlxuICogICAgIEFueSBjb21taXRzIHRvIHRoaXMgZmlsZSBzaG91bGQgYmUgcmV2aWV3ZWQgd2l0aCBzZWN1cml0eSBpbiBtaW5kLiAgKlxuICogICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBjYW4gcG90ZW50aWFsbHkgY3JlYXRlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gKlxuICogICAgICAgICAgQW4gYXBwcm92YWwgZnJvbSAyIENvcmUgbWVtYmVycyB3aXRoIGhpc3Rvcnkgb2YgbW9kaWZ5aW5nICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlIGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogIERvZXMgdGhlIGNoYW5nZSBzb21laG93IGFsbG93IGZvciBhcmJpdHJhcnkgamF2YXNjcmlwdCB0byBiZSBleGVjdXRlZD8gKlxuICogICAgT3IgYWxsb3dzIGZvciBzb21lb25lIHRvIGNoYW5nZSB0aGUgcHJvdG90eXBlIG9mIGJ1aWx0LWluIG9iamVjdHM/ICAgKlxuICogICAgIE9yIGdpdmVzIHVuZGVzaXJlZCBhY2Nlc3MgdG8gdmFyaWFibGVzIGxpa2VzIGRvY3VtZW50IG9yIHdpbmRvdz8gICAgKlxuICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi9cblxuLyogZ2xvYmFsXG4gIEpRTGl0ZVByb3RvdHlwZTogdHJ1ZSxcbiAgQk9PTEVBTl9BVFRSOiB0cnVlLFxuICBBTElBU0VEX0FUVFI6IHRydWVcbiovXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vSlFMaXRlXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmVsZW1lbnRcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBXcmFwcyBhIHJhdyBET00gZWxlbWVudCBvciBIVE1MIHN0cmluZyBhcyBhIFtqUXVlcnldKGh0dHA6Ly9qcXVlcnkuY29tKSBlbGVtZW50LlxuICpcbiAqIElmIGpRdWVyeSBpcyBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgIGlzIGFuIGFsaWFzIGZvciB0aGVcbiAqIFtqUXVlcnldKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9qUXVlcnkvKSBmdW5jdGlvbi4gSWYgalF1ZXJ5IGlzIG5vdCBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgXG4gKiBkZWxlZ2F0ZXMgdG8gQW5ndWxhcidzIGJ1aWx0LWluIHN1YnNldCBvZiBqUXVlcnksIGNhbGxlZCBcImpRdWVyeSBsaXRlXCIgb3IgKipqcUxpdGUqKi5cbiAqXG4gKiBqcUxpdGUgaXMgYSB0aW55LCBBUEktY29tcGF0aWJsZSBzdWJzZXQgb2YgalF1ZXJ5IHRoYXQgYWxsb3dzXG4gKiBBbmd1bGFyIHRvIG1hbmlwdWxhdGUgdGhlIERPTSBpbiBhIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsZSB3YXkuIGpxTGl0ZSBpbXBsZW1lbnRzIG9ubHkgdGhlIG1vc3RcbiAqIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgaGF2aW5nIGEgdmVyeSBzbWFsbCBmb290cHJpbnQuXG4gKlxuICogVG8gdXNlIGBqUXVlcnlgLCBzaW1wbHkgZW5zdXJlIGl0IGlzIGxvYWRlZCBiZWZvcmUgdGhlIGBhbmd1bGFyLmpzYCBmaWxlLiBZb3UgY2FuIGFsc28gdXNlIHRoZVxuICoge0BsaW5rIG5nSnEgYG5nSnFgfSBkaXJlY3RpdmUgdG8gc3BlY2lmeSB0aGF0IGpxbGl0ZSBzaG91bGQgYmUgdXNlZCBvdmVyIGpRdWVyeSwgb3IgdG8gdXNlIGFcbiAqIHNwZWNpZmljIHZlcnNpb24gb2YgalF1ZXJ5IGlmIG11bHRpcGxlIHZlcnNpb25zIGV4aXN0IG9uIHRoZSBwYWdlLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+KipOb3RlOioqIEFsbCBlbGVtZW50IHJlZmVyZW5jZXMgaW4gQW5ndWxhciBhcmUgYWx3YXlzIHdyYXBwZWQgd2l0aCBqUXVlcnkgb3JcbiAqIGpxTGl0ZSAoc3VjaCBhcyB0aGUgZWxlbWVudCBhcmd1bWVudCBpbiBhIGRpcmVjdGl2ZSdzIGNvbXBpbGUgLyBsaW5rIGZ1bmN0aW9uKS4gVGhleSBhcmUgbmV2ZXIgcmF3IERPTSByZWZlcmVuY2VzLjwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+KipOb3RlOioqIEtlZXAgaW4gbWluZCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZmluZCBlbGVtZW50c1xuICogYnkgdGFnIG5hbWUgLyBDU1Mgc2VsZWN0b3IuIEZvciBsb29rdXBzIGJ5IHRhZyBuYW1lLCB0cnkgaW5zdGVhZCBgYW5ndWxhci5lbGVtZW50KGRvY3VtZW50KS5maW5kKC4uLilgXG4gKiBvciBgJGRvY3VtZW50LmZpbmQoKWAsIG9yIHVzZSB0aGUgc3RhbmRhcmQgRE9NIEFQSXMsIGUuZy4gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKWAuPC9kaXY+XG4gKlxuICogIyMgQW5ndWxhcidzIGpxTGl0ZVxuICoganFMaXRlIHByb3ZpZGVzIG9ubHkgdGhlIGZvbGxvd2luZyBqUXVlcnkgbWV0aG9kczpcbiAqXG4gKiAtIFtgYWRkQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9hZGRDbGFzcy8pIC0gRG9lcyBub3Qgc3VwcG9ydCBhIGZ1bmN0aW9uIGFzIGZpcnN0IGFyZ3VtZW50XG4gKiAtIFtgYWZ0ZXIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9hZnRlci8pXG4gKiAtIFtgYXBwZW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYXBwZW5kLylcbiAqIC0gW2BhdHRyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYXR0ci8pIC0gRG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbnMgYXMgcGFyYW1ldGVyc1xuICogLSBbYGJpbmQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9iaW5kLykgKF9kZXByZWNhdGVkXywgdXNlIFtgb24oKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9vbi8pKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YVxuICogLSBbYGNoaWxkcmVuKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY2hpbGRyZW4vKSAtIERvZXMgbm90IHN1cHBvcnQgc2VsZWN0b3JzXG4gKiAtIFtgY2xvbmUoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jbG9uZS8pXG4gKiAtIFtgY29udGVudHMoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jb250ZW50cy8pXG4gKiAtIFtgY3NzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY3NzLykgLSBPbmx5IHJldHJpZXZlcyBpbmxpbmUtc3R5bGVzLCBkb2VzIG5vdCBjYWxsIGBnZXRDb21wdXRlZFN0eWxlKClgLlxuICogICBBcyBhIHNldHRlciwgZG9lcyBub3QgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ3Mgb3IgYXBwZW5kICdweCcsIGFuZCBhbHNvIGRvZXMgbm90IGhhdmUgYXV0b21hdGljIHByb3BlcnR5IHByZWZpeGluZy5cbiAqIC0gW2BkYXRhKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZGF0YS8pXG4gKiAtIFtgZGV0YWNoKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZGV0YWNoLylcbiAqIC0gW2BlbXB0eSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VtcHR5LylcbiAqIC0gW2BlcSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VxLylcbiAqIC0gW2BmaW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZmluZC8pIC0gTGltaXRlZCB0byBsb29rdXBzIGJ5IHRhZyBuYW1lXG4gKiAtIFtgaGFzQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9oYXNDbGFzcy8pXG4gKiAtIFtgaHRtbCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2h0bWwvKVxuICogLSBbYG5leHQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9uZXh0LykgLSBEb2VzIG5vdCBzdXBwb3J0IHNlbGVjdG9yc1xuICogLSBbYG9uKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vb24vKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YVxuICogLSBbYG9mZigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29mZi8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzLCBzZWxlY3RvcnMgb3IgZXZlbnQgb2JqZWN0IGFzIHBhcmFtZXRlclxuICogLSBbYG9uZSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29uZS8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzIG9yIHNlbGVjdG9yc1xuICogLSBbYHBhcmVudCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3BhcmVudC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnNcbiAqIC0gW2BwcmVwZW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcHJlcGVuZC8pXG4gKiAtIFtgcHJvcCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3Byb3AvKVxuICogLSBbYHJlYWR5KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVhZHkvKSAoX2RlcHJlY2F0ZWRfLCB1c2UgYGFuZ3VsYXIuZWxlbWVudChjYWxsYmFjaylgIGluc3RlYWQgb2YgYGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkucmVhZHkoY2FsbGJhY2spYClcbiAqIC0gW2ByZW1vdmUoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZW1vdmUvKVxuICogLSBbYHJlbW92ZUF0dHIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZW1vdmVBdHRyLykgLSBEb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGF0dHJpYnV0ZXNcbiAqIC0gW2ByZW1vdmVDbGFzcygpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3JlbW92ZUNsYXNzLykgLSBEb2VzIG5vdCBzdXBwb3J0IGEgZnVuY3Rpb24gYXMgZmlyc3QgYXJndW1lbnRcbiAqIC0gW2ByZW1vdmVEYXRhKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlRGF0YS8pXG4gKiAtIFtgcmVwbGFjZVdpdGgoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZXBsYWNlV2l0aC8pXG4gKiAtIFtgdGV4dCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3RleHQvKVxuICogLSBbYHRvZ2dsZUNsYXNzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdG9nZ2xlQ2xhc3MvKSAtIERvZXMgbm90IHN1cHBvcnQgYSBmdW5jdGlvbiBhcyBmaXJzdCBhcmd1bWVudFxuICogLSBbYHRyaWdnZXJIYW5kbGVyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdHJpZ2dlckhhbmRsZXIvKSAtIFBhc3NlcyBhIGR1bW15IGV2ZW50IG9iamVjdCB0byBoYW5kbGVyc1xuICogLSBbYHVuYmluZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3VuYmluZC8pIChfZGVwcmVjYXRlZF8sIHVzZSBbYG9mZigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29mZi8pKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcyBvciBldmVudCBvYmplY3QgYXMgcGFyYW1ldGVyXG4gKiAtIFtgdmFsKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdmFsLylcbiAqIC0gW2B3cmFwKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vd3JhcC8pXG4gKlxuICogIyMgalF1ZXJ5L2pxTGl0ZSBFeHRyYXNcbiAqIEFuZ3VsYXIgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgZXZlbnRzIHRvIGJvdGggalF1ZXJ5IGFuZCBqcUxpdGU6XG4gKlxuICogIyMjIEV2ZW50c1xuICogLSBgJGRlc3Ryb3lgIC0gQW5ndWxhckpTIGludGVyY2VwdHMgYWxsIGpxTGl0ZS9qUXVlcnkncyBET00gZGVzdHJ1Y3Rpb24gYXBpcyBhbmQgZmlyZXMgdGhpcyBldmVudFxuICogICAgb24gYWxsIERPTSBub2RlcyBiZWluZyByZW1vdmVkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBjbGVhbiB1cCBhbnkgM3JkIHBhcnR5IGJpbmRpbmdzIHRvIHRoZSBET01cbiAqICAgIGVsZW1lbnQgYmVmb3JlIGl0IGlzIHJlbW92ZWQuXG4gKlxuICogIyMjIE1ldGhvZHNcbiAqIC0gYGNvbnRyb2xsZXIobmFtZSlgIC0gcmV0cmlldmVzIHRoZSBjb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgb3IgaXRzIHBhcmVudC4gQnkgZGVmYXVsdFxuICogICByZXRyaWV2ZXMgY29udHJvbGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZS4gSWYgYG5hbWVgIGlzIHByb3ZpZGVkIGFzXG4gKiAgIGNhbWVsQ2FzZSBkaXJlY3RpdmUgbmFtZSwgdGhlbiB0aGUgY29udHJvbGxlciBmb3IgdGhpcyBkaXJlY3RpdmUgd2lsbCBiZSByZXRyaWV2ZWQgKGUuZy5cbiAqICAgYCduZ01vZGVsJ2ApLlxuICogLSBgaW5qZWN0b3IoKWAgLSByZXRyaWV2ZXMgdGhlIGluamVjdG9yIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgb3IgaXRzIHBhcmVudC5cbiAqIC0gYHNjb3BlKClgIC0gcmV0cmlldmVzIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0gb2YgdGhlIGN1cnJlbnRcbiAqICAgZWxlbWVudCBvciBpdHMgcGFyZW50LiBSZXF1aXJlcyB7QGxpbmsgZ3VpZGUvcHJvZHVjdGlvbiNkaXNhYmxpbmctZGVidWctZGF0YSBEZWJ1ZyBEYXRhfSB0b1xuICogICBiZSBlbmFibGVkLlxuICogLSBgaXNvbGF0ZVNjb3BlKClgIC0gcmV0cmlldmVzIGFuIGlzb2xhdGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9IGlmIG9uZSBpcyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGVcbiAqICAgY3VycmVudCBlbGVtZW50LiBUaGlzIGdldHRlciBzaG91bGQgYmUgdXNlZCBvbmx5IG9uIGVsZW1lbnRzIHRoYXQgY29udGFpbiBhIGRpcmVjdGl2ZSB3aGljaCBzdGFydHMgYSBuZXcgaXNvbGF0ZVxuICogICBzY29wZS4gQ2FsbGluZyBgc2NvcGUoKWAgb24gdGhpcyBlbGVtZW50IGFsd2F5cyByZXR1cm5zIHRoZSBvcmlnaW5hbCBub24taXNvbGF0ZSBzY29wZS5cbiAqICAgUmVxdWlyZXMge0BsaW5rIGd1aWRlL3Byb2R1Y3Rpb24jZGlzYWJsaW5nLWRlYnVnLWRhdGEgRGVidWcgRGF0YX0gdG8gYmUgZW5hYmxlZC5cbiAqIC0gYGluaGVyaXRlZERhdGEoKWAgLSBzYW1lIGFzIGBkYXRhKClgLCBidXQgd2Fsa3MgdXAgdGhlIERPTSB1bnRpbCBhIHZhbHVlIGlzIGZvdW5kIG9yIHRoZSB0b3BcbiAqICAgcGFyZW50IGVsZW1lbnQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAa25vd25Jc3N1ZSBZb3UgY2Fubm90IHNweSBvbiBgYW5ndWxhci5lbGVtZW50YCBpZiB5b3UgYXJlIHVzaW5nIEphc21pbmUgdmVyc2lvbiAxLnguIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTQyNTEgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RE9NRWxlbWVudH0gZWxlbWVudCBIVE1MIHN0cmluZyBvciBET01FbGVtZW50IHRvIGJlIHdyYXBwZWQgaW50byBqUXVlcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBqUXVlcnkgb2JqZWN0LlxuICovXG5cbkpRTGl0ZS5leHBhbmRvID0gJ25nMzM5JztcblxudmFyIGpxQ2FjaGUgPSBKUUxpdGUuY2FjaGUgPSB7fSxcbiAgICBqcUlkID0gMTtcblxuLypcbiAqICEhISBUaGlzIGlzIGFuIHVuZG9jdW1lbnRlZCBcInByaXZhdGVcIiBmdW5jdGlvbiAhISFcbiAqL1xuSlFMaXRlLl9kYXRhID0gZnVuY3Rpb24obm9kZSkge1xuICAvL2pRdWVyeSBhbHdheXMgcmV0dXJucyBhbiBvYmplY3Qgb24gY2FjaGUgbWlzc1xuICByZXR1cm4gdGhpcy5jYWNoZVtub2RlW3RoaXMuZXhwYW5kb11dIHx8IHt9O1xufTtcblxuZnVuY3Rpb24ganFOZXh0SWQoKSB7IHJldHVybiArK2pxSWQ7IH1cblxuXG52YXIgREFTSF9MT1dFUkNBU0VfUkVHRVhQID0gLy0oW2Etel0pL2c7XG52YXIgTVNfSEFDS19SRUdFWFAgPSAvXi1tcy0vO1xudmFyIE1PVVNFX0VWRU5UX01BUCA9IHsgbW91c2VsZWF2ZTogJ21vdXNlb3V0JywgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicgfTtcbnZhciBqcUxpdGVNaW5FcnIgPSBtaW5FcnIoJ2pxTGl0ZScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGtlYmFiLWNhc2UgdG8gY2FtZWxDYXNlLlxuICogVGhlcmUgaXMgYWxzbyBhIHNwZWNpYWwgY2FzZSBmb3IgdGhlIG1zIHByZWZpeCBzdGFydGluZyB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci5cbiAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gbm9ybWFsaXplXG4gKi9cbmZ1bmN0aW9uIGNzc0tlYmFiVG9DYW1lbChuYW1lKSB7XG4gICAgcmV0dXJuIGtlYmFiVG9DYW1lbChuYW1lLnJlcGxhY2UoTVNfSEFDS19SRUdFWFAsICdtcy0nKSk7XG59XG5cbmZ1bmN0aW9uIGZuQ2FtZWxDYXNlUmVwbGFjZShhbGwsIGxldHRlcikge1xuICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQ29udmVydHMga2ViYWItY2FzZSB0byBjYW1lbENhc2UuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIHRvIG5vcm1hbGl6ZVxuICovXG5mdW5jdGlvbiBrZWJhYlRvQ2FtZWwobmFtZSkge1xuICByZXR1cm4gbmFtZVxuICAgIC5yZXBsYWNlKERBU0hfTE9XRVJDQVNFX1JFR0VYUCwgZm5DYW1lbENhc2VSZXBsYWNlKTtcbn1cblxudmFyIFNJTkdMRV9UQUdfUkVHRVhQID0gL148KFtcXHctXSspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvO1xudmFyIEhUTUxfUkVHRVhQID0gLzx8JiM/XFx3KzsvO1xudmFyIFRBR19OQU1FX1JFR0VYUCA9IC88KFtcXHc6LV0rKS87XG52YXIgWEhUTUxfVEFHX1JFR0VYUCA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcXHc6LV0rKVtePl0qKVxcLz4vZ2k7XG5cbnZhciB3cmFwTWFwID0ge1xuICAnb3B0aW9uJzogWzEsICc8c2VsZWN0IG11bHRpcGxlPVwibXVsdGlwbGVcIj4nLCAnPC9zZWxlY3Q+J10sXG5cbiAgJ3RoZWFkJzogWzEsICc8dGFibGU+JywgJzwvdGFibGU+J10sXG4gICdjb2wnOiBbMiwgJzx0YWJsZT48Y29sZ3JvdXA+JywgJzwvY29sZ3JvdXA+PC90YWJsZT4nXSxcbiAgJ3RyJzogWzIsICc8dGFibGU+PHRib2R5PicsICc8L3Rib2R5PjwvdGFibGU+J10sXG4gICd0ZCc6IFszLCAnPHRhYmxlPjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddLFxuICAnX2RlZmF1bHQnOiBbMCwgJycsICcnXVxufTtcblxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG5cbmZ1bmN0aW9uIGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkge1xuICByZXR1cm4gIUhUTUxfUkVHRVhQLnRlc3QoaHRtbCk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZUFjY2VwdHNEYXRhKG5vZGUpIHtcbiAgLy8gVGhlIHdpbmRvdyBvYmplY3QgY2FuIGFjY2VwdCBkYXRhIGJ1dCBoYXMgbm8gbm9kZVR5cGVcbiAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZWxlbWVudHMgKDEpIGFuZCBkb2N1bWVudHMgKDkpXG4gIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gIHJldHVybiBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQgfHwgIW5vZGVUeXBlIHx8IG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRE9DVU1FTlQ7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZUhhc0RhdGEobm9kZSkge1xuICBmb3IgKHZhciBrZXkgaW4ganFDYWNoZVtub2RlLm5nMzM5XSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24ganFMaXRlQ2xlYW5EYXRhKG5vZGVzKSB7XG4gIGZvciAodmFyIGkgPSAwLCBpaSA9IG5vZGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBqcUxpdGVSZW1vdmVEYXRhKG5vZGVzW2ldKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBqcUxpdGVCdWlsZEZyYWdtZW50KGh0bWwsIGNvbnRleHQpIHtcbiAgdmFyIHRtcCwgdGFnLCB3cmFwLFxuICAgICAgZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgIG5vZGVzID0gW10sIGk7XG5cbiAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkpIHtcbiAgICAvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcbiAgICBub2Rlcy5wdXNoKGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoaHRtbCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuICAgIHRtcCA9IGZyYWdtZW50LmFwcGVuZENoaWxkKGNvbnRleHQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgIHRhZyA9IChUQUdfTkFNRV9SRUdFWFAuZXhlYyhodG1sKSB8fCBbJycsICcnXSlbMV0udG9Mb3dlckNhc2UoKTtcbiAgICB3cmFwID0gd3JhcE1hcFt0YWddIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG4gICAgdG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBodG1sLnJlcGxhY2UoWEhUTUxfVEFHX1JFR0VYUCwgJzwkMT48LyQyPicpICsgd3JhcFsyXTtcblxuICAgIC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuICAgIGkgPSB3cmFwWzBdO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgbm9kZXMgPSBjb25jYXQobm9kZXMsIHRtcC5jaGlsZE5vZGVzKTtcblxuICAgIHRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG4gICAgdG1wLnRleHRDb250ZW50ID0gJyc7XG4gIH1cblxuICAvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG4gIGZyYWdtZW50LnRleHRDb250ZW50ID0gJyc7XG4gIGZyYWdtZW50LmlubmVySFRNTCA9ICcnOyAvLyBDbGVhciBpbm5lciBIVE1MXG4gIGZvckVhY2gobm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBqcUxpdGVQYXJzZUhUTUwoaHRtbCwgY29udGV4dCkge1xuICBjb250ZXh0ID0gY29udGV4dCB8fCB3aW5kb3cuZG9jdW1lbnQ7XG4gIHZhciBwYXJzZWQ7XG5cbiAgaWYgKChwYXJzZWQgPSBTSU5HTEVfVEFHX1JFR0VYUC5leGVjKGh0bWwpKSkge1xuICAgIHJldHVybiBbY29udGV4dC5jcmVhdGVFbGVtZW50KHBhcnNlZFsxXSldO1xuICB9XG5cbiAgaWYgKChwYXJzZWQgPSBqcUxpdGVCdWlsZEZyYWdtZW50KGh0bWwsIGNvbnRleHQpKSkge1xuICAgIHJldHVybiBwYXJzZWQuY2hpbGROb2RlcztcbiAgfVxuXG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24ganFMaXRlV3JhcE5vZGUobm9kZSwgd3JhcHBlcikge1xuICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gIGlmIChwYXJlbnQpIHtcbiAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHdyYXBwZXIsIG5vZGUpO1xuICB9XG5cbiAgd3JhcHBlci5hcHBlbmRDaGlsZChub2RlKTtcbn1cblxuXG4vLyBJRTktMTEgaGFzIG5vIG1ldGhvZCBcImNvbnRhaW5zXCIgaW4gU1ZHIGVsZW1lbnQgYW5kIGluIE5vZGUucHJvdG90eXBlLiBCdWcgIzEwMjU5LlxudmFyIGpxTGl0ZUNvbnRhaW5zID0gd2luZG93Lk5vZGUucHJvdG90eXBlLmNvbnRhaW5zIHx8IC8qKiBAdGhpcyAqLyBmdW5jdGlvbihhcmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuICEhKHRoaXMuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYXJnKSAmIDE2KTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gSlFMaXRlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKUUxpdGUpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHZhciBhcmdJc1N0cmluZztcblxuICBpZiAoaXNTdHJpbmcoZWxlbWVudCkpIHtcbiAgICBlbGVtZW50ID0gdHJpbShlbGVtZW50KTtcbiAgICBhcmdJc1N0cmluZyA9IHRydWU7XG4gIH1cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEpRTGl0ZSkpIHtcbiAgICBpZiAoYXJnSXNTdHJpbmcgJiYgZWxlbWVudC5jaGFyQXQoMCkgIT09ICc8Jykge1xuICAgICAgdGhyb3cganFMaXRlTWluRXJyKCdub3NlbCcsICdMb29raW5nIHVwIGVsZW1lbnRzIHZpYSBzZWxlY3RvcnMgaXMgbm90IHN1cHBvcnRlZCBieSBqcUxpdGUhIFNlZTogaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvYW5ndWxhci5lbGVtZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSlFMaXRlKGVsZW1lbnQpO1xuICB9XG5cbiAgaWYgKGFyZ0lzU3RyaW5nKSB7XG4gICAganFMaXRlQWRkTm9kZXModGhpcywganFMaXRlUGFyc2VIVE1MKGVsZW1lbnQpKTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGVsZW1lbnQpKSB7XG4gICAganFMaXRlUmVhZHkoZWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAganFMaXRlQWRkTm9kZXModGhpcywgZWxlbWVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlQ2xvbmUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZURlYWxvYyhlbGVtZW50LCBvbmx5RGVzY2VuZGFudHMpIHtcbiAgaWYgKCFvbmx5RGVzY2VuZGFudHMpIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCk7XG5cbiAgaWYgKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgIHZhciBkZXNjZW5kYW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gZGVzY2VuZGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBqcUxpdGVSZW1vdmVEYXRhKGRlc2NlbmRhbnRzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlT2ZmKGVsZW1lbnQsIHR5cGUsIGZuLCB1bnN1cHBvcnRlZCkge1xuICBpZiAoaXNEZWZpbmVkKHVuc3VwcG9ydGVkKSkgdGhyb3cganFMaXRlTWluRXJyKCdvZmZhcmdzJywgJ2pxTGl0ZSNvZmYoKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgc2VsZWN0b3JgIGFyZ3VtZW50Jyk7XG5cbiAgdmFyIGV4cGFuZG9TdG9yZSA9IGpxTGl0ZUV4cGFuZG9TdG9yZShlbGVtZW50KTtcbiAgdmFyIGV2ZW50cyA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZXZlbnRzO1xuICB2YXIgaGFuZGxlID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5oYW5kbGU7XG5cbiAgaWYgKCFoYW5kbGUpIHJldHVybjsgLy9ubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZFxuXG4gIGlmICghdHlwZSkge1xuICAgIGZvciAodHlwZSBpbiBldmVudHMpIHtcbiAgICAgIGlmICh0eXBlICE9PSAnJGRlc3Ryb3knKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICB9XG4gIH0gZWxzZSB7XG5cbiAgICB2YXIgcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lckZucyA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChpc0RlZmluZWQoZm4pKSB7XG4gICAgICAgIGFycmF5UmVtb3ZlKGxpc3RlbmVyRm5zIHx8IFtdLCBmbik7XG4gICAgICB9XG4gICAgICBpZiAoIShpc0RlZmluZWQoZm4pICYmIGxpc3RlbmVyRm5zICYmIGxpc3RlbmVyRm5zLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUpO1xuICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3JFYWNoKHR5cGUuc3BsaXQoJyAnKSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgcmVtb3ZlSGFuZGxlcih0eXBlKTtcbiAgICAgIGlmIChNT1VTRV9FVkVOVF9NQVBbdHlwZV0pIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihNT1VTRV9FVkVOVF9NQVBbdHlwZV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCwgbmFtZSkge1xuICB2YXIgZXhwYW5kb0lkID0gZWxlbWVudC5uZzMzOTtcbiAgdmFyIGV4cGFuZG9TdG9yZSA9IGV4cGFuZG9JZCAmJiBqcUNhY2hlW2V4cGFuZG9JZF07XG5cbiAgaWYgKGV4cGFuZG9TdG9yZSkge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBkZWxldGUgZXhwYW5kb1N0b3JlLmRhdGFbbmFtZV07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4cGFuZG9TdG9yZS5oYW5kbGUpIHtcbiAgICAgIGlmIChleHBhbmRvU3RvcmUuZXZlbnRzLiRkZXN0cm95KSB7XG4gICAgICAgIGV4cGFuZG9TdG9yZS5oYW5kbGUoe30sICckZGVzdHJveScpO1xuICAgICAgfVxuICAgICAganFMaXRlT2ZmKGVsZW1lbnQpO1xuICAgIH1cbiAgICBkZWxldGUganFDYWNoZVtleHBhbmRvSWRdO1xuICAgIGVsZW1lbnQubmczMzkgPSB1bmRlZmluZWQ7IC8vIGRvbid0IGRlbGV0ZSBET00gZXhwYW5kb3MuIElFIGFuZCBDaHJvbWUgZG9uJ3QgbGlrZSBpdFxuICB9XG59XG5cblxuZnVuY3Rpb24ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsIGNyZWF0ZUlmTmVjZXNzYXJ5KSB7XG4gIHZhciBleHBhbmRvSWQgPSBlbGVtZW50Lm5nMzM5LFxuICAgICAgZXhwYW5kb1N0b3JlID0gZXhwYW5kb0lkICYmIGpxQ2FjaGVbZXhwYW5kb0lkXTtcblxuICBpZiAoY3JlYXRlSWZOZWNlc3NhcnkgJiYgIWV4cGFuZG9TdG9yZSkge1xuICAgIGVsZW1lbnQubmczMzkgPSBleHBhbmRvSWQgPSBqcU5leHRJZCgpO1xuICAgIGV4cGFuZG9TdG9yZSA9IGpxQ2FjaGVbZXhwYW5kb0lkXSA9IHtldmVudHM6IHt9LCBkYXRhOiB7fSwgaGFuZGxlOiB1bmRlZmluZWR9O1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZG9TdG9yZTtcbn1cblxuXG5mdW5jdGlvbiBqcUxpdGVEYXRhKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGpxTGl0ZUFjY2VwdHNEYXRhKGVsZW1lbnQpKSB7XG4gICAgdmFyIHByb3A7XG5cbiAgICB2YXIgaXNTaW1wbGVTZXR0ZXIgPSBpc0RlZmluZWQodmFsdWUpO1xuICAgIHZhciBpc1NpbXBsZUdldHRlciA9ICFpc1NpbXBsZVNldHRlciAmJiBrZXkgJiYgIWlzT2JqZWN0KGtleSk7XG4gICAgdmFyIG1hc3NHZXR0ZXIgPSAha2V5O1xuICAgIHZhciBleHBhbmRvU3RvcmUgPSBqcUxpdGVFeHBhbmRvU3RvcmUoZWxlbWVudCwgIWlzU2ltcGxlR2V0dGVyKTtcbiAgICB2YXIgZGF0YSA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZGF0YTtcblxuICAgIGlmIChpc1NpbXBsZVNldHRlcikgeyAvLyBkYXRhKCdrZXknLCB2YWx1ZSlcbiAgICAgIGRhdGFba2ViYWJUb0NhbWVsKGtleSldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYXNzR2V0dGVyKSB7ICAvLyBkYXRhKClcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTaW1wbGVHZXR0ZXIpIHsgLy8gZGF0YSgna2V5JylcbiAgICAgICAgICAvLyBkb24ndCBmb3JjZSBjcmVhdGlvbiBvZiBleHBhbmRvU3RvcmUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXRcbiAgICAgICAgICByZXR1cm4gZGF0YSAmJiBkYXRhW2tlYmFiVG9DYW1lbChrZXkpXTtcbiAgICAgICAgfSBlbHNlIHsgLy8gbWFzcy1zZXR0ZXI6IGRhdGEoe2tleTE6IHZhbDEsIGtleTI6IHZhbDJ9KVxuICAgICAgICAgIGZvciAocHJvcCBpbiBrZXkpIHtcbiAgICAgICAgICAgIGRhdGFba2ViYWJUb0NhbWVsKHByb3ApXSA9IGtleVtwcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlSGFzQ2xhc3MoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgaWYgKCFlbGVtZW50LmdldEF0dHJpYnV0ZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKCgnICcgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgJyAnKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCAnICcpLlxuICAgICAgaW5kZXhPZignICcgKyBzZWxlY3RvciArICcgJykgPiAtMSk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZVJlbW92ZUNsYXNzKGVsZW1lbnQsIGNzc0NsYXNzZXMpIHtcbiAgaWYgKGNzc0NsYXNzZXMgJiYgZWxlbWVudC5zZXRBdHRyaWJ1dGUpIHtcbiAgICBmb3JFYWNoKGNzc0NsYXNzZXMuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY3NzQ2xhc3MpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHRyaW0oXG4gICAgICAgICAgKCcgJyArIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoL1tcXG5cXHRdL2csICcgJylcbiAgICAgICAgICAucmVwbGFjZSgnICcgKyB0cmltKGNzc0NsYXNzKSArICcgJywgJyAnKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlQWRkQ2xhc3MoZWxlbWVudCwgY3NzQ2xhc3Nlcykge1xuICBpZiAoY3NzQ2xhc3NlcyAmJiBlbGVtZW50LnNldEF0dHJpYnV0ZSkge1xuICAgIHZhciBleGlzdGluZ0NsYXNzZXMgPSAoJyAnICsgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnKSArICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcblxcdF0vZywgJyAnKTtcblxuICAgIGZvckVhY2goY3NzQ2xhc3Nlcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjc3NDbGFzcykge1xuICAgICAgY3NzQ2xhc3MgPSB0cmltKGNzc0NsYXNzKTtcbiAgICAgIGlmIChleGlzdGluZ0NsYXNzZXMuaW5kZXhPZignICcgKyBjc3NDbGFzcyArICcgJykgPT09IC0xKSB7XG4gICAgICAgIGV4aXN0aW5nQ2xhc3NlcyArPSBjc3NDbGFzcyArICcgJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHRyaW0oZXhpc3RpbmdDbGFzc2VzKSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBqcUxpdGVBZGROb2Rlcyhyb290LCBlbGVtZW50cykge1xuICAvLyBUSElTIENPREUgSVMgVkVSWSBIT1QuIERvbid0IG1ha2UgY2hhbmdlcyB3aXRob3V0IGJlbmNobWFya2luZy5cblxuICBpZiAoZWxlbWVudHMpIHtcblxuICAgIC8vIGlmIGEgTm9kZSAodGhlIG1vc3QgY29tbW9uIGNhc2UpXG4gICAgaWYgKGVsZW1lbnRzLm5vZGVUeXBlKSB7XG4gICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cbiAgICAgIC8vIGlmIGFuIEFycmF5IG9yIE5vZGVMaXN0IGFuZCBub3QgYSBXaW5kb3dcbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyAmJiBlbGVtZW50cy53aW5kb3cgIT09IGVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHM7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuZnVuY3Rpb24ganFMaXRlQ29udHJvbGxlcihlbGVtZW50LCBuYW1lKSB7XG4gIHJldHVybiBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQsICckJyArIChuYW1lIHx8ICduZ0NvbnRyb2xsZXInKSArICdDb250cm9sbGVyJyk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZUluaGVyaXRlZERhdGEoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHtcbiAgLy8gaWYgZWxlbWVudCBpcyB0aGUgZG9jdW1lbnQgb2JqZWN0IHdvcmsgd2l0aCB0aGUgaHRtbCBlbGVtZW50IGluc3RlYWRcbiAgLy8gdGhpcyBtYWtlcyAkKGRvY3VtZW50KS5zY29wZSgpIHBvc3NpYmxlXG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOT0RFX1RZUEVfRE9DVU1FTlQpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgdmFyIG5hbWVzID0gaXNBcnJheShuYW1lKSA/IG5hbWUgOiBbbmFtZV07XG5cbiAgd2hpbGUgKGVsZW1lbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBuYW1lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlID0ganFMaXRlLmRhdGEoZWxlbWVudCwgbmFtZXNbaV0pKSkgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIElmIGRlYWxpbmcgd2l0aCBhIGRvY3VtZW50IGZyYWdtZW50IG5vZGUgd2l0aCBhIGhvc3QgZWxlbWVudCwgYW5kIG5vIHBhcmVudCwgdXNlIHRoZSBob3N0XG4gICAgLy8gZWxlbWVudCBhcyB0aGUgcGFyZW50LiBUaGlzIGVuYWJsZXMgZGlyZWN0aXZlcyB3aXRoaW4gYSBTaGFkb3cgRE9NIG9yIHBvbHlmaWxsZWQgU2hhZG93IERPTVxuICAgIC8vIHRvIGxvb2t1cCBwYXJlbnQgY29udHJvbGxlcnMuXG4gICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSB8fCAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UICYmIGVsZW1lbnQuaG9zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlRW1wdHkoZWxlbWVudCkge1xuICBqcUxpdGVEZWFsb2MoZWxlbWVudCwgdHJ1ZSk7XG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlUmVtb3ZlKGVsZW1lbnQsIGtlZXBEYXRhKSB7XG4gIGlmICgha2VlcERhdGEpIGpxTGl0ZURlYWxvYyhlbGVtZW50KTtcbiAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xufVxuXG5cbmZ1bmN0aW9uIGpxTGl0ZURvY3VtZW50TG9hZGVkKGFjdGlvbiwgd2luKSB7XG4gIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG4gIGlmICh3aW4uZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgIC8vIEZvcmNlIHRoZSBhY3Rpb24gdG8gYmUgcnVuIGFzeW5jIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgLy8gZnJvbSB0aGUgYWN0aW9uJ3MgcG9pbnQgb2Ygdmlld1xuICAgIC8vIGkuZS4gaXQgd2lsbCBkZWZpbml0ZWx5IG5vdCBiZSBpbiBhICRhcHBseVxuICAgIHdpbi5zZXRUaW1lb3V0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gbmVlZCB0byB1bmJpbmQgdGhpcyBoYW5kbGVyIGFzIGxvYWQgaXMgb25seSBldmVyIGNhbGxlZCBvbmNlXG4gICAganFMaXRlKHdpbikub24oJ2xvYWQnLCBhY3Rpb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZVJlYWR5KGZuKSB7XG4gIGZ1bmN0aW9uIHRyaWdnZXIoKSB7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB0cmlnZ2VyKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRyaWdnZXIpO1xuICAgIGZuKCk7XG4gIH1cblxuICAvLyBjaGVjayBpZiBkb2N1bWVudCBpcyBhbHJlYWR5IGxvYWRlZFxuICBpZiAod2luZG93LmRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICB3aW5kb3cuc2V0VGltZW91dChmbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIG5vdCB1c2UganFMaXRlIHNpbmNlIHdlIGFyZSBub3QgZG9uZSBsb2FkaW5nIGFuZCBqUXVlcnkgY291bGQgYmUgbG9hZGVkIGxhdGVyLlxuXG4gICAgLy8gV29ya3MgZm9yIG1vZGVybiBicm93c2VycyBhbmQgSUU5XG4gICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB0cmlnZ2VyKTtcblxuICAgIC8vIEZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQgZm9yIG90aGVyc1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdHJpZ2dlcik7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBGdW5jdGlvbnMgd2hpY2ggYXJlIGRlY2xhcmVkIGRpcmVjdGx5LlxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG52YXIgSlFMaXRlUHJvdG90eXBlID0gSlFMaXRlLnByb3RvdHlwZSA9IHtcbiAgcmVhZHk6IGpxTGl0ZVJlYWR5LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gW107XG4gICAgZm9yRWFjaCh0aGlzLCBmdW5jdGlvbihlKSB7IHZhbHVlLnB1c2goJycgKyBlKTt9KTtcbiAgICByZXR1cm4gJ1snICsgdmFsdWUuam9pbignLCAnKSArICddJztcbiAgfSxcblxuICBlcTogZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIHJldHVybiAoaW5kZXggPj0gMCkgPyBqcUxpdGUodGhpc1tpbmRleF0pIDoganFMaXRlKHRoaXNbdGhpcy5sZW5ndGggKyBpbmRleF0pO1xuICB9LFxuXG4gIGxlbmd0aDogMCxcbiAgcHVzaDogcHVzaCxcbiAgc29ydDogW10uc29ydCxcbiAgc3BsaWNlOiBbXS5zcGxpY2Vcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRnVuY3Rpb25zIGl0ZXJhdGluZyBnZXR0ZXIvc2V0dGVycy5cbi8vIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gc2VsZiBvbiBzZXR0ZXIgYW5kXG4vLyB2YWx1ZSBvbiBnZXQuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbnZhciBCT09MRUFOX0FUVFIgPSB7fTtcbmZvckVhY2goJ211bHRpcGxlLHNlbGVjdGVkLGNoZWNrZWQsZGlzYWJsZWQscmVhZE9ubHkscmVxdWlyZWQsb3Blbicuc3BsaXQoJywnKSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgQk9PTEVBTl9BVFRSW2xvd2VyY2FzZSh2YWx1ZSldID0gdmFsdWU7XG59KTtcbnZhciBCT09MRUFOX0VMRU1FTlRTID0ge307XG5mb3JFYWNoKCdpbnB1dCxzZWxlY3Qsb3B0aW9uLHRleHRhcmVhLGJ1dHRvbixmb3JtLGRldGFpbHMnLnNwbGl0KCcsJyksIGZ1bmN0aW9uKHZhbHVlKSB7XG4gIEJPT0xFQU5fRUxFTUVOVFNbdmFsdWVdID0gdHJ1ZTtcbn0pO1xudmFyIEFMSUFTRURfQVRUUiA9IHtcbiAgJ25nTWlubGVuZ3RoJzogJ21pbmxlbmd0aCcsXG4gICduZ01heGxlbmd0aCc6ICdtYXhsZW5ndGgnLFxuICAnbmdNaW4nOiAnbWluJyxcbiAgJ25nTWF4JzogJ21heCcsXG4gICduZ1BhdHRlcm4nOiAncGF0dGVybicsXG4gICduZ1N0ZXAnOiAnc3RlcCdcbn07XG5cbmZ1bmN0aW9uIGdldEJvb2xlYW5BdHRyTmFtZShlbGVtZW50LCBuYW1lKSB7XG4gIC8vIGNoZWNrIGRvbSBsYXN0IHNpbmNlIHdlIHdpbGwgbW9zdCBsaWtlbHkgZmFpbCBvbiBuYW1lXG4gIHZhciBib29sZWFuQXR0ciA9IEJPT0xFQU5fQVRUUltuYW1lLnRvTG93ZXJDYXNlKCldO1xuXG4gIC8vIGJvb2xlYW5BdHRyIGlzIGhlcmUgdHdpY2UgdG8gbWluaW1pemUgRE9NIGFjY2Vzc1xuICByZXR1cm4gYm9vbGVhbkF0dHIgJiYgQk9PTEVBTl9FTEVNRU5UU1tub2RlTmFtZV8oZWxlbWVudCldICYmIGJvb2xlYW5BdHRyO1xufVxuXG5mdW5jdGlvbiBnZXRBbGlhc2VkQXR0ck5hbWUobmFtZSkge1xuICByZXR1cm4gQUxJQVNFRF9BVFRSW25hbWVdO1xufVxuXG5mb3JFYWNoKHtcbiAgZGF0YToganFMaXRlRGF0YSxcbiAgcmVtb3ZlRGF0YToganFMaXRlUmVtb3ZlRGF0YSxcbiAgaGFzRGF0YToganFMaXRlSGFzRGF0YSxcbiAgY2xlYW5EYXRhOiBqcUxpdGVDbGVhbkRhdGFcbn0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7XG4gIEpRTGl0ZVtuYW1lXSA9IGZuO1xufSk7XG5cbmZvckVhY2goe1xuICBkYXRhOiBqcUxpdGVEYXRhLFxuICBpbmhlcml0ZWREYXRhOiBqcUxpdGVJbmhlcml0ZWREYXRhLFxuXG4gIHNjb3BlOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgLy8gQ2FuJ3QgdXNlIGpxTGl0ZURhdGEgaGVyZSBkaXJlY3RseSBzbyB3ZSBzdGF5IGNvbXBhdGlibGUgd2l0aCBqUXVlcnkhXG4gICAgcmV0dXJuIGpxTGl0ZS5kYXRhKGVsZW1lbnQsICckc2NvcGUnKSB8fCBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQucGFyZW50Tm9kZSB8fCBlbGVtZW50LCBbJyRpc29sYXRlU2NvcGUnLCAnJHNjb3BlJ10pO1xuICB9LFxuXG4gIGlzb2xhdGVTY29wZTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIC8vIENhbid0IHVzZSBqcUxpdGVEYXRhIGhlcmUgZGlyZWN0bHkgc28gd2Ugc3RheSBjb21wYXRpYmxlIHdpdGggalF1ZXJ5IVxuICAgIHJldHVybiBqcUxpdGUuZGF0YShlbGVtZW50LCAnJGlzb2xhdGVTY29wZScpIHx8IGpxTGl0ZS5kYXRhKGVsZW1lbnQsICckaXNvbGF0ZVNjb3BlTm9UZW1wbGF0ZScpO1xuICB9LFxuXG4gIGNvbnRyb2xsZXI6IGpxTGl0ZUNvbnRyb2xsZXIsXG5cbiAgaW5qZWN0b3I6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICByZXR1cm4ganFMaXRlSW5oZXJpdGVkRGF0YShlbGVtZW50LCAnJGluamVjdG9yJyk7XG4gIH0sXG5cbiAgcmVtb3ZlQXR0cjogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9LFxuXG4gIGhhc0NsYXNzOiBqcUxpdGVIYXNDbGFzcyxcblxuICBjc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IGNzc0tlYmFiVG9DYW1lbChuYW1lKTtcblxuICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW25hbWVdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnN0eWxlW25hbWVdO1xuICAgIH1cbiAgfSxcblxuICBhdHRyOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgIHZhciByZXQ7XG4gICAgdmFyIG5vZGVUeXBlID0gZWxlbWVudC5ub2RlVHlwZTtcbiAgICBpZiAobm9kZVR5cGUgPT09IE5PREVfVFlQRV9URVhUIHx8IG5vZGVUeXBlID09PSBOT0RFX1RZUEVfQVRUUklCVVRFIHx8IG5vZGVUeXBlID09PSBOT0RFX1RZUEVfQ09NTUVOVCB8fFxuICAgICAgIWVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyY2FzZWROYW1lID0gbG93ZXJjYXNlKG5hbWUpO1xuICAgIHZhciBpc0Jvb2xlYW5BdHRyID0gQk9PTEVBTl9BVFRSW2xvd2VyY2FzZWROYW1lXTtcblxuICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAvLyBzZXR0ZXJcblxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8ICh2YWx1ZSA9PT0gZmFsc2UgJiYgaXNCb29sZWFuQXR0cikpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBpc0Jvb2xlYW5BdHRyID8gbG93ZXJjYXNlZE5hbWUgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGdldHRlclxuXG4gICAgICByZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgaWYgKGlzQm9vbGVhbkF0dHIgJiYgcmV0ICE9PSBudWxsKSB7XG4gICAgICAgIHJldCA9IGxvd2VyY2FzZWROYW1lO1xuICAgICAgfVxuICAgICAgLy8gTm9ybWFsaXplIG5vbi1leGlzdGluZyBhdHRyaWJ1dGVzIHRvIHVuZGVmaW5lZCAoYXMgalF1ZXJ5KS5cbiAgICAgIHJldHVybiByZXQgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG4gICAgfVxuICB9LFxuXG4gIHByb3A6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIGVsZW1lbnRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnRbbmFtZV07XG4gICAgfVxuICB9LFxuXG4gIHRleHQ6IChmdW5jdGlvbigpIHtcbiAgICBnZXRUZXh0LiRkdiA9ICcnO1xuICAgIHJldHVybiBnZXRUZXh0O1xuXG4gICAgZnVuY3Rpb24gZ2V0VGV4dChlbGVtZW50LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICB2YXIgbm9kZVR5cGUgPSBlbGVtZW50Lm5vZGVUeXBlO1xuICAgICAgICByZXR1cm4gKG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCB8fCBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQpID8gZWxlbWVudC50ZXh0Q29udGVudCA6ICcnO1xuICAgICAgfVxuICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgIH1cbiAgfSkoKSxcblxuICB2YWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgaWYgKGVsZW1lbnQubXVsdGlwbGUgJiYgbm9kZU5hbWVfKGVsZW1lbnQpID09PSAnc2VsZWN0Jykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGZvckVhY2goZWxlbWVudC5vcHRpb25zLCBmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24udmFsdWUgfHwgb3B0aW9uLnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG4gICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICB9LFxuXG4gIGh0bWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIH1cbiAgICBqcUxpdGVEZWFsb2MoZWxlbWVudCwgdHJ1ZSk7XG4gICAgZWxlbWVudC5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfSxcblxuICBlbXB0eToganFMaXRlRW1wdHlcbn0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7XG4gIC8qKlxuICAgKiBQcm9wZXJ0aWVzOiB3cml0ZXMgcmV0dXJuIHNlbGVjdGlvbiwgcmVhZHMgcmV0dXJuIGZpcnN0IHZhbHVlXG4gICAqL1xuICBKUUxpdGUucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oYXJnMSwgYXJnMikge1xuICAgIHZhciBpLCBrZXk7XG4gICAgdmFyIG5vZGVDb3VudCA9IHRoaXMubGVuZ3RoO1xuXG4gICAgLy8ganFMaXRlSGFzQ2xhc3MgaGFzIG9ubHkgdHdvIGFyZ3VtZW50cywgYnV0IGlzIGEgZ2V0dGVyLW9ubHkgZm4sIHNvIHdlIG5lZWQgdG8gc3BlY2lhbC1jYXNlIGl0XG4gICAgLy8gaW4gYSB3YXkgdGhhdCBzdXJ2aXZlcyBtaW5pZmljYXRpb24uXG4gICAgLy8ganFMaXRlRW1wdHkgdGFrZXMgbm8gYXJndW1lbnRzIGJ1dCBpcyBhIHNldHRlci5cbiAgICBpZiAoZm4gIT09IGpxTGl0ZUVtcHR5ICYmXG4gICAgICAgIChpc1VuZGVmaW5lZCgoZm4ubGVuZ3RoID09PSAyICYmIChmbiAhPT0ganFMaXRlSGFzQ2xhc3MgJiYgZm4gIT09IGpxTGl0ZUNvbnRyb2xsZXIpKSA/IGFyZzEgOiBhcmcyKSkpIHtcbiAgICAgIGlmIChpc09iamVjdChhcmcxKSkge1xuXG4gICAgICAgIC8vIHdlIGFyZSBhIHdyaXRlLCBidXQgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSB0aGUga2V5L3ZhbHVlc1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspIHtcbiAgICAgICAgICBpZiAoZm4gPT09IGpxTGl0ZURhdGEpIHtcbiAgICAgICAgICAgIC8vIGRhdGEoKSB0YWtlcyB0aGUgd2hvbGUgb2JqZWN0IGluIGpRdWVyeVxuICAgICAgICAgICAgZm4odGhpc1tpXSwgYXJnMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoa2V5IGluIGFyZzEpIHtcbiAgICAgICAgICAgICAgZm4odGhpc1tpXSwga2V5LCBhcmcxW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZXR1cm4gc2VsZiBmb3IgY2hhaW5pbmdcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3ZSBhcmUgYSByZWFkLCBzbyByZWFkIHRoZSBmaXJzdCBjaGlsZC5cbiAgICAgICAgLy8gVE9ETzogZG8gd2Ugc3RpbGwgbmVlZCB0aGlzP1xuICAgICAgICB2YXIgdmFsdWUgPSBmbi4kZHY7XG4gICAgICAgIC8vIE9ubHkgaWYgd2UgaGF2ZSAkZHYgZG8gd2UgaXRlcmF0ZSBvdmVyIGFsbCwgb3RoZXJ3aXNlIGl0IGlzIGp1c3QgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICAgIHZhciBqaiA9IChpc1VuZGVmaW5lZCh2YWx1ZSkpID8gTWF0aC5taW4obm9kZUNvdW50LCAxKSA6IG5vZGVDb3VudDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IGZuKHRoaXNbal0sIGFyZzEsIGFyZzIpO1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUgPyB2YWx1ZSArIG5vZGVWYWx1ZSA6IG5vZGVWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGFyZSBhIHdyaXRlLCBzbyBhcHBseSB0byBhbGwgY2hpbGRyZW5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlQ291bnQ7IGkrKykge1xuICAgICAgICBmbih0aGlzW2ldLCBhcmcxLCBhcmcyKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzZWxmIGZvciBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9O1xufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudHMpIHtcbiAgdmFyIGV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50LCB0eXBlKSB7XG4gICAgLy8galF1ZXJ5IHNwZWNpZmljIGFwaVxuICAgIGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfTtcblxuICAgIHZhciBldmVudEZucyA9IGV2ZW50c1t0eXBlIHx8IGV2ZW50LnR5cGVdO1xuICAgIHZhciBldmVudEZuc0xlbmd0aCA9IGV2ZW50Rm5zID8gZXZlbnRGbnMubGVuZ3RoIDogMDtcblxuICAgIGlmICghZXZlbnRGbnNMZW5ndGgpIHJldHVybjtcblxuICAgIGlmIChpc1VuZGVmaW5lZChldmVudC5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpKSB7XG4gICAgICB2YXIgb3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICBvcmlnaW5hbFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9PT0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLy8gU29tZSBldmVudHMgaGF2ZSBzcGVjaWFsIGhhbmRsZXJzIHRoYXQgd3JhcCB0aGUgcmVhbCBoYW5kbGVyXG4gICAgdmFyIGhhbmRsZXJXcmFwcGVyID0gZXZlbnRGbnMuc3BlY2lhbEhhbmRsZXJXcmFwcGVyIHx8IGRlZmF1bHRIYW5kbGVyV3JhcHBlcjtcblxuICAgIC8vIENvcHkgZXZlbnQgaGFuZGxlcnMgaW4gY2FzZSBldmVudCBoYW5kbGVycyBhcnJheSBpcyBtb2RpZmllZCBkdXJpbmcgZXhlY3V0aW9uLlxuICAgIGlmICgoZXZlbnRGbnNMZW5ndGggPiAxKSkge1xuICAgICAgZXZlbnRGbnMgPSBzaGFsbG93Q29weShldmVudEZucyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudEZuc0xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgaGFuZGxlcldyYXBwZXIoZWxlbWVudCwgZXZlbnQsIGV2ZW50Rm5zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2sgZm9yIGFuZ3VsYXJNb2Nrcy9jbGVhckRhdGFDYWNoZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGRlcmVnaXN0ZXIgYWxsXG4gIC8vICAgICAgIGV2ZW50cyBvbiBgZWxlbWVudGBcbiAgZXZlbnRIYW5kbGVyLmVsZW0gPSBlbGVtZW50O1xuICByZXR1cm4gZXZlbnRIYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0SGFuZGxlcldyYXBwZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIpIHtcbiAgaGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gc3BlY2lhbE1vdXNlSGFuZGxlcldyYXBwZXIodGFyZ2V0LCBldmVudCwgaGFuZGxlcikge1xuICAvLyBSZWZlciB0byBqUXVlcnkncyBpbXBsZW1lbnRhdGlvbiBvZiBtb3VzZWVudGVyICYgbW91c2VsZWF2ZVxuICAvLyBSZWFkIGFib3V0IG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmU6XG4gIC8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX21vdXNlLmh0bWwjbGluazhcbiAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAvLyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG4gIC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG4gIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqcUxpdGVDb250YWlucy5jYWxsKHRhcmdldCwgcmVsYXRlZCkpKSB7XG4gICAgaGFuZGxlci5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRnVuY3Rpb25zIGl0ZXJhdGluZyB0cmF2ZXJzYWwuXG4vLyBUaGVzZSBmdW5jdGlvbnMgY2hhaW4gcmVzdWx0cyBpbnRvIGEgc2luZ2xlXG4vLyBzZWxlY3Rvci5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZm9yRWFjaCh7XG4gIHJlbW92ZURhdGE6IGpxTGl0ZVJlbW92ZURhdGEsXG5cbiAgb246IGZ1bmN0aW9uIGpxTGl0ZU9uKGVsZW1lbnQsIHR5cGUsIGZuLCB1bnN1cHBvcnRlZCkge1xuICAgIGlmIChpc0RlZmluZWQodW5zdXBwb3J0ZWQpKSB0aHJvdyBqcUxpdGVNaW5FcnIoJ29uYXJncycsICdqcUxpdGUjb24oKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgc2VsZWN0b3JgIG9yIGBldmVudERhdGFgIHBhcmFtZXRlcnMnKTtcblxuICAgIC8vIERvIG5vdCBhZGQgZXZlbnQgaGFuZGxlcnMgdG8gbm9uLWVsZW1lbnRzIGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSBjbGVhbmVkIHVwLlxuICAgIGlmICghanFMaXRlQWNjZXB0c0RhdGEoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsIHRydWUpO1xuICAgIHZhciBldmVudHMgPSBleHBhbmRvU3RvcmUuZXZlbnRzO1xuICAgIHZhciBoYW5kbGUgPSBleHBhbmRvU3RvcmUuaGFuZGxlO1xuXG4gICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgIGhhbmRsZSA9IGV4cGFuZG9TdG9yZS5oYW5kbGUgPSBjcmVhdGVFdmVudEhhbmRsZXIoZWxlbWVudCwgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9zdHJpbmctaW5kZXhvZi12cy1zcGxpdFxuICAgIHZhciB0eXBlcyA9IHR5cGUuaW5kZXhPZignICcpID49IDAgPyB0eXBlLnNwbGl0KCcgJykgOiBbdHlwZV07XG4gICAgdmFyIGkgPSB0eXBlcy5sZW5ndGg7XG5cbiAgICB2YXIgYWRkSGFuZGxlciA9IGZ1bmN0aW9uKHR5cGUsIHNwZWNpYWxIYW5kbGVyV3JhcHBlciwgbm9FdmVudExpc3RlbmVyKSB7XG4gICAgICB2YXIgZXZlbnRGbnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICghZXZlbnRGbnMpIHtcbiAgICAgICAgZXZlbnRGbnMgPSBldmVudHNbdHlwZV0gPSBbXTtcbiAgICAgICAgZXZlbnRGbnMuc3BlY2lhbEhhbmRsZXJXcmFwcGVyID0gc3BlY2lhbEhhbmRsZXJXcmFwcGVyO1xuICAgICAgICBpZiAodHlwZSAhPT0gJyRkZXN0cm95JyAmJiAhbm9FdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZXZlbnRGbnMucHVzaChmbik7XG4gICAgfTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgIGlmIChNT1VTRV9FVkVOVF9NQVBbdHlwZV0pIHtcbiAgICAgICAgYWRkSGFuZGxlcihNT1VTRV9FVkVOVF9NQVBbdHlwZV0sIHNwZWNpYWxNb3VzZUhhbmRsZXJXcmFwcGVyKTtcbiAgICAgICAgYWRkSGFuZGxlcih0eXBlLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkSGFuZGxlcih0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgb2ZmOiBqcUxpdGVPZmYsXG5cbiAgb25lOiBmdW5jdGlvbihlbGVtZW50LCB0eXBlLCBmbikge1xuICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7XG5cbiAgICAvL2FkZCB0aGUgbGlzdGVuZXIgdHdpY2Ugc28gdGhhdCB3aGVuIGl0IGlzIGNhbGxlZFxuICAgIC8veW91IGNhbiByZW1vdmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGFuZCBzdGlsbCBiZVxuICAgIC8vYWJsZSB0byBjYWxsIGVsZW1lbnQub2ZmKGV2LCBmbikgbm9ybWFsbHlcbiAgICBlbGVtZW50Lm9uKHR5cGUsIGZ1bmN0aW9uIG9uRm4oKSB7XG4gICAgICBlbGVtZW50Lm9mZih0eXBlLCBmbik7XG4gICAgICBlbGVtZW50Lm9mZih0eXBlLCBvbkZuKTtcbiAgICB9KTtcbiAgICBlbGVtZW50Lm9uKHR5cGUsIGZuKTtcbiAgfSxcblxuICByZXBsYWNlV2l0aDogZnVuY3Rpb24oZWxlbWVudCwgcmVwbGFjZU5vZGUpIHtcbiAgICB2YXIgaW5kZXgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICBqcUxpdGVEZWFsb2MoZWxlbWVudCk7XG4gICAgZm9yRWFjaChuZXcgSlFMaXRlKHJlcGxhY2VOb2RlKSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgaW5kZXgubmV4dFNpYmxpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gbm9kZTtcbiAgICB9KTtcbiAgfSxcblxuICBjaGlsZHJlbjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgIGZvckVhY2goZWxlbWVudC5jaGlsZE5vZGVzLCBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH0sXG5cbiAgY29udGVudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgZWxlbWVudC5jaGlsZE5vZGVzIHx8IFtdO1xuICB9LFxuXG4gIGFwcGVuZDogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkge1xuICAgIHZhciBub2RlVHlwZSA9IGVsZW1lbnQubm9kZVR5cGU7XG4gICAgaWYgKG5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCAmJiBub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UKSByZXR1cm47XG5cbiAgICBub2RlID0gbmV3IEpRTGl0ZShub2RlKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5vZGUubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfSxcblxuICBwcmVwZW5kOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7XG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5PREVfVFlQRV9FTEVNRU5UKSB7XG4gICAgICB2YXIgaW5kZXggPSBlbGVtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICBmb3JFYWNoKG5ldyBKUUxpdGUobm9kZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbmRleCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgd3JhcDogZnVuY3Rpb24oZWxlbWVudCwgd3JhcE5vZGUpIHtcbiAgICBqcUxpdGVXcmFwTm9kZShlbGVtZW50LCBqcUxpdGUod3JhcE5vZGUpLmVxKDApLmNsb25lKClbMF0pO1xuICB9LFxuXG4gIHJlbW92ZToganFMaXRlUmVtb3ZlLFxuXG4gIGRldGFjaDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIGpxTGl0ZVJlbW92ZShlbGVtZW50LCB0cnVlKTtcbiAgfSxcblxuICBhZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgbmV3RWxlbWVudCkge1xuICAgIHZhciBpbmRleCA9IGVsZW1lbnQsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIG5ld0VsZW1lbnQgPSBuZXcgSlFMaXRlKG5ld0VsZW1lbnQpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBuZXdFbGVtZW50Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXdFbGVtZW50W2ldO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGluZGV4Lm5leHRTaWJsaW5nKTtcbiAgICAgICAgaW5kZXggPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhZGRDbGFzczoganFMaXRlQWRkQ2xhc3MsXG4gIHJlbW92ZUNsYXNzOiBqcUxpdGVSZW1vdmVDbGFzcyxcblxuICB0b2dnbGVDbGFzczogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IsIGNvbmRpdGlvbikge1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgZm9yRWFjaChzZWxlY3Rvci5zcGxpdCgnICcpLCBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgICAgdmFyIGNsYXNzQ29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoY2xhc3NDb25kaXRpb24pKSB7XG4gICAgICAgICAgY2xhc3NDb25kaXRpb24gPSAhanFMaXRlSGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAoY2xhc3NDb25kaXRpb24gPyBqcUxpdGVBZGRDbGFzcyA6IGpxTGl0ZVJlbW92ZUNsYXNzKShlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHBhcmVudDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCA/IHBhcmVudCA6IG51bGw7XG4gIH0sXG5cbiAgbmV4dDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgfSxcblxuICBmaW5kOiBmdW5jdGlvbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGlmIChlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH0sXG5cbiAgY2xvbmU6IGpxTGl0ZUNsb25lLFxuXG4gIHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbihlbGVtZW50LCBldmVudCwgZXh0cmFQYXJhbWV0ZXJzKSB7XG5cbiAgICB2YXIgZHVtbXlFdmVudCwgZXZlbnRGbnNDb3B5LCBoYW5kbGVyQXJncztcbiAgICB2YXIgZXZlbnROYW1lID0gZXZlbnQudHlwZSB8fCBldmVudDtcbiAgICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQpO1xuICAgIHZhciBldmVudHMgPSBleHBhbmRvU3RvcmUgJiYgZXhwYW5kb1N0b3JlLmV2ZW50cztcbiAgICB2YXIgZXZlbnRGbnMgPSBldmVudHMgJiYgZXZlbnRzW2V2ZW50TmFtZV07XG5cbiAgICBpZiAoZXZlbnRGbnMpIHtcbiAgICAgIC8vIENyZWF0ZSBhIGR1bW15IGV2ZW50IHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJzXG4gICAgICBkdW1teUV2ZW50ID0ge1xuICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7IHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH0sXG4gICAgICAgIGlzRGVmYXVsdFByZXZlbnRlZDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHRydWU7IH0sXG4gICAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7IHRoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsgfSxcbiAgICAgICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPT09IHRydWU7IH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogbm9vcCxcbiAgICAgICAgdHlwZTogZXZlbnROYW1lLFxuICAgICAgICB0YXJnZXQ6IGVsZW1lbnRcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIGEgY3VzdG9tIGV2ZW50IHdhcyBwcm92aWRlZCB0aGVuIGV4dGVuZCBvdXIgZHVtbXkgZXZlbnQgd2l0aCBpdFxuICAgICAgaWYgKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgZHVtbXlFdmVudCA9IGV4dGVuZChkdW1teUV2ZW50LCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvcHkgZXZlbnQgaGFuZGxlcnMgaW4gY2FzZSBldmVudCBoYW5kbGVycyBhcnJheSBpcyBtb2RpZmllZCBkdXJpbmcgZXhlY3V0aW9uLlxuICAgICAgZXZlbnRGbnNDb3B5ID0gc2hhbGxvd0NvcHkoZXZlbnRGbnMpO1xuICAgICAgaGFuZGxlckFyZ3MgPSBleHRyYVBhcmFtZXRlcnMgPyBbZHVtbXlFdmVudF0uY29uY2F0KGV4dHJhUGFyYW1ldGVycykgOiBbZHVtbXlFdmVudF07XG5cbiAgICAgIGZvckVhY2goZXZlbnRGbnNDb3B5LCBmdW5jdGlvbihmbikge1xuICAgICAgICBpZiAoIWR1bW15RXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICAgIGZuLmFwcGx5KGVsZW1lbnQsIGhhbmRsZXJBcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59LCBmdW5jdGlvbihmbiwgbmFtZSkge1xuICAvKipcbiAgICogY2hhaW5pbmcgZnVuY3Rpb25zXG4gICAqL1xuICBKUUxpdGUucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHZhciB2YWx1ZTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IGZuKHRoaXNbaV0sIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgIC8vIGFueSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgdmFsdWUgbmVlZHMgdG8gYmUgd3JhcHBlZFxuICAgICAgICAgIHZhbHVlID0ganFMaXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganFMaXRlQWRkTm9kZXModmFsdWUsIGZuKHRoaXNbaV0sIGFyZzEsIGFyZzIsIGFyZzMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRGVmaW5lZCh2YWx1ZSkgPyB2YWx1ZSA6IHRoaXM7XG4gIH07XG59KTtcblxuLy8gYmluZCBsZWdhY3kgYmluZC91bmJpbmQgdG8gb24vb2ZmXG5KUUxpdGUucHJvdG90eXBlLmJpbmQgPSBKUUxpdGUucHJvdG90eXBlLm9uO1xuSlFMaXRlLnByb3RvdHlwZS51bmJpbmQgPSBKUUxpdGUucHJvdG90eXBlLm9mZjtcblxuXG4vLyBQcm92aWRlciBmb3IgcHJpdmF0ZSAkJGpxTGl0ZSBzZXJ2aWNlXG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICQkanFMaXRlUHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IGZ1bmN0aW9uICQkanFMaXRlKCkge1xuICAgIHJldHVybiBleHRlbmQoSlFMaXRlLCB7XG4gICAgICBoYXNDbGFzczogZnVuY3Rpb24obm9kZSwgY2xhc3Nlcykge1xuICAgICAgICBpZiAobm9kZS5hdHRyKSBub2RlID0gbm9kZVswXTtcbiAgICAgICAgcmV0dXJuIGpxTGl0ZUhhc0NsYXNzKG5vZGUsIGNsYXNzZXMpO1xuICAgICAgfSxcbiAgICAgIGFkZENsYXNzOiBmdW5jdGlvbihub2RlLCBjbGFzc2VzKSB7XG4gICAgICAgIGlmIChub2RlLmF0dHIpIG5vZGUgPSBub2RlWzBdO1xuICAgICAgICByZXR1cm4ganFMaXRlQWRkQ2xhc3Mobm9kZSwgY2xhc3Nlcyk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKG5vZGUsIGNsYXNzZXMpIHtcbiAgICAgICAgaWYgKG5vZGUuYXR0cikgbm9kZSA9IG5vZGVbMF07XG4gICAgICAgIHJldHVybiBqcUxpdGVSZW1vdmVDbGFzcyhub2RlLCBjbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhIGhhc2ggb2YgYW4gJ29iaicuXG4gKiBIYXNoIG9mIGE6XG4gKiAgc3RyaW5nIGlzIHN0cmluZ1xuICogIG51bWJlciBpcyBudW1iZXIgYXMgc3RyaW5nXG4gKiAgb2JqZWN0IGlzIGVpdGhlciByZXN1bHQgb2YgY2FsbGluZyAkJGhhc2hLZXkgZnVuY3Rpb24gb24gdGhlIG9iamVjdCBvciB1bmlxdWVseSBnZW5lcmF0ZWQgaWQsXG4gKiAgICAgICAgIHRoYXQgaXMgYWxzbyBhc3NpZ25lZCB0byB0aGUgJCRoYXNoS2V5IHByb3BlcnR5IG9mIHRoZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIG9ialxuICogQHJldHVybnMge3N0cmluZ30gaGFzaCBzdHJpbmcgc3VjaCB0aGF0IHRoZSBzYW1lIGlucHV0IHdpbGwgaGF2ZSB0aGUgc2FtZSBoYXNoIHN0cmluZy5cbiAqICAgICAgICAgVGhlIHJlc3VsdGluZyBzdHJpbmcga2V5IGlzIGluICd0eXBlOmhhc2hLZXknIGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gaGFzaEtleShvYmosIG5leHRVaWRGbikge1xuICB2YXIga2V5ID0gb2JqICYmIG9iai4kJGhhc2hLZXk7XG5cbiAgaWYgKGtleSkge1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBrZXkgPSBvYmouJCRoYXNoS2V5KCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICB2YXIgb2JqVHlwZSA9IHR5cGVvZiBvYmo7XG4gIGlmIChvYmpUeXBlID09PSAnZnVuY3Rpb24nIHx8IChvYmpUeXBlID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpKSB7XG4gICAga2V5ID0gb2JqLiQkaGFzaEtleSA9IG9ialR5cGUgKyAnOicgKyAobmV4dFVpZEZuIHx8IG5leHRVaWQpKCk7XG4gIH0gZWxzZSB7XG4gICAga2V5ID0gb2JqVHlwZSArICc6JyArIG9iajtcbiAgfVxuXG4gIHJldHVybiBrZXk7XG59XG5cbi8qKlxuICogSGFzaE1hcCB3aGljaCBjYW4gdXNlIG9iamVjdHMgYXMga2V5c1xuICovXG5mdW5jdGlvbiBIYXNoTWFwKGFycmF5LCBpc29sYXRlZFVpZCkge1xuICBpZiAoaXNvbGF0ZWRVaWQpIHtcbiAgICB2YXIgdWlkID0gMDtcbiAgICB0aGlzLm5leHRVaWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiArK3VpZDtcbiAgICB9O1xuICB9XG4gIGZvckVhY2goYXJyYXksIHRoaXMucHV0LCB0aGlzKTtcbn1cbkhhc2hNYXAucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogU3RvcmUga2V5IHZhbHVlIHBhaXJcbiAgICogQHBhcmFtIGtleSBrZXkgdG8gc3RvcmUgY2FuIGJlIGFueSB0eXBlXG4gICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBzdG9yZSBjYW4gYmUgYW55IHR5cGVcbiAgICovXG4gIHB1dDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHRoaXNbaGFzaEtleShrZXksIHRoaXMubmV4dFVpZCldID0gdmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnMge09iamVjdH0gdGhlIHZhbHVlIGZvciB0aGUga2V5XG4gICAqL1xuICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiB0aGlzW2hhc2hLZXkoa2V5LCB0aGlzLm5leHRVaWQpXTtcbiAgfSxcblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBrZXkvdmFsdWUgcGFpclxuICAgKiBAcGFyYW0ga2V5XG4gICAqL1xuICByZW1vdmU6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXNba2V5ID0gaGFzaEtleShrZXksIHRoaXMubmV4dFVpZCldO1xuICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG52YXIgJCRIYXNoTWFwUHJvdmlkZXIgPSBbLyoqIEB0aGlzICovZnVuY3Rpb24oKSB7XG4gIHRoaXMuJGdldCA9IFtmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gSGFzaE1hcDtcbiAgfV07XG59XTtcblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBtb2R1bGUgbmdcbiAqIEBuYW1lIGFuZ3VsYXIuaW5qZWN0b3JcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGVzIGFuIGluamVjdG9yIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGZvciByZXRyaWV2aW5nIHNlcnZpY2VzIGFzIHdlbGwgYXMgZm9yXG4gKiBkZXBlbmRlbmN5IGluamVjdGlvbiAoc2VlIHtAbGluayBndWlkZS9kaSBkZXBlbmRlbmN5IGluamVjdGlvbn0pLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZ3xGdW5jdGlvbj59IG1vZHVsZXMgQSBsaXN0IG9mIG1vZHVsZSBmdW5jdGlvbnMgb3IgdGhlaXIgYWxpYXNlcy4gU2VlXG4gKiAgICAge0BsaW5rIGFuZ3VsYXIubW9kdWxlfS4gVGhlIGBuZ2AgbW9kdWxlIG11c3QgYmUgZXhwbGljaXRseSBhZGRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtzdHJpY3REaT1mYWxzZV0gV2hldGhlciB0aGUgaW5qZWN0b3Igc2hvdWxkIGJlIGluIHN0cmljdCBtb2RlLCB3aGljaFxuICogICAgIGRpc2FsbG93cyBhcmd1bWVudCBuYW1lIGFubm90YXRpb24gaW5mZXJlbmNlLlxuICogQHJldHVybnMge2luamVjdG9yfSBJbmplY3RvciBvYmplY3QuIFNlZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogVHlwaWNhbCB1c2FnZVxuICogYGBganNcbiAqICAgLy8gY3JlYXRlIGFuIGluamVjdG9yXG4gKiAgIHZhciAkaW5qZWN0b3IgPSBhbmd1bGFyLmluamVjdG9yKFsnbmcnXSk7XG4gKlxuICogICAvLyB1c2UgdGhlIGluamVjdG9yIHRvIGtpY2sgb2ZmIHlvdXIgYXBwbGljYXRpb25cbiAqICAgLy8gdXNlIHRoZSB0eXBlIGluZmVyZW5jZSB0byBhdXRvIGluamVjdCBhcmd1bWVudHMsIG9yIHVzZSBpbXBsaWNpdCBpbmplY3Rpb25cbiAqICAgJGluamVjdG9yLmludm9rZShmdW5jdGlvbigkcm9vdFNjb3BlLCAkY29tcGlsZSwgJGRvY3VtZW50KSB7XG4gKiAgICAgJGNvbXBpbGUoJGRvY3VtZW50KSgkcm9vdFNjb3BlKTtcbiAqICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTtcbiAqICAgfSk7XG4gKiBgYGBcbiAqXG4gKiBTb21ldGltZXMgeW91IHdhbnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgaW5qZWN0b3Igb2YgYSBjdXJyZW50bHkgcnVubmluZyBBbmd1bGFyIGFwcFxuICogZnJvbSBvdXRzaWRlIEFuZ3VsYXIuIFBlcmhhcHMsIHlvdSB3YW50IHRvIGluamVjdCBhbmQgY29tcGlsZSBzb21lIG1hcmt1cCBhZnRlciB0aGVcbiAqIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGJvb3RzdHJhcHBlZC4gWW91IGNhbiBkbyB0aGlzIHVzaW5nIHRoZSBleHRyYSBgaW5qZWN0b3IoKWAgYWRkZWRcbiAqIHRvIEpRdWVyeS9qcUxpdGUgZWxlbWVudHMuIFNlZSB7QGxpbmsgYW5ndWxhci5lbGVtZW50fS5cbiAqXG4gKiAqVGhpcyBpcyBmYWlybHkgcmFyZSBidXQgY291bGQgYmUgdGhlIGNhc2UgaWYgYSB0aGlyZCBwYXJ0eSBsaWJyYXJ5IGlzIGluamVjdGluZyB0aGVcbiAqIG1hcmt1cC4qXG4gKlxuICogSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGEgbmV3IGJsb2NrIG9mIEhUTUwgY29udGFpbmluZyBhIGBuZy1jb250cm9sbGVyYFxuICogZGlyZWN0aXZlIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IGJvZHkgYnkgSlF1ZXJ5LiBXZSB0aGVuIGNvbXBpbGUgYW5kIGxpbmtcbiAqIGl0IGludG8gdGhlIGN1cnJlbnQgQW5ndWxhckpTIHNjb3BlLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgJGRpdiA9ICQoJzxkaXYgbmctY29udHJvbGxlcj1cIk15Q3RybFwiPnt7Y29udGVudC5sYWJlbH19PC9kaXY+Jyk7XG4gKiAkKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgkZGl2KTtcbiAqXG4gKiBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLmluamVjdG9yKCkuaW52b2tlKGZ1bmN0aW9uKCRjb21waWxlKSB7XG4gKiAgIHZhciBzY29wZSA9IGFuZ3VsYXIuZWxlbWVudCgkZGl2KS5zY29wZSgpO1xuICogICAkY29tcGlsZSgkZGl2KShzY29wZSk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgbW9kdWxlXG4gKiBAbmFtZSBhdXRvXG4gKiBAaW5zdGFsbGF0aW9uXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBJbXBsaWNpdCBtb2R1bGUgd2hpY2ggZ2V0cyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGVhY2gge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uXG4gKi9cblxudmFyIEFSUk9XX0FSRyA9IC9eKFteKF0rPyk9Pi87XG52YXIgRk5fQVJHUyA9IC9eW14oXSpcXChcXHMqKFteKV0qKVxcKS9tO1xudmFyIEZOX0FSR19TUExJVCA9IC8sLztcbnZhciBGTl9BUkcgPSAvXlxccyooXz8pKFxcUys/KVxcMVxccyokLztcbnZhciBTVFJJUF9DT01NRU5UUyA9IC8oKFxcL1xcLy4qJCl8KFxcL1xcKltcXHNcXFNdKj9cXCpcXC8pKS9tZztcbnZhciAkaW5qZWN0b3JNaW5FcnIgPSBtaW5FcnIoJyRpbmplY3RvcicpO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlGbihmbikge1xuICAvLyBTdXBwb3J0OiBDaHJvbWUgNTAtNTEgb25seVxuICAvLyBDcmVhdGluZyBhIG5ldyBzdHJpbmcgYnkgYWRkaW5nIGAnICdgIGF0IHRoZSBlbmQsIHRvIGhhY2sgYXJvdW5kIHNvbWUgYnVnIGluIENocm9tZSB2NTAvNTFcbiAgLy8gKFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy8xNDQ4Ny4pXG4gIC8vIFRPRE8gKGdrYWxwYWspOiBSZW1vdmUgd29ya2Fyb3VuZCB3aGVuIENocm9tZSB2NTIgaXMgcmVsZWFzZWRcbiAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZuKSArICcgJztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFyZ3MoZm4pIHtcbiAgdmFyIGZuVGV4dCA9IHN0cmluZ2lmeUZuKGZuKS5yZXBsYWNlKFNUUklQX0NPTU1FTlRTLCAnJyksXG4gICAgICBhcmdzID0gZm5UZXh0Lm1hdGNoKEFSUk9XX0FSRykgfHwgZm5UZXh0Lm1hdGNoKEZOX0FSR1MpO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gYW5vbkZuKGZuKSB7XG4gIC8vIEZvciBhbm9ueW1vdXMgZnVuY3Rpb25zLCBzaG93aW5nIGF0IHRoZSB2ZXJ5IGxlYXN0IHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgY2FuIGhlbHAgaW5cbiAgLy8gZGVidWdnaW5nLlxuICB2YXIgYXJncyA9IGV4dHJhY3RBcmdzKGZuKTtcbiAgaWYgKGFyZ3MpIHtcbiAgICByZXR1cm4gJ2Z1bmN0aW9uKCcgKyAoYXJnc1sxXSB8fCAnJykucmVwbGFjZSgvW1xcc1xcclxcbl0rLywgJyAnKSArICcpJztcbiAgfVxuICByZXR1cm4gJ2ZuJztcbn1cblxuZnVuY3Rpb24gYW5ub3RhdGUoZm4sIHN0cmljdERpLCBuYW1lKSB7XG4gIHZhciAkaW5qZWN0LFxuICAgICAgYXJnRGVjbCxcbiAgICAgIGxhc3Q7XG5cbiAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghKCRpbmplY3QgPSBmbi4kaW5qZWN0KSkge1xuICAgICAgJGluamVjdCA9IFtdO1xuICAgICAgaWYgKGZuLmxlbmd0aCkge1xuICAgICAgICBpZiAoc3RyaWN0RGkpIHtcbiAgICAgICAgICBpZiAoIWlzU3RyaW5nKG5hbWUpIHx8ICFuYW1lKSB7XG4gICAgICAgICAgICBuYW1lID0gZm4ubmFtZSB8fCBhbm9uRm4oZm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ3N0cmljdGRpJyxcbiAgICAgICAgICAgICd7MH0gaXMgbm90IHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb24gYW5kIGNhbm5vdCBiZSBpbnZva2VkIGluIHN0cmljdCBtb2RlJywgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXJnRGVjbCA9IGV4dHJhY3RBcmdzKGZuKTtcbiAgICAgICAgZm9yRWFjaChhcmdEZWNsWzFdLnNwbGl0KEZOX0FSR19TUExJVCksIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgIGFyZy5yZXBsYWNlKEZOX0FSRywgZnVuY3Rpb24oYWxsLCB1bmRlcnNjb3JlLCBuYW1lKSB7XG4gICAgICAgICAgICAkaW5qZWN0LnB1c2gobmFtZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZm4uJGluamVjdCA9ICRpbmplY3Q7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgbGFzdCA9IGZuLmxlbmd0aCAtIDE7XG4gICAgYXNzZXJ0QXJnRm4oZm5bbGFzdF0sICdmbicpO1xuICAgICRpbmplY3QgPSBmbi5zbGljZSgwLCBsYXN0KTtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnRBcmdGbihmbiwgJ2ZuJywgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuICRpbmplY3Q7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkaW5qZWN0b3JcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBgJGluamVjdG9yYCBpcyB1c2VkIHRvIHJldHJpZXZlIG9iamVjdCBpbnN0YW5jZXMgYXMgZGVmaW5lZCBieVxuICoge0BsaW5rIGF1dG8uJHByb3ZpZGUgcHJvdmlkZXJ9LCBpbnN0YW50aWF0ZSB0eXBlcywgaW52b2tlIG1ldGhvZHMsXG4gKiBhbmQgbG9hZCBtb2R1bGVzLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgYWx3YXlzIGhvbGRzIHRydWU6XG4gKlxuICogYGBganNcbiAqICAgdmFyICRpbmplY3RvciA9IGFuZ3VsYXIuaW5qZWN0b3IoKTtcbiAqICAgZXhwZWN0KCRpbmplY3Rvci5nZXQoJyRpbmplY3RvcicpKS50b0JlKCRpbmplY3Rvcik7XG4gKiAgIGV4cGVjdCgkaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKCRpbmplY3Rvcikge1xuICogICAgIHJldHVybiAkaW5qZWN0b3I7XG4gKiAgIH0pKS50b0JlKCRpbmplY3Rvcik7XG4gKiBgYGBcbiAqXG4gKiAjIEluamVjdGlvbiBGdW5jdGlvbiBBbm5vdGF0aW9uXG4gKlxuICogSmF2YVNjcmlwdCBkb2VzIG5vdCBoYXZlIGFubm90YXRpb25zLCBhbmQgYW5ub3RhdGlvbnMgYXJlIG5lZWRlZCBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uIFRoZVxuICogZm9sbG93aW5nIGFyZSBhbGwgdmFsaWQgd2F5cyBvZiBhbm5vdGF0aW5nIGZ1bmN0aW9uIHdpdGggaW5qZWN0aW9uIGFyZ3VtZW50cyBhbmQgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogYGBganNcbiAqICAgLy8gaW5mZXJyZWQgKG9ubHkgd29ya3MgaWYgY29kZSBub3QgbWluaWZpZWQvb2JmdXNjYXRlZClcbiAqICAgJGluamVjdG9yLmludm9rZShmdW5jdGlvbihzZXJ2aWNlQSl7fSk7XG4gKlxuICogICAvLyBhbm5vdGF0ZWRcbiAqICAgZnVuY3Rpb24gZXhwbGljaXQoc2VydmljZUEpIHt9O1xuICogICBleHBsaWNpdC4kaW5qZWN0ID0gWydzZXJ2aWNlQSddO1xuICogICAkaW5qZWN0b3IuaW52b2tlKGV4cGxpY2l0KTtcbiAqXG4gKiAgIC8vIGlubGluZVxuICogICAkaW5qZWN0b3IuaW52b2tlKFsnc2VydmljZUEnLCBmdW5jdGlvbihzZXJ2aWNlQSl7fV0pO1xuICogYGBgXG4gKlxuICogIyMgSW5mZXJlbmNlXG4gKlxuICogSW4gSmF2YVNjcmlwdCBjYWxsaW5nIGB0b1N0cmluZygpYCBvbiBhIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uIFRoZSBkZWZpbml0aW9uXG4gKiBjYW4gdGhlbiBiZSBwYXJzZWQgYW5kIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY2FuIGJlIGV4dHJhY3RlZC4gVGhpcyBtZXRob2Qgb2YgZGlzY292ZXJpbmdcbiAqIGFubm90YXRpb25zIGlzIGRpc2FsbG93ZWQgd2hlbiB0aGUgaW5qZWN0b3IgaXMgaW4gc3RyaWN0IG1vZGUuXG4gKiAqTk9URToqIFRoaXMgZG9lcyBub3Qgd29yayB3aXRoIG1pbmlmaWNhdGlvbiwgYW5kIG9iZnVzY2F0aW9uIHRvb2xzIHNpbmNlIHRoZXNlIHRvb2xzIGNoYW5nZSB0aGVcbiAqIGFyZ3VtZW50IG5hbWVzLlxuICpcbiAqICMjIGAkaW5qZWN0YCBBbm5vdGF0aW9uXG4gKiBCeSBhZGRpbmcgYW4gYCRpbmplY3RgIHByb3BlcnR5IG9udG8gYSBmdW5jdGlvbiB0aGUgaW5qZWN0aW9uIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZC5cbiAqXG4gKiAjIyBJbmxpbmVcbiAqIEFzIGFuIGFycmF5IG9mIGluamVjdGlvbiBuYW1lcywgd2hlcmUgdGhlIGxhc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkaW5qZWN0b3IjZ2V0XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIHRvIHJldHJpZXZlLlxuICogQHBhcmFtIHtzdHJpbmc9fSBjYWxsZXIgQW4gb3B0aW9uYWwgc3RyaW5nIHRvIHByb3ZpZGUgdGhlIG9yaWdpbiBvZiB0aGUgZnVuY3Rpb24gY2FsbCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5zdGFuY2UuXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkaW5qZWN0b3IjaW52b2tlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbnZva2UgdGhlIG1ldGhvZCBhbmQgc3VwcGx5IHRoZSBtZXRob2QgYXJndW1lbnRzIGZyb20gdGhlIGAkaW5qZWN0b3JgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXkuPHN0cmluZ3xGdW5jdGlvbj59IGZuIFRoZSBpbmplY3RhYmxlIGZ1bmN0aW9uIHRvIGludm9rZS4gRnVuY3Rpb24gcGFyYW1ldGVycyBhcmVcbiAqICAgaW5qZWN0ZWQgYWNjb3JkaW5nIHRvIHRoZSB7QGxpbmsgZ3VpZGUvZGkgJGluamVjdCBBbm5vdGF0aW9ufSBydWxlcy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gc2VsZiBUaGUgYHRoaXNgIGZvciB0aGUgaW52b2tlZCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdD19IGxvY2FscyBPcHRpb25hbCBvYmplY3QuIElmIHByZXNldCB0aGVuIGFueSBhcmd1bWVudCBuYW1lcyBhcmUgcmVhZCBmcm9tIHRoaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmaXJzdCwgYmVmb3JlIHRoZSBgJGluamVjdG9yYCBpcyBjb25zdWx0ZWQuXG4gKiBAcmV0dXJucyB7Kn0gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBpbnZva2VkIGBmbmAgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkaW5qZWN0b3IjaGFzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBbGxvd3MgdGhlIHVzZXIgdG8gcXVlcnkgaWYgdGhlIHBhcnRpY3VsYXIgc2VydmljZSBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgc2VydmljZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgaW5qZWN0b3IgaGFzIGdpdmVuIHNlcnZpY2UuXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkaW5qZWN0b3IjaW5zdGFudGlhdGVcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEpTIHR5cGUuIFRoZSBtZXRob2QgdGFrZXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgaW52b2tlcyB0aGUgbmV3XG4gKiBvcGVyYXRvciwgYW5kIHN1cHBsaWVzIGFsbCBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlXG4gKiBjb25zdHJ1Y3RvciBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFR5cGUgQW5ub3RhdGVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3Q9fSBsb2NhbHMgT3B0aW9uYWwgb2JqZWN0LiBJZiBwcmVzZXQgdGhlbiBhbnkgYXJndW1lbnQgbmFtZXMgYXJlIHJlYWQgZnJvbSB0aGlzXG4gKiBvYmplY3QgZmlyc3QsIGJlZm9yZSB0aGUgYCRpbmplY3RvcmAgaXMgY29uc3VsdGVkLlxuICogQHJldHVybnMge09iamVjdH0gbmV3IGluc3RhbmNlIG9mIGBUeXBlYC5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRpbmplY3RvciNhbm5vdGF0ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBhbiBhcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyByZXF1ZXN0aW5nIGZvciBpbmplY3Rpb24uIFRoaXMgQVBJIGlzXG4gKiB1c2VkIGJ5IHRoZSBpbmplY3RvciB0byBkZXRlcm1pbmUgd2hpY2ggc2VydmljZXMgbmVlZCB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBmdW5jdGlvbiB3aGVuIHRoZVxuICogZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGNhbiBiZSBhbm5vdGF0ZWQgd2l0aCB0aGUgbmVlZGVkXG4gKiBkZXBlbmRlbmNpZXMuXG4gKlxuICogIyBBcmd1bWVudCBuYW1lc1xuICpcbiAqIFRoZSBzaW1wbGVzdCBmb3JtIGlzIHRvIGV4dHJhY3QgdGhlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBhcmd1bWVudHMgb2YgdGhlIGZ1bmN0aW9uLiBUaGlzIGlzIGRvbmVcbiAqIGJ5IGNvbnZlcnRpbmcgdGhlIGZ1bmN0aW9uIGludG8gYSBzdHJpbmcgdXNpbmcgYHRvU3RyaW5nKClgIG1ldGhvZCBhbmQgZXh0cmFjdGluZyB0aGUgYXJndW1lbnRcbiAqIG5hbWVzLlxuICogYGBganNcbiAqICAgLy8gR2l2ZW5cbiAqICAgZnVuY3Rpb24gTXlDb250cm9sbGVyKCRzY29wZSwgJHJvdXRlKSB7XG4gKiAgICAgLy8gLi4uXG4gKiAgIH1cbiAqXG4gKiAgIC8vIFRoZW5cbiAqICAgZXhwZWN0KGluamVjdG9yLmFubm90YXRlKE15Q29udHJvbGxlcikpLnRvRXF1YWwoWyckc2NvcGUnLCAnJHJvdXRlJ10pO1xuICogYGBgXG4gKlxuICogWW91IGNhbiBkaXNhbGxvdyB0aGlzIG1ldGhvZCBieSB1c2luZyBzdHJpY3QgaW5qZWN0aW9uIG1vZGUuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIGNvZGUgbWluaWZpY2F0aW9uIC8gb2JmdXNjYXRpb24uIEZvciB0aGlzIHJlYXNvbiB0aGUgZm9sbG93aW5nXG4gKiBhbm5vdGF0aW9uIHN0cmF0ZWdpZXMgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiAjIFRoZSBgJGluamVjdGAgcHJvcGVydHlcbiAqXG4gKiBJZiBhIGZ1bmN0aW9uIGhhcyBhbiBgJGluamVjdGAgcHJvcGVydHkgYW5kIGl0cyB2YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLCB0aGVuIHRoZSBzdHJpbmdzXG4gKiByZXByZXNlbnQgbmFtZXMgb2Ygc2VydmljZXMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgZnVuY3Rpb24uXG4gKiBgYGBqc1xuICogICAvLyBHaXZlblxuICogICB2YXIgTXlDb250cm9sbGVyID0gZnVuY3Rpb24ob2JmdXNjYXRlZFNjb3BlLCBvYmZ1c2NhdGVkUm91dGUpIHtcbiAqICAgICAvLyAuLi5cbiAqICAgfVxuICogICAvLyBEZWZpbmUgZnVuY3Rpb24gZGVwZW5kZW5jaWVzXG4gKiAgIE15Q29udHJvbGxlclsnJGluamVjdCddID0gWyckc2NvcGUnLCAnJHJvdXRlJ107XG4gKlxuICogICAvLyBUaGVuXG4gKiAgIGV4cGVjdChpbmplY3Rvci5hbm5vdGF0ZShNeUNvbnRyb2xsZXIpKS50b0VxdWFsKFsnJHNjb3BlJywgJyRyb3V0ZSddKTtcbiAqIGBgYFxuICpcbiAqICMgVGhlIGFycmF5IG5vdGF0aW9uXG4gKlxuICogSXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGlubGluZSBJbmplY3RlZCBmdW5jdGlvbnMgYW5kIHRoYXQncyB3aGVuIHNldHRpbmcgdGhlIGAkaW5qZWN0YCBwcm9wZXJ0eVxuICogaXMgdmVyeSBpbmNvbnZlbmllbnQuIEluIHRoZXNlIHNpdHVhdGlvbnMgdXNpbmcgdGhlIGFycmF5IG5vdGF0aW9uIHRvIHNwZWNpZnkgdGhlIGRlcGVuZGVuY2llcyBpblxuICogYSB3YXkgdGhhdCBzdXJ2aXZlcyBtaW5pZmljYXRpb24gaXMgYSBiZXR0ZXIgY2hvaWNlOlxuICpcbiAqIGBgYGpzXG4gKiAgIC8vIFdlIHdpc2ggdG8gd3JpdGUgdGhpcyAobm90IG1pbmlmaWNhdGlvbiAvIG9iZnVzY2F0aW9uIHNhZmUpXG4gKiAgIGluamVjdG9yLmludm9rZShmdW5jdGlvbigkY29tcGlsZSwgJHJvb3RTY29wZSkge1xuICogICAgIC8vIC4uLlxuICogICB9KTtcbiAqXG4gKiAgIC8vIFdlIGFyZSBmb3JjZWQgdG8gd3JpdGUgYnJlYWsgaW5saW5pbmdcbiAqICAgdmFyIHRtcEZuID0gZnVuY3Rpb24ob2JmdXNjYXRlZENvbXBpbGUsIG9iZnVzY2F0ZWRSb290U2NvcGUpIHtcbiAqICAgICAvLyAuLi5cbiAqICAgfTtcbiAqICAgdG1wRm4uJGluamVjdCA9IFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZSddO1xuICogICBpbmplY3Rvci5pbnZva2UodG1wRm4pO1xuICpcbiAqICAgLy8gVG8gYmV0dGVyIHN1cHBvcnQgaW5saW5lIGZ1bmN0aW9uIHRoZSBpbmxpbmUgYW5ub3RhdGlvbiBpcyBzdXBwb3J0ZWRcbiAqICAgaW5qZWN0b3IuaW52b2tlKFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKG9iZkNvbXBpbGUsIG9iZlJvb3RTY29wZSkge1xuICogICAgIC8vIC4uLlxuICogICB9XSk7XG4gKlxuICogICAvLyBUaGVyZWZvcmVcbiAqICAgZXhwZWN0KGluamVjdG9yLmFubm90YXRlKFxuICogICAgICBbJyRjb21waWxlJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbihvYmZ1c18kY29tcGlsZSwgb2JmdXNfJHJvb3RTY29wZSkge31dKVxuICogICAgKS50b0VxdWFsKFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZSddKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXkuPHN0cmluZ3xGdW5jdGlvbj59IGZuIEZ1bmN0aW9uIGZvciB3aGljaCBkZXBlbmRlbnQgc2VydmljZSBuYW1lcyBuZWVkIHRvXG4gKiBiZSByZXRyaWV2ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtzdHJpY3REaT1mYWxzZV0gRGlzYWxsb3cgYXJndW1lbnQgbmFtZSBhbm5vdGF0aW9uIGluZmVyZW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXkuPHN0cmluZz59IFRoZSBuYW1lcyBvZiB0aGUgc2VydmljZXMgd2hpY2ggdGhlIGZ1bmN0aW9uIHJlcXVpcmVzLlxuICovXG5cblxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkcHJvdmlkZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoZSB7QGxpbmsgYXV0by4kcHJvdmlkZSAkcHJvdmlkZX0gc2VydmljZSBoYXMgYSBudW1iZXIgb2YgbWV0aG9kcyBmb3IgcmVnaXN0ZXJpbmcgY29tcG9uZW50c1xuICogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIE1hbnkgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBhbHNvIGV4cG9zZWQgb25cbiAqIHtAbGluayBhbmd1bGFyLk1vZHVsZX0uXG4gKlxuICogQW4gQW5ndWxhciAqKnNlcnZpY2UqKiBpcyBhIHNpbmdsZXRvbiBvYmplY3QgY3JlYXRlZCBieSBhICoqc2VydmljZSBmYWN0b3J5KiouICBUaGVzZSAqKnNlcnZpY2VcbiAqIGZhY3RvcmllcyoqIGFyZSBmdW5jdGlvbnMgd2hpY2gsIGluIHR1cm4sIGFyZSBjcmVhdGVkIGJ5IGEgKipzZXJ2aWNlIHByb3ZpZGVyKiouXG4gKiBUaGUgKipzZXJ2aWNlIHByb3ZpZGVycyoqIGFyZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMuIFdoZW4gaW5zdGFudGlhdGVkIHRoZXkgbXVzdCBjb250YWluIGFcbiAqIHByb3BlcnR5IGNhbGxlZCBgJGdldGAsIHdoaWNoIGhvbGRzIHRoZSAqKnNlcnZpY2UgZmFjdG9yeSoqIGZ1bmN0aW9uLlxuICpcbiAqIFdoZW4geW91IHJlcXVlc3QgYSBzZXJ2aWNlLCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgdGhlXG4gKiBjb3JyZWN0ICoqc2VydmljZSBwcm92aWRlcioqLCBpbnN0YW50aWF0aW5nIGl0IGFuZCB0aGVuIGNhbGxpbmcgaXRzIGAkZ2V0YCAqKnNlcnZpY2UgZmFjdG9yeSoqXG4gKiBmdW5jdGlvbiB0byBnZXQgdGhlIGluc3RhbmNlIG9mIHRoZSAqKnNlcnZpY2UqKi5cbiAqXG4gKiBPZnRlbiBzZXJ2aWNlcyBoYXZlIG5vIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgbWV0aG9kcyB0byB0aGUgc2VydmljZVxuICogcHJvdmlkZXIuICBUaGUgcHJvdmlkZXIgd2lsbCBiZSBubyBtb3JlIHRoYW4gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIGEgYCRnZXRgIHByb3BlcnR5LiBGb3JcbiAqIHRoZXNlIGNhc2VzIHRoZSB7QGxpbmsgYXV0by4kcHJvdmlkZSAkcHJvdmlkZX0gc2VydmljZSBoYXMgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kcyB0byByZWdpc3RlclxuICogc2VydmljZXMgd2l0aG91dCBzcGVjaWZ5aW5nIGEgcHJvdmlkZXIuXG4gKlxuICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNwcm92aWRlciBwcm92aWRlcihuYW1lLCBwcm92aWRlcil9IC0gcmVnaXN0ZXJzIGEgKipzZXJ2aWNlIHByb3ZpZGVyKiogd2l0aCB0aGVcbiAqICAgICB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfVxuICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNjb25zdGFudCBjb25zdGFudChuYW1lLCBvYmopfSAtIHJlZ2lzdGVycyBhIHZhbHVlL29iamVjdCB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBieVxuICogICAgIHByb3ZpZGVycyBhbmQgc2VydmljZXMuXG4gKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlIHZhbHVlKG5hbWUsIG9iail9IC0gcmVnaXN0ZXJzIGEgdmFsdWUvb2JqZWN0IHRoYXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYnlcbiAqICAgICBzZXJ2aWNlcywgbm90IHByb3ZpZGVycy5cbiAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSBmYWN0b3J5KG5hbWUsIGZuKX0gLSByZWdpc3RlcnMgYSBzZXJ2aWNlICoqZmFjdG9yeSBmdW5jdGlvbioqXG4gKiAgICAgdGhhdCB3aWxsIGJlIHdyYXBwZWQgaW4gYSAqKnNlcnZpY2UgcHJvdmlkZXIqKiBvYmplY3QsIHdob3NlIGAkZ2V0YCBwcm9wZXJ0eSB3aWxsIGNvbnRhaW4gdGhlXG4gKiAgICAgZ2l2ZW4gZmFjdG9yeSBmdW5jdGlvbi5cbiAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjc2VydmljZSBzZXJ2aWNlKG5hbWUsIEZuKX0gLSByZWdpc3RlcnMgYSAqKmNvbnN0cnVjdG9yIGZ1bmN0aW9uKipcbiAqICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBpbiBhICoqc2VydmljZSBwcm92aWRlcioqIG9iamVjdCwgd2hvc2UgYCRnZXRgIHByb3BlcnR5IHdpbGwgaW5zdGFudGlhdGVcbiAqICAgICAgYSBuZXcgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjZGVjb3JhdG9yIGRlY29yYXRvcihuYW1lLCBkZWNvckZuKX0gLSByZWdpc3RlcnMgYSAqKmRlY29yYXRvciBmdW5jdGlvbioqIHRoYXRcbiAqICAgICAgd2lsbCBiZSBhYmxlIHRvIG1vZGlmeSBvciByZXBsYWNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhbm90aGVyIHNlcnZpY2UuXG4gKlxuICogU2VlIHRoZSBpbmRpdmlkdWFsIG1ldGhvZHMgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLlxuICovXG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgJHByb3ZpZGUjcHJvdmlkZXJcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFJlZ2lzdGVyIGEgKipwcm92aWRlciBmdW5jdGlvbioqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBQcm92aWRlciBmdW5jdGlvbnNcbiAqIGFyZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMsIHdob3NlIGluc3RhbmNlcyBhcmUgcmVzcG9uc2libGUgZm9yIFwicHJvdmlkaW5nXCIgYSBmYWN0b3J5IGZvciBhXG4gKiBzZXJ2aWNlLlxuICpcbiAqIFNlcnZpY2UgcHJvdmlkZXIgbmFtZXMgc3RhcnQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0aGV5IHByb3ZpZGUgZm9sbG93ZWQgYnkgYFByb3ZpZGVyYC5cbiAqIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIG5nLiRsb2cgJGxvZ30gc2VydmljZSBoYXMgYSBwcm92aWRlciBjYWxsZWRcbiAqIHtAbGluayBuZy4kbG9nUHJvdmlkZXIgJGxvZ1Byb3ZpZGVyfS5cbiAqXG4gKiBTZXJ2aWNlIHByb3ZpZGVyIG9iamVjdHMgY2FuIGhhdmUgYWRkaXRpb25hbCBtZXRob2RzIHdoaWNoIGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb3ZpZGVyXG4gKiBhbmQgaXRzIHNlcnZpY2UuIEltcG9ydGFudGx5LCB5b3UgY2FuIGNvbmZpZ3VyZSB3aGF0IGtpbmQgb2Ygc2VydmljZSBpcyBjcmVhdGVkIGJ5IHRoZSBgJGdldGBcbiAqIG1ldGhvZCwgb3IgaG93IHRoYXQgc2VydmljZSB3aWxsIGFjdC4gRm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgbmcuJGxvZ1Byb3ZpZGVyICRsb2dQcm92aWRlcn0gaGFzIGFcbiAqIG1ldGhvZCB7QGxpbmsgbmcuJGxvZ1Byb3ZpZGVyI2RlYnVnRW5hYmxlZCBkZWJ1Z0VuYWJsZWR9XG4gKiB3aGljaCBsZXRzIHlvdSBzcGVjaWZ5IHdoZXRoZXIgdGhlIHtAbGluayBuZy4kbG9nICRsb2d9IHNlcnZpY2Ugd2lsbCBsb2cgZGVidWcgbWVzc2FnZXMgdG8gdGhlXG4gKiBjb25zb2xlIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UuIE5PVEU6IHRoZSBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSB1bmRlciBgbmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnUHJvdmlkZXInYCBrZXkuXG4gKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24oKSl9IHByb3ZpZGVyIElmIHRoZSBwcm92aWRlciBpczpcbiAqXG4gKiAgIC0gYE9iamVjdGA6IHRoZW4gaXQgc2hvdWxkIGhhdmUgYSBgJGdldGAgbWV0aG9kLiBUaGUgYCRnZXRgIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgdXNpbmdcbiAqICAgICB7QGxpbmsgYXV0by4kaW5qZWN0b3IjaW52b2tlICRpbmplY3Rvci5pbnZva2UoKX0gd2hlbiBhbiBpbnN0YW5jZSBuZWVkcyB0byBiZSBjcmVhdGVkLlxuICogICAtIGBDb25zdHJ1Y3RvcmA6IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aWxsIGJlIGNyZWF0ZWQgdXNpbmdcbiAqICAgICB7QGxpbmsgYXV0by4kaW5qZWN0b3IjaW5zdGFudGlhdGUgJGluamVjdG9yLmluc3RhbnRpYXRlKCl9LCB0aGVuIHRyZWF0ZWQgYXMgYG9iamVjdGAuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gcmVnaXN0ZXJlZCBwcm92aWRlciBpbnN0YW5jZVxuXG4gKiBAZXhhbXBsZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gY3JlYXRlIGEgc2ltcGxlIGV2ZW50IHRyYWNraW5nIHNlcnZpY2UgYW5kIHJlZ2lzdGVyIGl0IHVzaW5nXG4gKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNwcm92aWRlciAkcHJvdmlkZS5wcm92aWRlcigpfS5cbiAqXG4gKiBgYGBqc1xuICogIC8vIERlZmluZSB0aGUgZXZlbnRUcmFja2VyIHByb3ZpZGVyXG4gKiAgZnVuY3Rpb24gRXZlbnRUcmFja2VyUHJvdmlkZXIoKSB7XG4gKiAgICB2YXIgdHJhY2tpbmdVcmwgPSAnL3RyYWNrJztcbiAqXG4gKiAgICAvLyBBIHByb3ZpZGVyIG1ldGhvZCBmb3IgY29uZmlndXJpbmcgd2hlcmUgdGhlIHRyYWNrZWQgZXZlbnRzIHNob3VsZCBiZWVuIHNhdmVkXG4gKiAgICB0aGlzLnNldFRyYWNraW5nVXJsID0gZnVuY3Rpb24odXJsKSB7XG4gKiAgICAgIHRyYWNraW5nVXJsID0gdXJsO1xuICogICAgfTtcbiAqXG4gKiAgICAvLyBUaGUgc2VydmljZSBmYWN0b3J5IGZ1bmN0aW9uXG4gKiAgICB0aGlzLiRnZXQgPSBbJyRodHRwJywgZnVuY3Rpb24oJGh0dHApIHtcbiAqICAgICAgdmFyIHRyYWNrZWRFdmVudHMgPSB7fTtcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAvLyBDYWxsIHRoaXMgdG8gdHJhY2sgYW4gZXZlbnRcbiAqICAgICAgICBldmVudDogZnVuY3Rpb24oZXZlbnQpIHtcbiAqICAgICAgICAgIHZhciBjb3VudCA9IHRyYWNrZWRFdmVudHNbZXZlbnRdIHx8IDA7XG4gKiAgICAgICAgICBjb3VudCArPSAxO1xuICogICAgICAgICAgdHJhY2tlZEV2ZW50c1tldmVudF0gPSBjb3VudDtcbiAqICAgICAgICAgIHJldHVybiBjb3VudDtcbiAqICAgICAgICB9LFxuICogICAgICAgIC8vIENhbGwgdGhpcyB0byBzYXZlIHRoZSB0cmFja2VkIGV2ZW50cyB0byB0aGUgdHJhY2tpbmdVcmxcbiAqICAgICAgICBzYXZlOiBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgICRodHRwLnBvc3QodHJhY2tpbmdVcmwsIHRyYWNrZWRFdmVudHMpO1xuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICAgIH1dO1xuICogIH1cbiAqXG4gKiAgZGVzY3JpYmUoJ2V2ZW50VHJhY2tlcicsIGZ1bmN0aW9uKCkge1xuICogICAgdmFyIHBvc3RTcHk7XG4gKlxuICogICAgYmVmb3JlRWFjaChtb2R1bGUoZnVuY3Rpb24oJHByb3ZpZGUpIHtcbiAqICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50VHJhY2tlciBwcm92aWRlclxuICogICAgICAkcHJvdmlkZS5wcm92aWRlcignZXZlbnRUcmFja2VyJywgRXZlbnRUcmFja2VyUHJvdmlkZXIpO1xuICogICAgfSkpO1xuICpcbiAqICAgIGJlZm9yZUVhY2gobW9kdWxlKGZ1bmN0aW9uKGV2ZW50VHJhY2tlclByb3ZpZGVyKSB7XG4gKiAgICAgIC8vIENvbmZpZ3VyZSBldmVudFRyYWNrZXIgcHJvdmlkZXJcbiAqICAgICAgZXZlbnRUcmFja2VyUHJvdmlkZXIuc2V0VHJhY2tpbmdVcmwoJy9jdXN0b20tdHJhY2snKTtcbiAqICAgIH0pKTtcbiAqXG4gKiAgICBpdCgndHJhY2tzIGV2ZW50cycsIGluamVjdChmdW5jdGlvbihldmVudFRyYWNrZXIpIHtcbiAqICAgICAgZXhwZWN0KGV2ZW50VHJhY2tlci5ldmVudCgnbG9naW4nKSkudG9FcXVhbCgxKTtcbiAqICAgICAgZXhwZWN0KGV2ZW50VHJhY2tlci5ldmVudCgnbG9naW4nKSkudG9FcXVhbCgyKTtcbiAqICAgIH0pKTtcbiAqXG4gKiAgICBpdCgnc2F2ZXMgdG8gdGhlIHRyYWNraW5nIHVybCcsIGluamVjdChmdW5jdGlvbihldmVudFRyYWNrZXIsICRodHRwKSB7XG4gKiAgICAgIHBvc3RTcHkgPSBzcHlPbigkaHR0cCwgJ3Bvc3QnKTtcbiAqICAgICAgZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpO1xuICogICAgICBldmVudFRyYWNrZXIuc2F2ZSgpO1xuICogICAgICBleHBlY3QocG9zdFNweSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICogICAgICBleHBlY3QocG9zdFNweS5tb3N0UmVjZW50Q2FsbC5hcmdzWzBdKS5ub3QudG9FcXVhbCgnL3RyYWNrJyk7XG4gKiAgICAgIGV4cGVjdChwb3N0U3B5Lm1vc3RSZWNlbnRDYWxsLmFyZ3NbMF0pLnRvRXF1YWwoJy9jdXN0b20tdHJhY2snKTtcbiAqICAgICAgZXhwZWN0KHBvc3RTcHkubW9zdFJlY2VudENhbGwuYXJnc1sxXSkudG9FcXVhbCh7ICdsb2dpbic6IDEgfSk7XG4gKiAgICB9KSk7XG4gKiAgfSk7XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRwcm92aWRlI2ZhY3RvcnlcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFJlZ2lzdGVyIGEgKipzZXJ2aWNlIGZhY3RvcnkqKiwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgdG8gcmV0dXJuIHRoZSBzZXJ2aWNlIGluc3RhbmNlLlxuICogVGhpcyBpcyBzaG9ydCBmb3IgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlIHdoZXJlIGl0cyBwcm92aWRlciBjb25zaXN0cyBvZiBvbmx5IGEgYCRnZXRgIHByb3BlcnR5LFxuICogd2hpY2ggaXMgdGhlIGdpdmVuIHNlcnZpY2UgZmFjdG9yeSBmdW5jdGlvbi5cbiAqIFlvdSBzaG91bGQgdXNlIHtAbGluayBhdXRvLiRwcm92aWRlI2ZhY3RvcnkgJHByb3ZpZGUuZmFjdG9yeShnZXRGbil9IGlmIHlvdSBkbyBub3QgbmVlZCB0b1xuICogY29uZmlndXJlIHlvdXIgc2VydmljZSBpbiBhIHByb3ZpZGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXkuPHN0cmluZ3xGdW5jdGlvbj59ICRnZXRGbiBUaGUgaW5qZWN0YWJsZSAkZ2V0Rm4gZm9yIHRoZSBpbnN0YW5jZSBjcmVhdGlvbi5cbiAqICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsbHkgdGhpcyBpcyBhIHNob3J0IGhhbmQgZm9yIGAkcHJvdmlkZS5wcm92aWRlcihuYW1lLCB7JGdldDogJGdldEZufSlgLlxuICogQHJldHVybnMge09iamVjdH0gcmVnaXN0ZXJlZCBwcm92aWRlciBpbnN0YW5jZVxuICpcbiAqIEBleGFtcGxlXG4gKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlXG4gKiBgYGBqc1xuICogICAkcHJvdmlkZS5mYWN0b3J5KCdwaW5nJywgWyckaHR0cCcsIGZ1bmN0aW9uKCRodHRwKSB7XG4gKiAgICAgcmV0dXJuIGZ1bmN0aW9uIHBpbmcoKSB7XG4gKiAgICAgICByZXR1cm4gJGh0dHAuc2VuZCgnL3BpbmcnKTtcbiAqICAgICB9O1xuICogICB9XSk7XG4gKiBgYGBcbiAqIFlvdSB3b3VsZCB0aGVuIGluamVjdCBhbmQgdXNlIHRoaXMgc2VydmljZSBsaWtlIHRoaXM6XG4gKiBgYGBqc1xuICogICBzb21lTW9kdWxlLmNvbnRyb2xsZXIoJ0N0cmwnLCBbJ3BpbmcnLCBmdW5jdGlvbihwaW5nKSB7XG4gKiAgICAgcGluZygpO1xuICogICB9XSk7XG4gKiBgYGBcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgJHByb3ZpZGUjc2VydmljZVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogUmVnaXN0ZXIgYSAqKnNlcnZpY2UgY29uc3RydWN0b3IqKiwgd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdpdGggYG5ld2AgdG8gY3JlYXRlIHRoZSBzZXJ2aWNlXG4gKiBpbnN0YW5jZS5cbiAqIFRoaXMgaXMgc2hvcnQgZm9yIHJlZ2lzdGVyaW5nIGEgc2VydmljZSB3aGVyZSBpdHMgcHJvdmlkZXIncyBgJGdldGAgcHJvcGVydHkgaXMgYSBmYWN0b3J5XG4gKiBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UgaW5zdGFudGlhdGVkIGJ5IHRoZSBpbmplY3RvciBmcm9tIHRoZSBzZXJ2aWNlIGNvbnN0cnVjdG9yXG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlcm5hbGx5IGl0IGxvb2tzIGEgYml0IGxpa2UgdGhpczpcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAgJGdldDogZnVuY3Rpb24oKSB7XG4gKiAgICAgcmV0dXJuICRpbmplY3Rvci5pbnN0YW50aWF0ZShjb25zdHJ1Y3Rvcik7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqXG4gKiBZb3Ugc2hvdWxkIHVzZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlICRwcm92aWRlLnNlcnZpY2UoY2xhc3MpfSBpZiB5b3UgZGVmaW5lIHlvdXIgc2VydmljZVxuICogYXMgYSB0eXBlL2NsYXNzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXkuPHN0cmluZ3xGdW5jdGlvbj59IGNvbnN0cnVjdG9yIEFuIGluamVjdGFibGUgY2xhc3MgKGNvbnN0cnVjdG9yIGZ1bmN0aW9uKVxuICogICAgIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlXG4gKlxuICogQGV4YW1wbGVcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIHNlcnZpY2UgdXNpbmdcbiAqIHtAbGluayBhdXRvLiRwcm92aWRlI3NlcnZpY2UgJHByb3ZpZGUuc2VydmljZShjbGFzcyl9LlxuICogYGBganNcbiAqICAgdmFyIFBpbmcgPSBmdW5jdGlvbigkaHR0cCkge1xuICogICAgIHRoaXMuJGh0dHAgPSAkaHR0cDtcbiAqICAgfTtcbiAqXG4gKiAgIFBpbmcuJGluamVjdCA9IFsnJGh0dHAnXTtcbiAqXG4gKiAgIFBpbmcucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbigpIHtcbiAqICAgICByZXR1cm4gdGhpcy4kaHR0cC5nZXQoJy9waW5nJyk7XG4gKiAgIH07XG4gKiAgICRwcm92aWRlLnNlcnZpY2UoJ3BpbmcnLCBQaW5nKTtcbiAqIGBgYFxuICogWW91IHdvdWxkIHRoZW4gaW5qZWN0IGFuZCB1c2UgdGhpcyBzZXJ2aWNlIGxpa2UgdGhpczpcbiAqIGBgYGpzXG4gKiAgIHNvbWVNb2R1bGUuY29udHJvbGxlcignQ3RybCcsIFsncGluZycsIGZ1bmN0aW9uKHBpbmcpIHtcbiAqICAgICBwaW5nLnNlbmQoKTtcbiAqICAgfV0pO1xuICogYGBgXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRwcm92aWRlI3ZhbHVlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBSZWdpc3RlciBhICoqdmFsdWUgc2VydmljZSoqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LCBzdWNoIGFzIGEgc3RyaW5nLCBhXG4gKiBudW1iZXIsIGFuIGFycmF5LCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbi4gVGhpcyBpcyBzaG9ydCBmb3IgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlIHdoZXJlIGl0c1xuICogcHJvdmlkZXIncyBgJGdldGAgcHJvcGVydHkgaXMgYSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSAqKnZhbHVlXG4gKiBzZXJ2aWNlKiouIFRoYXQgYWxzbyBtZWFucyBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5qZWN0IG90aGVyIHNlcnZpY2VzIGludG8gYSB2YWx1ZSBzZXJ2aWNlLlxuICpcbiAqIFZhbHVlIHNlcnZpY2VzIGFyZSBzaW1pbGFyIHRvIGNvbnN0YW50IHNlcnZpY2VzLCBleGNlcHQgdGhhdCB0aGV5IGNhbm5vdCBiZSBpbmplY3RlZCBpbnRvIGFcbiAqIG1vZHVsZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIChzZWUge0BsaW5rIGFuZ3VsYXIuTW9kdWxlI2NvbmZpZ30pIGJ1dCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5XG4gKiBhbiBBbmd1bGFyIHtAbGluayBhdXRvLiRwcm92aWRlI2RlY29yYXRvciBkZWNvcmF0b3J9LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlLlxuICogQHJldHVybnMge09iamVjdH0gcmVnaXN0ZXJlZCBwcm92aWRlciBpbnN0YW5jZVxuICpcbiAqIEBleGFtcGxlXG4gKiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGNyZWF0aW5nIHZhbHVlIHNlcnZpY2VzLlxuICogYGBganNcbiAqICAgJHByb3ZpZGUudmFsdWUoJ0FETUlOX1VTRVInLCAnYWRtaW4nKTtcbiAqXG4gKiAgICRwcm92aWRlLnZhbHVlKCdSb2xlTG9va3VwJywgeyBhZG1pbjogMCwgd3JpdGVyOiAxLCByZWFkZXI6IDIgfSk7XG4gKlxuICogICAkcHJvdmlkZS52YWx1ZSgnaGFsZk9mJywgZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgICByZXR1cm4gdmFsdWUgLyAyO1xuICogICB9KTtcbiAqIGBgYFxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkcHJvdmlkZSNjb25zdGFudFxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogUmVnaXN0ZXIgYSAqKmNvbnN0YW50IHNlcnZpY2UqKiB3aXRoIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfSwgc3VjaCBhcyBhIHN0cmluZyxcbiAqIGEgbnVtYmVyLCBhbiBhcnJheSwgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24uIExpa2UgdGhlIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlIHZhbHVlfSwgaXQgaXMgbm90XG4gKiBwb3NzaWJsZSB0byBpbmplY3Qgb3RoZXIgc2VydmljZXMgaW50byBhIGNvbnN0YW50LlxuICpcbiAqIEJ1dCB1bmxpa2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjdmFsdWUgdmFsdWV9LCBhIGNvbnN0YW50IGNhbiBiZVxuICogaW5qZWN0ZWQgaW50byBhIG1vZHVsZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIChzZWUge0BsaW5rIGFuZ3VsYXIuTW9kdWxlI2NvbmZpZ30pIGFuZCBpdCBjYW5ub3RcbiAqIGJlIG92ZXJyaWRkZW4gYnkgYW4gQW5ndWxhciB7QGxpbmsgYXV0by4kcHJvdmlkZSNkZWNvcmF0b3IgZGVjb3JhdG9yfS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29uc3RhbnQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBjb25zdGFudCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IHJlZ2lzdGVyZWQgaW5zdGFuY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogSGVyZSBhIHNvbWUgZXhhbXBsZXMgb2YgY3JlYXRpbmcgY29uc3RhbnRzOlxuICogYGBganNcbiAqICAgJHByb3ZpZGUuY29uc3RhbnQoJ1NIQVJEX0hFSUdIVCcsIDMwNik7XG4gKlxuICogICAkcHJvdmlkZS5jb25zdGFudCgnTVlfQ09MT1VSUycsIFsncmVkJywgJ2JsdWUnLCAnZ3JleSddKTtcbiAqXG4gKiAgICRwcm92aWRlLmNvbnN0YW50KCdkb3VibGUnLCBmdW5jdGlvbih2YWx1ZSkge1xuICogICAgIHJldHVybiB2YWx1ZSAqIDI7XG4gKiAgIH0pO1xuICogYGBgXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRwcm92aWRlI2RlY29yYXRvclxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogUmVnaXN0ZXIgYSAqKmRlY29yYXRvciBmdW5jdGlvbioqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBBIGRlY29yYXRvciBmdW5jdGlvblxuICogaW50ZXJjZXB0cyB0aGUgY3JlYXRpb24gb2YgYSBzZXJ2aWNlLCBhbGxvd2luZyBpdCB0byBvdmVycmlkZSBvciBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZVxuICogc2VydmljZS4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZGVjb3JhdG9yIGZ1bmN0aW9uIG1heSBiZSB0aGUgb3JpZ2luYWwgc2VydmljZSwgb3IgYSBuZXcgc2VydmljZVxuICogdGhhdCByZXBsYWNlcyAob3Igd3JhcHMgYW5kIGRlbGVnYXRlcyB0bykgdGhlIG9yaWdpbmFsIHNlcnZpY2UuXG4gKlxuICogWW91IGNhbiBmaW5kIG91dCBtb3JlIGFib3V0IHVzaW5nIGRlY29yYXRvcnMgaW4gdGhlIHtAbGluayBndWlkZS9kZWNvcmF0b3JzfSBndWlkZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBkZWNvcmF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXkuPHN0cmluZ3xGdW5jdGlvbj59IGRlY29yYXRvciBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBzZXJ2aWNlIG5lZWRzIHRvIGJlXG4gKiAgICBwcm92aWRlZCBhbmQgc2hvdWxkIHJldHVybiB0aGUgZGVjb3JhdGVkIHNlcnZpY2UgaW5zdGFuY2UuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgdXNpbmdcbiAqICAgIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IjaW52b2tlIGluamVjdG9yLmludm9rZX0gbWV0aG9kIGFuZCBpcyB0aGVyZWZvcmUgZnVsbHkgaW5qZWN0YWJsZS5cbiAqICAgIExvY2FsIGluamVjdGlvbiBhcmd1bWVudHM6XG4gKlxuICogICAgKiBgJGRlbGVnYXRlYCAtIFRoZSBvcmlnaW5hbCBzZXJ2aWNlIGluc3RhbmNlLCB3aGljaCBjYW4gYmUgcmVwbGFjZWQsIG1vbmtleSBwYXRjaGVkLCBjb25maWd1cmVkLFxuICogICAgICBkZWNvcmF0ZWQgb3IgZGVsZWdhdGVkIHRvLlxuICpcbiAqIEBleGFtcGxlXG4gKiBIZXJlIHdlIGRlY29yYXRlIHRoZSB7QGxpbmsgbmcuJGxvZyAkbG9nfSBzZXJ2aWNlIHRvIGNvbnZlcnQgd2FybmluZ3MgdG8gZXJyb3JzIGJ5IGludGVyY2VwdGluZ1xuICogY2FsbHMgdG8ge0BsaW5rIG5nLiRsb2cjZXJyb3IgJGxvZy53YXJuKCl9LlxuICogYGBganNcbiAqICAgJHByb3ZpZGUuZGVjb3JhdG9yKCckbG9nJywgWyckZGVsZWdhdGUnLCBmdW5jdGlvbigkZGVsZWdhdGUpIHtcbiAqICAgICAkZGVsZWdhdGUud2FybiA9ICRkZWxlZ2F0ZS5lcnJvcjtcbiAqICAgICByZXR1cm4gJGRlbGVnYXRlO1xuICogICB9XSk7XG4gKiBgYGBcbiAqL1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZUluamVjdG9yKG1vZHVsZXNUb0xvYWQsIHN0cmljdERpKSB7XG4gIHN0cmljdERpID0gKHN0cmljdERpID09PSB0cnVlKTtcbiAgdmFyIElOU1RBTlRJQVRJTkcgPSB7fSxcbiAgICAgIHByb3ZpZGVyU3VmZml4ID0gJ1Byb3ZpZGVyJyxcbiAgICAgIHBhdGggPSBbXSxcbiAgICAgIGxvYWRlZE1vZHVsZXMgPSBuZXcgSGFzaE1hcChbXSwgdHJ1ZSksXG4gICAgICBwcm92aWRlckNhY2hlID0ge1xuICAgICAgICAkcHJvdmlkZToge1xuICAgICAgICAgICAgcHJvdmlkZXI6IHN1cHBvcnRPYmplY3QocHJvdmlkZXIpLFxuICAgICAgICAgICAgZmFjdG9yeTogc3VwcG9ydE9iamVjdChmYWN0b3J5KSxcbiAgICAgICAgICAgIHNlcnZpY2U6IHN1cHBvcnRPYmplY3Qoc2VydmljZSksXG4gICAgICAgICAgICB2YWx1ZTogc3VwcG9ydE9iamVjdCh2YWx1ZSksXG4gICAgICAgICAgICBjb25zdGFudDogc3VwcG9ydE9iamVjdChjb25zdGFudCksXG4gICAgICAgICAgICBkZWNvcmF0b3I6IGRlY29yYXRvclxuICAgICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm92aWRlckluamVjdG9yID0gKHByb3ZpZGVyQ2FjaGUuJGluamVjdG9yID1cbiAgICAgICAgICBjcmVhdGVJbnRlcm5hbEluamVjdG9yKHByb3ZpZGVyQ2FjaGUsIGZ1bmN0aW9uKHNlcnZpY2VOYW1lLCBjYWxsZXIpIHtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKGNhbGxlcikpIHtcbiAgICAgICAgICAgICAgcGF0aC5wdXNoKGNhbGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ3VucHInLCAnVW5rbm93biBwcm92aWRlcjogezB9JywgcGF0aC5qb2luKCcgPC0gJykpO1xuICAgICAgICAgIH0pKSxcbiAgICAgIGluc3RhbmNlQ2FjaGUgPSB7fSxcbiAgICAgIHByb3RvSW5zdGFuY2VJbmplY3RvciA9XG4gICAgICAgICAgY3JlYXRlSW50ZXJuYWxJbmplY3RvcihpbnN0YW5jZUNhY2hlLCBmdW5jdGlvbihzZXJ2aWNlTmFtZSwgY2FsbGVyKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBwcm92aWRlckluamVjdG9yLmdldChzZXJ2aWNlTmFtZSArIHByb3ZpZGVyU3VmZml4LCBjYWxsZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyLiRnZXQsIHByb3ZpZGVyLCB1bmRlZmluZWQsIHNlcnZpY2VOYW1lKTtcbiAgICAgICAgICB9KSxcbiAgICAgIGluc3RhbmNlSW5qZWN0b3IgPSBwcm90b0luc3RhbmNlSW5qZWN0b3I7XG5cbiAgcHJvdmlkZXJDYWNoZVsnJGluamVjdG9yJyArIHByb3ZpZGVyU3VmZml4XSA9IHsgJGdldDogdmFsdWVGbihwcm90b0luc3RhbmNlSW5qZWN0b3IpIH07XG4gIHZhciBydW5CbG9ja3MgPSBsb2FkTW9kdWxlcyhtb2R1bGVzVG9Mb2FkKTtcbiAgaW5zdGFuY2VJbmplY3RvciA9IHByb3RvSW5zdGFuY2VJbmplY3Rvci5nZXQoJyRpbmplY3RvcicpO1xuICBpbnN0YW5jZUluamVjdG9yLnN0cmljdERpID0gc3RyaWN0RGk7XG4gIGZvckVhY2gocnVuQmxvY2tzLCBmdW5jdGlvbihmbikgeyBpZiAoZm4pIGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKGZuKTsgfSk7XG5cbiAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3I7XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vICRwcm92aWRlclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICBmdW5jdGlvbiBzdXBwb3J0T2JqZWN0KGRlbGVnYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICAgIGZvckVhY2goa2V5LCByZXZlcnNlUGFyYW1zKGRlbGVnYXRlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVsZWdhdGUoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb3ZpZGVyKG5hbWUsIHByb3ZpZGVyXykge1xuICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdzZXJ2aWNlJyk7XG4gICAgaWYgKGlzRnVuY3Rpb24ocHJvdmlkZXJfKSB8fCBpc0FycmF5KHByb3ZpZGVyXykpIHtcbiAgICAgIHByb3ZpZGVyXyA9IHByb3ZpZGVySW5qZWN0b3IuaW5zdGFudGlhdGUocHJvdmlkZXJfKTtcbiAgICB9XG4gICAgaWYgKCFwcm92aWRlcl8uJGdldCkge1xuICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdwZ2V0JywgJ1Byb3ZpZGVyIFxcJ3swfVxcJyBtdXN0IGRlZmluZSAkZ2V0IGZhY3RvcnkgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gKHByb3ZpZGVyQ2FjaGVbbmFtZSArIHByb3ZpZGVyU3VmZml4XSA9IHByb3ZpZGVyXyk7XG4gIH1cblxuICBmdW5jdGlvbiBlbmZvcmNlUmV0dXJuVmFsdWUobmFtZSwgZmFjdG9yeSkge1xuICAgIHJldHVybiAvKiogQHRoaXMgKi8gZnVuY3Rpb24gZW5mb3JjZWRSZXR1cm5WYWx1ZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBpbnN0YW5jZUluamVjdG9yLmludm9rZShmYWN0b3J5LCB0aGlzKTtcbiAgICAgIGlmIChpc1VuZGVmaW5lZChyZXN1bHQpKSB7XG4gICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycigndW5kZWYnLCAnUHJvdmlkZXIgXFwnezB9XFwnIG11c3QgcmV0dXJuIGEgdmFsdWUgZnJvbSAkZ2V0IGZhY3RvcnkgbWV0aG9kLicsIG5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmFjdG9yeShuYW1lLCBmYWN0b3J5Rm4sIGVuZm9yY2UpIHtcbiAgICByZXR1cm4gcHJvdmlkZXIobmFtZSwge1xuICAgICAgJGdldDogZW5mb3JjZSAhPT0gZmFsc2UgPyBlbmZvcmNlUmV0dXJuVmFsdWUobmFtZSwgZmFjdG9yeUZuKSA6IGZhY3RvcnlGblxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VydmljZShuYW1lLCBjb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBmYWN0b3J5KG5hbWUsIFsnJGluamVjdG9yJywgZnVuY3Rpb24oJGluamVjdG9yKSB7XG4gICAgICByZXR1cm4gJGluamVjdG9yLmluc3RhbnRpYXRlKGNvbnN0cnVjdG9yKTtcbiAgICB9XSk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWx1ZShuYW1lLCB2YWwpIHsgcmV0dXJuIGZhY3RvcnkobmFtZSwgdmFsdWVGbih2YWwpLCBmYWxzZSk7IH1cblxuICBmdW5jdGlvbiBjb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdjb25zdGFudCcpO1xuICAgIHByb3ZpZGVyQ2FjaGVbbmFtZV0gPSB2YWx1ZTtcbiAgICBpbnN0YW5jZUNhY2hlW25hbWVdID0gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvcmF0b3Ioc2VydmljZU5hbWUsIGRlY29yRm4pIHtcbiAgICB2YXIgb3JpZ1Byb3ZpZGVyID0gcHJvdmlkZXJJbmplY3Rvci5nZXQoc2VydmljZU5hbWUgKyBwcm92aWRlclN1ZmZpeCksXG4gICAgICAgIG9yaWckZ2V0ID0gb3JpZ1Byb3ZpZGVyLiRnZXQ7XG5cbiAgICBvcmlnUHJvdmlkZXIuJGdldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9yaWdJbnN0YW5jZSA9IGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKG9yaWckZ2V0LCBvcmlnUHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKGRlY29yRm4sIG51bGwsIHskZGVsZWdhdGU6IG9yaWdJbnN0YW5jZX0pO1xuICAgIH07XG4gIH1cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gTW9kdWxlIExvYWRpbmdcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIGZ1bmN0aW9uIGxvYWRNb2R1bGVzKG1vZHVsZXNUb0xvYWQpIHtcbiAgICBhc3NlcnRBcmcoaXNVbmRlZmluZWQobW9kdWxlc1RvTG9hZCkgfHwgaXNBcnJheShtb2R1bGVzVG9Mb2FkKSwgJ21vZHVsZXNUb0xvYWQnLCAnbm90IGFuIGFycmF5Jyk7XG4gICAgdmFyIHJ1bkJsb2NrcyA9IFtdLCBtb2R1bGVGbjtcbiAgICBmb3JFYWNoKG1vZHVsZXNUb0xvYWQsIGZ1bmN0aW9uKG1vZHVsZSkge1xuICAgICAgaWYgKGxvYWRlZE1vZHVsZXMuZ2V0KG1vZHVsZSkpIHJldHVybjtcbiAgICAgIGxvYWRlZE1vZHVsZXMucHV0KG1vZHVsZSwgdHJ1ZSk7XG5cbiAgICAgIGZ1bmN0aW9uIHJ1bkludm9rZVF1ZXVlKHF1ZXVlKSB7XG4gICAgICAgIHZhciBpLCBpaTtcbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBxdWV1ZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgdmFyIGludm9rZUFyZ3MgPSBxdWV1ZVtpXSxcbiAgICAgICAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlckluamVjdG9yLmdldChpbnZva2VBcmdzWzBdKTtcblxuICAgICAgICAgIHByb3ZpZGVyW2ludm9rZUFyZ3NbMV1dLmFwcGx5KHByb3ZpZGVyLCBpbnZva2VBcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaXNTdHJpbmcobW9kdWxlKSkge1xuICAgICAgICAgIG1vZHVsZUZuID0gYW5ndWxhck1vZHVsZShtb2R1bGUpO1xuICAgICAgICAgIHJ1bkJsb2NrcyA9IHJ1bkJsb2Nrcy5jb25jYXQobG9hZE1vZHVsZXMobW9kdWxlRm4ucmVxdWlyZXMpKS5jb25jYXQobW9kdWxlRm4uX3J1bkJsb2Nrcyk7XG4gICAgICAgICAgcnVuSW52b2tlUXVldWUobW9kdWxlRm4uX2ludm9rZVF1ZXVlKTtcbiAgICAgICAgICBydW5JbnZva2VRdWV1ZShtb2R1bGVGbi5fY29uZmlnQmxvY2tzKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG1vZHVsZSkpIHtcbiAgICAgICAgICAgIHJ1bkJsb2Nrcy5wdXNoKHByb3ZpZGVySW5qZWN0b3IuaW52b2tlKG1vZHVsZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgICAgICAgcnVuQmxvY2tzLnB1c2gocHJvdmlkZXJJbmplY3Rvci5pbnZva2UobW9kdWxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzZXJ0QXJnRm4obW9kdWxlLCAnbW9kdWxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgICAgIG1vZHVsZSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUubWVzc2FnZSAmJiBlLnN0YWNrICYmIGUuc3RhY2suaW5kZXhPZihlLm1lc3NhZ2UpID09PSAtMSkge1xuICAgICAgICAgIC8vIFNhZmFyaSAmIEZGJ3Mgc3RhY2sgdHJhY2VzIGRvbid0IGNvbnRhaW4gZXJyb3IubWVzc2FnZSBjb250ZW50XG4gICAgICAgICAgLy8gdW5saWtlIHRob3NlIG9mIENocm9tZSBhbmQgSUVcbiAgICAgICAgICAvLyBTbyBpZiBzdGFjayBkb2Vzbid0IGNvbnRhaW4gbWVzc2FnZSwgd2UgY3JlYXRlIGEgbmV3IHN0cmluZyB0aGF0IGNvbnRhaW5zIGJvdGguXG4gICAgICAgICAgLy8gU2luY2UgZXJyb3Iuc3RhY2sgaXMgcmVhZC1vbmx5IGluIFNhZmFyaSwgSSdtIG92ZXJyaWRpbmcgZSBhbmQgbm90IGUuc3RhY2sgaGVyZS5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXgtYXNzaWduXG4gICAgICAgICAgZSA9IGUubWVzc2FnZSArICdcXG4nICsgZS5zdGFjaztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ21vZHVsZXJyJywgJ0ZhaWxlZCB0byBpbnN0YW50aWF0ZSBtb2R1bGUgezB9IGR1ZSB0bzpcXG57MX0nLFxuICAgICAgICAgICAgICAgICAgbW9kdWxlLCBlLnN0YWNrIHx8IGUubWVzc2FnZSB8fCBlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcnVuQmxvY2tzO1xuICB9XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIGludGVybmFsIEluamVjdG9yXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUludGVybmFsSW5qZWN0b3IoY2FjaGUsIGZhY3RvcnkpIHtcblxuICAgIGZ1bmN0aW9uIGdldFNlcnZpY2Uoc2VydmljZU5hbWUsIGNhbGxlcikge1xuICAgICAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KHNlcnZpY2VOYW1lKSkge1xuICAgICAgICBpZiAoY2FjaGVbc2VydmljZU5hbWVdID09PSBJTlNUQU5USUFUSU5HKSB7XG4gICAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdjZGVwJywgJ0NpcmN1bGFyIGRlcGVuZGVuY3kgZm91bmQ6IHswfScsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lICsgJyA8LSAnICsgcGF0aC5qb2luKCcgPC0gJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZVtzZXJ2aWNlTmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhdGgudW5zaGlmdChzZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgY2FjaGVbc2VydmljZU5hbWVdID0gSU5TVEFOVElBVElORztcbiAgICAgICAgICBjYWNoZVtzZXJ2aWNlTmFtZV0gPSBmYWN0b3J5KHNlcnZpY2VOYW1lLCBjYWxsZXIpO1xuICAgICAgICAgIHJldHVybiBjYWNoZVtzZXJ2aWNlTmFtZV07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChjYWNoZVtzZXJ2aWNlTmFtZV0gPT09IElOU1RBTlRJQVRJTkcpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtzZXJ2aWNlTmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBwYXRoLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGluamVjdGlvbkFyZ3MoZm4sIGxvY2Fscywgc2VydmljZU5hbWUpIHtcbiAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgJGluamVjdCA9IGNyZWF0ZUluamVjdG9yLiQkYW5ub3RhdGUoZm4sIHN0cmljdERpLCBzZXJ2aWNlTmFtZSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSAkaW5qZWN0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBrZXkgPSAkaW5qZWN0W2ldO1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ2l0a24nLFxuICAgICAgICAgICAgICAgICAgJ0luY29ycmVjdCBpbmplY3Rpb24gdG9rZW4hIEV4cGVjdGVkIHNlcnZpY2UgbmFtZSBhcyBzdHJpbmcsIGdvdCB7MH0nLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGFyZ3MucHVzaChsb2NhbHMgJiYgbG9jYWxzLmhhc093blByb3BlcnR5KGtleSkgPyBsb2NhbHNba2V5XSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlKGtleSwgc2VydmljZU5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQ2xhc3MoZnVuYykge1xuICAgICAgLy8gU3VwcG9ydDogSUUgOS0xMSBvbmx5XG4gICAgICAvLyBJRSA5LTExIGRvIG5vdCBzdXBwb3J0IGNsYXNzZXMgYW5kIElFOSBsZWFrcyB3aXRoIHRoZSBjb2RlIGJlbG93LlxuICAgICAgaWYgKG1zaWUgfHwgdHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuJCRuZ0lzQ2xhc3M7XG4gICAgICBpZiAoIWlzQm9vbGVhbihyZXN1bHQpKSB7XG4gICAgICAgIC8vIFN1cHBvcnQ6IEVkZ2UgMTItMTMgb25seVxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzYxNTYxMzUvXG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuJCRuZ0lzQ2xhc3MgPSAvXig/OmNsYXNzXFxifGNvbnN0cnVjdG9yXFwoKS8udGVzdChzdHJpbmdpZnlGbihmdW5jKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludm9rZShmbiwgc2VsZiwgbG9jYWxzLCBzZXJ2aWNlTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBsb2NhbHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNlcnZpY2VOYW1lID0gbG9jYWxzO1xuICAgICAgICBsb2NhbHMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXJncyA9IGluamVjdGlvbkFyZ3MoZm4sIGxvY2Fscywgc2VydmljZU5hbWUpO1xuICAgICAgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgICAgIGZuID0gZm5bZm4ubGVuZ3RoIC0gMV07XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNDbGFzcyhmbikpIHtcbiAgICAgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vYW5ndWxhcmpzLWludm9rZS1hcHBseS12cy1zd2l0Y2hcbiAgICAgICAgLy8gIzUzODhcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJncy51bnNoaWZ0KG51bGwpO1xuICAgICAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShmbiwgYXJncykpKCk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZShUeXBlLCBsb2NhbHMsIHNlcnZpY2VOYW1lKSB7XG4gICAgICAvLyBDaGVjayBpZiBUeXBlIGlzIGFubm90YXRlZCBhbmQgdXNlIGp1c3QgdGhlIGdpdmVuIGZ1bmN0aW9uIGF0IG4tMSBhcyBwYXJhbWV0ZXJcbiAgICAgIC8vIGUuZy4gc29tZU1vZHVsZS5mYWN0b3J5KCdncmVldGVyJywgWyckd2luZG93JywgZnVuY3Rpb24ocmVuYW1lZCR3aW5kb3cpIHt9XSk7XG4gICAgICB2YXIgY3RvciA9IChpc0FycmF5KFR5cGUpID8gVHlwZVtUeXBlLmxlbmd0aCAtIDFdIDogVHlwZSk7XG4gICAgICB2YXIgYXJncyA9IGluamVjdGlvbkFyZ3MoVHlwZSwgbG9jYWxzLCBzZXJ2aWNlTmFtZSk7XG4gICAgICAvLyBFbXB0eSBvYmplY3QgYXQgcG9zaXRpb24gMCBpcyBpZ25vcmVkIGZvciBpbnZvY2F0aW9uIHdpdGggYG5ld2AsIGJ1dCByZXF1aXJlZC5cbiAgICAgIGFyZ3MudW5zaGlmdChudWxsKTtcbiAgICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KGN0b3IsIGFyZ3MpKSgpO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGludm9rZTogaW52b2tlLFxuICAgICAgaW5zdGFudGlhdGU6IGluc3RhbnRpYXRlLFxuICAgICAgZ2V0OiBnZXRTZXJ2aWNlLFxuICAgICAgYW5ub3RhdGU6IGNyZWF0ZUluamVjdG9yLiQkYW5ub3RhdGUsXG4gICAgICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyQ2FjaGUuaGFzT3duUHJvcGVydHkobmFtZSArIHByb3ZpZGVyU3VmZml4KSB8fCBjYWNoZS5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmNyZWF0ZUluamVjdG9yLiQkYW5ub3RhdGUgPSBhbm5vdGF0ZTtcblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRhbmNob3JTY3JvbGxQcm92aWRlclxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzZSBgJGFuY2hvclNjcm9sbFByb3ZpZGVyYCB0byBkaXNhYmxlIGF1dG9tYXRpYyBzY3JvbGxpbmcgd2hlbmV2ZXJcbiAqIHtAbGluayBuZy4kbG9jYXRpb24jaGFzaCAkbG9jYXRpb24uaGFzaCgpfSBjaGFuZ2VzLlxuICovXG5mdW5jdGlvbiAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIoKSB7XG5cbiAgdmFyIGF1dG9TY3JvbGxpbmdFbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkYW5jaG9yU2Nyb2xsUHJvdmlkZXIjZGlzYWJsZUF1dG9TY3JvbGxpbmdcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEJ5IGRlZmF1bHQsIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsICRhbmNob3JTY3JvbGwoKX0gd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCBjaGFuZ2VzIHRvXG4gICAqIHtAbGluayBuZy4kbG9jYXRpb24jaGFzaCAkbG9jYXRpb24uaGFzaCgpfSBhbmQgc2Nyb2xsIHRvIHRoZSBlbGVtZW50IG1hdGNoaW5nIHRoZSBuZXcgaGFzaC48YnIgLz5cbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGRpc2FibGUgYXV0b21hdGljIHNjcm9sbGluZy5cbiAgICpcbiAgICogSWYgYXV0b21hdGljIHNjcm9sbGluZyBpcyBkaXNhYmxlZCwgb25lIG11c3QgZXhwbGljaXRseSBjYWxsXG4gICAqIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsICRhbmNob3JTY3JvbGwoKX0gaW4gb3JkZXIgdG8gc2Nyb2xsIHRvIHRoZSBlbGVtZW50IHJlbGF0ZWQgdG8gdGhlXG4gICAqIGN1cnJlbnQgaGFzaC5cbiAgICovXG4gIHRoaXMuZGlzYWJsZUF1dG9TY3JvbGxpbmcgPSBmdW5jdGlvbigpIHtcbiAgICBhdXRvU2Nyb2xsaW5nRW5hYmxlZCA9IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAbmdkb2Mgc2VydmljZVxuICAgKiBAbmFtZSAkYW5jaG9yU2Nyb2xsXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqIEByZXF1aXJlcyAkd2luZG93XG4gICAqIEByZXF1aXJlcyAkbG9jYXRpb25cbiAgICogQHJlcXVpcmVzICRyb290U2NvcGVcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdoZW4gY2FsbGVkLCBpdCBzY3JvbGxzIHRvIHRoZSBlbGVtZW50IHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmllZCBgaGFzaGAgb3IgKGlmIG9taXR0ZWQpIHRvIHRoZVxuICAgKiBjdXJyZW50IHZhbHVlIG9mIHtAbGluayBuZy4kbG9jYXRpb24jaGFzaCAkbG9jYXRpb24uaGFzaCgpfSwgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBzcGVjaWZpZWRcbiAgICogaW4gdGhlXG4gICAqIFtIVE1MNSBzcGVjXShodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9icm93c2Vycy5odG1sI2FuLWluZGljYXRlZC1wYXJ0LW9mLXRoZS1kb2N1bWVudCkuXG4gICAqXG4gICAqIEl0IGFsc28gd2F0Y2hlcyB0aGUge0BsaW5rIG5nLiRsb2NhdGlvbiNoYXNoICRsb2NhdGlvbi5oYXNoKCl9IGFuZCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgdG9cbiAgICogbWF0Y2ggYW55IGFuY2hvciB3aGVuZXZlciBpdCBjaGFuZ2VzLiBUaGlzIGNhbiBiZSBkaXNhYmxlZCBieSBjYWxsaW5nXG4gICAqIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsUHJvdmlkZXIjZGlzYWJsZUF1dG9TY3JvbGxpbmcgJGFuY2hvclNjcm9sbFByb3ZpZGVyLmRpc2FibGVBdXRvU2Nyb2xsaW5nKCl9LlxuICAgKlxuICAgKiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gdXNlIGl0cyB7QGxpbmsgbmcuJGFuY2hvclNjcm9sbCN5T2Zmc2V0IHlPZmZzZXR9IHByb3BlcnR5IHRvIHNwZWNpZnkgYVxuICAgKiB2ZXJ0aWNhbCBzY3JvbGwtb2Zmc2V0IChlaXRoZXIgZml4ZWQgb3IgZHluYW1pYykuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gaGFzaCBUaGUgaGFzaCBzcGVjaWZ5aW5nIHRoZSBlbGVtZW50IHRvIHNjcm9sbCB0by4gSWYgb21pdHRlZCwgdGhlIHZhbHVlIG9mXG4gICAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcHJvcGVydHkgeyhudW1iZXJ8ZnVuY3Rpb258anFMaXRlKX0geU9mZnNldFxuICAgKiBJZiBzZXQsIHNwZWNpZmllcyBhIHZlcnRpY2FsIHNjcm9sbC1vZmZzZXQuIFRoaXMgaXMgb2Z0ZW4gdXNlZnVsIHdoZW4gdGhlcmUgYXJlIGZpeGVkXG4gICAqIHBvc2l0aW9uZWQgZWxlbWVudHMgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSwgc3VjaCBhcyBuYXZiYXJzLCBoZWFkZXJzIGV0Yy5cbiAgICpcbiAgICogYHlPZmZzZXRgIGNhbiBiZSBzcGVjaWZpZWQgaW4gdmFyaW91cyB3YXlzOlxuICAgKiAtICoqbnVtYmVyKio6IEEgZml4ZWQgbnVtYmVyIG9mIHBpeGVscyB0byBiZSB1c2VkIGFzIG9mZnNldC48YnIgLz48YnIgLz5cbiAgICogLSAqKmZ1bmN0aW9uKio6IEEgZ2V0dGVyIGZ1bmN0aW9uIGNhbGxlZCBldmVyeXRpbWUgYCRhbmNob3JTY3JvbGwoKWAgaXMgZXhlY3V0ZWQuIE11c3QgcmV0dXJuXG4gICAqICAgYSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgKGluIHBpeGVscykuPGJyIC8+PGJyIC8+XG4gICAqIC0gKipqcUxpdGUqKjogQSBqcUxpdGUvalF1ZXJ5IGVsZW1lbnQgdG8gYmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgb2Zmc2V0LiBUaGUgZGlzdGFuY2UgZnJvbVxuICAgKiAgIHRoZSB0b3Agb2YgdGhlIHBhZ2UgdG8gdGhlIGVsZW1lbnQncyBib3R0b20gd2lsbCBiZSB1c2VkIGFzIG9mZnNldC48YnIgLz5cbiAgICogICAqKk5vdGUqKjogVGhlIGVsZW1lbnQgd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgb25seSBhcyBsb25nIGFzIGl0cyBgcG9zaXRpb25gIGlzIHNldCB0b1xuICAgKiAgIGBmaXhlZGAuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCwgd2hlbiBkZWFsaW5nIHdpdGggcmVzcG9uc2l2ZSBuYXZiYXJzL2hlYWRlcnMgdGhhdCBhZGp1c3RcbiAgICogICB0aGVpciBoZWlnaHQgYW5kL29yIHBvc2l0aW9uaW5nIGFjY29yZGluZyB0byB0aGUgdmlld3BvcnQncyBzaXplLlxuICAgKlxuICAgKiA8YnIgLz5cbiAgICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAgICogSW4gb3JkZXIgZm9yIGB5T2Zmc2V0YCB0byB3b3JrIHByb3Blcmx5LCBzY3JvbGxpbmcgc2hvdWxkIHRha2UgcGxhY2Ugb24gdGhlIGRvY3VtZW50J3Mgcm9vdCBhbmRcbiAgICogbm90IHNvbWUgY2hpbGQgZWxlbWVudC5cbiAgICogPC9kaXY+XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgIDxleGFtcGxlIG1vZHVsZT1cImFuY2hvclNjcm9sbEV4YW1wbGVcIiBuYW1lPVwiYW5jaG9yLXNjcm9sbFwiPlxuICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICA8ZGl2IGlkPVwic2Nyb2xsQXJlYVwiIG5nLWNvbnRyb2xsZXI9XCJTY3JvbGxDb250cm9sbGVyXCI+XG4gICAgICAgICAgIDxhIG5nLWNsaWNrPVwiZ290b0JvdHRvbSgpXCI+R28gdG8gYm90dG9tPC9hPlxuICAgICAgICAgICA8YSBpZD1cImJvdHRvbVwiPjwvYT4gWW91J3JlIGF0IHRoZSBib3R0b20hXG4gICAgICAgICA8L2Rpdj5cbiAgICAgICA8L2ZpbGU+XG4gICAgICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2FuY2hvclNjcm9sbEV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ1Njcm9sbENvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnJGFuY2hvclNjcm9sbCcsXG4gICAgICAgICAgICAgZnVuY3Rpb24oJHNjb3BlLCAkbG9jYXRpb24sICRhbmNob3JTY3JvbGwpIHtcbiAgICAgICAgICAgICAgICRzY29wZS5nb3RvQm90dG9tID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgbG9jYXRpb24uaGFzaCB0byB0aGUgaWQgb2ZcbiAgICAgICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgeW91IHdpc2ggdG8gc2Nyb2xsIHRvLlxuICAgICAgICAgICAgICAgICAkbG9jYXRpb24uaGFzaCgnYm90dG9tJyk7XG5cbiAgICAgICAgICAgICAgICAgLy8gY2FsbCAkYW5jaG9yU2Nyb2xsKClcbiAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbCgpO1xuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgPC9maWxlPlxuICAgICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICAgICNzY3JvbGxBcmVhIHtcbiAgICAgICAgICAgaGVpZ2h0OiAyODBweDtcbiAgICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICAgICB9XG5cbiAgICAgICAgICNib3R0b20ge1xuICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgbWFyZ2luLXRvcDogMjAwMHB4O1xuICAgICAgICAgfVxuICAgICAgIDwvZmlsZT5cbiAgICAgPC9leGFtcGxlPlxuICAgKlxuICAgKiA8aHIgLz5cbiAgICogVGhlIGV4YW1wbGUgYmVsb3cgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBhIHZlcnRpY2FsIHNjcm9sbC1vZmZzZXQgKHNwZWNpZmllZCBhcyBhIGZpeGVkIHZhbHVlKS5cbiAgICogU2VlIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsI3lPZmZzZXQgJGFuY2hvclNjcm9sbC55T2Zmc2V0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgICA8ZXhhbXBsZSBtb2R1bGU9XCJhbmNob3JTY3JvbGxPZmZzZXRFeGFtcGxlXCIgbmFtZT1cImFuY2hvci1zY3JvbGwtb2Zmc2V0XCI+XG4gICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC1oZWFkZXJcIiBuZy1jb250cm9sbGVyPVwiaGVhZGVyQ3RybFwiPlxuICAgICAgICAgICA8YSBocmVmPVwiXCIgbmctY2xpY2s9XCJnb3RvQW5jaG9yKHgpXCIgbmctcmVwZWF0PVwieCBpbiBbMSwyLDMsNCw1XVwiPlxuICAgICAgICAgICAgIEdvIHRvIGFuY2hvciB7e3h9fVxuICAgICAgICAgICA8L2E+XG4gICAgICAgICA8L2Rpdj5cbiAgICAgICAgIDxkaXYgaWQ9XCJhbmNob3J7e3h9fVwiIGNsYXNzPVwiYW5jaG9yXCIgbmctcmVwZWF0PVwieCBpbiBbMSwyLDMsNCw1XVwiPlxuICAgICAgICAgICBBbmNob3Ige3t4fX0gb2YgNVxuICAgICAgICAgPC9kaXY+XG4gICAgICAgPC9maWxlPlxuICAgICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdhbmNob3JTY3JvbGxPZmZzZXRFeGFtcGxlJywgW10pXG4gICAgICAgICAgIC5ydW4oWyckYW5jaG9yU2Nyb2xsJywgZnVuY3Rpb24oJGFuY2hvclNjcm9sbCkge1xuICAgICAgICAgICAgICRhbmNob3JTY3JvbGwueU9mZnNldCA9IDUwOyAgIC8vIGFsd2F5cyBzY3JvbGwgYnkgNTAgZXh0cmEgcGl4ZWxzXG4gICAgICAgICAgIH1dKVxuICAgICAgICAgICAuY29udHJvbGxlcignaGVhZGVyQ3RybCcsIFsnJGFuY2hvclNjcm9sbCcsICckbG9jYXRpb24nLCAnJHNjb3BlJyxcbiAgICAgICAgICAgICBmdW5jdGlvbigkYW5jaG9yU2Nyb2xsLCAkbG9jYXRpb24sICRzY29wZSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLmdvdG9BbmNob3IgPSBmdW5jdGlvbih4KSB7XG4gICAgICAgICAgICAgICAgIHZhciBuZXdIYXNoID0gJ2FuY2hvcicgKyB4O1xuICAgICAgICAgICAgICAgICBpZiAoJGxvY2F0aW9uLmhhc2goKSAhPT0gbmV3SGFzaCkge1xuICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgJGxvY2F0aW9uLmhhc2ggdG8gYG5ld0hhc2hgIGFuZFxuICAgICAgICAgICAgICAgICAgIC8vICRhbmNob3JTY3JvbGwgd2lsbCBhdXRvbWF0aWNhbGx5IHNjcm9sbCB0byBpdFxuICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi5oYXNoKCdhbmNob3InICsgeCk7XG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgLy8gY2FsbCAkYW5jaG9yU2Nyb2xsKCkgZXhwbGljaXRseSxcbiAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSAkbG9jYXRpb24uaGFzaCBoYXNuJ3QgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICRhbmNob3JTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIF0pO1xuICAgICAgIDwvZmlsZT5cbiAgICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgICBib2R5IHtcbiAgICAgICAgICAgcGFkZGluZy10b3A6IDUwcHg7XG4gICAgICAgICB9XG5cbiAgICAgICAgIC5hbmNob3Ige1xuICAgICAgICAgICBib3JkZXI6IDJweCBkYXNoZWQgRGFya09yY2hpZDtcbiAgICAgICAgICAgcGFkZGluZzogMTBweCAxMHB4IDIwMHB4IDEwcHg7XG4gICAgICAgICB9XG5cbiAgICAgICAgIC5maXhlZC1oZWFkZXIge1xuICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XG4gICAgICAgICAgIGhlaWdodDogNTBweDtcbiAgICAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICAgICB0b3A6IDA7IGxlZnQ6IDA7IHJpZ2h0OiAwO1xuICAgICAgICAgfVxuXG4gICAgICAgICAuZml4ZWQtaGVhZGVyID4gYSB7XG4gICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICAgbWFyZ2luOiA1cHggMTVweDtcbiAgICAgICAgIH1cbiAgICAgICA8L2ZpbGU+XG4gICAgIDwvZXhhbXBsZT5cbiAgICovXG4gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckbG9jYXRpb24nLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCR3aW5kb3csICRsb2NhdGlvbiwgJHJvb3RTY29wZSkge1xuICAgIHZhciBkb2N1bWVudCA9ICR3aW5kb3cuZG9jdW1lbnQ7XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGZpcnN0IGFuY2hvciBmcm9tIGEgTm9kZUxpc3RcbiAgICAvLyAodXNpbmcgYEFycmF5I3NvbWUoKWAgaW5zdGVhZCBvZiBgYW5ndWxhciNmb3JFYWNoKClgIHNpbmNlIGl0J3MgbW9yZSBwZXJmb3JtYW50XG4gICAgLy8gIGFuZCB3b3JraW5nIGluIGFsbCBzdXBwb3J0ZWQgYnJvd3NlcnMuKVxuICAgIGZ1bmN0aW9uIGdldEZpcnN0QW5jaG9yKGxpc3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChsaXN0LCBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIGlmIChub2RlTmFtZV8oZWxlbWVudCkgPT09ICdhJykge1xuICAgICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRZT2Zmc2V0KCkge1xuXG4gICAgICB2YXIgb2Zmc2V0ID0gc2Nyb2xsLnlPZmZzZXQ7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKG9mZnNldCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0KCk7XG4gICAgICB9IGVsc2UgaWYgKGlzRWxlbWVudChvZmZzZXQpKSB7XG4gICAgICAgIHZhciBlbGVtID0gb2Zmc2V0WzBdO1xuICAgICAgICB2YXIgc3R5bGUgPSAkd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIGlmIChzdHlsZS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzTnVtYmVyKG9mZnNldCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY3JvbGxUbyhlbGVtKSB7XG4gICAgICBpZiAoZWxlbSkge1xuICAgICAgICBlbGVtLnNjcm9sbEludG9WaWV3KCk7XG5cbiAgICAgICAgdmFyIG9mZnNldCA9IGdldFlPZmZzZXQoKTtcblxuICAgICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgICAgLy8gYG9mZnNldGAgaXMgdGhlIG51bWJlciBvZiBwaXhlbHMgd2Ugc2hvdWxkIHNjcm9sbCBVUCBpbiBvcmRlciB0byBhbGlnbiBgZWxlbWAgcHJvcGVybHkuXG4gICAgICAgICAgLy8gVGhpcyBpcyB0cnVlIE9OTFkgaWYgdGhlIGNhbGwgdG8gYGVsZW0uc2Nyb2xsSW50b1ZpZXcoKWAgaW5pdGlhbGx5IGFsaWducyBgZWxlbWAgYXQgdGhlXG4gICAgICAgICAgLy8gdG9wIG9mIHRoZSB2aWV3cG9ydC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIElGIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGZyb20gdGhlIHRvcCBvZiBgZWxlbWAgdG8gdGhlIGVuZCBvZiB0aGUgcGFnZSdzIGNvbnRlbnQgaXMgbGVzc1xuICAgICAgICAgIC8vIHRoYW4gdGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQsIHRoZW4gYGVsZW0uc2Nyb2xsSW50b1ZpZXcoKWAgd2lsbCBhbGlnbiB0aGUgYGVsZW1gIHNvbWVcbiAgICAgICAgICAvLyB3YXkgZG93biB0aGUgcGFnZS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoaXMgaXMgb2Z0ZW4gdGhlIGNhc2UgZm9yIGVsZW1lbnRzIG5lYXIgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEluIHN1Y2ggY2FzZXMgd2UgZG8gbm90IG5lZWQgdG8gc2Nyb2xsIHRoZSB3aG9sZSBgb2Zmc2V0YCB1cCwganVzdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuXG4gICAgICAgICAgLy8gdGhlIHRvcCBvZiB0aGUgZWxlbWVudCBhbmQgdGhlIG9mZnNldCwgd2hpY2ggaXMgZW5vdWdoIHRvIGFsaWduIHRoZSB0b3Agb2YgYGVsZW1gIGF0IHRoZVxuICAgICAgICAgIC8vIGRlc2lyZWQgcG9zaXRpb24uXG4gICAgICAgICAgdmFyIGVsZW1Ub3AgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgICAkd2luZG93LnNjcm9sbEJ5KDAsIGVsZW1Ub3AgLSBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjcm9sbChoYXNoKSB7XG4gICAgICAvLyBBbGxvdyBudW1lcmljIGhhc2hlc1xuICAgICAgaGFzaCA9IGlzU3RyaW5nKGhhc2gpID8gaGFzaCA6IGlzTnVtYmVyKGhhc2gpID8gaGFzaC50b1N0cmluZygpIDogJGxvY2F0aW9uLmhhc2goKTtcbiAgICAgIHZhciBlbG07XG5cbiAgICAgIC8vIGVtcHR5IGhhc2gsIHNjcm9sbCB0byB0aGUgdG9wIG9mIHRoZSBwYWdlXG4gICAgICBpZiAoIWhhc2gpIHNjcm9sbFRvKG51bGwpO1xuXG4gICAgICAvLyBlbGVtZW50IHdpdGggZ2l2ZW4gaWRcbiAgICAgIGVsc2UgaWYgKChlbG0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSkpIHNjcm9sbFRvKGVsbSk7XG5cbiAgICAgIC8vIGZpcnN0IGFuY2hvciB3aXRoIGdpdmVuIG5hbWUgOi1EXG4gICAgICBlbHNlIGlmICgoZWxtID0gZ2V0Rmlyc3RBbmNob3IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoaGFzaCkpKSkgc2Nyb2xsVG8oZWxtKTtcblxuICAgICAgLy8gbm8gZWxlbWVudCBhbmQgaGFzaCA9PT0gJ3RvcCcsIHNjcm9sbCB0byB0aGUgdG9wIG9mIHRoZSBwYWdlXG4gICAgICBlbHNlIGlmIChoYXNoID09PSAndG9wJykgc2Nyb2xsVG8obnVsbCk7XG4gICAgfVxuXG4gICAgLy8gZG9lcyBub3Qgc2Nyb2xsIHdoZW4gdXNlciBjbGlja3Mgb24gYW5jaG9yIGxpbmsgdGhhdCBpcyBjdXJyZW50bHkgb25cbiAgICAvLyAobm8gdXJsIGNoYW5nZSwgbm8gJGxvY2F0aW9uLmhhc2goKSBjaGFuZ2UpLCBicm93c2VyIG5hdGl2ZSBkb2VzIHNjcm9sbFxuICAgIGlmIChhdXRvU2Nyb2xsaW5nRW5hYmxlZCkge1xuICAgICAgJHJvb3RTY29wZS4kd2F0Y2goZnVuY3Rpb24gYXV0b1Njcm9sbFdhdGNoKCkge3JldHVybiAkbG9jYXRpb24uaGFzaCgpO30sXG4gICAgICAgIGZ1bmN0aW9uIGF1dG9TY3JvbGxXYXRjaEFjdGlvbihuZXdWYWwsIG9sZFZhbCkge1xuICAgICAgICAgIC8vIHNraXAgdGhlIGluaXRpYWwgc2Nyb2xsIGlmICRsb2NhdGlvbi5oYXNoIGlzIGVtcHR5XG4gICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gb2xkVmFsICYmIG5ld1ZhbCA9PT0gJycpIHJldHVybjtcblxuICAgICAgICAgIGpxTGl0ZURvY3VtZW50TG9hZGVkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKHNjcm9sbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzY3JvbGw7XG4gIH1dO1xufVxuXG52YXIgJGFuaW1hdGVNaW5FcnIgPSBtaW5FcnIoJyRhbmltYXRlJyk7XG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBOR19BTklNQVRFX0NMQVNTTkFNRSA9ICduZy1hbmltYXRlJztcblxuZnVuY3Rpb24gbWVyZ2VDbGFzc2VzKGEsYikge1xuICBpZiAoIWEgJiYgIWIpIHJldHVybiAnJztcbiAgaWYgKCFhKSByZXR1cm4gYjtcbiAgaWYgKCFiKSByZXR1cm4gYTtcbiAgaWYgKGlzQXJyYXkoYSkpIGEgPSBhLmpvaW4oJyAnKTtcbiAgaWYgKGlzQXJyYXkoYikpIGIgPSBiLmpvaW4oJyAnKTtcbiAgcmV0dXJuIGEgKyAnICcgKyBiO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RWxlbWVudE5vZGUoZWxlbWVudCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxtID0gZWxlbWVudFtpXTtcbiAgICBpZiAoZWxtLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHJldHVybiBlbG07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNwbGl0Q2xhc3NlcyhjbGFzc2VzKSB7XG4gIGlmIChpc1N0cmluZyhjbGFzc2VzKSkge1xuICAgIGNsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gIH1cblxuICAvLyBVc2UgY3JlYXRlTWFwKCkgdG8gcHJldmVudCBjbGFzcyBhc3N1bXB0aW9ucyBpbnZvbHZpbmcgcHJvcGVydHkgbmFtZXMgaW5cbiAgLy8gT2JqZWN0LnByb3RvdHlwZVxuICB2YXIgb2JqID0gY3JlYXRlTWFwKCk7XG4gIGZvckVhY2goY2xhc3NlcywgZnVuY3Rpb24oa2xhc3MpIHtcbiAgICAvLyBzb21ldGltZXMgdGhlIHNwbGl0IGxlYXZlcyBlbXB0eSBzdHJpbmcgdmFsdWVzXG4gICAgLy8gaW5jYXNlIGV4dHJhIHNwYWNlcyB3ZXJlIGFwcGxpZWQgdG8gdGhlIG9wdGlvbnNcbiAgICBpZiAoa2xhc3MubGVuZ3RoKSB7XG4gICAgICBvYmpba2xhc3NdID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb2JqO1xufVxuXG4vLyBpZiBhbnkgb3RoZXIgdHlwZSBvZiBvcHRpb25zIHZhbHVlIGJlc2lkZXMgYW4gT2JqZWN0IHZhbHVlIGlzXG4vLyBwYXNzZWQgaW50byB0aGUgJGFuaW1hdGUubWV0aG9kKCkgYW5pbWF0aW9uIHRoZW4gdGhpcyBoZWxwZXIgY29kZVxuLy8gd2lsbCBiZSBydW4gd2hpY2ggd2lsbCBpZ25vcmUgaXQuIFdoaWxlIHRoaXMgcGF0Y2ggaXMgbm90IHRoZVxuLy8gZ3JlYXRlc3Qgc29sdXRpb24gdG8gdGhpcywgYSBsb3Qgb2YgZXhpc3RpbmcgcGx1Z2lucyBkZXBlbmQgb25cbi8vICRhbmltYXRlIHRvIGVpdGhlciBjYWxsIHRoZSBjYWxsYmFjayAoPCAxLjIpIG9yIHJldHVybiBhIHByb21pc2Vcbi8vIHRoYXQgY2FuIGJlIGNoYW5nZWQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgb3B0aW9uc1xuLy8gYXJlIHdpcGVkIGNsZWFuIGluY2FzZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLlxuZnVuY3Rpb24gcHJlcGFyZUFuaW1hdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbnMpXG4gICAgICA/IG9wdGlvbnNcbiAgICAgIDoge307XG59XG5cbnZhciAkJENvcmVBbmltYXRlSnNQcm92aWRlciA9IC8qKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcbiAgdGhpcy4kZ2V0ID0gbm9vcDtcbn07XG5cbi8vIHRoaXMgaXMgcHJlZml4ZWQgd2l0aCBDb3JlIHNpbmNlIGl0IGNvbmZsaWN0cyB3aXRoXG4vLyB0aGUgYW5pbWF0ZVF1ZXVlUHJvdmlkZXIgZGVmaW5lZCBpbiBuZ0FuaW1hdGUvYW5pbWF0ZVF1ZXVlLmpzXG52YXIgJCRDb3JlQW5pbWF0ZVF1ZXVlUHJvdmlkZXIgPSAvKiogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG4gIHZhciBwb3N0RGlnZXN0UXVldWUgPSBuZXcgSGFzaE1hcCgpO1xuICB2YXIgcG9zdERpZ2VzdEVsZW1lbnRzID0gW107XG5cbiAgdGhpcy4kZ2V0ID0gWyckJEFuaW1hdGVSdW5uZXInLCAnJHJvb3RTY29wZScsXG4gICAgICAgZnVuY3Rpb24oJCRBbmltYXRlUnVubmVyLCAgICRyb290U2NvcGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5hYmxlZDogbm9vcCxcbiAgICAgIG9uOiBub29wLFxuICAgICAgb2ZmOiBub29wLFxuICAgICAgcGluOiBub29wLFxuXG4gICAgICBwdXNoOiBmdW5jdGlvbihlbGVtZW50LCBldmVudCwgb3B0aW9ucywgZG9tT3BlcmF0aW9uKSB7XG4gICAgICAgIGlmIChkb21PcGVyYXRpb24pIHtcbiAgICAgICAgICBkb21PcGVyYXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy5mcm9tKSB7XG4gICAgICAgICAgZWxlbWVudC5jc3Mob3B0aW9ucy5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy50bykge1xuICAgICAgICAgIGVsZW1lbnQuY3NzKG9wdGlvbnMudG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYWRkQ2xhc3MgfHwgb3B0aW9ucy5yZW1vdmVDbGFzcykge1xuICAgICAgICAgIGFkZFJlbW92ZUNsYXNzZXNQb3N0RGlnZXN0KGVsZW1lbnQsIG9wdGlvbnMuYWRkQ2xhc3MsIG9wdGlvbnMucmVtb3ZlQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJ1bm5lciA9IG5ldyAkJEFuaW1hdGVSdW5uZXIoKTtcblxuICAgICAgICAvLyBzaW5jZSB0aGVyZSBhcmUgbm8gYW5pbWF0aW9ucyB0byBydW4gdGhlIHJ1bm5lciBuZWVkcyB0byBiZVxuICAgICAgICAvLyBub3RpZmllZCB0aGF0IHRoZSBhbmltYXRpb24gY2FsbCBpcyBjb21wbGV0ZS5cbiAgICAgICAgcnVubmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybiBydW5uZXI7XG4gICAgICB9XG4gICAgfTtcblxuXG4gICAgZnVuY3Rpb24gdXBkYXRlRGF0YShkYXRhLCBjbGFzc2VzLCB2YWx1ZSkge1xuICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIGlmIChjbGFzc2VzKSB7XG4gICAgICAgIGNsYXNzZXMgPSBpc1N0cmluZyhjbGFzc2VzKSA/IGNsYXNzZXMuc3BsaXQoJyAnKSA6XG4gICAgICAgICAgICAgICAgICBpc0FycmF5KGNsYXNzZXMpID8gY2xhc3NlcyA6IFtdO1xuICAgICAgICBmb3JFYWNoKGNsYXNzZXMsIGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgZGF0YVtjbGFzc05hbWVdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUNTU0NsYXNzQ2hhbmdlcygpIHtcbiAgICAgIGZvckVhY2gocG9zdERpZ2VzdEVsZW1lbnRzLCBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIHZhciBkYXRhID0gcG9zdERpZ2VzdFF1ZXVlLmdldChlbGVtZW50KTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBzcGxpdENsYXNzZXMoZWxlbWVudC5hdHRyKCdjbGFzcycpKTtcbiAgICAgICAgICB2YXIgdG9BZGQgPSAnJztcbiAgICAgICAgICB2YXIgdG9SZW1vdmUgPSAnJztcbiAgICAgICAgICBmb3JFYWNoKGRhdGEsIGZ1bmN0aW9uKHN0YXR1cywgY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICB2YXIgaGFzQ2xhc3MgPSAhIWV4aXN0aW5nW2NsYXNzTmFtZV07XG4gICAgICAgICAgICBpZiAoc3RhdHVzICE9PSBoYXNDbGFzcykge1xuICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdG9BZGQgKz0gKHRvQWRkLmxlbmd0aCA/ICcgJyA6ICcnKSArIGNsYXNzTmFtZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b1JlbW92ZSArPSAodG9SZW1vdmUubGVuZ3RoID8gJyAnIDogJycpICsgY2xhc3NOYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBmb3JFYWNoKGVsZW1lbnQsIGZ1bmN0aW9uKGVsbSkge1xuICAgICAgICAgICAgaWYgKHRvQWRkKSB7XG4gICAgICAgICAgICAgIGpxTGl0ZUFkZENsYXNzKGVsbSwgdG9BZGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRvUmVtb3ZlKSB7XG4gICAgICAgICAgICAgIGpxTGl0ZVJlbW92ZUNsYXNzKGVsbSwgdG9SZW1vdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc3REaWdlc3RRdWV1ZS5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcG9zdERpZ2VzdEVsZW1lbnRzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBhZGRSZW1vdmVDbGFzc2VzUG9zdERpZ2VzdChlbGVtZW50LCBhZGQsIHJlbW92ZSkge1xuICAgICAgdmFyIGRhdGEgPSBwb3N0RGlnZXN0UXVldWUuZ2V0KGVsZW1lbnQpIHx8IHt9O1xuXG4gICAgICB2YXIgY2xhc3Nlc0FkZGVkID0gdXBkYXRlRGF0YShkYXRhLCBhZGQsIHRydWUpO1xuICAgICAgdmFyIGNsYXNzZXNSZW1vdmVkID0gdXBkYXRlRGF0YShkYXRhLCByZW1vdmUsIGZhbHNlKTtcblxuICAgICAgaWYgKGNsYXNzZXNBZGRlZCB8fCBjbGFzc2VzUmVtb3ZlZCkge1xuXG4gICAgICAgIHBvc3REaWdlc3RRdWV1ZS5wdXQoZWxlbWVudCwgZGF0YSk7XG4gICAgICAgIHBvc3REaWdlc3RFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChwb3N0RGlnZXN0RWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgJHJvb3RTY29wZS4kJHBvc3REaWdlc3QoaGFuZGxlQ1NTQ2xhc3NDaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfV07XG59O1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJGFuaW1hdGVQcm92aWRlclxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAkYW5pbWF0ZSB0aGF0IGRvZXNuJ3QgcGVyZm9ybSBhbnkgYW5pbWF0aW9ucywgaW5zdGVhZCBqdXN0XG4gKiBzeW5jaHJvbm91c2x5IHBlcmZvcm1zIERPTSB1cGRhdGVzIGFuZCByZXNvbHZlcyB0aGUgcmV0dXJuZWQgcnVubmVyIHByb21pc2UuXG4gKlxuICogSW4gb3JkZXIgdG8gZW5hYmxlIGFuaW1hdGlvbnMgdGhlIGBuZ0FuaW1hdGVgIG1vZHVsZSBoYXMgdG8gYmUgbG9hZGVkLlxuICpcbiAqIFRvIHNlZSB0aGUgZnVuY3Rpb25hbCBpbXBsZW1lbnRhdGlvbiBjaGVjayBvdXQgYHNyYy9uZ0FuaW1hdGUvYW5pbWF0ZS5qc2AuXG4gKi9cbnZhciAkQW5pbWF0ZVByb3ZpZGVyID0gWyckcHJvdmlkZScsIC8qKiBAdGhpcyAqLyBmdW5jdGlvbigkcHJvdmlkZSkge1xuICB2YXIgcHJvdmlkZXIgPSB0aGlzO1xuXG4gIHRoaXMuJCRyZWdpc3RlcmVkQW5pbWF0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRhbmltYXRlUHJvdmlkZXIjcmVnaXN0ZXJcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBpbmplY3RhYmxlIGFuaW1hdGlvbiBmYWN0b3J5IGZ1bmN0aW9uLiBUaGUgZmFjdG9yeSBmdW5jdGlvbiBwcm9kdWNlcyB0aGVcbiAgICogYW5pbWF0aW9uIG9iamVjdCB3aGljaCBjb250YWlucyBjYWxsYmFjayBmdW5jdGlvbnMgZm9yIGVhY2ggZXZlbnQgdGhhdCBpcyBleHBlY3RlZCB0byBiZVxuICAgKiBhbmltYXRlZC5cbiAgICpcbiAgICogICAqIGBldmVudEZuYDogYGZ1bmN0aW9uKGVsZW1lbnQsIC4uLiAsIGRvbmVGdW5jdGlvbiwgb3B0aW9ucylgXG4gICAqICAgVGhlIGVsZW1lbnQgdG8gYW5pbWF0ZSwgdGhlIGBkb25lRnVuY3Rpb25gIGFuZCB0aGUgb3B0aW9ucyBmZWQgaW50byB0aGUgYW5pbWF0aW9uLiBEZXBlbmRpbmdcbiAgICogICBvbiB0aGUgdHlwZSBvZiBhbmltYXRpb24gYWRkaXRpb25hbCBhcmd1bWVudHMgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBhbmltYXRpb24gZnVuY3Rpb24uIFRoZVxuICAgKiAgIGxpc3QgYmVsb3cgZXhwbGFpbnMgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIHRoZSBkaWZmZXJlbnQgYW5pbWF0aW9uIG1ldGhvZHM6XG4gICAqXG4gICAqICAgLSBzZXRDbGFzczogZnVuY3Rpb24oZWxlbWVudCwgYWRkZWRDbGFzc2VzLCByZW1vdmVkQ2xhc3NlcywgZG9uZUZ1bmN0aW9uLCBvcHRpb25zKVxuICAgKiAgIC0gYWRkQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGFkZGVkQ2xhc3NlcywgZG9uZUZ1bmN0aW9uLCBvcHRpb25zKVxuICAgKiAgIC0gcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIHJlbW92ZWRDbGFzc2VzLCBkb25lRnVuY3Rpb24sIG9wdGlvbnMpXG4gICAqICAgLSBlbnRlciwgbGVhdmUsIG1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGRvbmVGdW5jdGlvbiwgb3B0aW9ucylcbiAgICogICAtIGFuaW1hdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGZyb21TdHlsZXMsIHRvU3R5bGVzLCBkb25lRnVuY3Rpb24sIG9wdGlvbnMpXG4gICAqXG4gICAqICAgTWFrZSBzdXJlIHRvIHRyaWdnZXIgdGhlIGBkb25lRnVuY3Rpb25gIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBmdWxseSBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBganNcbiAgICogICByZXR1cm4ge1xuICAgKiAgICAgLy9lbnRlciwgbGVhdmUsIG1vdmUgc2lnbmF0dXJlXG4gICAqICAgICBldmVudEZuIDogZnVuY3Rpb24oZWxlbWVudCwgZG9uZSwgb3B0aW9ucykge1xuICAgKiAgICAgICAvL2NvZGUgdG8gcnVuIHRoZSBhbmltYXRpb25cbiAgICogICAgICAgLy9vbmNlIGNvbXBsZXRlLCB0aGVuIHJ1biBkb25lKClcbiAgICogICAgICAgcmV0dXJuIGZ1bmN0aW9uIGVuZEZ1bmN0aW9uKHdhc0NhbmNlbGxlZCkge1xuICAgKiAgICAgICAgIC8vY29kZSB0byBjYW5jZWwgdGhlIGFuaW1hdGlvblxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGFuaW1hdGlvbiAodGhpcyBpcyB3aGF0IHRoZSBjbGFzcy1iYXNlZCBDU1MgdmFsdWUgd2lsbCBiZSBjb21wYXJlZCB0bykuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkgVGhlIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHJldHVybiB0aGUgYW5pbWF0aW9uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LlxuICAgKi9cbiAgdGhpcy5yZWdpc3RlciA9IGZ1bmN0aW9uKG5hbWUsIGZhY3RvcnkpIHtcbiAgICBpZiAobmFtZSAmJiBuYW1lLmNoYXJBdCgwKSAhPT0gJy4nKSB7XG4gICAgICB0aHJvdyAkYW5pbWF0ZU1pbkVycignbm90Y3NlbCcsICdFeHBlY3RpbmcgY2xhc3Mgc2VsZWN0b3Igc3RhcnRpbmcgd2l0aCBcXCcuXFwnIGdvdCBcXCd7MH1cXCcuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IG5hbWUgKyAnLWFuaW1hdGlvbic7XG4gICAgcHJvdmlkZXIuJCRyZWdpc3RlcmVkQW5pbWF0aW9uc1tuYW1lLnN1YnN0cigxKV0gPSBrZXk7XG4gICAgJHByb3ZpZGUuZmFjdG9yeShrZXksIGZhY3RvcnkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRhbmltYXRlUHJvdmlkZXIjY2xhc3NOYW1lRmlsdGVyXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGFuZC9vciByZXR1cm5zIHRoZSBDU1MgY2xhc3MgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgY2hlY2tlZCB3aGVuIHBlcmZvcm1pbmdcbiAgICogYW4gYW5pbWF0aW9uLiBVcG9uIGJvb3RzdHJhcCB0aGUgY2xhc3NOYW1lRmlsdGVyIHZhbHVlIGlzIG5vdCBzZXQgYXQgYWxsIGFuZCB3aWxsXG4gICAqIHRoZXJlZm9yZSBlbmFibGUgJGFuaW1hdGUgdG8gYXR0ZW1wdCB0byBwZXJmb3JtIGFuIGFuaW1hdGlvbiBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIHRyaWdnZXJlZC5cbiAgICogV2hlbiBzZXR0aW5nIHRoZSBgY2xhc3NOYW1lRmlsdGVyYCB2YWx1ZSwgYW5pbWF0aW9ucyB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIG9uIGVsZW1lbnRzXG4gICAqIHRoYXQgc3VjY2Vzc2Z1bGx5IG1hdGNoIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbi4gVGhpcyBpbiB0dXJuIGNhbiBib29zdCBwZXJmb3JtYW5jZVxuICAgKiBmb3IgbG93LXBvd2VyZWQgZGV2aWNlcyBhcyB3ZWxsIGFzIGFwcGxpY2F0aW9ucyBjb250YWluaW5nIGEgbG90IG9mIHN0cnVjdHVyYWwgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtSZWdFeHA9fSBleHByZXNzaW9uIFRoZSBjbGFzc05hbWUgZXhwcmVzc2lvbiB3aGljaCB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgYW5pbWF0aW9uc1xuICAgKiBAcmV0dXJuIHtSZWdFeHB9IFRoZSBjdXJyZW50IENTUyBjbGFzc05hbWUgZXhwcmVzc2lvbiB2YWx1ZS4gSWYgbnVsbCB0aGVuIHRoZXJlIGlzIG5vIGV4cHJlc3Npb24gdmFsdWVcbiAgICovXG4gIHRoaXMuY2xhc3NOYW1lRmlsdGVyID0gZnVuY3Rpb24oZXhwcmVzc2lvbikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLiQkY2xhc3NOYW1lRmlsdGVyID0gKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBSZWdFeHApID8gZXhwcmVzc2lvbiA6IG51bGw7XG4gICAgICBpZiAodGhpcy4kJGNsYXNzTmFtZUZpbHRlcikge1xuICAgICAgICB2YXIgcmVzZXJ2ZWRSZWdleCA9IG5ldyBSZWdFeHAoJyhcXFxccyt8XFxcXC8pJyArIE5HX0FOSU1BVEVfQ0xBU1NOQU1FICsgJyhcXFxccyt8XFxcXC8pJyk7XG4gICAgICAgIGlmIChyZXNlcnZlZFJlZ2V4LnRlc3QodGhpcy4kJGNsYXNzTmFtZUZpbHRlci50b1N0cmluZygpKSkge1xuICAgICAgICAgIHRocm93ICRhbmltYXRlTWluRXJyKCdub25nY2xzJywnJGFuaW1hdGVQcm92aWRlci5jbGFzc05hbWVGaWx0ZXIocmVnZXgpIHByb2hpYml0cyBhY2NlcHRpbmcgYSByZWdleCB2YWx1ZSB3aGljaCBtYXRjaGVzL2NvbnRhaW5zIHRoZSBcInswfVwiIENTUyBjbGFzcy4nLCBOR19BTklNQVRFX0NMQVNTTkFNRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuJCRjbGFzc05hbWVGaWx0ZXI7XG4gIH07XG5cbiAgdGhpcy4kZ2V0ID0gWyckJGFuaW1hdGVRdWV1ZScsIGZ1bmN0aW9uKCQkYW5pbWF0ZVF1ZXVlKSB7XG4gICAgZnVuY3Rpb24gZG9tSW5zZXJ0KGVsZW1lbnQsIHBhcmVudEVsZW1lbnQsIGFmdGVyRWxlbWVudCkge1xuICAgICAgLy8gaWYgZm9yIHNvbWUgcmVhc29uIHRoZSBwcmV2aW91cyBlbGVtZW50IHdhcyByZW1vdmVkXG4gICAgICAvLyBmcm9tIHRoZSBkb20gc29tZXRpbWUgYmVmb3JlIHRoaXMgY29kZSBydW5zIHRoZW4gbGV0J3NcbiAgICAgIC8vIGp1c3Qgc3RpY2sgdG8gdXNpbmcgdGhlIHBhcmVudCBlbGVtZW50IGFzIHRoZSBhbmNob3JcbiAgICAgIGlmIChhZnRlckVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGFmdGVyTm9kZSA9IGV4dHJhY3RFbGVtZW50Tm9kZShhZnRlckVsZW1lbnQpO1xuICAgICAgICBpZiAoYWZ0ZXJOb2RlICYmICFhZnRlck5vZGUucGFyZW50Tm9kZSAmJiAhYWZ0ZXJOb2RlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgICBhZnRlckVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXJFbGVtZW50KSB7XG4gICAgICAgIGFmdGVyRWxlbWVudC5hZnRlcihlbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudEVsZW1lbnQucHJlcGVuZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2Mgc2VydmljZVxuICAgICAqIEBuYW1lICRhbmltYXRlXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSAkYW5pbWF0ZSBzZXJ2aWNlIGV4cG9zZXMgYSBzZXJpZXMgb2YgRE9NIHV0aWxpdHkgbWV0aG9kcyB0aGF0IHByb3ZpZGUgc3VwcG9ydFxuICAgICAqIGZvciBhbmltYXRpb24gaG9va3MuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSBhcHBsaWNhdGlvbiBvZiBET00gb3BlcmF0aW9ucywgaG93ZXZlcixcbiAgICAgKiB3aGVuIGFuIGFuaW1hdGlvbiBpcyBkZXRlY3RlZCAoYW5kIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQpLCAkYW5pbWF0ZSB3aWxsIGRvIHRoZSBoZWF2eSBsaWZ0aW5nXG4gICAgICogdG8gZW5zdXJlIHRoYXQgYW5pbWF0aW9uIHJ1bnMgd2l0aCB0aGUgdHJpZ2dlcmVkIERPTSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0ICRhbmltYXRlIGRvZXNuJ3QgdHJpZ2dlciBhbnkgYW5pbWF0aW9ucy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBgbmdBbmltYXRlYCBtb2R1bGUgaXNuJ3RcbiAgICAgKiBpbmNsdWRlZCBhbmQgb25seSB3aGVuIGl0IGlzIGFjdGl2ZSB0aGVuIHRoZSBhbmltYXRpb24gaG9va3MgdGhhdCBgJGFuaW1hdGVgIHRyaWdnZXJzIHdpbGwgYmVcbiAgICAgKiBmdW5jdGlvbmFsLiBPbmNlIGFjdGl2ZSB0aGVuIGFsbCBzdHJ1Y3R1cmFsIGBuZy1gIGRpcmVjdGl2ZXMgd2lsbCB0cmlnZ2VyIGFuaW1hdGlvbnMgYXMgdGhleSBwZXJmb3JtXG4gICAgICogdGhlaXIgRE9NLXJlbGF0ZWQgb3BlcmF0aW9ucyAoZW50ZXIsIGxlYXZlIGFuZCBtb3ZlKS4gT3RoZXIgZGlyZWN0aXZlcyBzdWNoIGFzIGBuZ0NsYXNzYCxcbiAgICAgKiBgbmdTaG93YCwgYG5nSGlkZWAgYW5kIGBuZ01lc3NhZ2VzYCBhbHNvIHByb3ZpZGUgc3VwcG9ydCBmb3IgYW5pbWF0aW9ucy5cbiAgICAgKlxuICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlYCRhbmltYXRlYCBzZXJ2aWNlIGlzIGFsd2F5cyB1c2VkIHdoZW4gZXhlY3V0aW5nIERPTS1yZWxhdGVkIHByb2NlZHVyZXMgd2l0aGluIGRpcmVjdGl2ZXMuXG4gICAgICpcbiAgICAgKiBUbyBsZWFybiBtb3JlIGFib3V0IGVuYWJsaW5nIGFuaW1hdGlvbiBzdXBwb3J0LCBjbGljayBoZXJlIHRvIHZpc2l0IHRoZVxuICAgICAqIHtAbGluayBuZ0FuaW1hdGUgbmdBbmltYXRlIG1vZHVsZSBwYWdlfS5cbiAgICAgKi9cbiAgICByZXR1cm4ge1xuICAgICAgLy8gd2UgZG9uJ3QgY2FsbCBpdCBkaXJlY3RseSBzaW5jZSBub24tZXhpc3RhbnQgYXJndW1lbnRzIG1heVxuICAgICAgLy8gYmUgaW50ZXJwcmV0ZWQgYXMgbnVsbCB3aXRoaW4gdGhlIHN1YiBlbmFibGVkIGZ1bmN0aW9uXG5cbiAgICAgIC8qKlxuICAgICAgICpcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRhbmltYXRlI29uXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgYW4gZXZlbnQgbGlzdGVuZXIgdG8gZmlyZSB3aGVuZXZlciB0aGUgYW5pbWF0aW9uIGV2ZW50IChlbnRlciwgbGVhdmUsIG1vdmUsIGV0Yy4uLilcbiAgICAgICAqICAgIGhhcyBmaXJlZCBvbiB0aGUgZ2l2ZW4gZWxlbWVudCBvciBhbW9uZyBhbnkgb2YgaXRzIGNoaWxkcmVuLiBPbmNlIHRoZSBsaXN0ZW5lciBpcyBmaXJlZCwgdGhlIHByb3ZpZGVkIGNhbGxiYWNrXG4gICAgICAgKiAgICBpcyBmaXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1zOlxuICAgICAgICpcbiAgICAgICAqIGBgYGpzXG4gICAgICAgKiAkYW5pbWF0ZS5vbignZW50ZXInLCBjb250YWluZXIsXG4gICAgICAgKiAgICBmdW5jdGlvbiBjYWxsYmFjayhlbGVtZW50LCBwaGFzZSkge1xuICAgICAgICogICAgICAvLyBjb29sIHdlIGRldGVjdGVkIGFuIGVudGVyIGFuaW1hdGlvbiB3aXRoaW4gdGhlIGNvbnRhaW5lclxuICAgICAgICogICAgfVxuICAgICAgICogKTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCB0aGUgYW5pbWF0aW9uIGV2ZW50IHRoYXQgd2lsbCBiZSBjYXB0dXJlZCAoZS5nLiBlbnRlciwgbGVhdmUsIG1vdmUsIGFkZENsYXNzLCByZW1vdmVDbGFzcywgZXRjLi4uKVxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgd2lsbCBjYXB0dXJlIGVhY2ggb2YgdGhlIGFuaW1hdGlvbiBldmVudHMgdGhhdCBhcmUgZmlyZWQgb24gaXRzZWxmXG4gICAgICAgKiAgICAgYXMgd2VsbCBhcyBhbW9uZyBpdHMgY2hpbGRyZW5cbiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiB0aGUgbGlzdGVuZXIgaXMgdHJpZ2dlcmVkXG4gICAgICAgKlxuICAgICAgICogVGhlIGFyZ3VtZW50cyBwcmVzZW50IGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBhcmU6XG4gICAgICAgKiAqIGBlbGVtZW50YCAtIFRoZSBjYXB0dXJlZCBET00gZWxlbWVudCB0aGF0IHRoZSBhbmltYXRpb24gd2FzIGZpcmVkIG9uLlxuICAgICAgICogKiBgcGhhc2VgIC0gVGhlIHBoYXNlIG9mIHRoZSBhbmltYXRpb24uIFRoZSB0d28gcG9zc2libGUgcGhhc2VzIGFyZSAqKnN0YXJ0KiogKHdoZW4gdGhlIGFuaW1hdGlvbiBzdGFydHMpIGFuZCAqKmNsb3NlKiogKHdoZW4gaXQgZW5kcykuXG4gICAgICAgKi9cbiAgICAgIG9uOiAkJGFuaW1hdGVRdWV1ZS5vbixcblxuICAgICAgLyoqXG4gICAgICAgKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjb2ZmXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICogQGRlc2NyaXB0aW9uIERlcmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIGJhc2VkIG9uIHRoZSBldmVudCB3aGljaCBoYXMgYmVlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGVsZW1lbnQuIFRoaXMgbWV0aG9kXG4gICAgICAgKiBjYW4gYmUgdXNlZCBpbiB0aHJlZSBkaWZmZXJlbnQgd2F5cyBkZXBlbmRpbmcgb24gdGhlIGFyZ3VtZW50czpcbiAgICAgICAqXG4gICAgICAgKiBgYGBqc1xuICAgICAgICogLy8gcmVtb3ZlIGFsbCB0aGUgYW5pbWF0aW9uIGV2ZW50IGxpc3RlbmVycyBsaXN0ZW5pbmcgZm9yIGBlbnRlcmBcbiAgICAgICAqICRhbmltYXRlLm9mZignZW50ZXInKTtcbiAgICAgICAqXG4gICAgICAgKiAvLyByZW1vdmUgbGlzdGVuZXJzIGZvciBhbGwgYW5pbWF0aW9uIGV2ZW50cyBmcm9tIHRoZSBjb250YWluZXIgZWxlbWVudFxuICAgICAgICogJGFuaW1hdGUub2ZmKGNvbnRhaW5lcik7XG4gICAgICAgKlxuICAgICAgICogLy8gcmVtb3ZlIGFsbCB0aGUgYW5pbWF0aW9uIGV2ZW50IGxpc3RlbmVycyBsaXN0ZW5pbmcgZm9yIGBlbnRlcmAgb24gdGhlIGdpdmVuIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlblxuICAgICAgICogJGFuaW1hdGUub2ZmKCdlbnRlcicsIGNvbnRhaW5lcik7XG4gICAgICAgKlxuICAgICAgICogLy8gcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcm92aWRlZCBieSBgY2FsbGJhY2tgIHRoYXQgaXMgc2V0XG4gICAgICAgKiAvLyB0byBsaXN0ZW4gZm9yIGBlbnRlcmAgb24gdGhlIGdpdmVuIGBjb250YWluZXJgIGFzIHdlbGwgYXMgaXRzIGNoaWxkcmVuXG4gICAgICAgKiAkYW5pbWF0ZS5vZmYoJ2VudGVyJywgY29udGFpbmVyLCBjYWxsYmFjayk7XG4gICAgICAgKiBgYGBcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ3xET01FbGVtZW50fSBldmVudHxjb250YWluZXIgdGhlIGFuaW1hdGlvbiBldmVudCAoZS5nLiBlbnRlciwgbGVhdmUsIG1vdmUsXG4gICAgICAgKiBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MsIGV0Yy4uLiksIG9yIHRoZSBjb250YWluZXIgZWxlbWVudC4gSWYgaXQgaXMgdGhlIGVsZW1lbnQsIGFsbCBvdGhlclxuICAgICAgICogYXJndW1lbnRzIGFyZSBpZ25vcmVkLlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50PX0gY29udGFpbmVyIHRoZSBjb250YWluZXIgZWxlbWVudCB0aGUgZXZlbnQgbGlzdGVuZXIgd2FzIHBsYWNlZCBvblxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbj19IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdhcyByZWdpc3RlcmVkIGFzIHRoZSBsaXN0ZW5lclxuICAgICAgICovXG4gICAgICBvZmY6ICQkYW5pbWF0ZVF1ZXVlLm9mZixcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNwaW5cbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gQXNzb2NpYXRlcyB0aGUgcHJvdmlkZWQgZWxlbWVudCB3aXRoIGEgaG9zdCBwYXJlbnQgZWxlbWVudCB0byBhbGxvdyB0aGUgZWxlbWVudCB0byBiZSBhbmltYXRlZCBldmVuIGlmIGl0IGV4aXN0c1xuICAgICAgICogICAgb3V0c2lkZSBvZiB0aGUgRE9NIHN0cnVjdHVyZSBvZiB0aGUgQW5ndWxhciBhcHBsaWNhdGlvbi4gQnkgZG9pbmcgc28sIGFueSBhbmltYXRpb24gdHJpZ2dlcmVkIHZpYSBgJGFuaW1hdGVgIGNhbiBiZSBpc3N1ZWQgb24gdGhlXG4gICAgICAgKiAgICBlbGVtZW50IGRlc3BpdGUgYmVpbmcgb3V0c2lkZSB0aGUgcmVhbG0gb2YgdGhlIGFwcGxpY2F0aW9uIG9yIHdpdGhpbiBhbm90aGVyIGFwcGxpY2F0aW9uLiBTYXkgZm9yIGV4YW1wbGUgaWYgdGhlIGFwcGxpY2F0aW9uXG4gICAgICAgKiAgICB3YXMgYm9vdHN0cmFwcGVkIG9uIGFuIGVsZW1lbnQgdGhhdCBpcyBzb21ld2hlcmUgaW5zaWRlIG9mIHRoZSBgPGJvZHk+YCB0YWcsIGJ1dCB3ZSB3YW50ZWQgdG8gYWxsb3cgZm9yIGFuIGVsZW1lbnQgdG8gYmUgc2l0dWF0ZWRcbiAgICAgICAqICAgIGFzIGEgZGlyZWN0IGNoaWxkIG9mIGBkb2N1bWVudC5ib2R5YCwgdGhlbiB0aGlzIGNhbiBiZSBhY2hpZXZlZCBieSBwaW5uaW5nIHRoZSBlbGVtZW50IHZpYSBgJGFuaW1hdGUucGluKGVsZW1lbnQpYC4gS2VlcCBpbiBtaW5kXG4gICAgICAgKiAgICB0aGF0IGNhbGxpbmcgYCRhbmltYXRlLnBpbihlbGVtZW50LCBwYXJlbnRFbGVtZW50KWAgd2lsbCBub3QgYWN0dWFsbHkgaW5zZXJ0IGludG8gdGhlIERPTSBhbnl3aGVyZTsgaXQgd2lsbCBqdXN0IGNyZWF0ZSB0aGUgYXNzb2NpYXRpb24uXG4gICAgICAgKlxuICAgICAgICogICAgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBvbmx5IGFjdGl2ZSB3aGVuIHRoZSBgbmdBbmltYXRlYCBtb2R1bGUgaXMgdXNlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGV4dGVybmFsIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHBpbm5lZFxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBwYXJlbnRFbGVtZW50IHRoZSBob3N0IHBhcmVudCBlbGVtZW50IHRoYXQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGVsZW1lbnRcbiAgICAgICAqL1xuICAgICAgcGluOiAkJGFuaW1hdGVRdWV1ZS5waW4sXG5cbiAgICAgIC8qKlxuICAgICAgICpcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRhbmltYXRlI2VuYWJsZWRcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gVXNlZCB0byBnZXQgYW5kIHNldCB3aGV0aGVyIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQgb3Igbm90IG9uIHRoZSBlbnRpcmUgYXBwbGljYXRpb24gb3Igb24gYW4gZWxlbWVudCBhbmQgaXRzIGNoaWxkcmVuLiBUaGlzXG4gICAgICAgKiBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGZvdXIgd2F5czpcbiAgICAgICAqXG4gICAgICAgKiBgYGBqc1xuICAgICAgICogLy8gcmV0dXJucyB0cnVlIG9yIGZhbHNlXG4gICAgICAgKiAkYW5pbWF0ZS5lbmFibGVkKCk7XG4gICAgICAgKlxuICAgICAgICogLy8gY2hhbmdlcyB0aGUgZW5hYmxlZCBzdGF0ZSBmb3IgYWxsIGFuaW1hdGlvbnNcbiAgICAgICAqICRhbmltYXRlLmVuYWJsZWQoZmFsc2UpO1xuICAgICAgICogJGFuaW1hdGUuZW5hYmxlZCh0cnVlKTtcbiAgICAgICAqXG4gICAgICAgKiAvLyByZXR1cm5zIHRydWUgb3IgZmFsc2UgaWYgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgYW4gZWxlbWVudFxuICAgICAgICogJGFuaW1hdGUuZW5hYmxlZChlbGVtZW50KTtcbiAgICAgICAqXG4gICAgICAgKiAvLyBjaGFuZ2VzIHRoZSBlbmFibGVkIHN0YXRlIGZvciBhbiBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW5cbiAgICAgICAqICRhbmltYXRlLmVuYWJsZWQoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgKiAkYW5pbWF0ZS5lbmFibGVkKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudD19IGVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGNoZWNraW5nL3NldHRpbmcgdGhlIGVuYWJsZWQgc3RhdGVcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGVuYWJsZWQgd2hldGhlciBvciBub3QgdGhlIGFuaW1hdGlvbnMgd2lsbCBiZSBlbmFibGVkIGZvciB0aGUgZWxlbWVudFxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IGFuaW1hdGlvbnMgYXJlIGVuYWJsZWRcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZDogJCRhbmltYXRlUXVldWUuZW5hYmxlZCxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNjYW5jZWxcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gQ2FuY2VscyB0aGUgcHJvdmlkZWQgYW5pbWF0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7UHJvbWlzZX0gYW5pbWF0aW9uUHJvbWlzZSBUaGUgYW5pbWF0aW9uIHByb21pc2UgdGhhdCBpcyByZXR1cm5lZCB3aGVuIGFuIGFuaW1hdGlvbiBpcyBzdGFydGVkLlxuICAgICAgICovXG4gICAgICBjYW5jZWw6IGZ1bmN0aW9uKHJ1bm5lcikge1xuICAgICAgICBpZiAocnVubmVyLmVuZCkge1xuICAgICAgICAgIHJ1bm5lci5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjZW50ZXJcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyB0aGUgZWxlbWVudCBpbnRvIHRoZSBET00gZWl0aGVyIGFmdGVyIHRoZSBgYWZ0ZXJgIGVsZW1lbnQgKGlmIHByb3ZpZGVkKSBvclxuICAgICAgICogICBhcyB0aGUgZmlyc3QgY2hpbGQgd2l0aGluIHRoZSBgcGFyZW50YCBlbGVtZW50IGFuZCB0aGVuIHRyaWdnZXJzIGFuIGFuaW1hdGlvbi5cbiAgICAgICAqICAgQSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBkdXJpbmcgdGhlIG5leHQgZGlnZXN0IG9uY2UgdGhlIGFuaW1hdGlvblxuICAgICAgICogICBoYXMgY29tcGxldGVkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBwYXJlbnQgdGhlIHBhcmVudCBlbGVtZW50IHdoaWNoIHdpbGwgYXBwZW5kIHRoZSBlbGVtZW50IGFzXG4gICAgICAgKiAgIGEgY2hpbGQgKHNvIGxvbmcgYXMgdGhlIGFmdGVyIGVsZW1lbnQgaXMgbm90IHByZXNlbnQpXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnQ9fSBhZnRlciB0aGUgc2libGluZyBlbGVtZW50IGFmdGVyIHdoaWNoIHRoZSBlbGVtZW50IHdpbGwgYmUgYXBwZW5kZWRcbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMvc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LlxuICAgICAgICogICBUaGUgb2JqZWN0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAqXG4gICAgICAgKiAgIC0gKiphZGRDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudFxuICAgICAgICogICAtICoqZnJvbSoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYHRvYFxuICAgICAgICogICAtICoqcmVtb3ZlQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gcmVtb3ZlIGZyb20gZWxlbWVudFxuICAgICAgICogICAtICoqdG8qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCBlbmQgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYGZyb21gXG4gICAgICAgKlxuICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlXG4gICAgICAgKi9cbiAgICAgIGVudGVyOiBmdW5jdGlvbihlbGVtZW50LCBwYXJlbnQsIGFmdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudCAmJiBqcUxpdGUocGFyZW50KTtcbiAgICAgICAgYWZ0ZXIgPSBhZnRlciAmJiBqcUxpdGUoYWZ0ZXIpO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQgfHwgYWZ0ZXIucGFyZW50KCk7XG4gICAgICAgIGRvbUluc2VydChlbGVtZW50LCBwYXJlbnQsIGFmdGVyKTtcbiAgICAgICAgcmV0dXJuICQkYW5pbWF0ZVF1ZXVlLnB1c2goZWxlbWVudCwgJ2VudGVyJywgcHJlcGFyZUFuaW1hdGVPcHRpb25zKG9wdGlvbnMpKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICpcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRhbmltYXRlI21vdmVcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyAobW92ZXMpIHRoZSBlbGVtZW50IGludG8gaXRzIG5ldyBwb3NpdGlvbiBpbiB0aGUgRE9NIGVpdGhlciBhZnRlclxuICAgICAgICogICB0aGUgYGFmdGVyYCBlbGVtZW50IChpZiBwcm92aWRlZCkgb3IgYXMgdGhlIGZpcnN0IGNoaWxkIHdpdGhpbiB0aGUgYHBhcmVudGAgZWxlbWVudFxuICAgICAgICogICBhbmQgdGhlbiB0cmlnZ2VycyBhbiBhbmltYXRpb24uIEEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWRcbiAgICAgICAqICAgZHVyaW5nIHRoZSBuZXh0IGRpZ2VzdCBvbmNlIHRoZSBhbmltYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBtb3ZlZCBpbnRvIHRoZSBuZXcgRE9NIHBvc2l0aW9uXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudCB0aGUgcGFyZW50IGVsZW1lbnQgd2hpY2ggd2lsbCBhcHBlbmQgdGhlIGVsZW1lbnQgYXNcbiAgICAgICAqICAgYSBjaGlsZCAoc28gbG9uZyBhcyB0aGUgYWZ0ZXIgZWxlbWVudCBpcyBub3QgcHJlc2VudClcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudD19IGFmdGVyIHRoZSBzaWJsaW5nIGVsZW1lbnQgYWZ0ZXIgd2hpY2ggdGhlIGVsZW1lbnQgd2lsbCBiZSBhcHBlbmRlZFxuICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygb3B0aW9ucy9zdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiAgIFRoZSBvYmplY3QgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICpcbiAgICAgICAqICAgLSAqKmFkZENsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50XG4gICAgICAgKiAgIC0gKipmcm9tKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgdG9gXG4gICAgICAgKiAgIC0gKipyZW1vdmVDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byByZW1vdmUgZnJvbSBlbGVtZW50XG4gICAgICAgKiAgIC0gKip0byoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IGVuZCBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgZnJvbWBcbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2VcbiAgICAgICAqL1xuICAgICAgbW92ZTogZnVuY3Rpb24oZWxlbWVudCwgcGFyZW50LCBhZnRlciwgb3B0aW9ucykge1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQgJiYganFMaXRlKHBhcmVudCk7XG4gICAgICAgIGFmdGVyID0gYWZ0ZXIgJiYganFMaXRlKGFmdGVyKTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50IHx8IGFmdGVyLnBhcmVudCgpO1xuICAgICAgICBkb21JbnNlcnQoZWxlbWVudCwgcGFyZW50LCBhZnRlcik7XG4gICAgICAgIHJldHVybiAkJGFuaW1hdGVRdWV1ZS5wdXNoKGVsZW1lbnQsICdtb3ZlJywgcHJlcGFyZUFuaW1hdGVPcHRpb25zKG9wdGlvbnMpKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjbGVhdmVcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gVHJpZ2dlcnMgYW4gYW5pbWF0aW9uIGFuZCB0aGVuIHJlbW92ZXMgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NLlxuICAgICAgICogV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgZHVyaW5nIHRoZSBuZXh0XG4gICAgICAgKiBkaWdlc3Qgb25jZSB0aGUgYW5pbWF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMvc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LlxuICAgICAgICogICBUaGUgb2JqZWN0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAqXG4gICAgICAgKiAgIC0gKiphZGRDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudFxuICAgICAgICogICAtICoqZnJvbSoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYHRvYFxuICAgICAgICogICAtICoqcmVtb3ZlQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gcmVtb3ZlIGZyb20gZWxlbWVudFxuICAgICAgICogICAtICoqdG8qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCBlbmQgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYGZyb21gXG4gICAgICAgKlxuICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlXG4gICAgICAgKi9cbiAgICAgIGxlYXZlOiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiAkJGFuaW1hdGVRdWV1ZS5wdXNoKGVsZW1lbnQsICdsZWF2ZScsIHByZXBhcmVBbmltYXRlT3B0aW9ucyhvcHRpb25zKSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRhbmltYXRlI2FkZENsYXNzXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBUcmlnZ2VycyBhbiBhZGRDbGFzcyBhbmltYXRpb24gc3Vycm91bmRpbmcgdGhlIGFkZGl0aW9uIG9mIHRoZSBwcm92aWRlZCBDU1MgY2xhc3MoZXMpLiBVcG9uXG4gICAgICAgKiAgIGV4ZWN1dGlvbiwgdGhlIGFkZENsYXNzIG9wZXJhdGlvbiB3aWxsIG9ubHkgYmUgaGFuZGxlZCBhZnRlciB0aGUgbmV4dCBkaWdlc3QgYW5kIGl0IHdpbGwgbm90IHRyaWdnZXIgYW5cbiAgICAgICAqICAgYW5pbWF0aW9uIGlmIGVsZW1lbnQgYWxyZWFkeSBjb250YWlucyB0aGUgQ1NTIGNsYXNzIG9yIGlmIHRoZSBjbGFzcyBpcyByZW1vdmVkIGF0IGEgbGF0ZXIgc3RlcC5cbiAgICAgICAqICAgTm90ZSB0aGF0IGNsYXNzLWJhc2VkIGFuaW1hdGlvbnMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgY29tcGFyZWQgdG8gc3RydWN0dXJhbCBhbmltYXRpb25zXG4gICAgICAgKiAgIChsaWtlIGVudGVyLCBtb3ZlIGFuZCBsZWF2ZSkgc2luY2UgdGhlIENTUyBjbGFzc2VzIG1heSBiZSBhZGRlZC9yZW1vdmVkIGF0IGRpZmZlcmVudCBwb2ludHNcbiAgICAgICAqICAgZGVwZW5kaW5nIGlmIENTUyBvciBKYXZhU2NyaXB0IGFuaW1hdGlvbnMgYXJlIHVzZWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHRoZSBDU1MgY2xhc3NlcyB3aWxsIGJlIGFwcGxpZWQgdG9cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyhlcykgdGhhdCB3aWxsIGJlIGFkZGVkIChtdWx0aXBsZSBjbGFzc2VzIGFyZSBzZXBhcmF0ZWQgdmlhIHNwYWNlcylcbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMvc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LlxuICAgICAgICogICBUaGUgb2JqZWN0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAqXG4gICAgICAgKiAgIC0gKiphZGRDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudFxuICAgICAgICogICAtICoqZnJvbSoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYHRvYFxuICAgICAgICogICAtICoqcmVtb3ZlQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gcmVtb3ZlIGZyb20gZWxlbWVudFxuICAgICAgICogICAtICoqdG8qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCBlbmQgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYGZyb21gXG4gICAgICAgKlxuICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlXG4gICAgICAgKi9cbiAgICAgIGFkZENsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHByZXBhcmVBbmltYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5hZGRDbGFzcyA9IG1lcmdlQ2xhc3NlcyhvcHRpb25zLmFkZGNsYXNzLCBjbGFzc05hbWUpO1xuICAgICAgICByZXR1cm4gJCRhbmltYXRlUXVldWUucHVzaChlbGVtZW50LCAnYWRkQ2xhc3MnLCBvcHRpb25zKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjcmVtb3ZlQ2xhc3NcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uIFRyaWdnZXJzIGEgcmVtb3ZlQ2xhc3MgYW5pbWF0aW9uIHN1cnJvdW5kaW5nIHRoZSByZW1vdmFsIG9mIHRoZSBwcm92aWRlZCBDU1MgY2xhc3MoZXMpLiBVcG9uXG4gICAgICAgKiAgIGV4ZWN1dGlvbiwgdGhlIHJlbW92ZUNsYXNzIG9wZXJhdGlvbiB3aWxsIG9ubHkgYmUgaGFuZGxlZCBhZnRlciB0aGUgbmV4dCBkaWdlc3QgYW5kIGl0IHdpbGwgbm90IHRyaWdnZXIgYW5cbiAgICAgICAqICAgYW5pbWF0aW9uIGlmIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiB0aGUgQ1NTIGNsYXNzIG9yIGlmIHRoZSBjbGFzcyBpcyBhZGRlZCBhdCBhIGxhdGVyIHN0ZXAuXG4gICAgICAgKiAgIE5vdGUgdGhhdCBjbGFzcy1iYXNlZCBhbmltYXRpb25zIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IGNvbXBhcmVkIHRvIHN0cnVjdHVyYWwgYW5pbWF0aW9uc1xuICAgICAgICogICAobGlrZSBlbnRlciwgbW92ZSBhbmQgbGVhdmUpIHNpbmNlIHRoZSBDU1MgY2xhc3NlcyBtYXkgYmUgYWRkZWQvcmVtb3ZlZCBhdCBkaWZmZXJlbnQgcG9pbnRzXG4gICAgICAgKiAgIGRlcGVuZGluZyBpZiBDU1Mgb3IgSmF2YVNjcmlwdCBhbmltYXRpb25zIGFyZSB1c2VkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB0aGUgQ1NTIGNsYXNzZXMgd2lsbCBiZSBhcHBsaWVkIHRvXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIHRoZSBDU1MgY2xhc3MoZXMpIHRoYXQgd2lsbCBiZSByZW1vdmVkIChtdWx0aXBsZSBjbGFzc2VzIGFyZSBzZXBhcmF0ZWQgdmlhIHNwYWNlcylcbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMvc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LlxuICAgICAgICogICBUaGUgb2JqZWN0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAqXG4gICAgICAgKiAgIC0gKiphZGRDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudFxuICAgICAgICogICAtICoqZnJvbSoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYHRvYFxuICAgICAgICogICAtICoqcmVtb3ZlQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gcmVtb3ZlIGZyb20gZWxlbWVudFxuICAgICAgICogICAtICoqdG8qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCBlbmQgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYGZyb21gXG4gICAgICAgKlxuICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHByZXBhcmVBbmltYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5yZW1vdmVDbGFzcyA9IG1lcmdlQ2xhc3NlcyhvcHRpb25zLnJlbW92ZUNsYXNzLCBjbGFzc05hbWUpO1xuICAgICAgICByZXR1cm4gJCRhbmltYXRlUXVldWUucHVzaChlbGVtZW50LCAncmVtb3ZlQ2xhc3MnLCBvcHRpb25zKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjc2V0Q2xhc3NcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uIFBlcmZvcm1zIGJvdGggdGhlIGFkZGl0aW9uIGFuZCByZW1vdmFsIG9mIGEgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudCBhbmQgKGR1cmluZyB0aGUgcHJvY2VzcylcbiAgICAgICAqICAgIHRyaWdnZXJzIGFuIGFuaW1hdGlvbiBzdXJyb3VuZGluZyB0aGUgY2xhc3MgYWRkaXRpb24vcmVtb3ZhbC4gTXVjaCBsaWtlIGAkYW5pbWF0ZS5hZGRDbGFzc2AgYW5kXG4gICAgICAgKiAgICBgJGFuaW1hdGUucmVtb3ZlQ2xhc3NgLCBgc2V0Q2xhc3NgIHdpbGwgb25seSBldmFsdWF0ZSB0aGUgY2xhc3NlcyBiZWluZyBhZGRlZC9yZW1vdmVkIG9uY2UgYSBkaWdlc3QgaGFzXG4gICAgICAgKiAgICBwYXNzZWQuIE5vdGUgdGhhdCBjbGFzcy1iYXNlZCBhbmltYXRpb25zIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IGNvbXBhcmVkIHRvIHN0cnVjdHVyYWwgYW5pbWF0aW9uc1xuICAgICAgICogICAgKGxpa2UgZW50ZXIsIG1vdmUgYW5kIGxlYXZlKSBzaW5jZSB0aGUgQ1NTIGNsYXNzZXMgbWF5IGJlIGFkZGVkL3JlbW92ZWQgYXQgZGlmZmVyZW50IHBvaW50c1xuICAgICAgICogICAgZGVwZW5kaW5nIGlmIENTUyBvciBKYXZhU2NyaXB0IGFuaW1hdGlvbnMgYXJlIHVzZWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHRoZSBDU1MgY2xhc3NlcyB3aWxsIGJlIGFwcGxpZWQgdG9cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhZGQgdGhlIENTUyBjbGFzcyhlcykgdGhhdCB3aWxsIGJlIGFkZGVkIChtdWx0aXBsZSBjbGFzc2VzIGFyZSBzZXBhcmF0ZWQgdmlhIHNwYWNlcylcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdmUgdGhlIENTUyBjbGFzcyhlcykgdGhhdCB3aWxsIGJlIHJlbW92ZWQgKG11bHRpcGxlIGNsYXNzZXMgYXJlIHNlcGFyYXRlZCB2aWEgc3BhY2VzKVxuICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygb3B0aW9ucy9zdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiAgIFRoZSBvYmplY3QgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICpcbiAgICAgICAqICAgLSAqKmFkZENsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50XG4gICAgICAgKiAgIC0gKipmcm9tKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgdG9gXG4gICAgICAgKiAgIC0gKipyZW1vdmVDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byByZW1vdmUgZnJvbSBlbGVtZW50XG4gICAgICAgKiAgIC0gKip0byoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IGVuZCBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgZnJvbWBcbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2VcbiAgICAgICAqL1xuICAgICAgc2V0Q2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGFkZCwgcmVtb3ZlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBwcmVwYXJlQW5pbWF0ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuYWRkQ2xhc3MgPSBtZXJnZUNsYXNzZXMob3B0aW9ucy5hZGRDbGFzcywgYWRkKTtcbiAgICAgICAgb3B0aW9ucy5yZW1vdmVDbGFzcyA9IG1lcmdlQ2xhc3NlcyhvcHRpb25zLnJlbW92ZUNsYXNzLCByZW1vdmUpO1xuICAgICAgICByZXR1cm4gJCRhbmltYXRlUXVldWUucHVzaChlbGVtZW50LCAnc2V0Q2xhc3MnLCBvcHRpb25zKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjYW5pbWF0ZVxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb24gUGVyZm9ybXMgYW4gaW5saW5lIGFuaW1hdGlvbiBvbiB0aGUgZWxlbWVudCB3aGljaCBhcHBsaWVzIHRoZSBwcm92aWRlZCB0byBhbmQgZnJvbSBDU1Mgc3R5bGVzIHRvIHRoZSBlbGVtZW50LlxuICAgICAgICogSWYgYW55IGRldGVjdGVkIENTUyB0cmFuc2l0aW9uLCBrZXlmcmFtZSBvciBKYXZhU2NyaXB0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIGNsYXNzTmFtZSB2YWx1ZSwgdGhlbiB0aGUgYW5pbWF0aW9uIHdpbGwgdGFrZVxuICAgICAgICogb24gdGhlIHByb3ZpZGVkIHN0eWxlcy4gRm9yIGV4YW1wbGUsIGlmIGEgdHJhbnNpdGlvbiBhbmltYXRpb24gaXMgc2V0IGZvciB0aGUgZ2l2ZW4gY2xhc3NOYW1lLCB0aGVuIHRoZSBwcm92aWRlZCBgZnJvbWAgYW5kXG4gICAgICAgKiBgdG9gIHN0eWxlcyB3aWxsIGJlIGFwcGxpZWQgYWxvbmdzaWRlIHRoZSBnaXZlbiB0cmFuc2l0aW9uLiBJZiB0aGUgQ1NTIHN0eWxlIHByb3ZpZGVkIGluIGBmcm9tYCBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZ1xuICAgICAgICogc3R5bGUgaW4gYHRvYCwgdGhlIHN0eWxlIGluIGBmcm9tYCBpcyBhcHBsaWVkIGltbWVkaWF0ZWx5LCBhbmQgbm8gYW5pbWF0aW9uIGlzIHJ1bi5cbiAgICAgICAqIElmIGEgSmF2YVNjcmlwdCBhbmltYXRpb24gaXMgZGV0ZWN0ZWQgdGhlbiB0aGUgcHJvdmlkZWQgc3R5bGVzIHdpbGwgYmUgZ2l2ZW4gaW4gYXMgZnVuY3Rpb24gcGFyYW1ldGVycyBpbnRvIHRoZSBgYW5pbWF0ZWBcbiAgICAgICAqIG1ldGhvZCAob3IgYXMgcGFydCBvZiB0aGUgYG9wdGlvbnNgIHBhcmFtZXRlcik6XG4gICAgICAgKlxuICAgICAgICogYGBganNcbiAgICAgICAqIG5nTW9kdWxlLmFuaW1hdGlvbignLm15LWlubGluZS1hbmltYXRpb24nLCBmdW5jdGlvbigpIHtcbiAgICAgICAqICAgcmV0dXJuIHtcbiAgICAgICAqICAgICBhbmltYXRlIDogZnVuY3Rpb24oZWxlbWVudCwgZnJvbSwgdG8sIGRvbmUsIG9wdGlvbnMpIHtcbiAgICAgICAqICAgICAgIC8vYW5pbWF0aW9uXG4gICAgICAgKiAgICAgICBkb25lKCk7XG4gICAgICAgKiAgICAgfVxuICAgICAgICogICB9XG4gICAgICAgKiB9KTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB0aGUgQ1NTIHN0eWxlcyB3aWxsIGJlIGFwcGxpZWQgdG9cbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmcm9tIHRoZSBmcm9tIChzdGFydGluZykgQ1NTIHN0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCBhbmQgYWNyb3NzIHRoZSBhbmltYXRpb24uXG4gICAgICAgKiBAcGFyYW0ge29iamVjdH0gdG8gdGhlIHRvIChkZXN0aW5hdGlvbikgQ1NTIHN0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCBhbmQgYWNyb3NzIHRoZSBhbmltYXRpb24uXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGNsYXNzTmFtZSBhbiBvcHRpb25hbCBDU1MgY2xhc3MgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBJZlxuICAgICAgICogICAgdGhpcyB2YWx1ZSBpcyBsZWZ0IGFzIGVtcHR5IHRoZW4gYSBDU1MgY2xhc3Mgb2YgYG5nLWlubGluZS1hbmltYXRlYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiAgICAoTm90ZSB0aGF0IGlmIG5vIGFuaW1hdGlvbiBpcyBkZXRlY3RlZCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC4pXG4gICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zL3N0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC5cbiAgICAgICAqICAgVGhlIG9iamVjdCBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgKlxuICAgICAgICogICAtICoqYWRkQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnRcbiAgICAgICAqICAgLSAqKmZyb20qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuaW1hdGlvbi4gTXVzdCBoYXZlIG1hdGNoaW5nIGB0b2BcbiAgICAgICAqICAgLSAqKnJlbW92ZUNsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIHJlbW92ZSBmcm9tIGVsZW1lbnRcbiAgICAgICAqICAgLSAqKnRvKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgZW5kIG9mIGFuaW1hdGlvbi4gTXVzdCBoYXZlIG1hdGNoaW5nIGBmcm9tYFxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZVxuICAgICAgICovXG4gICAgICBhbmltYXRlOiBmdW5jdGlvbihlbGVtZW50LCBmcm9tLCB0bywgY2xhc3NOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBwcmVwYXJlQW5pbWF0ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMuZnJvbSA9IG9wdGlvbnMuZnJvbSA/IGV4dGVuZChvcHRpb25zLmZyb20sIGZyb20pIDogZnJvbTtcbiAgICAgICAgb3B0aW9ucy50byAgID0gb3B0aW9ucy50byAgID8gZXh0ZW5kKG9wdGlvbnMudG8sIHRvKSAgICAgOiB0bztcblxuICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUgfHwgJ25nLWlubGluZS1hbmltYXRlJztcbiAgICAgICAgb3B0aW9ucy50ZW1wQ2xhc3NlcyA9IG1lcmdlQ2xhc3NlcyhvcHRpb25zLnRlbXBDbGFzc2VzLCBjbGFzc05hbWUpO1xuICAgICAgICByZXR1cm4gJCRhbmltYXRlUXVldWUucHVzaChlbGVtZW50LCAnYW5pbWF0ZScsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH07XG4gIH1dO1xufV07XG5cbnZhciAkJEFuaW1hdGVBc3luY1J1bkZhY3RvcnlQcm92aWRlciA9IC8qKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckJHJBRicsIGZ1bmN0aW9uKCQkckFGKSB7XG4gICAgdmFyIHdhaXRRdWV1ZSA9IFtdO1xuXG4gICAgZnVuY3Rpb24gd2FpdEZvclRpY2soZm4pIHtcbiAgICAgIHdhaXRRdWV1ZS5wdXNoKGZuKTtcbiAgICAgIGlmICh3YWl0UXVldWUubGVuZ3RoID4gMSkgcmV0dXJuO1xuICAgICAgJCRyQUYoZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2FpdFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgd2FpdFF1ZXVlW2ldKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2FpdFF1ZXVlID0gW107XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcGFzc2VkID0gZmFsc2U7XG4gICAgICB3YWl0Rm9yVGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhaXRGb3JUaWNrKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9XTtcbn07XG5cbnZhciAkJEFuaW1hdGVSdW5uZXJGYWN0b3J5UHJvdmlkZXIgPSAvKiogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG4gIHRoaXMuJGdldCA9IFsnJHEnLCAnJHNuaWZmZXInLCAnJCRhbmltYXRlQXN5bmNSdW4nLCAnJCRpc0RvY3VtZW50SGlkZGVuJywgJyR0aW1lb3V0JyxcbiAgICAgICBmdW5jdGlvbigkcSwgICAkc25pZmZlciwgICAkJGFuaW1hdGVBc3luY1J1biwgICAkJGlzRG9jdW1lbnRIaWRkZW4sICAgJHRpbWVvdXQpIHtcblxuICAgIHZhciBJTklUSUFMX1NUQVRFID0gMDtcbiAgICB2YXIgRE9ORV9QRU5ESU5HX1NUQVRFID0gMTtcbiAgICB2YXIgRE9ORV9DT01QTEVURV9TVEFURSA9IDI7XG5cbiAgICBBbmltYXRlUnVubmVyLmNoYWluID0gZnVuY3Rpb24oY2hhaW4sIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuXG4gICAgICBuZXh0KCk7XG4gICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICBpZiAoaW5kZXggPT09IGNoYWluLmxlbmd0aCkge1xuICAgICAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYWluW2luZGV4XShmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBBbmltYXRlUnVubmVyLmFsbCA9IGZ1bmN0aW9uKHJ1bm5lcnMsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgdmFyIHN0YXR1cyA9IHRydWU7XG4gICAgICBmb3JFYWNoKHJ1bm5lcnMsIGZ1bmN0aW9uKHJ1bm5lcikge1xuICAgICAgICBydW5uZXIuZG9uZShvblByb2dyZXNzKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBvblByb2dyZXNzKHJlc3BvbnNlKSB7XG4gICAgICAgIHN0YXR1cyA9IHN0YXR1cyAmJiByZXNwb25zZTtcbiAgICAgICAgaWYgKCsrY291bnQgPT09IHJ1bm5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY2FsbGJhY2soc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBBbmltYXRlUnVubmVyKGhvc3QpIHtcbiAgICAgIHRoaXMuc2V0SG9zdChob3N0KTtcblxuICAgICAgdmFyIHJhZlRpY2sgPSAkJGFuaW1hdGVBc3luY1J1bigpO1xuICAgICAgdmFyIHRpbWVvdXRUaWNrID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgJHRpbWVvdXQoZm4sIDAsIGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2RvbmVDYWxsYmFja3MgPSBbXTtcbiAgICAgIHRoaXMuX3RpY2sgPSBmdW5jdGlvbihmbikge1xuICAgICAgICBpZiAoJCRpc0RvY3VtZW50SGlkZGVuKCkpIHtcbiAgICAgICAgICB0aW1lb3V0VGljayhmbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmFmVGljayhmbik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLl9zdGF0ZSA9IDA7XG4gICAgfVxuXG4gICAgQW5pbWF0ZVJ1bm5lci5wcm90b3R5cGUgPSB7XG4gICAgICBzZXRIb3N0OiBmdW5jdGlvbihob3N0KSB7XG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3QgfHwge307XG4gICAgICB9LFxuXG4gICAgICBkb25lOiBmdW5jdGlvbihmbikge1xuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09IERPTkVfQ09NUExFVEVfU1RBVEUpIHtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2RvbmVDYWxsYmFja3MucHVzaChmbik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIHByb2dyZXNzOiBub29wLFxuXG4gICAgICBnZXRQcm9taXNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb21pc2UpIHtcbiAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgdGhpcy5wcm9taXNlID0gJHEoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBzZWxmLmRvbmUoZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICAgICAgfSxcblxuICAgICAgdGhlbjogZnVuY3Rpb24ocmVzb2x2ZUhhbmRsZXIsIHJlamVjdEhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpLnRoZW4ocmVzb2x2ZUhhbmRsZXIsIHJlamVjdEhhbmRsZXIpO1xuICAgICAgfSxcblxuICAgICAgJ2NhdGNoJzogZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9taXNlKClbJ2NhdGNoJ10oaGFuZGxlcik7XG4gICAgICB9LFxuXG4gICAgICAnZmluYWxseSc6IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpWydmaW5hbGx5J10oaGFuZGxlcik7XG4gICAgICB9LFxuXG4gICAgICBwYXVzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmhvc3QucGF1c2UpIHtcbiAgICAgICAgICB0aGlzLmhvc3QucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgcmVzdW1lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuaG9zdC5yZXN1bWUpIHtcbiAgICAgICAgICB0aGlzLmhvc3QucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmhvc3QuZW5kKSB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc29sdmUodHJ1ZSk7XG4gICAgICB9LFxuXG4gICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5ob3N0LmNhbmNlbCkge1xuICAgICAgICAgIHRoaXMuaG9zdC5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSA9PT0gSU5JVElBTF9TVEFURSkge1xuICAgICAgICAgIHNlbGYuX3N0YXRlID0gRE9ORV9QRU5ESU5HX1NUQVRFO1xuICAgICAgICAgIHNlbGYuX3RpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLl9yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgX3Jlc29sdmU6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gRE9ORV9DT01QTEVURV9TVEFURSkge1xuICAgICAgICAgIGZvckVhY2godGhpcy5fZG9uZUNhbGxiYWNrcywgZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIGZuKHJlc3BvbnNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9kb25lQ2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBET05FX0NPTVBMRVRFX1NUQVRFO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBBbmltYXRlUnVubmVyO1xuICB9XTtcbn07XG5cbi8qIGV4cG9ydGVkICRDb3JlQW5pbWF0ZUNzc1Byb3ZpZGVyICovXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRhbmltYXRlQ3NzXG4gKiBAa2luZCBvYmplY3RcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIGlzIHRoZSBjb3JlIHZlcnNpb24gb2YgYCRhbmltYXRlQ3NzYC4gQnkgZGVmYXVsdCwgb25seSB3aGVuIHRoZSBgbmdBbmltYXRlYCBpcyBpbmNsdWRlZCxcbiAqIHRoZW4gdGhlIGAkYW5pbWF0ZUNzc2Agc2VydmljZSB3aWxsIGFjdHVhbGx5IHBlcmZvcm0gYW5pbWF0aW9ucy5cbiAqXG4gKiBDbGljayBoZXJlIHtAbGluayBuZ0FuaW1hdGUuJGFuaW1hdGVDc3MgdG8gcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgJGFuaW1hdGVDc3N9LlxuICovXG52YXIgJENvcmVBbmltYXRlQ3NzUHJvdmlkZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckJHJBRicsICckcScsICckJEFuaW1hdGVSdW5uZXInLCBmdW5jdGlvbigkJHJBRiwgJHEsICQkQW5pbWF0ZVJ1bm5lcikge1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQsIGluaXRpYWxPcHRpb25zKSB7XG4gICAgICAvLyBhbGwgb2YgdGhlIGFuaW1hdGlvbiBmdW5jdGlvbnMgc2hvdWxkIGNyZWF0ZVxuICAgICAgLy8gYSBjb3B5IG9mIHRoZSBvcHRpb25zIGRhdGEsIGhvd2V2ZXIsIGlmIGFcbiAgICAgIC8vIHBhcmVudCBzZXJ2aWNlIGhhcyBhbHJlYWR5IGNyZWF0ZWQgYSBjb3B5IHRoZW5cbiAgICAgIC8vIHdlIHNob3VsZCBzdGljayB0byB1c2luZyB0aGF0XG4gICAgICB2YXIgb3B0aW9ucyA9IGluaXRpYWxPcHRpb25zIHx8IHt9O1xuICAgICAgaWYgKCFvcHRpb25zLiQkcHJlcGFyZWQpIHtcbiAgICAgICAgb3B0aW9ucyA9IGNvcHkob3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHRoZXJlIGlzIG5vIHBvaW50IGluIGFwcGx5aW5nIHRoZSBzdHlsZXMgc2luY2VcbiAgICAgIC8vIHRoZXJlIGlzIG5vIGFuaW1hdGlvbiB0aGF0IGdvZXMgb24gYXQgYWxsIGluXG4gICAgICAvLyB0aGlzIHZlcnNpb24gb2YgJGFuaW1hdGVDc3MuXG4gICAgICBpZiAob3B0aW9ucy5jbGVhbnVwU3R5bGVzKSB7XG4gICAgICAgIG9wdGlvbnMuZnJvbSA9IG9wdGlvbnMudG8gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5mcm9tKSB7XG4gICAgICAgIGVsZW1lbnQuY3NzKG9wdGlvbnMuZnJvbSk7XG4gICAgICAgIG9wdGlvbnMuZnJvbSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBjbG9zZWQsIHJ1bm5lciA9IG5ldyAkJEFuaW1hdGVSdW5uZXIoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBydW4sXG4gICAgICAgIGVuZDogcnVuXG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBydW4oKSB7XG4gICAgICAgICQkckFGKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGFwcGx5QW5pbWF0aW9uQ29udGVudHMoKTtcbiAgICAgICAgICBpZiAoIWNsb3NlZCkge1xuICAgICAgICAgICAgcnVubmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnVubmVyO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhcHBseUFuaW1hdGlvbkNvbnRlbnRzKCkge1xuICAgICAgICBpZiAob3B0aW9ucy5hZGRDbGFzcykge1xuICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3Mob3B0aW9ucy5hZGRDbGFzcyk7XG4gICAgICAgICAgb3B0aW9ucy5hZGRDbGFzcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucmVtb3ZlQ2xhc3MpIHtcbiAgICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzKG9wdGlvbnMucmVtb3ZlQ2xhc3MpO1xuICAgICAgICAgIG9wdGlvbnMucmVtb3ZlQ2xhc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRvKSB7XG4gICAgICAgICAgZWxlbWVudC5jc3Mob3B0aW9ucy50byk7XG4gICAgICAgICAgb3B0aW9ucy50byA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XTtcbn07XG5cbi8qIGdsb2JhbCBzdHJpcEhhc2g6IHRydWUgKi9cblxuLyoqXG4gKiAhIFRoaXMgaXMgYSBwcml2YXRlIHVuZG9jdW1lbnRlZCBzZXJ2aWNlICFcbiAqXG4gKiBAbmFtZSAkYnJvd3NlclxuICogQHJlcXVpcmVzICRsb2dcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBvYmplY3QgaGFzIHR3byBnb2FsczpcbiAqXG4gKiAtIGhpZGUgYWxsIHRoZSBnbG9iYWwgc3RhdGUgaW4gdGhlIGJyb3dzZXIgY2F1c2VkIGJ5IHRoZSB3aW5kb3cgb2JqZWN0XG4gKiAtIGFic3RyYWN0IGF3YXkgYWxsIHRoZSBicm93c2VyIHNwZWNpZmljIGZlYXR1cmVzIGFuZCBpbmNvbnNpc3RlbmNpZXNcbiAqXG4gKiBGb3IgdGVzdHMgd2UgcHJvdmlkZSB7QGxpbmsgbmdNb2NrLiRicm93c2VyIG1vY2sgaW1wbGVtZW50YXRpb259IG9mIHRoZSBgJGJyb3dzZXJgXG4gKiBzZXJ2aWNlLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgY29udmVuaWVudCB0ZXN0aW5nIG9mIHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB3aXRoXG4gKiB0aGUgcmVhbCBicm93c2VyIGFwaXMuXG4gKi9cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHdpbmRvdyBUaGUgZ2xvYmFsIHdpbmRvdyBvYmplY3QuXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnQgalF1ZXJ5IHdyYXBwZWQgZG9jdW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gJGxvZyB3aW5kb3cuY29uc29sZSBvciBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBpbnRlcmZhY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gJHNuaWZmZXIgJHNuaWZmZXIgc2VydmljZVxuICovXG5mdW5jdGlvbiBCcm93c2VyKHdpbmRvdywgZG9jdW1lbnQsICRsb2csICRzbmlmZmVyKSB7XG4gIHZhciBzZWxmID0gdGhpcyxcbiAgICAgIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLFxuICAgICAgaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5LFxuICAgICAgc2V0VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0LFxuICAgICAgY2xlYXJUaW1lb3V0ID0gd2luZG93LmNsZWFyVGltZW91dCxcbiAgICAgIHBlbmRpbmdEZWZlcklkcyA9IHt9O1xuXG4gIHNlbGYuaXNNb2NrID0gZmFsc2U7XG5cbiAgdmFyIG91dHN0YW5kaW5nUmVxdWVzdENvdW50ID0gMDtcbiAgdmFyIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcyA9IFtdO1xuXG4gIC8vIFRPRE8odm9qdGEpOiByZW1vdmUgdGhpcyB0ZW1wb3JhcnkgYXBpXG4gIHNlbGYuJCRjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdCA9IGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0O1xuICBzZWxmLiQkaW5jT3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSBmdW5jdGlvbigpIHsgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQrKzsgfTtcblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24oc3VwcG9ydHMgY3VycnlpbmcpIGFuZCBkZWNyZW1lbnRzIHRoZSBgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzYFxuICAgKiBjb3VudGVyLiBJZiB0aGUgY291bnRlciByZWFjaGVzIDAsIGFsbCB0aGUgYG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrc2AgYXJlIGV4ZWN1dGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoZm4pIHtcbiAgICB0cnkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgc2xpY2VBcmdzKGFyZ3VtZW50cywgMSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudC0tO1xuICAgICAgaWYgKG91dHN0YW5kaW5nUmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIHdoaWxlIChvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5wb3AoKSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICRsb2cuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SGFzaCh1cmwpIHtcbiAgICB2YXIgaW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyAnJyA6IHVybC5zdWJzdHIoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIHVzZWQgb25seSBieSBzY2VuYXJpbyBydW5uZXJcbiAgICogVE9ETyh2b2p0YSk6IHByZWZpeCB0aGlzIG1ldGhvZCB3aXRoICQkID9cbiAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBjYWxsYmFjayBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gbm8gb3V0c3RhbmRpbmcgcmVxdWVzdFxuICAgKi9cbiAgc2VsZi5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZiAob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gVVJMIEFQSVxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIHZhciBjYWNoZWRTdGF0ZSwgbGFzdEhpc3RvcnlTdGF0ZSxcbiAgICAgIGxhc3RCcm93c2VyVXJsID0gbG9jYXRpb24uaHJlZixcbiAgICAgIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQuZmluZCgnYmFzZScpLFxuICAgICAgcGVuZGluZ0xvY2F0aW9uID0gbnVsbCxcbiAgICAgIGdldEN1cnJlbnRTdGF0ZSA9ICEkc25pZmZlci5oaXN0b3J5ID8gbm9vcCA6IGZ1bmN0aW9uIGdldEN1cnJlbnRTdGF0ZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gaGlzdG9yeS5zdGF0ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIE1TSUUgY2FuIHJlcG9ydGVkbHkgdGhyb3cgd2hlbiB0aGVyZSBpcyBubyBzdGF0ZSAoVU5DT05GSVJNRUQpLlxuICAgICAgICB9XG4gICAgICB9O1xuXG4gIGNhY2hlU3RhdGUoKTtcbiAgbGFzdEhpc3RvcnlTdGF0ZSA9IGNhY2hlZFN0YXRlO1xuXG4gIC8qKlxuICAgKiBAbmFtZSAkYnJvd3NlciN1cmxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdFVFRFUjpcbiAgICogV2l0aG91dCBhbnkgYXJndW1lbnQsIHRoaXMgbWV0aG9kIGp1c3QgcmV0dXJucyBjdXJyZW50IHZhbHVlIG9mIGxvY2F0aW9uLmhyZWYuXG4gICAqXG4gICAqIFNFVFRFUjpcbiAgICogV2l0aCBhdCBsZWFzdCBvbmUgYXJndW1lbnQsIHRoaXMgbWV0aG9kIHNldHMgdXJsIHRvIG5ldyB2YWx1ZS5cbiAgICogSWYgaHRtbDUgaGlzdG9yeSBhcGkgc3VwcG9ydGVkLCBwdXNoU3RhdGUvcmVwbGFjZVN0YXRlIGlzIHVzZWQsIG90aGVyd2lzZVxuICAgKiBsb2NhdGlvbi5ocmVmL2xvY2F0aW9uLnJlcGxhY2UgaXMgdXNlZC5cbiAgICogUmV0dXJucyBpdHMgb3duIGluc3RhbmNlIHRvIGFsbG93IGNoYWluaW5nXG4gICAqXG4gICAqIE5PVEU6IHRoaXMgYXBpIGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBieSB0aGUgJGxvY2F0aW9uIHNlcnZpY2UuIFBsZWFzZSB1c2UgdGhlXG4gICAqIHtAbGluayBuZy4kbG9jYXRpb24gJGxvY2F0aW9uIHNlcnZpY2V9IHRvIGNoYW5nZSB1cmwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgTmV3IHVybCAod2hlbiB1c2VkIGFzIHNldHRlcilcbiAgICogQHBhcmFtIHtib29sZWFuPX0gcmVwbGFjZSBTaG91bGQgbmV3IHVybCByZXBsYWNlIGN1cnJlbnQgaGlzdG9yeSByZWNvcmQ/XG4gICAqIEBwYXJhbSB7b2JqZWN0PX0gc3RhdGUgb2JqZWN0IHRvIHVzZSB3aXRoIHB1c2hTdGF0ZS9yZXBsYWNlU3RhdGVcbiAgICovXG4gIHNlbGYudXJsID0gZnVuY3Rpb24odXJsLCByZXBsYWNlLCBzdGF0ZSkge1xuICAgIC8vIEluIG1vZGVybiBicm93c2VycyBgaGlzdG9yeS5zdGF0ZWAgaXMgYG51bGxgIGJ5IGRlZmF1bHQ7IHRyZWF0aW5nIGl0IHNlcGFyYXRlbHlcbiAgICAvLyBmcm9tIGB1bmRlZmluZWRgIHdvdWxkIGNhdXNlIGAkYnJvd3Nlci51cmwoJy9mb28nKWAgdG8gY2hhbmdlIGBoaXN0b3J5LnN0YXRlYFxuICAgIC8vIHRvIHVuZGVmaW5lZCB2aWEgYHB1c2hTdGF0ZWAuIEluc3RlYWQsIGxldCdzIGNoYW5nZSBgdW5kZWZpbmVkYCB0byBgbnVsbGAgaGVyZS5cbiAgICBpZiAoaXNVbmRlZmluZWQoc3RhdGUpKSB7XG4gICAgICBzdGF0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQW5kcm9pZCBCcm93c2VyIEJGQ2FjaGUgY2F1c2VzIGxvY2F0aW9uLCBoaXN0b3J5IHJlZmVyZW5jZSB0byBiZWNvbWUgc3RhbGUuXG4gICAgaWYgKGxvY2F0aW9uICE9PSB3aW5kb3cubG9jYXRpb24pIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuICAgIGlmIChoaXN0b3J5ICE9PSB3aW5kb3cuaGlzdG9yeSkgaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5O1xuXG4gICAgLy8gc2V0dGVyXG4gICAgaWYgKHVybCkge1xuICAgICAgdmFyIHNhbWVTdGF0ZSA9IGxhc3RIaXN0b3J5U3RhdGUgPT09IHN0YXRlO1xuXG4gICAgICAvLyBEb24ndCBjaGFuZ2UgYW55dGhpbmcgaWYgcHJldmlvdXMgYW5kIGN1cnJlbnQgVVJMcyBhbmQgc3RhdGVzIG1hdGNoLiBUaGlzIGFsc28gcHJldmVudHNcbiAgICAgIC8vIElFPDEwIGZyb20gZ2V0dGluZyBpbnRvIHJlZGlyZWN0IGxvb3Agd2hlbiBpbiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybCBtb2RlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvY29tbWl0L2ZmYjI3MDFcbiAgICAgIGlmIChsYXN0QnJvd3NlclVybCA9PT0gdXJsICYmICghJHNuaWZmZXIuaGlzdG9yeSB8fCBzYW1lU3RhdGUpKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuICAgICAgdmFyIHNhbWVCYXNlID0gbGFzdEJyb3dzZXJVcmwgJiYgc3RyaXBIYXNoKGxhc3RCcm93c2VyVXJsKSA9PT0gc3RyaXBIYXNoKHVybCk7XG4gICAgICBsYXN0QnJvd3NlclVybCA9IHVybDtcbiAgICAgIGxhc3RIaXN0b3J5U3RhdGUgPSBzdGF0ZTtcbiAgICAgIC8vIERvbid0IHVzZSBoaXN0b3J5IEFQSSBpZiBvbmx5IHRoZSBoYXNoIGNoYW5nZWRcbiAgICAgIC8vIGR1ZSB0byBhIGJ1ZyBpbiBJRTEwL0lFMTEgd2hpY2ggbGVhZHNcbiAgICAgIC8vIHRvIG5vdCBmaXJpbmcgYSBgaGFzaGNoYW5nZWAgbm9yIGBwb3BzdGF0ZWAgZXZlbnRcbiAgICAgIC8vIGluIHNvbWUgY2FzZXMgKHNlZSAjOTE0MykuXG4gICAgICBpZiAoJHNuaWZmZXIuaGlzdG9yeSAmJiAoIXNhbWVCYXNlIHx8ICFzYW1lU3RhdGUpKSB7XG4gICAgICAgIGhpc3RvcnlbcmVwbGFjZSA/ICdyZXBsYWNlU3RhdGUnIDogJ3B1c2hTdGF0ZSddKHN0YXRlLCAnJywgdXJsKTtcbiAgICAgICAgY2FjaGVTdGF0ZSgpO1xuICAgICAgICAvLyBEbyB0aGUgYXNzaWdubWVudCBhZ2FpbiBzbyB0aGF0IHRob3NlIHR3byB2YXJpYWJsZXMgYXJlIHJlZmVyZW50aWFsbHkgaWRlbnRpY2FsLlxuICAgICAgICBsYXN0SGlzdG9yeVN0YXRlID0gY2FjaGVkU3RhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNhbWVCYXNlKSB7XG4gICAgICAgICAgcGVuZGluZ0xvY2F0aW9uID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgbG9jYXRpb24ucmVwbGFjZSh1cmwpO1xuICAgICAgICB9IGVsc2UgaWYgKCFzYW1lQmFzZSkge1xuICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYXRpb24uaGFzaCA9IGdldEhhc2godXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYXRpb24uaHJlZiAhPT0gdXJsKSB7XG4gICAgICAgICAgcGVuZGluZ0xvY2F0aW9uID0gdXJsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGVuZGluZ0xvY2F0aW9uKSB7XG4gICAgICAgIHBlbmRpbmdMb2NhdGlvbiA9IHVybDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIC8vIGdldHRlclxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtIHBlbmRpbmdMb2NhdGlvbiBpcyBuZWVkZWQgYXMgYnJvd3NlcnMgZG9uJ3QgYWxsb3cgdG8gcmVhZCBvdXRcbiAgICAgIC8vICAgdGhlIG5ldyBsb2NhdGlvbi5ocmVmIGlmIGEgcmVsb2FkIGhhcHBlbmVkIG9yIGlmIHRoZXJlIGlzIGEgYnVnIGxpa2UgaW4gaU9TIDkgKHNlZVxuICAgICAgLy8gICBodHRwczovL29wZW5yYWRhci5hcHBzcG90LmNvbS8yMjE4NjEwOSkuXG4gICAgICAvLyAtIHRoZSByZXBsYWNlbWVudCBpcyBhIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQwNzE3MlxuICAgICAgcmV0dXJuIHBlbmRpbmdMb2NhdGlvbiB8fCBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoLyUyNy9nLCdcXCcnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuYW1lICRicm93c2VyI3N0YXRlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBhIGdldHRlci5cbiAgICpcbiAgICogUmV0dXJuIGhpc3Rvcnkuc3RhdGUgb3IgbnVsbCBpZiBoaXN0b3J5LnN0YXRlIGlzIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gc3RhdGVcbiAgICovXG4gIHNlbGYuc3RhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY2FjaGVkU3RhdGU7XG4gIH07XG5cbiAgdmFyIHVybENoYW5nZUxpc3RlbmVycyA9IFtdLFxuICAgICAgdXJsQ2hhbmdlSW5pdCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKCkge1xuICAgIHBlbmRpbmdMb2NhdGlvbiA9IG51bGw7XG4gICAgY2FjaGVTdGF0ZSgpO1xuICAgIGZpcmVVcmxDaGFuZ2UoKTtcbiAgfVxuXG4gIC8vIFRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIHVzZWQgKm9ubHkqIGluc2lkZSB0aGUgY2FjaGVTdGF0ZSBmdW5jdGlvbi5cbiAgdmFyIGxhc3RDYWNoZWRTdGF0ZSA9IG51bGw7XG4gIGZ1bmN0aW9uIGNhY2hlU3RhdGUoKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2UgaW4gJGJyb3dzZXIgd2hlcmUgYGhpc3Rvcnkuc3RhdGVgIGlzIHJlYWQuXG4gICAgY2FjaGVkU3RhdGUgPSBnZXRDdXJyZW50U3RhdGUoKTtcbiAgICBjYWNoZWRTdGF0ZSA9IGlzVW5kZWZpbmVkKGNhY2hlZFN0YXRlKSA/IG51bGwgOiBjYWNoZWRTdGF0ZTtcblxuICAgIC8vIFByZXZlbnQgY2FsbGJhY2tzIGZvIGZpcmUgdHdpY2UgaWYgYm90aCBoYXNoY2hhbmdlICYgcG9wc3RhdGUgd2VyZSBmaXJlZC5cbiAgICBpZiAoZXF1YWxzKGNhY2hlZFN0YXRlLCBsYXN0Q2FjaGVkU3RhdGUpKSB7XG4gICAgICBjYWNoZWRTdGF0ZSA9IGxhc3RDYWNoZWRTdGF0ZTtcbiAgICB9XG4gICAgbGFzdENhY2hlZFN0YXRlID0gY2FjaGVkU3RhdGU7XG4gIH1cblxuICBmdW5jdGlvbiBmaXJlVXJsQ2hhbmdlKCkge1xuICAgIGlmIChsYXN0QnJvd3NlclVybCA9PT0gc2VsZi51cmwoKSAmJiBsYXN0SGlzdG9yeVN0YXRlID09PSBjYWNoZWRTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxhc3RCcm93c2VyVXJsID0gc2VsZi51cmwoKTtcbiAgICBsYXN0SGlzdG9yeVN0YXRlID0gY2FjaGVkU3RhdGU7XG4gICAgZm9yRWFjaCh1cmxDaGFuZ2VMaXN0ZW5lcnMsIGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcihzZWxmLnVybCgpLCBjYWNoZWRTdGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgJGJyb3dzZXIjb25VcmxDaGFuZ2VcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQsIHdoZW4gdXJsIGNoYW5nZXMuXG4gICAqXG4gICAqIEl0J3Mgb25seSBjYWxsZWQgd2hlbiB0aGUgdXJsIGlzIGNoYW5nZWQgZnJvbSBvdXRzaWRlIG9mIGFuZ3VsYXI6XG4gICAqIC0gdXNlciB0eXBlcyBkaWZmZXJlbnQgdXJsIGludG8gYWRkcmVzcyBiYXJcbiAgICogLSB1c2VyIGNsaWNrcyBvbiBoaXN0b3J5IChmb3J3YXJkL2JhY2spIGJ1dHRvblxuICAgKiAtIHVzZXIgY2xpY2tzIG9uIGEgbGlua1xuICAgKlxuICAgKiBJdCdzIG5vdCBjYWxsZWQgd2hlbiB1cmwgaXMgY2hhbmdlZCBieSAkYnJvd3Nlci51cmwoKSBtZXRob2RcbiAgICpcbiAgICogVGhlIGxpc3RlbmVyIGdldHMgY2FsbGVkIHdpdGggbmV3IHVybCBhcyBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIE5PVEU6IHRoaXMgYXBpIGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBieSB0aGUgJGxvY2F0aW9uIHNlcnZpY2UuIFBsZWFzZSB1c2UgdGhlXG4gICAqIHtAbGluayBuZy4kbG9jYXRpb24gJGxvY2F0aW9uIHNlcnZpY2V9IHRvIG1vbml0b3IgdXJsIGNoYW5nZXMgaW4gYW5ndWxhciBhcHBzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGxpc3RlbmVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHVybCBjaGFuZ2VzLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihzdHJpbmcpfSBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyIGZuIC0gaGFuZHkgaWYgdGhlIGZuIGlzIGFub255bW91cy5cbiAgICovXG4gIHNlbGYub25VcmxDaGFuZ2UgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIC8vIFRPRE8odm9qdGEpOiByZWZhY3RvciB0byB1c2Ugbm9kZSdzIHN5bnRheCBmb3IgZXZlbnRzXG4gICAgaWYgKCF1cmxDaGFuZ2VJbml0KSB7XG4gICAgICAvLyBXZSBsaXN0ZW4gb24gYm90aCAoaGFzaGNoYW5nZS9wb3BzdGF0ZSkgd2hlbiBhdmFpbGFibGUsIGFzIHNvbWUgYnJvd3NlcnMgKGUuZy4gT3BlcmEpXG4gICAgICAvLyBkb24ndCBmaXJlIHBvcHN0YXRlIHdoZW4gdXNlciBjaGFuZ2UgdGhlIGFkZHJlc3MgYmFyIGFuZCBkb24ndCBmaXJlIGhhc2hjaGFuZ2Ugd2hlbiB1cmxcbiAgICAgIC8vIGNoYW5nZWQgYnkgcHVzaC9yZXBsYWNlU3RhdGVcblxuICAgICAgLy8gaHRtbDUgaGlzdG9yeSBhcGkgLSBwb3BzdGF0ZSBldmVudFxuICAgICAgaWYgKCRzbmlmZmVyLmhpc3RvcnkpIGpxTGl0ZSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKTtcbiAgICAgIC8vIGhhc2hjaGFuZ2UgZXZlbnRcbiAgICAgIGpxTGl0ZSh3aW5kb3cpLm9uKCdoYXNoY2hhbmdlJywgY2FjaGVTdGF0ZUFuZEZpcmVVcmxDaGFuZ2UpO1xuXG4gICAgICB1cmxDaGFuZ2VJbml0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cmxDaGFuZ2VMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBSZW1vdmUgcG9wc3RhdGUgYW5kIGhhc2hjaGFuZ2UgaGFuZGxlciBmcm9tIHdpbmRvdy5cbiAgICpcbiAgICogTk9URTogdGhpcyBhcGkgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5ICRyb290U2NvcGUuXG4gICAqL1xuICBzZWxmLiQkYXBwbGljYXRpb25EZXN0cm95ZWQgPSBmdW5jdGlvbigpIHtcbiAgICBqcUxpdGUod2luZG93KS5vZmYoJ2hhc2hjaGFuZ2UgcG9wc3RhdGUnLCBjYWNoZVN0YXRlQW5kRmlyZVVybENoYW5nZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSB1cmwgaGFzIGNoYW5nZWQgb3V0c2lkZSBvZiBBbmd1bGFyLlxuICAgKiBOZWVkcyB0byBiZSBleHBvcnRlZCB0byBiZSBhYmxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGRvbmUgaW4gc3luYyxcbiAgICogYXMgaGFzaGNoYW5nZS9wb3BzdGF0ZSBldmVudHMgZmlyZSBpbiBhc3luYy5cbiAgICovXG4gIHNlbGYuJCRjaGVja1VybENoYW5nZSA9IGZpcmVVcmxDaGFuZ2U7XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gTWlzYyBBUElcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAvKipcbiAgICogQG5hbWUgJGJyb3dzZXIjYmFzZUhyZWZcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgY3VycmVudCA8YmFzZSBocmVmPlxuICAgKiAoYWx3YXlzIHJlbGF0aXZlIC0gd2l0aG91dCBkb21haW4pXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50IGJhc2UgaHJlZlxuICAgKi9cbiAgc2VsZi5iYXNlSHJlZiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBocmVmID0gYmFzZUVsZW1lbnQuYXR0cignaHJlZicpO1xuICAgIHJldHVybiBocmVmID8gaHJlZi5yZXBsYWNlKC9eKGh0dHBzPzopP1xcL1xcL1teL10qLywgJycpIDogJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuYW1lICRicm93c2VyI2RlZmVyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZm4gQSBmdW5jdGlvbiwgd2hvJ3MgZXhlY3V0aW9uIHNob3VsZCBiZSBkZWZlcnJlZC5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBbZGVsYXk9MF0gb2YgbWlsbGlzZWNvbmRzIHRvIGRlZmVyIHRoZSBmdW5jdGlvbiBleGVjdXRpb24uXG4gICAqIEByZXR1cm5zIHsqfSBEZWZlcklkIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FuY2VsIHRoZSB0YXNrIHZpYSBgJGJyb3dzZXIuZGVmZXIuY2FuY2VsKClgLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXhlY3V0ZXMgYSBmbiBhc3luY2hyb25vdXNseSB2aWEgYHNldFRpbWVvdXQoZm4sIGRlbGF5KWAuXG4gICAqXG4gICAqIFVubGlrZSB3aGVuIGNhbGxpbmcgYHNldFRpbWVvdXRgIGRpcmVjdGx5LCBpbiB0ZXN0IHRoaXMgZnVuY3Rpb24gaXMgbW9ja2VkIGFuZCBpbnN0ZWFkIG9mIHVzaW5nXG4gICAqIGBzZXRUaW1lb3V0YCBpbiB0ZXN0cywgdGhlIGZucyBhcmUgcXVldWVkIGluIGFuIGFycmF5LCB3aGljaCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBmbHVzaGVkXG4gICAqIHZpYSBgJGJyb3dzZXIuZGVmZXIuZmx1c2goKWAuXG4gICAqXG4gICAqL1xuICBzZWxmLmRlZmVyID0gZnVuY3Rpb24oZm4sIGRlbGF5KSB7XG4gICAgdmFyIHRpbWVvdXRJZDtcbiAgICBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCsrO1xuICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBkZWxldGUgcGVuZGluZ0RlZmVySWRzW3RpbWVvdXRJZF07XG4gICAgICBjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdChmbik7XG4gICAgfSwgZGVsYXkgfHwgMCk7XG4gICAgcGVuZGluZ0RlZmVySWRzW3RpbWVvdXRJZF0gPSB0cnVlO1xuICAgIHJldHVybiB0aW1lb3V0SWQ7XG4gIH07XG5cblxuICAvKipcbiAgICogQG5hbWUgJGJyb3dzZXIjZGVmZXIuY2FuY2VsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDYW5jZWxzIGEgZGVmZXJyZWQgdGFzayBpZGVudGlmaWVkIHdpdGggYGRlZmVySWRgLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGRlZmVySWQgVG9rZW4gcmV0dXJuZWQgYnkgdGhlIGAkYnJvd3Nlci5kZWZlcmAgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdGFzayBoYXNuJ3QgZXhlY3V0ZWQgeWV0IGFuZCB3YXMgc3VjY2Vzc2Z1bGx5XG4gICAqICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZC5cbiAgICovXG4gIHNlbGYuZGVmZXIuY2FuY2VsID0gZnVuY3Rpb24oZGVmZXJJZCkge1xuICAgIGlmIChwZW5kaW5nRGVmZXJJZHNbZGVmZXJJZF0pIHtcbiAgICAgIGRlbGV0ZSBwZW5kaW5nRGVmZXJJZHNbZGVmZXJJZF07XG4gICAgICBjbGVhclRpbWVvdXQoZGVmZXJJZCk7XG4gICAgICBjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdChub29wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbn1cblxuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkQnJvd3NlclByb3ZpZGVyKCkge1xuICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCAnJGxvZycsICckc25pZmZlcicsICckZG9jdW1lbnQnLFxuICAgICAgZnVuY3Rpb24oJHdpbmRvdywgJGxvZywgJHNuaWZmZXIsICRkb2N1bWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEJyb3dzZXIoJHdpbmRvdywgJGRvY3VtZW50LCAkbG9nLCAkc25pZmZlcik7XG4gICAgICB9XTtcbn1cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJGNhY2hlRmFjdG9yeVxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEZhY3RvcnkgdGhhdCBjb25zdHJ1Y3RzIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3RzIGFuZCBnaXZlcyBhY2Nlc3MgdG9cbiAqIHRoZW0uXG4gKlxuICogYGBganNcbiAqXG4gKiAgdmFyIGNhY2hlID0gJGNhY2hlRmFjdG9yeSgnY2FjaGVJZCcpO1xuICogIGV4cGVjdCgkY2FjaGVGYWN0b3J5LmdldCgnY2FjaGVJZCcpKS50b0JlKGNhY2hlKTtcbiAqICBleHBlY3QoJGNhY2hlRmFjdG9yeS5nZXQoJ25vU3VjaENhY2hlSWQnKSkubm90LnRvQmVEZWZpbmVkKCk7XG4gKlxuICogIGNhY2hlLnB1dChcImtleVwiLCBcInZhbHVlXCIpO1xuICogIGNhY2hlLnB1dChcImFub3RoZXIga2V5XCIsIFwiYW5vdGhlciB2YWx1ZVwiKTtcbiAqXG4gKiAgLy8gV2UndmUgc3BlY2lmaWVkIG5vIG9wdGlvbnMgb24gY3JlYXRpb25cbiAqICBleHBlY3QoY2FjaGUuaW5mbygpKS50b0VxdWFsKHtpZDogJ2NhY2hlSWQnLCBzaXplOiAyfSk7XG4gKlxuICogYGBgXG4gKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYWNoZUlkIE5hbWUgb3IgaWQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgY2FjaGUuXG4gKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIGNhY2hlIGJlaGF2aW9yLiBQcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBge251bWJlcj19YCBgY2FwYWNpdHlgIOKAlCB0dXJucyB0aGUgY2FjaGUgaW50byBMUlUgY2FjaGUuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gTmV3bHkgY3JlYXRlZCBjYWNoZSBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHNldCBvZiBtZXRob2RzOlxuICpcbiAqIC0gYHtvYmplY3R9YCBgaW5mbygpYCDigJQgUmV0dXJucyBpZCwgc2l6ZSwgYW5kIG9wdGlvbnMgb2YgY2FjaGUuXG4gKiAtIGB7eyp9fWAgYHB1dCh7c3RyaW5nfSBrZXksIHsqfSB2YWx1ZSlgIOKAlCBQdXRzIGEgbmV3IGtleS12YWx1ZSBwYWlyIGludG8gdGhlIGNhY2hlIGFuZCByZXR1cm5zXG4gKiAgIGl0LlxuICogLSBge3sqfX1gIGBnZXQoe3N0cmluZ30ga2V5KWAg4oCUIFJldHVybnMgY2FjaGVkIHZhbHVlIGZvciBga2V5YCBvciB1bmRlZmluZWQgZm9yIGNhY2hlIG1pc3MuXG4gKiAtIGB7dm9pZH1gIGByZW1vdmUoe3N0cmluZ30ga2V5KWAg4oCUIFJlbW92ZXMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBjYWNoZS5cbiAqIC0gYHt2b2lkfWAgYHJlbW92ZUFsbCgpYCDigJQgUmVtb3ZlcyBhbGwgY2FjaGVkIHZhbHVlcy5cbiAqIC0gYHt2b2lkfWAgYGRlc3Ryb3koKWAg4oCUIFJlbW92ZXMgcmVmZXJlbmNlcyB0byB0aGlzIGNhY2hlIGZyb20gJGNhY2hlRmFjdG9yeS5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwiY2FjaGVFeGFtcGxlQXBwXCIgbmFtZT1cImNhY2hlLWZhY3RvcnlcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJDYWNoZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cIm5ld0NhY2hlS2V5XCIgcGxhY2Vob2xkZXI9XCJLZXlcIj5cbiAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cIm5ld0NhY2hlVmFsdWVcIiBwbGFjZWhvbGRlcj1cIlZhbHVlXCI+XG4gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwicHV0KG5ld0NhY2hlS2V5LCBuZXdDYWNoZVZhbHVlKVwiPkNhY2hlPC9idXR0b24+XG5cbiAgICAgICAgIDxwIG5nLWlmPVwia2V5cy5sZW5ndGhcIj5DYWNoZWQgVmFsdWVzPC9wPlxuICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9XCJrZXkgaW4ga2V5c1wiPlxuICAgICAgICAgICA8c3BhbiBuZy1iaW5kPVwia2V5XCI+PC9zcGFuPlxuICAgICAgICAgICA8c3Bhbj46IDwvc3Bhbj5cbiAgICAgICAgICAgPGIgbmctYmluZD1cImNhY2hlLmdldChrZXkpXCI+PC9iPlxuICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgIDxwPkNhY2hlIEluZm88L3A+XG4gICAgICAgICA8ZGl2IG5nLXJlcGVhdD1cIihrZXksIHZhbHVlKSBpbiBjYWNoZS5pbmZvKClcIj5cbiAgICAgICAgICAgPHNwYW4gbmctYmluZD1cImtleVwiPjwvc3Bhbj5cbiAgICAgICAgICAgPHNwYW4+OiA8L3NwYW4+XG4gICAgICAgICAgIDxiIG5nLWJpbmQ9XCJ2YWx1ZVwiPjwvYj5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnY2FjaGVFeGFtcGxlQXBwJywgW10pLlxuICAgICAgICAgY29udHJvbGxlcignQ2FjaGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGNhY2hlRmFjdG9yeScsIGZ1bmN0aW9uKCRzY29wZSwgJGNhY2hlRmFjdG9yeSkge1xuICAgICAgICAgICAkc2NvcGUua2V5cyA9IFtdO1xuICAgICAgICAgICAkc2NvcGUuY2FjaGUgPSAkY2FjaGVGYWN0b3J5KCdjYWNoZUlkJyk7XG4gICAgICAgICAgICRzY29wZS5wdXQgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQoJHNjb3BlLmNhY2hlLmdldChrZXkpKSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLmtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAkc2NvcGUuY2FjaGUucHV0KGtleSwgYW5ndWxhci5pc1VuZGVmaW5lZCh2YWx1ZSkgPyBudWxsIDogdmFsdWUpO1xuICAgICAgICAgICB9O1xuICAgICAgICAgfV0pO1xuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICBwIHtcbiAgICAgICAgIG1hcmdpbjogMTBweCAwIDNweDtcbiAgICAgICB9XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuZnVuY3Rpb24gJENhY2hlRmFjdG9yeVByb3ZpZGVyKCkge1xuXG4gIHRoaXMuJGdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYWNoZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGNhY2hlRmFjdG9yeShjYWNoZUlkLCBvcHRpb25zKSB7XG4gICAgICBpZiAoY2FjaGVJZCBpbiBjYWNoZXMpIHtcbiAgICAgICAgdGhyb3cgbWluRXJyKCckY2FjaGVGYWN0b3J5JykoJ2lpZCcsICdDYWNoZUlkIFxcJ3swfVxcJyBpcyBhbHJlYWR5IHRha2VuIScsIGNhY2hlSWQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2l6ZSA9IDAsXG4gICAgICAgICAgc3RhdHMgPSBleHRlbmQoe30sIG9wdGlvbnMsIHtpZDogY2FjaGVJZH0pLFxuICAgICAgICAgIGRhdGEgPSBjcmVhdGVNYXAoKSxcbiAgICAgICAgICBjYXBhY2l0eSA9IChvcHRpb25zICYmIG9wdGlvbnMuY2FwYWNpdHkpIHx8IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgbHJ1SGFzaCA9IGNyZWF0ZU1hcCgpLFxuICAgICAgICAgIGZyZXNoRW5kID0gbnVsbCxcbiAgICAgICAgICBzdGFsZUVuZCA9IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIHR5cGVcbiAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGVcbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIEEgY2FjaGUgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEsIHByaW1hcmlseSB1c2VkIGJ5XG4gICAgICAgKiB7QGxpbmsgJGh0dHAgJGh0dHB9IGFuZCB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpzY3JpcHQgc2NyaXB0fSBkaXJlY3RpdmUgdG8gY2FjaGVcbiAgICAgICAqIHRlbXBsYXRlcyBhbmQgb3RoZXIgZGF0YS5cbiAgICAgICAqXG4gICAgICAgKiBgYGBqc1xuICAgICAgICogIGFuZ3VsYXIubW9kdWxlKCdzdXBlckNhY2hlJylcbiAgICAgICAqICAgIC5mYWN0b3J5KCdzdXBlckNhY2hlJywgWyckY2FjaGVGYWN0b3J5JywgZnVuY3Rpb24oJGNhY2hlRmFjdG9yeSkge1xuICAgICAgICogICAgICByZXR1cm4gJGNhY2hlRmFjdG9yeSgnc3VwZXItY2FjaGUnKTtcbiAgICAgICAqICAgIH1dKTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqIEV4YW1wbGUgdGVzdDpcbiAgICAgICAqXG4gICAgICAgKiBgYGBqc1xuICAgICAgICogIGl0KCdzaG91bGQgYmVoYXZlIGxpa2UgYSBjYWNoZScsIGluamVjdChmdW5jdGlvbihzdXBlckNhY2hlKSB7XG4gICAgICAgKiAgICBzdXBlckNhY2hlLnB1dCgna2V5JywgJ3ZhbHVlJyk7XG4gICAgICAgKiAgICBzdXBlckNhY2hlLnB1dCgnYW5vdGhlciBrZXknLCAnYW5vdGhlciB2YWx1ZScpO1xuICAgICAgICpcbiAgICAgICAqICAgIGV4cGVjdChzdXBlckNhY2hlLmluZm8oKSkudG9FcXVhbCh7XG4gICAgICAgKiAgICAgIGlkOiAnc3VwZXItY2FjaGUnLFxuICAgICAgICogICAgICBzaXplOiAyXG4gICAgICAgKiAgICB9KTtcbiAgICAgICAqXG4gICAgICAgKiAgICBzdXBlckNhY2hlLnJlbW92ZSgnYW5vdGhlciBrZXknKTtcbiAgICAgICAqICAgIGV4cGVjdChzdXBlckNhY2hlLmdldCgnYW5vdGhlciBrZXknKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICpcbiAgICAgICAqICAgIHN1cGVyQ2FjaGUucmVtb3ZlQWxsKCk7XG4gICAgICAgKiAgICBleHBlY3Qoc3VwZXJDYWNoZS5pbmZvKCkpLnRvRXF1YWwoe1xuICAgICAgICogICAgICBpZDogJ3N1cGVyLWNhY2hlJyxcbiAgICAgICAqICAgICAgc2l6ZTogMFxuICAgICAgICogICAgfSk7XG4gICAgICAgKiAgfSkpO1xuICAgICAgICogYGBgXG4gICAgICAgKi9cbiAgICAgIHJldHVybiAoY2FjaGVzW2NhY2hlSWRdID0ge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjcHV0XG4gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBJbnNlcnRzIGEgbmFtZWQgZW50cnkgaW50byB0aGUge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdCB0byBiZVxuICAgICAgICAgKiByZXRyaWV2ZWQgbGF0ZXIsIGFuZCBpbmNyZW1lbnRpbmcgdGhlIHNpemUgb2YgdGhlIGNhY2hlIGlmIHRoZSBrZXkgd2FzIG5vdCBhbHJlYWR5XG4gICAgICAgICAqIHByZXNlbnQgaW4gdGhlIGNhY2hlLiBJZiBiZWhhdmluZyBsaWtlIGFuIExSVSBjYWNoZSwgaXQgd2lsbCBhbHNvIHJlbW92ZSBzdGFsZVxuICAgICAgICAgKiBlbnRyaWVzIGZyb20gdGhlIHNldC5cbiAgICAgICAgICpcbiAgICAgICAgICogSXQgd2lsbCBub3QgaW5zZXJ0IHVuZGVmaW5lZCB2YWx1ZXMgaW50byB0aGUgY2FjaGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSB1bmRlciB3aGljaCB0aGUgY2FjaGVkIGRhdGEgaXMgc3RvcmVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIHRoZSB2YWx1ZSB0byBzdG9yZSBhbG9uZ3NpZGUgdGhlIGtleS4gSWYgaXQgaXMgdW5kZWZpbmVkLCB0aGUga2V5XG4gICAgICAgICAqICAgIHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICAgICAgICogQHJldHVybnMgeyp9IHRoZSB2YWx1ZSBzdG9yZWQuXG4gICAgICAgICAqL1xuICAgICAgICBwdXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG4gICAgICAgICAgaWYgKGNhcGFjaXR5IDwgTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgdmFyIGxydUVudHJ5ID0gbHJ1SGFzaFtrZXldIHx8IChscnVIYXNoW2tleV0gPSB7a2V5OiBrZXl9KTtcblxuICAgICAgICAgICAgcmVmcmVzaChscnVFbnRyeSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEoa2V5IGluIGRhdGEpKSBzaXplKys7XG4gICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG5cbiAgICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZShzdGFsZUVuZC5rZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI2dldFxuICAgICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUmV0cmlldmVzIG5hbWVkIGRhdGEgc3RvcmVkIGluIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRhdGEgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgICAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgc3RvcmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICBpZiAoY2FwYWNpdHkgPCBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB2YXIgbHJ1RW50cnkgPSBscnVIYXNoW2tleV07XG5cbiAgICAgICAgICAgIGlmICghbHJ1RW50cnkpIHJldHVybjtcblxuICAgICAgICAgICAgcmVmcmVzaChscnVFbnRyeSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRhdGFba2V5XTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjcmVtb3ZlXG4gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZW50cnkgdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICBpZiAoY2FwYWNpdHkgPCBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB2YXIgbHJ1RW50cnkgPSBscnVIYXNoW2tleV07XG5cbiAgICAgICAgICAgIGlmICghbHJ1RW50cnkpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGxydUVudHJ5ID09PSBmcmVzaEVuZCkgZnJlc2hFbmQgPSBscnVFbnRyeS5wO1xuICAgICAgICAgICAgaWYgKGxydUVudHJ5ID09PSBzdGFsZUVuZCkgc3RhbGVFbmQgPSBscnVFbnRyeS5uO1xuICAgICAgICAgICAgbGluayhscnVFbnRyeS5uLGxydUVudHJ5LnApO1xuXG4gICAgICAgICAgICBkZWxldGUgbHJ1SGFzaFtrZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghKGtleSBpbiBkYXRhKSkgcmV0dXJuO1xuXG4gICAgICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgICAgICBzaXplLS07XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI3JlbW92ZUFsbFxuICAgICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogQ2xlYXJzIHRoZSBjYWNoZSBvYmplY3Qgb2YgYW55IGVudHJpZXMuXG4gICAgICAgICAqL1xuICAgICAgICByZW1vdmVBbGw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGRhdGEgPSBjcmVhdGVNYXAoKTtcbiAgICAgICAgICBzaXplID0gMDtcbiAgICAgICAgICBscnVIYXNoID0gY3JlYXRlTWFwKCk7XG4gICAgICAgICAgZnJlc2hFbmQgPSBzdGFsZUVuZCA9IG51bGw7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI2Rlc3Ryb3lcbiAgICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAgICpcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIERlc3Ryb3lzIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0IGVudGlyZWx5LFxuICAgICAgICAgKiByZW1vdmluZyBpdCBmcm9tIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeSAkY2FjaGVGYWN0b3J5fSBzZXQuXG4gICAgICAgICAqL1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBkYXRhID0gbnVsbDtcbiAgICAgICAgICBzdGF0cyA9IG51bGw7XG4gICAgICAgICAgbHJ1SGFzaCA9IG51bGw7XG4gICAgICAgICAgZGVsZXRlIGNhY2hlc1tjYWNoZUlkXTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjaW5mb1xuICAgICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGEgcGFydGljdWxhciB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtvYmplY3R9IGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogICA8dWw+XG4gICAgICAgICAqICAgICA8bGk+KippZCoqOiB0aGUgaWQgb2YgdGhlIGNhY2hlIGluc3RhbmNlPC9saT5cbiAgICAgICAgICogICAgIDxsaT4qKnNpemUqKjogdGhlIG51bWJlciBvZiBlbnRyaWVzIGtlcHQgaW4gdGhlIGNhY2hlIGluc3RhbmNlPC9saT5cbiAgICAgICAgICogICAgIDxsaT4qKi4uLioqOiBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0IHdoZW4gY3JlYXRpbmcgdGhlXG4gICAgICAgICAqICAgICAgIGNhY2hlLjwvbGk+XG4gICAgICAgICAqICAgPC91bD5cbiAgICAgICAgICovXG4gICAgICAgIGluZm86IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBleHRlbmQoe30sIHN0YXRzLCB7c2l6ZTogc2l6ZX0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuXG4gICAgICAvKipcbiAgICAgICAqIG1ha2VzIHRoZSBgZW50cnlgIHRoZSBmcmVzaEVuZCBvZiB0aGUgTFJVIGxpbmtlZCBsaXN0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIHJlZnJlc2goZW50cnkpIHtcbiAgICAgICAgaWYgKGVudHJ5ICE9PSBmcmVzaEVuZCkge1xuICAgICAgICAgIGlmICghc3RhbGVFbmQpIHtcbiAgICAgICAgICAgIHN0YWxlRW5kID0gZW50cnk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFsZUVuZCA9PT0gZW50cnkpIHtcbiAgICAgICAgICAgIHN0YWxlRW5kID0gZW50cnkubjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5rKGVudHJ5Lm4sIGVudHJ5LnApO1xuICAgICAgICAgIGxpbmsoZW50cnksIGZyZXNoRW5kKTtcbiAgICAgICAgICBmcmVzaEVuZCA9IGVudHJ5O1xuICAgICAgICAgIGZyZXNoRW5kLm4gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLyoqXG4gICAgICAgKiBiaWRpcmVjdGlvbmFsbHkgbGlua3MgdHdvIGVudHJpZXMgb2YgdGhlIExSVSBsaW5rZWQgbGlzdFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBsaW5rKG5leHRFbnRyeSwgcHJldkVudHJ5KSB7XG4gICAgICAgIGlmIChuZXh0RW50cnkgIT09IHByZXZFbnRyeSkge1xuICAgICAgICAgIGlmIChuZXh0RW50cnkpIG5leHRFbnRyeS5wID0gcHJldkVudHJ5OyAvL3Agc3RhbmRzIGZvciBwcmV2aW91cywgJ3ByZXYnIGRpZG4ndCBtaW5pZnlcbiAgICAgICAgICBpZiAocHJldkVudHJ5KSBwcmV2RW50cnkubiA9IG5leHRFbnRyeTsgLy9uIHN0YW5kcyBmb3IgbmV4dCwgJ25leHQnIGRpZG4ndCBtaW5pZnlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjYWNoZUZhY3RvcnkjaW5mb1xuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgY2FjaGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gLSBrZXktdmFsdWUgbWFwIG9mIGBjYWNoZUlkYCB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYGNhY2hlI2luZm9gXG4gICAqL1xuICAgIGNhY2hlRmFjdG9yeS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaW5mbyA9IHt9O1xuICAgICAgZm9yRWFjaChjYWNoZXMsIGZ1bmN0aW9uKGNhY2hlLCBjYWNoZUlkKSB7XG4gICAgICAgIGluZm9bY2FjaGVJZF0gPSBjYWNoZS5pbmZvKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH07XG5cblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5I2dldFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogR2V0IGFjY2VzcyB0byBhIGNhY2hlIG9iamVjdCBieSB0aGUgYGNhY2hlSWRgIHVzZWQgd2hlbiBpdCB3YXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlSWQgTmFtZSBvciBpZCBvZiBhIGNhY2hlIHRvIGFjY2Vzcy5cbiAgICogQHJldHVybnMge29iamVjdH0gQ2FjaGUgb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIGNhY2hlSWQgb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2ggY2FjaGUuXG4gICAqL1xuICAgIGNhY2hlRmFjdG9yeS5nZXQgPSBmdW5jdGlvbihjYWNoZUlkKSB7XG4gICAgICByZXR1cm4gY2FjaGVzW2NhY2hlSWRdO1xuICAgIH07XG5cblxuICAgIHJldHVybiBjYWNoZUZhY3Rvcnk7XG4gIH07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICR0ZW1wbGF0ZUNhY2hlXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZpcnN0IHRpbWUgYSB0ZW1wbGF0ZSBpcyB1c2VkLCBpdCBpcyBsb2FkZWQgaW4gdGhlIHRlbXBsYXRlIGNhY2hlIGZvciBxdWljayByZXRyaWV2YWwuIFlvdVxuICogY2FuIGxvYWQgdGVtcGxhdGVzIGRpcmVjdGx5IGludG8gdGhlIGNhY2hlIGluIGEgYHNjcmlwdGAgdGFnLCBvciBieSBjb25zdW1pbmcgdGhlXG4gKiBgJHRlbXBsYXRlQ2FjaGVgIHNlcnZpY2UgZGlyZWN0bHkuXG4gKlxuICogQWRkaW5nIHZpYSB0aGUgYHNjcmlwdGAgdGFnOlxuICpcbiAqIGBgYGh0bWxcbiAqICAgPHNjcmlwdCB0eXBlPVwidGV4dC9uZy10ZW1wbGF0ZVwiIGlkPVwidGVtcGxhdGVJZC5odG1sXCI+XG4gKiAgICAgPHA+VGhpcyBpcyB0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGU8L3A+XG4gKiAgIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogKipOb3RlOioqIHRoZSBgc2NyaXB0YCB0YWcgY29udGFpbmluZyB0aGUgdGVtcGxhdGUgZG9lcyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYGhlYWRgIG9mXG4gKiB0aGUgZG9jdW1lbnQsIGJ1dCBpdCBtdXN0IGJlIGEgZGVzY2VuZGVudCBvZiB0aGUge0BsaW5rIG5nLiRyb290RWxlbWVudCAkcm9vdEVsZW1lbnR9IChJRSxcbiAqIGVsZW1lbnQgd2l0aCBuZy1hcHAgYXR0cmlidXRlKSwgb3RoZXJ3aXNlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGlnbm9yZWQuXG4gKlxuICogQWRkaW5nIHZpYSB0aGUgYCR0ZW1wbGF0ZUNhY2hlYCBzZXJ2aWNlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbXlBcHAgPSBhbmd1bGFyLm1vZHVsZSgnbXlBcHAnLCBbXSk7XG4gKiBteUFwcC5ydW4oZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHtcbiAqICAgJHRlbXBsYXRlQ2FjaGUucHV0KCd0ZW1wbGF0ZUlkLmh0bWwnLCAnVGhpcyBpcyB0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUnKTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogVG8gcmV0cmlldmUgdGhlIHRlbXBsYXRlIGxhdGVyLCBzaW1wbHkgdXNlIGl0IGluIHlvdXIgY29tcG9uZW50OlxuICogYGBganNcbiAqIG15QXBwLmNvbXBvbmVudCgnbXlDb21wb25lbnQnLCB7XG4gKiAgICB0ZW1wbGF0ZVVybDogJ3RlbXBsYXRlSWQuaHRtbCdcbiAqIH0pO1xuICogYGBgXG4gKlxuICogb3IgZ2V0IGl0IHZpYSB0aGUgYCR0ZW1wbGF0ZUNhY2hlYCBzZXJ2aWNlOlxuICogYGBganNcbiAqICR0ZW1wbGF0ZUNhY2hlLmdldCgndGVtcGxhdGVJZC5odG1sJylcbiAqIGBgYFxuICpcbiAqIFNlZSB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSAkY2FjaGVGYWN0b3J5fS5cbiAqXG4gKi9cbmZ1bmN0aW9uICRUZW1wbGF0ZUNhY2hlUHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IFsnJGNhY2hlRmFjdG9yeScsIGZ1bmN0aW9uKCRjYWNoZUZhY3RvcnkpIHtcbiAgICByZXR1cm4gJGNhY2hlRmFjdG9yeSgndGVtcGxhdGVzJyk7XG4gIH1dO1xufVxuXG4vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqXG4gKiAgICAgQW55IGNvbW1pdHMgdG8gdGhpcyBmaWxlIHNob3VsZCBiZSByZXZpZXdlZCB3aXRoIHNlY3VyaXR5IGluIG1pbmQuICAqXG4gKiAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIGNhbiBwb3RlbnRpYWxseSBjcmVhdGUgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLiAqXG4gKiAgICAgICAgICBBbiBhcHByb3ZhbCBmcm9tIDIgQ29yZSBtZW1iZXJzIHdpdGggaGlzdG9yeSBvZiBtb2RpZnlpbmcgICAgICAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiAgRG9lcyB0aGUgY2hhbmdlIHNvbWVob3cgYWxsb3cgZm9yIGFyYml0cmFyeSBqYXZhc2NyaXB0IHRvIGJlIGV4ZWN1dGVkPyAqXG4gKiAgICBPciBhbGxvd3MgZm9yIHNvbWVvbmUgdG8gY2hhbmdlIHRoZSBwcm90b3R5cGUgb2YgYnVpbHQtaW4gb2JqZWN0cz8gICAqXG4gKiAgICAgT3IgZ2l2ZXMgdW5kZXNpcmVkIGFjY2VzcyB0byB2YXJpYWJsZXMgbGlrZSBkb2N1bWVudCBvciB3aW5kb3c/ICAgICpcbiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovXG5cbi8qICEgVkFSSUFCTEUvRlVOQ1RJT04gTkFNSU5HIENPTlZFTlRJT05TIFRIQVQgQVBQTFkgVE8gVEhJUyBGSUxFIVxuICpcbiAqIERPTS1yZWxhdGVkIHZhcmlhYmxlczpcbiAqXG4gKiAtIFwibm9kZVwiIC0gRE9NIE5vZGVcbiAqIC0gXCJlbGVtZW50XCIgLSBET00gRWxlbWVudCBvciBOb2RlXG4gKiAtIFwiJG5vZGVcIiBvciBcIiRlbGVtZW50XCIgLSBqcUxpdGUtd3JhcHBlZCBub2RlIG9yIGVsZW1lbnRcbiAqXG4gKlxuICogQ29tcGlsZXIgcmVsYXRlZCBzdHVmZjpcbiAqXG4gKiAtIFwibGlua0ZuXCIgLSBsaW5raW5nIGZuIG9mIGEgc2luZ2xlIGRpcmVjdGl2ZVxuICogLSBcIm5vZGVMaW5rRm5cIiAtIGZ1bmN0aW9uIHRoYXQgYWdncmVnYXRlcyBhbGwgbGlua2luZyBmbnMgZm9yIGEgcGFydGljdWxhciBub2RlXG4gKiAtIFwiY2hpbGRMaW5rRm5cIiAtICBmdW5jdGlvbiB0aGF0IGFnZ3JlZ2F0ZXMgYWxsIGxpbmtpbmcgZm5zIGZvciBjaGlsZCBub2RlcyBvZiBhIHBhcnRpY3VsYXIgbm9kZVxuICogLSBcImNvbXBvc2l0ZUxpbmtGblwiIC0gZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGFsbCBsaW5raW5nIGZucyBmb3IgYSBjb21waWxhdGlvbiByb290IChub2RlTGlzdClcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRjb21waWxlXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29tcGlsZXMgYW4gSFRNTCBzdHJpbmcgb3IgRE9NIGludG8gYSB0ZW1wbGF0ZSBhbmQgcHJvZHVjZXMgYSB0ZW1wbGF0ZSBmdW5jdGlvbiwgd2hpY2hcbiAqIGNhbiB0aGVuIGJlIHVzZWQgdG8gbGluayB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBgc2NvcGVgfSBhbmQgdGhlIHRlbXBsYXRlIHRvZ2V0aGVyLlxuICpcbiAqIFRoZSBjb21waWxhdGlvbiBpcyBhIHByb2Nlc3Mgb2Ygd2Fsa2luZyB0aGUgRE9NIHRyZWUgYW5kIG1hdGNoaW5nIERPTSBlbGVtZW50cyB0b1xuICoge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlIGRpcmVjdGl2ZXN9LlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAqKk5vdGU6KiogVGhpcyBkb2N1bWVudCBpcyBhbiBpbi1kZXB0aCByZWZlcmVuY2Ugb2YgYWxsIGRpcmVjdGl2ZSBvcHRpb25zLlxuICogRm9yIGEgZ2VudGxlIGludHJvZHVjdGlvbiB0byBkaXJlY3RpdmVzIHdpdGggZXhhbXBsZXMgb2YgY29tbW9uIHVzZSBjYXNlcyxcbiAqIHNlZSB0aGUge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSBkaXJlY3RpdmUgZ3VpZGV9LlxuICogPC9kaXY+XG4gKlxuICogIyMgQ29tcHJlaGVuc2l2ZSBEaXJlY3RpdmUgQVBJXG4gKlxuICogVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IG9wdGlvbnMgZm9yIGEgZGlyZWN0aXZlLlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIHJlc2lkZXMgaW4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbi5cbiAqIFlvdSBjYW4gZWl0aGVyIHJldHVybiBhIHtAbGluayAkY29tcGlsZSNkaXJlY3RpdmUtZGVmaW5pdGlvbi1vYmplY3QgRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0IChzZWUgYmVsb3cpfVxuICogdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3RpdmUgcHJvcGVydGllcywgb3IganVzdCB0aGUgYHBvc3RMaW5rYCBmdW5jdGlvbiAoYWxsIG90aGVyIHByb3BlcnRpZXMgd2lsbCBoYXZlXG4gKiB0aGUgZGVmYXVsdCB2YWx1ZXMpLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1zdWNjZXNzXCI+XG4gKiAqKkJlc3QgUHJhY3RpY2U6KiogSXQncyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIFwiZGlyZWN0aXZlIGRlZmluaXRpb24gb2JqZWN0XCIgZm9ybS5cbiAqIDwvZGl2PlxuICpcbiAqIEhlcmUncyBhbiBleGFtcGxlIGRpcmVjdGl2ZSBkZWNsYXJlZCB3aXRoIGEgRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0OlxuICpcbiAqIGBgYGpzXG4gKiAgIHZhciBteU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKC4uLik7XG4gKlxuICogICBteU1vZHVsZS5kaXJlY3RpdmUoJ2RpcmVjdGl2ZU5hbWUnLCBmdW5jdGlvbiBmYWN0b3J5KGluamVjdGFibGVzKSB7XG4gKiAgICAgdmFyIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3QgPSB7XG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLXByaW9yaXR5LSBwcmlvcml0eX06IDAsXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLXRlbXBsYXRlLSB0ZW1wbGF0ZX06ICc8ZGl2PjwvZGl2PicsIC8vIG9yIC8vIGZ1bmN0aW9uKHRFbGVtZW50LCB0QXR0cnMpIHsgLi4uIH0sXG4gKiAgICAgICAvLyBvclxuICogICAgICAgLy8ge0BsaW5rICRjb21waWxlIy10ZW1wbGF0ZXVybC0gdGVtcGxhdGVVcmx9OiAnZGlyZWN0aXZlLmh0bWwnLCAvLyBvciAvLyBmdW5jdGlvbih0RWxlbWVudCwgdEF0dHJzKSB7IC4uLiB9LFxuICogICAgICAge0BsaW5rICRjb21waWxlIy10cmFuc2NsdWRlLSB0cmFuc2NsdWRlfTogZmFsc2UsXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLXJlc3RyaWN0LSByZXN0cmljdH06ICdBJyxcbiAqICAgICAgIHtAbGluayAkY29tcGlsZSMtdGVtcGxhdGVuYW1lc3BhY2UtIHRlbXBsYXRlTmFtZXNwYWNlfTogJ2h0bWwnLFxuICogICAgICAge0BsaW5rICRjb21waWxlIy1zY29wZS0gc2NvcGV9OiBmYWxzZSxcbiAqICAgICAgIHtAbGluayAkY29tcGlsZSMtY29udHJvbGxlci0gY29udHJvbGxlcn06IGZ1bmN0aW9uKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgJHRyYW5zY2x1ZGUsIG90aGVySW5qZWN0YWJsZXMpIHsgLi4uIH0sXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLWNvbnRyb2xsZXJhcy0gY29udHJvbGxlckFzfTogJ3N0cmluZ0lkZW50aWZpZXInLFxuICogICAgICAge0BsaW5rICRjb21waWxlIy1iaW5kdG9jb250cm9sbGVyLSBiaW5kVG9Db250cm9sbGVyfTogZmFsc2UsXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLXJlcXVpcmUtIHJlcXVpcmV9OiAnc2libGluZ0RpcmVjdGl2ZU5hbWUnLCAvLyBvciAvLyBbJ15wYXJlbnREaXJlY3RpdmVOYW1lJywgJz9vcHRpb25hbERpcmVjdGl2ZU5hbWUnLCAnP15vcHRpb25hbFBhcmVudCddLFxuICogICAgICAge0BsaW5rICRjb21waWxlIy1tdWx0aWVsZW1lbnQtIG11bHRpRWxlbWVudH06IGZhbHNlLFxuICogICAgICAge0BsaW5rICRjb21waWxlIy1jb21waWxlLSBjb21waWxlfTogZnVuY3Rpb24gY29tcGlsZSh0RWxlbWVudCwgdEF0dHJzLCB0cmFuc2NsdWRlKSB7XG4gKiAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAgIHtAbGluayAkY29tcGlsZSNwcmUtbGlua2luZy1mdW5jdGlvbiBwcmV9OiBmdW5jdGlvbiBwcmVMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyKSB7IC4uLiB9LFxuICogICAgICAgICAgICB7QGxpbmsgJGNvbXBpbGUjcG9zdC1saW5raW5nLWZ1bmN0aW9uIHBvc3R9OiBmdW5jdGlvbiBwb3N0TGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfVxuICogICAgICAgICB9XG4gKiAgICAgICAgIC8vIG9yXG4gKiAgICAgICAgIC8vIHJldHVybiBmdW5jdGlvbiBwb3N0TGluayggLi4uICkgeyAuLi4gfVxuICogICAgICAgfSxcbiAqICAgICAgIC8vIG9yXG4gKiAgICAgICAvLyB7QGxpbmsgJGNvbXBpbGUjLWxpbmstIGxpbmt9OiB7XG4gKiAgICAgICAvLyAge0BsaW5rICRjb21waWxlI3ByZS1saW5raW5nLWZ1bmN0aW9uIHByZX06IGZ1bmN0aW9uIHByZUxpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMsIGNvbnRyb2xsZXIpIHsgLi4uIH0sXG4gKiAgICAgICAvLyAge0BsaW5rICRjb21waWxlI3Bvc3QtbGlua2luZy1mdW5jdGlvbiBwb3N0fTogZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMsIGNvbnRyb2xsZXIpIHsgLi4uIH1cbiAqICAgICAgIC8vIH1cbiAqICAgICAgIC8vIG9yXG4gKiAgICAgICAvLyB7QGxpbmsgJGNvbXBpbGUjLWxpbmstIGxpbmt9OiBmdW5jdGlvbiBwb3N0TGluayggLi4uICkgeyAuLi4gfVxuICogICAgIH07XG4gKiAgICAgcmV0dXJuIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3Q7XG4gKiAgIH0pO1xuICogYGBgXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqTm90ZToqKiBBbnkgdW5zcGVjaWZpZWQgb3B0aW9ucyB3aWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBzZWUgdGhlIGRlZmF1bHQgdmFsdWVzIGJlbG93LlxuICogPC9kaXY+XG4gKlxuICogVGhlcmVmb3JlIHRoZSBhYm92ZSBjYW4gYmUgc2ltcGxpZmllZCBhczpcbiAqXG4gKiBgYGBqc1xuICogICB2YXIgbXlNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSguLi4pO1xuICpcbiAqICAgbXlNb2R1bGUuZGlyZWN0aXZlKCdkaXJlY3RpdmVOYW1lJywgZnVuY3Rpb24gZmFjdG9yeShpbmplY3RhYmxlcykge1xuICogICAgIHZhciBkaXJlY3RpdmVEZWZpbml0aW9uT2JqZWN0ID0ge1xuICogICAgICAgbGluazogZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMpIHsgLi4uIH1cbiAqICAgICB9O1xuICogICAgIHJldHVybiBkaXJlY3RpdmVEZWZpbml0aW9uT2JqZWN0O1xuICogICAgIC8vIG9yXG4gKiAgICAgLy8gcmV0dXJuIGZ1bmN0aW9uIHBvc3RMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzKSB7IC4uLiB9XG4gKiAgIH0pO1xuICogYGBgXG4gKlxuICogIyMjIExpZmUtY3ljbGUgaG9va3NcbiAqIERpcmVjdGl2ZSBjb250cm9sbGVycyBjYW4gcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGJ5IEFuZ3VsYXIgYXQgcG9pbnRzIGluIHRoZSBsaWZlLWN5Y2xlIG9mIHRoZVxuICogZGlyZWN0aXZlOlxuICogKiBgJG9uSW5pdCgpYCAtIENhbGxlZCBvbiBlYWNoIGNvbnRyb2xsZXIgYWZ0ZXIgYWxsIHRoZSBjb250cm9sbGVycyBvbiBhbiBlbGVtZW50IGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBhbmRcbiAqICAgaGFkIHRoZWlyIGJpbmRpbmdzIGluaXRpYWxpemVkIChhbmQgYmVmb3JlIHRoZSBwcmUgJmFtcDsgcG9zdCBsaW5raW5nIGZ1bmN0aW9ucyBmb3IgdGhlIGRpcmVjdGl2ZXMgb25cbiAqICAgdGhpcyBlbGVtZW50KS4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gcHV0IGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHlvdXIgY29udHJvbGxlci5cbiAqICogYCRvbkNoYW5nZXMoY2hhbmdlc09iailgIC0gQ2FsbGVkIHdoZW5ldmVyIG9uZS13YXkgKGA8YCkgb3IgaW50ZXJwb2xhdGlvbiAoYEBgKSBiaW5kaW5ncyBhcmUgdXBkYXRlZC4gVGhlXG4gKiAgIGBjaGFuZ2VzT2JqYCBpcyBhIGhhc2ggd2hvc2Uga2V5cyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBib3VuZCBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIHZhbHVlcyBhcmUgYW5cbiAqICAgb2JqZWN0IG9mIHRoZSBmb3JtIGB7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSwgaXNGaXJzdENoYW5nZSgpIH1gLiBVc2UgdGhpcyBob29rIHRvIHRyaWdnZXIgdXBkYXRlcyB3aXRoaW4gYVxuICogICBjb21wb25lbnQgc3VjaCBhcyBjbG9uaW5nIHRoZSBib3VuZCB2YWx1ZSB0byBwcmV2ZW50IGFjY2lkZW50YWwgbXV0YXRpb24gb2YgdGhlIG91dGVyIHZhbHVlLlxuICogKiBgJGRvQ2hlY2soKWAgLSBDYWxsZWQgb24gZWFjaCB0dXJuIG9mIHRoZSBkaWdlc3QgY3ljbGUuIFByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIGRldGVjdCBhbmQgYWN0IG9uXG4gKiAgIGNoYW5nZXMuIEFueSBhY3Rpb25zIHRoYXQgeW91IHdpc2ggdG8gdGFrZSBpbiByZXNwb25zZSB0byB0aGUgY2hhbmdlcyB0aGF0IHlvdSBkZXRlY3QgbXVzdCBiZVxuICogICBpbnZva2VkIGZyb20gdGhpcyBob29rOyBpbXBsZW1lbnRpbmcgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHdoZW4gYCRvbkNoYW5nZXNgIGlzIGNhbGxlZC4gRm9yIGV4YW1wbGUsIHRoaXMgaG9va1xuICogICBjb3VsZCBiZSB1c2VmdWwgaWYgeW91IHdpc2ggdG8gcGVyZm9ybSBhIGRlZXAgZXF1YWxpdHkgY2hlY2ssIG9yIHRvIGNoZWNrIGEgRGF0ZSBvYmplY3QsIGNoYW5nZXMgdG8gd2hpY2ggd291bGQgbm90XG4gKiAgIGJlIGRldGVjdGVkIGJ5IEFuZ3VsYXIncyBjaGFuZ2UgZGV0ZWN0b3IgYW5kIHRodXMgbm90IHRyaWdnZXIgYCRvbkNoYW5nZXNgLiBUaGlzIGhvb2sgaXMgaW52b2tlZCB3aXRoIG5vIGFyZ3VtZW50cztcbiAqICAgaWYgZGV0ZWN0aW5nIGNoYW5nZXMsIHlvdSBtdXN0IHN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZShzKSBmb3IgY29tcGFyaXNvbiB0byB0aGUgY3VycmVudCB2YWx1ZXMuXG4gKiAqIGAkb25EZXN0cm95KClgIC0gQ2FsbGVkIG9uIGEgY29udHJvbGxlciB3aGVuIGl0cyBjb250YWluaW5nIHNjb3BlIGlzIGRlc3Ryb3llZC4gVXNlIHRoaXMgaG9vayBmb3IgcmVsZWFzaW5nXG4gKiAgIGV4dGVybmFsIHJlc291cmNlcywgd2F0Y2hlcyBhbmQgZXZlbnQgaGFuZGxlcnMuIE5vdGUgdGhhdCBjb21wb25lbnRzIGhhdmUgdGhlaXIgYCRvbkRlc3Ryb3koKWAgaG9va3MgY2FsbGVkIGluXG4gKiAgIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBgJHNjb3BlLiRicm9hZGNhc3RgIGV2ZW50cyBhcmUgdHJpZ2dlcmVkLCB3aGljaCBpcyB0b3AgZG93bi4gVGhpcyBtZWFucyB0aGF0IHBhcmVudFxuICogICBjb21wb25lbnRzIHdpbGwgaGF2ZSB0aGVpciBgJG9uRGVzdHJveSgpYCBob29rIGNhbGxlZCBiZWZvcmUgY2hpbGQgY29tcG9uZW50cy5cbiAqICogYCRwb3N0TGluaygpYCAtIENhbGxlZCBhZnRlciB0aGlzIGNvbnRyb2xsZXIncyBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGxpbmtlZC4gU2ltaWxhciB0byB0aGUgcG9zdC1saW5rXG4gKiAgIGZ1bmN0aW9uIHRoaXMgaG9vayBjYW4gYmUgdXNlZCB0byBzZXQgdXAgRE9NIGV2ZW50IGhhbmRsZXJzIGFuZCBkbyBkaXJlY3QgRE9NIG1hbmlwdWxhdGlvbi5cbiAqICAgTm90ZSB0aGF0IGNoaWxkIGVsZW1lbnRzIHRoYXQgY29udGFpbiBgdGVtcGxhdGVVcmxgIGRpcmVjdGl2ZXMgd2lsbCBub3QgaGF2ZSBiZWVuIGNvbXBpbGVkIGFuZCBsaW5rZWQgc2luY2VcbiAqICAgdGhleSBhcmUgd2FpdGluZyBmb3IgdGhlaXIgdGVtcGxhdGUgdG8gbG9hZCBhc3luY2hyb25vdXNseSBhbmQgdGhlaXIgb3duIGNvbXBpbGF0aW9uIGFuZCBsaW5raW5nIGhhcyBiZWVuXG4gKiAgIHN1c3BlbmRlZCB1bnRpbCB0aGF0IG9jY3Vycy5cbiAqXG4gKiAjIyMjIENvbXBhcmlzb24gd2l0aCBBbmd1bGFyIDIgbGlmZS1jeWNsZSBob29rc1xuICogQW5ndWxhciAyIGFsc28gdXNlcyBsaWZlLWN5Y2xlIGhvb2tzIGZvciBpdHMgY29tcG9uZW50cy4gV2hpbGUgdGhlIEFuZ3VsYXIgMSBsaWZlLWN5Y2xlIGhvb2tzIGFyZSBzaW1pbGFyIHRoZXJlIGFyZVxuICogc29tZSBkaWZmZXJlbmNlcyB0aGF0IHlvdSBzaG91bGQgYmUgYXdhcmUgb2YsIGVzcGVjaWFsbHkgd2hlbiBpdCBjb21lcyB0byBtb3ZpbmcgeW91ciBjb2RlIGZyb20gQW5ndWxhciAxIHRvIEFuZ3VsYXIgMjpcbiAqXG4gKiAqIEFuZ3VsYXIgMSBob29rcyBhcmUgcHJlZml4ZWQgd2l0aCBgJGAsIHN1Y2ggYXMgYCRvbkluaXRgLiBBbmd1bGFyIDIgaG9va3MgYXJlIHByZWZpeGVkIHdpdGggYG5nYCwgc3VjaCBhcyBgbmdPbkluaXRgLlxuICogKiBBbmd1bGFyIDEgaG9va3MgY2FuIGJlIGRlZmluZWQgb24gdGhlIGNvbnRyb2xsZXIgcHJvdG90eXBlIG9yIGFkZGVkIHRvIHRoZSBjb250cm9sbGVyIGluc2lkZSBpdHMgY29uc3RydWN0b3IuXG4gKiAgIEluIEFuZ3VsYXIgMiB5b3UgY2FuIG9ubHkgZGVmaW5lIGhvb2tzIG9uIHRoZSBwcm90b3R5cGUgb2YgdGhlIENvbXBvbmVudCBjbGFzcy5cbiAqICogRHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBpbiBjaGFuZ2UtZGV0ZWN0aW9uLCB5b3UgbWF5IGdldCBtYW55IG1vcmUgY2FsbHMgdG8gYCRkb0NoZWNrYCBpbiBBbmd1bGFyIDEgdGhhbiB5b3Ugd291bGQgdG9cbiAqICAgYG5nRG9DaGVja2AgaW4gQW5ndWxhciAyXG4gKiAqIENoYW5nZXMgdG8gdGhlIG1vZGVsIGluc2lkZSBgJGRvQ2hlY2tgIHdpbGwgdHJpZ2dlciBuZXcgdHVybnMgb2YgdGhlIGRpZ2VzdCBsb29wLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBjaGFuZ2VzIHRvIGJlXG4gKiAgIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKiAgIEFuZ3VsYXIgMiBkb2VzIG5vdCBhbGxvdyB0aGUgYG5nRG9DaGVja2AgaG9vayB0byB0cmlnZ2VyIGEgY2hhbmdlIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudC4gSXQgd2lsbCBlaXRoZXIgdGhyb3cgYW5cbiAqICAgZXJyb3Igb3IgZG8gbm90aGluZyBkZXBlbmRpbmcgdXBvbiB0aGUgc3RhdGUgb2YgYGVuYWJsZVByb2RNb2RlKClgLlxuICpcbiAqICMjIyMgTGlmZS1jeWNsZSBob29rIGV4YW1wbGVzXG4gKlxuICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB5b3UgY2FuIGNoZWNrIGZvciBtdXRhdGlvbnMgdG8gYSBEYXRlIG9iamVjdCBldmVuIHRob3VnaCB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdFxuICogaGFzIG5vdCBjaGFuZ2VkLlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJkb0NoZWNrRGF0ZUV4YW1wbGVcIiBtb2R1bGU9XCJkby1jaGVjay1tb2R1bGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgIGFuZ3VsYXIubW9kdWxlKCdkby1jaGVjay1tb2R1bGUnLCBbXSlcbiAqICAgICAgIC5jb21wb25lbnQoJ2FwcCcsIHtcbiAqICAgICAgICAgdGVtcGxhdGU6XG4gKiAgICAgICAgICAgJ01vbnRoOiA8aW5wdXQgbmctbW9kZWw9XCIkY3RybC5tb250aFwiIG5nLWNoYW5nZT1cIiRjdHJsLnVwZGF0ZURhdGUoKVwiPicgK1xuICogICAgICAgICAgICdEYXRlOiB7eyAkY3RybC5kYXRlIH19JyArXG4gKiAgICAgICAgICAgJzx0ZXN0IGRhdGU9XCIkY3RybC5kYXRlXCI+PC90ZXN0PicsXG4gKiAgICAgICAgIGNvbnRyb2xsZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XG4gKiAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMuZGF0ZS5nZXRNb250aCgpO1xuICogICAgICAgICAgIHRoaXMudXBkYXRlRGF0ZSA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgICAgdGhpcy5kYXRlLnNldE1vbnRoKHRoaXMubW9udGgpO1xuICogICAgICAgICAgIH07XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0pXG4gKiAgICAgICAuY29tcG9uZW50KCd0ZXN0Jywge1xuICogICAgICAgICBiaW5kaW5nczogeyBkYXRlOiAnPCcgfSxcbiAqICAgICAgICAgdGVtcGxhdGU6XG4gKiAgICAgICAgICAgJzxwcmU+e3sgJGN0cmwubG9nIHwganNvbiB9fTwvcHJlPicsXG4gKiAgICAgICAgIGNvbnRyb2xsZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIHZhciBwcmV2aW91c1ZhbHVlO1xuICogICAgICAgICAgIHRoaXMubG9nID0gW107XG4gKiAgICAgICAgICAgdGhpcy4kZG9DaGVjayA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRoaXMuZGF0ZSAmJiB0aGlzLmRhdGUudmFsdWVPZigpO1xuICogICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkge1xuICogICAgICAgICAgICAgICB0aGlzLmxvZy5wdXNoKCdkb0NoZWNrOiBkYXRlIG11dGF0ZWQ6ICcgKyB0aGlzLmRhdGUpO1xuICogICAgICAgICAgICAgICBwcmV2aW91c1ZhbHVlID0gY3VycmVudFZhbHVlO1xuICogICAgICAgICAgICAgfVxuICogICAgICAgICAgIH07XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPGFwcD48L2FwcD5cbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIFRoaXMgZXhhbXBsZSBzaG93IGhvdyB5b3UgbWlnaHQgdXNlIGAkZG9DaGVja2AgdG8gdHJpZ2dlciBjaGFuZ2VzIGluIHlvdXIgY29tcG9uZW50J3MgaW5wdXRzIGV2ZW4gaWYgdGhlXG4gKiBhY3R1YWwgaWRlbnRpdHkgb2YgdGhlIGNvbXBvbmVudCBkb2Vzbid0IGNoYW5nZS4gKEJlIGF3YXJlIHRoYXQgY2xvbmluZyBhbmQgZGVlcCBlcXVhbGl0eSBjaGVja3Mgb24gbGFyZ2VcbiAqIGFycmF5cyBvciBvYmplY3RzIGNhbiBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIHlvdXIgYXBwbGljYXRpb24gcGVyZm9ybWFuY2UpXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cImRvQ2hlY2tBcnJheUV4YW1wbGVcIiBtb2R1bGU9XCJkby1jaGVjay1tb2R1bGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8ZGl2IG5nLWluaXQ9XCJpdGVtcyA9IFtdXCI+XG4gKiAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiaXRlbXMucHVzaChpdGVtcy5sZW5ndGgpXCI+QWRkIEl0ZW08L2J1dHRvbj5cbiAqICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJpdGVtcyA9IFtdXCI+UmVzZXQgSXRlbXM8L2J1dHRvbj5cbiAqICAgICAgIDxwcmU+e3sgaXRlbXMgfX08L3ByZT5cbiAqICAgICAgIDx0ZXN0IGl0ZW1zPVwiaXRlbXNcIj48L3Rlc3Q+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgICBhbmd1bGFyLm1vZHVsZSgnZG8tY2hlY2stbW9kdWxlJywgW10pXG4gKiAgICAgICAgLmNvbXBvbmVudCgndGVzdCcsIHtcbiAqICAgICAgICAgIGJpbmRpbmdzOiB7IGl0ZW1zOiAnPCcgfSxcbiAqICAgICAgICAgIHRlbXBsYXRlOlxuICogICAgICAgICAgICAnPHByZT57eyAkY3RybC5sb2cgfCBqc29uIH19PC9wcmU+JyxcbiAqICAgICAgICAgIGNvbnRyb2xsZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgICB0aGlzLmxvZyA9IFtdO1xuICpcbiAqICAgICAgICAgICAgdGhpcy4kZG9DaGVjayA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zX3JlZiAhPT0gdGhpcy5pdGVtcykge1xuICogICAgICAgICAgICAgICAgdGhpcy5sb2cucHVzaCgnZG9DaGVjazogaXRlbXMgY2hhbmdlZCcpO1xuICogICAgICAgICAgICAgICAgdGhpcy5pdGVtc19yZWYgPSB0aGlzLml0ZW1zO1xuICogICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICBpZiAoIWFuZ3VsYXIuZXF1YWxzKHRoaXMuaXRlbXNfY2xvbmUsIHRoaXMuaXRlbXMpKSB7XG4gKiAgICAgICAgICAgICAgICB0aGlzLmxvZy5wdXNoKCdkb0NoZWNrOiBpdGVtcyBtdXRhdGVkJyk7XG4gKiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zX2Nsb25lID0gYW5ndWxhci5jb3B5KHRoaXMuaXRlbXMpO1xuICogICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgfTtcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqXG4gKiAjIyMgRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0XG4gKlxuICogVGhlIGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdCBwcm92aWRlcyBpbnN0cnVjdGlvbnMgdG8gdGhlIHtAbGluayBuZy4kY29tcGlsZVxuICogY29tcGlsZXJ9LiBUaGUgYXR0cmlidXRlcyBhcmU6XG4gKlxuICogIyMjIyBgbXVsdGlFbGVtZW50YFxuICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB0cnVlIChkZWZhdWx0IGlzIGBmYWxzZWApLCB0aGUgSFRNTCBjb21waWxlciB3aWxsIGNvbGxlY3QgRE9NIG5vZGVzIGJldHdlZW5cbiAqIG5vZGVzIHdpdGggdGhlIGF0dHJpYnV0ZXMgYGRpcmVjdGl2ZS1uYW1lLXN0YXJ0YCBhbmQgYGRpcmVjdGl2ZS1uYW1lLWVuZGAsIGFuZCBncm91cCB0aGVtXG4gKiB0b2dldGhlciBhcyB0aGUgZGlyZWN0aXZlIGVsZW1lbnRzLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoaXMgZmVhdHVyZSBiZSB1c2VkIG9uIGRpcmVjdGl2ZXNcbiAqIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgYmVoYXZpb3JhbCAoc3VjaCBhcyB7QGxpbmsgbmdDbGlja30pLCBhbmQgd2hpY2hcbiAqIGRvIG5vdCBtYW5pcHVsYXRlIG9yIHJlcGxhY2UgY2hpbGQgbm9kZXMgKHN1Y2ggYXMge0BsaW5rIG5nSW5jbHVkZX0pLlxuICpcbiAqICMjIyMgYHByaW9yaXR5YFxuICogV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZGlyZWN0aXZlcyBkZWZpbmVkIG9uIGEgc2luZ2xlIERPTSBlbGVtZW50LCBzb21ldGltZXMgaXRcbiAqIGlzIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlyZWN0aXZlcyBhcmUgYXBwbGllZC4gVGhlIGBwcmlvcml0eWAgaXMgdXNlZFxuICogdG8gc29ydCB0aGUgZGlyZWN0aXZlcyBiZWZvcmUgdGhlaXIgYGNvbXBpbGVgIGZ1bmN0aW9ucyBnZXQgY2FsbGVkLiBQcmlvcml0eSBpcyBkZWZpbmVkIGFzIGFcbiAqIG51bWJlci4gRGlyZWN0aXZlcyB3aXRoIGdyZWF0ZXIgbnVtZXJpY2FsIGBwcmlvcml0eWAgYXJlIGNvbXBpbGVkIGZpcnN0LiBQcmUtbGluayBmdW5jdGlvbnNcbiAqIGFyZSBhbHNvIHJ1biBpbiBwcmlvcml0eSBvcmRlciwgYnV0IHBvc3QtbGluayBmdW5jdGlvbnMgYXJlIHJ1biBpbiByZXZlcnNlIG9yZGVyLiBUaGUgb3JkZXJcbiAqIG9mIGRpcmVjdGl2ZXMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBpcyB1bmRlZmluZWQuIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIGAwYC5cbiAqXG4gKiAjIyMjIGB0ZXJtaW5hbGBcbiAqIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIGN1cnJlbnQgYHByaW9yaXR5YCB3aWxsIGJlIHRoZSBsYXN0IHNldCBvZiBkaXJlY3RpdmVzXG4gKiB3aGljaCB3aWxsIGV4ZWN1dGUgKGFueSBkaXJlY3RpdmVzIGF0IHRoZSBjdXJyZW50IHByaW9yaXR5IHdpbGwgc3RpbGwgZXhlY3V0ZVxuICogYXMgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiBvbiBzYW1lIGBwcmlvcml0eWAgaXMgdW5kZWZpbmVkKS4gTm90ZSB0aGF0IGV4cHJlc3Npb25zXG4gKiBhbmQgb3RoZXIgZGlyZWN0aXZlcyB1c2VkIGluIHRoZSBkaXJlY3RpdmUncyB0ZW1wbGF0ZSB3aWxsIGFsc28gYmUgZXhjbHVkZWQgZnJvbSBleGVjdXRpb24uXG4gKlxuICogIyMjIyBgc2NvcGVgXG4gKiBUaGUgc2NvcGUgcHJvcGVydHkgY2FuIGJlIGBmYWxzZWAsIGB0cnVlYCwgb3IgYW4gb2JqZWN0OlxuICpcbiAqICogKipgZmFsc2VgIChkZWZhdWx0KToqKiBObyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSBkaXJlY3RpdmUuIFRoZSBkaXJlY3RpdmUgd2lsbCB1c2UgaXRzXG4gKiBwYXJlbnQncyBzY29wZS5cbiAqXG4gKiAqICoqYHRydWVgOioqIEEgbmV3IGNoaWxkIHNjb3BlIHRoYXQgcHJvdG90eXBpY2FsbHkgaW5oZXJpdHMgZnJvbSBpdHMgcGFyZW50IHdpbGwgYmUgY3JlYXRlZCBmb3JcbiAqIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50LiBJZiBtdWx0aXBsZSBkaXJlY3RpdmVzIG9uIHRoZSBzYW1lIGVsZW1lbnQgcmVxdWVzdCBhIG5ldyBzY29wZSxcbiAqIG9ubHkgb25lIG5ldyBzY29wZSBpcyBjcmVhdGVkLlxuICpcbiAqICogKipgey4uLn1gIChhbiBvYmplY3QgaGFzaCk6KiogQSBuZXcgXCJpc29sYXRlXCIgc2NvcGUgaXMgY3JlYXRlZCBmb3IgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuIFRoZVxuICogJ2lzb2xhdGUnIHNjb3BlIGRpZmZlcnMgZnJvbSBub3JtYWwgc2NvcGUgaW4gdGhhdCBpdCBkb2VzIG5vdCBwcm90b3R5cGljYWxseSBpbmhlcml0IGZyb20gaXRzIHBhcmVudFxuICogc2NvcGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gY3JlYXRpbmcgcmV1c2FibGUgY29tcG9uZW50cywgd2hpY2ggc2hvdWxkIG5vdCBhY2NpZGVudGFsbHkgcmVhZCBvciBtb2RpZnlcbiAqIGRhdGEgaW4gdGhlIHBhcmVudCBzY29wZS5cbiAqXG4gKiBUaGUgJ2lzb2xhdGUnIHNjb3BlIG9iamVjdCBoYXNoIGRlZmluZXMgYSBzZXQgb2YgbG9jYWwgc2NvcGUgcHJvcGVydGllcyBkZXJpdmVkIGZyb20gYXR0cmlidXRlcyBvbiB0aGVcbiAqIGRpcmVjdGl2ZSdzIGVsZW1lbnQuIFRoZXNlIGxvY2FsIHByb3BlcnRpZXMgYXJlIHVzZWZ1bCBmb3IgYWxpYXNpbmcgdmFsdWVzIGZvciB0ZW1wbGF0ZXMuIFRoZSBrZXlzIGluXG4gKiB0aGUgb2JqZWN0IGhhc2ggbWFwIHRvIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgaXNvbGF0ZSBzY29wZTsgdGhlIHZhbHVlcyBkZWZpbmUgaG93IHRoZSBwcm9wZXJ0eVxuICogaXMgYm91bmQgdG8gdGhlIHBhcmVudCBzY29wZSwgdmlhIG1hdGNoaW5nIGF0dHJpYnV0ZXMgb24gdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQ6XG4gKlxuICogKiBgQGAgb3IgYEBhdHRyYCAtIGJpbmQgYSBsb2NhbCBzY29wZSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgb2YgRE9NIGF0dHJpYnV0ZS4gVGhlIHJlc3VsdCBpc1xuICogICBhbHdheXMgYSBzdHJpbmcgc2luY2UgRE9NIGF0dHJpYnV0ZXMgYXJlIHN0cmluZ3MuIElmIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZVxuICogICBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBuYW1lLiBHaXZlbiBgPG15LWNvbXBvbmVudFxuICogICBteS1hdHRyPVwiaGVsbG8ge3tuYW1lfX1cIj5gIGFuZCB0aGUgaXNvbGF0ZSBzY29wZSBkZWZpbml0aW9uIGBzY29wZTogeyBsb2NhbE5hbWU6J0BteUF0dHInIH1gLFxuICogICB0aGUgZGlyZWN0aXZlJ3Mgc2NvcGUgcHJvcGVydHkgYGxvY2FsTmFtZWAgd2lsbCByZWZsZWN0IHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgb2YgYGhlbGxvXG4gKiAgIHt7bmFtZX19YC4gQXMgdGhlIGBuYW1lYCBhdHRyaWJ1dGUgY2hhbmdlcyBzbyB3aWxsIHRoZSBgbG9jYWxOYW1lYCBwcm9wZXJ0eSBvbiB0aGUgZGlyZWN0aXZlJ3NcbiAqICAgc2NvcGUuIFRoZSBgbmFtZWAgaXMgcmVhZCBmcm9tIHRoZSBwYXJlbnQgc2NvcGUgKG5vdCB0aGUgZGlyZWN0aXZlJ3Mgc2NvcGUpLlxuICpcbiAqICogYD1gIG9yIGA9YXR0cmAgLSBzZXQgdXAgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIGxvY2FsIHNjb3BlIHByb3BlcnR5IGFuZCBhbiBleHByZXNzaW9uXG4gKiAgIHBhc3NlZCB2aWEgdGhlIGF0dHJpYnV0ZSBgYXR0cmAuIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGFyZW50IHNjb3BlLlxuICogICBJZiBubyBgYXR0cmAgbmFtZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbG9jYWxcbiAqICAgbmFtZS4gR2l2ZW4gYDxteS1jb21wb25lbnQgbXktYXR0cj1cInBhcmVudE1vZGVsXCI+YCBhbmQgdGhlIGlzb2xhdGUgc2NvcGUgZGVmaW5pdGlvbiBgc2NvcGU6IHtcbiAqICAgbG9jYWxNb2RlbDogJz1teUF0dHInIH1gLCB0aGUgcHJvcGVydHkgYGxvY2FsTW9kZWxgIG9uIHRoZSBkaXJlY3RpdmUncyBzY29wZSB3aWxsIHJlZmxlY3QgdGhlXG4gKiAgIHZhbHVlIG9mIGBwYXJlbnRNb2RlbGAgb24gdGhlIHBhcmVudCBzY29wZS4gQ2hhbmdlcyB0byBgcGFyZW50TW9kZWxgIHdpbGwgYmUgcmVmbGVjdGVkIGluXG4gKiAgIGBsb2NhbE1vZGVsYCBhbmQgdmljZSB2ZXJzYS4gT3B0aW9uYWwgYXR0cmlidXRlcyBzaG91bGQgYmUgbWFya2VkIGFzIHN1Y2ggd2l0aCBhIHF1ZXN0aW9uIG1hcms6XG4gKiAgIGA9P2Agb3IgYD0/YXR0cmAuIElmIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gaXMgbm9uLWFzc2lnbmFibGUsIG9yIGlmIHRoZSBhdHRyaWJ1dGUgaXNuJ3RcbiAqICAgb3B0aW9uYWwgYW5kIGRvZXNuJ3QgZXhpc3QsIGFuIGV4Y2VwdGlvbiAoe0BsaW5rIGVycm9yLyRjb21waWxlL25vbmFzc2lnbiBgJGNvbXBpbGU6bm9uYXNzaWduYH0pXG4gKiAgIHdpbGwgYmUgdGhyb3duIHVwb24gZGlzY292ZXJpbmcgY2hhbmdlcyB0byB0aGUgbG9jYWwgdmFsdWUsIHNpbmNlIGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0byBzeW5jXG4gKiAgIHRoZW0gYmFjayB0byB0aGUgcGFyZW50IHNjb3BlLiBCeSBkZWZhdWx0LCB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIGAkd2F0Y2hgfVxuICogICBtZXRob2QgaXMgdXNlZCBmb3IgdHJhY2tpbmcgY2hhbmdlcywgYW5kIHRoZSBlcXVhbGl0eSBjaGVjayBpcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkuXG4gKiAgIEhvd2V2ZXIsIGlmIGFuIG9iamVjdCBsaXRlcmFsIG9yIGFuIGFycmF5IGxpdGVyYWwgaXMgcGFzc2VkIGFzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24sIHRoZVxuICogICBlcXVhbGl0eSBjaGVjayBpcyBkb25lIGJ5IHZhbHVlICh1c2luZyB0aGUge0BsaW5rIGFuZ3VsYXIuZXF1YWxzfSBmdW5jdGlvbikuIEl0J3MgYWxzbyBwb3NzaWJsZVxuICogICB0byB3YXRjaCB0aGUgZXZhbHVhdGVkIHZhbHVlIHNoYWxsb3dseSB3aXRoIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaENvbGxlY3Rpb25cbiAqICAgYCR3YXRjaENvbGxlY3Rpb25gfTogdXNlIGA9KmAgb3IgYD0qYXR0cmAgKGA9Kj9gIG9yIGA9Kj9hdHRyYCBpZiB0aGUgYXR0cmlidXRlIGlzIG9wdGlvbmFsKS5cbiAqXG4gICogKiBgPGAgb3IgYDxhdHRyYCAtIHNldCB1cCBhIG9uZS13YXkgKG9uZS1kaXJlY3Rpb25hbCkgYmluZGluZyBiZXR3ZWVuIGEgbG9jYWwgc2NvcGUgcHJvcGVydHkgYW5kIGFuXG4gKiAgIGV4cHJlc3Npb24gcGFzc2VkIHZpYSB0aGUgYXR0cmlidXRlIGBhdHRyYC4gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZVxuICogICBwYXJlbnQgc2NvcGUuIElmIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZVxuICogICBsb2NhbCBuYW1lLiBZb3UgY2FuIGFsc28gbWFrZSB0aGUgYmluZGluZyBvcHRpb25hbCBieSBhZGRpbmcgYD9gOiBgPD9gIG9yIGA8P2F0dHJgLlxuICpcbiAqICAgRm9yIGV4YW1wbGUsIGdpdmVuIGA8bXktY29tcG9uZW50IG15LWF0dHI9XCJwYXJlbnRNb2RlbFwiPmAgYW5kIGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9mXG4gKiAgIGBzY29wZTogeyBsb2NhbE1vZGVsOic8bXlBdHRyJyB9YCwgdGhlbiB0aGUgaXNvbGF0ZWQgc2NvcGUgcHJvcGVydHkgYGxvY2FsTW9kZWxgIHdpbGwgcmVmbGVjdCB0aGVcbiAqICAgdmFsdWUgb2YgYHBhcmVudE1vZGVsYCBvbiB0aGUgcGFyZW50IHNjb3BlLiBBbnkgY2hhbmdlcyB0byBgcGFyZW50TW9kZWxgIHdpbGwgYmUgcmVmbGVjdGVkXG4gKiAgIGluIGBsb2NhbE1vZGVsYCwgYnV0IGNoYW5nZXMgaW4gYGxvY2FsTW9kZWxgIHdpbGwgbm90IHJlZmxlY3QgaW4gYHBhcmVudE1vZGVsYC4gVGhlcmUgYXJlIGhvd2V2ZXJcbiAqICAgdHdvIGNhdmVhdHM6XG4gKiAgICAgMS4gb25lLXdheSBiaW5kaW5nIGRvZXMgbm90IGNvcHkgdGhlIHZhbHVlIGZyb20gdGhlIHBhcmVudCB0byB0aGUgaXNvbGF0ZSBzY29wZSwgaXQgc2ltcGx5XG4gKiAgICAgc2V0cyB0aGUgc2FtZSB2YWx1ZS4gVGhhdCBtZWFucyBpZiB5b3VyIGJvdW5kIHZhbHVlIGlzIGFuIG9iamVjdCwgY2hhbmdlcyB0byBpdHMgcHJvcGVydGllc1xuICogICAgIGluIHRoZSBpc29sYXRlZCBzY29wZSB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgcGFyZW50IHNjb3BlIChiZWNhdXNlIGJvdGggcmVmZXJlbmNlIHRoZSBzYW1lIG9iamVjdCkuXG4gKiAgICAgMi4gb25lLXdheSBiaW5kaW5nIHdhdGNoZXMgY2hhbmdlcyB0byB0aGUgKippZGVudGl0eSoqIG9mIHRoZSBwYXJlbnQgdmFsdWUuIFRoYXQgbWVhbnMgdGhlXG4gKiAgICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIGAkd2F0Y2hgfSBvbiB0aGUgcGFyZW50IHZhbHVlIG9ubHkgZmlyZXMgaWYgdGhlIHJlZmVyZW5jZVxuICogICAgIHRvIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC4gSW4gbW9zdCBjYXNlcywgdGhpcyBzaG91bGQgbm90IGJlIG9mIGNvbmNlcm4sIGJ1dCBjYW4gYmUgaW1wb3J0YW50XG4gKiAgICAgdG8ga25vdyBpZiB5b3Ugb25lLXdheSBiaW5kIHRvIGFuIG9iamVjdCwgYW5kIHRoZW4gcmVwbGFjZSB0aGF0IG9iamVjdCBpbiB0aGUgaXNvbGF0ZWQgc2NvcGUuXG4gKiAgICAgSWYgeW91IG5vdyBjaGFuZ2UgYSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IGluIHlvdXIgcGFyZW50IHNjb3BlLCB0aGUgY2hhbmdlIHdpbGwgbm90IGJlXG4gKiAgICAgcHJvcGFnYXRlZCB0byB0aGUgaXNvbGF0ZWQgc2NvcGUsIGJlY2F1c2UgdGhlIGlkZW50aXR5IG9mIHRoZSBvYmplY3Qgb24gdGhlIHBhcmVudCBzY29wZVxuICogICAgIGhhcyBub3QgY2hhbmdlZC4gSW5zdGVhZCB5b3UgbXVzdCBhc3NpZ24gYSBuZXcgb2JqZWN0LlxuICpcbiAqICAgT25lLXdheSBiaW5kaW5nIGlzIHVzZWZ1bCBpZiB5b3UgZG8gbm90IHBsYW4gdG8gcHJvcGFnYXRlIGNoYW5nZXMgdG8geW91ciBpc29sYXRlZCBzY29wZSBiaW5kaW5nc1xuICogICBiYWNrIHRvIHRoZSBwYXJlbnQuIEhvd2V2ZXIsIGl0IGRvZXMgbm90IG1ha2UgdGhpcyBjb21wbGV0ZWx5IGltcG9zc2libGUuXG4gKlxuICogKiBgJmAgb3IgYCZhdHRyYCAtIHByb3ZpZGVzIGEgd2F5IHRvIGV4ZWN1dGUgYW4gZXhwcmVzc2lvbiBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGFyZW50IHNjb3BlLiBJZlxuICogICBubyBgYXR0cmAgbmFtZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbG9jYWwgbmFtZS5cbiAqICAgR2l2ZW4gYDxteS1jb21wb25lbnQgbXktYXR0cj1cImNvdW50ID0gY291bnQgKyB2YWx1ZVwiPmAgYW5kIHRoZSBpc29sYXRlIHNjb3BlIGRlZmluaXRpb24gYHNjb3BlOiB7XG4gKiAgIGxvY2FsRm46JyZteUF0dHInIH1gLCB0aGUgaXNvbGF0ZSBzY29wZSBwcm9wZXJ0eSBgbG9jYWxGbmAgd2lsbCBwb2ludCB0byBhIGZ1bmN0aW9uIHdyYXBwZXIgZm9yXG4gKiAgIHRoZSBgY291bnQgPSBjb3VudCArIHZhbHVlYCBleHByZXNzaW9uLiBPZnRlbiBpdCdzIGRlc2lyYWJsZSB0byBwYXNzIGRhdGEgZnJvbSB0aGUgaXNvbGF0ZWQgc2NvcGVcbiAqICAgdmlhIGFuIGV4cHJlc3Npb24gdG8gdGhlIHBhcmVudCBzY29wZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBwYXNzaW5nIGEgbWFwIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzXG4gKiAgIGFuZCB2YWx1ZXMgaW50byB0aGUgZXhwcmVzc2lvbiB3cmFwcGVyIGZuLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGV4cHJlc3Npb24gaXMgYGluY3JlbWVudChhbW91bnQpYFxuICogICB0aGVuIHdlIGNhbiBzcGVjaWZ5IHRoZSBhbW91bnQgdmFsdWUgYnkgY2FsbGluZyB0aGUgYGxvY2FsRm5gIGFzIGBsb2NhbEZuKHthbW91bnQ6IDIyfSlgLlxuICpcbiAqIEluIGdlbmVyYWwgaXQncyBwb3NzaWJsZSB0byBhcHBseSBtb3JlIHRoYW4gb25lIGRpcmVjdGl2ZSB0byBvbmUgZWxlbWVudCwgYnV0IHRoZXJlIG1pZ2h0IGJlIGxpbWl0YXRpb25zXG4gKiBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2Ygc2NvcGUgcmVxdWlyZWQgYnkgdGhlIGRpcmVjdGl2ZXMuIFRoZSBmb2xsb3dpbmcgcG9pbnRzIHdpbGwgaGVscCBleHBsYWluIHRoZXNlIGxpbWl0YXRpb25zLlxuICogRm9yIHNpbXBsaWNpdHkgb25seSB0d28gZGlyZWN0aXZlcyBhcmUgdGFrZW4gaW50byBhY2NvdW50LCBidXQgaXQgaXMgYWxzbyBhcHBsaWNhYmxlIGZvciBzZXZlcmFsIGRpcmVjdGl2ZXM6XG4gKlxuICogKiAqKm5vIHNjb3BlKiogKyAqKm5vIHNjb3BlKiogPT4gVHdvIGRpcmVjdGl2ZXMgd2hpY2ggZG9uJ3QgcmVxdWlyZSB0aGVpciBvd24gc2NvcGUgd2lsbCB1c2UgdGhlaXIgcGFyZW50J3Mgc2NvcGVcbiAqICogKipjaGlsZCBzY29wZSoqICsgKipubyBzY29wZSoqID0+ICBCb3RoIGRpcmVjdGl2ZXMgd2lsbCBzaGFyZSBvbmUgc2luZ2xlIGNoaWxkIHNjb3BlXG4gKiAqICoqY2hpbGQgc2NvcGUqKiArICoqY2hpbGQgc2NvcGUqKiA9PiAgQm90aCBkaXJlY3RpdmVzIHdpbGwgc2hhcmUgb25lIHNpbmdsZSBjaGlsZCBzY29wZVxuICogKiAqKmlzb2xhdGVkIHNjb3BlKiogKyAqKm5vIHNjb3BlKiogPT4gIFRoZSBpc29sYXRlZCBkaXJlY3RpdmUgd2lsbCB1c2UgaXQncyBvd24gY3JlYXRlZCBpc29sYXRlZCBzY29wZS4gVGhlIG90aGVyIGRpcmVjdGl2ZSB3aWxsIHVzZVxuICogaXRzIHBhcmVudCdzIHNjb3BlXG4gKiAqICoqaXNvbGF0ZWQgc2NvcGUqKiArICoqY2hpbGQgc2NvcGUqKiA9PiAgKipXb24ndCB3b3JrISoqIE9ubHkgb25lIHNjb3BlIGNhbiBiZSByZWxhdGVkIHRvIG9uZSBlbGVtZW50LiBUaGVyZWZvcmUgdGhlc2UgZGlyZWN0aXZlcyBjYW5ub3RcbiAqIGJlIGFwcGxpZWQgdG8gdGhlIHNhbWUgZWxlbWVudC5cbiAqICogKippc29sYXRlZCBzY29wZSoqICsgKippc29sYXRlZCBzY29wZSoqICA9PiAgKipXb24ndCB3b3JrISoqIE9ubHkgb25lIHNjb3BlIGNhbiBiZSByZWxhdGVkIHRvIG9uZSBlbGVtZW50LiBUaGVyZWZvcmUgdGhlc2UgZGlyZWN0aXZlc1xuICogY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHNhbWUgZWxlbWVudC5cbiAqXG4gKlxuICogIyMjIyBgYmluZFRvQ29udHJvbGxlcmBcbiAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBiaW5kIHNjb3BlIHByb3BlcnRpZXMgZGlyZWN0bHkgdG8gdGhlIGNvbnRyb2xsZXIuIEl0IGNhbiBiZSBlaXRoZXJcbiAqIGB0cnVlYCBvciBhbiBvYmplY3QgaGFzaCB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYHNjb3BlYCBwcm9wZXJ0eS5cbiAqXG4gKiBXaGVuIGFuIGlzb2xhdGUgc2NvcGUgaXMgdXNlZCBmb3IgYSBkaXJlY3RpdmUgKHNlZSBhYm92ZSksIGBiaW5kVG9Db250cm9sbGVyOiB0cnVlYCB3aWxsXG4gKiBhbGxvdyBhIGNvbXBvbmVudCB0byBoYXZlIGl0cyBwcm9wZXJ0aWVzIGJvdW5kIHRvIHRoZSBjb250cm9sbGVyLCByYXRoZXIgdGhhbiB0byBzY29wZS5cbiAqXG4gKiBBZnRlciB0aGUgY29udHJvbGxlciBpcyBpbnN0YW50aWF0ZWQsIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgaXNvbGF0ZSBzY29wZSBiaW5kaW5ncyB3aWxsIGJlIGJvdW5kIHRvIHRoZSBjb250cm9sbGVyXG4gKiBwcm9wZXJ0aWVzLiBZb3UgY2FuIGFjY2VzcyB0aGVzZSBiaW5kaW5ncyBvbmNlIHRoZXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IHByb3ZpZGluZyBhIGNvbnRyb2xsZXIgbWV0aG9kIGNhbGxlZFxuICogYCRvbkluaXRgLCB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBjb250cm9sbGVycyBvbiBhbiBlbGVtZW50IGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBhbmQgaGFkIHRoZWlyIGJpbmRpbmdzXG4gKiBpbml0aWFsaXplZC5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipEZXByZWNhdGlvbiB3YXJuaW5nOioqIGFsdGhvdWdoIGJpbmRpbmdzIGZvciBub24tRVM2IGNsYXNzIGNvbnRyb2xsZXJzIGFyZSBjdXJyZW50bHlcbiAqIGJvdW5kIHRvIGB0aGlzYCBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgY29uc3RydWN0b3IgaXMgY2FsbGVkLCB0aGlzIHVzZSBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHBsYWNlIGluaXRpYWxpemF0aW9uXG4gKiBjb2RlIHRoYXQgcmVsaWVzIHVwb24gYmluZGluZ3MgaW5zaWRlIGEgYCRvbkluaXRgIG1ldGhvZCBvbiB0aGUgY29udHJvbGxlciwgaW5zdGVhZC5cbiAqIDwvZGl2PlxuICpcbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IGBiaW5kVG9Db250cm9sbGVyYCB0byBhbiBvYmplY3QgaGFzaCB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYHNjb3BlYCBwcm9wZXJ0eS5cbiAqIFRoaXMgd2lsbCBzZXQgdXAgdGhlIHNjb3BlIGJpbmRpbmdzIHRvIHRoZSBjb250cm9sbGVyIGRpcmVjdGx5LiBOb3RlIHRoYXQgYHNjb3BlYCBjYW4gc3RpbGwgYmUgdXNlZFxuICogdG8gZGVmaW5lIHdoaWNoIGtpbmQgb2Ygc2NvcGUgaXMgY3JlYXRlZC4gQnkgZGVmYXVsdCwgbm8gc2NvcGUgaXMgY3JlYXRlZC4gVXNlIGBzY29wZToge31gIHRvIGNyZWF0ZSBhbiBpc29sYXRlXG4gKiBzY29wZSAodXNlZnVsIGZvciBjb21wb25lbnQgZGlyZWN0aXZlcykuXG4gKlxuICogSWYgYm90aCBgYmluZFRvQ29udHJvbGxlcmAgYW5kIGBzY29wZWAgYXJlIGRlZmluZWQgYW5kIGhhdmUgb2JqZWN0IGhhc2hlcywgYGJpbmRUb0NvbnRyb2xsZXJgIG92ZXJyaWRlcyBgc2NvcGVgLlxuICpcbiAqXG4gKiAjIyMjIGBjb250cm9sbGVyYFxuICogQ29udHJvbGxlciBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gVGhlIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIGJlZm9yZSB0aGVcbiAqIHByZS1saW5raW5nIHBoYXNlIGFuZCBjYW4gYmUgYWNjZXNzZWQgYnkgb3RoZXIgZGlyZWN0aXZlcyAoc2VlXG4gKiBgcmVxdWlyZWAgYXR0cmlidXRlKS4gVGhpcyBhbGxvd3MgdGhlIGRpcmVjdGl2ZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyIGFuZCBhdWdtZW50XG4gKiBlYWNoIG90aGVyJ3MgYmVoYXZpb3IuIFRoZSBjb250cm9sbGVyIGlzIGluamVjdGFibGUgKGFuZCBzdXBwb3J0cyBicmFja2V0IG5vdGF0aW9uKSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYWxzOlxuICpcbiAqICogYCRzY29wZWAgLSBDdXJyZW50IHNjb3BlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudFxuICogKiBgJGVsZW1lbnRgIC0gQ3VycmVudCBlbGVtZW50XG4gKiAqIGAkYXR0cnNgIC0gQ3VycmVudCBhdHRyaWJ1dGVzIG9iamVjdCBmb3IgdGhlIGVsZW1lbnRcbiAqICogYCR0cmFuc2NsdWRlYCAtIEEgdHJhbnNjbHVkZSBsaW5raW5nIGZ1bmN0aW9uIHByZS1ib3VuZCB0byB0aGUgY29ycmVjdCB0cmFuc2NsdXNpb24gc2NvcGU6XG4gKiAgIGBmdW5jdGlvbihbc2NvcGVdLCBjbG9uZUxpbmtpbmdGbiwgZnV0dXJlUGFyZW50RWxlbWVudCwgc2xvdE5hbWUpYDpcbiAqICAgICogYHNjb3BlYDogKG9wdGlvbmFsKSBvdmVycmlkZSB0aGUgc2NvcGUuXG4gKiAgICAqIGBjbG9uZUxpbmtpbmdGbmA6IChvcHRpb25hbCkgYXJndW1lbnQgdG8gY3JlYXRlIGNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdHJhbnNjbHVkZWQgY29udGVudC5cbiAqICAgICogYGZ1dHVyZVBhcmVudEVsZW1lbnRgIChvcHRpb25hbCk6XG4gKiAgICAgICAgKiBkZWZpbmVzIHRoZSBwYXJlbnQgdG8gd2hpY2ggdGhlIGBjbG9uZUxpbmtpbmdGbmAgd2lsbCBhZGQgdGhlIGNsb25lZCBlbGVtZW50cy5cbiAqICAgICAgICAqIGRlZmF1bHQ6IGAkZWxlbWVudC5wYXJlbnQoKWAgcmVzcC4gYCRlbGVtZW50YCBmb3IgYHRyYW5zY2x1ZGU6J2VsZW1lbnQnYCByZXNwLiBgdHJhbnNjbHVkZTp0cnVlYC5cbiAqICAgICAgICAqIG9ubHkgbmVlZGVkIGZvciB0cmFuc2NsdWRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gbm9uIGh0bWwgZWxlbWVudHMgKGUuZy4gU1ZHIGVsZW1lbnRzKVxuICogICAgICAgICAgYW5kIHdoZW4gdGhlIGBjbG9uZUxpbmtpbmdGbmAgaXMgcGFzc2VkLFxuICogICAgICAgICAgYXMgdGhvc2UgZWxlbWVudHMgbmVlZCB0byBjcmVhdGVkIGFuZCBjbG9uZWQgaW4gYSBzcGVjaWFsIHdheSB3aGVuIHRoZXkgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGVpclxuICogICAgICAgICAgdXN1YWwgY29udGFpbmVycyAoZS5nLiBsaWtlIGA8c3ZnPmApLlxuICogICAgICAgICogU2VlIGFsc28gdGhlIGBkaXJlY3RpdmUudGVtcGxhdGVOYW1lc3BhY2VgIHByb3BlcnR5LlxuICogICAgKiBgc2xvdE5hbWVgOiAob3B0aW9uYWwpIHRoZSBuYW1lIG9mIHRoZSBzbG90IHRvIHRyYW5zY2x1ZGUuIElmIGZhbHN5IChlLmcuIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYCcnYClcbiAqICAgICAgdGhlbiB0aGUgZGVmYXVsdCB0cmFuc2NsdXNpb24gaXMgcHJvdmlkZWQuXG4gKiAgICBUaGUgYCR0cmFuc2NsdWRlYCBmdW5jdGlvbiBhbHNvIGhhcyBhIG1ldGhvZCBvbiBpdCwgYCR0cmFuc2NsdWRlLmlzU2xvdEZpbGxlZChzbG90TmFtZSlgLCB3aGljaCByZXR1cm5zXG4gKiAgICBgdHJ1ZWAgaWYgdGhlIHNwZWNpZmllZCBzbG90IGNvbnRhaW5zIGNvbnRlbnQgKGkuZS4gb25lIG9yIG1vcmUgRE9NIG5vZGVzKS5cbiAqXG4gKiAjIyMjIGByZXF1aXJlYFxuICogUmVxdWlyZSBhbm90aGVyIGRpcmVjdGl2ZSBhbmQgaW5qZWN0IGl0cyBjb250cm9sbGVyIGFzIHRoZSBmb3VydGggYXJndW1lbnQgdG8gdGhlIGxpbmtpbmcgZnVuY3Rpb24uIFRoZVxuICogYHJlcXVpcmVgIHByb3BlcnR5IGNhbiBiZSBhIHN0cmluZywgYW4gYXJyYXkgb3IgYW4gb2JqZWN0OlxuICogKiBhICoqc3RyaW5nKiogY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlIHRvIHBhc3MgdG8gdGhlIGxpbmtpbmcgZnVuY3Rpb25cbiAqICogYW4gKiphcnJheSoqIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGRpcmVjdGl2ZXMgdG8gcGFzcyB0byB0aGUgbGlua2luZyBmdW5jdGlvbi4gVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGVcbiAqIGxpbmtpbmcgZnVuY3Rpb24gd2lsbCBiZSBhbiBhcnJheSBvZiBjb250cm9sbGVycyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbmFtZXMgaW4gdGhlIGByZXF1aXJlYCBwcm9wZXJ0eVxuICogKiBhbiAqKm9iamVjdCoqIHdob3NlIHByb3BlcnR5IHZhbHVlcyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RpdmVzIHRvIHBhc3MgdG8gdGhlIGxpbmtpbmcgZnVuY3Rpb24uIFRoZSBhcmd1bWVudFxuICogcGFzc2VkIHRvIHRoZSBsaW5raW5nIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSBhbiBvYmplY3Qgd2l0aCBtYXRjaGluZyBrZXlzLCB3aG9zZSB2YWx1ZXMgd2lsbCBob2xkIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBjb250cm9sbGVycy5cbiAqXG4gKiBJZiB0aGUgYHJlcXVpcmVgIHByb3BlcnR5IGlzIGFuIG9iamVjdCBhbmQgYGJpbmRUb0NvbnRyb2xsZXJgIGlzIHRydXRoeSwgdGhlbiB0aGUgcmVxdWlyZWQgY29udHJvbGxlcnMgYXJlXG4gKiBib3VuZCB0byB0aGUgY29udHJvbGxlciB1c2luZyB0aGUga2V5cyBvZiB0aGUgYHJlcXVpcmVgIHByb3BlcnR5LiBUaGlzIGJpbmRpbmcgb2NjdXJzIGFmdGVyIGFsbCB0aGUgY29udHJvbGxlcnNcbiAqIGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBidXQgYmVmb3JlIGAkb25Jbml0YCBpcyBjYWxsZWQuXG4gKiBJZiB0aGUgbmFtZSBvZiB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBpcyB0aGUgc2FtZSBhcyB0aGUgbG9jYWwgbmFtZSAodGhlIGtleSksIHRoZSBuYW1lIGNhbiBiZVxuICogb21pdHRlZC4gRm9yIGV4YW1wbGUsIGB7cGFyZW50RGlyOiAnXl4nfWAgaXMgZXF1aXZhbGVudCB0byBge3BhcmVudERpcjogJ15ecGFyZW50RGlyJ31gLlxuICogU2VlIHRoZSB7QGxpbmsgJGNvbXBpbGVQcm92aWRlciNjb21wb25lbnR9IGhlbHBlciBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdGhpcyBjYW4gYmUgdXNlZC5cbiAqIElmIG5vIHN1Y2ggcmVxdWlyZWQgZGlyZWN0aXZlKHMpIGNhbiBiZSBmb3VuZCwgb3IgaWYgdGhlIGRpcmVjdGl2ZSBkb2VzIG5vdCBoYXZlIGEgY29udHJvbGxlciwgdGhlbiBhbiBlcnJvciBpc1xuICogcmFpc2VkICh1bmxlc3Mgbm8gbGluayBmdW5jdGlvbiBpcyBzcGVjaWZpZWQgYW5kIHRoZSByZXF1aXJlZCBjb250cm9sbGVycyBhcmUgbm90IGJlaW5nIGJvdW5kIHRvIHRoZSBkaXJlY3RpdmVcbiAqIGNvbnRyb2xsZXIsIGluIHdoaWNoIGNhc2UgZXJyb3IgY2hlY2tpbmcgaXMgc2tpcHBlZCkuIFRoZSBuYW1lIGNhbiBiZSBwcmVmaXhlZCB3aXRoOlxuICpcbiAqICogKG5vIHByZWZpeCkgLSBMb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudC4gVGhyb3cgYW4gZXJyb3IgaWYgbm90IGZvdW5kLlxuICogKiBgP2AgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBvciBwYXNzIGBudWxsYCB0byB0aGUgYGxpbmtgIGZuIGlmIG5vdCBmb3VuZC5cbiAqICogYF5gIC0gTG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIGJ5IHNlYXJjaGluZyB0aGUgZWxlbWVudCBhbmQgaXRzIHBhcmVudHMuIFRocm93IGFuIGVycm9yIGlmIG5vdCBmb3VuZC5cbiAqICogYF5eYCAtIExvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQncyBwYXJlbnRzLiBUaHJvdyBhbiBlcnJvciBpZiBub3QgZm91bmQuXG4gKiAqIGA/XmAgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQgYW5kIGl0cyBwYXJlbnRzIG9yIHBhc3NcbiAqICAgYG51bGxgIHRvIHRoZSBgbGlua2AgZm4gaWYgbm90IGZvdW5kLlxuICogKiBgP15eYCAtIEF0dGVtcHQgdG8gbG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIGJ5IHNlYXJjaGluZyB0aGUgZWxlbWVudCdzIHBhcmVudHMsIG9yIHBhc3NcbiAqICAgYG51bGxgIHRvIHRoZSBgbGlua2AgZm4gaWYgbm90IGZvdW5kLlxuICpcbiAqXG4gKiAjIyMjIGBjb250cm9sbGVyQXNgXG4gKiBJZGVudGlmaWVyIG5hbWUgZm9yIGEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sbGVyIGluIHRoZSBkaXJlY3RpdmUncyBzY29wZS5cbiAqIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sbGVyIHRvIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGUgZGlyZWN0aXZlIHRlbXBsYXRlLiBUaGlzIGlzIGVzcGVjaWFsbHlcbiAqIHVzZWZ1bCB3aGVuIGEgZGlyZWN0aXZlIGlzIHVzZWQgYXMgY29tcG9uZW50LCBpLmUuIHdpdGggYW4gYGlzb2xhdGVgIHNjb3BlLiBJdCdzIGFsc28gcG9zc2libGVcbiAqIHRvIHVzZSBpdCBpbiBhIGRpcmVjdGl2ZSB3aXRob3V0IGFuIGBpc29sYXRlYCAvIGBuZXdgIHNjb3BlLCBidXQgeW91IG5lZWQgdG8gYmUgYXdhcmUgdGhhdCB0aGVcbiAqIGBjb250cm9sbGVyQXNgIHJlZmVyZW5jZSBtaWdodCBvdmVyd3JpdGUgYSBwcm9wZXJ0eSB0aGF0IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBwYXJlbnQgc2NvcGUuXG4gKlxuICpcbiAqICMjIyMgYHJlc3RyaWN0YFxuICogU3RyaW5nIG9mIHN1YnNldCBvZiBgRUFDTWAgd2hpY2ggcmVzdHJpY3RzIHRoZSBkaXJlY3RpdmUgdG8gYSBzcGVjaWZpYyBkaXJlY3RpdmVcbiAqIGRlY2xhcmF0aW9uIHN0eWxlLiBJZiBvbWl0dGVkLCB0aGUgZGVmYXVsdHMgKGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzKSBhcmUgdXNlZC5cbiAqXG4gKiAqIGBFYCAtIEVsZW1lbnQgbmFtZSAoZGVmYXVsdCk6IGA8bXktZGlyZWN0aXZlPjwvbXktZGlyZWN0aXZlPmBcbiAqICogYEFgIC0gQXR0cmlidXRlIChkZWZhdWx0KTogYDxkaXYgbXktZGlyZWN0aXZlPVwiZXhwXCI+PC9kaXY+YFxuICogKiBgQ2AgLSBDbGFzczogYDxkaXYgY2xhc3M9XCJteS1kaXJlY3RpdmU6IGV4cDtcIj48L2Rpdj5gXG4gKiAqIGBNYCAtIENvbW1lbnQ6IGA8IS0tIGRpcmVjdGl2ZTogbXktZGlyZWN0aXZlIGV4cCAtLT5gXG4gKlxuICpcbiAqICMjIyMgYHRlbXBsYXRlTmFtZXNwYWNlYFxuICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZG9jdW1lbnQgdHlwZSB1c2VkIGJ5IHRoZSBtYXJrdXAgaW4gdGhlIHRlbXBsYXRlLlxuICogQW5ndWxhckpTIG5lZWRzIHRoaXMgaW5mb3JtYXRpb24gYXMgdGhvc2UgZWxlbWVudHMgbmVlZCB0byBiZSBjcmVhdGVkIGFuZCBjbG9uZWRcbiAqIGluIGEgc3BlY2lhbCB3YXkgd2hlbiB0aGV5IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlaXIgdXN1YWwgY29udGFpbmVycyBsaWtlIGA8c3ZnPmAgYW5kIGA8bWF0aD5gLlxuICpcbiAqICogYGh0bWxgIC0gQWxsIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBIVE1MLiBSb290IG5vZGVzIG1heSBhbHNvIGJlXG4gKiAgIHRvcC1sZXZlbCBlbGVtZW50cyBzdWNoIGFzIGA8c3ZnPmAgb3IgYDxtYXRoPmAuXG4gKiAqIGBzdmdgIC0gVGhlIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBTVkcgZWxlbWVudHMgKGV4Y2x1ZGluZyBgPG1hdGg+YCkuXG4gKiAqIGBtYXRoYCAtIFRoZSByb290IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSBhcmUgTWF0aE1MIGVsZW1lbnRzIChleGNsdWRpbmcgYDxzdmc+YCkuXG4gKlxuICogSWYgbm8gYHRlbXBsYXRlTmFtZXNwYWNlYCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIG5hbWVzcGFjZSBpcyBjb25zaWRlcmVkIHRvIGJlIGBodG1sYC5cbiAqXG4gKiAjIyMjIGB0ZW1wbGF0ZWBcbiAqIEhUTUwgbWFya3VwIHRoYXQgbWF5OlxuICogKiBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudCAoZGVmYXVsdCkuXG4gKiAqIFJlcGxhY2UgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaXRzZWxmIChpZiBgcmVwbGFjZWAgaXMgdHJ1ZSAtIERFUFJFQ0FURUQpLlxuICogKiBXcmFwIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudCAoaWYgYHRyYW5zY2x1ZGVgIGlzIHRydWUpLlxuICpcbiAqIFZhbHVlIG1heSBiZTpcbiAqXG4gKiAqIEEgc3RyaW5nLiBGb3IgZXhhbXBsZSBgPGRpdiByZWQtb24taG92ZXI+e3tkZWxldGVfc3RyfX08L2Rpdj5gLlxuICogKiBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBhcmd1bWVudHMgYHRFbGVtZW50YCBhbmQgYHRBdHRyc2AgKGRlc2NyaWJlZCBpbiB0aGUgYGNvbXBpbGVgXG4gKiAgIGZ1bmN0aW9uIGFwaSBiZWxvdykgYW5kIHJldHVybnMgYSBzdHJpbmcgdmFsdWUuXG4gKlxuICpcbiAqICMjIyMgYHRlbXBsYXRlVXJsYFxuICogVGhpcyBpcyBzaW1pbGFyIHRvIGB0ZW1wbGF0ZWAgYnV0IHRoZSB0ZW1wbGF0ZSBpcyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTCwgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQmVjYXVzZSB0ZW1wbGF0ZSBsb2FkaW5nIGlzIGFzeW5jaHJvbm91cyB0aGUgY29tcGlsZXIgd2lsbCBzdXNwZW5kIGNvbXBpbGF0aW9uIG9mIGRpcmVjdGl2ZXMgb24gdGhhdCBlbGVtZW50XG4gKiBmb3IgbGF0ZXIgd2hlbiB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gcmVzb2x2ZWQuICBJbiB0aGUgbWVhbnRpbWUgaXQgd2lsbCBjb250aW51ZSB0byBjb21waWxlIGFuZCBsaW5rXG4gKiBzaWJsaW5nIGFuZCBwYXJlbnQgZWxlbWVudHMgYXMgdGhvdWdoIHRoaXMgZWxlbWVudCBoYWQgbm90IGNvbnRhaW5lZCBhbnkgZGlyZWN0aXZlcy5cbiAqXG4gKiBUaGUgY29tcGlsZXIgZG9lcyBub3Qgc3VzcGVuZCB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHRvIHdhaXQgZm9yIHRlbXBsYXRlcyB0byBiZSBsb2FkZWQgYmVjYXVzZSB0aGlzXG4gKiB3b3VsZCByZXN1bHQgaW4gdGhlIHdob2xlIGFwcCBcInN0YWxsaW5nXCIgdW50aWwgYWxsIHRlbXBsYXRlcyBhcmUgbG9hZGVkIGFzeW5jaHJvbm91c2x5IC0gZXZlbiBpbiB0aGVcbiAqIGNhc2Ugd2hlbiBvbmx5IG9uZSBkZWVwbHkgbmVzdGVkIGRpcmVjdGl2ZSBoYXMgYHRlbXBsYXRlVXJsYC5cbiAqXG4gKiBUZW1wbGF0ZSBsb2FkaW5nIGlzIGFzeW5jaHJvbm91cyBldmVuIGlmIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiBwcmVsb2FkZWQgaW50byB0aGUge0BsaW5rICR0ZW1wbGF0ZUNhY2hlfVxuICpcbiAqIFlvdSBjYW4gc3BlY2lmeSBgdGVtcGxhdGVVcmxgIGFzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMIG9yIGFzIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvXG4gKiBhcmd1bWVudHMgYHRFbGVtZW50YCBhbmQgYHRBdHRyc2AgKGRlc2NyaWJlZCBpbiB0aGUgYGNvbXBpbGVgIGZ1bmN0aW9uIGFwaSBiZWxvdykgYW5kIHJldHVybnNcbiAqIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgdXJsLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSB0ZW1wbGF0ZSBVUkwgaXMgcGFzc2VkIHRocm91Z2gge0BsaW5rXG4gKiAkc2NlI2dldFRydXN0ZWRSZXNvdXJjZVVybCAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybH0uXG4gKlxuICpcbiAqICMjIyMgYHJlcGxhY2VgIChbKkRFUFJFQ0FURUQqIV0sIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHJlbGVhc2UgLSBpLmUuIHYyLjApXG4gKiBzcGVjaWZ5IHdoYXQgdGhlIHRlbXBsYXRlIHNob3VsZCByZXBsYWNlLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICpcbiAqICogYHRydWVgIC0gdGhlIHRlbXBsYXRlIHdpbGwgcmVwbGFjZSB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudC5cbiAqICogYGZhbHNlYCAtIHRoZSB0ZW1wbGF0ZSB3aWxsIHJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50LlxuICpcbiAqIFRoZSByZXBsYWNlbWVudCBwcm9jZXNzIG1pZ3JhdGVzIGFsbCBvZiB0aGUgYXR0cmlidXRlcyAvIGNsYXNzZXMgZnJvbSB0aGUgb2xkIGVsZW1lbnQgdG8gdGhlIG5ld1xuICogb25lLiBTZWUgdGhlIHtAbGluayBndWlkZS9kaXJlY3RpdmUjdGVtcGxhdGUtZXhwYW5kaW5nLWRpcmVjdGl2ZVxuICogRGlyZWN0aXZlcyBHdWlkZX0gZm9yIGFuIGV4YW1wbGUuXG4gKlxuICogVGhlcmUgYXJlIHZlcnkgZmV3IHNjZW5hcmlvcyB3aGVyZSBlbGVtZW50IHJlcGxhY2VtZW50IGlzIHJlcXVpcmVkIGZvciB0aGUgYXBwbGljYXRpb24gZnVuY3Rpb24sXG4gKiB0aGUgbWFpbiBvbmUgYmVpbmcgcmV1c2FibGUgY3VzdG9tIGNvbXBvbmVudHMgdGhhdCBhcmUgdXNlZCB3aXRoaW4gU1ZHIGNvbnRleHRzXG4gKiAoYmVjYXVzZSBTVkcgZG9lc24ndCB3b3JrIHdpdGggY3VzdG9tIGVsZW1lbnRzIGluIHRoZSBET00gdHJlZSkuXG4gKlxuICogIyMjIyBgdHJhbnNjbHVkZWBcbiAqIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgYXBwZWFycyBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIGRpcmVjdGl2ZS5cbiAqIFRoZSBjb250ZW50cyBhcmUgY29tcGlsZWQgYW5kIHByb3ZpZGVkIHRvIHRoZSBkaXJlY3RpdmUgYXMgYSAqKnRyYW5zY2x1c2lvbiBmdW5jdGlvbioqLiBTZWUgdGhlXG4gKiB7QGxpbmsgJGNvbXBpbGUjdHJhbnNjbHVzaW9uIFRyYW5zY2x1c2lvbn0gc2VjdGlvbiBiZWxvdy5cbiAqXG4gKlxuICogIyMjIyBgY29tcGlsZWBcbiAqXG4gKiBgYGBqc1xuICogICBmdW5jdGlvbiBjb21waWxlKHRFbGVtZW50LCB0QXR0cnMsIHRyYW5zY2x1ZGUpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBjb21waWxlIGZ1bmN0aW9uIGRlYWxzIHdpdGggdHJhbnNmb3JtaW5nIHRoZSB0ZW1wbGF0ZSBET00uIFNpbmNlIG1vc3QgZGlyZWN0aXZlcyBkbyBub3QgZG9cbiAqIHRlbXBsYXRlIHRyYW5zZm9ybWF0aW9uLCBpdCBpcyBub3QgdXNlZCBvZnRlbi4gVGhlIGNvbXBpbGUgZnVuY3Rpb24gdGFrZXMgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6XG4gKlxuICogICAqIGB0RWxlbWVudGAgLSB0ZW1wbGF0ZSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgd2hlcmUgdGhlIGRpcmVjdGl2ZSBoYXMgYmVlbiBkZWNsYXJlZC4gSXQgaXNcbiAqICAgICBzYWZlIHRvIGRvIHRlbXBsYXRlIHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBlbGVtZW50IGFuZCBjaGlsZCBlbGVtZW50cyBvbmx5LlxuICpcbiAqICAgKiBgdEF0dHJzYCAtIHRlbXBsYXRlIGF0dHJpYnV0ZXMgLSBOb3JtYWxpemVkIGxpc3Qgb2YgYXR0cmlidXRlcyBkZWNsYXJlZCBvbiB0aGlzIGVsZW1lbnQgc2hhcmVkXG4gKiAgICAgYmV0d2VlbiBhbGwgZGlyZWN0aXZlIGNvbXBpbGUgZnVuY3Rpb25zLlxuICpcbiAqICAgKiBgdHJhbnNjbHVkZWAgLSAgWypERVBSRUNBVEVEKiFdIEEgdHJhbnNjbHVkZSBsaW5raW5nIGZ1bmN0aW9uOiBgZnVuY3Rpb24oc2NvcGUsIGNsb25lTGlua2luZ0ZuKWBcbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIFRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSBhbmQgdGhlIGxpbmsgaW5zdGFuY2UgbWF5IGJlIGRpZmZlcmVudCBvYmplY3RzIGlmIHRoZSB0ZW1wbGF0ZSBoYXNcbiAqIGJlZW4gY2xvbmVkLiBGb3IgdGhpcyByZWFzb24gaXQgaXMgKipub3QqKiBzYWZlIHRvIGRvIGFueXRoaW5nIG90aGVyIHRoYW4gRE9NIHRyYW5zZm9ybWF0aW9ucyB0aGF0XG4gKiBhcHBseSB0byBhbGwgY2xvbmVkIERPTSBub2RlcyB3aXRoaW4gdGhlIGNvbXBpbGUgZnVuY3Rpb24uIFNwZWNpZmljYWxseSwgRE9NIGxpc3RlbmVyIHJlZ2lzdHJhdGlvblxuICogc2hvdWxkIGJlIGRvbmUgaW4gYSBsaW5raW5nIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGluIGEgY29tcGlsZSBmdW5jdGlvbi5cbiAqIDwvZGl2PlxuXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIFRoZSBjb21waWxlIGZ1bmN0aW9uIGNhbm5vdCBoYW5kbGUgZGlyZWN0aXZlcyB0aGF0IHJlY3Vyc2l2ZWx5IHVzZSB0aGVtc2VsdmVzIGluIHRoZWlyXG4gKiBvd24gdGVtcGxhdGVzIG9yIGNvbXBpbGUgZnVuY3Rpb25zLiBDb21waWxpbmcgdGhlc2UgZGlyZWN0aXZlcyByZXN1bHRzIGluIGFuIGluZmluaXRlIGxvb3AgYW5kXG4gKiBzdGFjayBvdmVyZmxvdyBlcnJvcnMuXG4gKlxuICogVGhpcyBjYW4gYmUgYXZvaWRlZCBieSBtYW51YWxseSB1c2luZyAkY29tcGlsZSBpbiB0aGUgcG9zdExpbmsgZnVuY3Rpb24gdG8gaW1wZXJhdGl2ZWx5IGNvbXBpbGVcbiAqIGEgZGlyZWN0aXZlJ3MgdGVtcGxhdGUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGF1dG9tYXRpYyB0ZW1wbGF0ZSBjb21waWxhdGlvbiB2aWEgYHRlbXBsYXRlYCBvclxuICogYHRlbXBsYXRlVXJsYCBkZWNsYXJhdGlvbiBvciBtYW51YWwgY29tcGlsYXRpb24gaW5zaWRlIHRoZSBjb21waWxlIGZ1bmN0aW9uLlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPlxuICogKipOb3RlOioqIFRoZSBgdHJhbnNjbHVkZWAgZnVuY3Rpb24gdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNvbXBpbGUgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgYXMgaXRcbiAqICAgZS5nLiBkb2VzIG5vdCBrbm93IGFib3V0IHRoZSByaWdodCBvdXRlciBzY29wZS4gUGxlYXNlIHVzZSB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZFxuICogICB0byB0aGUgbGluayBmdW5jdGlvbiBpbnN0ZWFkLlxuICogPC9kaXY+XG5cbiAqIEEgY29tcGlsZSBmdW5jdGlvbiBjYW4gaGF2ZSBhIHJldHVybiB2YWx1ZSB3aGljaCBjYW4gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LlxuICpcbiAqICogcmV0dXJuaW5nIGEgKHBvc3QtbGluaykgZnVuY3Rpb24gLSBpcyBlcXVpdmFsZW50IHRvIHJlZ2lzdGVyaW5nIHRoZSBsaW5raW5nIGZ1bmN0aW9uIHZpYSB0aGVcbiAqICAgYGxpbmtgIHByb3BlcnR5IG9mIHRoZSBjb25maWcgb2JqZWN0IHdoZW4gdGhlIGNvbXBpbGUgZnVuY3Rpb24gaXMgZW1wdHkuXG4gKlxuICogKiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggZnVuY3Rpb24ocykgcmVnaXN0ZXJlZCB2aWEgYHByZWAgYW5kIGBwb3N0YCBwcm9wZXJ0aWVzIC0gYWxsb3dzIHlvdSB0b1xuICogICBjb250cm9sIHdoZW4gYSBsaW5raW5nIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBsaW5raW5nIHBoYXNlLiBTZWUgaW5mbyBhYm91dFxuICogICBwcmUtbGlua2luZyBhbmQgcG9zdC1saW5raW5nIGZ1bmN0aW9ucyBiZWxvdy5cbiAqXG4gKlxuICogIyMjIyBgbGlua2BcbiAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBvbmx5IGlmIHRoZSBgY29tcGlsZWAgcHJvcGVydHkgaXMgbm90IGRlZmluZWQuXG4gKlxuICogYGBganNcbiAqICAgZnVuY3Rpb24gbGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlciwgdHJhbnNjbHVkZUZuKSB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgbGluayBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVnaXN0ZXJpbmcgRE9NIGxpc3RlbmVycyBhcyB3ZWxsIGFzIHVwZGF0aW5nIHRoZSBET00uIEl0IGlzXG4gKiBleGVjdXRlZCBhZnRlciB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gY2xvbmVkLiBUaGlzIGlzIHdoZXJlIG1vc3Qgb2YgdGhlIGRpcmVjdGl2ZSBsb2dpYyB3aWxsIGJlXG4gKiBwdXQuXG4gKlxuICogICAqIGBzY29wZWAgLSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBTY29wZX0gLSBUaGUgc2NvcGUgdG8gYmUgdXNlZCBieSB0aGVcbiAqICAgICBkaXJlY3RpdmUgZm9yIHJlZ2lzdGVyaW5nIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCB3YXRjaGVzfS5cbiAqXG4gKiAgICogYGlFbGVtZW50YCAtIGluc3RhbmNlIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aGVyZSB0aGUgZGlyZWN0aXZlIGlzIHRvIGJlIHVzZWQuIEl0IGlzIHNhZmUgdG9cbiAqICAgICBtYW5pcHVsYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudCBvbmx5IGluIGBwb3N0TGlua2AgZnVuY3Rpb24gc2luY2UgdGhlIGNoaWxkcmVuIGhhdmVcbiAqICAgICBhbHJlYWR5IGJlZW4gbGlua2VkLlxuICpcbiAqICAgKiBgaUF0dHJzYCAtIGluc3RhbmNlIGF0dHJpYnV0ZXMgLSBOb3JtYWxpemVkIGxpc3Qgb2YgYXR0cmlidXRlcyBkZWNsYXJlZCBvbiB0aGlzIGVsZW1lbnQgc2hhcmVkXG4gKiAgICAgYmV0d2VlbiBhbGwgZGlyZWN0aXZlIGxpbmtpbmcgZnVuY3Rpb25zLlxuICpcbiAqICAgKiBgY29udHJvbGxlcmAgLSB0aGUgZGlyZWN0aXZlJ3MgcmVxdWlyZWQgY29udHJvbGxlciBpbnN0YW5jZShzKSAtIEluc3RhbmNlcyBhcmUgc2hhcmVkXG4gKiAgICAgYW1vbmcgYWxsIGRpcmVjdGl2ZXMsIHdoaWNoIGFsbG93cyB0aGUgZGlyZWN0aXZlcyB0byB1c2UgdGhlIGNvbnRyb2xsZXJzIGFzIGEgY29tbXVuaWNhdGlvblxuICogICAgIGNoYW5uZWwuIFRoZSBleGFjdCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkaXJlY3RpdmUncyBgcmVxdWlyZWAgcHJvcGVydHk6XG4gKiAgICAgICAqIG5vIGNvbnRyb2xsZXIocykgcmVxdWlyZWQ6IHRoZSBkaXJlY3RpdmUncyBvd24gY29udHJvbGxlciwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgZG9lc24ndCBoYXZlIG9uZVxuICogICAgICAgKiBgc3RyaW5nYDogdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqICAgICAgICogYGFycmF5YDogYXJyYXkgb2YgY29udHJvbGxlciBpbnN0YW5jZXNcbiAqXG4gKiAgICAgSWYgYSByZXF1aXJlZCBjb250cm9sbGVyIGNhbm5vdCBiZSBmb3VuZCwgYW5kIGl0IGlzIG9wdGlvbmFsLCB0aGUgaW5zdGFuY2UgaXMgYG51bGxgLFxuICogICAgIG90aGVyd2lzZSB0aGUge0BsaW5rIGVycm9yOiRjb21waWxlOmN0cmVxIE1pc3NpbmcgUmVxdWlyZWQgQ29udHJvbGxlcn0gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqICAgICBOb3RlIHRoYXQgeW91IGNhbiBhbHNvIHJlcXVpcmUgdGhlIGRpcmVjdGl2ZSdzIG93biBjb250cm9sbGVyIC0gaXQgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBsaWtlXG4gKiAgICAgYW55IG90aGVyIGNvbnRyb2xsZXIuXG4gKlxuICogICAqIGB0cmFuc2NsdWRlRm5gIC0gQSB0cmFuc2NsdWRlIGxpbmtpbmcgZnVuY3Rpb24gcHJlLWJvdW5kIHRvIHRoZSBjb3JyZWN0IHRyYW5zY2x1c2lvbiBzY29wZS5cbiAqICAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBgJHRyYW5zY2x1ZGVgIHBhcmFtZXRlciBvZiBkaXJlY3RpdmUgY29udHJvbGxlcnMsXG4gKiAgICAgc2VlIHtAbGluayBuZy4kY29tcGlsZSMtY29udHJvbGxlci0gdGhlIGNvbnRyb2xsZXIgc2VjdGlvbiBmb3IgZGV0YWlsc30uXG4gKiAgICAgYGZ1bmN0aW9uKFtzY29wZV0sIGNsb25lTGlua2luZ0ZuLCBmdXR1cmVQYXJlbnRFbGVtZW50KWAuXG4gKlxuICogIyMjIyBQcmUtbGlua2luZyBmdW5jdGlvblxuICpcbiAqIEV4ZWN1dGVkIGJlZm9yZSB0aGUgY2hpbGQgZWxlbWVudHMgYXJlIGxpbmtlZC4gTm90IHNhZmUgdG8gZG8gRE9NIHRyYW5zZm9ybWF0aW9uIHNpbmNlIHRoZVxuICogY29tcGlsZXIgbGlua2luZyBmdW5jdGlvbiB3aWxsIGZhaWwgdG8gbG9jYXRlIHRoZSBjb3JyZWN0IGVsZW1lbnRzIGZvciBsaW5raW5nLlxuICpcbiAqICMjIyMgUG9zdC1saW5raW5nIGZ1bmN0aW9uXG4gKlxuICogRXhlY3V0ZWQgYWZ0ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIGFyZSBsaW5rZWQuXG4gKlxuICogTm90ZSB0aGF0IGNoaWxkIGVsZW1lbnRzIHRoYXQgY29udGFpbiBgdGVtcGxhdGVVcmxgIGRpcmVjdGl2ZXMgd2lsbCBub3QgaGF2ZSBiZWVuIGNvbXBpbGVkXG4gKiBhbmQgbGlua2VkIHNpbmNlIHRoZXkgYXJlIHdhaXRpbmcgZm9yIHRoZWlyIHRlbXBsYXRlIHRvIGxvYWQgYXN5bmNocm9ub3VzbHkgYW5kIHRoZWlyIG93blxuICogY29tcGlsYXRpb24gYW5kIGxpbmtpbmcgaGFzIGJlZW4gc3VzcGVuZGVkIHVudGlsIHRoYXQgb2NjdXJzLlxuICpcbiAqIEl0IGlzIHNhZmUgdG8gZG8gRE9NIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBwb3N0LWxpbmtpbmcgZnVuY3Rpb24gb24gZWxlbWVudHMgdGhhdCBhcmUgbm90IHdhaXRpbmdcbiAqIGZvciB0aGVpciBhc3luYyB0ZW1wbGF0ZXMgdG8gYmUgcmVzb2x2ZWQuXG4gKlxuICpcbiAqICMjIyBUcmFuc2NsdXNpb25cbiAqXG4gKiBUcmFuc2NsdXNpb24gaXMgdGhlIHByb2Nlc3Mgb2YgZXh0cmFjdGluZyBhIGNvbGxlY3Rpb24gb2YgRE9NIGVsZW1lbnRzIGZyb20gb25lIHBhcnQgb2YgdGhlIERPTSBhbmRcbiAqIGNvcHlpbmcgdGhlbSB0byBhbm90aGVyIHBhcnQgb2YgdGhlIERPTSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlaXIgY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luYWwgQW5ndWxhckpTXG4gKiBzY29wZSBmcm9tIHdoZXJlIHRoZXkgd2VyZSB0YWtlbi5cbiAqXG4gKiBUcmFuc2NsdXNpb24gaXMgdXNlZCAob2Z0ZW4gd2l0aCB7QGxpbmsgbmdUcmFuc2NsdWRlfSkgdG8gaW5zZXJ0IHRoZVxuICogb3JpZ2luYWwgY29udGVudHMgb2YgYSBkaXJlY3RpdmUncyBlbGVtZW50IGludG8gYSBzcGVjaWZpZWQgcGxhY2UgaW4gdGhlIHRlbXBsYXRlIG9mIHRoZSBkaXJlY3RpdmUuXG4gKiBUaGUgYmVuZWZpdCBvZiB0cmFuc2NsdXNpb24sIG92ZXIgc2ltcGx5IG1vdmluZyB0aGUgRE9NIGVsZW1lbnRzIG1hbnVhbGx5LCBpcyB0aGF0IHRoZSB0cmFuc2NsdWRlZFxuICogY29udGVudCBoYXMgYWNjZXNzIHRvIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBzY29wZSBmcm9tIHdoaWNoIGl0IHdhcyB0YWtlbiwgZXZlbiBpZiB0aGUgZGlyZWN0aXZlXG4gKiBoYXMgaXNvbGF0ZWQgc2NvcGUuXG4gKiBTZWUgdGhlIHtAbGluayBndWlkZS9kaXJlY3RpdmUjY3JlYXRpbmctYS1kaXJlY3RpdmUtdGhhdC13cmFwcy1vdGhlci1lbGVtZW50cyBEaXJlY3RpdmVzIEd1aWRlfS5cbiAqXG4gKiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUgd2lkZ2V0IHRvIGhhdmUgcHJpdmF0ZSBzdGF0ZSBmb3IgaXRzIHRlbXBsYXRlLCB3aGlsZSB0aGUgdHJhbnNjbHVkZWRcbiAqIGNvbnRlbnQgaGFzIGFjY2VzcyB0byBpdHMgb3JpZ2luYXRpbmcgc2NvcGUuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqTm90ZToqKiBXaGVuIHRlc3RpbmcgYW4gZWxlbWVudCB0cmFuc2NsdWRlIGRpcmVjdGl2ZSB5b3UgbXVzdCBub3QgcGxhY2UgdGhlIGRpcmVjdGl2ZSBhdCB0aGUgcm9vdCBvZiB0aGVcbiAqIERPTSBmcmFnbWVudCB0aGF0IGlzIGJlaW5nIGNvbXBpbGVkLiBTZWUge0BsaW5rIGd1aWRlL3VuaXQtdGVzdGluZyN0ZXN0aW5nLXRyYW5zY2x1c2lvbi1kaXJlY3RpdmVzXG4gKiBUZXN0aW5nIFRyYW5zY2x1c2lvbiBEaXJlY3RpdmVzfS5cbiAqIDwvZGl2PlxuICpcbiAqIFRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiB0cmFuc2NsdXNpb24gZGVwZW5kaW5nIHVwb24gd2hldGhlciB5b3Ugd2FudCB0byB0cmFuc2NsdWRlIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZVxuICogZGlyZWN0aXZlJ3MgZWxlbWVudCwgdGhlIGVudGlyZSBlbGVtZW50IG9yIG11bHRpcGxlIHBhcnRzIG9mIHRoZSBlbGVtZW50IGNvbnRlbnRzOlxuICpcbiAqICogYHRydWVgIC0gdHJhbnNjbHVkZSB0aGUgY29udGVudCAoaS5lLiB0aGUgY2hpbGQgbm9kZXMpIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50LlxuICogKiBgJ2VsZW1lbnQnYCAtIHRyYW5zY2x1ZGUgdGhlIHdob2xlIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IGluY2x1ZGluZyBhbnkgZGlyZWN0aXZlcyBvbiB0aGlzXG4gKiAgIGVsZW1lbnQgdGhhdCBkZWZpbmVkIGF0IGEgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGlzIGRpcmVjdGl2ZS4gV2hlbiB1c2VkLCB0aGUgYHRlbXBsYXRlYFxuICogICBwcm9wZXJ0eSBpcyBpZ25vcmVkLlxuICogKiAqKmB7Li4ufWAgKGFuIG9iamVjdCBoYXNoKToqKiAtIG1hcCBlbGVtZW50cyBvZiB0aGUgY29udGVudCBvbnRvIHRyYW5zY2x1c2lvbiBcInNsb3RzXCIgaW4gdGhlIHRlbXBsYXRlLlxuICpcbiAqICoqTXVsdC1zbG90IHRyYW5zY2x1c2lvbioqIGlzIGRlY2xhcmVkIGJ5IHByb3ZpZGluZyBhbiBvYmplY3QgZm9yIHRoZSBgdHJhbnNjbHVkZWAgcHJvcGVydHkuXG4gKlxuICogVGhpcyBvYmplY3QgaXMgYSBtYXAgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBuYW1lIG9mIHRoZSBzbG90IHRvIGZpbGwgYW5kIHRoZSB2YWx1ZSBpcyBhbiBlbGVtZW50IHNlbGVjdG9yXG4gKiB1c2VkIHRvIG1hdGNoIHRoZSBIVE1MIHRvIHRoZSBzbG90LiBUaGUgZWxlbWVudCBzZWxlY3RvciBzaG91bGQgYmUgaW4gbm9ybWFsaXplZCBmb3JtIChlLmcuIGBteUVsZW1lbnRgKVxuICogYW5kIHdpbGwgbWF0Y2ggdGhlIHN0YW5kYXJkIGVsZW1lbnQgdmFyaWFudHMgKGUuZy4gYG15LWVsZW1lbnRgLCBgbXk6ZWxlbWVudGAsIGBkYXRhLW15LWVsZW1lbnRgLCBldGMpLlxuICpcbiAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGNoZWNrIG91dCB0aGUgZ3VpZGUgb24ge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSNtYXRjaGluZy1kaXJlY3RpdmVzIE1hdGNoaW5nIERpcmVjdGl2ZXN9XG4gKlxuICogSWYgdGhlIGVsZW1lbnQgc2VsZWN0b3IgaXMgcHJlZml4ZWQgd2l0aCBhIGA/YCB0aGVuIHRoYXQgc2xvdCBpcyBvcHRpb25hbC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIHRyYW5zY2x1ZGUgb2JqZWN0IGB7IHNsb3RBOiAnP215Q3VzdG9tRWxlbWVudCcgfWAgbWFwcyBgPG15LWN1c3RvbS1lbGVtZW50PmAgZWxlbWVudHMgdG9cbiAqIHRoZSBgc2xvdEFgIHNsb3QsIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIGAkdHJhbnNjbHVkZWAgZnVuY3Rpb24gb3IgdmlhIHRoZSB7QGxpbmsgbmdUcmFuc2NsdWRlfSBkaXJlY3RpdmUuXG4gKlxuICogU2xvdHMgdGhhdCBhcmUgbm90IG1hcmtlZCBhcyBvcHRpb25hbCAoYD9gKSB3aWxsIHRyaWdnZXIgYSBjb21waWxlIHRpbWUgZXJyb3IgaWYgdGhlcmUgYXJlIG5vIG1hdGNoaW5nIGVsZW1lbnRzXG4gKiBpbiB0aGUgdHJhbnNjbHVkZSBjb250ZW50LiBJZiB5b3Ugd2lzaCB0byBrbm93IGlmIGFuIG9wdGlvbmFsIHNsb3Qgd2FzIGZpbGxlZCB3aXRoIGNvbnRlbnQsIHRoZW4geW91IGNhbiBjYWxsXG4gKiBgJHRyYW5zY2x1ZGUuaXNTbG90RmlsbGVkKHNsb3ROYW1lKWAgb24gdGhlIHRyYW5zY2x1ZGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBkaXJlY3RpdmUncyBsaW5rIGZ1bmN0aW9uIGFuZFxuICogaW5qZWN0YWJsZSBpbnRvIHRoZSBkaXJlY3RpdmUncyBjb250cm9sbGVyLlxuICpcbiAqXG4gKiAjIyMjIFRyYW5zY2x1c2lvbiBGdW5jdGlvbnNcbiAqXG4gKiBXaGVuIGEgZGlyZWN0aXZlIHJlcXVlc3RzIHRyYW5zY2x1c2lvbiwgdGhlIGNvbXBpbGVyIGV4dHJhY3RzIGl0cyBjb250ZW50cyBhbmQgcHJvdmlkZXMgYSAqKnRyYW5zY2x1c2lvblxuICogZnVuY3Rpb24qKiB0byB0aGUgZGlyZWN0aXZlJ3MgYGxpbmtgIGZ1bmN0aW9uIGFuZCBgY29udHJvbGxlcmAuIFRoaXMgdHJhbnNjbHVzaW9uIGZ1bmN0aW9uIGlzIGEgc3BlY2lhbFxuICogKipsaW5raW5nIGZ1bmN0aW9uKiogdGhhdCB3aWxsIHJldHVybiB0aGUgY29tcGlsZWQgY29udGVudHMgbGlua2VkIHRvIGEgbmV3IHRyYW5zY2x1c2lvbiBzY29wZS5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxuICogSWYgeW91IGFyZSBqdXN0IHVzaW5nIHtAbGluayBuZ1RyYW5zY2x1ZGV9IHRoZW4geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyBmdW5jdGlvbiwgc2luY2VcbiAqIG5nVHJhbnNjbHVkZSB3aWxsIGRlYWwgd2l0aCBpdCBmb3IgdXMuXG4gKiA8L2Rpdj5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byBtYW51YWxseSBjb250cm9sIHRoZSBpbnNlcnRpb24gYW5kIHJlbW92YWwgb2YgdGhlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgaW4geW91ciBkaXJlY3RpdmVcbiAqIHRoZW4geW91IG11c3QgdXNlIHRoaXMgdHJhbnNjbHVkZSBmdW5jdGlvbi4gV2hlbiB5b3UgY2FsbCBhIHRyYW5zY2x1ZGUgZnVuY3Rpb24gaXQgcmV0dXJucyBhIGEganFMaXRlL0pRdWVyeVxuICogb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbXBpbGVkIERPTSwgd2hpY2ggaXMgbGlua2VkIHRvIHRoZSBjb3JyZWN0IHRyYW5zY2x1c2lvbiBzY29wZS5cbiAqXG4gKiBXaGVuIHlvdSBjYWxsIGEgdHJhbnNjbHVzaW9uIGZ1bmN0aW9uIHlvdSBjYW4gcGFzcyBpbiBhICoqY2xvbmUgYXR0YWNoIGZ1bmN0aW9uKiouIFRoaXMgZnVuY3Rpb24gYWNjZXB0c1xuICogdHdvIHBhcmFtZXRlcnMsIGBmdW5jdGlvbihjbG9uZSwgc2NvcGUpIHsgLi4uIH1gLCB3aGVyZSB0aGUgYGNsb25lYCBpcyBhIGZyZXNoIGNvbXBpbGVkIGNvcHkgb2YgeW91ciB0cmFuc2NsdWRlZFxuICogY29udGVudCBhbmQgdGhlIGBzY29wZWAgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgdHJhbnNjbHVzaW9uIHNjb3BlLCB3aGljaCB0aGUgY2xvbmUgd2lsbCBiZSBsaW5rZWQgdG8uXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cbiAqICoqQmVzdCBQcmFjdGljZSoqOiBBbHdheXMgcHJvdmlkZSBhIGBjbG9uZUZuYCAoY2xvbmUgYXR0YWNoIGZ1bmN0aW9uKSB3aGVuIHlvdSBjYWxsIGEgdHJhbnNjbHVkZSBmdW5jdGlvblxuICogc2luY2UgeW91IHRoZW4gZ2V0IGEgZnJlc2ggY2xvbmUgb2YgdGhlIG9yaWdpbmFsIERPTSBhbmQgYWxzbyBoYXZlIGFjY2VzcyB0byB0aGUgbmV3IHRyYW5zY2x1c2lvbiBzY29wZS5cbiAqIDwvZGl2PlxuICpcbiAqIEl0IGlzIG5vcm1hbCBwcmFjdGljZSB0byBhdHRhY2ggeW91ciB0cmFuc2NsdWRlZCBjb250ZW50IChgY2xvbmVgKSB0byB0aGUgRE9NIGluc2lkZSB5b3VyICoqY2xvbmVcbiAqIGF0dGFjaCBmdW5jdGlvbioqOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgdHJhbnNjbHVkZWRDb250ZW50LCB0cmFuc2NsdXNpb25TY29wZTtcbiAqXG4gKiAkdHJhbnNjbHVkZShmdW5jdGlvbihjbG9uZSwgc2NvcGUpIHtcbiAqICAgZWxlbWVudC5hcHBlbmQoY2xvbmUpO1xuICogICB0cmFuc2NsdWRlZENvbnRlbnQgPSBjbG9uZTtcbiAqICAgdHJhbnNjbHVzaW9uU2NvcGUgPSBzY29wZTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogTGF0ZXIsIGlmIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBmcm9tIHlvdXIgRE9NIHRoZW4geW91IHNob3VsZCBhbHNvIGRlc3Ryb3kgdGhlXG4gKiBhc3NvY2lhdGVkIHRyYW5zY2x1c2lvbiBzY29wZTpcbiAqXG4gKiBgYGBqc1xuICogdHJhbnNjbHVkZWRDb250ZW50LnJlbW92ZSgpO1xuICogdHJhbnNjbHVzaW9uU2NvcGUuJGRlc3Ryb3koKTtcbiAqIGBgYFxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gKiAqKkJlc3QgUHJhY3RpY2UqKjogaWYgeW91IGludGVuZCB0byBhZGQgYW5kIHJlbW92ZSB0cmFuc2NsdWRlZCBjb250ZW50IG1hbnVhbGx5IGluIHlvdXIgZGlyZWN0aXZlXG4gKiAoYnkgY2FsbGluZyB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiB0byBnZXQgdGhlIERPTSBhbmQgY2FsbGluZyBgZWxlbWVudC5yZW1vdmUoKWAgdG8gcmVtb3ZlIGl0KSxcbiAqIHRoZW4geW91IGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGAkZGVzdHJveWAgb24gdGhlIHRyYW5zY2x1c2lvbiBzY29wZS5cbiAqIDwvZGl2PlxuICpcbiAqIFRoZSBidWlsdC1pbiBET00gbWFuaXB1bGF0aW9uIGRpcmVjdGl2ZXMsIHN1Y2ggYXMge0BsaW5rIG5nSWZ9LCB7QGxpbmsgbmdTd2l0Y2h9IGFuZCB7QGxpbmsgbmdSZXBlYXR9XG4gKiBhdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlaXIgdHJhbnNjbHVkZWQgY2xvbmVzIGFzIG5lY2Vzc2FyeSBzbyB5b3UgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyBpZlxuICogeW91IGFyZSBzaW1wbHkgdXNpbmcge0BsaW5rIG5nVHJhbnNjbHVkZX0gdG8gaW5qZWN0IHRoZSB0cmFuc2NsdXNpb24gaW50byB5b3VyIGRpcmVjdGl2ZS5cbiAqXG4gKlxuICogIyMjIyBUcmFuc2NsdXNpb24gU2NvcGVzXG4gKlxuICogV2hlbiB5b3UgY2FsbCBhIHRyYW5zY2x1ZGUgZnVuY3Rpb24gaXQgcmV0dXJucyBhIERPTSBmcmFnbWVudCB0aGF0IGlzIHByZS1ib3VuZCB0byBhICoqdHJhbnNjbHVzaW9uXG4gKiBzY29wZSoqLiBUaGlzIHNjb3BlIGlzIHNwZWNpYWwsIGluIHRoYXQgaXQgaXMgYSBjaGlsZCBvZiB0aGUgZGlyZWN0aXZlJ3Mgc2NvcGUgKGFuZCBzbyBnZXRzIGRlc3Ryb3llZFxuICogd2hlbiB0aGUgZGlyZWN0aXZlJ3Mgc2NvcGUgZ2V0cyBkZXN0cm95ZWQpIGJ1dCBpdCBpbmhlcml0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgc2NvcGUgZnJvbSB3aGljaCBpdFxuICogd2FzIHRha2VuLlxuICpcbiAqIEZvciBleGFtcGxlIGNvbnNpZGVyIGEgZGlyZWN0aXZlIHRoYXQgdXNlcyB0cmFuc2NsdXNpb24gYW5kIGlzb2xhdGVkIHNjb3BlLiBUaGUgRE9NIGhpZXJhcmNoeSBtaWdodCBsb29rXG4gKiBsaWtlIHRoaXM6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBuZy1hcHA+XG4gKiAgIDxkaXYgaXNvbGF0ZT5cbiAqICAgICA8ZGl2IHRyYW5zY2x1c2lvbj5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9kaXY+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIFRoZSBgJHBhcmVudGAgc2NvcGUgaGllcmFyY2h5IHdpbGwgbG9vayBsaWtlIHRoaXM6XG4gKlxuICAgYGBgXG4gICAtICRyb290U2NvcGVcbiAgICAgLSBpc29sYXRlXG4gICAgICAgLSB0cmFuc2NsdXNpb25cbiAgIGBgYFxuICpcbiAqIGJ1dCB0aGUgc2NvcGVzIHdpbGwgaW5oZXJpdCBwcm90b3R5cGljYWxseSBmcm9tIGRpZmZlcmVudCBzY29wZXMgdG8gdGhlaXIgYCRwYXJlbnRgLlxuICpcbiAgIGBgYFxuICAgLSAkcm9vdFNjb3BlXG4gICAgIC0gdHJhbnNjbHVzaW9uXG4gICAtIGlzb2xhdGVcbiAgIGBgYFxuICpcbiAqXG4gKiAjIyMgQXR0cmlidXRlc1xuICpcbiAqIFRoZSB7QGxpbmsgbmcuJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMgQXR0cmlidXRlc30gb2JqZWN0IC0gcGFzc2VkIGFzIGEgcGFyYW1ldGVyIGluIHRoZVxuICogYGxpbmsoKWAgb3IgYGNvbXBpbGUoKWAgZnVuY3Rpb25zLiBJdCBoYXMgYSB2YXJpZXR5IG9mIHVzZXMuXG4gKlxuICogKiAqQWNjZXNzaW5nIG5vcm1hbGl6ZWQgYXR0cmlidXRlIG5hbWVzOiogRGlyZWN0aXZlcyBsaWtlICduZ0JpbmQnIGNhbiBiZSBleHByZXNzZWQgaW4gbWFueSB3YXlzOlxuICogICAnbmc6YmluZCcsIGBkYXRhLW5nLWJpbmRgLCBvciAneC1uZy1iaW5kJy4gVGhlIGF0dHJpYnV0ZXMgb2JqZWN0IGFsbG93cyBmb3Igbm9ybWFsaXplZCBhY2Nlc3NcbiAqICAgdG8gdGhlIGF0dHJpYnV0ZXMuXG4gKlxuICogKiAqRGlyZWN0aXZlIGludGVyLWNvbW11bmljYXRpb246KiBBbGwgZGlyZWN0aXZlcyBzaGFyZSB0aGUgc2FtZSBpbnN0YW5jZSBvZiB0aGUgYXR0cmlidXRlc1xuICogICBvYmplY3Qgd2hpY2ggYWxsb3dzIHRoZSBkaXJlY3RpdmVzIHRvIHVzZSB0aGUgYXR0cmlidXRlcyBvYmplY3QgYXMgaW50ZXIgZGlyZWN0aXZlXG4gKiAgIGNvbW11bmljYXRpb24uXG4gKlxuICogKiAqU3VwcG9ydHMgaW50ZXJwb2xhdGlvbjoqIEludGVycG9sYXRpb24gYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSBvYmplY3RcbiAqICAgYWxsb3dpbmcgb3RoZXIgZGlyZWN0aXZlcyB0byByZWFkIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXG4gKlxuICogKiAqT2JzZXJ2aW5nIGludGVycG9sYXRlZCBhdHRyaWJ1dGVzOiogVXNlIGAkb2JzZXJ2ZWAgdG8gb2JzZXJ2ZSB0aGUgdmFsdWUgY2hhbmdlcyBvZiBhdHRyaWJ1dGVzXG4gKiAgIHRoYXQgY29udGFpbiBpbnRlcnBvbGF0aW9uIChlLmcuIGBzcmM9XCJ7e2Jhcn19XCJgKS4gTm90IG9ubHkgaXMgdGhpcyB2ZXJ5IGVmZmljaWVudCBidXQgaXQncyBhbHNvXG4gKiAgIHRoZSBvbmx5IHdheSB0byBlYXNpbHkgZ2V0IHRoZSBhY3R1YWwgdmFsdWUgYmVjYXVzZSBkdXJpbmcgdGhlIGxpbmtpbmcgcGhhc2UgdGhlIGludGVycG9sYXRpb25cbiAqICAgaGFzbid0IGJlZW4gZXZhbHVhdGVkIHlldCBhbmQgc28gdGhlIHZhbHVlIGlzIGF0IHRoaXMgdGltZSBzZXQgdG8gYHVuZGVmaW5lZGAuXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGxpbmtpbmdGbihzY29wZSwgZWxtLCBhdHRycywgY3RybCkge1xuICogICAvLyBnZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogICBjb25zb2xlLmxvZyhhdHRycy5uZ01vZGVsKTtcbiAqXG4gKiAgIC8vIGNoYW5nZSB0aGUgYXR0cmlidXRlXG4gKiAgIGF0dHJzLiRzZXQoJ25nTW9kZWwnLCAnbmV3IHZhbHVlJyk7XG4gKlxuICogICAvLyBvYnNlcnZlIGNoYW5nZXMgdG8gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZVxuICogICBhdHRycy4kb2JzZXJ2ZSgnbmdNb2RlbCcsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ25nTW9kZWwgaGFzIGNoYW5nZWQgdmFsdWUgdG8gJyArIHZhbHVlKTtcbiAqICAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqTm90ZSoqOiBUeXBpY2FsbHkgZGlyZWN0aXZlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGBtb2R1bGUuZGlyZWN0aXZlYC4gVGhlIGV4YW1wbGUgYmVsb3cgaXNcbiAqIHRvIGlsbHVzdHJhdGUgaG93IGAkY29tcGlsZWAgd29ya3MuXG4gKiA8L2Rpdj5cbiAqXG4gPGV4YW1wbGUgbW9kdWxlPVwiY29tcGlsZUV4YW1wbGVcIiBuYW1lPVwiY29tcGlsZVwiPlxuICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICA8c2NyaXB0PlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ2NvbXBpbGVFeGFtcGxlJywgW10sIGZ1bmN0aW9uKCRjb21waWxlUHJvdmlkZXIpIHtcbiAgICAgICAgLy8gY29uZmlndXJlIG5ldyAnY29tcGlsZScgZGlyZWN0aXZlIGJ5IHBhc3NpbmcgYSBkaXJlY3RpdmVcbiAgICAgICAgLy8gZmFjdG9yeSBmdW5jdGlvbi4gVGhlIGZhY3RvcnkgZnVuY3Rpb24gaW5qZWN0cyB0aGUgJyRjb21waWxlJ1xuICAgICAgICAkY29tcGlsZVByb3ZpZGVyLmRpcmVjdGl2ZSgnY29tcGlsZScsIGZ1bmN0aW9uKCRjb21waWxlKSB7XG4gICAgICAgICAgLy8gZGlyZWN0aXZlIGZhY3RvcnkgY3JlYXRlcyBhIGxpbmsgZnVuY3Rpb25cbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgIC8vIHdhdGNoIHRoZSAnY29tcGlsZScgZXhwcmVzc2lvbiBmb3IgY2hhbmdlc1xuICAgICAgICAgICAgICAgIHJldHVybiBzY29wZS4kZXZhbChhdHRycy5jb21waWxlKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSAnY29tcGlsZScgZXhwcmVzc2lvbiBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLy8gYXNzaWduIGl0IGludG8gdGhlIGN1cnJlbnQgRE9NXG4gICAgICAgICAgICAgICAgZWxlbWVudC5odG1sKHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIG5ldyBET00gYW5kIGxpbmsgaXQgdG8gdGhlIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAvLyBzY29wZS5cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBvbmx5IGNvbXBpbGUgLmNoaWxkTm9kZXMgc28gdGhhdFxuICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGdldCBpbnRvIGluZmluaXRlIGxvb3AgY29tcGlsaW5nIG91cnNlbHZlc1xuICAgICAgICAgICAgICAgICRjb21waWxlKGVsZW1lbnQuY29udGVudHMoKSkoc2NvcGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jb250cm9sbGVyKCdHcmVldGVyQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICRzY29wZS5uYW1lID0gJ0FuZ3VsYXInO1xuICAgICAgICAkc2NvcGUuaHRtbCA9ICdIZWxsbyB7e25hbWV9fSc7XG4gICAgICB9XSk7XG4gICAgPC9zY3JpcHQ+XG4gICAgPGRpdiBuZy1jb250cm9sbGVyPVwiR3JlZXRlckNvbnRyb2xsZXJcIj5cbiAgICAgIDxpbnB1dCBuZy1tb2RlbD1cIm5hbWVcIj4gPGJyLz5cbiAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD1cImh0bWxcIj48L3RleHRhcmVhPiA8YnIvPlxuICAgICAgPGRpdiBjb21waWxlPVwiaHRtbFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgPC9maWxlPlxuICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICBpdCgnc2hvdWxkIGF1dG8gY29tcGlsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgIHZhciB0ZXh0YXJlYSA9ICQoJ3RleHRhcmVhJyk7XG4gICAgICAgdmFyIG91dHB1dCA9ICQoJ2Rpdltjb21waWxlXScpO1xuICAgICAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIHJlYWRzICdIZWxsbyBBbmd1bGFyJy5cbiAgICAgICBleHBlY3Qob3V0cHV0LmdldFRleHQoKSkudG9CZSgnSGVsbG8gQW5ndWxhcicpO1xuICAgICAgIHRleHRhcmVhLmNsZWFyKCk7XG4gICAgICAgdGV4dGFyZWEuc2VuZEtleXMoJ3t7bmFtZX19IScpO1xuICAgICAgIGV4cGVjdChvdXRwdXQuZ2V0VGV4dCgpKS50b0JlKCdBbmd1bGFyIScpO1xuICAgICB9KTtcbiAgIDwvZmlsZT5cbiA8L2V4YW1wbGU+XG5cbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RE9NRWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG9yIEhUTUwgc3RyaW5nIHRvIGNvbXBpbGUgaW50byBhIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtmdW5jdGlvbihhbmd1bGFyLlNjb3BlLCBjbG9uZUF0dGFjaEZuPSl9IHRyYW5zY2x1ZGUgZnVuY3Rpb24gYXZhaWxhYmxlIHRvIGRpcmVjdGl2ZXMgLSBERVBSRUNBVEVELlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cbiAqICoqTm90ZToqKiBQYXNzaW5nIGEgYHRyYW5zY2x1ZGVgIGZ1bmN0aW9uIHRvIHRoZSAkY29tcGlsZSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCBhcyBpdFxuICogICBlLmcuIHdpbGwgbm90IHVzZSB0aGUgcmlnaHQgb3V0ZXIgc2NvcGUuIFBsZWFzZSBwYXNzIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIGFzIGFcbiAqICAgYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCB0byB0aGUgbGluayBmdW5jdGlvbiBpbnN0ZWFkLlxuICogPC9kaXY+XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1heFByaW9yaXR5IG9ubHkgYXBwbHkgZGlyZWN0aXZlcyBsb3dlciB0aGFuIGdpdmVuIHByaW9yaXR5IChPbmx5IGVmZmVjdHMgdGhlXG4gKiAgICAgICAgICAgICAgICAgcm9vdCBlbGVtZW50KHMpLCBub3QgdGhlaXIgY2hpbGRyZW4pXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc2NvcGUsIGNsb25lQXR0YWNoRm49LCBvcHRpb25zPSl9IGEgbGluayBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIGJpbmQgdGVtcGxhdGVcbiAqIChhIERPTSBlbGVtZW50L3RyZWUpIHRvIGEgc2NvcGUuIFdoZXJlOlxuICpcbiAqICAqIGBzY29wZWAgLSBBIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIFNjb3BlfSB0byBiaW5kIHRvLlxuICogICogYGNsb25lQXR0YWNoRm5gIC0gSWYgYGNsb25lQXR0YWNoRm5gIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBsaW5rIGZ1bmN0aW9uIHdpbGwgY2xvbmUgdGhlXG4gKiAgYHRlbXBsYXRlYCBhbmQgY2FsbCB0aGUgYGNsb25lQXR0YWNoRm5gIGZ1bmN0aW9uIGFsbG93aW5nIHRoZSBjYWxsZXIgdG8gYXR0YWNoIHRoZVxuICogIGNsb25lZCBlbGVtZW50cyB0byB0aGUgRE9NIGRvY3VtZW50IGF0IHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVGhlIGBjbG9uZUF0dGFjaEZuYCBpc1xuICogIGNhbGxlZCBhczogPGJyLz4gYGNsb25lQXR0YWNoRm4oY2xvbmVkRWxlbWVudCwgc2NvcGUpYCB3aGVyZTpcbiAqXG4gKiAgICAgICogYGNsb25lZEVsZW1lbnRgIC0gaXMgYSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgYGVsZW1lbnRgIHBhc3NlZCBpbnRvIHRoZSBjb21waWxlci5cbiAqICAgICAgKiBgc2NvcGVgIC0gaXMgdGhlIGN1cnJlbnQgc2NvcGUgd2l0aCB3aGljaCB0aGUgbGlua2luZyBmdW5jdGlvbiBpcyB3b3JraW5nIHdpdGguXG4gKlxuICogICogYG9wdGlvbnNgIC0gQW4gb3B0aW9uYWwgb2JqZWN0IGhhc2ggd2l0aCBsaW5raW5nIG9wdGlvbnMuIElmIGBvcHRpb25zYCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgZm9sbG93aW5nXG4gKiAga2V5cyBtYXkgYmUgdXNlZCB0byBjb250cm9sIGxpbmtpbmcgYmVoYXZpb3I6XG4gKlxuICogICAgICAqIGBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbmAgLSB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiBtYWRlIGF2YWlsYWJsZSB0b1xuICogICAgICAgIGRpcmVjdGl2ZXM7IGlmIGdpdmVuLCBpdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBsaW5rIGZ1bmN0aW9ucyBvZlxuICogICAgICAgIGRpcmVjdGl2ZXMgZm91bmQgaW4gYGVsZW1lbnRgIGR1cmluZyBjb21waWxhdGlvbi5cbiAqICAgICAgKiBgdHJhbnNjbHVkZUNvbnRyb2xsZXJzYCAtIGFuIG9iamVjdCBoYXNoIHdpdGgga2V5cyB0aGF0IG1hcCBjb250cm9sbGVyIG5hbWVzXG4gKiAgICAgICAgdG8gYSBoYXNoIHdpdGggdGhlIGtleSBgaW5zdGFuY2VgLCB3aGljaCBtYXBzIHRvIHRoZSBjb250cm9sbGVyIGluc3RhbmNlO1xuICogICAgICAgIGlmIGdpdmVuLCBpdCB3aWxsIG1ha2UgdGhlIGNvbnRyb2xsZXJzIGF2YWlsYWJsZSB0byBkaXJlY3RpdmVzIG9uIHRoZSBjb21waWxlTm9kZTpcbiAqICAgICAgICBgYGBcbiAqICAgICAgICB7XG4gKiAgICAgICAgICBwYXJlbnQ6IHtcbiAqICAgICAgICAgICAgaW5zdGFuY2U6IHBhcmVudENvbnRyb2xsZXJJbnN0YW5jZVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgICBgYGBcbiAqICAgICAgKiBgZnV0dXJlUGFyZW50RWxlbWVudGAgLSBkZWZpbmVzIHRoZSBwYXJlbnQgdG8gd2hpY2ggdGhlIGBjbG9uZUF0dGFjaEZuYCB3aWxsIGFkZFxuICogICAgICAgIHRoZSBjbG9uZWQgZWxlbWVudHM7IG9ubHkgbmVlZGVkIGZvciB0cmFuc2NsdWRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gbm9uIGh0bWxcbiAqICAgICAgICBlbGVtZW50cyAoZS5nLiBTVkcgZWxlbWVudHMpLiBTZWUgYWxzbyB0aGUgZGlyZWN0aXZlLmNvbnRyb2xsZXIgcHJvcGVydHkuXG4gKlxuICogQ2FsbGluZyB0aGUgbGlua2luZyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbGVtZW50IG9mIHRoZSB0ZW1wbGF0ZS4gSXQgaXMgZWl0aGVyIHRoZSBvcmlnaW5hbFxuICogZWxlbWVudCBwYXNzZWQgaW4sIG9yIHRoZSBjbG9uZSBvZiB0aGUgZWxlbWVudCBpZiB0aGUgYGNsb25lQXR0YWNoRm5gIGlzIHByb3ZpZGVkLlxuICpcbiAqIEFmdGVyIGxpbmtpbmcgdGhlIHZpZXcgaXMgbm90IHVwZGF0ZWQgdW50aWwgYWZ0ZXIgYSBjYWxsIHRvICRkaWdlc3Qgd2hpY2ggdHlwaWNhbGx5IGlzIGRvbmUgYnlcbiAqIEFuZ3VsYXIgYXV0b21hdGljYWxseS5cbiAqXG4gKiBJZiB5b3UgbmVlZCBhY2Nlc3MgdG8gdGhlIGJvdW5kIHZpZXcsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyBpdDpcbiAqXG4gKiAtIElmIHlvdSBhcmUgbm90IGFza2luZyB0aGUgbGlua2luZyBmdW5jdGlvbiB0byBjbG9uZSB0aGUgdGVtcGxhdGUsIGNyZWF0ZSB0aGUgRE9NIGVsZW1lbnQocylcbiAqICAgYmVmb3JlIHlvdSBzZW5kIHRoZW0gdG8gdGhlIGNvbXBpbGVyIGFuZCBrZWVwIHRoaXMgcmVmZXJlbmNlIGFyb3VuZC5cbiAqICAgYGBganNcbiAqICAgICB2YXIgZWxlbWVudCA9ICRjb21waWxlKCc8cD57e3RvdGFsfX08L3A+Jykoc2NvcGUpO1xuICogICBgYGBcbiAqXG4gKiAtIGlmIG9uIHRoZSBvdGhlciBoYW5kLCB5b3UgbmVlZCB0aGUgZWxlbWVudCB0byBiZSBjbG9uZWQsIHRoZSB2aWV3IHJlZmVyZW5jZSBmcm9tIHRoZSBvcmlnaW5hbFxuICogICBleGFtcGxlIHdvdWxkIG5vdCBwb2ludCB0byB0aGUgY2xvbmUsIGJ1dCByYXRoZXIgdG8gdGhlIG9yaWdpbmFsIHRlbXBsYXRlIHRoYXQgd2FzIGNsb25lZC4gSW5cbiAqICAgdGhpcyBjYXNlLCB5b3UgY2FuIGFjY2VzcyB0aGUgY2xvbmUgdmlhIHRoZSBjbG9uZUF0dGFjaEZuOlxuICogICBgYGBqc1xuICogICAgIHZhciB0ZW1wbGF0ZUVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoJzxwPnt7dG90YWx9fTwvcD4nKSxcbiAqICAgICAgICAgc2NvcGUgPSAuLi4uO1xuICpcbiAqICAgICB2YXIgY2xvbmVkRWxlbWVudCA9ICRjb21waWxlKHRlbXBsYXRlRWxlbWVudCkoc2NvcGUsIGZ1bmN0aW9uKGNsb25lZEVsZW1lbnQsIHNjb3BlKSB7XG4gKiAgICAgICAvL2F0dGFjaCB0aGUgY2xvbmUgdG8gRE9NIGRvY3VtZW50IGF0IHRoZSByaWdodCBwbGFjZVxuICogICAgIH0pO1xuICpcbiAqICAgICAvL25vdyB3ZSBoYXZlIHJlZmVyZW5jZSB0byB0aGUgY2xvbmVkIERPTSB2aWEgYGNsb25lZEVsZW1lbnRgXG4gKiAgIGBgYFxuICpcbiAqXG4gKiBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRoZSBjb21waWxlciB3b3Jrcywgc2VlIHRoZVxuICoge0BsaW5rIGd1aWRlL2NvbXBpbGVyIEFuZ3VsYXIgSFRNTCBDb21waWxlcn0gc2VjdGlvbiBvZiB0aGUgRGV2ZWxvcGVyIEd1aWRlLlxuICpcbiAqIEBrbm93bklzc3VlXG4gKlxuICogIyMjIERvdWJsZSBDb21waWxhdGlvblxuICpcbiAgIERvdWJsZSBjb21waWxhdGlvbiBvY2N1cnMgd2hlbiBhbiBhbHJlYWR5IGNvbXBpbGVkIHBhcnQgb2YgdGhlIERPTSBnZXRzXG4gICBjb21waWxlZCBhZ2Fpbi4gVGhpcyBpcyBhbiB1bmRlc2lyZWQgZWZmZWN0IGFuZCBjYW4gbGVhZCB0byBtaXNiZWhhdmluZyBkaXJlY3RpdmVzLCBwZXJmb3JtYW5jZSBpc3N1ZXMsXG4gICBhbmQgbWVtb3J5IGxlYWtzLiBSZWZlciB0byB0aGUgQ29tcGlsZXIgR3VpZGUge0BsaW5rIGd1aWRlL2NvbXBpbGVyI2RvdWJsZS1jb21waWxhdGlvbi1hbmQtaG93LXRvLWF2b2lkLWl0XG4gICBzZWN0aW9uIG9uIGRvdWJsZSBjb21waWxhdGlvbn0gZm9yIGFuIGluLWRlcHRoIGV4cGxhbmF0aW9uIGFuZCB3YXlzIHRvIGF2b2lkIGl0LlxuICpcbiAqL1xuXG52YXIgJGNvbXBpbGVNaW5FcnIgPSBtaW5FcnIoJyRjb21waWxlJyk7XG5cbmZ1bmN0aW9uIFVOSU5JVElBTElaRURfVkFMVUUoKSB7fVxudmFyIF9VTklOSVRJQUxJWkVEX1ZBTFVFID0gbmV3IFVOSU5JVElBTElaRURfVkFMVUUoKTtcblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRjb21waWxlUHJvdmlkZXJcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqL1xuJENvbXBpbGVQcm92aWRlci4kaW5qZWN0ID0gWyckcHJvdmlkZScsICckJHNhbml0aXplVXJpUHJvdmlkZXInXTtcbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJENvbXBpbGVQcm92aWRlcigkcHJvdmlkZSwgJCRzYW5pdGl6ZVVyaVByb3ZpZGVyKSB7XG4gIHZhciBoYXNEaXJlY3RpdmVzID0ge30sXG4gICAgICBTdWZmaXggPSAnRGlyZWN0aXZlJyxcbiAgICAgIENPTU1FTlRfRElSRUNUSVZFX1JFR0VYUCA9IC9eXFxzKmRpcmVjdGl2ZTpcXHMqKFtcXHctXSspXFxzKyguKikkLyxcbiAgICAgIENMQVNTX0RJUkVDVElWRV9SRUdFWFAgPSAvKChbXFx3LV0rKSg/OjooW147XSspKT87PykvLFxuICAgICAgQUxMX09SX05PVEhJTkdfQVRUUlMgPSBtYWtlTWFwKCduZ1NyYyxuZ1NyY3NldCxzcmMsc3Jjc2V0JyksXG4gICAgICBSRVFVSVJFX1BSRUZJWF9SRUdFWFAgPSAvXig/OihcXF5cXF4/KT8oXFw/KT8oXFxeXFxePyk/KT8vO1xuXG4gIC8vIFJlZjogaHR0cDovL2RldmVsb3BlcnMud2hhdHdnLm9yZy93ZWJhcHBhcGlzLmh0bWwjZXZlbnQtaGFuZGxlci1pZGwtYXR0cmlidXRlc1xuICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IGZ1dHVyZSBET00gZXZlbnQgYXR0cmlidXRlIG5hbWVzIHdpbGwgYmVnaW4gd2l0aFxuICAvLyAnb24nIGFuZCBiZSBjb21wb3NlZCBvZiBvbmx5IEVuZ2xpc2ggbGV0dGVycy5cbiAgdmFyIEVWRU5UX0hBTkRMRVJfQVRUUl9SRUdFWFAgPSAvXihvblthLXpdK3xmb3JtYWN0aW9uKSQvO1xuICB2YXIgYmluZGluZ0NhY2hlID0gY3JlYXRlTWFwKCk7XG5cbiAgZnVuY3Rpb24gcGFyc2VJc29sYXRlQmluZGluZ3Moc2NvcGUsIGRpcmVjdGl2ZU5hbWUsIGlzQ29udHJvbGxlcikge1xuICAgIHZhciBMT0NBTF9SRUdFWFAgPSAvXlxccyooW0AmPF18PShcXCo/KSkoXFw/PylcXHMqKFxcdyopXFxzKiQvO1xuXG4gICAgdmFyIGJpbmRpbmdzID0gY3JlYXRlTWFwKCk7XG5cbiAgICBmb3JFYWNoKHNjb3BlLCBmdW5jdGlvbihkZWZpbml0aW9uLCBzY29wZU5hbWUpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uIGluIGJpbmRpbmdDYWNoZSkge1xuICAgICAgICBiaW5kaW5nc1tzY29wZU5hbWVdID0gYmluZGluZ0NhY2hlW2RlZmluaXRpb25dO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbWF0Y2ggPSBkZWZpbml0aW9uLm1hdGNoKExPQ0FMX1JFR0VYUCk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ2lzY3AnLFxuICAgICAgICAgICAgJ0ludmFsaWQgezN9IGZvciBkaXJlY3RpdmUgXFwnezB9XFwnLicgK1xuICAgICAgICAgICAgJyBEZWZpbml0aW9uOiB7Li4uIHsxfTogXFwnezJ9XFwnIC4uLn0nLFxuICAgICAgICAgICAgZGlyZWN0aXZlTmFtZSwgc2NvcGVOYW1lLCBkZWZpbml0aW9uLFxuICAgICAgICAgICAgKGlzQ29udHJvbGxlciA/ICdjb250cm9sbGVyIGJpbmRpbmdzIGRlZmluaXRpb24nIDpcbiAgICAgICAgICAgICdpc29sYXRlIHNjb3BlIGRlZmluaXRpb24nKSk7XG4gICAgICB9XG5cbiAgICAgIGJpbmRpbmdzW3Njb3BlTmFtZV0gPSB7XG4gICAgICAgIG1vZGU6IG1hdGNoWzFdWzBdLFxuICAgICAgICBjb2xsZWN0aW9uOiBtYXRjaFsyXSA9PT0gJyonLFxuICAgICAgICBvcHRpb25hbDogbWF0Y2hbM10gPT09ICc/JyxcbiAgICAgICAgYXR0ck5hbWU6IG1hdGNoWzRdIHx8IHNjb3BlTmFtZVxuICAgICAgfTtcbiAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICBiaW5kaW5nQ2FjaGVbZGVmaW5pdGlvbl0gPSBiaW5kaW5nc1tzY29wZU5hbWVdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJpbmRpbmdzO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VEaXJlY3RpdmVCaW5kaW5ncyhkaXJlY3RpdmUsIGRpcmVjdGl2ZU5hbWUpIHtcbiAgICB2YXIgYmluZGluZ3MgPSB7XG4gICAgICBpc29sYXRlU2NvcGU6IG51bGwsXG4gICAgICBiaW5kVG9Db250cm9sbGVyOiBudWxsXG4gICAgfTtcbiAgICBpZiAoaXNPYmplY3QoZGlyZWN0aXZlLnNjb3BlKSkge1xuICAgICAgaWYgKGRpcmVjdGl2ZS5iaW5kVG9Db250cm9sbGVyID09PSB0cnVlKSB7XG4gICAgICAgIGJpbmRpbmdzLmJpbmRUb0NvbnRyb2xsZXIgPSBwYXJzZUlzb2xhdGVCaW5kaW5ncyhkaXJlY3RpdmUuc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVOYW1lLCB0cnVlKTtcbiAgICAgICAgYmluZGluZ3MuaXNvbGF0ZVNjb3BlID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaW5kaW5ncy5pc29sYXRlU2NvcGUgPSBwYXJzZUlzb2xhdGVCaW5kaW5ncyhkaXJlY3RpdmUuc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KGRpcmVjdGl2ZS5iaW5kVG9Db250cm9sbGVyKSkge1xuICAgICAgYmluZGluZ3MuYmluZFRvQ29udHJvbGxlciA9XG4gICAgICAgICAgcGFyc2VJc29sYXRlQmluZGluZ3MoZGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIsIGRpcmVjdGl2ZU5hbWUsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZ3MuYmluZFRvQ29udHJvbGxlciAmJiAhZGlyZWN0aXZlLmNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIGNvbnRyb2xsZXJcbiAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdub2N0cmwnLFxuICAgICAgICAgICAgJ0Nhbm5vdCBiaW5kIHRvIGNvbnRyb2xsZXIgd2l0aG91dCBkaXJlY3RpdmUgXFwnezB9XFwncyBjb250cm9sbGVyLicsXG4gICAgICAgICAgICBkaXJlY3RpdmVOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmRpbmdzO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0VmFsaWREaXJlY3RpdmVOYW1lKG5hbWUpIHtcbiAgICB2YXIgbGV0dGVyID0gbmFtZS5jaGFyQXQoMCk7XG4gICAgaWYgKCFsZXR0ZXIgfHwgbGV0dGVyICE9PSBsb3dlcmNhc2UobGV0dGVyKSkge1xuICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ2JhZGRpcicsICdEaXJlY3RpdmUvQ29tcG9uZW50IG5hbWUgXFwnezB9XFwnIGlzIGludmFsaWQuIFRoZSBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxvd2VyY2FzZSBsZXR0ZXInLCBuYW1lKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgIT09IG5hbWUudHJpbSgpKSB7XG4gICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignYmFkZGlyJyxcbiAgICAgICAgICAgICdEaXJlY3RpdmUvQ29tcG9uZW50IG5hbWUgXFwnezB9XFwnIGlzIGludmFsaWQuIFRoZSBuYW1lIHNob3VsZCBub3QgY29udGFpbiBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2VzJyxcbiAgICAgICAgICAgIG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpcmVjdGl2ZVJlcXVpcmUoZGlyZWN0aXZlKSB7XG4gICAgdmFyIHJlcXVpcmUgPSBkaXJlY3RpdmUucmVxdWlyZSB8fCAoZGlyZWN0aXZlLmNvbnRyb2xsZXIgJiYgZGlyZWN0aXZlLm5hbWUpO1xuXG4gICAgaWYgKCFpc0FycmF5KHJlcXVpcmUpICYmIGlzT2JqZWN0KHJlcXVpcmUpKSB7XG4gICAgICBmb3JFYWNoKHJlcXVpcmUsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gdmFsdWUubWF0Y2goUkVRVUlSRV9QUkVGSVhfUkVHRVhQKTtcbiAgICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFuYW1lKSByZXF1aXJlW2tleV0gPSBtYXRjaFswXSArIGtleTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1aXJlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlyZWN0aXZlUmVzdHJpY3QocmVzdHJpY3QsIG5hbWUpIHtcbiAgICBpZiAocmVzdHJpY3QgJiYgIShpc1N0cmluZyhyZXN0cmljdCkgJiYgL1tFQUNNXS8udGVzdChyZXN0cmljdCkpKSB7XG4gICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignYmFkcmVzdHJpY3QnLFxuICAgICAgICAgICdSZXN0cmljdCBwcm9wZXJ0eSBcXCd7MH1cXCcgb2YgZGlyZWN0aXZlIFxcJ3sxfVxcJyBpcyBpbnZhbGlkJyxcbiAgICAgICAgICByZXN0cmljdCxcbiAgICAgICAgICBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdHJpY3QgfHwgJ0VBJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlciBhIG5ldyBkaXJlY3RpdmUgd2l0aCB0aGUgY29tcGlsZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBOYW1lIG9mIHRoZSBkaXJlY3RpdmUgaW4gY2FtZWwtY2FzZSAoaS5lLiA8Y29kZT5uZ0JpbmQ8L2NvZGU+IHdoaWNoXG4gICAqICAgIHdpbGwgbWF0Y2ggYXMgPGNvZGU+bmctYmluZDwvY29kZT4pLCBvciBhbiBvYmplY3QgbWFwIG9mIGRpcmVjdGl2ZXMgd2hlcmUgdGhlIGtleXMgYXJlIHRoZVxuICAgKiAgICBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGZhY3Rvcmllcy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gZGlyZWN0aXZlRmFjdG9yeSBBbiBpbmplY3RhYmxlIGRpcmVjdGl2ZSBmYWN0b3J5IGZ1bmN0aW9uLiBTZWUgdGhlXG4gICAqICAgIHtAbGluayBndWlkZS9kaXJlY3RpdmUgZGlyZWN0aXZlIGd1aWRlfSBhbmQgdGhlIHtAbGluayAkY29tcGlsZSBjb21waWxlIEFQSX0gZm9yIG1vcmUgaW5mby5cbiAgICogQHJldHVybnMge25nLiRjb21waWxlUHJvdmlkZXJ9IFNlbGYgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgdGhpcy5kaXJlY3RpdmUgPSBmdW5jdGlvbiByZWdpc3RlckRpcmVjdGl2ZShuYW1lLCBkaXJlY3RpdmVGYWN0b3J5KSB7XG4gICAgYXNzZXJ0QXJnKG5hbWUsICduYW1lJyk7XG4gICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgJ2RpcmVjdGl2ZScpO1xuICAgIGlmIChpc1N0cmluZyhuYW1lKSkge1xuICAgICAgYXNzZXJ0VmFsaWREaXJlY3RpdmVOYW1lKG5hbWUpO1xuICAgICAgYXNzZXJ0QXJnKGRpcmVjdGl2ZUZhY3RvcnksICdkaXJlY3RpdmVGYWN0b3J5Jyk7XG4gICAgICBpZiAoIWhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgaGFzRGlyZWN0aXZlc1tuYW1lXSA9IFtdO1xuICAgICAgICAkcHJvdmlkZS5mYWN0b3J5KG5hbWUgKyBTdWZmaXgsIFsnJGluamVjdG9yJywgJyRleGNlcHRpb25IYW5kbGVyJyxcbiAgICAgICAgICBmdW5jdGlvbigkaW5qZWN0b3IsICRleGNlcHRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlcyA9IFtdO1xuICAgICAgICAgICAgZm9yRWFjaChoYXNEaXJlY3RpdmVzW25hbWVdLCBmdW5jdGlvbihkaXJlY3RpdmVGYWN0b3J5LCBpbmRleCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkaXJlY3RpdmUgPSAkaW5qZWN0b3IuaW52b2tlKGRpcmVjdGl2ZUZhY3RvcnkpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGRpcmVjdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSA9IHsgY29tcGlsZTogdmFsdWVGbihkaXJlY3RpdmUpIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGlyZWN0aXZlLmNvbXBpbGUgJiYgZGlyZWN0aXZlLmxpbmspIHtcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5jb21waWxlID0gdmFsdWVGbihkaXJlY3RpdmUubGluayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5wcmlvcml0eSA9IGRpcmVjdGl2ZS5wcmlvcml0eSB8fCAwO1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5uYW1lID0gZGlyZWN0aXZlLm5hbWUgfHwgbmFtZTtcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVxdWlyZSA9IGdldERpcmVjdGl2ZVJlcXVpcmUoZGlyZWN0aXZlKTtcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVzdHJpY3QgPSBnZXREaXJlY3RpdmVSZXN0cmljdChkaXJlY3RpdmUucmVzdHJpY3QsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS4kJG1vZHVsZU5hbWUgPSBkaXJlY3RpdmVGYWN0b3J5LiQkbW9kdWxlTmFtZTtcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmVzLnB1c2goZGlyZWN0aXZlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmVzO1xuICAgICAgICAgIH1dKTtcbiAgICAgIH1cbiAgICAgIGhhc0RpcmVjdGl2ZXNbbmFtZV0ucHVzaChkaXJlY3RpdmVGYWN0b3J5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yRWFjaChuYW1lLCByZXZlcnNlUGFyYW1zKHJlZ2lzdGVyRGlyZWN0aXZlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjY29tcG9uZW50XG4gICAqIEBtb2R1bGUgbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGluIGNhbWVsQ2FzZSAoaS5lLiBgbXlDb21wYCB3aGljaCB3aWxsIG1hdGNoIGA8bXktY29tcD5gKVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb21wb25lbnQgZGVmaW5pdGlvbiBvYmplY3QgKGEgc2ltcGxpZmllZFxuICAgKiAgICB7QGxpbmsgbmcuJGNvbXBpbGUjZGlyZWN0aXZlLWRlZmluaXRpb24tb2JqZWN0IGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdH0pLFxuICAgKiAgICB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyAoYWxsIG9wdGlvbmFsKTpcbiAgICpcbiAgICogICAgLSBgY29udHJvbGxlcmAg4oCTIGB7KHN0cmluZ3xmdW5jdGlvbigpPX1gIOKAkyBjb250cm9sbGVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlXG4gICAqICAgICAgYXNzb2NpYXRlZCB3aXRoIG5ld2x5IGNyZWF0ZWQgc2NvcGUgb3IgdGhlIG5hbWUgb2YgYSB7QGxpbmsgbmcuJGNvbXBpbGUjLWNvbnRyb2xsZXItXG4gICAqICAgICAgcmVnaXN0ZXJlZCBjb250cm9sbGVyfSBpZiBwYXNzZWQgYXMgYSBzdHJpbmcuIEFuIGVtcHR5IGBub29wYCBmdW5jdGlvbiBieSBkZWZhdWx0LlxuICAgKiAgICAtIGBjb250cm9sbGVyQXNgIOKAkyBge3N0cmluZz19YCDigJMgaWRlbnRpZmllciBuYW1lIGZvciB0byByZWZlcmVuY2UgdGhlIGNvbnRyb2xsZXIgaW4gdGhlIGNvbXBvbmVudCdzIHNjb3BlLlxuICAgKiAgICAgIElmIHByZXNlbnQsIHRoZSBjb250cm9sbGVyIHdpbGwgYmUgcHVibGlzaGVkIHRvIHNjb3BlIHVuZGVyIHRoZSBgY29udHJvbGxlckFzYCBuYW1lLlxuICAgKiAgICAgIElmIG5vdCBwcmVzZW50LCB0aGlzIHdpbGwgZGVmYXVsdCB0byBiZSBgJGN0cmxgLlxuICAgKiAgICAtIGB0ZW1wbGF0ZWAg4oCTIGB7c3RyaW5nPXxmdW5jdGlvbigpPX1gIOKAkyBodG1sIHRlbXBsYXRlIGFzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdFxuICAgKiAgICAgIHJldHVybnMgYW4gaHRtbCB0ZW1wbGF0ZSBhcyBhIHN0cmluZyB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgY29udGVudHMgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqICAgICAgRW1wdHkgc3RyaW5nIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqICAgICAgSWYgYHRlbXBsYXRlYCBpcyBhIGZ1bmN0aW9uLCB0aGVuIGl0IGlzIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnZva2UgaW5qZWN0ZWR9IHdpdGhcbiAgICogICAgICB0aGUgZm9sbG93aW5nIGxvY2FsczpcbiAgICpcbiAgICogICAgICAtIGAkZWxlbWVudGAgLSBDdXJyZW50IGVsZW1lbnRcbiAgICogICAgICAtIGAkYXR0cnNgIC0gQ3VycmVudCBhdHRyaWJ1dGVzIG9iamVjdCBmb3IgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogICAgLSBgdGVtcGxhdGVVcmxgIOKAkyBge3N0cmluZz18ZnVuY3Rpb24oKT19YCDigJMgcGF0aCBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwYXRoIHRvIGFuIGh0bWxcbiAgICogICAgICB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkICBhcyB0aGUgY29udGVudHMgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqICAgICAgSWYgYHRlbXBsYXRlVXJsYCBpcyBhIGZ1bmN0aW9uLCB0aGVuIGl0IGlzIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnZva2UgaW5qZWN0ZWR9IHdpdGhcbiAgICogICAgICB0aGUgZm9sbG93aW5nIGxvY2FsczpcbiAgICpcbiAgICogICAgICAtIGAkZWxlbWVudGAgLSBDdXJyZW50IGVsZW1lbnRcbiAgICogICAgICAtIGAkYXR0cnNgIC0gQ3VycmVudCBhdHRyaWJ1dGVzIG9iamVjdCBmb3IgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogICAgLSBgYmluZGluZ3NgIOKAkyBge29iamVjdD19YCDigJMgZGVmaW5lcyBiaW5kaW5ncyBiZXR3ZWVuIERPTSBhdHRyaWJ1dGVzIGFuZCBjb21wb25lbnQgcHJvcGVydGllcy5cbiAgICogICAgICBDb21wb25lbnQgcHJvcGVydGllcyBhcmUgYWx3YXlzIGJvdW5kIHRvIHRoZSBjb21wb25lbnQgY29udHJvbGxlciBhbmQgbm90IHRvIHRoZSBzY29wZS5cbiAgICogICAgICBTZWUge0BsaW5rIG5nLiRjb21waWxlIy1iaW5kdG9jb250cm9sbGVyLSBgYmluZFRvQ29udHJvbGxlcmB9LlxuICAgKiAgICAtIGB0cmFuc2NsdWRlYCDigJMgYHtib29sZWFuPX1gIOKAkyB3aGV0aGVyIHtAbGluayAkY29tcGlsZSN0cmFuc2NsdXNpb24gY29udGVudCB0cmFuc2NsdXNpb259IGlzIGVuYWJsZWQuXG4gICAqICAgICAgRGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICogICAgLSBgcmVxdWlyZWAgLSBge09iamVjdDxzdHJpbmcsIHN0cmluZz49fWAgLSByZXF1aXJlcyB0aGUgY29udHJvbGxlcnMgb2Ygb3RoZXIgZGlyZWN0aXZlcyBhbmQgYmluZHMgdGhlbSB0b1xuICAgKiAgICAgIHRoaXMgY29tcG9uZW50J3MgY29udHJvbGxlci4gVGhlIG9iamVjdCBrZXlzIHNwZWNpZnkgdGhlIHByb3BlcnR5IG5hbWVzIHVuZGVyIHdoaWNoIHRoZSByZXF1aXJlZFxuICAgKiAgICAgIGNvbnRyb2xsZXJzIChvYmplY3QgdmFsdWVzKSB3aWxsIGJlIGJvdW5kLiBTZWUge0BsaW5rIG5nLiRjb21waWxlIy1yZXF1aXJlLSBgcmVxdWlyZWB9LlxuICAgKiAgICAtIGAkLi4uYCDigJMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGF0dGFjaCB0byB0aGUgZGlyZWN0aXZlIGZhY3RvcnkgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sbGVyXG4gICAqICAgICAgY29uc3RydWN0b3IgZnVuY3Rpb24uIChUaGlzIGlzIHVzZWQgYnkgdGhlIGNvbXBvbmVudCByb3V0ZXIgdG8gYW5ub3RhdGUpXG4gICAqXG4gICAqIEByZXR1cm5zIHtuZy4kY29tcGlsZVByb3ZpZGVyfSB0aGUgY29tcGlsZSBwcm92aWRlciBpdHNlbGYsIGZvciBjaGFpbmluZyBvZiBmdW5jdGlvbiBjYWxscy5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVyIGEgKipjb21wb25lbnQgZGVmaW5pdGlvbioqIHdpdGggdGhlIGNvbXBpbGVyLiBUaGlzIGlzIGEgc2hvcnRoYW5kIGZvciByZWdpc3RlcmluZyBhIHNwZWNpYWxcbiAgICogdHlwZSBvZiBkaXJlY3RpdmUsIHdoaWNoIHJlcHJlc2VudHMgYSBzZWxmLWNvbnRhaW5lZCBVSSBjb21wb25lbnQgaW4geW91ciBhcHBsaWNhdGlvbi4gU3VjaCBjb21wb25lbnRzXG4gICAqIGFyZSBhbHdheXMgaXNvbGF0ZWQgKGkuZS4gYHNjb3BlOiB7fWApIGFuZCBhcmUgYWx3YXlzIHJlc3RyaWN0ZWQgdG8gZWxlbWVudHMgKGkuZS4gYHJlc3RyaWN0OiAnRSdgKS5cbiAgICpcbiAgICogQ29tcG9uZW50IGRlZmluaXRpb25zIGFyZSB2ZXJ5IHNpbXBsZSBhbmQgZG8gbm90IHJlcXVpcmUgYXMgbXVjaCBjb25maWd1cmF0aW9uIGFzIGRlZmluaW5nIGdlbmVyYWxcbiAgICogZGlyZWN0aXZlcy4gQ29tcG9uZW50IGRlZmluaXRpb25zIHVzdWFsbHkgY29uc2lzdCBvbmx5IG9mIGEgdGVtcGxhdGUgYW5kIGEgY29udHJvbGxlciBiYWNraW5nIGl0LlxuICAgKlxuICAgKiBJbiBvcmRlciB0byBtYWtlIHRoZSBkZWZpbml0aW9uIGVhc2llciwgY29tcG9uZW50cyBlbmZvcmNlIGJlc3QgcHJhY3RpY2VzIGxpa2UgdXNlIG9mIGBjb250cm9sbGVyQXNgLFxuICAgKiBgYmluZFRvQ29udHJvbGxlcmAuIFRoZXkgYWx3YXlzIGhhdmUgKippc29sYXRlIHNjb3BlKiogYW5kIGFyZSByZXN0cmljdGVkIHRvIGVsZW1lbnRzLlxuICAgKlxuICAgKiBIZXJlIGFyZSBhIGZldyBleGFtcGxlcyBvZiBob3cgeW91IHdvdWxkIHVzdWFsbHkgZGVmaW5lIGNvbXBvbmVudHM6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqICAgdmFyIG15TW9kID0gYW5ndWxhci5tb2R1bGUoLi4uKTtcbiAgICogICBteU1vZC5jb21wb25lbnQoJ215Q29tcCcsIHtcbiAgICogICAgIHRlbXBsYXRlOiAnPGRpdj5NeSBuYW1lIGlzIHt7JGN0cmwubmFtZX19PC9kaXY+JyxcbiAgICogICAgIGNvbnRyb2xsZXI6IGZ1bmN0aW9uKCkge1xuICAgKiAgICAgICB0aGlzLm5hbWUgPSAnc2hhaGFyJztcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogICBteU1vZC5jb21wb25lbnQoJ215Q29tcCcsIHtcbiAgICogICAgIHRlbXBsYXRlOiAnPGRpdj5NeSBuYW1lIGlzIHt7JGN0cmwubmFtZX19PC9kaXY+JyxcbiAgICogICAgIGJpbmRpbmdzOiB7bmFtZTogJ0AnfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIG15TW9kLmNvbXBvbmVudCgnbXlDb21wJywge1xuICAgKiAgICAgdGVtcGxhdGVVcmw6ICd2aWV3cy9teS1jb21wLmh0bWwnLFxuICAgKiAgICAgY29udHJvbGxlcjogJ015Q3RybCcsXG4gICAqICAgICBjb250cm9sbGVyQXM6ICdjdHJsJyxcbiAgICogICAgIGJpbmRpbmdzOiB7bmFtZTogJ0AnfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBgYGBcbiAgICogRm9yIG1vcmUgZXhhbXBsZXMsIGFuZCBhbiBpbi1kZXB0aCBndWlkZSwgc2VlIHRoZSB7QGxpbmsgZ3VpZGUvY29tcG9uZW50IGNvbXBvbmVudCBndWlkZX0uXG4gICAqXG4gICAqIDxiciAvPlxuICAgKiBTZWUgYWxzbyB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgJGNvbXBpbGVQcm92aWRlci5kaXJlY3RpdmUoKX0uXG4gICAqL1xuICB0aGlzLmNvbXBvbmVudCA9IGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50KG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgY29udHJvbGxlciA9IG9wdGlvbnMuY29udHJvbGxlciB8fCBmdW5jdGlvbigpIHt9O1xuXG4gICAgZnVuY3Rpb24gZmFjdG9yeSgkaW5qZWN0b3IpIHtcbiAgICAgIGZ1bmN0aW9uIG1ha2VJbmplY3RhYmxlKGZuKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGZuKSB8fCBpc0FycmF5KGZuKSkge1xuICAgICAgICAgIHJldHVybiAvKiogQHRoaXMgKi8gZnVuY3Rpb24odEVsZW1lbnQsIHRBdHRycykge1xuICAgICAgICAgICAgcmV0dXJuICRpbmplY3Rvci5pbnZva2UoZm4sIHRoaXMsIHskZWxlbWVudDogdEVsZW1lbnQsICRhdHRyczogdEF0dHJzfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHRlbXBsYXRlID0gKCFvcHRpb25zLnRlbXBsYXRlICYmICFvcHRpb25zLnRlbXBsYXRlVXJsID8gJycgOiBvcHRpb25zLnRlbXBsYXRlKTtcbiAgICAgIHZhciBkZG8gPSB7XG4gICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIsXG4gICAgICAgIGNvbnRyb2xsZXJBczogaWRlbnRpZmllckZvckNvbnRyb2xsZXIob3B0aW9ucy5jb250cm9sbGVyKSB8fCBvcHRpb25zLmNvbnRyb2xsZXJBcyB8fCAnJGN0cmwnLFxuICAgICAgICB0ZW1wbGF0ZTogbWFrZUluamVjdGFibGUodGVtcGxhdGUpLFxuICAgICAgICB0ZW1wbGF0ZVVybDogbWFrZUluamVjdGFibGUob3B0aW9ucy50ZW1wbGF0ZVVybCksXG4gICAgICAgIHRyYW5zY2x1ZGU6IG9wdGlvbnMudHJhbnNjbHVkZSxcbiAgICAgICAgc2NvcGU6IHt9LFxuICAgICAgICBiaW5kVG9Db250cm9sbGVyOiBvcHRpb25zLmJpbmRpbmdzIHx8IHt9LFxuICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICByZXF1aXJlOiBvcHRpb25zLnJlcXVpcmVcbiAgICAgIH07XG5cbiAgICAgIC8vIENvcHkgYW5ub3RhdGlvbnMgKHN0YXJ0aW5nIHdpdGggJCkgb3ZlciB0byB0aGUgRERPXG4gICAgICBmb3JFYWNoKG9wdGlvbnMsIGZ1bmN0aW9uKHZhbCwga2V5KSB7XG4gICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnJCcpIGRkb1trZXldID0gdmFsO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZG87XG4gICAgfVxuXG4gICAgLy8gVE9ETyhwZXRlKSByZW1vdmUgdGhlIGZvbGxvd2luZyBgZm9yRWFjaGAgYmVmb3JlIHdlIHJlbGVhc2UgMS42LjBcbiAgICAvLyBUaGUgY29tcG9uZW50LXJvdXRlckAwLjIuMCBsb29rcyBmb3IgdGhlIGFubm90YXRpb25zIG9uIHRoZSBjb250cm9sbGVyIGNvbnN0cnVjdG9yXG4gICAgLy8gTm90aGluZyBpbiBBbmd1bGFyIGxvb2tzIGZvciBhbm5vdGF0aW9ucyBvbiB0aGUgZmFjdG9yeSBmdW5jdGlvbiBidXQgd2UgY2FuJ3QgcmVtb3ZlXG4gICAgLy8gaXQgZnJvbSAxLjUueCB5ZXQuXG5cbiAgICAvLyBDb3B5IGFueSBhbm5vdGF0aW9uIHByb3BlcnRpZXMgKHN0YXJ0aW5nIHdpdGggJCkgb3ZlciB0byB0aGUgZmFjdG9yeSBhbmQgY29udHJvbGxlciBjb25zdHJ1Y3RvciBmdW5jdGlvbnNcbiAgICAvLyBUaGVzZSBjb3VsZCBiZSB1c2VkIGJ5IGxpYnJhcmllcyBzdWNoIGFzIHRoZSBuZXcgY29tcG9uZW50IHJvdXRlclxuICAgIGZvckVhY2gob3B0aW9ucywgZnVuY3Rpb24odmFsLCBrZXkpIHtcbiAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgZmFjdG9yeVtrZXldID0gdmFsO1xuICAgICAgICAvLyBEb24ndCB0cnkgdG8gY29weSBvdmVyIGFubm90YXRpb25zIHRvIG5hbWVkIGNvbnRyb2xsZXJcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29udHJvbGxlcikpIGNvbnRyb2xsZXJba2V5XSA9IHZhbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZhY3RvcnkuJGluamVjdCA9IFsnJGluamVjdG9yJ107XG5cbiAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmUobmFtZSwgZmFjdG9yeSk7XG4gIH07XG5cblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY29tcGlsZVByb3ZpZGVyI2FIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0XG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXRyaWV2ZXMgb3Igb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgZm9yIHdoaXRlbGlzdGluZyBvZiBzYWZlXG4gICAqIHVybHMgZHVyaW5nIGFbaHJlZl0gc2FuaXRpemF0aW9uLlxuICAgKlxuICAgKiBUaGUgc2FuaXRpemF0aW9uIGlzIGEgc2VjdXJpdHkgbWVhc3VyZSBhaW1lZCBhdCBwcmV2ZW50aW5nIFhTUyBhdHRhY2tzIHZpYSBodG1sIGxpbmtzLlxuICAgKlxuICAgKiBBbnkgdXJsIGFib3V0IHRvIGJlIGFzc2lnbmVkIHRvIGFbaHJlZl0gdmlhIGRhdGEtYmluZGluZyBpcyBmaXJzdCBub3JtYWxpemVkIGFuZCB0dXJuZWQgaW50b1xuICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3RgXG4gICAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG9yaWdpbmFsIHVybCBpcyB3cml0dGVuIGludG8gdGhlIGRvbS4gT3RoZXJ3aXNlLFxuICAgKiB0aGUgYWJzb2x1dGUgdXJsIGlzIHByZWZpeGVkIHdpdGggYCd1bnNhZmU6J2Agc3RyaW5nIGFuZCBvbmx5IHRoZW4gaXMgaXQgd3JpdHRlbiBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7UmVnRXhwPX0gcmVnZXhwIE5ldyByZWdleHAgdG8gd2hpdGVsaXN0IHVybHMgd2l0aC5cbiAgICogQHJldHVybnMge1JlZ0V4cHxuZy4kY29tcGlsZVByb3ZpZGVyfSBDdXJyZW50IFJlZ0V4cCBpZiBjYWxsZWQgd2l0aG91dCB2YWx1ZSBvciBzZWxmIGZvclxuICAgKiAgICBjaGFpbmluZyBvdGhlcndpc2UuXG4gICAqL1xuICB0aGlzLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gZnVuY3Rpb24ocmVnZXhwKSB7XG4gICAgaWYgKGlzRGVmaW5lZChyZWdleHApKSB7XG4gICAgICAkJHNhbml0aXplVXJpUHJvdmlkZXIuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QocmVnZXhwKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0KCk7XG4gICAgfVxuICB9O1xuXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGNvbXBpbGVQcm92aWRlciNpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3RcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHJpZXZlcyBvciBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCBmb3Igd2hpdGVsaXN0aW5nIG9mIHNhZmVcbiAgICogdXJscyBkdXJpbmcgaW1nW3NyY10gc2FuaXRpemF0aW9uLlxuICAgKlxuICAgKiBUaGUgc2FuaXRpemF0aW9uIGlzIGEgc2VjdXJpdHkgbWVhc3VyZSBhaW1lZCBhdCBwcmV2ZW50IFhTUyBhdHRhY2tzIHZpYSBodG1sIGxpbmtzLlxuICAgKlxuICAgKiBBbnkgdXJsIGFib3V0IHRvIGJlIGFzc2lnbmVkIHRvIGltZ1tzcmNdIHZpYSBkYXRhLWJpbmRpbmcgaXMgZmlyc3Qgbm9ybWFsaXplZCBhbmQgdHVybmVkIGludG9cbiAgICogYW4gYWJzb2x1dGUgdXJsLiBBZnRlcndhcmRzLCB0aGUgdXJsIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdGBcbiAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsXG4gICAqIHRoZSBhYnNvbHV0ZSB1cmwgaXMgcHJlZml4ZWQgd2l0aCBgJ3Vuc2FmZTonYCBzdHJpbmcgYW5kIG9ubHkgdGhlbiBpcyBpdCB3cml0dGVuIGludG8gdGhlIERPTS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLlxuICAgKiBAcmV0dXJucyB7UmVnRXhwfG5nLiRjb21waWxlUHJvdmlkZXJ9IEN1cnJlbnQgUmVnRXhwIGlmIGNhbGxlZCB3aXRob3V0IHZhbHVlIG9yIHNlbGYgZm9yXG4gICAqICAgIGNoYWluaW5nIG90aGVyd2lzZS5cbiAgICovXG4gIHRoaXMuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gZnVuY3Rpb24ocmVnZXhwKSB7XG4gICAgaWYgKGlzRGVmaW5lZChyZWdleHApKSB7XG4gICAgICAkJHNhbml0aXplVXJpUHJvdmlkZXIuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0KHJlZ2V4cCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICQkc2FuaXRpemVVcmlQcm92aWRlci5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgICRjb21waWxlUHJvdmlkZXIjZGVidWdJbmZvRW5hYmxlZFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBlbmFibGVkIHVwZGF0ZSB0aGUgZGVidWdJbmZvRW5hYmxlZCBzdGF0ZSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGp1c3QgcmV0dXJuIHRoZVxuICAgKiBjdXJyZW50IGRlYnVnSW5mb0VuYWJsZWQgc3RhdGVcbiAgICogQHJldHVybnMgeyp9IGN1cnJlbnQgdmFsdWUgaWYgdXNlZCBhcyBnZXR0ZXIgb3IgaXRzZWxmIChjaGFpbmluZykgaWYgdXNlZCBhcyBzZXR0ZXJcbiAgICpcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZW5hYmxlL2Rpc2FibGUgdmFyaW91cyBkZWJ1ZyBydW50aW1lIGluZm9ybWF0aW9uIGluIHRoZSBjb21waWxlciBzdWNoIGFzIGFkZGluZ1xuICAgKiBiaW5kaW5nIGluZm9ybWF0aW9uIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBzY29wZSBvbiB0byBET00gZWxlbWVudHMuXG4gICAqIElmIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGFkZCB0aGUgZm9sbG93aW5nIHRvIERPTSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBib3VuZCB0byB0aGUgc2NvcGVcbiAgICogKiBgbmctYmluZGluZ2AgQ1NTIGNsYXNzXG4gICAqICogYCRiaW5kaW5nYCBkYXRhIHByb3BlcnR5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhpcyBpbiBwcm9kdWN0aW9uIGZvciBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0LiBTZWVcbiAgICoge0BsaW5rIGd1aWRlL3Byb2R1Y3Rpb24jZGlzYWJsaW5nLWRlYnVnLWRhdGEgRGlzYWJsaW5nIERlYnVnIERhdGF9IGZvciBtb3JlLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKi9cbiAgdmFyIGRlYnVnSW5mb0VuYWJsZWQgPSB0cnVlO1xuICB0aGlzLmRlYnVnSW5mb0VuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKSB7XG4gICAgaWYgKGlzRGVmaW5lZChlbmFibGVkKSkge1xuICAgICAgZGVidWdJbmZvRW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGRlYnVnSW5mb0VuYWJsZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgICRjb21waWxlUHJvdmlkZXIjcHJlQXNzaWduQmluZGluZ3NFbmFibGVkXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGVuYWJsZWQgdXBkYXRlIHRoZSBwcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWQgc3RhdGUgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBqdXN0IHJldHVybiB0aGVcbiAgICogY3VycmVudCBwcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWQgc3RhdGVcbiAgICogQHJldHVybnMgeyp9IGN1cnJlbnQgdmFsdWUgaWYgdXNlZCBhcyBnZXR0ZXIgb3IgaXRzZWxmIChjaGFpbmluZykgaWYgdXNlZCBhcyBzZXR0ZXJcbiAgICpcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZW5hYmxlL2Rpc2FibGUgd2hldGhlciBkaXJlY3RpdmUgY29udHJvbGxlcnMgYXJlIGFzc2lnbmVkIGJpbmRpbmdzIGJlZm9yZVxuICAgKiBjYWxsaW5nIHRoZSBjb250cm9sbGVyJ3MgY29uc3RydWN0b3IuXG4gICAqIElmIGVuYWJsZWQgKHRydWUpLCB0aGUgY29tcGlsZXIgYXNzaWducyB0aGUgdmFsdWUgb2YgZWFjaCBvZiB0aGUgYmluZGluZ3MgdG8gdGhlXG4gICAqIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2xsZXIgb2JqZWN0IGJlZm9yZSB0aGUgY29uc3RydWN0b3Igb2YgdGhpcyBvYmplY3QgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBJZiBkaXNhYmxlZCAoZmFsc2UpLCB0aGUgY29tcGlsZXIgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIGZpcnN0IGJlZm9yZSBhc3NpZ25pbmcgYmluZGluZ3MuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUgaW4gQW5ndWxhciAxLjUueCBidXQgd2lsbCBzd2l0Y2ggdG8gZmFsc2UgaW4gQW5ndWxhciAxLjYueC5cbiAgICovXG4gIHZhciBwcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWQgPSBmYWxzZTtcbiAgdGhpcy5wcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKSB7XG4gICAgaWYgKGlzRGVmaW5lZChlbmFibGVkKSkge1xuICAgICAgcHJlQXNzaWduQmluZGluZ3NFbmFibGVkID0gZW5hYmxlZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gcHJlQXNzaWduQmluZGluZ3NFbmFibGVkO1xuICB9O1xuXG5cbiAgdmFyIFRUTCA9IDEwO1xuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY29tcGlsZVByb3ZpZGVyI29uQ2hhbmdlc1R0bFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIGAkb25DaGFuZ2VzYCBob29rcyBjYW4gdHJpZ2dlciBuZXcgY2hhbmdlcyBiZWZvcmUgZ2l2aW5nIHVwIGFuZFxuICAgKiBhc3N1bWluZyB0aGF0IHRoZSBtb2RlbCBpcyB1bnN0YWJsZS5cbiAgICpcbiAgICogVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyAxMCBpdGVyYXRpb25zLlxuICAgKlxuICAgKiBJbiBjb21wbGV4IGFwcGxpY2F0aW9ucyBpdCdzIHBvc3NpYmxlIHRoYXQgZGVwZW5kZW5jaWVzIGJldHdlZW4gYCRvbkNoYW5nZXNgIGhvb2tzIGFuZCBiaW5kaW5ncyB3aWxsIHJlc3VsdFxuICAgKiBpbiBzZXZlcmFsIGl0ZXJhdGlvbnMgb2YgY2FsbHMgdG8gdGhlc2UgaG9va3MuIEhvd2V2ZXIgaWYgYW4gYXBwbGljYXRpb24gbmVlZHMgbW9yZSB0aGFuIHRoZSBkZWZhdWx0IDEwXG4gICAqIGl0ZXJhdGlvbnMgdG8gc3RhYmlsaXplIHRoZW4geW91IHNob3VsZCBpbnZlc3RpZ2F0ZSB3aGF0IGlzIGNhdXNpbmcgdGhlIG1vZGVsIHRvIGNvbnRpbnVvdXNseSBjaGFuZ2UgZHVyaW5nXG4gICAqIHRoZSBgJG9uQ2hhbmdlc2AgaG9vayBleGVjdXRpb24uXG4gICAqXG4gICAqIEluY3JlYXNpbmcgdGhlIFRUTCBjb3VsZCBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucywgc28geW91IHNob3VsZCBub3QgY2hhbmdlIGl0IHdpdGhvdXQgcHJvcGVyIGp1c3RpZmljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgbnVtYmVyIG9mIGAkb25DaGFuZ2VzYCBob29rIGl0ZXJhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8b2JqZWN0fSB0aGUgY3VycmVudCBsaW1pdCAob3IgYHRoaXNgIGlmIGNhbGxlZCBhcyBhIHNldHRlciBmb3IgY2hhaW5pbmcpXG4gICAqL1xuICB0aGlzLm9uQ2hhbmdlc1R0bCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIFRUTCA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBUVEw7XG4gIH07XG5cbiAgdmFyIGNvbW1lbnREaXJlY3RpdmVzRW5hYmxlZENvbmZpZyA9IHRydWU7XG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjY29tbWVudERpcmVjdGl2ZXNFbmFibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBJdCBpbmRpY2F0ZXMgdG8gdGhlIGNvbXBpbGVyXG4gICAqIHdoZXRoZXIgb3Igbm90IGRpcmVjdGl2ZXMgb24gY29tbWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIGZhbHNlIGRpc2FibGVzIHRoZSBjb21waWxhdGlvbiBvZiBkaXJlY3RpdmVzXG4gICAqIG9uIGNvbW1lbnRzIGZvciB0aGUgd2hvbGUgYXBwbGljYXRpb24uXG4gICAqIFRoaXMgcmVzdWx0cyBpbiBhIGNvbXBpbGF0aW9uIHBlcmZvcm1hbmNlIGdhaW4sXG4gICAqIGFzIHRoZSBjb21waWxlciBkb2Vzbid0IGhhdmUgdG8gY2hlY2sgY29tbWVudHMgd2hlbiBsb29raW5nIGZvciBkaXJlY3RpdmVzLlxuICAgKiBUaGlzIHNob3VsZCBob3dldmVyIG9ubHkgYmUgdXNlZCBpZiB5b3UgYXJlIHN1cmUgdGhhdCBubyBjb21tZW50IGRpcmVjdGl2ZXMgYXJlIHVzZWQgaW5cbiAgICogdGhlIGFwcGxpY2F0aW9uIChpbmNsdWRpbmcgYW55IDNyZCBwYXJ0eSBkaXJlY3RpdmVzKS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIGBmYWxzZWAgaWYgdGhlIGNvbXBpbGVyIG1heSBpZ25vcmUgZGlyZWN0aXZlcyBvbiBjb21tZW50c1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbnxvYmplY3R9IHRoZSBjdXJyZW50IHZhbHVlIChvciBgdGhpc2AgaWYgY2FsbGVkIGFzIGEgc2V0dGVyIGZvciBjaGFpbmluZylcbiAgICovXG4gIHRoaXMuY29tbWVudERpcmVjdGl2ZXNFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY29tbWVudERpcmVjdGl2ZXNFbmFibGVkQ29uZmlnID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1lbnREaXJlY3RpdmVzRW5hYmxlZENvbmZpZztcbiAgfTtcblxuXG4gIHZhciBjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkQ29uZmlnID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGNvbXBpbGVQcm92aWRlciNjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBJdCBpbmRpY2F0ZXMgdG8gdGhlIGNvbXBpbGVyXG4gICAqIHdoZXRoZXIgb3Igbm90IGRpcmVjdGl2ZXMgb24gZWxlbWVudCBjbGFzc2VzIHNob3VsZCBiZSBjb21waWxlZC5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBmYWxzZSBkaXNhYmxlcyB0aGUgY29tcGlsYXRpb24gb2YgZGlyZWN0aXZlc1xuICAgKiBvbiBlbGVtZW50IGNsYXNzZXMgZm9yIHRoZSB3aG9sZSBhcHBsaWNhdGlvbi5cbiAgICogVGhpcyByZXN1bHRzIGluIGEgY29tcGlsYXRpb24gcGVyZm9ybWFuY2UgZ2FpbixcbiAgICogYXMgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgaGF2ZSB0byBjaGVjayBlbGVtZW50IGNsYXNzZXMgd2hlbiBsb29raW5nIGZvciBkaXJlY3RpdmVzLlxuICAgKiBUaGlzIHNob3VsZCBob3dldmVyIG9ubHkgYmUgdXNlZCBpZiB5b3UgYXJlIHN1cmUgdGhhdCBubyBjbGFzcyBkaXJlY3RpdmVzIGFyZSB1c2VkIGluXG4gICAqIHRoZSBhcHBsaWNhdGlvbiAoaW5jbHVkaW5nIGFueSAzcmQgcGFydHkgZGlyZWN0aXZlcykuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZCBgZmFsc2VgIGlmIHRoZSBjb21waWxlciBtYXkgaWdub3JlIGRpcmVjdGl2ZXMgb24gZWxlbWVudCBjbGFzc2VzXG4gICAqIEByZXR1cm5zIHtib29sZWFufG9iamVjdH0gdGhlIGN1cnJlbnQgdmFsdWUgKG9yIGB0aGlzYCBpZiBjYWxsZWQgYXMgYSBzZXR0ZXIgZm9yIGNoYWluaW5nKVxuICAgKi9cbiAgdGhpcy5jc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY3NzQ2xhc3NEaXJlY3RpdmVzRW5hYmxlZENvbmZpZyA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkQ29uZmlnO1xuICB9O1xuXG4gIHRoaXMuJGdldCA9IFtcbiAgICAgICAgICAgICckaW5qZWN0b3InLCAnJGludGVycG9sYXRlJywgJyRleGNlcHRpb25IYW5kbGVyJywgJyR0ZW1wbGF0ZVJlcXVlc3QnLCAnJHBhcnNlJyxcbiAgICAgICAgICAgICckY29udHJvbGxlcicsICckcm9vdFNjb3BlJywgJyRzY2UnLCAnJGFuaW1hdGUnLCAnJCRzYW5pdGl6ZVVyaScsXG4gICAgZnVuY3Rpb24oJGluamVjdG9yLCAgICRpbnRlcnBvbGF0ZSwgICAkZXhjZXB0aW9uSGFuZGxlciwgICAkdGVtcGxhdGVSZXF1ZXN0LCAgICRwYXJzZSxcbiAgICAgICAgICAgICAkY29udHJvbGxlciwgICAkcm9vdFNjb3BlLCAgICRzY2UsICAgJGFuaW1hdGUsICAgJCRzYW5pdGl6ZVVyaSkge1xuXG4gICAgdmFyIFNJTVBMRV9BVFRSX05BTUUgPSAvXlxcdy87XG4gICAgdmFyIHNwZWNpYWxBdHRySG9sZGVyID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG5cbiAgICB2YXIgY29tbWVudERpcmVjdGl2ZXNFbmFibGVkID0gY29tbWVudERpcmVjdGl2ZXNFbmFibGVkQ29uZmlnO1xuICAgIHZhciBjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkID0gY3NzQ2xhc3NEaXJlY3RpdmVzRW5hYmxlZENvbmZpZztcblxuXG4gICAgdmFyIG9uQ2hhbmdlc1R0bCA9IFRUTDtcbiAgICAvLyBUaGUgb25DaGFuZ2VzIGhvb2tzIHNob3VsZCBhbGwgYmUgcnVuIHRvZ2V0aGVyIGluIGEgc2luZ2xlIGRpZ2VzdFxuICAgIC8vIFdoZW4gY2hhbmdlcyBvY2N1ciwgdGhlIGNhbGwgdG8gdHJpZ2dlciB0aGVpciBob29rcyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgcXVldWVcbiAgICB2YXIgb25DaGFuZ2VzUXVldWU7XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhICQkcG9zdERpZ2VzdCB0byB0cmlnZ2VyIGFsbCB0aGUgb25DaGFuZ2VzIGhvb2tzIGluIGEgc2luZ2xlIGRpZ2VzdFxuICAgIGZ1bmN0aW9uIGZsdXNoT25DaGFuZ2VzUXVldWUoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoISgtLW9uQ2hhbmdlc1R0bCkpIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIGhpdCB0aGUgVFRMIGxpbWl0IHNvIHJlc2V0IGV2ZXJ5dGhpbmdcbiAgICAgICAgICBvbkNoYW5nZXNRdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignaW5mY2huZycsICd7MH0gJG9uQ2hhbmdlcygpIGl0ZXJhdGlvbnMgcmVhY2hlZC4gQWJvcnRpbmchXFxuJywgVFRMKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBtdXN0IHJ1biB0aGlzIGhvb2sgaW4gYW4gYXBwbHkgc2luY2UgdGhlICQkcG9zdERpZ2VzdCBydW5zIG91dHNpZGUgYXBwbHlcbiAgICAgICAgJHJvb3RTY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG9uQ2hhbmdlc1F1ZXVlLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlc1F1ZXVlW2ldKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZXNldCB0aGUgcXVldWUgdG8gdHJpZ2dlciBhIG5ldyBzY2hlZHVsZSBuZXh0IHRpbWUgdGhlcmUgaXMgYSBjaGFuZ2VcbiAgICAgICAgICBvbkNoYW5nZXNRdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBvbkNoYW5nZXNUdGwrKztcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIEF0dHJpYnV0ZXMoZWxlbWVudCwgYXR0cmlidXRlc1RvQ29weSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZXNUb0NvcHkpIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzVG9Db3B5KTtcbiAgICAgICAgdmFyIGksIGwsIGtleTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIHRoaXNba2V5XSA9IGF0dHJpYnV0ZXNUb0NvcHlba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kYXR0ciA9IHt9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLiQkZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQXR0cmlidXRlcy5wcm90b3R5cGUgPSB7XG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRub3JtYWxpemVcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBDb252ZXJ0cyBhbiBhdHRyaWJ1dGUgbmFtZSAoZS5nLiBkYXNoL2NvbG9uL3VuZGVyc2NvcmUtZGVsaW1pdGVkIHN0cmluZywgb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIGB4LWAgb3JcbiAgICAgICAqIGBkYXRhLWApIHRvIGl0cyBub3JtYWxpemVkLCBjYW1lbENhc2UgZm9ybS5cbiAgICAgICAqXG4gICAgICAgKiBBbHNvIHRoZXJlIGlzIHNwZWNpYWwgY2FzZSBmb3IgTW96IHByZWZpeCBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UgbGV0dGVyLlxuICAgICAgICpcbiAgICAgICAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGNoZWNrIG91dCB0aGUgZ3VpZGUgb24ge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSNtYXRjaGluZy1kaXJlY3RpdmVzIE1hdGNoaW5nIERpcmVjdGl2ZXN9XG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSB0byBub3JtYWxpemVcbiAgICAgICAqL1xuICAgICAgJG5vcm1hbGl6ZTogZGlyZWN0aXZlTm9ybWFsaXplLFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMjJGFkZENsYXNzXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogQWRkcyB0aGUgQ1NTIGNsYXNzIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgY2xhc3NWYWwgcGFyYW1ldGVyIHRvIHRoZSBlbGVtZW50LiBJZiBhbmltYXRpb25zXG4gICAgICAgKiBhcmUgZW5hYmxlZCB0aGVuIGFuIGFuaW1hdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCBmb3IgdGhlIGNsYXNzIGFkZGl0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1ZhbCBUaGUgY2xhc3NOYW1lIHZhbHVlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudFxuICAgICAgICovXG4gICAgICAkYWRkQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzVmFsKSB7XG4gICAgICAgIGlmIChjbGFzc1ZhbCAmJiBjbGFzc1ZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIGNsYXNzVmFsKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkcmVtb3ZlQ2xhc3NcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBSZW1vdmVzIHRoZSBDU1MgY2xhc3MgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBjbGFzc1ZhbCBwYXJhbWV0ZXIgZnJvbSB0aGUgZWxlbWVudC4gSWZcbiAgICAgICAqIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQgdGhlbiBhbiBhbmltYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgZm9yIHRoZSBjbGFzcyByZW1vdmFsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1ZhbCBUaGUgY2xhc3NOYW1lIHZhbHVlIHRoYXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnRcbiAgICAgICAqL1xuICAgICAgJHJlbW92ZUNsYXNzOiBmdW5jdGlvbihjbGFzc1ZhbCkge1xuICAgICAgICBpZiAoY2xhc3NWYWwgJiYgY2xhc3NWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCBjbGFzc1ZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMjJHVwZGF0ZUNsYXNzXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogQWRkcyBhbmQgcmVtb3ZlcyB0aGUgYXBwcm9wcmlhdGUgQ1NTIGNsYXNzIHZhbHVlcyB0byB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZVxuICAgICAgICogYmV0d2VlbiB0aGUgbmV3IGFuZCBvbGQgQ1NTIGNsYXNzIHZhbHVlcyAoc3BlY2lmaWVkIGFzIG5ld0NsYXNzZXMgYW5kIG9sZENsYXNzZXMpLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDbGFzc2VzIFRoZSBjdXJyZW50IENTUyBjbGFzc05hbWUgdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRDbGFzc2VzIFRoZSBmb3JtZXIgQ1NTIGNsYXNzTmFtZSB2YWx1ZVxuICAgICAgICovXG4gICAgICAkdXBkYXRlQ2xhc3M6IGZ1bmN0aW9uKG5ld0NsYXNzZXMsIG9sZENsYXNzZXMpIHtcbiAgICAgICAgdmFyIHRvQWRkID0gdG9rZW5EaWZmZXJlbmNlKG5ld0NsYXNzZXMsIG9sZENsYXNzZXMpO1xuICAgICAgICBpZiAodG9BZGQgJiYgdG9BZGQubGVuZ3RoKSB7XG4gICAgICAgICAgJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIHRvQWRkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0b1JlbW92ZSA9IHRva2VuRGlmZmVyZW5jZShvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTtcbiAgICAgICAgaWYgKHRvUmVtb3ZlICYmIHRvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCB0b1JlbW92ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgbm9ybWFsaXplZCBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgaW4gYSB3YXkgc3VjaCB0aGF0IGFsbCBkaXJlY3RpdmVzXG4gICAgICAgKiBjYW4gc2hhcmUgdGhlIGF0dHJpYnV0ZS4gVGhpcyBmdW5jdGlvbiBwcm9wZXJseSBoYW5kbGVzIGJvb2xlYW4gYXR0cmlidXRlcy5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTm9ybWFsaXplZCBrZXkuIChpZSBuZ0F0dHJpYnV0ZSlcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfGJvb2xlYW59IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuIElmIGBudWxsYCBhdHRyaWJ1dGUgd2lsbCBiZSBkZWxldGVkLlxuICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gd3JpdGVBdHRyIElmIGZhbHNlLCBkb2VzIG5vdCB3cml0ZSB0aGUgdmFsdWUgdG8gRE9NIGVsZW1lbnQgYXR0cmlidXRlLlxuICAgICAgICogICAgIERlZmF1bHRzIHRvIHRydWUuXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJOYW1lIE9wdGlvbmFsIG5vbmUgbm9ybWFsaXplZCBuYW1lLiBEZWZhdWx0cyB0byBrZXkuXG4gICAgICAgKi9cbiAgICAgICRzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUsIHdyaXRlQXR0ciwgYXR0ck5hbWUpIHtcbiAgICAgICAgLy8gVE9ETzogZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHRocm93IGFuIGVycm9yIGlmIFwiY2xhc3NcIlxuICAgICAgICAvL2lzIHNldCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc2luY2UgaXQgbWF5IGNhdXNlICR1cGRhdGVDbGFzcyB0b1xuICAgICAgICAvL2JlY29tZSB1bnN0YWJsZS5cblxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuJCRlbGVtZW50WzBdLFxuICAgICAgICAgICAgYm9vbGVhbktleSA9IGdldEJvb2xlYW5BdHRyTmFtZShub2RlLCBrZXkpLFxuICAgICAgICAgICAgYWxpYXNlZEtleSA9IGdldEFsaWFzZWRBdHRyTmFtZShrZXkpLFxuICAgICAgICAgICAgb2JzZXJ2ZXIgPSBrZXksXG4gICAgICAgICAgICBub2RlTmFtZTtcblxuICAgICAgICBpZiAoYm9vbGVhbktleSkge1xuICAgICAgICAgIHRoaXMuJCRlbGVtZW50LnByb3Aoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgYXR0ck5hbWUgPSBib29sZWFuS2V5O1xuICAgICAgICB9IGVsc2UgaWYgKGFsaWFzZWRLZXkpIHtcbiAgICAgICAgICB0aGlzW2FsaWFzZWRLZXldID0gdmFsdWU7XG4gICAgICAgICAgb2JzZXJ2ZXIgPSBhbGlhc2VkS2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG5cbiAgICAgICAgLy8gdHJhbnNsYXRlIG5vcm1hbGl6ZWQga2V5IHRvIGFjdHVhbCBrZXlcbiAgICAgICAgaWYgKGF0dHJOYW1lKSB7XG4gICAgICAgICAgdGhpcy4kYXR0cltrZXldID0gYXR0ck5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0ck5hbWUgPSB0aGlzLiRhdHRyW2tleV07XG4gICAgICAgICAgaWYgKCFhdHRyTmFtZSkge1xuICAgICAgICAgICAgdGhpcy4kYXR0cltrZXldID0gYXR0ck5hbWUgPSBzbmFrZV9jYXNlKGtleSwgJy0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBub2RlTmFtZSA9IG5vZGVOYW1lXyh0aGlzLiQkZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKChub2RlTmFtZSA9PT0gJ2EnICYmIChrZXkgPT09ICdocmVmJyB8fCBrZXkgPT09ICd4bGlua0hyZWYnKSkgfHxcbiAgICAgICAgICAgIChub2RlTmFtZSA9PT0gJ2ltZycgJiYga2V5ID09PSAnc3JjJykpIHtcbiAgICAgICAgICAvLyBzYW5pdGl6ZSBhW2hyZWZdIGFuZCBpbWdbc3JjXSB2YWx1ZXNcbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZSA9ICQkc2FuaXRpemVVcmkodmFsdWUsIGtleSA9PT0gJ3NyYycpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiBrZXkgPT09ICdzcmNzZXQnICYmIGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBzYW5pdGl6ZSBpbWdbc3Jjc2V0XSB2YWx1ZXNcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGVyZSBhcmUgc3BhY2VzIGJlY2F1c2UgaXQncyBub3QgdGhlIHNhbWUgcGF0dGVyblxuICAgICAgICAgIHZhciB0cmltbWVkU3Jjc2V0ID0gdHJpbSh2YWx1ZSk7XG4gICAgICAgICAgLy8gICAgICAgICAgICAgICAgKCAgIDk5OXggICAsfCAgIDk5OXcgICAsfCAgICx8LCAgIClcbiAgICAgICAgICB2YXIgc3JjUGF0dGVybiA9IC8oXFxzK1xcZCt4XFxzKix8XFxzK1xcZCt3XFxzKix8XFxzKyx8LFxccyspLztcbiAgICAgICAgICB2YXIgcGF0dGVybiA9IC9cXHMvLnRlc3QodHJpbW1lZFNyY3NldCkgPyBzcmNQYXR0ZXJuIDogLygsKS87XG5cbiAgICAgICAgICAvLyBzcGxpdCBzcmNzZXQgaW50byB0dXBsZSBvZiB1cmkgYW5kIGRlc2NyaXB0b3IgZXhjZXB0IGZvciB0aGUgbGFzdCBpdGVtXG4gICAgICAgICAgdmFyIHJhd1VyaXMgPSB0cmltbWVkU3Jjc2V0LnNwbGl0KHBhdHRlcm4pO1xuXG4gICAgICAgICAgLy8gZm9yIGVhY2ggdHVwbGVzXG4gICAgICAgICAgdmFyIG5iclVyaXNXaXRoMnBhcnRzID0gTWF0aC5mbG9vcihyYXdVcmlzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmJyVXJpc1dpdGgycGFydHM7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlubmVySWR4ID0gaSAqIDI7XG4gICAgICAgICAgICAvLyBzYW5pdGl6ZSB0aGUgdXJpXG4gICAgICAgICAgICByZXN1bHQgKz0gJCRzYW5pdGl6ZVVyaSh0cmltKHJhd1VyaXNbaW5uZXJJZHhdKSwgdHJ1ZSk7XG4gICAgICAgICAgICAvLyBhZGQgdGhlIGRlc2NyaXB0b3JcbiAgICAgICAgICAgIHJlc3VsdCArPSAoJyAnICsgdHJpbShyYXdVcmlzW2lubmVySWR4ICsgMV0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzcGxpdCB0aGUgbGFzdCBpdGVtIGludG8gdXJpIGFuZCBkZXNjcmlwdG9yXG4gICAgICAgICAgdmFyIGxhc3RUdXBsZSA9IHRyaW0ocmF3VXJpc1tpICogMl0pLnNwbGl0KC9cXHMvKTtcblxuICAgICAgICAgIC8vIHNhbml0aXplIHRoZSBsYXN0IHVyaVxuICAgICAgICAgIHJlc3VsdCArPSAkJHNhbml0aXplVXJpKHRyaW0obGFzdFR1cGxlWzBdKSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBhbmQgYWRkIHRoZSBsYXN0IGRlc2NyaXB0b3IgaWYgYW55XG4gICAgICAgICAgaWYgKGxhc3RUdXBsZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAoJyAnICsgdHJpbShsYXN0VHVwbGVbMV0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpc1trZXldID0gdmFsdWUgPSByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod3JpdGVBdHRyICE9PSBmYWxzZSkge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCBpc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuJCRlbGVtZW50LnJlbW92ZUF0dHIoYXR0ck5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoU0lNUExFX0FUVFJfTkFNRS50ZXN0KGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICB0aGlzLiQkZWxlbWVudC5hdHRyKGF0dHJOYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXRTcGVjaWFsQXR0cih0aGlzLiQkZWxlbWVudFswXSwgYXR0ck5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJlIG9ic2VydmVyc1xuICAgICAgICB2YXIgJCRvYnNlcnZlcnMgPSB0aGlzLiQkb2JzZXJ2ZXJzO1xuICAgICAgICBpZiAoJCRvYnNlcnZlcnMpIHtcbiAgICAgICAgICBmb3JFYWNoKCQkb2JzZXJ2ZXJzW29ic2VydmVyXSwgZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZuKHZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkb2JzZXJ2ZVxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIE9ic2VydmVzIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUuXG4gICAgICAgKlxuICAgICAgICogVGhlIG9ic2VydmVyIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbmNlIGR1cmluZyB0aGUgbmV4dCBgJGRpZ2VzdGAgZm9sbG93aW5nXG4gICAgICAgKiBjb21waWxhdGlvbi4gVGhlIG9ic2VydmVyIGlzIHRoZW4gaW52b2tlZCB3aGVuZXZlciB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlXG4gICAgICAgKiBjaGFuZ2VzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTm9ybWFsaXplZCBrZXkuIChpZSBuZ0F0dHJpYnV0ZSkgLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihpbnRlcnBvbGF0ZWRWYWx1ZSl9IGZuIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXJcbiAgICAgICAgICAgICAgICB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgY2hhbmdlcy5cbiAgICAgICAqICAgICAgICBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uI2hvdy10ZXh0LWFuZC1hdHRyaWJ1dGUtYmluZGluZ3Mtd29yayBJbnRlcnBvbGF0aW9uXG4gICAgICAgKiAgICAgICAgZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIG9ic2VydmVyLlxuICAgICAgICovXG4gICAgICAkb2JzZXJ2ZTogZnVuY3Rpb24oa2V5LCBmbikge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLFxuICAgICAgICAgICAgJCRvYnNlcnZlcnMgPSAoYXR0cnMuJCRvYnNlcnZlcnMgfHwgKGF0dHJzLiQkb2JzZXJ2ZXJzID0gY3JlYXRlTWFwKCkpKSxcbiAgICAgICAgICAgIGxpc3RlbmVycyA9ICgkJG9ic2VydmVyc1trZXldIHx8ICgkJG9ic2VydmVyc1trZXldID0gW10pKTtcblxuICAgICAgICBsaXN0ZW5lcnMucHVzaChmbik7XG4gICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoIWxpc3RlbmVycy4kJGludGVyICYmIGF0dHJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIWlzVW5kZWZpbmVkKGF0dHJzW2tleV0pKSB7XG4gICAgICAgICAgICAvLyBubyBvbmUgcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiwgc28gbGV0cyBjYWxsIGl0IG1hbnVhbGx5XG4gICAgICAgICAgICBmbihhdHRyc1trZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBhcnJheVJlbW92ZShsaXN0ZW5lcnMsIGZuKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gc2V0U3BlY2lhbEF0dHIoZWxlbWVudCwgYXR0ck5hbWUsIHZhbHVlKSB7XG4gICAgICAvLyBBdHRyaWJ1dGVzIG5hbWVzIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggbGV0dGVycyAoc3VjaCBhcyBgKGNsaWNrKWApIGNhbm5vdCBiZSBzZXQgdXNpbmcgYHNldEF0dHJpYnV0ZWBcbiAgICAgIC8vIHNvIHdlIGhhdmUgdG8ganVtcCB0aHJvdWdoIHNvbWUgaG9vcHMgdG8gZ2V0IHN1Y2ggYW4gYXR0cmlidXRlXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3B1bGwvMTMzMThcbiAgICAgIHNwZWNpYWxBdHRySG9sZGVyLmlubmVySFRNTCA9ICc8c3BhbiAnICsgYXR0ck5hbWUgKyAnPic7XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHNwZWNpYWxBdHRySG9sZGVyLmZpcnN0Q2hpbGQuYXR0cmlidXRlcztcbiAgICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWzBdO1xuICAgICAgLy8gV2UgaGF2ZSB0byByZW1vdmUgdGhlIGF0dHJpYnV0ZSBmcm9tIGl0cyBjb250YWluZXIgZWxlbWVudCBiZWZvcmUgd2UgY2FuIGFkZCBpdCB0byB0aGUgZGVzdGluYXRpb24gZWxlbWVudFxuICAgICAgYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0oYXR0cmlidXRlLm5hbWUpO1xuICAgICAgYXR0cmlidXRlLnZhbHVlID0gdmFsdWU7XG4gICAgICBlbGVtZW50LmF0dHJpYnV0ZXMuc2V0TmFtZWRJdGVtKGF0dHJpYnV0ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2FmZUFkZENsYXNzKCRlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICRlbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgc2luY2UgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIHNldCBjbGFzcyBvblxuICAgICAgICAvLyBTVkcgZWxlbWVudCwgd2hlcmUgY2xhc3MgbmFtZSBpcyByZWFkLW9ubHkuXG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB2YXIgc3RhcnRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuc3RhcnRTeW1ib2woKSxcbiAgICAgICAgZW5kU3ltYm9sID0gJGludGVycG9sYXRlLmVuZFN5bWJvbCgpLFxuICAgICAgICBkZW5vcm1hbGl6ZVRlbXBsYXRlID0gKHN0YXJ0U3ltYm9sID09PSAne3snICYmIGVuZFN5bWJvbCAgPT09ICd9fScpXG4gICAgICAgICAgICA/IGlkZW50aXR5XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIGRlbm9ybWFsaXplVGVtcGxhdGUodGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xce1xcey9nLCBzdGFydFN5bWJvbCkucmVwbGFjZSgvfX0vZywgZW5kU3ltYm9sKTtcbiAgICAgICAgfSxcbiAgICAgICAgTkdfQVRUUl9CSU5ESU5HID0gL15uZ0F0dHJbQS1aXS87XG4gICAgdmFyIE1VTFRJX0VMRU1FTlRfRElSX1JFID0gL14oLispU3RhcnQkLztcblxuICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyA9IGRlYnVnSW5mb0VuYWJsZWQgPyBmdW5jdGlvbiAkJGFkZEJpbmRpbmdJbmZvKCRlbGVtZW50LCBiaW5kaW5nKSB7XG4gICAgICB2YXIgYmluZGluZ3MgPSAkZWxlbWVudC5kYXRhKCckYmluZGluZycpIHx8IFtdO1xuXG4gICAgICBpZiAoaXNBcnJheShiaW5kaW5nKSkge1xuICAgICAgICBiaW5kaW5ncyA9IGJpbmRpbmdzLmNvbmNhdChiaW5kaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpbmRpbmdzLnB1c2goYmluZGluZyk7XG4gICAgICB9XG5cbiAgICAgICRlbGVtZW50LmRhdGEoJyRiaW5kaW5nJywgYmluZGluZ3MpO1xuICAgIH0gOiBub29wO1xuXG4gICAgY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyA9IGRlYnVnSW5mb0VuYWJsZWQgPyBmdW5jdGlvbiAkJGFkZEJpbmRpbmdDbGFzcygkZWxlbWVudCkge1xuICAgICAgc2FmZUFkZENsYXNzKCRlbGVtZW50LCAnbmctYmluZGluZycpO1xuICAgIH0gOiBub29wO1xuXG4gICAgY29tcGlsZS4kJGFkZFNjb3BlSW5mbyA9IGRlYnVnSW5mb0VuYWJsZWQgPyBmdW5jdGlvbiAkJGFkZFNjb3BlSW5mbygkZWxlbWVudCwgc2NvcGUsIGlzb2xhdGVkLCBub1RlbXBsYXRlKSB7XG4gICAgICB2YXIgZGF0YU5hbWUgPSBpc29sYXRlZCA/IChub1RlbXBsYXRlID8gJyRpc29sYXRlU2NvcGVOb1RlbXBsYXRlJyA6ICckaXNvbGF0ZVNjb3BlJykgOiAnJHNjb3BlJztcbiAgICAgICRlbGVtZW50LmRhdGEoZGF0YU5hbWUsIHNjb3BlKTtcbiAgICB9IDogbm9vcDtcblxuICAgIGNvbXBpbGUuJCRhZGRTY29wZUNsYXNzID0gZGVidWdJbmZvRW5hYmxlZCA/IGZ1bmN0aW9uICQkYWRkU2NvcGVDbGFzcygkZWxlbWVudCwgaXNvbGF0ZWQpIHtcbiAgICAgIHNhZmVBZGRDbGFzcygkZWxlbWVudCwgaXNvbGF0ZWQgPyAnbmctaXNvbGF0ZS1zY29wZScgOiAnbmctc2NvcGUnKTtcbiAgICB9IDogbm9vcDtcblxuICAgIGNvbXBpbGUuJCRjcmVhdGVDb21tZW50ID0gZnVuY3Rpb24oZGlyZWN0aXZlTmFtZSwgY29tbWVudCkge1xuICAgICAgdmFyIGNvbnRlbnQgPSAnJztcbiAgICAgIGlmIChkZWJ1Z0luZm9FbmFibGVkKSB7XG4gICAgICAgIGNvbnRlbnQgPSAnICcgKyAoZGlyZWN0aXZlTmFtZSB8fCAnJykgKyAnOiAnO1xuICAgICAgICBpZiAoY29tbWVudCkgY29udGVudCArPSBjb21tZW50ICsgJyAnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVDb21tZW50KGNvbnRlbnQpO1xuICAgIH07XG5cbiAgICByZXR1cm4gY29tcGlsZTtcblxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIGZ1bmN0aW9uIGNvbXBpbGUoJGNvbXBpbGVOb2RlcywgdHJhbnNjbHVkZUZuLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkge1xuICAgICAgaWYgKCEoJGNvbXBpbGVOb2RlcyBpbnN0YW5jZW9mIGpxTGl0ZSkpIHtcbiAgICAgICAgLy8ganF1ZXJ5IGFsd2F5cyByZXdyYXBzLCB3aGVyZWFzIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsIHNlbGVjdG9yIHNvIHRoYXQgd2UgY2FuXG4gICAgICAgIC8vIG1vZGlmeSBpdC5cbiAgICAgICAgJGNvbXBpbGVOb2RlcyA9IGpxTGl0ZSgkY29tcGlsZU5vZGVzKTtcbiAgICAgIH1cbiAgICAgIHZhciBjb21wb3NpdGVMaW5rRm4gPVxuICAgICAgICAgICAgICBjb21waWxlTm9kZXMoJGNvbXBpbGVOb2RlcywgdHJhbnNjbHVkZUZuLCAkY29tcGlsZU5vZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSwgcHJldmlvdXNDb21waWxlQ29udGV4dCk7XG4gICAgICBjb21waWxlLiQkYWRkU2NvcGVDbGFzcygkY29tcGlsZU5vZGVzKTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBudWxsO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHB1YmxpY0xpbmtGbihzY29wZSwgY2xvbmVDb25uZWN0Rm4sIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCEkY29tcGlsZU5vZGVzKSB7XG4gICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ211bHRpbGluaycsICdUaGlzIGVsZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBsaW5rZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJnKHNjb3BlLCAnc2NvcGUnKTtcblxuICAgICAgICBpZiAocHJldmlvdXNDb21waWxlQ29udGV4dCAmJiBwcmV2aW91c0NvbXBpbGVDb250ZXh0Lm5lZWRzTmV3U2NvcGUpIHtcbiAgICAgICAgICAvLyBBIHBhcmVudCBkaXJlY3RpdmUgZGlkIGEgcmVwbGFjZSBhbmQgYSBkaXJlY3RpdmUgb24gdGhpcyBlbGVtZW50IGFza2VkXG4gICAgICAgICAgLy8gZm9yIHRyYW5zY2x1c2lvbiwgd2hpY2ggY2F1c2VkIHVzIHRvIGxvc2UgYSBsYXllciBvZiBlbGVtZW50IG9uIHdoaWNoXG4gICAgICAgICAgLy8gd2UgY291bGQgaG9sZCB0aGUgbmV3IHRyYW5zY2x1c2lvbiBzY29wZSwgc28gd2Ugd2lsbCBjcmVhdGUgaXQgbWFudWFsbHlcbiAgICAgICAgICAvLyBoZXJlLlxuICAgICAgICAgIHNjb3BlID0gc2NvcGUuJHBhcmVudC4kbmV3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdmFyIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuID0gb3B0aW9ucy5wYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbixcbiAgICAgICAgICB0cmFuc2NsdWRlQ29udHJvbGxlcnMgPSBvcHRpb25zLnRyYW5zY2x1ZGVDb250cm9sbGVycyxcbiAgICAgICAgICBmdXR1cmVQYXJlbnRFbGVtZW50ID0gb3B0aW9ucy5mdXR1cmVQYXJlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIFdoZW4gYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCBpcyBwYXNzZWQsIGl0IGlzIGFcbiAgICAgICAgLy8gYGNvbnRyb2xsZXJzQm91bmRUcmFuc2NsdWRlYCBmdW5jdGlvbiAoaXQgd2FzIHByZXZpb3VzbHkgcGFzc2VkXG4gICAgICAgIC8vIGFzIGB0cmFuc2NsdWRlYCB0byBkaXJlY3RpdmUubGluaykgc28gd2UgbXVzdCB1bndyYXAgaXQgdG8gZ2V0XG4gICAgICAgIC8vIGl0cyBgYm91bmRUcmFuc2NsdWRlRm5gXG4gICAgICAgIGlmIChwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbiAmJiBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbi4kJGJvdW5kVHJhbnNjbHVkZSkge1xuICAgICAgICAgIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuID0gcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4uJCRib3VuZFRyYW5zY2x1ZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5hbWVzcGFjZSkge1xuICAgICAgICAgIG5hbWVzcGFjZSA9IGRldGVjdE5hbWVzcGFjZUZvckNoaWxkRWxlbWVudHMoZnV0dXJlUGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICRsaW5rTm9kZTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSAhPT0gJ2h0bWwnKSB7XG4gICAgICAgICAgLy8gV2hlbiB1c2luZyBhIGRpcmVjdGl2ZSB3aXRoIHJlcGxhY2U6dHJ1ZSBhbmQgdGVtcGxhdGVVcmwgdGhlICRjb21waWxlTm9kZXNcbiAgICAgICAgICAvLyAob3IgYSBjaGlsZCBlbGVtZW50IGluc2lkZSBvZiB0aGVtKVxuICAgICAgICAgIC8vIG1pZ2h0IGNoYW5nZSwgc28gd2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgbmFtZXNwYWNlIGFkYXB0ZWQgY29tcGlsZU5vZGVzXG4gICAgICAgICAgLy8gZm9yIGNhbGwgdG8gdGhlIGxpbmsgZnVuY3Rpb24uXG4gICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGFscmVhZHkgY2xvbmUgdGhlIG5vZGVzLi4uXG4gICAgICAgICAgJGxpbmtOb2RlID0ganFMaXRlKFxuICAgICAgICAgICAgd3JhcFRlbXBsYXRlKG5hbWVzcGFjZSwganFMaXRlKCc8ZGl2PicpLmFwcGVuZCgkY29tcGlsZU5vZGVzKS5odG1sKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChjbG9uZUNvbm5lY3RGbikge1xuICAgICAgICAgIC8vIGltcG9ydGFudCEhOiB3ZSBtdXN0IGNhbGwgb3VyIGpxTGl0ZS5jbG9uZSgpIHNpbmNlIHRoZSBqUXVlcnkgb25lIGlzIHRyeWluZyB0byBiZSBzbWFydFxuICAgICAgICAgIC8vIGFuZCBzb21ldGltZXMgY2hhbmdlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBET00uXG4gICAgICAgICAgJGxpbmtOb2RlID0gSlFMaXRlUHJvdG90eXBlLmNsb25lLmNhbGwoJGNvbXBpbGVOb2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGxpbmtOb2RlID0gJGNvbXBpbGVOb2RlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFuc2NsdWRlQ29udHJvbGxlcnMpIHtcbiAgICAgICAgICBmb3IgKHZhciBjb250cm9sbGVyTmFtZSBpbiB0cmFuc2NsdWRlQ29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgICRsaW5rTm9kZS5kYXRhKCckJyArIGNvbnRyb2xsZXJOYW1lICsgJ0NvbnRyb2xsZXInLCB0cmFuc2NsdWRlQ29udHJvbGxlcnNbY29udHJvbGxlck5hbWVdLmluc3RhbmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlLiQkYWRkU2NvcGVJbmZvKCRsaW5rTm9kZSwgc2NvcGUpO1xuXG4gICAgICAgIGlmIChjbG9uZUNvbm5lY3RGbikgY2xvbmVDb25uZWN0Rm4oJGxpbmtOb2RlLCBzY29wZSk7XG4gICAgICAgIGlmIChjb21wb3NpdGVMaW5rRm4pIGNvbXBvc2l0ZUxpbmtGbihzY29wZSwgJGxpbmtOb2RlLCAkbGlua05vZGUsIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuKTtcblxuICAgICAgICBpZiAoIWNsb25lQ29ubmVjdEZuKSB7XG4gICAgICAgICAgJGNvbXBpbGVOb2RlcyA9IGNvbXBvc2l0ZUxpbmtGbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICRsaW5rTm9kZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGV0ZWN0TmFtZXNwYWNlRm9yQ2hpbGRFbGVtZW50cyhwYXJlbnRFbGVtZW50KSB7XG4gICAgICAvLyBUT0RPOiBNYWtlIHRoaXMgZGV0ZWN0IE1hdGhNTCBhcyB3ZWxsLi4uXG4gICAgICB2YXIgbm9kZSA9IHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudFswXTtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICByZXR1cm4gJ2h0bWwnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5vZGVOYW1lXyhub2RlKSAhPT0gJ2ZvcmVpZ25vYmplY3QnICYmIHRvU3RyaW5nLmNhbGwobm9kZSkubWF0Y2goL1NWRy8pID8gJ3N2ZycgOiAnaHRtbCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGlsZSBmdW5jdGlvbiBtYXRjaGVzIGVhY2ggbm9kZSBpbiBub2RlTGlzdCBhZ2FpbnN0IHRoZSBkaXJlY3RpdmVzLiBPbmNlIGFsbCBkaXJlY3RpdmVzXG4gICAgICogZm9yIGEgcGFydGljdWxhciBub2RlIGFyZSBjb2xsZWN0ZWQgdGhlaXIgY29tcGlsZSBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkLiBUaGUgY29tcGlsZVxuICAgICAqIGZ1bmN0aW9ucyByZXR1cm4gdmFsdWVzIC0gdGhlIGxpbmtpbmcgZnVuY3Rpb25zIC0gYXJlIGNvbWJpbmVkIGludG8gYSBjb21wb3NpdGUgbGlua2luZ1xuICAgICAqIGZ1bmN0aW9uLCB3aGljaCBpcyB0aGUgYSBsaW5raW5nIGZ1bmN0aW9uIGZvciB0aGUgbm9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZUxpc3R9IG5vZGVMaXN0IGFuIGFycmF5IG9mIG5vZGVzIG9yIE5vZGVMaXN0IHRvIGNvbXBpbGVcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGFuZ3VsYXIuU2NvcGUsIGNsb25lQXR0YWNoRm49KX0gdHJhbnNjbHVkZUZuIEEgbGlua2luZyBmdW5jdGlvbiwgd2hlcmUgdGhlXG4gICAgICogICAgICAgIHNjb3BlIGFyZ3VtZW50IGlzIGF1dG8tZ2VuZXJhdGVkIHRvIHRoZSBuZXcgY2hpbGQgb2YgdGhlIHRyYW5zY2x1ZGVkIHBhcmVudCBzY29wZS5cbiAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnQ9fSAkcm9vdEVsZW1lbnQgSWYgdGhlIG5vZGVMaXN0IGlzIHRoZSByb290IG9mIHRoZSBjb21waWxhdGlvbiB0cmVlIHRoZW5cbiAgICAgKiAgICAgICAgdGhlIHJvb3RFbGVtZW50IG11c3QgYmUgc2V0IHRoZSBqcUxpdGUgY29sbGVjdGlvbiBvZiB0aGUgY29tcGlsZSByb290LiBUaGlzIGlzXG4gICAgICogICAgICAgIG5lZWRlZCBzbyB0aGF0IHRoZSBqcUxpdGUgY29sbGVjdGlvbiBpdGVtcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCB3aWRnZXRzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gbWF4UHJpb3JpdHkgTWF4IGRpcmVjdGl2ZSBwcmlvcml0eS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgY29tcG9zaXRlIGxpbmtpbmcgZnVuY3Rpb24gb2YgYWxsIG9mIHRoZSBtYXRjaGVkIGRpcmVjdGl2ZXMgb3IgbnVsbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21waWxlTm9kZXMobm9kZUxpc3QsIHRyYW5zY2x1ZGVGbiwgJHJvb3RFbGVtZW50LCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpIHtcbiAgICAgIHZhciBsaW5rRm5zID0gW10sXG4gICAgICAgICAgLy8gYG5vZGVMaXN0YCBjYW4gYmUgZWl0aGVyIGFuIGVsZW1lbnQncyBgLmNoaWxkTm9kZXNgIChsaXZlIE5vZGVMaXN0KVxuICAgICAgICAgIC8vIG9yIGEganFMaXRlL2pRdWVyeSBjb2xsZWN0aW9uIG9yIGFuIGFycmF5XG4gICAgICAgICAgbm90TGl2ZUxpc3QgPSBpc0FycmF5KG5vZGVMaXN0KSB8fCAobm9kZUxpc3QgaW5zdGFuY2VvZiBqcUxpdGUpLFxuICAgICAgICAgIGF0dHJzLCBkaXJlY3RpdmVzLCBub2RlTGlua0ZuLCBjaGlsZE5vZGVzLCBjaGlsZExpbmtGbiwgbGlua0ZuRm91bmQsIG5vZGVMaW5rRm5Gb3VuZDtcblxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXMoKTtcblxuICAgICAgICAvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG4gICAgICAgIC8vIFdvcmthcm91bmQgZm9yICMxMTc4MSBhbmQgIzE0OTI0XG4gICAgICAgIGlmIChtc2llID09PSAxMSkge1xuICAgICAgICAgIG1lcmdlQ29uc2VjdXRpdmVUZXh0Tm9kZXMobm9kZUxpc3QsIGksIG5vdExpdmVMaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIHJlZmVyIHRvIGBub2RlTGlzdFtpXWAgaGVyZWFmdGVyLFxuICAgICAgICAvLyBzaW5jZSB0aGUgbm9kZXMgY2FuIGJlIHJlcGxhY2VkIHVuZGVybmVhdGggdXMuXG4gICAgICAgIGRpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhub2RlTGlzdFtpXSwgW10sIGF0dHJzLCBpID09PSAwID8gbWF4UHJpb3JpdHkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlRGlyZWN0aXZlKTtcblxuICAgICAgICBub2RlTGlua0ZuID0gKGRpcmVjdGl2ZXMubGVuZ3RoKVxuICAgICAgICAgICAgPyBhcHBseURpcmVjdGl2ZXNUb05vZGUoZGlyZWN0aXZlcywgbm9kZUxpc3RbaV0sIGF0dHJzLCB0cmFuc2NsdWRlRm4sICRyb290RWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgW10sIFtdLCBwcmV2aW91c0NvbXBpbGVDb250ZXh0KVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIGlmIChub2RlTGlua0ZuICYmIG5vZGVMaW5rRm4uc2NvcGUpIHtcbiAgICAgICAgICBjb21waWxlLiQkYWRkU2NvcGVDbGFzcyhhdHRycy4kJGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRMaW5rRm4gPSAobm9kZUxpbmtGbiAmJiBub2RlTGlua0ZuLnRlcm1pbmFsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgIShjaGlsZE5vZGVzID0gbm9kZUxpc3RbaV0uY2hpbGROb2RlcykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAhY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogY29tcGlsZU5vZGVzKGNoaWxkTm9kZXMsXG4gICAgICAgICAgICAgICAgIG5vZGVMaW5rRm4gPyAoXG4gICAgICAgICAgICAgICAgICAobm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCB8fCAhbm9kZUxpbmtGbi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAmJiBub2RlTGlua0ZuLnRyYW5zY2x1ZGUpIDogdHJhbnNjbHVkZUZuKTtcblxuICAgICAgICBpZiAobm9kZUxpbmtGbiB8fCBjaGlsZExpbmtGbikge1xuICAgICAgICAgIGxpbmtGbnMucHVzaChpLCBub2RlTGlua0ZuLCBjaGlsZExpbmtGbik7XG4gICAgICAgICAgbGlua0ZuRm91bmQgPSB0cnVlO1xuICAgICAgICAgIG5vZGVMaW5rRm5Gb3VuZCA9IG5vZGVMaW5rRm5Gb3VuZCB8fCBub2RlTGlua0ZuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy91c2UgdGhlIHByZXZpb3VzIGNvbnRleHQgb25seSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHZpcnR1YWwgZ3JvdXBcbiAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIHJldHVybiBhIGxpbmtpbmcgZnVuY3Rpb24gaWYgd2UgaGF2ZSBmb3VuZCBhbnl0aGluZywgbnVsbCBvdGhlcndpc2VcbiAgICAgIHJldHVybiBsaW5rRm5Gb3VuZCA/IGNvbXBvc2l0ZUxpbmtGbiA6IG51bGw7XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBvc2l0ZUxpbmtGbihzY29wZSwgbm9kZUxpc3QsICRyb290RWxlbWVudCwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pIHtcbiAgICAgICAgdmFyIG5vZGVMaW5rRm4sIGNoaWxkTGlua0ZuLCBub2RlLCBjaGlsZFNjb3BlLCBpLCBpaSwgaWR4LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuO1xuICAgICAgICB2YXIgc3RhYmxlTm9kZUxpc3Q7XG5cblxuICAgICAgICBpZiAobm9kZUxpbmtGbkZvdW5kKSB7XG4gICAgICAgICAgLy8gY29weSBub2RlTGlzdCBzbyB0aGF0IGlmIGEgbm9kZUxpbmtGbiByZW1vdmVzIG9yIGFkZHMgYW4gZWxlbWVudCBhdCB0aGlzIERPTSBsZXZlbCBvdXJcbiAgICAgICAgICAvLyBvZmZzZXRzIGRvbid0IGdldCBzY3Jld2VkIHVwXG4gICAgICAgICAgdmFyIG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QubGVuZ3RoO1xuICAgICAgICAgIHN0YWJsZU5vZGVMaXN0ID0gbmV3IEFycmF5KG5vZGVMaXN0TGVuZ3RoKTtcblxuICAgICAgICAgIC8vIGNyZWF0ZSBhIHNwYXJzZSBhcnJheSBieSBvbmx5IGNvcHlpbmcgdGhlIGVsZW1lbnRzIHdoaWNoIGhhdmUgYSBsaW5rRm5cbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlua0Zucy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgaWR4ID0gbGlua0Zuc1tpXTtcbiAgICAgICAgICAgIHN0YWJsZU5vZGVMaXN0W2lkeF0gPSBub2RlTGlzdFtpZHhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFibGVOb2RlTGlzdCA9IG5vZGVMaXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBsaW5rRm5zLmxlbmd0aDsgaSA8IGlpOykge1xuICAgICAgICAgIG5vZGUgPSBzdGFibGVOb2RlTGlzdFtsaW5rRm5zW2krK11dO1xuICAgICAgICAgIG5vZGVMaW5rRm4gPSBsaW5rRm5zW2krK107XG4gICAgICAgICAgY2hpbGRMaW5rRm4gPSBsaW5rRm5zW2krK107XG5cbiAgICAgICAgICBpZiAobm9kZUxpbmtGbikge1xuICAgICAgICAgICAgaWYgKG5vZGVMaW5rRm4uc2NvcGUpIHtcbiAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IHNjb3BlLiRuZXcoKTtcbiAgICAgICAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlSW5mbyhqcUxpdGUobm9kZSksIGNoaWxkU2NvcGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IHNjb3BlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCkge1xuICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gY3JlYXRlQm91bmRUcmFuc2NsdWRlRm4oXG4gICAgICAgICAgICAgICAgICBzY29wZSwgbm9kZUxpbmtGbi50cmFuc2NsdWRlLCBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbik7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGVMaW5rRm4udGVtcGxhdGVPblRoaXNFbGVtZW50ICYmIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuKSB7XG4gICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbjtcblxuICAgICAgICAgICAgfSBlbHNlIGlmICghcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gJiYgdHJhbnNjbHVkZUZuKSB7XG4gICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgdHJhbnNjbHVkZUZuKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGVMaW5rRm4oY2hpbGRMaW5rRm4sIGNoaWxkU2NvcGUsIG5vZGUsICRyb290RWxlbWVudCwgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbik7XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkTGlua0ZuKSB7XG4gICAgICAgICAgICBjaGlsZExpbmtGbihzY29wZSwgbm9kZS5jaGlsZE5vZGVzLCB1bmRlZmluZWQsIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbnNlY3V0aXZlVGV4dE5vZGVzKG5vZGVMaXN0LCBpZHgsIG5vdExpdmVMaXN0KSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVMaXN0W2lkeF07XG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgdmFyIHNpYmxpbmc7XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfVEVYVCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHNpYmxpbmcgPSBwYXJlbnQgPyBub2RlLm5leHRTaWJsaW5nIDogbm9kZUxpc3RbaWR4ICsgMV07XG4gICAgICAgIGlmICghc2libGluZyB8fCBzaWJsaW5nLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfVEVYVCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZSArIHNpYmxpbmcubm9kZVZhbHVlO1xuXG4gICAgICAgIGlmIChzaWJsaW5nLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBzaWJsaW5nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2libGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdExpdmVMaXN0ICYmIHNpYmxpbmcgPT09IG5vZGVMaXN0W2lkeCArIDFdKSB7XG4gICAgICAgICAgbm9kZUxpc3Quc3BsaWNlKGlkeCArIDEsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlQm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIHRyYW5zY2x1ZGVGbiwgcHJldmlvdXNCb3VuZFRyYW5zY2x1ZGVGbikge1xuICAgICAgZnVuY3Rpb24gYm91bmRUcmFuc2NsdWRlRm4odHJhbnNjbHVkZWRTY29wZSwgY2xvbmVGbiwgY29udHJvbGxlcnMsIGZ1dHVyZVBhcmVudEVsZW1lbnQsIGNvbnRhaW5pbmdTY29wZSkge1xuXG4gICAgICAgIGlmICghdHJhbnNjbHVkZWRTY29wZSkge1xuICAgICAgICAgIHRyYW5zY2x1ZGVkU2NvcGUgPSBzY29wZS4kbmV3KGZhbHNlLCBjb250YWluaW5nU2NvcGUpO1xuICAgICAgICAgIHRyYW5zY2x1ZGVkU2NvcGUuJCR0cmFuc2NsdWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhbnNjbHVkZUZuKHRyYW5zY2x1ZGVkU2NvcGUsIGNsb25lRm4sIHtcbiAgICAgICAgICBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbjogcHJldmlvdXNCb3VuZFRyYW5zY2x1ZGVGbixcbiAgICAgICAgICB0cmFuc2NsdWRlQ29udHJvbGxlcnM6IGNvbnRyb2xsZXJzLFxuICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQ6IGZ1dHVyZVBhcmVudEVsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG5lZWQgIHRvIGF0dGFjaCB0aGUgdHJhbnNjbHVzaW9uIHNsb3RzIG9udG8gdGhlIGBib3VuZFRyYW5zY2x1ZGVGbmBcbiAgICAgIC8vIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIGluc2lkZSB0aGUgYGNvbnRyb2xsZXJzQm91bmRUcmFuc2NsdWRlYCBmdW5jdGlvblxuICAgICAgdmFyIGJvdW5kU2xvdHMgPSBib3VuZFRyYW5zY2x1ZGVGbi4kJHNsb3RzID0gY3JlYXRlTWFwKCk7XG4gICAgICBmb3IgKHZhciBzbG90TmFtZSBpbiB0cmFuc2NsdWRlRm4uJCRzbG90cykge1xuICAgICAgICBpZiAodHJhbnNjbHVkZUZuLiQkc2xvdHNbc2xvdE5hbWVdKSB7XG4gICAgICAgICAgYm91bmRTbG90c1tzbG90TmFtZV0gPSBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgdHJhbnNjbHVkZUZuLiQkc2xvdHNbc2xvdE5hbWVdLCBwcmV2aW91c0JvdW5kVHJhbnNjbHVkZUZuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib3VuZFNsb3RzW3Nsb3ROYW1lXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJvdW5kVHJhbnNjbHVkZUZuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2tzIGZvciBkaXJlY3RpdmVzIG9uIHRoZSBnaXZlbiBub2RlIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGRpcmVjdGl2ZSBjb2xsZWN0aW9uIHdoaWNoIGlzXG4gICAgICogc29ydGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIGRpcmVjdGl2ZXMgQW4gYXJyYXkgdG8gd2hpY2ggdGhlIGRpcmVjdGl2ZXMgYXJlIGFkZGVkIHRvLiBUaGlzIGFycmF5IGlzIHNvcnRlZCBiZWZvcmVcbiAgICAgKiAgICAgICAgdGhlIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICogQHBhcmFtIGF0dHJzIFRoZSBzaGFyZWQgYXR0cnMgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIG5vcm1hbGl6ZWQgYXR0cmlidXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG1heFByaW9yaXR5IE1heCBkaXJlY3RpdmUgcHJpb3JpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29sbGVjdERpcmVjdGl2ZXMobm9kZSwgZGlyZWN0aXZlcywgYXR0cnMsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpIHtcbiAgICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGUsXG4gICAgICAgICAgYXR0cnNNYXAgPSBhdHRycy4kYXR0cixcbiAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICBub2RlTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWU7XG5cbiAgICAgIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICAgICAgY2FzZSBOT0RFX1RZUEVfRUxFTUVOVDogLyogRWxlbWVudCAqL1xuXG4gICAgICAgICAgbm9kZU5hbWUgPSBub2RlTmFtZV8obm9kZSk7XG5cbiAgICAgICAgICAvLyB1c2UgdGhlIG5vZGUgbmFtZTogPGRpcmVjdGl2ZT5cbiAgICAgICAgICBhZGREaXJlY3RpdmUoZGlyZWN0aXZlcyxcbiAgICAgICAgICAgICAgZGlyZWN0aXZlTm9ybWFsaXplKG5vZGVOYW1lKSwgJ0UnLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKTtcblxuICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0cmlidXRlc1xuICAgICAgICAgIGZvciAodmFyIGF0dHIsIG5hbWUsIG5OYW1lLCBuZ0F0dHJOYW1lLCB2YWx1ZSwgaXNOZ0F0dHIsIG5BdHRycyA9IG5vZGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICBqID0gMCwgamogPSBuQXR0cnMgJiYgbkF0dHJzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBhdHRyU3RhcnROYW1lID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgYXR0ckVuZE5hbWUgPSBmYWxzZTtcblxuICAgICAgICAgICAgYXR0ciA9IG5BdHRyc1tqXTtcbiAgICAgICAgICAgIG5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgICAgICB2YWx1ZSA9IGF0dHIudmFsdWU7XG5cbiAgICAgICAgICAgIC8vIHN1cHBvcnQgbmdBdHRyIGF0dHJpYnV0ZSBiaW5kaW5nXG4gICAgICAgICAgICBuZ0F0dHJOYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKG5hbWUpO1xuICAgICAgICAgICAgaXNOZ0F0dHIgPSBOR19BVFRSX0JJTkRJTkcudGVzdChuZ0F0dHJOYW1lKTtcbiAgICAgICAgICAgIGlmIChpc05nQXR0cikge1xuICAgICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFBSRUZJWF9SRUdFWFAsICcnKVxuICAgICAgICAgICAgICAgIC5zdWJzdHIoOCkucmVwbGFjZSgvXyguKS9nLCBmdW5jdGlvbihtYXRjaCwgbGV0dGVyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtdWx0aUVsZW1lbnRNYXRjaCA9IG5nQXR0ck5hbWUubWF0Y2goTVVMVElfRUxFTUVOVF9ESVJfUkUpO1xuICAgICAgICAgICAgaWYgKG11bHRpRWxlbWVudE1hdGNoICYmIGRpcmVjdGl2ZUlzTXVsdGlFbGVtZW50KG11bHRpRWxlbWVudE1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICBhdHRyU3RhcnROYW1lID0gbmFtZTtcbiAgICAgICAgICAgICAgYXR0ckVuZE5hbWUgPSBuYW1lLnN1YnN0cigwLCBuYW1lLmxlbmd0aCAtIDUpICsgJ2VuZCc7XG4gICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigwLCBuYW1lLmxlbmd0aCAtIDYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZShuYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgYXR0cnNNYXBbbk5hbWVdID0gbmFtZTtcbiAgICAgICAgICAgIGlmIChpc05nQXR0ciB8fCAhYXR0cnMuaGFzT3duUHJvcGVydHkobk5hbWUpKSB7XG4gICAgICAgICAgICAgICAgYXR0cnNbbk5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGdldEJvb2xlYW5BdHRyTmFtZShub2RlLCBuTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgIGF0dHJzW25OYW1lXSA9IHRydWU7IC8vIHByZXNlbmNlIG1lYW5zIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRBdHRySW50ZXJwb2xhdGVEaXJlY3RpdmUobm9kZSwgZGlyZWN0aXZlcywgdmFsdWUsIG5OYW1lLCBpc05nQXR0cik7XG4gICAgICAgICAgICBhZGREaXJlY3RpdmUoZGlyZWN0aXZlcywgbk5hbWUsICdBJywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSwgYXR0clN0YXJ0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckVuZE5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBub2RlLmdldEF0dHJpYnV0ZSgndHlwZScpID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgLy8gSGlkZGVuIGlucHV0IGVsZW1lbnRzIGNhbiBoYXZlIHN0cmFuZ2UgYmVoYXZpb3VyIHdoZW4gbmF2aWdhdGluZyBiYWNrIHRvIHRoZSBwYWdlXG4gICAgICAgICAgICAvLyBUaGlzIHRlbGxzIHRoZSBicm93c2VyIG5vdCB0byB0cnkgdG8gY2FjaGUgYW5kIHJlaW5zdGF0ZSBwcmV2aW91cyB2YWx1ZXNcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCAnb2ZmJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdXNlIGNsYXNzIGFzIGRpcmVjdGl2ZVxuICAgICAgICAgIGlmICghY3NzQ2xhc3NEaXJlY3RpdmVzRW5hYmxlZCkgYnJlYWs7XG4gICAgICAgICAgY2xhc3NOYW1lID0gbm9kZS5jbGFzc05hbWU7XG4gICAgICAgICAgaWYgKGlzT2JqZWN0KGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgICAgLy8gTWF5YmUgU1ZHQW5pbWF0ZWRTdHJpbmdcbiAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLmFuaW1WYWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1N0cmluZyhjbGFzc05hbWUpICYmIGNsYXNzTmFtZSAhPT0gJycpIHtcbiAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBDTEFTU19ESVJFQ1RJVkVfUkVHRVhQLmV4ZWMoY2xhc3NOYW1lKSkpIHtcbiAgICAgICAgICAgICAgbk5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUobWF0Y2hbMl0pO1xuICAgICAgICAgICAgICBpZiAoYWRkRGlyZWN0aXZlKGRpcmVjdGl2ZXMsIG5OYW1lLCAnQycsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpKSB7XG4gICAgICAgICAgICAgICAgYXR0cnNbbk5hbWVdID0gdHJpbShtYXRjaFszXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE5PREVfVFlQRV9URVhUOiAvKiBUZXh0IE5vZGUgKi9cbiAgICAgICAgICBhZGRUZXh0SW50ZXJwb2xhdGVEaXJlY3RpdmUoZGlyZWN0aXZlcywgbm9kZS5ub2RlVmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE5PREVfVFlQRV9DT01NRU5UOiAvKiBDb21tZW50ICovXG4gICAgICAgICAgaWYgKCFjb21tZW50RGlyZWN0aXZlc0VuYWJsZWQpIGJyZWFrO1xuICAgICAgICAgIGNvbGxlY3RDb21tZW50RGlyZWN0aXZlcyhub2RlLCBkaXJlY3RpdmVzLCBhdHRycywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRpcmVjdGl2ZXMuc29ydChieVByaW9yaXR5KTtcbiAgICAgIHJldHVybiBkaXJlY3RpdmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbGxlY3RDb21tZW50RGlyZWN0aXZlcyhub2RlLCBkaXJlY3RpdmVzLCBhdHRycywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSkge1xuICAgICAgLy8gZnVuY3Rpb24gY3JlYXRlZCBiZWNhdXNlIG9mIHBlcmZvcm1hbmNlLCB0cnkvY2F0Y2ggZGlzYWJsZXNcbiAgICAgIC8vIHRoZSBvcHRpbWl6YXRpb24gb2YgdGhlIHdob2xlIGZ1bmN0aW9uICMxNDg0OFxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG1hdGNoID0gQ09NTUVOVF9ESVJFQ1RJVkVfUkVHRVhQLmV4ZWMobm9kZS5ub2RlVmFsdWUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB2YXIgbk5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUobWF0Y2hbMV0pO1xuICAgICAgICAgIGlmIChhZGREaXJlY3RpdmUoZGlyZWN0aXZlcywgbk5hbWUsICdNJywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSkpIHtcbiAgICAgICAgICAgIGF0dHJzW25OYW1lXSA9IHRyaW0obWF0Y2hbMl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB0dXJucyBvdXQgdGhhdCB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgSUU5IHRocm93cyBlcnJvcnMgd2hlbiBvbmUgYXR0ZW1wdHMgdG8gcmVhZFxuICAgICAgICAvLyBjb21tZW50J3Mgbm9kZSB2YWx1ZS5cbiAgICAgICAgLy8gSnVzdCBpZ25vcmUgaXQgYW5kIGNvbnRpbnVlLiAoQ2FuJ3Qgc2VlbSB0byByZXByb2R1Y2UgaW4gdGVzdCBjYXNlLilcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIG5vZGUgd2l0aCBhIGRpcmVjdGl2ZS1zdGFydCBpdCBjb2xsZWN0cyBhbGwgb2YgdGhlIHNpYmxpbmdzIHVudGlsIGl0IGZpbmRzXG4gICAgICogZGlyZWN0aXZlLWVuZC5cbiAgICAgKiBAcGFyYW0gbm9kZVxuICAgICAqIEBwYXJhbSBhdHRyU3RhcnRcbiAgICAgKiBAcGFyYW0gYXR0ckVuZFxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdyb3VwU2Nhbihub2RlLCBhdHRyU3RhcnQsIGF0dHJFbmQpIHtcbiAgICAgIHZhciBub2RlcyA9IFtdO1xuICAgICAgdmFyIGRlcHRoID0gMDtcbiAgICAgIGlmIChhdHRyU3RhcnQgJiYgbm9kZS5oYXNBdHRyaWJ1dGUgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoYXR0clN0YXJ0KSkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigndXRlcmRpcicsXG4gICAgICAgICAgICAgICAgICAgICAgJ1VudGVybWluYXRlZCBhdHRyaWJ1dGUsIGZvdW5kIFxcJ3swfVxcJyBidXQgbm8gbWF0Y2hpbmcgXFwnezF9XFwnIGZvdW5kLicsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0clN0YXJ0LCBhdHRyRW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRV9FTEVNRU5UKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0clN0YXJ0KSkgZGVwdGgrKztcbiAgICAgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyRW5kKSkgZGVwdGgtLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfSB3aGlsZSAoZGVwdGggPiAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBqcUxpdGUobm9kZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyYXBwZXIgZm9yIGxpbmtpbmcgZnVuY3Rpb24gd2hpY2ggY29udmVydHMgbm9ybWFsIGxpbmtpbmcgZnVuY3Rpb24gaW50byBhIGdyb3VwZWRcbiAgICAgKiBsaW5raW5nIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBsaW5rRm5cbiAgICAgKiBAcGFyYW0gYXR0clN0YXJ0XG4gICAgICogQHBhcmFtIGF0dHJFbmRcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ3JvdXBFbGVtZW50c0xpbmtGbldyYXBwZXIobGlua0ZuLCBhdHRyU3RhcnQsIGF0dHJFbmQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBncm91cGVkRWxlbWVudHNMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcnMsIHRyYW5zY2x1ZGVGbikge1xuICAgICAgICBlbGVtZW50ID0gZ3JvdXBTY2FuKGVsZW1lbnRbMF0sIGF0dHJTdGFydCwgYXR0ckVuZCk7XG4gICAgICAgIHJldHVybiBsaW5rRm4oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycywgdHJhbnNjbHVkZUZuKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiBnZW5lcmF0b3IgdGhhdCBpcyB1c2VkIHRvIHN1cHBvcnQgYm90aCBlYWdlciBhbmQgbGF6eSBjb21waWxhdGlvblxuICAgICAqIGxpbmtpbmcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIGVhZ2VyXG4gICAgICogQHBhcmFtICRjb21waWxlTm9kZXNcbiAgICAgKiBAcGFyYW0gdHJhbnNjbHVkZUZuXG4gICAgICogQHBhcmFtIG1heFByaW9yaXR5XG4gICAgICogQHBhcmFtIGlnbm9yZURpcmVjdGl2ZVxuICAgICAqIEBwYXJhbSBwcmV2aW91c0NvbXBpbGVDb250ZXh0XG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBpbGF0aW9uR2VuZXJhdG9yKGVhZ2VyLCAkY29tcGlsZU5vZGVzLCB0cmFuc2NsdWRlRm4sIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpIHtcbiAgICAgIHZhciBjb21waWxlZDtcblxuICAgICAgaWYgKGVhZ2VyKSB7XG4gICAgICAgIHJldHVybiBjb21waWxlKCRjb21waWxlTm9kZXMsIHRyYW5zY2x1ZGVGbiwgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSwgcHJldmlvdXNDb21waWxlQ29udGV4dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyoqIEB0aGlzICovIGZ1bmN0aW9uIGxhenlDb21waWxhdGlvbigpIHtcbiAgICAgICAgaWYgKCFjb21waWxlZCkge1xuICAgICAgICAgIGNvbXBpbGVkID0gY29tcGlsZSgkY29tcGlsZU5vZGVzLCB0cmFuc2NsdWRlRm4sIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpO1xuXG4gICAgICAgICAgLy8gTnVsbCBvdXQgYWxsIG9mIHRoZXNlIHJlZmVyZW5jZXMgaW4gb3JkZXIgdG8gbWFrZSB0aGVtIGVsaWdpYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb25cbiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGEgcG90ZW50aWFsbHkgbG9uZyBsaXZlZCBjbG9zdXJlXG4gICAgICAgICAgJGNvbXBpbGVOb2RlcyA9IHRyYW5zY2x1ZGVGbiA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21waWxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbmNlIHRoZSBkaXJlY3RpdmVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRoZWlyIGNvbXBpbGUgZnVuY3Rpb25zIGFyZSBleGVjdXRlZC4gVGhpcyBtZXRob2RcbiAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgaW5saW5pbmcgZGlyZWN0aXZlIHRlbXBsYXRlcyBhcyB3ZWxsIGFzIHRlcm1pbmF0aW5nIHRoZSBhcHBsaWNhdGlvblxuICAgICAqIG9mIHRoZSBkaXJlY3RpdmVzIGlmIHRoZSB0ZXJtaW5hbCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVhY2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRpcmVjdGl2ZXMgQXJyYXkgb2YgY29sbGVjdGVkIGRpcmVjdGl2ZXMgdG8gZXhlY3V0ZSB0aGVpciBjb21waWxlIGZ1bmN0aW9uLlxuICAgICAqICAgICAgICB0aGlzIG5lZWRzIHRvIGJlIHByZS1zb3J0ZWQgYnkgcHJpb3JpdHkgb3JkZXIuXG4gICAgICogQHBhcmFtIHtOb2RlfSBjb21waWxlTm9kZSBUaGUgcmF3IERPTSBub2RlIHRvIGFwcGx5IHRoZSBjb21waWxlIGZ1bmN0aW9ucyB0b1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUF0dHJzIFRoZSBzaGFyZWQgYXR0cmlidXRlIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihhbmd1bGFyLlNjb3BlLCBjbG9uZUF0dGFjaEZuPSl9IHRyYW5zY2x1ZGVGbiBBIGxpbmtpbmcgZnVuY3Rpb24sIHdoZXJlIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSBhcmd1bWVudCBpcyBhdXRvLWdlbmVyYXRlZCB0byB0aGUgbmV3XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIG9mIHRoZSB0cmFuc2NsdWRlZCBwYXJlbnQgc2NvcGUuXG4gICAgICogQHBhcmFtIHtKUUxpdGV9IGpxQ29sbGVjdGlvbiBJZiB3ZSBhcmUgd29ya2luZyBvbiB0aGUgcm9vdCBvZiB0aGUgY29tcGlsZSB0cmVlIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgaGFzIHRoZSByb290IGpxTGl0ZSBhcnJheSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIG5vZGVzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBpdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdD19IG9yaWdpbmFsUmVwbGFjZURpcmVjdGl2ZSBBbiBvcHRpb25hbCBkaXJlY3RpdmUgdGhhdCB3aWxsIGJlIGlnbm9yZWQgd2hlblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGluZyB0aGUgdHJhbnNjbHVzaW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPEZ1bmN0aW9uPn0gcHJlTGlua0Zuc1xuICAgICAqIEBwYXJhbSB7QXJyYXkuPEZ1bmN0aW9uPn0gcG9zdExpbmtGbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJldmlvdXNDb21waWxlQ29udGV4dCBDb250ZXh0IHVzZWQgZm9yIHByZXZpb3VzIGNvbXBpbGF0aW9uIG9mIHRoZSBjdXJyZW50XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gbGlua0ZuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXBwbHlEaXJlY3RpdmVzVG9Ob2RlKGRpcmVjdGl2ZXMsIGNvbXBpbGVOb2RlLCB0ZW1wbGF0ZUF0dHJzLCB0cmFuc2NsdWRlRm4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxQ29sbGVjdGlvbiwgb3JpZ2luYWxSZXBsYWNlRGlyZWN0aXZlLCBwcmVMaW5rRm5zLCBwb3N0TGlua0ZucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkge1xuICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQgfHwge307XG5cbiAgICAgIHZhciB0ZXJtaW5hbFByaW9yaXR5ID0gLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgbmV3U2NvcGVEaXJlY3RpdmUgPSBwcmV2aW91c0NvbXBpbGVDb250ZXh0Lm5ld1Njb3BlRGlyZWN0aXZlLFxuICAgICAgICAgIGNvbnRyb2xsZXJEaXJlY3RpdmVzID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5jb250cm9sbGVyRGlyZWN0aXZlcyxcbiAgICAgICAgICBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgPSBwcmV2aW91c0NvbXBpbGVDb250ZXh0Lm5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSxcbiAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZSA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQudGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQubm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSxcbiAgICAgICAgICBoYXNUcmFuc2NsdWRlRGlyZWN0aXZlID0gZmFsc2UsXG4gICAgICAgICAgaGFzVGVtcGxhdGUgPSBmYWxzZSxcbiAgICAgICAgICBoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQuaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUsXG4gICAgICAgICAgJGNvbXBpbGVOb2RlID0gdGVtcGxhdGVBdHRycy4kJGVsZW1lbnQgPSBqcUxpdGUoY29tcGlsZU5vZGUpLFxuICAgICAgICAgIGRpcmVjdGl2ZSxcbiAgICAgICAgICBkaXJlY3RpdmVOYW1lLFxuICAgICAgICAgICR0ZW1wbGF0ZSxcbiAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlID0gb3JpZ2luYWxSZXBsYWNlRGlyZWN0aXZlLFxuICAgICAgICAgIGNoaWxkVHJhbnNjbHVkZUZuID0gdHJhbnNjbHVkZUZuLFxuICAgICAgICAgIGxpbmtGbixcbiAgICAgICAgICBkaWRTY2FuRm9yTXVsdGlwbGVUcmFuc2NsdXNpb24gPSBmYWxzZSxcbiAgICAgICAgICBtaWdodEhhdmVNdWx0aXBsZVRyYW5zY2x1c2lvbkVycm9yID0gZmFsc2UsXG4gICAgICAgICAgZGlyZWN0aXZlVmFsdWU7XG5cbiAgICAgIC8vIGV4ZWN1dGVzIGFsbCBkaXJlY3RpdmVzIG9uIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBkaXJlY3RpdmUgPSBkaXJlY3RpdmVzW2ldO1xuICAgICAgICB2YXIgYXR0clN0YXJ0ID0gZGlyZWN0aXZlLiQkc3RhcnQ7XG4gICAgICAgIHZhciBhdHRyRW5kID0gZGlyZWN0aXZlLiQkZW5kO1xuXG4gICAgICAgIC8vIGNvbGxlY3QgbXVsdGlibG9jayBzZWN0aW9uc1xuICAgICAgICBpZiAoYXR0clN0YXJ0KSB7XG4gICAgICAgICAgJGNvbXBpbGVOb2RlID0gZ3JvdXBTY2FuKGNvbXBpbGVOb2RlLCBhdHRyU3RhcnQsIGF0dHJFbmQpO1xuICAgICAgICB9XG4gICAgICAgICR0ZW1wbGF0ZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodGVybWluYWxQcmlvcml0eSA+IGRpcmVjdGl2ZS5wcmlvcml0eSkge1xuICAgICAgICAgIGJyZWFrOyAvLyBwcmV2ZW50IGZ1cnRoZXIgcHJvY2Vzc2luZyBvZiBkaXJlY3RpdmVzXG4gICAgICAgIH1cblxuICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IGRpcmVjdGl2ZS5zY29wZTtcblxuICAgICAgICBpZiAoZGlyZWN0aXZlVmFsdWUpIHtcblxuICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrIGZvciBkaXJlY3RpdmVzIHdpdGggYXN5bmMgdGVtcGxhdGVzLCB3ZSdsbCBjaGVjayB0aGUgZGVyaXZlZCBzeW5jXG4gICAgICAgICAgLy8gZGlyZWN0aXZlIHdoZW4gdGhlIHRlbXBsYXRlIGFycml2ZXNcbiAgICAgICAgICBpZiAoIWRpcmVjdGl2ZS50ZW1wbGF0ZVVybCkge1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGRpcmVjdGl2ZVZhbHVlKSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyB0cnlpbmcgdG8gYWRkIGFuIGlzb2xhdGVkIHNjb3BlLlxuICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIHNjb3BlIG9mIGFueSBraW5kIGFscmVhZHlcbiAgICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ25ldy9pc29sYXRlZCBzY29wZScsIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSB8fCBuZXdTY29wZURpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLCAkY29tcGlsZU5vZGUpO1xuICAgICAgICAgICAgICBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyB0cnlpbmcgdG8gYWRkIGEgY2hpbGQgc2NvcGUuXG4gICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgaXMgbm8gaXNvbGF0ZWQgc2NvcGUgYWxyZWFkeVxuICAgICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgnbmV3L2lzb2xhdGVkIHNjb3BlJywgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLCBkaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21waWxlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3U2NvcGVEaXJlY3RpdmUgPSBuZXdTY29wZURpcmVjdGl2ZSB8fCBkaXJlY3RpdmU7XG4gICAgICAgIH1cblxuICAgICAgICBkaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlLm5hbWU7XG5cbiAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgY29uZGl0aW9uIHRoYXQgY2FuIHJlc3VsdCBpbiB0cmFuc2NsdXNpb24gb24gdGhlIGRpcmVjdGl2ZSxcbiAgICAgICAgLy8gdGhlbiBzY2FuIGFoZWFkIGluIHRoZSByZW1haW5pbmcgZGlyZWN0aXZlcyBmb3Igb3RoZXJzIHRoYXQgbWF5IGNhdXNlIGEgbXVsdGlwbGVcbiAgICAgICAgLy8gdHJhbnNjbHVzaW9uIGVycm9yIHRvIGJlIHRocm93biBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuICBJZiBhIG1hdGNoaW5nIGRpcmVjdGl2ZVxuICAgICAgICAvLyBpcyBmb3VuZCwgdGhlbiB3ZSBrbm93IHRoYXQgd2hlbiB3ZSBlbmNvdW50ZXIgYSB0cmFuc2NsdWRlZCBkaXJlY3RpdmUsIHdlIG5lZWQgdG8gZWFnZXJseVxuICAgICAgICAvLyBjb21waWxlIHRoZSBgdHJhbnNjbHVkZWAgZnVuY3Rpb24gcmF0aGVyIHRoYW4gZG9pbmcgaXQgbGF6aWx5IGluIG9yZGVyIHRvIHRocm93XG4gICAgICAgIC8vIGV4Y2VwdGlvbnMgYXQgdGhlIGNvcnJlY3QgdGltZVxuICAgICAgICBpZiAoIWRpZFNjYW5Gb3JNdWx0aXBsZVRyYW5zY2x1c2lvbiAmJiAoKGRpcmVjdGl2ZS5yZXBsYWNlICYmIChkaXJlY3RpdmUudGVtcGxhdGVVcmwgfHwgZGlyZWN0aXZlLnRlbXBsYXRlKSlcbiAgICAgICAgICAgIHx8IChkaXJlY3RpdmUudHJhbnNjbHVkZSAmJiAhZGlyZWN0aXZlLiQkdGxiKSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlRGlyZWN0aXZlO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc2Nhbm5pbmdJbmRleCA9IGkgKyAxOyAoY2FuZGlkYXRlRGlyZWN0aXZlID0gZGlyZWN0aXZlc1tzY2FubmluZ0luZGV4KytdKTspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjYW5kaWRhdGVEaXJlY3RpdmUudHJhbnNjbHVkZSAmJiAhY2FuZGlkYXRlRGlyZWN0aXZlLiQkdGxiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNhbmRpZGF0ZURpcmVjdGl2ZS5yZXBsYWNlICYmIChjYW5kaWRhdGVEaXJlY3RpdmUudGVtcGxhdGVVcmwgfHwgY2FuZGlkYXRlRGlyZWN0aXZlLnRlbXBsYXRlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pZ2h0SGF2ZU11bHRpcGxlVHJhbnNjbHVzaW9uRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaWRTY2FuRm9yTXVsdGlwbGVUcmFuc2NsdXNpb24gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXJlY3RpdmUudGVtcGxhdGVVcmwgJiYgZGlyZWN0aXZlLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyRGlyZWN0aXZlcyA9IGNvbnRyb2xsZXJEaXJlY3RpdmVzIHx8IGNyZWF0ZU1hcCgpO1xuICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCdcXCcnICsgZGlyZWN0aXZlTmFtZSArICdcXCcgY29udHJvbGxlcicsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJEaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7XG4gICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBkaXJlY3RpdmU7XG4gICAgICAgIH1cblxuICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IGRpcmVjdGl2ZS50cmFuc2NsdWRlO1xuXG4gICAgICAgIGlmIChkaXJlY3RpdmVWYWx1ZSkge1xuICAgICAgICAgIGhhc1RyYW5zY2x1ZGVEaXJlY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIG5nSWYgYW5kIG5nUmVwZWF0IHNvIHRoYXQgd2UgZG9uJ3QgY29tcGxhaW4gYWJvdXQgZHVwbGljYXRlIHRyYW5zY2x1c2lvbi5cbiAgICAgICAgICAvLyBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGRpcmVjdGl2ZXMgdGhhdCBrbm93IGhvdyB0byBzYWZlbHkgaGFuZGxlIGVsZW1lbnQgdHJhbnNjbHVzaW9uLFxuICAgICAgICAgIC8vIHdoZXJlIHRoZSB0cmFuc2NsdWRlZCBub2RlcyBhcmUgYWRkZWQgb3IgcmVwbGFjZWQgYWZ0ZXIgbGlua2luZy5cbiAgICAgICAgICBpZiAoIWRpcmVjdGl2ZS4kJHRsYikge1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ3RyYW5zY2x1c2lvbicsIG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUsIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTtcbiAgICAgICAgICAgIG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRpcmVjdGl2ZVZhbHVlID09PSAnZWxlbWVudCcpIHtcbiAgICAgICAgICAgIGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRlcm1pbmFsUHJpb3JpdHkgPSBkaXJlY3RpdmUucHJpb3JpdHk7XG4gICAgICAgICAgICAkdGVtcGxhdGUgPSAkY29tcGlsZU5vZGU7XG4gICAgICAgICAgICAkY29tcGlsZU5vZGUgPSB0ZW1wbGF0ZUF0dHJzLiQkZWxlbWVudCA9XG4gICAgICAgICAgICAgICAganFMaXRlKGNvbXBpbGUuJCRjcmVhdGVDb21tZW50KGRpcmVjdGl2ZU5hbWUsIHRlbXBsYXRlQXR0cnNbZGlyZWN0aXZlTmFtZV0pKTtcbiAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gJGNvbXBpbGVOb2RlWzBdO1xuICAgICAgICAgICAgcmVwbGFjZVdpdGgoanFDb2xsZWN0aW9uLCBzbGljZUFyZ3MoJHRlbXBsYXRlKSwgY29tcGlsZU5vZGUpO1xuXG4gICAgICAgICAgICAvLyBTdXBwb3J0OiBDaHJvbWUgPCA1MFxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTQwNDFcblxuICAgICAgICAgICAgLy8gSW4gdGhlIHZlcnNpb25zIG9mIFY4IHByaW9yIHRvIENocm9tZSA1MCwgdGhlIGRvY3VtZW50IGZyYWdtZW50IHRoYXQgaXMgY3JlYXRlZFxuICAgICAgICAgICAgLy8gaW4gdGhlIGByZXBsYWNlV2l0aGAgZnVuY3Rpb24gaXMgaW1wcm9wZXJseSBnYXJiYWdlIGNvbGxlY3RlZCBkZXNwaXRlIHN0aWxsXG4gICAgICAgICAgICAvLyBiZWluZyByZWZlcmVuY2VkIGJ5IHRoZSBgcGFyZW50Tm9kZWAgcHJvcGVydHkgb2YgYWxsIG9mIHRoZSBjaGlsZCBub2Rlcy4gIEJ5IGFkZGluZ1xuICAgICAgICAgICAgLy8gYSByZWZlcmVuY2UgdG8gdGhlIGZyYWdtZW50IHZpYSBhIGRpZmZlcmVudCBwcm9wZXJ0eSwgd2UgY2FuIGF2b2lkIHRoYXQgaW5jb3JyZWN0XG4gICAgICAgICAgICAvLyBiZWhhdmlvci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGxpbmUgYWZ0ZXIgQ2hyb21lIDUwIGhhcyBiZWVuIHJlbGVhc2VkXG4gICAgICAgICAgICAkdGVtcGxhdGVbMF0uJCRwYXJlbnROb2RlID0gJHRlbXBsYXRlWzBdLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgIGNoaWxkVHJhbnNjbHVkZUZuID0gY29tcGlsYXRpb25HZW5lcmF0b3IobWlnaHRIYXZlTXVsdGlwbGVUcmFuc2NsdXNpb25FcnJvciwgJHRlbXBsYXRlLCB0cmFuc2NsdWRlRm4sIHRlcm1pbmFsUHJpb3JpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZURpcmVjdGl2ZSAmJiByZXBsYWNlRGlyZWN0aXZlLm5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHBhc3MgaW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIGNvbnRyb2xsZXJEaXJlY3RpdmVzIC0gb3RoZXJ3aXNlIHdlJ2xsIGNyZWF0ZSBkdXBsaWNhdGVzIGNvbnRyb2xsZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSBvciB0ZW1wbGF0ZURpcmVjdGl2ZSAtIGNvbWJpbmluZyB0ZW1wbGF0ZXMgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBlbGVtZW50IHRyYW5zY2x1c2lvbiBkb2Vzbid0IG1ha2Ugc2Vuc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBvbmx5IG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUgc28gdGhhdCB3ZSBwcmV2ZW50IHB1dHRpbmcgdHJhbnNjbHVzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBlbGVtZW50IG1vcmUgdGhhbiBvbmNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZTogbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIHZhciBzbG90cyA9IGNyZWF0ZU1hcCgpO1xuXG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRpcmVjdGl2ZVZhbHVlKSkge1xuICAgICAgICAgICAgICAkdGVtcGxhdGUgPSBqcUxpdGUoanFMaXRlQ2xvbmUoY29tcGlsZU5vZGUpKS5jb250ZW50cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRyYW5zY2x1c2lvbiBzbG90cyxcbiAgICAgICAgICAgICAgLy8gY29sbGVjdCB0aGVtIHVwLCBjb21waWxlIHRoZW0gYW5kIHN0b3JlIHRoZWlyIHRyYW5zY2x1c2lvbiBmdW5jdGlvbnNcbiAgICAgICAgICAgICAgJHRlbXBsYXRlID0gW107XG5cbiAgICAgICAgICAgICAgdmFyIHNsb3RNYXAgPSBjcmVhdGVNYXAoKTtcbiAgICAgICAgICAgICAgdmFyIGZpbGxlZFNsb3RzID0gY3JlYXRlTWFwKCk7XG5cbiAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGVsZW1lbnQgc2VsZWN0b3JzXG4gICAgICAgICAgICAgIGZvckVhY2goZGlyZWN0aXZlVmFsdWUsIGZ1bmN0aW9uKGVsZW1lbnRTZWxlY3Rvciwgc2xvdE5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBlbGVtZW50IHNlbGVjdG9yIHN0YXJ0cyB3aXRoIGEgPyB0aGVuIGl0IGlzIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbmFsID0gKGVsZW1lbnRTZWxlY3Rvci5jaGFyQXQoMCkgPT09ICc/Jyk7XG4gICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yID0gb3B0aW9uYWwgPyBlbGVtZW50U2VsZWN0b3Iuc3Vic3RyaW5nKDEpIDogZWxlbWVudFNlbGVjdG9yO1xuXG4gICAgICAgICAgICAgICAgc2xvdE1hcFtlbGVtZW50U2VsZWN0b3JdID0gc2xvdE5hbWU7XG5cbiAgICAgICAgICAgICAgICAvLyBXZSBleHBsaWNpdGx5IGFzc2lnbiBgbnVsbGAgc2luY2UgdGhpcyBpbXBsaWVzIHRoYXQgYSBzbG90IHdhcyBkZWZpbmVkIGJ1dCBub3QgZmlsbGVkLlxuICAgICAgICAgICAgICAgIC8vIExhdGVyIHdoZW4gY2FsbGluZyBib3VuZFRyYW5zY2x1c2lvbiBmdW5jdGlvbnMgd2l0aCBhIHNsb3QgbmFtZSB3ZSBvbmx5IGVycm9yIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNsb3QgaXMgYHVuZGVmaW5lZGBcbiAgICAgICAgICAgICAgICBzbG90c1tzbG90TmFtZV0gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsbGVkU2xvdHMgY29udGFpbnMgYHRydWVgIGZvciBhbGwgc2xvdHMgdGhhdCBhcmUgZWl0aGVyIG9wdGlvbmFsIG9yIGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIGZpbGxlZC4gVGhpcyBpcyB1c2VkIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgbWlzc2VkIGFueSByZXF1aXJlZCBzbG90c1xuICAgICAgICAgICAgICAgIGZpbGxlZFNsb3RzW3Nsb3ROYW1lXSA9IG9wdGlvbmFsO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBBZGQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGludG8gdGhlaXIgc2xvdFxuICAgICAgICAgICAgICBmb3JFYWNoKCRjb21waWxlTm9kZS5jb250ZW50cygpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNsb3ROYW1lID0gc2xvdE1hcFtkaXJlY3RpdmVOb3JtYWxpemUobm9kZU5hbWVfKG5vZGUpKV07XG4gICAgICAgICAgICAgICAgaWYgKHNsb3ROYW1lKSB7XG4gICAgICAgICAgICAgICAgICBmaWxsZWRTbG90c1tzbG90TmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgc2xvdHNbc2xvdE5hbWVdID0gc2xvdHNbc2xvdE5hbWVdIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgc2xvdHNbc2xvdE5hbWVdLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICR0ZW1wbGF0ZS5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHNsb3RzIHRoYXQgd2VyZSBub3QgZmlsbGVkXG4gICAgICAgICAgICAgIGZvckVhY2goZmlsbGVkU2xvdHMsIGZ1bmN0aW9uKGZpbGxlZCwgc2xvdE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3JlcXNsb3QnLCAnUmVxdWlyZWQgdHJhbnNjbHVzaW9uIHNsb3QgYHswfWAgd2FzIG5vdCBmaWxsZWQuJywgc2xvdE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgc2xvdE5hbWUgaW4gc2xvdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2xvdHNbc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAvLyBPbmx5IGRlZmluZSBhIHRyYW5zY2x1c2lvbiBmdW5jdGlvbiBpZiB0aGUgc2xvdCB3YXMgZmlsbGVkXG4gICAgICAgICAgICAgICAgICBzbG90c1tzbG90TmFtZV0gPSBjb21waWxhdGlvbkdlbmVyYXRvcihtaWdodEhhdmVNdWx0aXBsZVRyYW5zY2x1c2lvbkVycm9yLCBzbG90c1tzbG90TmFtZV0sIHRyYW5zY2x1ZGVGbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRjb21waWxlTm9kZS5lbXB0eSgpOyAvLyBjbGVhciBjb250ZW50c1xuICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSBjb21waWxhdGlvbkdlbmVyYXRvcihtaWdodEhhdmVNdWx0aXBsZVRyYW5zY2x1c2lvbkVycm9yLCAkdGVtcGxhdGUsIHRyYW5zY2x1ZGVGbiwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgeyBuZWVkc05ld1Njb3BlOiBkaXJlY3RpdmUuJCRpc29sYXRlU2NvcGUgfHwgZGlyZWN0aXZlLiQkbmV3U2NvcGV9KTtcbiAgICAgICAgICAgIGNoaWxkVHJhbnNjbHVkZUZuLiQkc2xvdHMgPSBzbG90cztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlyZWN0aXZlLnRlbXBsYXRlKSB7XG4gICAgICAgICAgaGFzVGVtcGxhdGUgPSB0cnVlO1xuICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCd0ZW1wbGF0ZScsIHRlbXBsYXRlRGlyZWN0aXZlLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7XG4gICAgICAgICAgdGVtcGxhdGVEaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG5cbiAgICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IChpc0Z1bmN0aW9uKGRpcmVjdGl2ZS50ZW1wbGF0ZSkpXG4gICAgICAgICAgICAgID8gZGlyZWN0aXZlLnRlbXBsYXRlKCRjb21waWxlTm9kZSwgdGVtcGxhdGVBdHRycylcbiAgICAgICAgICAgICAgOiBkaXJlY3RpdmUudGVtcGxhdGU7XG5cbiAgICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IGRlbm9ybWFsaXplVGVtcGxhdGUoZGlyZWN0aXZlVmFsdWUpO1xuXG4gICAgICAgICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB7XG4gICAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlID0gZGlyZWN0aXZlO1xuICAgICAgICAgICAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoZGlyZWN0aXZlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRlbXBsYXRlID0gcmVtb3ZlQ29tbWVudHMod3JhcFRlbXBsYXRlKGRpcmVjdGl2ZS50ZW1wbGF0ZU5hbWVzcGFjZSwgdHJpbShkaXJlY3RpdmVWYWx1ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gJHRlbXBsYXRlWzBdO1xuXG4gICAgICAgICAgICBpZiAoJHRlbXBsYXRlLmxlbmd0aCAhPT0gMSB8fCBjb21waWxlTm9kZS5ub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0VMRU1FTlQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3RwbHJ0JyxcbiAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZSBmb3IgZGlyZWN0aXZlIFxcJ3swfVxcJyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcm9vdCBlbGVtZW50LiB7MX0nLFxuICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlTmFtZSwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXBsYWNlV2l0aChqcUNvbGxlY3Rpb24sICRjb21waWxlTm9kZSwgY29tcGlsZU5vZGUpO1xuXG4gICAgICAgICAgICB2YXIgbmV3VGVtcGxhdGVBdHRycyA9IHskYXR0cjoge319O1xuXG4gICAgICAgICAgICAvLyBjb21iaW5lIGRpcmVjdGl2ZXMgZnJvbSB0aGUgb3JpZ2luYWwgbm9kZSBhbmQgZnJvbSB0aGUgdGVtcGxhdGU6XG4gICAgICAgICAgICAvLyAtIHRha2UgdGhlIGFycmF5IG9mIGRpcmVjdGl2ZXMgZm9yIHRoaXMgZWxlbWVudFxuICAgICAgICAgICAgLy8gLSBzcGxpdCBpdCBpbnRvIHR3byBwYXJ0cywgdGhvc2UgdGhhdCBhbHJlYWR5IGFwcGxpZWQgKHByb2Nlc3NlZCkgYW5kIHRob3NlIHRoYXQgd2VyZW4ndCAodW5wcm9jZXNzZWQpXG4gICAgICAgICAgICAvLyAtIGNvbGxlY3QgZGlyZWN0aXZlcyBmcm9tIHRoZSB0ZW1wbGF0ZSBhbmQgc29ydCB0aGVtIGJ5IHByaW9yaXR5XG4gICAgICAgICAgICAvLyAtIGNvbWJpbmUgZGlyZWN0aXZlcyBhczogcHJvY2Vzc2VkICsgdGVtcGxhdGUgKyB1bnByb2Nlc3NlZFxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGlyZWN0aXZlcyA9IGNvbGxlY3REaXJlY3RpdmVzKGNvbXBpbGVOb2RlLCBbXSwgbmV3VGVtcGxhdGVBdHRycyk7XG4gICAgICAgICAgICB2YXIgdW5wcm9jZXNzZWREaXJlY3RpdmVzID0gZGlyZWN0aXZlcy5zcGxpY2UoaSArIDEsIGRpcmVjdGl2ZXMubGVuZ3RoIC0gKGkgKyAxKSk7XG5cbiAgICAgICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgfHwgbmV3U2NvcGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIG9yaWdpbmFsIGRpcmVjdGl2ZSBjYXVzZWQgdGhlIGN1cnJlbnQgZWxlbWVudCB0byBiZSByZXBsYWNlZCBidXQgdGhpcyBlbGVtZW50XG4gICAgICAgICAgICAgIC8vIGFsc28gbmVlZHMgdG8gaGF2ZSBhIG5ldyBzY29wZSwgc28gd2UgbmVlZCB0byB0ZWxsIHRoZSB0ZW1wbGF0ZSBkaXJlY3RpdmVzXG4gICAgICAgICAgICAgIC8vIHRoYXQgdGhleSB3b3VsZCBuZWVkIHRvIGdldCB0aGVpciBzY29wZSBmcm9tIGZ1cnRoZXIgdXAsIGlmIHRoZXkgcmVxdWlyZSB0cmFuc2NsdXNpb25cbiAgICAgICAgICAgICAgbWFya0RpcmVjdGl2ZVNjb3BlKHRlbXBsYXRlRGlyZWN0aXZlcywgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLCBuZXdTY29wZURpcmVjdGl2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXJlY3RpdmVzID0gZGlyZWN0aXZlcy5jb25jYXQodGVtcGxhdGVEaXJlY3RpdmVzKS5jb25jYXQodW5wcm9jZXNzZWREaXJlY3RpdmVzKTtcbiAgICAgICAgICAgIG1lcmdlVGVtcGxhdGVBdHRyaWJ1dGVzKHRlbXBsYXRlQXR0cnMsIG5ld1RlbXBsYXRlQXR0cnMpO1xuXG4gICAgICAgICAgICBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkY29tcGlsZU5vZGUuaHRtbChkaXJlY3RpdmVWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpcmVjdGl2ZS50ZW1wbGF0ZVVybCkge1xuICAgICAgICAgIGhhc1RlbXBsYXRlID0gdHJ1ZTtcbiAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgndGVtcGxhdGUnLCB0ZW1wbGF0ZURpcmVjdGl2ZSwgZGlyZWN0aXZlLCAkY29tcGlsZU5vZGUpO1xuICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID0gZGlyZWN0aXZlO1xuXG4gICAgICAgICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB7XG4gICAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlID0gZGlyZWN0aXZlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mdW5jLWFzc2lnblxuICAgICAgICAgIG5vZGVMaW5rRm4gPSBjb21waWxlVGVtcGxhdGVVcmwoZGlyZWN0aXZlcy5zcGxpY2UoaSwgZGlyZWN0aXZlcy5sZW5ndGggLSBpKSwgJGNvbXBpbGVOb2RlLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZUF0dHJzLCBqcUNvbGxlY3Rpb24sIGhhc1RyYW5zY2x1ZGVEaXJlY3RpdmUgJiYgY2hpbGRUcmFuc2NsdWRlRm4sIHByZUxpbmtGbnMsIHBvc3RMaW5rRm5zLCB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXM6IGNvbnRyb2xsZXJEaXJlY3RpdmVzLFxuICAgICAgICAgICAgICAgIG5ld1Njb3BlRGlyZWN0aXZlOiAobmV3U2NvcGVEaXJlY3RpdmUgIT09IGRpcmVjdGl2ZSkgJiYgbmV3U2NvcGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlOiBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEaXJlY3RpdmU6IHRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgIG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmU6IG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgaWkgPSBkaXJlY3RpdmVzLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3RpdmUuY29tcGlsZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsaW5rRm4gPSBkaXJlY3RpdmUuY29tcGlsZSgkY29tcGlsZU5vZGUsIHRlbXBsYXRlQXR0cnMsIGNoaWxkVHJhbnNjbHVkZUZuKTtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gZGlyZWN0aXZlLiQkb3JpZ2luYWxEaXJlY3RpdmUgfHwgZGlyZWN0aXZlO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24obGlua0ZuKSkge1xuICAgICAgICAgICAgICBhZGRMaW5rRm5zKG51bGwsIGJpbmQoY29udGV4dCwgbGlua0ZuKSwgYXR0clN0YXJ0LCBhdHRyRW5kKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlua0ZuKSB7XG4gICAgICAgICAgICAgIGFkZExpbmtGbnMoYmluZChjb250ZXh0LCBsaW5rRm4ucHJlKSwgYmluZChjb250ZXh0LCBsaW5rRm4ucG9zdCksIGF0dHJTdGFydCwgYXR0ckVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSwgc3RhcnRpbmdUYWcoJGNvbXBpbGVOb2RlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpcmVjdGl2ZS50ZXJtaW5hbCkge1xuICAgICAgICAgIG5vZGVMaW5rRm4udGVybWluYWwgPSB0cnVlO1xuICAgICAgICAgIHRlcm1pbmFsUHJpb3JpdHkgPSBNYXRoLm1heCh0ZXJtaW5hbFByaW9yaXR5LCBkaXJlY3RpdmUucHJpb3JpdHkpO1xuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgbm9kZUxpbmtGbi5zY29wZSA9IG5ld1Njb3BlRGlyZWN0aXZlICYmIG5ld1Njb3BlRGlyZWN0aXZlLnNjb3BlID09PSB0cnVlO1xuICAgICAgbm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCA9IGhhc1RyYW5zY2x1ZGVEaXJlY3RpdmU7XG4gICAgICBub2RlTGlua0ZuLnRlbXBsYXRlT25UaGlzRWxlbWVudCA9IGhhc1RlbXBsYXRlO1xuICAgICAgbm9kZUxpbmtGbi50cmFuc2NsdWRlID0gY2hpbGRUcmFuc2NsdWRlRm47XG5cbiAgICAgIHByZXZpb3VzQ29tcGlsZUNvbnRleHQuaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUgPSBoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZTtcblxuICAgICAgLy8gbWlnaHQgYmUgbm9ybWFsIG9yIGRlbGF5ZWQgbm9kZUxpbmtGbiBkZXBlbmRpbmcgb24gaWYgdGVtcGxhdGVVcmwgaXMgcHJlc2VudFxuICAgICAgcmV0dXJuIG5vZGVMaW5rRm47XG5cbiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgIGZ1bmN0aW9uIGFkZExpbmtGbnMocHJlLCBwb3N0LCBhdHRyU3RhcnQsIGF0dHJFbmQpIHtcbiAgICAgICAgaWYgKHByZSkge1xuICAgICAgICAgIGlmIChhdHRyU3RhcnQpIHByZSA9IGdyb3VwRWxlbWVudHNMaW5rRm5XcmFwcGVyKHByZSwgYXR0clN0YXJ0LCBhdHRyRW5kKTtcbiAgICAgICAgICBwcmUucmVxdWlyZSA9IGRpcmVjdGl2ZS5yZXF1aXJlO1xuICAgICAgICAgIHByZS5kaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTmFtZTtcbiAgICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID09PSBkaXJlY3RpdmUgfHwgZGlyZWN0aXZlLiQkaXNvbGF0ZVNjb3BlKSB7XG4gICAgICAgICAgICBwcmUgPSBjbG9uZUFuZEFubm90YXRlRm4ocHJlLCB7aXNvbGF0ZVNjb3BlOiB0cnVlfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZUxpbmtGbnMucHVzaChwcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3N0KSB7XG4gICAgICAgICAgaWYgKGF0dHJTdGFydCkgcG9zdCA9IGdyb3VwRWxlbWVudHNMaW5rRm5XcmFwcGVyKHBvc3QsIGF0dHJTdGFydCwgYXR0ckVuZCk7XG4gICAgICAgICAgcG9zdC5yZXF1aXJlID0gZGlyZWN0aXZlLnJlcXVpcmU7XG4gICAgICAgICAgcG9zdC5kaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTmFtZTtcbiAgICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID09PSBkaXJlY3RpdmUgfHwgZGlyZWN0aXZlLiQkaXNvbGF0ZVNjb3BlKSB7XG4gICAgICAgICAgICBwb3N0ID0gY2xvbmVBbmRBbm5vdGF0ZUZuKHBvc3QsIHtpc29sYXRlU2NvcGU6IHRydWV9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zdExpbmtGbnMucHVzaChwb3N0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBub2RlTGlua0ZuKGNoaWxkTGlua0ZuLCBzY29wZSwgbGlua05vZGUsICRyb290RWxlbWVudCwgYm91bmRUcmFuc2NsdWRlRm4pIHtcbiAgICAgICAgdmFyIGksIGlpLCBsaW5rRm4sIGlzb2xhdGVTY29wZSwgY29udHJvbGxlclNjb3BlLCBlbGVtZW50Q29udHJvbGxlcnMsIHRyYW5zY2x1ZGVGbiwgJGVsZW1lbnQsXG4gICAgICAgICAgICBhdHRycywgc2NvcGVCaW5kaW5nSW5mbztcblxuICAgICAgICBpZiAoY29tcGlsZU5vZGUgPT09IGxpbmtOb2RlKSB7XG4gICAgICAgICAgYXR0cnMgPSB0ZW1wbGF0ZUF0dHJzO1xuICAgICAgICAgICRlbGVtZW50ID0gdGVtcGxhdGVBdHRycy4kJGVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGVsZW1lbnQgPSBqcUxpdGUobGlua05vZGUpO1xuICAgICAgICAgIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXMoJGVsZW1lbnQsIHRlbXBsYXRlQXR0cnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udHJvbGxlclNjb3BlID0gc2NvcGU7XG4gICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICBpc29sYXRlU2NvcGUgPSBzY29wZS4kbmV3KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1Njb3BlRGlyZWN0aXZlKSB7XG4gICAgICAgICAgY29udHJvbGxlclNjb3BlID0gc2NvcGUuJHBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZFRyYW5zY2x1ZGVGbikge1xuICAgICAgICAgIC8vIHRyYWNrIGBib3VuZFRyYW5zY2x1ZGVGbmAgc28gaXQgY2FuIGJlIHVud3JhcHBlZCBpZiBgdHJhbnNjbHVkZUZuYFxuICAgICAgICAgIC8vIGlzIGxhdGVyIHBhc3NlZCBhcyBgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm5gIHRvIGBwdWJsaWNMaW5rRm5gXG4gICAgICAgICAgdHJhbnNjbHVkZUZuID0gY29udHJvbGxlcnNCb3VuZFRyYW5zY2x1ZGU7XG4gICAgICAgICAgdHJhbnNjbHVkZUZuLiQkYm91bmRUcmFuc2NsdWRlID0gYm91bmRUcmFuc2NsdWRlRm47XG4gICAgICAgICAgLy8gZXhwb3NlIHRoZSBzbG90cyBvbiB0aGUgYCR0cmFuc2NsdWRlYCBmdW5jdGlvblxuICAgICAgICAgIHRyYW5zY2x1ZGVGbi5pc1Nsb3RGaWxsZWQgPSBmdW5jdGlvbihzbG90TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhYm91bmRUcmFuc2NsdWRlRm4uJCRzbG90c1tzbG90TmFtZV07XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cm9sbGVyRGlyZWN0aXZlcykge1xuICAgICAgICAgIGVsZW1lbnRDb250cm9sbGVycyA9IHNldHVwQ29udHJvbGxlcnMoJGVsZW1lbnQsIGF0dHJzLCB0cmFuc2NsdWRlRm4sIGNvbnRyb2xsZXJEaXJlY3RpdmVzLCBpc29sYXRlU2NvcGUsIHNjb3BlLCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSkge1xuICAgICAgICAgIC8vIEluaXRpYWxpemUgaXNvbGF0ZSBzY29wZSBiaW5kaW5ncyBmb3IgbmV3IGlzb2xhdGUgc2NvcGUgZGlyZWN0aXZlLlxuICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8oJGVsZW1lbnQsIGlzb2xhdGVTY29wZSwgdHJ1ZSwgISh0ZW1wbGF0ZURpcmVjdGl2ZSAmJiAodGVtcGxhdGVEaXJlY3RpdmUgPT09IG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSB8fFxuICAgICAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZSA9PT0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLiQkb3JpZ2luYWxEaXJlY3RpdmUpKSk7XG4gICAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlQ2xhc3MoJGVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgIGlzb2xhdGVTY29wZS4kJGlzb2xhdGVCaW5kaW5ncyA9XG4gICAgICAgICAgICAgIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZS4kJGlzb2xhdGVCaW5kaW5ncztcbiAgICAgICAgICBzY29wZUJpbmRpbmdJbmZvID0gaW5pdGlhbGl6ZURpcmVjdGl2ZUJpbmRpbmdzKHNjb3BlLCBhdHRycywgaXNvbGF0ZVNjb3BlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVTY29wZS4kJGlzb2xhdGVCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpO1xuICAgICAgICAgIGlmIChzY29wZUJpbmRpbmdJbmZvLnJlbW92ZVdhdGNoZXMpIHtcbiAgICAgICAgICAgIGlzb2xhdGVTY29wZS4kb24oJyRkZXN0cm95Jywgc2NvcGVCaW5kaW5nSW5mby5yZW1vdmVXYXRjaGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIGJpbmRUb0NvbnRyb2xsZXIgYmluZGluZ3NcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBlbGVtZW50Q29udHJvbGxlcnMpIHtcbiAgICAgICAgICB2YXIgY29udHJvbGxlckRpcmVjdGl2ZSA9IGNvbnRyb2xsZXJEaXJlY3RpdmVzW25hbWVdO1xuICAgICAgICAgIHZhciBjb250cm9sbGVyID0gZWxlbWVudENvbnRyb2xsZXJzW25hbWVdO1xuICAgICAgICAgIHZhciBiaW5kaW5ncyA9IGNvbnRyb2xsZXJEaXJlY3RpdmUuJCRiaW5kaW5ncy5iaW5kVG9Db250cm9sbGVyO1xuXG4gICAgICAgICAgaWYgKHByZUFzc2lnbkJpbmRpbmdzRW5hYmxlZCkge1xuICAgICAgICAgICAgaWYgKGJpbmRpbmdzKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuYmluZGluZ0luZm8gPVxuICAgICAgICAgICAgICAgIGluaXRpYWxpemVEaXJlY3RpdmVCaW5kaW5ncyhjb250cm9sbGVyU2NvcGUsIGF0dHJzLCBjb250cm9sbGVyLmluc3RhbmNlLCBiaW5kaW5ncywgY29udHJvbGxlckRpcmVjdGl2ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmJpbmRpbmdJbmZvID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjb250cm9sbGVyUmVzdWx0ID0gY29udHJvbGxlcigpO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJSZXN1bHQgIT09IGNvbnRyb2xsZXIuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRyb2xsZXIgY29uc3RydWN0b3IgaGFzIGEgcmV0dXJuIHZhbHVlLCBvdmVyd3JpdGUgdGhlIGluc3RhbmNlXG4gICAgICAgICAgICAgIC8vIGZyb20gc2V0dXBDb250cm9sbGVyc1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmluc3RhbmNlID0gY29udHJvbGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgJGVsZW1lbnQuZGF0YSgnJCcgKyBjb250cm9sbGVyRGlyZWN0aXZlLm5hbWUgKyAnQ29udHJvbGxlcicsIGNvbnRyb2xsZXJSZXN1bHQpO1xuICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5iaW5kaW5nSW5mby5yZW1vdmVXYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5iaW5kaW5nSW5mby5yZW1vdmVXYXRjaGVzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udHJvbGxlci5iaW5kaW5nSW5mbyA9XG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZURpcmVjdGl2ZUJpbmRpbmdzKGNvbnRyb2xsZXJTY29wZSwgYXR0cnMsIGNvbnRyb2xsZXIuaW5zdGFuY2UsIGJpbmRpbmdzLCBjb250cm9sbGVyRGlyZWN0aXZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udHJvbGxlci5pbnN0YW5jZSA9IGNvbnRyb2xsZXIoKTtcbiAgICAgICAgICAgICRlbGVtZW50LmRhdGEoJyQnICsgY29udHJvbGxlckRpcmVjdGl2ZS5uYW1lICsgJ0NvbnRyb2xsZXInLCBjb250cm9sbGVyLmluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYmluZGluZ0luZm8gPVxuICAgICAgICAgICAgICBpbml0aWFsaXplRGlyZWN0aXZlQmluZGluZ3MoY29udHJvbGxlclNjb3BlLCBhdHRycywgY29udHJvbGxlci5pbnN0YW5jZSwgYmluZGluZ3MsIGNvbnRyb2xsZXJEaXJlY3RpdmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJpbmQgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXJzIHRvIHRoZSBjb250cm9sbGVyLCBpZiBgcmVxdWlyZWAgaXMgYW4gb2JqZWN0IGFuZCBgYmluZFRvQ29udHJvbGxlcmAgaXMgdHJ1dGh5XG4gICAgICAgIGZvckVhY2goY29udHJvbGxlckRpcmVjdGl2ZXMsIGZ1bmN0aW9uKGNvbnRyb2xsZXJEaXJlY3RpdmUsIG5hbWUpIHtcbiAgICAgICAgICB2YXIgcmVxdWlyZSA9IGNvbnRyb2xsZXJEaXJlY3RpdmUucmVxdWlyZTtcbiAgICAgICAgICBpZiAoY29udHJvbGxlckRpcmVjdGl2ZS5iaW5kVG9Db250cm9sbGVyICYmICFpc0FycmF5KHJlcXVpcmUpICYmIGlzT2JqZWN0KHJlcXVpcmUpKSB7XG4gICAgICAgICAgICBleHRlbmQoZWxlbWVudENvbnRyb2xsZXJzW25hbWVdLmluc3RhbmNlLCBnZXRDb250cm9sbGVycyhuYW1lLCByZXF1aXJlLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGluaXQgYW5kIGRlc3Ryb3kgbGlmZWN5Y2xlIGhvb2tzIG9uIGFsbCBjb250cm9sbGVycyB0aGF0IGhhdmUgdGhlbVxuICAgICAgICBmb3JFYWNoKGVsZW1lbnRDb250cm9sbGVycywgZnVuY3Rpb24oY29udHJvbGxlcikge1xuICAgICAgICAgIHZhciBjb250cm9sbGVySW5zdGFuY2UgPSBjb250cm9sbGVyLmluc3RhbmNlO1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRyb2xsZXJJbnN0YW5jZS4kb25DaGFuZ2VzKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlckluc3RhbmNlLiRvbkNoYW5nZXMoY29udHJvbGxlci5iaW5kaW5nSW5mby5pbml0aWFsQ2hhbmdlcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjb250cm9sbGVySW5zdGFuY2UuJG9uSW5pdCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJJbnN0YW5jZS4kb25Jbml0KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjb250cm9sbGVySW5zdGFuY2UuJGRvQ2hlY2spKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyU2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkgeyBjb250cm9sbGVySW5zdGFuY2UuJGRvQ2hlY2soKTsgfSk7XG4gICAgICAgICAgICBjb250cm9sbGVySW5zdGFuY2UuJGRvQ2hlY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29udHJvbGxlckluc3RhbmNlLiRvbkRlc3Ryb3kpKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyU2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uIGNhbGxPbkRlc3Ryb3lIb29rKCkge1xuICAgICAgICAgICAgICBjb250cm9sbGVySW5zdGFuY2UuJG9uRGVzdHJveSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQUkVMSU5LSU5HXG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gcHJlTGlua0Zucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgbGlua0ZuID0gcHJlTGlua0Zuc1tpXTtcbiAgICAgICAgICBpbnZva2VMaW5rRm4obGlua0ZuLFxuICAgICAgICAgICAgICBsaW5rRm4uaXNvbGF0ZVNjb3BlID8gaXNvbGF0ZVNjb3BlIDogc2NvcGUsXG4gICAgICAgICAgICAgICRlbGVtZW50LFxuICAgICAgICAgICAgICBhdHRycyxcbiAgICAgICAgICAgICAgbGlua0ZuLnJlcXVpcmUgJiYgZ2V0Q29udHJvbGxlcnMobGlua0ZuLmRpcmVjdGl2ZU5hbWUsIGxpbmtGbi5yZXF1aXJlLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKSxcbiAgICAgICAgICAgICAgdHJhbnNjbHVkZUZuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJFQ1VSU0lPTlxuICAgICAgICAvLyBXZSBvbmx5IHBhc3MgdGhlIGlzb2xhdGUgc2NvcGUsIGlmIHRoZSBpc29sYXRlIGRpcmVjdGl2ZSBoYXMgYSB0ZW1wbGF0ZSxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBjaGlsZCBlbGVtZW50cyBkbyBub3QgYmVsb25nIHRvIHRoZSBpc29sYXRlIGRpcmVjdGl2ZS5cbiAgICAgICAgdmFyIHNjb3BlVG9DaGlsZCA9IHNjb3BlO1xuICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlICYmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUudGVtcGxhdGUgfHwgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLnRlbXBsYXRlVXJsID09PSBudWxsKSkge1xuICAgICAgICAgIHNjb3BlVG9DaGlsZCA9IGlzb2xhdGVTY29wZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRMaW5rRm4pIHtcbiAgICAgICAgICBjaGlsZExpbmtGbihzY29wZVRvQ2hpbGQsIGxpbmtOb2RlLmNoaWxkTm9kZXMsIHVuZGVmaW5lZCwgYm91bmRUcmFuc2NsdWRlRm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9TVExJTktJTkdcbiAgICAgICAgZm9yIChpID0gcG9zdExpbmtGbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBsaW5rRm4gPSBwb3N0TGlua0Zuc1tpXTtcbiAgICAgICAgICBpbnZva2VMaW5rRm4obGlua0ZuLFxuICAgICAgICAgICAgICBsaW5rRm4uaXNvbGF0ZVNjb3BlID8gaXNvbGF0ZVNjb3BlIDogc2NvcGUsXG4gICAgICAgICAgICAgICRlbGVtZW50LFxuICAgICAgICAgICAgICBhdHRycyxcbiAgICAgICAgICAgICAgbGlua0ZuLnJlcXVpcmUgJiYgZ2V0Q29udHJvbGxlcnMobGlua0ZuLmRpcmVjdGl2ZU5hbWUsIGxpbmtGbi5yZXF1aXJlLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKSxcbiAgICAgICAgICAgICAgdHJhbnNjbHVkZUZuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgJHBvc3RMaW5rIGxpZmVjeWNsZSBob29rc1xuICAgICAgICBmb3JFYWNoKGVsZW1lbnRDb250cm9sbGVycywgZnVuY3Rpb24oY29udHJvbGxlcikge1xuICAgICAgICAgIHZhciBjb250cm9sbGVySW5zdGFuY2UgPSBjb250cm9sbGVyLmluc3RhbmNlO1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRyb2xsZXJJbnN0YW5jZS4kcG9zdExpbmspKSB7XG4gICAgICAgICAgICBjb250cm9sbGVySW5zdGFuY2UuJHBvc3RMaW5rKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGluamVjdGVkIGFzIGAkdHJhbnNjbHVkZWAuXG4gICAgICAgIC8vIE5vdGU6IGFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsIVxuICAgICAgICBmdW5jdGlvbiBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZShzY29wZSwgY2xvbmVBdHRhY2hGbiwgZnV0dXJlUGFyZW50RWxlbWVudCwgc2xvdE5hbWUpIHtcbiAgICAgICAgICB2YXIgdHJhbnNjbHVkZUNvbnRyb2xsZXJzO1xuICAgICAgICAgIC8vIE5vIHNjb3BlIHBhc3NlZCBpbjpcbiAgICAgICAgICBpZiAoIWlzU2NvcGUoc2NvcGUpKSB7XG4gICAgICAgICAgICBzbG90TmFtZSA9IGZ1dHVyZVBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBmdXR1cmVQYXJlbnRFbGVtZW50ID0gY2xvbmVBdHRhY2hGbjtcbiAgICAgICAgICAgIGNsb25lQXR0YWNoRm4gPSBzY29wZTtcbiAgICAgICAgICAgIHNjb3BlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgdHJhbnNjbHVkZUNvbnRyb2xsZXJzID0gZWxlbWVudENvbnRyb2xsZXJzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZ1dHVyZVBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQgPSBoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSA/ICRlbGVtZW50LnBhcmVudCgpIDogJGVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzbG90TmFtZSkge1xuICAgICAgICAgICAgLy8gc2xvdFRyYW5zY2x1ZGVGbiBjYW4gYmUgb25lIG9mIHRocmVlIHRoaW5nczpcbiAgICAgICAgICAgIC8vICAqIGEgdHJhbnNjbHVkZSBmdW5jdGlvbiAtIGEgZmlsbGVkIHNsb3RcbiAgICAgICAgICAgIC8vICAqIGBudWxsYCAtIGFuIG9wdGlvbmFsIHNsb3QgdGhhdCB3YXMgbm90IGZpbGxlZFxuICAgICAgICAgICAgLy8gICogYHVuZGVmaW5lZGAgLSBhIHNsb3QgdGhhdCB3YXMgbm90IGRlY2xhcmVkIChpLmUuIGludmFsaWQpXG4gICAgICAgICAgICB2YXIgc2xvdFRyYW5zY2x1ZGVGbiA9IGJvdW5kVHJhbnNjbHVkZUZuLiQkc2xvdHNbc2xvdE5hbWVdO1xuICAgICAgICAgICAgaWYgKHNsb3RUcmFuc2NsdWRlRm4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNsb3RUcmFuc2NsdWRlRm4oc2NvcGUsIGNsb25lQXR0YWNoRm4sIHRyYW5zY2x1ZGVDb250cm9sbGVycywgZnV0dXJlUGFyZW50RWxlbWVudCwgc2NvcGVUb0NoaWxkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNVbmRlZmluZWQoc2xvdFRyYW5zY2x1ZGVGbikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ25vc2xvdCcsXG4gICAgICAgICAgICAgICAnTm8gcGFyZW50IGRpcmVjdGl2ZSB0aGF0IHJlcXVpcmVzIGEgdHJhbnNjbHVzaW9uIHdpdGggc2xvdCBuYW1lIFwiezB9XCIuICcgK1xuICAgICAgICAgICAgICAgJ0VsZW1lbnQ6IHsxfScsXG4gICAgICAgICAgICAgICBzbG90TmFtZSwgc3RhcnRpbmdUYWcoJGVsZW1lbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCBjbG9uZUF0dGFjaEZuLCB0cmFuc2NsdWRlQ29udHJvbGxlcnMsIGZ1dHVyZVBhcmVudEVsZW1lbnQsIHNjb3BlVG9DaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29udHJvbGxlcnMoZGlyZWN0aXZlTmFtZSwgcmVxdWlyZSwgJGVsZW1lbnQsIGVsZW1lbnRDb250cm9sbGVycykge1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICBpZiAoaXNTdHJpbmcocmVxdWlyZSkpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcmVxdWlyZS5tYXRjaChSRVFVSVJFX1BSRUZJWF9SRUdFWFApO1xuICAgICAgICB2YXIgbmFtZSA9IHJlcXVpcmUuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgIHZhciBpbmhlcml0VHlwZSA9IG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgICAgICB2YXIgb3B0aW9uYWwgPSBtYXRjaFsyXSA9PT0gJz8nO1xuXG4gICAgICAgIC8vSWYgb25seSBwYXJlbnRzIHRoZW4gc3RhcnQgYXQgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICAgIGlmIChpbmhlcml0VHlwZSA9PT0gJ15eJykge1xuICAgICAgICAgICRlbGVtZW50ID0gJGVsZW1lbnQucGFyZW50KCk7XG4gICAgICAgIC8vT3RoZXJ3aXNlIGF0dGVtcHQgZ2V0dGluZyB0aGUgY29udHJvbGxlciBmcm9tIGVsZW1lbnRDb250cm9sbGVycyBpbiBjYXNlXG4gICAgICAgIC8vdGhlIGVsZW1lbnQgaXMgdHJhbnNjbHVkZWQgKGFuZCBoYXMgbm8gZGF0YSkgYW5kIHRvIGF2b2lkIC5kYXRhIGlmIHBvc3NpYmxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBlbGVtZW50Q29udHJvbGxlcnMgJiYgZWxlbWVudENvbnRyb2xsZXJzW25hbWVdO1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUgJiYgdmFsdWUuaW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgdmFyIGRhdGFOYW1lID0gJyQnICsgbmFtZSArICdDb250cm9sbGVyJztcbiAgICAgICAgICB2YWx1ZSA9IGluaGVyaXRUeXBlID8gJGVsZW1lbnQuaW5oZXJpdGVkRGF0YShkYXRhTmFtZSkgOiAkZWxlbWVudC5kYXRhKGRhdGFOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUgJiYgIW9wdGlvbmFsKSB7XG4gICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ2N0cmVxJyxcbiAgICAgICAgICAgICAgJ0NvbnRyb2xsZXIgXFwnezB9XFwnLCByZXF1aXJlZCBieSBkaXJlY3RpdmUgXFwnezF9XFwnLCBjYW5cXCd0IGJlIGZvdW5kIScsXG4gICAgICAgICAgICAgIG5hbWUsIGRpcmVjdGl2ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmVxdWlyZSkpIHtcbiAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVxdWlyZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgdmFsdWVbaV0gPSBnZXRDb250cm9sbGVycyhkaXJlY3RpdmVOYW1lLCByZXF1aXJlW2ldLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChyZXF1aXJlKSkge1xuICAgICAgICB2YWx1ZSA9IHt9O1xuICAgICAgICBmb3JFYWNoKHJlcXVpcmUsIGZ1bmN0aW9uKGNvbnRyb2xsZXIsIHByb3BlcnR5KSB7XG4gICAgICAgICAgdmFsdWVbcHJvcGVydHldID0gZ2V0Q29udHJvbGxlcnMoZGlyZWN0aXZlTmFtZSwgY29udHJvbGxlciwgJGVsZW1lbnQsIGVsZW1lbnRDb250cm9sbGVycyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXR1cENvbnRyb2xsZXJzKCRlbGVtZW50LCBhdHRycywgdHJhbnNjbHVkZUZuLCBjb250cm9sbGVyRGlyZWN0aXZlcywgaXNvbGF0ZVNjb3BlLCBzY29wZSwgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlKSB7XG4gICAgICB2YXIgZWxlbWVudENvbnRyb2xsZXJzID0gY3JlYXRlTWFwKCk7XG4gICAgICBmb3IgKHZhciBjb250cm9sbGVyS2V5IGluIGNvbnRyb2xsZXJEaXJlY3RpdmVzKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBjb250cm9sbGVyRGlyZWN0aXZlc1tjb250cm9sbGVyS2V5XTtcbiAgICAgICAgdmFyIGxvY2FscyA9IHtcbiAgICAgICAgICAkc2NvcGU6IGRpcmVjdGl2ZSA9PT0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlIHx8IGRpcmVjdGl2ZS4kJGlzb2xhdGVTY29wZSA/IGlzb2xhdGVTY29wZSA6IHNjb3BlLFxuICAgICAgICAgICRlbGVtZW50OiAkZWxlbWVudCxcbiAgICAgICAgICAkYXR0cnM6IGF0dHJzLFxuICAgICAgICAgICR0cmFuc2NsdWRlOiB0cmFuc2NsdWRlRm5cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY29udHJvbGxlciA9IGRpcmVjdGl2ZS5jb250cm9sbGVyO1xuICAgICAgICBpZiAoY29udHJvbGxlciA9PT0gJ0AnKSB7XG4gICAgICAgICAgY29udHJvbGxlciA9IGF0dHJzW2RpcmVjdGl2ZS5uYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb250cm9sbGVySW5zdGFuY2UgPSAkY29udHJvbGxlcihjb250cm9sbGVyLCBsb2NhbHMsIHRydWUsIGRpcmVjdGl2ZS5jb250cm9sbGVyQXMpO1xuXG4gICAgICAgIC8vIEZvciBkaXJlY3RpdmVzIHdpdGggZWxlbWVudCB0cmFuc2NsdXNpb24gdGhlIGVsZW1lbnQgaXMgYSBjb21tZW50LlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UgLmRhdGEgd2lsbCBub3QgYXR0YWNoIGFueSBkYXRhLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBzYXZlIHRoZSBjb250cm9sbGVycyBmb3IgdGhlIGVsZW1lbnQgaW4gYSBsb2NhbCBoYXNoIGFuZCBhdHRhY2ggdG8gLmRhdGFcbiAgICAgICAgLy8gbGF0ZXIsIG9uY2Ugd2UgaGF2ZSB0aGUgYWN0dWFsIGVsZW1lbnQuXG4gICAgICAgIGVsZW1lbnRDb250cm9sbGVyc1tkaXJlY3RpdmUubmFtZV0gPSBjb250cm9sbGVySW5zdGFuY2U7XG4gICAgICAgICRlbGVtZW50LmRhdGEoJyQnICsgZGlyZWN0aXZlLm5hbWUgKyAnQ29udHJvbGxlcicsIGNvbnRyb2xsZXJJbnN0YW5jZS5pbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudENvbnRyb2xsZXJzO1xuICAgIH1cblxuICAgIC8vIERlcGVuZGluZyB1cG9uIHRoZSBjb250ZXh0IGluIHdoaWNoIGEgZGlyZWN0aXZlIGZpbmRzIGl0c2VsZiBpdCBtaWdodCBuZWVkIHRvIGhhdmUgYSBuZXcgaXNvbGF0ZWRcbiAgICAvLyBvciBjaGlsZCBzY29wZSBjcmVhdGVkLiBGb3IgaW5zdGFuY2U6XG4gICAgLy8gKiBpZiB0aGUgZGlyZWN0aXZlIGhhcyBiZWVuIHB1bGxlZCBpbnRvIGEgdGVtcGxhdGUgYmVjYXVzZSBhbm90aGVyIGRpcmVjdGl2ZSB3aXRoIGEgaGlnaGVyIHByaW9yaXR5XG4gICAgLy8gYXNrZWQgZm9yIGVsZW1lbnQgdHJhbnNjbHVzaW9uXG4gICAgLy8gKiBpZiB0aGUgZGlyZWN0aXZlIGl0c2VsZiBhc2tzIGZvciB0cmFuc2NsdXNpb24gYnV0IGl0IGlzIGF0IHRoZSByb290IG9mIGEgdGVtcGxhdGUgYW5kIHRoZSBvcmlnaW5hbFxuICAgIC8vIGVsZW1lbnQgd2FzIHJlcGxhY2VkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTI5MzZcbiAgICBmdW5jdGlvbiBtYXJrRGlyZWN0aXZlU2NvcGUoZGlyZWN0aXZlcywgaXNvbGF0ZVNjb3BlLCBuZXdTY29wZSkge1xuICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZGlyZWN0aXZlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGRpcmVjdGl2ZXNbal0gPSBpbmhlcml0KGRpcmVjdGl2ZXNbal0sIHskJGlzb2xhdGVTY29wZTogaXNvbGF0ZVNjb3BlLCAkJG5ld1Njb3BlOiBuZXdTY29wZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGxvb2tzIHVwIHRoZSBkaXJlY3RpdmUgYW5kIGRlY29yYXRlcyBpdCB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZyBhbmQgcHJvcGVyIHBhcmFtZXRlcnMuIFdlXG4gICAgICogY2FsbCB0aGlzIHRoZSBib3VuZERpcmVjdGl2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZSB0byBsb29rIHVwLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBUaGUgZGlyZWN0aXZlIG11c3QgYmUgZm91bmQgaW4gc3BlY2lmaWMgZm9ybWF0LlxuICAgICAqICAgU3RyaW5nIGNvbnRhaW5pbmcgYW55IG9mIHRoZXNlcyBjaGFyYWN0ZXJzOlxuICAgICAqXG4gICAgICogICAqIGBFYDogZWxlbWVudCBuYW1lXG4gICAgICogICAqIGBBJzogYXR0cmlidXRlXG4gICAgICogICAqIGBDYDogY2xhc3NcbiAgICAgKiAgICogYE1gOiBjb21tZW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgZGlyZWN0aXZlIHdhcyBhZGRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGREaXJlY3RpdmUodERpcmVjdGl2ZXMsIG5hbWUsIGxvY2F0aW9uLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBzdGFydEF0dHJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRBdHRyTmFtZSkge1xuICAgICAgaWYgKG5hbWUgPT09IGlnbm9yZURpcmVjdGl2ZSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgbWF0Y2ggPSBudWxsO1xuICAgICAgaWYgKGhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgZm9yICh2YXIgZGlyZWN0aXZlLCBkaXJlY3RpdmVzID0gJGluamVjdG9yLmdldChuYW1lICsgU3VmZml4KSxcbiAgICAgICAgICAgIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbaV07XG4gICAgICAgICAgaWYgKChpc1VuZGVmaW5lZChtYXhQcmlvcml0eSkgfHwgbWF4UHJpb3JpdHkgPiBkaXJlY3RpdmUucHJpb3JpdHkpICYmXG4gICAgICAgICAgICAgICBkaXJlY3RpdmUucmVzdHJpY3QuaW5kZXhPZihsb2NhdGlvbikgIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRBdHRyTmFtZSkge1xuICAgICAgICAgICAgICBkaXJlY3RpdmUgPSBpbmhlcml0KGRpcmVjdGl2ZSwgeyQkc3RhcnQ6IHN0YXJ0QXR0ck5hbWUsICQkZW5kOiBlbmRBdHRyTmFtZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkaXJlY3RpdmUuJCRiaW5kaW5ncykge1xuICAgICAgICAgICAgICB2YXIgYmluZGluZ3MgPSBkaXJlY3RpdmUuJCRiaW5kaW5ncyA9XG4gICAgICAgICAgICAgICAgICBwYXJzZURpcmVjdGl2ZUJpbmRpbmdzKGRpcmVjdGl2ZSwgZGlyZWN0aXZlLm5hbWUpO1xuICAgICAgICAgICAgICBpZiAoaXNPYmplY3QoYmluZGluZ3MuaXNvbGF0ZVNjb3BlKSkge1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS4kJGlzb2xhdGVCaW5kaW5ncyA9IGJpbmRpbmdzLmlzb2xhdGVTY29wZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdERpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuICAgICAgICAgICAgbWF0Y2ggPSBkaXJlY3RpdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBsb29rcyB1cCB0aGUgZGlyZWN0aXZlIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBtdWx0aS1lbGVtZW50IGRpcmVjdGl2ZSxcbiAgICAgKiBhbmQgdGhlcmVmb3JlIHJlcXVpcmVzIERPTSBub2RlcyBiZXR3ZWVuIC1zdGFydCBhbmQgLWVuZCBtYXJrZXJzIHRvIGJlIGdyb3VwZWRcbiAgICAgKiB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgZGlyZWN0aXZlIHdhcyByZWdpc3RlcmVkIGFzIG11bHRpLWVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGlyZWN0aXZlSXNNdWx0aUVsZW1lbnQobmFtZSkge1xuICAgICAgaWYgKGhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgZm9yICh2YXIgZGlyZWN0aXZlLCBkaXJlY3RpdmVzID0gJGluamVjdG9yLmdldChuYW1lICsgU3VmZml4KSxcbiAgICAgICAgICAgIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbaV07XG4gICAgICAgICAgaWYgKGRpcmVjdGl2ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIGVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCBIVE1MIHRlbXBsYXRlIHRoZW4gdGhlIG5ldyBhdHRyaWJ1dGVzXG4gICAgICogb24gdGhlIHRlbXBsYXRlIG5lZWQgdG8gYmUgbWVyZ2VkIHdpdGggdGhlIGV4aXN0aW5nIGF0dHJpYnV0ZXMgaW4gdGhlIERPTS5cbiAgICAgKiBUaGUgZGVzaXJlZCBlZmZlY3QgaXMgdG8gaGF2ZSBib3RoIG9mIHRoZSBhdHRyaWJ1dGVzIHByZXNlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHN0IGRlc3RpbmF0aW9uIGF0dHJpYnV0ZXMgKG9yaWdpbmFsIERPTSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc3JjIHNvdXJjZSBhdHRyaWJ1dGVzIChmcm9tIHRoZSBkaXJlY3RpdmUgdGVtcGxhdGUpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VUZW1wbGF0ZUF0dHJpYnV0ZXMoZHN0LCBzcmMpIHtcbiAgICAgIHZhciBzcmNBdHRyID0gc3JjLiRhdHRyLFxuICAgICAgICAgIGRzdEF0dHIgPSBkc3QuJGF0dHI7XG5cbiAgICAgIC8vIHJlYXBwbHkgdGhlIG9sZCBhdHRyaWJ1dGVzIHRvIHRoZSBuZXcgZWxlbWVudFxuICAgICAgZm9yRWFjaChkc3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKGtleS5jaGFyQXQoMCkgIT09ICckJykge1xuICAgICAgICAgIGlmIChzcmNba2V5XSAmJiBzcmNba2V5XSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdmFsdWUgKz0gKGtleSA9PT0gJ3N0eWxlJyA/ICc7JyA6ICcgJykgKyBzcmNba2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gc3JjW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGRzdC4kc2V0KGtleSwgdmFsdWUsIHRydWUsIHNyY0F0dHJba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBjb3B5IHRoZSBuZXcgYXR0cmlidXRlcyBvbiB0aGUgb2xkIGF0dHJzIG9iamVjdFxuICAgICAgZm9yRWFjaChzcmMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBzZXQgdGhpcyBhdHRyaWJ1dGUgaW4gdGhlIGxvb3AgYWJvdmUuXG4gICAgICAgIC8vIGBkc3RgIHdpbGwgbmV2ZXIgY29udGFpbiBoYXNPd25Qcm9wZXJ0eSBhcyBET00gcGFyc2VyIHdvbid0IGxldCBpdC5cbiAgICAgICAgLy8gWW91IHdpbGwgZ2V0IGFuIFwiSW52YWxpZENoYXJhY3RlckVycm9yOiBET00gRXhjZXB0aW9uIDVcIiBlcnJvciBpZiB5b3VcbiAgICAgICAgLy8gaGF2ZSBhbiBhdHRyaWJ1dGUgbGlrZSBcImhhcy1vd24tcHJvcGVydHlcIiBvciBcImRhdGEtaGFzLW93bi1wcm9wZXJ0eVwiLCBldGMuXG4gICAgICAgIGlmICghZHN0Lmhhc093blByb3BlcnR5KGtleSkgJiYga2V5LmNoYXJBdCgwKSAhPT0gJyQnKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSB2YWx1ZTtcblxuICAgICAgICAgIGlmIChrZXkgIT09ICdjbGFzcycgJiYga2V5ICE9PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICBkc3RBdHRyW2tleV0gPSBzcmNBdHRyW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZVVybChkaXJlY3RpdmVzLCAkY29tcGlsZU5vZGUsIHRBdHRycyxcbiAgICAgICAgJHJvb3RFbGVtZW50LCBjaGlsZFRyYW5zY2x1ZGVGbiwgcHJlTGlua0ZucywgcG9zdExpbmtGbnMsIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpIHtcbiAgICAgIHZhciBsaW5rUXVldWUgPSBbXSxcbiAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbixcbiAgICAgICAgICBhZnRlclRlbXBsYXRlQ2hpbGRMaW5rRm4sXG4gICAgICAgICAgYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZSA9ICRjb21waWxlTm9kZVswXSxcbiAgICAgICAgICBvcmlnQXN5bmNEaXJlY3RpdmUgPSBkaXJlY3RpdmVzLnNoaWZ0KCksXG4gICAgICAgICAgZGVyaXZlZFN5bmNEaXJlY3RpdmUgPSBpbmhlcml0KG9yaWdBc3luY0RpcmVjdGl2ZSwge1xuICAgICAgICAgICAgdGVtcGxhdGVVcmw6IG51bGwsIHRyYW5zY2x1ZGU6IG51bGwsIHJlcGxhY2U6IG51bGwsICQkb3JpZ2luYWxEaXJlY3RpdmU6IG9yaWdBc3luY0RpcmVjdGl2ZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRlbXBsYXRlVXJsID0gKGlzRnVuY3Rpb24ob3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlVXJsKSlcbiAgICAgICAgICAgICAgPyBvcmlnQXN5bmNEaXJlY3RpdmUudGVtcGxhdGVVcmwoJGNvbXBpbGVOb2RlLCB0QXR0cnMpXG4gICAgICAgICAgICAgIDogb3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlVXJsLFxuICAgICAgICAgIHRlbXBsYXRlTmFtZXNwYWNlID0gb3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlTmFtZXNwYWNlO1xuXG4gICAgICAkY29tcGlsZU5vZGUuZW1wdHkoKTtcblxuICAgICAgJHRlbXBsYXRlUmVxdWVzdCh0ZW1wbGF0ZVVybClcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xuICAgICAgICAgIHZhciBjb21waWxlTm9kZSwgdGVtcFRlbXBsYXRlQXR0cnMsICR0ZW1wbGF0ZSwgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbjtcblxuICAgICAgICAgIGNvbnRlbnQgPSBkZW5vcm1hbGl6ZVRlbXBsYXRlKGNvbnRlbnQpO1xuXG4gICAgICAgICAgaWYgKG9yaWdBc3luY0RpcmVjdGl2ZS5yZXBsYWNlKSB7XG4gICAgICAgICAgICBpZiAoanFMaXRlSXNUZXh0Tm9kZShjb250ZW50KSkge1xuICAgICAgICAgICAgICAkdGVtcGxhdGUgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IHJlbW92ZUNvbW1lbnRzKHdyYXBUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWVzcGFjZSwgdHJpbShjb250ZW50KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcGlsZU5vZGUgPSAkdGVtcGxhdGVbMF07XG5cbiAgICAgICAgICAgIGlmICgkdGVtcGxhdGUubGVuZ3RoICE9PSAxIHx8IGNvbXBpbGVOb2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCkge1xuICAgICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigndHBscnQnLFxuICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlIGZvciBkaXJlY3RpdmUgXFwnezB9XFwnIG11c3QgaGF2ZSBleGFjdGx5IG9uZSByb290IGVsZW1lbnQuIHsxfScsXG4gICAgICAgICAgICAgICAgICBvcmlnQXN5bmNEaXJlY3RpdmUubmFtZSwgdGVtcGxhdGVVcmwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0ZW1wVGVtcGxhdGVBdHRycyA9IHskYXR0cjoge319O1xuICAgICAgICAgICAgcmVwbGFjZVdpdGgoJHJvb3RFbGVtZW50LCAkY29tcGlsZU5vZGUsIGNvbXBpbGVOb2RlKTtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhjb21waWxlTm9kZSwgW10sIHRlbXBUZW1wbGF0ZUF0dHJzKTtcblxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9yaWdBc3luY0RpcmVjdGl2ZS5zY29wZSkpIHtcbiAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIGRpcmVjdGl2ZSB0aGF0IGNhdXNlZCB0aGUgdGVtcGxhdGUgdG8gYmUgbG9hZGVkIGFzeW5jIHJlcXVpcmVkXG4gICAgICAgICAgICAgIC8vIGFuIGlzb2xhdGUgc2NvcGVcbiAgICAgICAgICAgICAgbWFya0RpcmVjdGl2ZVNjb3BlKHRlbXBsYXRlRGlyZWN0aXZlcywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXJlY3RpdmVzID0gdGVtcGxhdGVEaXJlY3RpdmVzLmNvbmNhdChkaXJlY3RpdmVzKTtcbiAgICAgICAgICAgIG1lcmdlVGVtcGxhdGVBdHRyaWJ1dGVzKHRBdHRycywgdGVtcFRlbXBsYXRlQXR0cnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21waWxlTm9kZSA9IGJlZm9yZVRlbXBsYXRlQ29tcGlsZU5vZGU7XG4gICAgICAgICAgICAkY29tcGlsZU5vZGUuaHRtbChjb250ZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaXJlY3RpdmVzLnVuc2hpZnQoZGVyaXZlZFN5bmNEaXJlY3RpdmUpO1xuXG4gICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4gPSBhcHBseURpcmVjdGl2ZXNUb05vZGUoZGlyZWN0aXZlcywgY29tcGlsZU5vZGUsIHRBdHRycyxcbiAgICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4sICRjb21waWxlTm9kZSwgb3JpZ0FzeW5jRGlyZWN0aXZlLCBwcmVMaW5rRm5zLCBwb3N0TGlua0ZucyxcbiAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCk7XG4gICAgICAgICAgZm9yRWFjaCgkcm9vdEVsZW1lbnQsIGZ1bmN0aW9uKG5vZGUsIGkpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBjb21waWxlTm9kZSkge1xuICAgICAgICAgICAgICAkcm9vdEVsZW1lbnRbaV0gPSAkY29tcGlsZU5vZGVbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuID0gY29tcGlsZU5vZGVzKCRjb21waWxlTm9kZVswXS5jaGlsZE5vZGVzLCBjaGlsZFRyYW5zY2x1ZGVGbik7XG5cbiAgICAgICAgICB3aGlsZSAobGlua1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHNjb3BlID0gbGlua1F1ZXVlLnNoaWZ0KCksXG4gICAgICAgICAgICAgICAgYmVmb3JlVGVtcGxhdGVMaW5rTm9kZSA9IGxpbmtRdWV1ZS5zaGlmdCgpLFxuICAgICAgICAgICAgICAgIGxpbmtSb290RWxlbWVudCA9IGxpbmtRdWV1ZS5zaGlmdCgpLFxuICAgICAgICAgICAgICAgIGJvdW5kVHJhbnNjbHVkZUZuID0gbGlua1F1ZXVlLnNoaWZ0KCksXG4gICAgICAgICAgICAgICAgbGlua05vZGUgPSAkY29tcGlsZU5vZGVbMF07XG5cbiAgICAgICAgICAgIGlmIChzY29wZS4kJGRlc3Ryb3llZCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlICE9PSBiZWZvcmVUZW1wbGF0ZUNvbXBpbGVOb2RlKSB7XG4gICAgICAgICAgICAgIHZhciBvbGRDbGFzc2VzID0gYmVmb3JlVGVtcGxhdGVMaW5rTm9kZS5jbGFzc05hbWU7XG5cbiAgICAgICAgICAgICAgaWYgKCEocHJldmlvdXNDb21waWxlQ29udGV4dC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSAmJlxuICAgICAgICAgICAgICAgICAgb3JpZ0FzeW5jRGlyZWN0aXZlLnJlcGxhY2UpKSB7XG4gICAgICAgICAgICAgICAgLy8gaXQgd2FzIGNsb25lZCB0aGVyZWZvcmUgd2UgaGF2ZSB0byBjbG9uZSBhcyB3ZWxsLlxuICAgICAgICAgICAgICAgIGxpbmtOb2RlID0ganFMaXRlQ2xvbmUoY29tcGlsZU5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcGxhY2VXaXRoKGxpbmtSb290RWxlbWVudCwganFMaXRlKGJlZm9yZVRlbXBsYXRlTGlua05vZGUpLCBsaW5rTm9kZSk7XG5cbiAgICAgICAgICAgICAgLy8gQ29weSBpbiBDU1MgY2xhc3NlcyBmcm9tIG9yaWdpbmFsIG5vZGVcbiAgICAgICAgICAgICAgc2FmZUFkZENsYXNzKGpxTGl0ZShsaW5rTm9kZSksIG9sZENsYXNzZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4udHJhbnNjbHVkZSwgYm91bmRUcmFuc2NsdWRlRm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGJvdW5kVHJhbnNjbHVkZUZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4oYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuLCBzY29wZSwgbGlua05vZGUsICRyb290RWxlbWVudCxcbiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpbmtRdWV1ZSA9IG51bGw7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKG5vb3ApO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXllZE5vZGVMaW5rRm4oaWdub3JlQ2hpbGRMaW5rRm4sIHNjb3BlLCBub2RlLCByb290RWxlbWVudCwgYm91bmRUcmFuc2NsdWRlRm4pIHtcbiAgICAgICAgdmFyIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBib3VuZFRyYW5zY2x1ZGVGbjtcbiAgICAgICAgaWYgKHNjb3BlLiQkZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgIGlmIChsaW5rUXVldWUpIHtcbiAgICAgICAgICBsaW5rUXVldWUucHVzaChzY29wZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChhZnRlclRlbXBsYXRlTm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCkge1xuICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbi50cmFuc2NsdWRlLCBib3VuZFRyYW5zY2x1ZGVGbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuKGFmdGVyVGVtcGxhdGVDaGlsZExpbmtGbiwgc2NvcGUsIG5vZGUsIHJvb3RFbGVtZW50LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFNvcnRpbmcgZnVuY3Rpb24gZm9yIGJvdW5kIGRpcmVjdGl2ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYnlQcmlvcml0eShhLCBiKSB7XG4gICAgICB2YXIgZGlmZiA9IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5O1xuICAgICAgaWYgKGRpZmYgIT09IDApIHJldHVybiBkaWZmO1xuICAgICAgaWYgKGEubmFtZSAhPT0gYi5uYW1lKSByZXR1cm4gKGEubmFtZSA8IGIubmFtZSkgPyAtMSA6IDE7XG4gICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXNzZXJ0Tm9EdXBsaWNhdGUod2hhdCwgcHJldmlvdXNEaXJlY3RpdmUsIGRpcmVjdGl2ZSwgZWxlbWVudCkge1xuXG4gICAgICBmdW5jdGlvbiB3cmFwTW9kdWxlTmFtZUlmRGVmaW5lZChtb2R1bGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBtb2R1bGVOYW1lID9cbiAgICAgICAgICAoJyAobW9kdWxlOiAnICsgbW9kdWxlTmFtZSArICcpJykgOlxuICAgICAgICAgICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldmlvdXNEaXJlY3RpdmUpIHtcbiAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ211bHRpZGlyJywgJ011bHRpcGxlIGRpcmVjdGl2ZXMgW3swfXsxfSwgezJ9ezN9XSBhc2tpbmcgZm9yIHs0fSBvbjogezV9JyxcbiAgICAgICAgICAgIHByZXZpb3VzRGlyZWN0aXZlLm5hbWUsIHdyYXBNb2R1bGVOYW1lSWZEZWZpbmVkKHByZXZpb3VzRGlyZWN0aXZlLiQkbW9kdWxlTmFtZSksXG4gICAgICAgICAgICBkaXJlY3RpdmUubmFtZSwgd3JhcE1vZHVsZU5hbWVJZkRlZmluZWQoZGlyZWN0aXZlLiQkbW9kdWxlTmFtZSksIHdoYXQsIHN0YXJ0aW5nVGFnKGVsZW1lbnQpKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGFkZFRleHRJbnRlcnBvbGF0ZURpcmVjdGl2ZShkaXJlY3RpdmVzLCB0ZXh0KSB7XG4gICAgICB2YXIgaW50ZXJwb2xhdGVGbiA9ICRpbnRlcnBvbGF0ZSh0ZXh0LCB0cnVlKTtcbiAgICAgIGlmIChpbnRlcnBvbGF0ZUZuKSB7XG4gICAgICAgIGRpcmVjdGl2ZXMucHVzaCh7XG4gICAgICAgICAgcHJpb3JpdHk6IDAsXG4gICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gdGV4dEludGVycG9sYXRlQ29tcGlsZUZuKHRlbXBsYXRlTm9kZSkge1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlTm9kZVBhcmVudCA9IHRlbXBsYXRlTm9kZS5wYXJlbnQoKSxcbiAgICAgICAgICAgICAgICBoYXNDb21waWxlUGFyZW50ID0gISF0ZW1wbGF0ZU5vZGVQYXJlbnQubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBXaGVuIHRyYW5zY2x1ZGluZyBhIHRlbXBsYXRlIHRoYXQgaGFzIGJpbmRpbmdzIGluIHRoZSByb290XG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGEgcGFyZW50IGFuZCB0aHVzIG5lZWQgdG8gYWRkIHRoZSBjbGFzcyBkdXJpbmcgbGlua2luZyBmbi5cbiAgICAgICAgICAgIGlmIChoYXNDb21waWxlUGFyZW50KSBjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzKHRlbXBsYXRlTm9kZVBhcmVudCk7XG5cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGVMaW5rRm4oc2NvcGUsIG5vZGUpIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50KCk7XG4gICAgICAgICAgICAgIGlmICghaGFzQ29tcGlsZVBhcmVudCkgY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyhwYXJlbnQpO1xuICAgICAgICAgICAgICBjb21waWxlLiQkYWRkQmluZGluZ0luZm8ocGFyZW50LCBpbnRlcnBvbGF0ZUZuLmV4cHJlc3Npb25zKTtcbiAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoKGludGVycG9sYXRlRm4sIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaEFjdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG5vZGVbMF0ubm9kZVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gd3JhcFRlbXBsYXRlKHR5cGUsIHRlbXBsYXRlKSB7XG4gICAgICB0eXBlID0gbG93ZXJjYXNlKHR5cGUgfHwgJ2h0bWwnKTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3ZnJzpcbiAgICAgIGNhc2UgJ21hdGgnOlxuICAgICAgICB2YXIgd3JhcHBlciA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgd3JhcHBlci5pbm5lckhUTUwgPSAnPCcgKyB0eXBlICsgJz4nICsgdGVtcGxhdGUgKyAnPC8nICsgdHlwZSArICc+JztcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gZ2V0VHJ1c3RlZENvbnRleHQobm9kZSwgYXR0ck5vcm1hbGl6ZWROYW1lKSB7XG4gICAgICBpZiAoYXR0ck5vcm1hbGl6ZWROYW1lID09PSAnc3JjZG9jJykge1xuICAgICAgICByZXR1cm4gJHNjZS5IVE1MO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IG5vZGVOYW1lXyhub2RlKTtcbiAgICAgIC8vIEFsbCB0YWdzIHdpdGggc3JjIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIFJFU09VUkNFX1VSTCB2YWx1ZSwgZXhjZXB0IGZvclxuICAgICAgLy8gaW1nIGFuZCB2YXJpb3VzIGh0bWw1IG1lZGlhIHRhZ3MuXG4gICAgICBpZiAoYXR0ck5vcm1hbGl6ZWROYW1lID09PSAnc3JjJyB8fCBhdHRyTm9ybWFsaXplZE5hbWUgPT09ICduZ1NyYycpIHtcbiAgICAgICAgaWYgKFsnaW1nJywgJ3ZpZGVvJywgJ2F1ZGlvJywgJ3NvdXJjZScsICd0cmFjayddLmluZGV4T2YodGFnKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gJHNjZS5SRVNPVVJDRV9VUkw7XG4gICAgICAgIH1cbiAgICAgIC8vIG1hY3Rpb25beGxpbms6aHJlZl0gY2FuIHNvdXJjZSBTVkcuICBJdCdzIG5vdCBsaW1pdGVkIHRvIDxtYWN0aW9uPi5cbiAgICAgIH0gZWxzZSBpZiAoYXR0ck5vcm1hbGl6ZWROYW1lID09PSAneGxpbmtIcmVmJyB8fFxuICAgICAgICAgICh0YWcgPT09ICdmb3JtJyAmJiBhdHRyTm9ybWFsaXplZE5hbWUgPT09ICdhY3Rpb24nKSB8fFxuICAgICAgICAgIC8vIGxpbmtzIGNhbiBiZSBzdHlsZXNoZWV0cyBvciBpbXBvcnRzLCB3aGljaCBjYW4gcnVuIHNjcmlwdCBpbiB0aGUgY3VycmVudCBvcmlnaW5cbiAgICAgICAgICAodGFnID09PSAnbGluaycgJiYgYXR0ck5vcm1hbGl6ZWROYW1lID09PSAnaHJlZicpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuICRzY2UuUkVTT1VSQ0VfVVJMO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gYWRkQXR0ckludGVycG9sYXRlRGlyZWN0aXZlKG5vZGUsIGRpcmVjdGl2ZXMsIHZhbHVlLCBuYW1lLCBpc05nQXR0cikge1xuICAgICAgdmFyIHRydXN0ZWRDb250ZXh0ID0gZ2V0VHJ1c3RlZENvbnRleHQobm9kZSwgbmFtZSk7XG4gICAgICB2YXIgbXVzdEhhdmVFeHByZXNzaW9uID0gIWlzTmdBdHRyO1xuICAgICAgdmFyIGFsbE9yTm90aGluZyA9IEFMTF9PUl9OT1RISU5HX0FUVFJTW25hbWVdIHx8IGlzTmdBdHRyO1xuXG4gICAgICB2YXIgaW50ZXJwb2xhdGVGbiA9ICRpbnRlcnBvbGF0ZSh2YWx1ZSwgbXVzdEhhdmVFeHByZXNzaW9uLCB0cnVzdGVkQ29udGV4dCwgYWxsT3JOb3RoaW5nKTtcblxuICAgICAgLy8gbm8gaW50ZXJwb2xhdGlvbiBmb3VuZCAtPiBpZ25vcmVcbiAgICAgIGlmICghaW50ZXJwb2xhdGVGbikgcmV0dXJuO1xuXG4gICAgICBpZiAobmFtZSA9PT0gJ211bHRpcGxlJyAmJiBub2RlTmFtZV8obm9kZSkgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdzZWxtdWx0aScsXG4gICAgICAgICAgICAnQmluZGluZyB0byB0aGUgXFwnbXVsdGlwbGVcXCcgYXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQuIEVsZW1lbnQ6IHswfScsXG4gICAgICAgICAgICBzdGFydGluZ1RhZyhub2RlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9IQU5ETEVSX0FUVFJfUkVHRVhQLnRlc3QobmFtZSkpIHtcbiAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ25vZG9tZXZlbnRzJyxcbiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9ucyBmb3IgSFRNTCBET00gZXZlbnQgYXR0cmlidXRlcyBhcmUgZGlzYWxsb3dlZC4gIFBsZWFzZSB1c2UgdGhlICcgK1xuICAgICAgICAgICAgICAgICduZy0gdmVyc2lvbnMgKHN1Y2ggYXMgbmctY2xpY2sgaW5zdGVhZCBvZiBvbmNsaWNrKSBpbnN0ZWFkLicpO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVzLnB1c2goe1xuICAgICAgICBwcmlvcml0eTogMTAwLFxuICAgICAgICBjb21waWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHByZTogZnVuY3Rpb24gYXR0ckludGVycG9sYXRlUHJlTGlua0ZuKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgICAgICAgICAgdmFyICQkb2JzZXJ2ZXJzID0gKGF0dHIuJCRvYnNlcnZlcnMgfHwgKGF0dHIuJCRvYnNlcnZlcnMgPSBjcmVhdGVNYXAoKSkpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0ICRpbnRlcnBvbGF0ZSgpZWRcbiAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBhdHRyW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUgYWdhaW4gc2luY2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgICAgICAgICAgICAvLyAoZS5nLiBieSBhbm90aGVyIGRpcmVjdGl2ZSdzIGNvbXBpbGUgZnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdW5zZXQvZW1wdHkgdmFsdWVzIG1ha2UgaW50ZXJwb2xhdGVGbiBmYWxzeVxuICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVGbiA9IG5ld1ZhbHVlICYmICRpbnRlcnBvbGF0ZShuZXdWYWx1ZSwgdHJ1ZSwgdHJ1c3RlZENvbnRleHQsIGFsbE9yTm90aGluZyk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIGF0dHJpYnV0ZSB3YXMgdXBkYXRlZCBzbyB0aGF0IHRoZXJlIGlzIG5vIGludGVycG9sYXRpb24gZ29pbmcgb24gd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGFueSBvYnNlcnZlcnNcbiAgICAgICAgICAgICAgICBpZiAoIWludGVycG9sYXRlRm4pIHJldHVybjtcblxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgYXR0ciBvYmplY3Qgc28gdGhhdCBpdCdzIHJlYWR5IGluIGNhc2Ugd2UgbmVlZCB0aGUgdmFsdWUgZm9yIGlzb2xhdGVcbiAgICAgICAgICAgICAgICAvLyBzY29wZSBpbml0aWFsaXphdGlvbiwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSB3b3VsZCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXNvbGF0ZVxuICAgICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZSdzIGxpbmtpbmcgZm4gZHVyaW5nIGxpbmtpbmcgcGhhc2VcbiAgICAgICAgICAgICAgICBhdHRyW25hbWVdID0gaW50ZXJwb2xhdGVGbihzY29wZSk7XG5cbiAgICAgICAgICAgICAgICAoJCRvYnNlcnZlcnNbbmFtZV0gfHwgKCQkb2JzZXJ2ZXJzW25hbWVdID0gW10pKS4kJGludGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAoYXR0ci4kJG9ic2VydmVycyAmJiBhdHRyLiQkb2JzZXJ2ZXJzW25hbWVdLiQkc2NvcGUgfHwgc2NvcGUpLlxuICAgICAgICAgICAgICAgICAgJHdhdGNoKGludGVycG9sYXRlRm4sIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaEFjdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zcGVjaWFsIGNhc2UgZm9yIGNsYXNzIGF0dHJpYnV0ZSBhZGRpdGlvbiArIHJlbW92YWxcbiAgICAgICAgICAgICAgICAgICAgLy9zbyB0aGF0IGNsYXNzIGNoYW5nZXMgY2FuIHRhcCBpbnRvIHRoZSBhbmltYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ob29rcyBwcm92aWRlZCBieSB0aGUgJGFuaW1hdGUgc2VydmljZS4gQmUgc3VyZSB0b1xuICAgICAgICAgICAgICAgICAgICAvL3NraXAgYW5pbWF0aW9ucyB3aGVuIHRoZSBmaXJzdCBkaWdlc3Qgb2NjdXJzICh3aGVuXG4gICAgICAgICAgICAgICAgICAgIC8vYm90aCB0aGUgbmV3IGFuZCB0aGUgb2xkIHZhbHVlcyBhcmUgdGhlIHNhbWUpIHNpbmNlXG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIENTUyBjbGFzc2VzIGFyZSB0aGUgbm9uLWludGVycG9sYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycgJiYgbmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXR0ci4kdXBkYXRlQ2xhc3MobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyLiRzZXQobmFtZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBzcGVjaWFsIGpxTGl0ZS5yZXBsYWNlV2l0aCwgd2hpY2ggY2FuIHJlcGxhY2UgaXRlbXMgd2hpY2hcbiAgICAgKiBoYXZlIG5vIHBhcmVudHMsIHByb3ZpZGVkIHRoYXQgdGhlIGNvbnRhaW5pbmcganFMaXRlIGNvbGxlY3Rpb24gaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0pxTGl0ZT19ICRyb290RWxlbWVudCBUaGUgcm9vdCBvZiB0aGUgY29tcGlsZSB0cmVlLiBVc2VkIHNvIHRoYXQgd2UgY2FuIHJlcGxhY2Ugbm9kZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcm9vdCBvZiB0aGUgdHJlZS5cbiAgICAgKiBAcGFyYW0ge0pxTGl0ZX0gZWxlbWVudHNUb1JlbW92ZSBUaGUganFMaXRlIGVsZW1lbnQgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHJlcGxhY2UuIFdlIGtlZXBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2hlbGwsIGJ1dCByZXBsYWNlIGl0cyBET00gbm9kZSByZWZlcmVuY2UuXG4gICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIFRoZSBuZXcgRE9NIG5vZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZVdpdGgoJHJvb3RFbGVtZW50LCBlbGVtZW50c1RvUmVtb3ZlLCBuZXdOb2RlKSB7XG4gICAgICB2YXIgZmlyc3RFbGVtZW50VG9SZW1vdmUgPSBlbGVtZW50c1RvUmVtb3ZlWzBdLFxuICAgICAgICAgIHJlbW92ZUNvdW50ID0gZWxlbWVudHNUb1JlbW92ZS5sZW5ndGgsXG4gICAgICAgICAgcGFyZW50ID0gZmlyc3RFbGVtZW50VG9SZW1vdmUucGFyZW50Tm9kZSxcbiAgICAgICAgICBpLCBpaTtcblxuICAgICAgaWYgKCRyb290RWxlbWVudCkge1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9ICRyb290RWxlbWVudC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgaWYgKCRyb290RWxlbWVudFtpXSA9PT0gZmlyc3RFbGVtZW50VG9SZW1vdmUpIHtcbiAgICAgICAgICAgICRyb290RWxlbWVudFtpKytdID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSBpLCBqMiA9IGogKyByZW1vdmVDb3VudCAtIDEsXG4gICAgICAgICAgICAgICAgICAgICBqaiA9ICRyb290RWxlbWVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgIGogPCBqajsgaisrLCBqMisrKSB7XG4gICAgICAgICAgICAgIGlmIChqMiA8IGpqKSB7XG4gICAgICAgICAgICAgICAgJHJvb3RFbGVtZW50W2pdID0gJHJvb3RFbGVtZW50W2oyXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgJHJvb3RFbGVtZW50W2pdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkcm9vdEVsZW1lbnQubGVuZ3RoIC09IHJlbW92ZUNvdW50IC0gMTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHJlcGxhY2VkIGVsZW1lbnQgaXMgYWxzbyB0aGUgalF1ZXJ5IC5jb250ZXh0IHRoZW4gcmVwbGFjZSBpdFxuICAgICAgICAgICAgLy8gLmNvbnRleHQgaXMgYSBkZXByZWNhdGVkIGpRdWVyeSBhcGksIHNvIHdlIHNob3VsZCBzZXQgaXQgb25seSB3aGVuIGpRdWVyeSBzZXQgaXRcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jb250ZXh0L1xuICAgICAgICAgICAgaWYgKCRyb290RWxlbWVudC5jb250ZXh0ID09PSBmaXJzdEVsZW1lbnRUb1JlbW92ZSkge1xuICAgICAgICAgICAgICAkcm9vdEVsZW1lbnQuY29udGV4dCA9IG5ld05vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKG5ld05vZGUsIGZpcnN0RWxlbWVudFRvUmVtb3ZlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwZW5kIGFsbCB0aGUgYGVsZW1lbnRzVG9SZW1vdmVgIHRvIGEgZnJhZ21lbnQuIFRoaXMgd2lsbC4uLlxuICAgICAgLy8gLSByZW1vdmUgdGhlbSBmcm9tIHRoZSBET01cbiAgICAgIC8vIC0gYWxsb3cgdGhlbSB0byBzdGlsbCBiZSB0cmF2ZXJzZWQgd2l0aCAubmV4dFNpYmxpbmdcbiAgICAgIC8vIC0gYWxsb3cgYSBzaW5nbGUgZnJhZ21lbnQucVNBIHRvIGZldGNoIGFsbCBlbGVtZW50cyBiZWluZyByZW1vdmVkXG4gICAgICB2YXIgZnJhZ21lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHJlbW92ZUNvdW50OyBpKyspIHtcbiAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudHNUb1JlbW92ZVtpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChqcUxpdGUuaGFzRGF0YShmaXJzdEVsZW1lbnRUb1JlbW92ZSkpIHtcbiAgICAgICAgLy8gQ29weSBvdmVyIHVzZXIgZGF0YSAodGhhdCBpbmNsdWRlcyBBbmd1bGFyJ3MgJHNjb3BlIGV0Yy4pLiBEb24ndCBjb3B5IHByaXZhdGVcbiAgICAgICAgLy8gZGF0YSBoZXJlIGJlY2F1c2UgdGhlcmUncyBubyBwdWJsaWMgaW50ZXJmYWNlIGluIGpRdWVyeSB0byBkbyB0aGF0IGFuZCBjb3B5aW5nIG92ZXJcbiAgICAgICAgLy8gZXZlbnQgbGlzdGVuZXJzICh3aGljaCBpcyB0aGUgbWFpbiB1c2Ugb2YgcHJpdmF0ZSBkYXRhKSB3b3VsZG4ndCB3b3JrIGFueXdheS5cbiAgICAgICAganFMaXRlLmRhdGEobmV3Tm9kZSwganFMaXRlLmRhdGEoZmlyc3RFbGVtZW50VG9SZW1vdmUpKTtcblxuICAgICAgICAvLyBSZW1vdmUgJGRlc3Ryb3kgZXZlbnQgbGlzdGVuZXJzIGZyb20gYGZpcnN0RWxlbWVudFRvUmVtb3ZlYFxuICAgICAgICBqcUxpdGUoZmlyc3RFbGVtZW50VG9SZW1vdmUpLm9mZignJGRlc3Ryb3knKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW51cCBhbnkgZGF0YS9saXN0ZW5lcnMgb24gdGhlIGVsZW1lbnRzIGFuZCBjaGlsZHJlbi5cbiAgICAgIC8vIFRoaXMgaW5jbHVkZXMgaW52b2tpbmcgdGhlICRkZXN0cm95IGV2ZW50IG9uIGFueSBlbGVtZW50cyB3aXRoIGxpc3RlbmVycy5cbiAgICAgIGpxTGl0ZS5jbGVhbkRhdGEoZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpKTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBqcUxpdGUgY29sbGVjdGlvbiB0byBvbmx5IGNvbnRhaW4gdGhlIGBuZXdOb2RlYFxuICAgICAgZm9yIChpID0gMTsgaSA8IHJlbW92ZUNvdW50OyBpKyspIHtcbiAgICAgICAgZGVsZXRlIGVsZW1lbnRzVG9SZW1vdmVbaV07XG4gICAgICB9XG4gICAgICBlbGVtZW50c1RvUmVtb3ZlWzBdID0gbmV3Tm9kZTtcbiAgICAgIGVsZW1lbnRzVG9SZW1vdmUubGVuZ3RoID0gMTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNsb25lQW5kQW5ub3RhdGVGbihmbiwgYW5ub3RhdGlvbikge1xuICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbigpIHsgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH0sIGZuLCBhbm5vdGF0aW9uKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGludm9rZUxpbmtGbihsaW5rRm4sIHNjb3BlLCAkZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxpbmtGbihzY29wZSwgJGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycywgdHJhbnNjbHVkZUZuKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSwgc3RhcnRpbmdUYWcoJGVsZW1lbnQpKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIFNldCB1cCAkd2F0Y2hlcyBmb3IgaXNvbGF0ZSBzY29wZSBhbmQgY29udHJvbGxlciBiaW5kaW5ncy5cbiAgICBmdW5jdGlvbiBpbml0aWFsaXplRGlyZWN0aXZlQmluZGluZ3Moc2NvcGUsIGF0dHJzLCBkZXN0aW5hdGlvbiwgYmluZGluZ3MsIGRpcmVjdGl2ZSkge1xuICAgICAgdmFyIHJlbW92ZVdhdGNoQ29sbGVjdGlvbiA9IFtdO1xuICAgICAgdmFyIGluaXRpYWxDaGFuZ2VzID0ge307XG4gICAgICB2YXIgY2hhbmdlcztcbiAgICAgIGZvckVhY2goYmluZGluZ3MsIGZ1bmN0aW9uIGluaXRpYWxpemVCaW5kaW5nKGRlZmluaXRpb24sIHNjb3BlTmFtZSkge1xuICAgICAgICB2YXIgYXR0ck5hbWUgPSBkZWZpbml0aW9uLmF0dHJOYW1lLFxuICAgICAgICBvcHRpb25hbCA9IGRlZmluaXRpb24ub3B0aW9uYWwsXG4gICAgICAgIG1vZGUgPSBkZWZpbml0aW9uLm1vZGUsIC8vIEAsID0sIDwsIG9yICZcbiAgICAgICAgbGFzdFZhbHVlLFxuICAgICAgICBwYXJlbnRHZXQsIHBhcmVudFNldCwgY29tcGFyZSwgcmVtb3ZlV2F0Y2g7XG5cbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG5cbiAgICAgICAgICBjYXNlICdAJzpcbiAgICAgICAgICAgIGlmICghb3B0aW9uYWwgJiYgIWhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gYXR0cnNbYXR0ck5hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVtb3ZlV2F0Y2ggPSBhdHRycy4kb2JzZXJ2ZShhdHRyTmFtZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSB8fCBpc0Jvb2xlYW4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZGVzdGluYXRpb25bc2NvcGVOYW1lXTtcbiAgICAgICAgICAgICAgICByZWNvcmRDaGFuZ2VzKHNjb3BlTmFtZSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXR0cnMuJCRvYnNlcnZlcnNbYXR0ck5hbWVdLiQkc2NvcGUgPSBzY29wZTtcbiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGF0dHJzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUgaGFzIGJlZW4gcHJvdmlkZWQgdGhlbiB3ZSB0cmlnZ2VyIGFuIGludGVycG9sYXRpb24gdG8gZW5zdXJlXG4gICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpcyB0aGVyZSBmb3IgdXNlIGluIHRoZSBsaW5rIGZuXG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0gPSAkaW50ZXJwb2xhdGUobGFzdFZhbHVlKShzY29wZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQm9vbGVhbihsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBhdHRyaWJ1dGVzIGlzIG9uZSBvZiB0aGUgQk9PTEVBTl9BVFRSIHRoZW4gQW5ndWxhciB3aWxsIGhhdmUgY29udmVydGVkXG4gICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSB0byBib29sZWFuIHJhdGhlciB0aGFuIGEgc3RyaW5nLCBzbyB3ZSBzcGVjaWFsIGNhc2UgdGhpcyBzaXR1YXRpb25cbiAgICAgICAgICAgICAgZGVzdGluYXRpb25bc2NvcGVOYW1lXSA9IGxhc3RWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXRpYWxDaGFuZ2VzW3Njb3BlTmFtZV0gPSBuZXcgU2ltcGxlQ2hhbmdlKF9VTklOSVRJQUxJWkVEX1ZBTFVFLCBkZXN0aW5hdGlvbltzY29wZU5hbWVdKTtcbiAgICAgICAgICAgIHJlbW92ZVdhdGNoQ29sbGVjdGlvbi5wdXNoKHJlbW92ZVdhdGNoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwoYXR0cnMsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICBpZiAob3B0aW9uYWwpIGJyZWFrO1xuICAgICAgICAgICAgICBhdHRyc1thdHRyTmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9uYWwgJiYgIWF0dHJzW2F0dHJOYW1lXSkgYnJlYWs7XG5cbiAgICAgICAgICAgIHBhcmVudEdldCA9ICRwYXJzZShhdHRyc1thdHRyTmFtZV0pO1xuICAgICAgICAgICAgaWYgKHBhcmVudEdldC5saXRlcmFsKSB7XG4gICAgICAgICAgICAgIGNvbXBhcmUgPSBlcXVhbHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICAgICAgICAgIGNvbXBhcmUgPSBmdW5jdGlvbiBzaW1wbGVDb21wYXJlKGEsIGIpIHsgcmV0dXJuIGEgPT09IGIgfHwgKGEgIT09IGEgJiYgYiAhPT0gYik7IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRTZXQgPSBwYXJlbnRHZXQuYXNzaWduIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAvLyByZXNldCB0aGUgY2hhbmdlLCBvciB3ZSB3aWxsIHRocm93IHRoaXMgZXhjZXB0aW9uIG9uIGV2ZXJ5ICRkaWdlc3RcbiAgICAgICAgICAgICAgbGFzdFZhbHVlID0gZGVzdGluYXRpb25bc2NvcGVOYW1lXSA9IHBhcmVudEdldChzY29wZSk7XG4gICAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdub25hc3NpZ24nLFxuICAgICAgICAgICAgICAgICAgJ0V4cHJlc3Npb24gXFwnezB9XFwnIGluIGF0dHJpYnV0ZSBcXCd7MX1cXCcgdXNlZCB3aXRoIGRpcmVjdGl2ZSBcXCd7Mn1cXCcgaXMgbm9uLWFzc2lnbmFibGUhJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJzW2F0dHJOYW1lXSwgYXR0ck5hbWUsIGRpcmVjdGl2ZS5uYW1lKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsYXN0VmFsdWUgPSBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gcGFyZW50R2V0KHNjb3BlKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRWYWx1ZVdhdGNoID0gZnVuY3Rpb24gcGFyZW50VmFsdWVXYXRjaChwYXJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoIWNvbXBhcmUocGFyZW50VmFsdWUsIGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgYXJlIG91dCBvZiBzeW5jIGFuZCBuZWVkIHRvIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmUocGFyZW50VmFsdWUsIGxhc3RWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHBhcmVudCBjaGFuZ2VkIGFuZCBpdCBoYXMgcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25bc2NvcGVOYW1lXSA9IHBhcmVudFZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFyZW50IGNhbiBiZSBhc3NpZ25lZCB0aGVuIGRvIHNvXG4gICAgICAgICAgICAgICAgICBwYXJlbnRTZXQoc2NvcGUsIHBhcmVudFZhbHVlID0gZGVzdGluYXRpb25bc2NvcGVOYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxhc3RWYWx1ZSA9IHBhcmVudFZhbHVlO1xuICAgICAgICAgICAgICByZXR1cm4gbGFzdFZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhcmVudFZhbHVlV2F0Y2guJHN0YXRlZnVsID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgcmVtb3ZlV2F0Y2ggPSBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKGF0dHJzW2F0dHJOYW1lXSwgcGFyZW50VmFsdWVXYXRjaCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW1vdmVXYXRjaCA9IHNjb3BlLiR3YXRjaCgkcGFyc2UoYXR0cnNbYXR0ck5hbWVdLCBwYXJlbnRWYWx1ZVdhdGNoKSwgbnVsbCwgcGFyZW50R2V0LmxpdGVyYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVtb3ZlV2F0Y2hDb2xsZWN0aW9uLnB1c2gocmVtb3ZlV2F0Y2gpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25hbCkgYnJlYWs7XG4gICAgICAgICAgICAgIGF0dHJzW2F0dHJOYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25hbCAmJiAhYXR0cnNbYXR0ck5hbWVdKSBicmVhaztcblxuICAgICAgICAgICAgcGFyZW50R2V0ID0gJHBhcnNlKGF0dHJzW2F0dHJOYW1lXSk7XG4gICAgICAgICAgICB2YXIgZGVlcFdhdGNoID0gcGFyZW50R2V0LmxpdGVyYWw7XG5cbiAgICAgICAgICAgIHZhciBpbml0aWFsVmFsdWUgPSBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gcGFyZW50R2V0KHNjb3BlKTtcbiAgICAgICAgICAgIGluaXRpYWxDaGFuZ2VzW3Njb3BlTmFtZV0gPSBuZXcgU2ltcGxlQ2hhbmdlKF9VTklOSVRJQUxJWkVEX1ZBTFVFLCBkZXN0aW5hdGlvbltzY29wZU5hbWVdKTtcblxuICAgICAgICAgICAgcmVtb3ZlV2F0Y2ggPSBzY29wZS4kd2F0Y2gocGFyZW50R2V0LCBmdW5jdGlvbiBwYXJlbnRWYWx1ZVdhdGNoQWN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09PSBpbml0aWFsVmFsdWUgfHwgKGRlZXBXYXRjaCAmJiBlcXVhbHMob2xkVmFsdWUsIGluaXRpYWxWYWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9sZFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlY29yZENoYW5nZXMoc2NvcGVOYW1lLCBuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgICAgICAgICBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB9LCBkZWVwV2F0Y2gpO1xuXG4gICAgICAgICAgICByZW1vdmVXYXRjaENvbGxlY3Rpb24ucHVzaChyZW1vdmVXYXRjaCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJyYnOlxuICAgICAgICAgICAgLy8gRG9uJ3QgYXNzaWduIE9iamVjdC5wcm90b3R5cGUgbWV0aG9kIHRvIHNjb3BlXG4gICAgICAgICAgICBwYXJlbnRHZXQgPSBhdHRycy5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkgPyAkcGFyc2UoYXR0cnNbYXR0ck5hbWVdKSA6IG5vb3A7XG5cbiAgICAgICAgICAgIC8vIERvbid0IGFzc2lnbiBub29wIHRvIGRlc3RpbmF0aW9uIGlmIGV4cHJlc3Npb24gaXMgbm90IHZhbGlkXG4gICAgICAgICAgICBpZiAocGFyZW50R2V0ID09PSBub29wICYmIG9wdGlvbmFsKSBicmVhaztcblxuICAgICAgICAgICAgZGVzdGluYXRpb25bc2NvcGVOYW1lXSA9IGZ1bmN0aW9uKGxvY2Fscykge1xuICAgICAgICAgICAgICByZXR1cm4gcGFyZW50R2V0KHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gcmVjb3JkQ2hhbmdlcyhrZXksIGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihkZXN0aW5hdGlvbi4kb25DaGFuZ2VzKSAmJiBjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUgJiZcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAgICAgIChjdXJyZW50VmFsdWUgPT09IGN1cnJlbnRWYWx1ZSB8fCBwcmV2aW91c1ZhbHVlID09PSBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbm90IGFscmVhZHkgc2NoZWR1bGVkIHRoZSB0b3AgbGV2ZWwgb25DaGFuZ2VzUXVldWUgaGFuZGxlciB0aGVuIGRvIHNvIG5vd1xuICAgICAgICAgIGlmICghb25DaGFuZ2VzUXVldWUpIHtcbiAgICAgICAgICAgIHNjb3BlLiQkcG9zdERpZ2VzdChmbHVzaE9uQ2hhbmdlc1F1ZXVlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlc1F1ZXVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbm90IGFscmVhZHkgcXVldWVkIGEgdHJpZ2dlciBvZiBvbkNoYW5nZXMgZm9yIHRoaXMgY29udHJvbGxlciB0aGVuIGRvIHNvIG5vd1xuICAgICAgICAgIGlmICghY2hhbmdlcykge1xuICAgICAgICAgICAgY2hhbmdlcyA9IHt9O1xuICAgICAgICAgICAgb25DaGFuZ2VzUXVldWUucHVzaCh0cmlnZ2VyT25DaGFuZ2VzSG9vayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIElmIHRoZSBoYXMgYmVlbiBhIGNoYW5nZSBvbiB0aGlzIHByb3BlcnR5IGFscmVhZHkgdGhlbiB3ZSBuZWVkIHRvIHJldXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgIGlmIChjaGFuZ2VzW2tleV0pIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzW2tleV0ucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU3RvcmUgdGhpcyBjaGFuZ2VcbiAgICAgICAgICBjaGFuZ2VzW2tleV0gPSBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJpZ2dlck9uQ2hhbmdlc0hvb2soKSB7XG4gICAgICAgIGRlc3RpbmF0aW9uLiRvbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIC8vIE5vdyBjbGVhciB0aGUgY2hhbmdlcyBzbyB0aGF0IHdlIHNjaGVkdWxlIG9uQ2hhbmdlcyB3aGVuIG1vcmUgY2hhbmdlcyBhcnJpdmVcbiAgICAgICAgY2hhbmdlcyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdGlhbENoYW5nZXM6IGluaXRpYWxDaGFuZ2VzLFxuICAgICAgICByZW1vdmVXYXRjaGVzOiByZW1vdmVXYXRjaENvbGxlY3Rpb24ubGVuZ3RoICYmIGZ1bmN0aW9uIHJlbW92ZVdhdGNoZXMoKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVtb3ZlV2F0Y2hDb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICAgIHJlbW92ZVdhdGNoQ29sbGVjdGlvbltpXSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1dO1xufVxuXG5mdW5jdGlvbiBTaW1wbGVDaGFuZ2UocHJldmlvdXMsIGN1cnJlbnQpIHtcbiAgdGhpcy5wcmV2aW91c1ZhbHVlID0gcHJldmlvdXM7XG4gIHRoaXMuY3VycmVudFZhbHVlID0gY3VycmVudDtcbn1cblNpbXBsZUNoYW5nZS5wcm90b3R5cGUuaXNGaXJzdENoYW5nZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wcmV2aW91c1ZhbHVlID09PSBfVU5JTklUSUFMSVpFRF9WQUxVRTsgfTtcblxuXG52YXIgUFJFRklYX1JFR0VYUCA9IC9eKCg/Onh8ZGF0YSlbOlxcLV9dKS9pO1xudmFyIFNQRUNJQUxfQ0hBUlNfUkVHRVhQID0gL1s6XFwtX10rKC4pL2c7XG5cbi8qKlxuICogQ29udmVydHMgYWxsIGFjY2VwdGVkIGRpcmVjdGl2ZXMgZm9ybWF0IGludG8gcHJvcGVyIGRpcmVjdGl2ZSBuYW1lLlxuICogQHBhcmFtIG5hbWUgTmFtZSB0byBub3JtYWxpemVcbiAqL1xuZnVuY3Rpb24gZGlyZWN0aXZlTm9ybWFsaXplKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWVcbiAgICAucmVwbGFjZShQUkVGSVhfUkVHRVhQLCAnJylcbiAgICAucmVwbGFjZShTUEVDSUFMX0NIQVJTX1JFR0VYUCwgZm5DYW1lbENhc2VSZXBsYWNlKTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgdHlwZVxuICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc2hhcmVkIG9iamVjdCBiZXR3ZWVuIGRpcmVjdGl2ZSBjb21waWxlIC8gbGlua2luZyBmdW5jdGlvbnMgd2hpY2ggY29udGFpbnMgbm9ybWFsaXplZCBET01cbiAqIGVsZW1lbnQgYXR0cmlidXRlcy4gVGhlIHZhbHVlcyByZWZsZWN0IGN1cnJlbnQgYmluZGluZyBzdGF0ZSBge3sgfX1gLiBUaGUgbm9ybWFsaXphdGlvbiBpc1xuICogbmVlZGVkIHNpbmNlIGFsbCBvZiB0aGVzZSBhcmUgdHJlYXRlZCBhcyBlcXVpdmFsZW50IGluIEFuZ3VsYXI6XG4gKlxuICogYGBgXG4gKiAgICA8c3BhbiBuZzpiaW5kPVwiYVwiIG5nLWJpbmQ9XCJhXCIgZGF0YS1uZy1iaW5kPVwiYVwiIHgtbmctYmluZD1cImFcIj5cbiAqIGBgYFxuICovXG5cbi8qKlxuICogQG5nZG9jIHByb3BlcnR5XG4gKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkYXR0clxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBtYXAgb2YgRE9NIGVsZW1lbnQgYXR0cmlidXRlIG5hbWVzIHRvIHRoZSBub3JtYWxpemVkIG5hbWUuIFRoaXMgaXNcbiAqIG5lZWRlZCB0byBkbyByZXZlcnNlIGxvb2t1cCBmcm9tIG5vcm1hbGl6ZWQgbmFtZSBiYWNrIHRvIGFjdHVhbCBuYW1lLlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkc2V0XG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IERPTSBlbGVtZW50IGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9ybWFsaXplZCBlbGVtZW50IGF0dHJpYnV0ZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBtb2RpZnkuIFRoZSBuYW1lIGlzXG4gKiAgICAgICAgICByZXZlcnNlLXRyYW5zbGF0ZWQgdXNpbmcgdGhlIHtAbGluayBuZy4kY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkYXR0ciAkYXR0cn1cbiAqICAgICAgICAgIHByb3BlcnR5IHRvIHRoZSBvcmlnaW5hbCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFZhbHVlIHRvIHNldCB0aGUgYXR0cmlidXRlIHRvLiBUaGUgdmFsdWUgY2FuIGJlIGFuIGludGVycG9sYXRlZCBzdHJpbmcuXG4gKi9cblxuXG5cbi8qKlxuICogQ2xvc3VyZSBjb21waWxlciB0eXBlIGluZm9ybWF0aW9uXG4gKi9cblxuZnVuY3Rpb24gbm9kZXNldExpbmtpbmdGbihcbiAgLyogYW5ndWxhci5TY29wZSAqLyBzY29wZSxcbiAgLyogTm9kZUxpc3QgKi8gbm9kZUxpc3QsXG4gIC8qIEVsZW1lbnQgKi8gcm9vdEVsZW1lbnQsXG4gIC8qIGZ1bmN0aW9uKEZ1bmN0aW9uKSAqLyBib3VuZFRyYW5zY2x1ZGVGblxuKSB7fVxuXG5mdW5jdGlvbiBkaXJlY3RpdmVMaW5raW5nRm4oXG4gIC8qIG5vZGVzZXRMaW5raW5nRm4gKi8gbm9kZXNldExpbmtpbmdGbixcbiAgLyogYW5ndWxhci5TY29wZSAqLyBzY29wZSxcbiAgLyogTm9kZSAqLyBub2RlLFxuICAvKiBFbGVtZW50ICovIHJvb3RFbGVtZW50LFxuICAvKiBmdW5jdGlvbihGdW5jdGlvbikgKi8gYm91bmRUcmFuc2NsdWRlRm5cbikge31cblxuZnVuY3Rpb24gdG9rZW5EaWZmZXJlbmNlKHN0cjEsIHN0cjIpIHtcbiAgdmFyIHZhbHVlcyA9ICcnLFxuICAgICAgdG9rZW5zMSA9IHN0cjEuc3BsaXQoL1xccysvKSxcbiAgICAgIHRva2VuczIgPSBzdHIyLnNwbGl0KC9cXHMrLyk7XG5cbiAgb3V0ZXI6XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zMS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b2tlbiA9IHRva2VuczFbaV07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB0b2tlbnMyLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAodG9rZW4gPT09IHRva2VuczJbal0pIGNvbnRpbnVlIG91dGVyO1xuICAgIH1cbiAgICB2YWx1ZXMgKz0gKHZhbHVlcy5sZW5ndGggPiAwID8gJyAnIDogJycpICsgdG9rZW47XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ29tbWVudHMoanFOb2Rlcykge1xuICBqcU5vZGVzID0ganFMaXRlKGpxTm9kZXMpO1xuICB2YXIgaSA9IGpxTm9kZXMubGVuZ3RoO1xuXG4gIGlmIChpIDw9IDEpIHtcbiAgICByZXR1cm4ganFOb2RlcztcbiAgfVxuXG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgbm9kZSA9IGpxTm9kZXNbaV07XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRV9DT01NRU5UIHx8XG4gICAgICAgKG5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRV9URVhUICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PT0gJycpKSB7XG4gICAgICAgICBzcGxpY2UuY2FsbChqcU5vZGVzLCBpLCAxKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGpxTm9kZXM7XG59XG5cbnZhciAkY29udHJvbGxlck1pbkVyciA9IG1pbkVycignJGNvbnRyb2xsZXInKTtcblxuXG52YXIgQ05UUkxfUkVHID0gL14oXFxTKykoXFxzK2FzXFxzKyhbXFx3JF0rKSk/JC87XG5mdW5jdGlvbiBpZGVudGlmaWVyRm9yQ29udHJvbGxlcihjb250cm9sbGVyLCBpZGVudCkge1xuICBpZiAoaWRlbnQgJiYgaXNTdHJpbmcoaWRlbnQpKSByZXR1cm4gaWRlbnQ7XG4gIGlmIChpc1N0cmluZyhjb250cm9sbGVyKSkge1xuICAgIHZhciBtYXRjaCA9IENOVFJMX1JFRy5leGVjKGNvbnRyb2xsZXIpO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzNdO1xuICB9XG59XG5cblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRjb250cm9sbGVyUHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUge0BsaW5rIG5nLiRjb250cm9sbGVyICRjb250cm9sbGVyIHNlcnZpY2V9IGlzIHVzZWQgYnkgQW5ndWxhciB0byBjcmVhdGUgbmV3XG4gKiBjb250cm9sbGVycy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVyIGFsbG93cyBjb250cm9sbGVyIHJlZ2lzdHJhdGlvbiB2aWEgdGhlXG4gKiB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciNyZWdpc3RlciByZWdpc3Rlcn0gbWV0aG9kLlxuICovXG5mdW5jdGlvbiAkQ29udHJvbGxlclByb3ZpZGVyKCkge1xuICB2YXIgY29udHJvbGxlcnMgPSB7fSxcbiAgICAgIGdsb2JhbHMgPSBmYWxzZTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY29udHJvbGxlclByb3ZpZGVyI2hhc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDb250cm9sbGVyIG5hbWUgdG8gY2hlY2suXG4gICAqL1xuICB0aGlzLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gY29udHJvbGxlcnMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGNvbnRyb2xsZXJQcm92aWRlciNyZWdpc3RlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgQ29udHJvbGxlciBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGNvbnRyb2xsZXJzIHdoZXJlIHRoZSBrZXlzIGFyZVxuICAgKiAgICB0aGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IGNvbnN0cnVjdG9yIENvbnRyb2xsZXIgY29uc3RydWN0b3IgZm4gKG9wdGlvbmFsbHkgZGVjb3JhdGVkIHdpdGggRElcbiAgICogICAgYW5ub3RhdGlvbnMgaW4gdGhlIGFycmF5IG5vdGF0aW9uKS5cbiAgICovXG4gIHRoaXMucmVnaXN0ZXIgPSBmdW5jdGlvbihuYW1lLCBjb25zdHJ1Y3Rvcikge1xuICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdjb250cm9sbGVyJyk7XG4gICAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICBleHRlbmQoY29udHJvbGxlcnMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sbGVyc1tuYW1lXSA9IGNvbnN0cnVjdG9yO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY29udHJvbGxlclByb3ZpZGVyI2FsbG93R2xvYmFsc1xuICAgKiBAZGVzY3JpcHRpb24gSWYgY2FsbGVkLCBhbGxvd3MgYCRjb250cm9sbGVyYCB0byBmaW5kIGNvbnRyb2xsZXIgY29uc3RydWN0b3JzIG9uIGB3aW5kb3dgXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIHNpbmNlVmVyc2lvbj1cInYxLjMuMFwiXG4gICAqIHJlbW92ZVZlcnNpb249XCJ2MS43LjBcIlxuICAgKiBUaGlzIG1ldGhvZCBvZiBmaW5kaW5nIGNvbnRyb2xsZXJzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuXG4gICAqL1xuICB0aGlzLmFsbG93R2xvYmFscyA9IGZ1bmN0aW9uKCkge1xuICAgIGdsb2JhbHMgPSB0cnVlO1xuICB9O1xuXG5cbiAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCAnJHdpbmRvdycsIGZ1bmN0aW9uKCRpbmplY3RvciwgJHdpbmRvdykge1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIHNlcnZpY2VcbiAgICAgKiBAbmFtZSAkY29udHJvbGxlclxuICAgICAqIEByZXF1aXJlcyAkaW5qZWN0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBjb25zdHJ1Y3RvciBJZiBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uIHRoZW4gaXQncyBjb25zaWRlcmVkIHRvIGJlIHRoZVxuICAgICAqICAgIGNvbnRyb2xsZXIgY29uc3RydWN0b3IgZnVuY3Rpb24uIE90aGVyd2lzZSBpdCdzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdHJpbmcgd2hpY2ggaXMgdXNlZFxuICAgICAqICAgIHRvIHJldHJpZXZlIHRoZSBjb250cm9sbGVyIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAgICpcbiAgICAgKiAgICAqIGNoZWNrIGlmIGEgY29udHJvbGxlciB3aXRoIGdpdmVuIG5hbWUgaXMgcmVnaXN0ZXJlZCB2aWEgYCRjb250cm9sbGVyUHJvdmlkZXJgXG4gICAgICogICAgKiBjaGVjayBpZiBldmFsdWF0aW5nIHRoZSBzdHJpbmcgb24gdGhlIGN1cnJlbnQgc2NvcGUgcmV0dXJucyBhIGNvbnN0cnVjdG9yXG4gICAgICogICAgKiBpZiAkY29udHJvbGxlclByb3ZpZGVyI2FsbG93R2xvYmFscywgY2hlY2sgYHdpbmRvd1tjb25zdHJ1Y3Rvcl1gIG9uIHRoZSBnbG9iYWxcbiAgICAgKiAgICAgIGB3aW5kb3dgIG9iamVjdCAoZGVwcmVjYXRlZCwgbm90IHJlY29tbWVuZGVkKVxuICAgICAqXG4gICAgICogICAgVGhlIHN0cmluZyBjYW4gdXNlIHRoZSBgY29udHJvbGxlciBhcyBwcm9wZXJ0eWAgc3ludGF4LCB3aGVyZSB0aGUgY29udHJvbGxlciBpbnN0YW5jZSBpcyBwdWJsaXNoZWRcbiAgICAgKiAgICBhcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9uIHRoZSBgc2NvcGVgOyB0aGUgYHNjb3BlYCBtdXN0IGJlIGluamVjdGVkIGludG8gYGxvY2Fsc2AgcGFyYW0gZm9yIHRoaXNcbiAgICAgKiAgICB0byB3b3JrIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsb2NhbHMgSW5qZWN0aW9uIGxvY2FscyBmb3IgQ29udHJvbGxlci5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEluc3RhbmNlIG9mIGdpdmVuIGNvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBgJGNvbnRyb2xsZXJgIHNlcnZpY2UgaXMgcmVzcG9uc2libGUgZm9yIGluc3RhbnRpYXRpbmcgY29udHJvbGxlcnMuXG4gICAgICpcbiAgICAgKiBJdCdzIGp1c3QgYSBzaW1wbGUgY2FsbCB0byB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfSwgYnV0IGV4dHJhY3RlZCBpbnRvXG4gICAgICogYSBzZXJ2aWNlLCBzbyB0aGF0IG9uZSBjYW4gb3ZlcnJpZGUgdGhpcyBzZXJ2aWNlIHdpdGggW0JDIHZlcnNpb25dKGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzE2NDk3ODgpLlxuICAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiAkY29udHJvbGxlcihleHByZXNzaW9uLCBsb2NhbHMsIGxhdGVyLCBpZGVudCkge1xuICAgICAgLy8gUFJJVkFURSBBUEk6XG4gICAgICAvLyAgIHBhcmFtIGBsYXRlcmAgLS0tIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyJ3MgY29uc3RydWN0b3IgaXMgaW52b2tlZCBhdCBhIGxhdGVyIHRpbWUuXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIElmIHRydWUsICRjb250cm9sbGVyIHdpbGwgYWxsb2NhdGUgdGhlIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0XG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZSBjaGFpbiwgYnV0IHdpbGwgbm90IGludm9rZSB0aGUgY29udHJvbGxlciB1bnRpbCBhIHJldHVybmVkXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIGlzIGludm9rZWQuXG4gICAgICAvLyAgIHBhcmFtIGBpZGVudGAgLS0tIEFuIG9wdGlvbmFsIGxhYmVsIHdoaWNoIG92ZXJyaWRlcyB0aGUgbGFiZWwgcGFyc2VkIGZyb20gdGhlIGNvbnRyb2xsZXJcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgaWYgYW55LlxuICAgICAgdmFyIGluc3RhbmNlLCBtYXRjaCwgY29uc3RydWN0b3IsIGlkZW50aWZpZXI7XG4gICAgICBsYXRlciA9IGxhdGVyID09PSB0cnVlO1xuICAgICAgaWYgKGlkZW50ICYmIGlzU3RyaW5nKGlkZW50KSkge1xuICAgICAgICBpZGVudGlmaWVyID0gaWRlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1N0cmluZyhleHByZXNzaW9uKSkge1xuICAgICAgICBtYXRjaCA9IGV4cHJlc3Npb24ubWF0Y2goQ05UUkxfUkVHKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHRocm93ICRjb250cm9sbGVyTWluRXJyKCdjdHJsZm10JyxcbiAgICAgICAgICAgICdCYWRseSBmb3JtZWQgY29udHJvbGxlciBzdHJpbmcgXFwnezB9XFwnLiAnICtcbiAgICAgICAgICAgICdNdXN0IG1hdGNoIGBfX25hbWVfXyBhcyBfX2lkX19gIG9yIGBfX25hbWVfX2AuJywgZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3IgPSBtYXRjaFsxXTtcbiAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIgfHwgbWF0Y2hbM107XG4gICAgICAgIGV4cHJlc3Npb24gPSBjb250cm9sbGVycy5oYXNPd25Qcm9wZXJ0eShjb25zdHJ1Y3RvcilcbiAgICAgICAgICAgID8gY29udHJvbGxlcnNbY29uc3RydWN0b3JdXG4gICAgICAgICAgICA6IGdldHRlcihsb2NhbHMuJHNjb3BlLCBjb25zdHJ1Y3RvciwgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAoZ2xvYmFscyA/IGdldHRlcigkd2luZG93LCBjb25zdHJ1Y3RvciwgdHJ1ZSkgOiB1bmRlZmluZWQpO1xuXG4gICAgICAgIGlmICghZXhwcmVzc2lvbikge1xuICAgICAgICAgIHRocm93ICRjb250cm9sbGVyTWluRXJyKCdjdHJscmVnJyxcbiAgICAgICAgICAgICdUaGUgY29udHJvbGxlciB3aXRoIHRoZSBuYW1lIFxcJ3swfVxcJyBpcyBub3QgcmVnaXN0ZXJlZC4nLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnRBcmdGbihleHByZXNzaW9uLCBjb25zdHJ1Y3RvciwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXRlcikge1xuICAgICAgICAvLyBJbnN0YW50aWF0ZSBjb250cm9sbGVyIGxhdGVyOlxuICAgICAgICAvLyBUaGlzIG1hY2hpbmVyeSBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHRoZVxuICAgICAgICAvLyBjb250cm9sbGVyJ3MgY29uc3RydWN0b3IgaXRzZWxmLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGFsbG93cyBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb250cm9sbGVyIGJlZm9yZSB0aGUgY29uc3RydWN0b3IgaXNcbiAgICAgICAgLy8gaW52b2tlZC4gUHJpbWFyaWx5LCB0aGlzIGlzIHVzZWQgZm9yIGlzb2xhdGUgc2NvcGUgYmluZGluZ3MgaW4gJGNvbXBpbGUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgZmVhdHVyZSBpcyBub3QgaW50ZW5kZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMsIGFuZCBpcyB0aHVzIG5vdCBkb2N1bWVudGVkXG4gICAgICAgIC8vIHB1YmxpY2x5LlxuICAgICAgICAvLyBPYmplY3QgY3JlYXRpb246IGh0dHA6Ly9qc3BlcmYuY29tL2NyZWF0ZS1jb25zdHJ1Y3Rvci8yXG4gICAgICAgIHZhciBjb250cm9sbGVyUHJvdG90eXBlID0gKGlzQXJyYXkoZXhwcmVzc2lvbikgP1xuICAgICAgICAgIGV4cHJlc3Npb25bZXhwcmVzc2lvbi5sZW5ndGggLSAxXSA6IGV4cHJlc3Npb24pLnByb3RvdHlwZTtcbiAgICAgICAgaW5zdGFuY2UgPSBPYmplY3QuY3JlYXRlKGNvbnRyb2xsZXJQcm90b3R5cGUgfHwgbnVsbCk7XG5cbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICBhZGRJZGVudGlmaWVyKGxvY2FscywgaWRlbnRpZmllciwgaW5zdGFuY2UsIGNvbnN0cnVjdG9yIHx8IGV4cHJlc3Npb24ubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRjb250cm9sbGVySW5pdCgpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gJGluamVjdG9yLmludm9rZShleHByZXNzaW9uLCBpbnN0YW5jZSwgbG9jYWxzLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gaW5zdGFuY2UgJiYgKGlzT2JqZWN0KHJlc3VsdCkgfHwgaXNGdW5jdGlvbihyZXN1bHQpKSkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAvLyBJZiByZXN1bHQgY2hhbmdlZCwgcmUtYXNzaWduIGNvbnRyb2xsZXJBcyB2YWx1ZSB0byBzY29wZS5cbiAgICAgICAgICAgICAgYWRkSWRlbnRpZmllcihsb2NhbHMsIGlkZW50aWZpZXIsIGluc3RhbmNlLCBjb25zdHJ1Y3RvciB8fCBleHByZXNzaW9uLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllclxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UgPSAkaW5qZWN0b3IuaW5zdGFudGlhdGUoZXhwcmVzc2lvbiwgbG9jYWxzLCBjb25zdHJ1Y3Rvcik7XG5cbiAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgIGFkZElkZW50aWZpZXIobG9jYWxzLCBpZGVudGlmaWVyLCBpbnN0YW5jZSwgY29uc3RydWN0b3IgfHwgZXhwcmVzc2lvbi5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBhZGRJZGVudGlmaWVyKGxvY2FscywgaWRlbnRpZmllciwgaW5zdGFuY2UsIG5hbWUpIHtcbiAgICAgIGlmICghKGxvY2FscyAmJiBpc09iamVjdChsb2NhbHMuJHNjb3BlKSkpIHtcbiAgICAgICAgdGhyb3cgbWluRXJyKCckY29udHJvbGxlcicpKCdub3NjcCcsXG4gICAgICAgICAgJ0Nhbm5vdCBleHBvcnQgY29udHJvbGxlciBcXCd7MH1cXCcgYXMgXFwnezF9XFwnISBObyAkc2NvcGUgb2JqZWN0IHByb3ZpZGVkIHZpYSBgbG9jYWxzYC4nLFxuICAgICAgICAgIG5hbWUsIGlkZW50aWZpZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2NhbHMuJHNjb3BlW2lkZW50aWZpZXJdID0gaW5zdGFuY2U7XG4gICAgfVxuICB9XTtcbn1cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJGRvY3VtZW50XG4gKiBAcmVxdWlyZXMgJHdpbmRvd1xuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEge0BsaW5rIGFuZ3VsYXIuZWxlbWVudCBqUXVlcnkgb3IganFMaXRlfSB3cmFwcGVyIGZvciB0aGUgYnJvd3NlcidzIGB3aW5kb3cuZG9jdW1lbnRgIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwiZG9jdW1lbnRFeGFtcGxlXCIgbmFtZT1cImRvY3VtZW50XCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxwPiRkb2N1bWVudCB0aXRsZTogPGIgbmctYmluZD1cInRpdGxlXCI+PC9iPjwvcD5cbiAgICAgICAgIDxwPndpbmRvdy5kb2N1bWVudCB0aXRsZTogPGIgbmctYmluZD1cIndpbmRvd1RpdGxlXCI+PC9iPjwvcD5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICAgYW5ndWxhci5tb2R1bGUoJ2RvY3VtZW50RXhhbXBsZScsIFtdKVxuICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGRvY3VtZW50JywgZnVuY3Rpb24oJHNjb3BlLCAkZG9jdW1lbnQpIHtcbiAgICAgICAgICAgJHNjb3BlLnRpdGxlID0gJGRvY3VtZW50WzBdLnRpdGxlO1xuICAgICAgICAgICAkc2NvcGUud2luZG93VGl0bGUgPSBhbmd1bGFyLmVsZW1lbnQod2luZG93LmRvY3VtZW50KVswXS50aXRsZTtcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiAkRG9jdW1lbnRQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgZnVuY3Rpb24od2luZG93KSB7XG4gICAgcmV0dXJuIGpxTGl0ZSh3aW5kb3cuZG9jdW1lbnQpO1xuICB9XTtcbn1cblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdGhpc1xuICogTGlzdGVucyBmb3IgZG9jdW1lbnQgdmlzaWJpbGl0eSBjaGFuZ2UgYW5kIG1ha2VzIHRoZSBjdXJyZW50IHN0YXR1cyBhY2Nlc3NpYmxlLlxuICovXG5mdW5jdGlvbiAkJElzRG9jdW1lbnRIaWRkZW5Qcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckZG9jdW1lbnQnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRkb2N1bWVudCwgJHJvb3RTY29wZSkge1xuICAgIHZhciBkb2MgPSAkZG9jdW1lbnRbMF07XG4gICAgdmFyIGhpZGRlbiA9IGRvYyAmJiBkb2MuaGlkZGVuO1xuXG4gICAgJGRvY3VtZW50Lm9uKCd2aXNpYmlsaXR5Y2hhbmdlJywgY2hhbmdlTGlzdGVuZXIpO1xuXG4gICAgJHJvb3RTY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAkZG9jdW1lbnQub2ZmKCd2aXNpYmlsaXR5Y2hhbmdlJywgY2hhbmdlTGlzdGVuZXIpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gY2hhbmdlTGlzdGVuZXIoKSB7XG4gICAgICBoaWRkZW4gPSBkb2MuaGlkZGVuO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfTtcbiAgfV07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRleGNlcHRpb25IYW5kbGVyXG4gKiBAcmVxdWlyZXMgbmcuJGxvZ1xuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFueSB1bmNhdWdodCBleGNlcHRpb24gaW4gYW5ndWxhciBleHByZXNzaW9ucyBpcyBkZWxlZ2F0ZWQgdG8gdGhpcyBzZXJ2aWNlLlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGRlbGVnYXRlcyB0byBgJGxvZy5lcnJvcmAgd2hpY2ggbG9ncyBpdCBpbnRvXG4gKiB0aGUgYnJvd3NlciBjb25zb2xlLlxuICpcbiAqIEluIHVuaXQgdGVzdHMsIGlmIGBhbmd1bGFyLW1vY2tzLmpzYCBpcyBsb2FkZWQsIHRoaXMgc2VydmljZSBpcyBvdmVycmlkZGVuIGJ5XG4gKiB7QGxpbmsgbmdNb2NrLiRleGNlcHRpb25IYW5kbGVyIG1vY2sgJGV4Y2VwdGlvbkhhbmRsZXJ9IHdoaWNoIGFpZHMgaW4gdGVzdGluZy5cbiAqXG4gKiAjIyBFeGFtcGxlOlxuICpcbiAqIFRoZSBleGFtcGxlIGJlbG93IHdpbGwgb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGAkZXhjZXB0aW9uSGFuZGxlcmAgaW4gb3JkZXIgdG8gKGEpIGxvZyB1bmNhdWdodFxuICogZXJyb3JzIHRvIHRoZSBiYWNrZW5kIGZvciBsYXRlciBpbnNwZWN0aW9uIGJ5IHRoZSBkZXZlbG9wZXJzIGFuZCAoYikgdG8gdXNlIGAkbG9nLndhcm4oKWAgaW5zdGVhZFxuICogb2YgYCRsb2cuZXJyb3IoKWAuXG4gKlxuICogYGBganNcbiAqICAgYW5ndWxhci5cbiAqICAgICBtb2R1bGUoJ2V4Y2VwdGlvbk92ZXJ3cml0ZScsIFtdKS5cbiAqICAgICBmYWN0b3J5KCckZXhjZXB0aW9uSGFuZGxlcicsIFsnJGxvZycsICdsb2dFcnJvcnNUb0JhY2tlbmQnLCBmdW5jdGlvbigkbG9nLCBsb2dFcnJvcnNUb0JhY2tlbmQpIHtcbiAqICAgICAgIHJldHVybiBmdW5jdGlvbiBteUV4Y2VwdGlvbkhhbmRsZXIoZXhjZXB0aW9uLCBjYXVzZSkge1xuICogICAgICAgICBsb2dFcnJvcnNUb0JhY2tlbmQoZXhjZXB0aW9uLCBjYXVzZSk7XG4gKiAgICAgICAgICRsb2cud2FybihleGNlcHRpb24sIGNhdXNlKTtcbiAqICAgICAgIH07XG4gKiAgICAgfV0pO1xuICogYGBgXG4gKlxuICogPGhyIC8+XG4gKiBOb3RlLCB0aGF0IGNvZGUgZXhlY3V0ZWQgaW4gZXZlbnQtbGlzdGVuZXJzIChldmVuIHRob3NlIHJlZ2lzdGVyZWQgdXNpbmcganFMaXRlJ3MgYG9uYC9gYmluZGBcbiAqIG1ldGhvZHMpIGRvZXMgbm90IGRlbGVnYXRlIGV4Y2VwdGlvbnMgdG8gdGhlIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn1cbiAqICh1bmxlc3MgZXhlY3V0ZWQgZHVyaW5nIGEgZGlnZXN0KS5cbiAqXG4gKiBJZiB5b3Ugd2lzaCwgeW91IGNhbiBtYW51YWxseSBkZWxlZ2F0ZSBleGNlcHRpb25zLCBlLmcuXG4gKiBgdHJ5IHsgLi4uIH0gY2F0Y2goZSkgeyAkZXhjZXB0aW9uSGFuZGxlcihlKTsgfWBcbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBleGNlcHRpb24gRXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZz19IGNhdXNlIE9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZXh0IGluIHdoaWNoXG4gKiAgICAgICB0aGUgZXJyb3Igd2FzIHRocm93bi5cbiAqXG4gKi9cbmZ1bmN0aW9uICRFeGNlcHRpb25IYW5kbGVyUHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IFsnJGxvZycsIGZ1bmN0aW9uKCRsb2cpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZXhjZXB0aW9uLCBjYXVzZSkge1xuICAgICAgJGxvZy5lcnJvci5hcHBseSgkbG9nLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1dO1xufVxuXG52YXIgJCRGb3JjZVJlZmxvd1Byb3ZpZGVyID0gLyoqIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuICB0aGlzLiRnZXQgPSBbJyRkb2N1bWVudCcsIGZ1bmN0aW9uKCRkb2N1bWVudCkge1xuICAgIHJldHVybiBmdW5jdGlvbihkb21Ob2RlKSB7XG4gICAgICAvL3RoZSBsaW5lIGJlbG93IHdpbGwgZm9yY2UgdGhlIGJyb3dzZXIgdG8gcGVyZm9ybSBhIHJlcGFpbnQgc29cbiAgICAgIC8vdGhhdCBhbGwgdGhlIGFuaW1hdGVkIGVsZW1lbnRzIHdpdGhpbiB0aGUgYW5pbWF0aW9uIGZyYW1lIHdpbGxcbiAgICAgIC8vYmUgcHJvcGVybHkgdXBkYXRlZCBhbmQgZHJhd24gb24gc2NyZWVuLiBUaGlzIGlzIHJlcXVpcmVkIHRvXG4gICAgICAvL2Vuc3VyZSB0aGF0IHRoZSBwcmVwYXJhdGlvbiBhbmltYXRpb24gaXMgcHJvcGVybHkgZmx1c2hlZCBzbyB0aGF0XG4gICAgICAvL3RoZSBhY3RpdmUgc3RhdGUgcGlja3MgdXAgZnJvbSB0aGVyZS4gRE8gTk9UIFJFTU9WRSBUSElTIExJTkUuXG4gICAgICAvL0RPIE5PVCBPUFRJTUlaRSBUSElTIExJTkUuIFRIRSBNSU5JRklFUiBXSUxMIFJFTU9WRSBJVCBPVEhFUldJU0UgV0hJQ0hcbiAgICAgIC8vV0lMTCBSRVNVTFQgSU4gQU4gVU5QUkVESUNUQUJMRSBCVUcgVEhBVCBJUyBWRVJZIEhBUkQgVE8gVFJBQ0sgRE9XTiBBTkRcbiAgICAgIC8vV0lMTCBUQUtFIFlFQVJTIEFXQVkgRlJPTSBZT1VSIExJRkUuXG4gICAgICBpZiAoZG9tTm9kZSkge1xuICAgICAgICBpZiAoIWRvbU5vZGUubm9kZVR5cGUgJiYgZG9tTm9kZSBpbnN0YW5jZW9mIGpxTGl0ZSkge1xuICAgICAgICAgIGRvbU5vZGUgPSBkb21Ob2RlWzBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb21Ob2RlID0gJGRvY3VtZW50WzBdLmJvZHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9tTm9kZS5vZmZzZXRXaWR0aCArIDE7XG4gICAgfTtcbiAgfV07XG59O1xuXG52YXIgQVBQTElDQVRJT05fSlNPTiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbnZhciBDT05URU5UX1RZUEVfQVBQTElDQVRJT05fSlNPTiA9IHsnQ29udGVudC1UeXBlJzogQVBQTElDQVRJT05fSlNPTiArICc7Y2hhcnNldD11dGYtOCd9O1xudmFyIEpTT05fU1RBUlQgPSAvXlxcW3xeXFx7KD8hXFx7KS87XG52YXIgSlNPTl9FTkRTID0ge1xuICAnWyc6IC9dJC8sXG4gICd7JzogL30kL1xufTtcbnZhciBKU09OX1BST1RFQ1RJT05fUFJFRklYID0gL15cXCldXFx9Jyw/XFxuLztcbnZhciAkaHR0cE1pbkVyciA9IG1pbkVycignJGh0dHAnKTtcblxuZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodikge1xuICBpZiAoaXNPYmplY3QodikpIHtcbiAgICByZXR1cm4gaXNEYXRlKHYpID8gdi50b0lTT1N0cmluZygpIDogdG9Kc29uKHYpO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG5cbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJEh0dHBQYXJhbVNlcmlhbGl6ZXJQcm92aWRlcigpIHtcbiAgLyoqXG4gICAqIEBuZ2RvYyBzZXJ2aWNlXG4gICAqIEBuYW1lICRodHRwUGFyYW1TZXJpYWxpemVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBEZWZhdWx0IHtAbGluayAkaHR0cCBgJGh0dHBgfSBwYXJhbXMgc2VyaWFsaXplciB0aGF0IGNvbnZlcnRzIG9iamVjdHMgdG8gc3RyaW5nc1xuICAgKiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBydWxlczpcbiAgICpcbiAgICogKiBgeydmb28nOiAnYmFyJ31gIHJlc3VsdHMgaW4gYGZvbz1iYXJgXG4gICAqICogYHsnZm9vJzogRGF0ZS5ub3coKX1gIHJlc3VsdHMgaW4gYGZvbz0yMDE1LTA0LTAxVDA5JTNBNTAlM0E0OS4yNjJaYCAoYHRvSVNPU3RyaW5nKClgIGFuZCBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QpXG4gICAqICogYHsnZm9vJzogWydiYXInLCAnYmF6J119YCByZXN1bHRzIGluIGBmb289YmFyJmZvbz1iYXpgIChyZXBlYXRlZCBrZXkgZm9yIGVhY2ggYXJyYXkgZWxlbWVudClcbiAgICogKiBgeydmb28nOiB7J2Jhcic6J2Jheid9fWAgcmVzdWx0cyBpbiBgZm9vPSU3QiUyMmJhciUyMiUzQSUyMmJheiUyMiU3RGAgKHN0cmluZ2lmaWVkIGFuZCBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdClcbiAgICpcbiAgICogTm90ZSB0aGF0IHNlcmlhbGl6ZXIgd2lsbCBzb3J0IHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgYWxwaGFiZXRpY2FsbHkuXG4gICAqICovXG5cbiAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5nUGFyYW1TZXJpYWxpemVyKHBhcmFtcykge1xuICAgICAgaWYgKCFwYXJhbXMpIHJldHVybiAnJztcbiAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgZm9yRWFjaFNvcnRlZChwYXJhbXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZVVyaVF1ZXJ5KGtleSkgICsgJz0nICsgZW5jb2RlVXJpUXVlcnkoc2VyaWFsaXplVmFsdWUodikpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZVVyaVF1ZXJ5KGtleSkgKyAnPScgKyBlbmNvZGVVcmlRdWVyeShzZXJpYWxpemVWYWx1ZSh2YWx1ZSkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7XG4gICAgfTtcbiAgfTtcbn1cblxuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkSHR0cFBhcmFtU2VyaWFsaXplckpRTGlrZVByb3ZpZGVyKCkge1xuICAvKipcbiAgICogQG5nZG9jIHNlcnZpY2VcbiAgICogQG5hbWUgJGh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2VcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEFsdGVybmF0aXZlIHtAbGluayAkaHR0cCBgJGh0dHBgfSBwYXJhbXMgc2VyaWFsaXplciB0aGF0IGZvbGxvd3NcbiAgICogalF1ZXJ5J3MgW2BwYXJhbSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2pxdWVyeS5wYXJhbS8pIG1ldGhvZCBsb2dpYy5cbiAgICogVGhlIHNlcmlhbGl6ZXIgd2lsbCBhbHNvIHNvcnQgdGhlIHBhcmFtcyBhbHBoYWJldGljYWxseS5cbiAgICpcbiAgICogVG8gdXNlIGl0IGZvciBzZXJpYWxpemluZyBgJGh0dHBgIHJlcXVlc3QgcGFyYW1ldGVycywgc2V0IGl0IGFzIHRoZSBgcGFyYW1TZXJpYWxpemVyYCBwcm9wZXJ0eTpcbiAgICpcbiAgICogYGBganNcbiAgICogJGh0dHAoe1xuICAgKiAgIHVybDogbXlVcmwsXG4gICAqICAgbWV0aG9kOiAnR0VUJyxcbiAgICogICBwYXJhbXM6IG15UGFyYW1zLFxuICAgKiAgIHBhcmFtU2VyaWFsaXplcjogJyRodHRwUGFyYW1TZXJpYWxpemVySlFMaWtlJ1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IGl0IGFzIHRoZSBkZWZhdWx0IGBwYXJhbVNlcmlhbGl6ZXJgIGluIHRoZVxuICAgKiB7QGxpbmsgJGh0dHBQcm92aWRlciNkZWZhdWx0cyBgJGh0dHBQcm92aWRlcmB9LlxuICAgKlxuICAgKiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gaW5qZWN0IHRoZSBzZXJpYWxpemVyIGFuZCB1c2UgaXQgZXhwbGljaXRseSwgZm9yIGV4YW1wbGUgdG8gc2VyaWFsaXplXG4gICAqIGZvcm0gZGF0YSBmb3Igc3VibWlzc2lvbjpcbiAgICpcbiAgICogYGBganNcbiAgICogLmNvbnRyb2xsZXIoZnVuY3Rpb24oJGh0dHAsICRodHRwUGFyYW1TZXJpYWxpemVySlFMaWtlKSB7XG4gICAqICAgLy8uLi5cbiAgICpcbiAgICogICAkaHR0cCh7XG4gICAqICAgICB1cmw6IG15VXJsLFxuICAgKiAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAqICAgICBkYXRhOiAkaHR0cFBhcmFtU2VyaWFsaXplckpRTGlrZShteURhdGEpLFxuICAgKiAgICAgaGVhZGVyczoge1xuICAgKiAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiAqL1xuICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24galF1ZXJ5TGlrZVBhcmFtU2VyaWFsaXplcihwYXJhbXMpIHtcbiAgICAgIGlmICghcGFyYW1zKSByZXR1cm4gJyc7XG4gICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgIHNlcmlhbGl6ZShwYXJhbXMsICcnLCB0cnVlKTtcbiAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7XG5cbiAgICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZSh0b1NlcmlhbGl6ZSwgcHJlZml4LCB0b3BMZXZlbCkge1xuICAgICAgICBpZiAodG9TZXJpYWxpemUgPT09IG51bGwgfHwgaXNVbmRlZmluZWQodG9TZXJpYWxpemUpKSByZXR1cm47XG4gICAgICAgIGlmIChpc0FycmF5KHRvU2VyaWFsaXplKSkge1xuICAgICAgICAgIGZvckVhY2godG9TZXJpYWxpemUsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgc2VyaWFsaXplKHZhbHVlLCBwcmVmaXggKyAnWycgKyAoaXNPYmplY3QodmFsdWUpID8gaW5kZXggOiAnJykgKyAnXScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHRvU2VyaWFsaXplKSAmJiAhaXNEYXRlKHRvU2VyaWFsaXplKSkge1xuICAgICAgICAgIGZvckVhY2hTb3J0ZWQodG9TZXJpYWxpemUsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZSh2YWx1ZSwgcHJlZml4ICtcbiAgICAgICAgICAgICAgICAodG9wTGV2ZWwgPyAnJyA6ICdbJykgK1xuICAgICAgICAgICAgICAgIGtleSArXG4gICAgICAgICAgICAgICAgKHRvcExldmVsID8gJycgOiAnXScpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZVVyaVF1ZXJ5KHByZWZpeCkgKyAnPScgKyBlbmNvZGVVcmlRdWVyeShzZXJpYWxpemVWYWx1ZSh0b1NlcmlhbGl6ZSkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRIdHRwUmVzcG9uc2VUcmFuc2Zvcm0oZGF0YSwgaGVhZGVycykge1xuICBpZiAoaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAvLyBTdHJpcCBqc29uIHZ1bG5lcmFiaWxpdHkgcHJvdGVjdGlvbiBwcmVmaXggYW5kIHRyaW0gd2hpdGVzcGFjZVxuICAgIHZhciB0ZW1wRGF0YSA9IGRhdGEucmVwbGFjZShKU09OX1BST1RFQ1RJT05fUFJFRklYLCAnJykudHJpbSgpO1xuXG4gICAgaWYgKHRlbXBEYXRhKSB7XG4gICAgICB2YXIgY29udGVudFR5cGUgPSBoZWFkZXJzKCdDb250ZW50LVR5cGUnKTtcbiAgICAgIGlmICgoY29udGVudFR5cGUgJiYgKGNvbnRlbnRUeXBlLmluZGV4T2YoQVBQTElDQVRJT05fSlNPTikgPT09IDApKSB8fCBpc0pzb25MaWtlKHRlbXBEYXRhKSkge1xuICAgICAgICBkYXRhID0gZnJvbUpzb24odGVtcERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBpc0pzb25MaWtlKHN0cikge1xuICAgIHZhciBqc29uU3RhcnQgPSBzdHIubWF0Y2goSlNPTl9TVEFSVCk7XG4gICAgcmV0dXJuIGpzb25TdGFydCAmJiBKU09OX0VORFNbanNvblN0YXJ0WzBdXS50ZXN0KHN0cik7XG59XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGtleSB2YWx1ZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVycyBSYXcgaGVhZGVycyBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge09iamVjdH0gUGFyc2VkIGhlYWRlcnMgYXMga2V5IHZhbHVlIG9iamVjdFxuICovXG5mdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0gY3JlYXRlTWFwKCksIGk7XG5cbiAgZnVuY3Rpb24gZmlsbEluUGFyc2VkKGtleSwgdmFsKSB7XG4gICAgaWYgKGtleSkge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNTdHJpbmcoaGVhZGVycykpIHtcbiAgICBmb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgICBmaWxsSW5QYXJzZWQobG93ZXJjYXNlKHRyaW0obGluZS5zdWJzdHIoMCwgaSkpKSwgdHJpbShsaW5lLnN1YnN0cihpICsgMSkpKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChoZWFkZXJzKSkge1xuICAgIGZvckVhY2goaGVhZGVycywgZnVuY3Rpb24oaGVhZGVyVmFsLCBoZWFkZXJLZXkpIHtcbiAgICAgIGZpbGxJblBhcnNlZChsb3dlcmNhc2UoaGVhZGVyS2V5KSwgdHJpbShoZWFkZXJWYWwpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZWQ7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFyc2VkIGhlYWRlcnMuXG4gKlxuICogSGVhZGVycyBhcmUgbGF6eSBwYXJzZWQgd2hlbiBmaXJzdCByZXF1ZXN0ZWQuXG4gKiBAc2VlIHBhcnNlSGVhZGVyc1xuICpcbiAqIEBwYXJhbSB7KHN0cmluZ3xPYmplY3QpfSBoZWFkZXJzIEhlYWRlcnMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8uXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nPSl9IFJldHVybnMgYSBnZXR0ZXIgZnVuY3Rpb24gd2hpY2ggaWYgY2FsbGVkIHdpdGg6XG4gKlxuICogICAtIGlmIGNhbGxlZCB3aXRoIGFuIGFyZ3VtZW50IHJldHVybnMgYSBzaW5nbGUgaGVhZGVyIHZhbHVlIG9yIG51bGxcbiAqICAgLSBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgaGVhZGVycy5cbiAqL1xuZnVuY3Rpb24gaGVhZGVyc0dldHRlcihoZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzT2JqO1xuXG4gIHJldHVybiBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCFoZWFkZXJzT2JqKSBoZWFkZXJzT2JqID0gIHBhcnNlSGVhZGVycyhoZWFkZXJzKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBoZWFkZXJzT2JqW2xvd2VyY2FzZShuYW1lKV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnNPYmo7XG4gIH07XG59XG5cblxuLyoqXG4gKiBDaGFpbiBhbGwgZ2l2ZW4gZnVuY3Rpb25zXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBib3RoIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBEYXRhIHRvIHRyYW5zZm9ybS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nPSl9IGhlYWRlcnMgSFRUUCBoZWFkZXJzIGdldHRlciBmbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXMgSFRUUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0geyhGdW5jdGlvbnxBcnJheS48RnVuY3Rpb24+KX0gZm5zIEZ1bmN0aW9uIG9yIGFuIGFycmF5IG9mIGZ1bmN0aW9ucy5cbiAqIEByZXR1cm5zIHsqfSBUcmFuc2Zvcm1lZCBkYXRhLlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGRhdGEsIGhlYWRlcnMsIHN0YXR1cywgZm5zKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZucykpIHtcbiAgICByZXR1cm4gZm5zKGRhdGEsIGhlYWRlcnMsIHN0YXR1cyk7XG4gIH1cblxuICBmb3JFYWNoKGZucywgZnVuY3Rpb24oZm4pIHtcbiAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycywgc3RhdHVzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cblxuZnVuY3Rpb24gaXNTdWNjZXNzKHN0YXR1cykge1xuICByZXR1cm4gMjAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPCAzMDA7XG59XG5cblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRodHRwUHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2UgYCRodHRwUHJvdmlkZXJgIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUge0BsaW5rIG5nLiRodHRwICRodHRwfSBzZXJ2aWNlLlxuICogKi9cbmZ1bmN0aW9uICRIdHRwUHJvdmlkZXIoKSB7XG4gIC8qKlxuICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICogQG5hbWUgJGh0dHBQcm92aWRlciNkZWZhdWx0c1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogT2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IHJlcXVlc3RzLlxuICAgKlxuICAgKiAtICoqYGRlZmF1bHRzLmNhY2hlYCoqIC0ge2Jvb2xlYW58T2JqZWN0fSAtIEEgYm9vbGVhbiB2YWx1ZSBvciBvYmplY3QgY3JlYXRlZCB3aXRoXG4gICAqIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5IGAkY2FjaGVGYWN0b3J5YH0gdG8gZW5hYmxlIG9yIGRpc2FibGUgY2FjaGluZyBvZiBIVFRQIHJlc3BvbnNlc1xuICAgKiBieSBkZWZhdWx0LiBTZWUge0BsaW5rICRodHRwI2NhY2hpbmcgJGh0dHAgQ2FjaGluZ30gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIC0gKipgZGVmYXVsdHMueHNyZkNvb2tpZU5hbWVgKiogLSB7c3RyaW5nfSAtIE5hbWUgb2YgY29va2llIGNvbnRhaW5pbmcgdGhlIFhTUkYgdG9rZW4uXG4gICAqIERlZmF1bHRzIHZhbHVlIGlzIGAnWFNSRi1UT0tFTidgLlxuICAgKlxuICAgKiAtICoqYGRlZmF1bHRzLnhzcmZIZWFkZXJOYW1lYCoqIC0ge3N0cmluZ30gLSBOYW1lIG9mIEhUVFAgaGVhZGVyIHRvIHBvcHVsYXRlIHdpdGggdGhlXG4gICAqIFhTUkYgdG9rZW4uIERlZmF1bHRzIHZhbHVlIGlzIGAnWC1YU1JGLVRPS0VOJ2AuXG4gICAqXG4gICAqIC0gKipgZGVmYXVsdHMuaGVhZGVyc2AqKiAtIHtPYmplY3R9IC0gRGVmYXVsdCBoZWFkZXJzIGZvciBhbGwgJGh0dHAgcmVxdWVzdHMuXG4gICAqIFJlZmVyIHRvIHtAbGluayBuZy4kaHR0cCNzZXR0aW5nLWh0dHAtaGVhZGVycyAkaHR0cH0gZm9yIGRvY3VtZW50YXRpb24gb25cbiAgICogc2V0dGluZyBkZWZhdWx0IGhlYWRlcnMuXG4gICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMuY29tbW9uYCoqXG4gICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMucG9zdGAqKlxuICAgKiAgICAgLSAqKmBkZWZhdWx0cy5oZWFkZXJzLnB1dGAqKlxuICAgKiAgICAgLSAqKmBkZWZhdWx0cy5oZWFkZXJzLnBhdGNoYCoqXG4gICAqXG4gICAqXG4gICAqIC0gKipgZGVmYXVsdHMucGFyYW1TZXJpYWxpemVyYCoqIC0gYHtzdHJpbmd8ZnVuY3Rpb24oT2JqZWN0PHN0cmluZyxzdHJpbmc+KTpzdHJpbmd9YCAtIEEgZnVuY3Rpb25cbiAgICogIHVzZWQgdG8gdGhlIHByZXBhcmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHJlcXVlc3QgcGFyYW1ldGVycyAoc3BlY2lmaWVkIGFzIGFuIG9iamVjdCkuXG4gICAqICBJZiBzcGVjaWZpZWQgYXMgc3RyaW5nLCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uXG4gICAqICBEZWZhdWx0cyB0byB7QGxpbmsgbmcuJGh0dHBQYXJhbVNlcmlhbGl6ZXIgJGh0dHBQYXJhbVNlcmlhbGl6ZXJ9LlxuICAgKlxuICAgKiAtICoqYGRlZmF1bHRzLmpzb25wQ2FsbGJhY2tQYXJhbWAqKiAtIGB7c3RyaW5nfWAgLSB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHRoYXQgcGFzc2VzIHRoZSBuYW1lIG9mIHRoZVxuICAgKiBjYWxsYmFjayBpbiBhIEpTT05QIHJlcXVlc3QuIFRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGV4cHJlc3Npb24gZ2VuZXJhdGVkIGJ5IHRoZVxuICAgKiB7QGxpbmsgJGpzb25wQ2FsbGJhY2tzfSBzZXJ2aWNlLiBEZWZhdWx0cyB0byBgJ2NhbGxiYWNrJ2AuXG4gICAqXG4gICAqKi9cbiAgdmFyIGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAvLyB0cmFuc2Zvcm0gaW5jb21pbmcgcmVzcG9uc2UgZGF0YVxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBbZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybV0sXG5cbiAgICAvLyB0cmFuc2Zvcm0gb3V0Z29pbmcgcmVxdWVzdCBkYXRhXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uKGQpIHtcbiAgICAgIHJldHVybiBpc09iamVjdChkKSAmJiAhaXNGaWxlKGQpICYmICFpc0Jsb2IoZCkgJiYgIWlzRm9ybURhdGEoZCkgPyB0b0pzb24oZCkgOiBkO1xuICAgIH1dLFxuXG4gICAgLy8gZGVmYXVsdCBoZWFkZXJzXG4gICAgaGVhZGVyczoge1xuICAgICAgY29tbW9uOiB7XG4gICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICAgICAgfSxcbiAgICAgIHBvc3Q6ICAgc2hhbGxvd0NvcHkoQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04pLFxuICAgICAgcHV0OiAgICBzaGFsbG93Q29weShDT05URU5UX1RZUEVfQVBQTElDQVRJT05fSlNPTiksXG4gICAgICBwYXRjaDogIHNoYWxsb3dDb3B5KENPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OKVxuICAgIH0sXG5cbiAgICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICAgIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICAgIHBhcmFtU2VyaWFsaXplcjogJyRodHRwUGFyYW1TZXJpYWxpemVyJyxcblxuICAgIGpzb25wQ2FsbGJhY2tQYXJhbTogJ2NhbGxiYWNrJ1xuICB9O1xuXG4gIHZhciB1c2VBcHBseUFzeW5jID0gZmFsc2U7XG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRodHRwUHJvdmlkZXIjdXNlQXBwbHlBc3luY1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ29uZmlndXJlICRodHRwIHNlcnZpY2UgdG8gY29tYmluZSBwcm9jZXNzaW5nIG9mIG11bHRpcGxlIGh0dHAgcmVzcG9uc2VzIHJlY2VpdmVkIGF0IGFyb3VuZFxuICAgKiB0aGUgc2FtZSB0aW1lIHZpYSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkYXBwbHlBc3luYyAkcm9vdFNjb3BlLiRhcHBseUFzeW5jfS4gVGhpcyBjYW4gcmVzdWx0IGluXG4gICAqIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciBiaWdnZXIgYXBwbGljYXRpb25zIHRoYXQgbWFrZSBtYW55IEhUVFAgcmVxdWVzdHNcbiAgICogY29uY3VycmVudGx5IChjb21tb24gZHVyaW5nIGFwcGxpY2F0aW9uIGJvb3RzdHJhcCkuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFuPX0gdmFsdWUgSWYgdHJ1ZSwgd2hlbiByZXF1ZXN0cyBhcmUgbG9hZGVkLCB0aGV5IHdpbGwgc2NoZWR1bGUgYSBkZWZlcnJlZFxuICAgKiAgICBcImFwcGx5XCIgb24gdGhlIG5leHQgdGljaywgZ2l2aW5nIHRpbWUgZm9yIHN1YnNlcXVlbnQgcmVxdWVzdHMgaW4gYSByb3VnaGx5IH4xMG1zIHdpbmRvd1xuICAgKiAgICB0byBsb2FkIGFuZCBzaGFyZSB0aGUgc2FtZSBkaWdlc3QgY3ljbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufE9iamVjdH0gSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlICRodHRwUHJvdmlkZXIgZm9yIGNoYWluaW5nLlxuICAgKiAgICBvdGhlcndpc2UsIHJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJlZCB2YWx1ZS5cbiAgICoqL1xuICB0aGlzLnVzZUFwcGx5QXN5bmMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICB1c2VBcHBseUFzeW5jID0gISF2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdXNlQXBwbHlBc3luYztcbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIHByb3BlcnR5XG4gICAqIEBuYW1lICRodHRwUHJvdmlkZXIjaW50ZXJjZXB0b3JzXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBBcnJheSBjb250YWluaW5nIHNlcnZpY2UgZmFjdG9yaWVzIGZvciBhbGwgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIHtAbGluayBuZy4kaHR0cCAkaHR0cH1cbiAgICogcHJlLXByb2Nlc3Npbmcgb2YgcmVxdWVzdCBvciBwb3N0cHJvY2Vzc2luZyBvZiByZXNwb25zZXMuXG4gICAqXG4gICAqIFRoZXNlIHNlcnZpY2UgZmFjdG9yaWVzIGFyZSBvcmRlcmVkIGJ5IHJlcXVlc3QsIGkuZS4gdGhleSBhcmUgYXBwbGllZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbiAgICogYXJyYXksIG9uIHJlcXVlc3QsIGJ1dCByZXZlcnNlIG9yZGVyLCBvbiByZXNwb25zZS5cbiAgICpcbiAgICoge0BsaW5rIG5nLiRodHRwI2ludGVyY2VwdG9ycyBJbnRlcmNlcHRvcnMgZGV0YWlsZWQgaW5mb31cbiAgICoqL1xuICB2YXIgaW50ZXJjZXB0b3JGYWN0b3JpZXMgPSB0aGlzLmludGVyY2VwdG9ycyA9IFtdO1xuXG4gIHRoaXMuJGdldCA9IFsnJGJyb3dzZXInLCAnJGh0dHBCYWNrZW5kJywgJyQkY29va2llUmVhZGVyJywgJyRjYWNoZUZhY3RvcnknLCAnJHJvb3RTY29wZScsICckcScsICckaW5qZWN0b3InLCAnJHNjZScsXG4gICAgICBmdW5jdGlvbigkYnJvd3NlciwgJGh0dHBCYWNrZW5kLCAkJGNvb2tpZVJlYWRlciwgJGNhY2hlRmFjdG9yeSwgJHJvb3RTY29wZSwgJHEsICRpbmplY3RvciwgJHNjZSkge1xuXG4gICAgdmFyIGRlZmF1bHRDYWNoZSA9ICRjYWNoZUZhY3RvcnkoJyRodHRwJyk7XG5cbiAgICAvKipcbiAgICAgKiBNYWtlIHN1cmUgdGhhdCBkZWZhdWx0IHBhcmFtIHNlcmlhbGl6ZXIgaXMgZXhwb3NlZCBhcyBhIGZ1bmN0aW9uXG4gICAgICovXG4gICAgZGVmYXVsdHMucGFyYW1TZXJpYWxpemVyID0gaXNTdHJpbmcoZGVmYXVsdHMucGFyYW1TZXJpYWxpemVyKSA/XG4gICAgICAkaW5qZWN0b3IuZ2V0KGRlZmF1bHRzLnBhcmFtU2VyaWFsaXplcikgOiBkZWZhdWx0cy5wYXJhbVNlcmlhbGl6ZXI7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcmNlcHRvcnMgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIuIElubmVyIGludGVyY2VwdG9ycyBiZWZvcmUgb3V0ZXIgaW50ZXJjZXB0b3JzLlxuICAgICAqIFRoZSByZXZlcnNhbCBpcyBuZWVkZWQgc28gdGhhdCB3ZSBjYW4gYnVpbGQgdXAgdGhlIGludGVyY2VwdGlvbiBjaGFpbiBhcm91bmQgdGhlXG4gICAgICogc2VydmVyIHJlcXVlc3QuXG4gICAgICovXG4gICAgdmFyIHJldmVyc2VkSW50ZXJjZXB0b3JzID0gW107XG5cbiAgICBmb3JFYWNoKGludGVyY2VwdG9yRmFjdG9yaWVzLCBmdW5jdGlvbihpbnRlcmNlcHRvckZhY3RvcnkpIHtcbiAgICAgIHJldmVyc2VkSW50ZXJjZXB0b3JzLnVuc2hpZnQoaXNTdHJpbmcoaW50ZXJjZXB0b3JGYWN0b3J5KVxuICAgICAgICAgID8gJGluamVjdG9yLmdldChpbnRlcmNlcHRvckZhY3RvcnkpIDogJGluamVjdG9yLmludm9rZShpbnRlcmNlcHRvckZhY3RvcnkpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBzZXJ2aWNlXG4gICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgKiBAbmFtZSAkaHR0cFxuICAgICAqIEByZXF1aXJlcyBuZy4kaHR0cEJhY2tlbmRcbiAgICAgKiBAcmVxdWlyZXMgJGNhY2hlRmFjdG9yeVxuICAgICAqIEByZXF1aXJlcyAkcm9vdFNjb3BlXG4gICAgICogQHJlcXVpcmVzICRxXG4gICAgICogQHJlcXVpcmVzICRpbmplY3RvclxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogVGhlIGAkaHR0cGAgc2VydmljZSBpcyBhIGNvcmUgQW5ndWxhciBzZXJ2aWNlIHRoYXQgZmFjaWxpdGF0ZXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSByZW1vdGVcbiAgICAgKiBIVFRQIHNlcnZlcnMgdmlhIHRoZSBicm93c2VyJ3MgW1hNTEh0dHBSZXF1ZXN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi94bWxodHRwcmVxdWVzdClcbiAgICAgKiBvYmplY3Qgb3IgdmlhIFtKU09OUF0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUCkuXG4gICAgICpcbiAgICAgKiBGb3IgdW5pdCB0ZXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBgJGh0dHBgIHNlcnZpY2UsIHNlZVxuICAgICAqIHtAbGluayBuZ01vY2suJGh0dHBCYWNrZW5kICRodHRwQmFja2VuZCBtb2NrfS5cbiAgICAgKlxuICAgICAqIEZvciBhIGhpZ2hlciBsZXZlbCBvZiBhYnN0cmFjdGlvbiwgcGxlYXNlIGNoZWNrIG91dCB0aGUge0BsaW5rIG5nUmVzb3VyY2UuJHJlc291cmNlXG4gICAgICogJHJlc291cmNlfSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogVGhlICRodHRwIEFQSSBpcyBiYXNlZCBvbiB0aGUge0BsaW5rIG5nLiRxIGRlZmVycmVkL3Byb21pc2UgQVBJc30gZXhwb3NlZCBieVxuICAgICAqIHRoZSAkcSBzZXJ2aWNlLiBXaGlsZSBmb3Igc2ltcGxlIHVzYWdlIHBhdHRlcm5zIHRoaXMgZG9lc24ndCBtYXR0ZXIgbXVjaCwgZm9yIGFkdmFuY2VkIHVzYWdlXG4gICAgICogaXQgaXMgaW1wb3J0YW50IHRvIGZhbWlsaWFyaXplIHlvdXJzZWxmIHdpdGggdGhlc2UgQVBJcyBhbmQgdGhlIGd1YXJhbnRlZXMgdGhleSBwcm92aWRlLlxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIyBHZW5lcmFsIHVzYWdlXG4gICAgICogVGhlIGAkaHR0cGAgc2VydmljZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IOKAlCBhIHtAbGluayAkaHR0cCN1c2FnZSBjb25maWd1cmF0aW9uIG9iamVjdH0g4oCUXG4gICAgICogdGhhdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGFuIEhUVFAgcmVxdWVzdCBhbmQgcmV0dXJucyAgYSB7QGxpbmsgbmcuJHEgcHJvbWlzZX0uXG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqICAgLy8gU2ltcGxlIEdFVCByZXF1ZXN0IGV4YW1wbGU6XG4gICAgICogICAkaHR0cCh7XG4gICAgICogICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICogICAgIHVybDogJy9zb21lVXJsJ1xuICAgICAqICAgfSkudGhlbihmdW5jdGlvbiBzdWNjZXNzQ2FsbGJhY2socmVzcG9uc2UpIHtcbiAgICAgKiAgICAgICAvLyB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5XG4gICAgICogICAgICAgLy8gd2hlbiB0aGUgcmVzcG9uc2UgaXMgYXZhaWxhYmxlXG4gICAgICogICAgIH0sIGZ1bmN0aW9uIGVycm9yQ2FsbGJhY2socmVzcG9uc2UpIHtcbiAgICAgKiAgICAgICAvLyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgaWYgYW4gZXJyb3Igb2NjdXJzXG4gICAgICogICAgICAgLy8gb3Igc2VydmVyIHJldHVybnMgcmVzcG9uc2Ugd2l0aCBhbiBlcnJvciBzdGF0dXMuXG4gICAgICogICAgIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIHJlc3BvbnNlIG9iamVjdCBoYXMgdGhlc2UgcHJvcGVydGllczpcbiAgICAgKlxuICAgICAqICAgLSAqKmRhdGEqKiDigJMgYHtzdHJpbmd8T2JqZWN0fWAg4oCTIFRoZSByZXNwb25zZSBib2R5IHRyYW5zZm9ybWVkIHdpdGggdGhlIHRyYW5zZm9ybVxuICAgICAqICAgICBmdW5jdGlvbnMuXG4gICAgICogICAtICoqc3RhdHVzKiog4oCTIGB7bnVtYmVyfWAg4oCTIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqICAgLSAqKmhlYWRlcnMqKiDigJMgYHtmdW5jdGlvbihbaGVhZGVyTmFtZV0pfWAg4oCTIEhlYWRlciBnZXR0ZXIgZnVuY3Rpb24uXG4gICAgICogICAtICoqY29uZmlnKiog4oCTIGB7T2JqZWN0fWAg4oCTIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSByZXF1ZXN0LlxuICAgICAqICAgLSAqKnN0YXR1c1RleHQqKiDigJMgYHtzdHJpbmd9YCDigJMgSFRUUCBzdGF0dXMgdGV4dCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIGJldHdlZW4gMjAwIGFuZCAyOTkgaXMgY29uc2lkZXJlZCBhIHN1Y2Nlc3Mgc3RhdHVzIGFuZCB3aWxsIHJlc3VsdCBpblxuICAgICAqIHRoZSBzdWNjZXNzIGNhbGxiYWNrIGJlaW5nIGNhbGxlZC4gQW55IHJlc3BvbnNlIHN0YXR1cyBjb2RlIG91dHNpZGUgb2YgdGhhdCByYW5nZSBpc1xuICAgICAqIGNvbnNpZGVyZWQgYW4gZXJyb3Igc3RhdHVzIGFuZCB3aWxsIHJlc3VsdCBpbiB0aGUgZXJyb3IgY2FsbGJhY2sgYmVpbmcgY2FsbGVkLlxuICAgICAqIEFsc28sIHN0YXR1cyBjb2RlcyBsZXNzIHRoYW4gLTEgYXJlIG5vcm1hbGl6ZWQgdG8gemVyby4gLTEgdXN1YWxseSBtZWFucyB0aGUgcmVxdWVzdCB3YXNcbiAgICAgKiBhYm9ydGVkLCBlLmcuIHVzaW5nIGEgYGNvbmZpZy50aW1lb3V0YC5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIHJlc3BvbnNlIGlzIGEgcmVkaXJlY3QsIFhNTEh0dHBSZXF1ZXN0IHdpbGwgdHJhbnNwYXJlbnRseSBmb2xsb3cgaXQsIG1lYW5pbmdcbiAgICAgKiB0aGF0IHRoZSBvdXRjb21lIChzdWNjZXNzIG9yIGVycm9yKSB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGZpbmFsIHJlc3BvbnNlIHN0YXR1cyBjb2RlLlxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIyBTaG9ydGN1dCBtZXRob2RzXG4gICAgICpcbiAgICAgKiBTaG9ydGN1dCBtZXRob2RzIGFyZSBhbHNvIGF2YWlsYWJsZS4gQWxsIHNob3J0Y3V0IG1ldGhvZHMgcmVxdWlyZSBwYXNzaW5nIGluIHRoZSBVUkwsIGFuZFxuICAgICAqIHJlcXVlc3QgZGF0YSBtdXN0IGJlIHBhc3NlZCBpbiBmb3IgUE9TVC9QVVQgcmVxdWVzdHMuIEFuIG9wdGlvbmFsIGNvbmZpZyBjYW4gYmUgcGFzc2VkIGFzIHRoZVxuICAgICAqIGxhc3QgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqICAgJGh0dHAuZ2V0KCcvc29tZVVybCcsIGNvbmZpZykudGhlbihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAqICAgJGh0dHAucG9zdCgnL3NvbWVVcmwnLCBkYXRhLCBjb25maWcpLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENvbXBsZXRlIGxpc3Qgb2Ygc2hvcnRjdXQgbWV0aG9kczpcbiAgICAgKlxuICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI2dldCAkaHR0cC5nZXR9XG4gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjaGVhZCAkaHR0cC5oZWFkfVxuICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI3Bvc3QgJGh0dHAucG9zdH1cbiAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNwdXQgJGh0dHAucHV0fVxuICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI2RlbGV0ZSAkaHR0cC5kZWxldGV9XG4gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjanNvbnAgJGh0dHAuanNvbnB9XG4gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjcGF0Y2ggJGh0dHAucGF0Y2h9XG4gICAgICpcbiAgICAgKlxuICAgICAqICMjIFdyaXRpbmcgVW5pdCBUZXN0cyB0aGF0IHVzZSAkaHR0cFxuICAgICAqIFdoZW4gdW5pdCB0ZXN0aW5nICh1c2luZyB7QGxpbmsgbmdNb2NrIG5nTW9ja30pLCBpdCBpcyBuZWNlc3NhcnkgdG8gY2FsbFxuICAgICAqIHtAbGluayBuZ01vY2suJGh0dHBCYWNrZW5kI2ZsdXNoICRodHRwQmFja2VuZC5mbHVzaCgpfSB0byBmbHVzaCBlYWNoIHBlbmRpbmdcbiAgICAgKiByZXF1ZXN0IHVzaW5nIHRyYWluZWQgcmVzcG9uc2VzLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogJGh0dHBCYWNrZW5kLmV4cGVjdEdFVCguLi4pO1xuICAgICAqICRodHRwLmdldCguLi4pO1xuICAgICAqICRodHRwQmFja2VuZC5mbHVzaCgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogIyMgU2V0dGluZyBIVFRQIEhlYWRlcnNcbiAgICAgKlxuICAgICAqIFRoZSAkaHR0cCBzZXJ2aWNlIHdpbGwgYXV0b21hdGljYWxseSBhZGQgY2VydGFpbiBIVFRQIGhlYWRlcnMgdG8gYWxsIHJlcXVlc3RzLiBUaGVzZSBkZWZhdWx0c1xuICAgICAqIGNhbiBiZSBmdWxseSBjb25maWd1cmVkIGJ5IGFjY2Vzc2luZyB0aGUgYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVyc2AgY29uZmlndXJhdGlvblxuICAgICAqIG9iamVjdCwgd2hpY2ggY3VycmVudGx5IGNvbnRhaW5zIHRoaXMgZGVmYXVsdCBjb25maWd1cmF0aW9uOlxuICAgICAqXG4gICAgICogLSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vbmAgKGhlYWRlcnMgdGhhdCBhcmUgY29tbW9uIGZvciBhbGwgcmVxdWVzdHMpOlxuICAgICAqICAgLSA8Y29kZT5BY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sIFxcKiYjNjUyNzk7LyYjNjUyNzk7XFwqPC9jb2RlPlxuICAgICAqIC0gYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycy5wb3N0YDogKGhlYWRlciBkZWZhdWx0cyBmb3IgUE9TVCByZXF1ZXN0cylcbiAgICAgKiAgIC0gYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbmBcbiAgICAgKiAtIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMucHV0YCAoaGVhZGVyIGRlZmF1bHRzIGZvciBQVVQgcmVxdWVzdHMpXG4gICAgICogICAtIGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25gXG4gICAgICpcbiAgICAgKiBUbyBhZGQgb3Igb3ZlcndyaXRlIHRoZXNlIGRlZmF1bHRzLCBzaW1wbHkgYWRkIG9yIHJlbW92ZSBhIHByb3BlcnR5IGZyb20gdGhlc2UgY29uZmlndXJhdGlvblxuICAgICAqIG9iamVjdHMuIFRvIGFkZCBoZWFkZXJzIGZvciBhbiBIVFRQIG1ldGhvZCBvdGhlciB0aGFuIFBPU1Qgb3IgUFVULCBzaW1wbHkgYWRkIGEgbmV3IG9iamVjdFxuICAgICAqIHdpdGggdGhlIGxvd2VyY2FzZWQgSFRUUCBtZXRob2QgbmFtZSBhcyB0aGUga2V5LCBlLmcuXG4gICAgICogYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycy5nZXQgPSB7ICdNeS1IZWFkZXInIDogJ3ZhbHVlJyB9YC5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0cyBjYW4gYWxzbyBiZSBzZXQgYXQgcnVudGltZSB2aWEgdGhlIGAkaHR0cC5kZWZhdWx0c2Agb2JqZWN0IGluIHRoZSBzYW1lXG4gICAgICogZmFzaGlvbi4gRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBtb2R1bGUucnVuKGZ1bmN0aW9uKCRodHRwKSB7XG4gICAgICogICAkaHR0cC5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vbi5BdXRob3JpemF0aW9uID0gJ0Jhc2ljIFltVmxjRHBpYjI5dyc7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiwgeW91IGNhbiBzdXBwbHkgYSBgaGVhZGVyc2AgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QgcGFzc2VkIHdoZW5cbiAgICAgKiBjYWxsaW5nIGAkaHR0cChjb25maWcpYCwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0cyB3aXRob3V0IGNoYW5naW5nIHRoZW0gZ2xvYmFsbHkuXG4gICAgICpcbiAgICAgKiBUbyBleHBsaWNpdGx5IHJlbW92ZSBhIGhlYWRlciBhdXRvbWF0aWNhbGx5IGFkZGVkIHZpYSAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMgb24gYSBwZXIgcmVxdWVzdCBiYXNpcyxcbiAgICAgKiBVc2UgdGhlIGBoZWFkZXJzYCBwcm9wZXJ0eSwgc2V0dGluZyB0aGUgZGVzaXJlZCBoZWFkZXIgdG8gYHVuZGVmaW5lZGAuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiB2YXIgcmVxID0ge1xuICAgICAqICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgKiAgdXJsOiAnaHR0cDovL2V4YW1wbGUuY29tJyxcbiAgICAgKiAgaGVhZGVyczoge1xuICAgICAqICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWRcbiAgICAgKiAgfSxcbiAgICAgKiAgZGF0YTogeyB0ZXN0OiAndGVzdCcgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqICRodHRwKHJlcSkudGhlbihmdW5jdGlvbigpey4uLn0sIGZ1bmN0aW9uKCl7Li4ufSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAjIyBUcmFuc2Zvcm1pbmcgUmVxdWVzdHMgYW5kIFJlc3BvbnNlc1xuICAgICAqXG4gICAgICogQm90aCByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGNhbiBiZSB0cmFuc2Zvcm1lZCB1c2luZyB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnM6IGB0cmFuc2Zvcm1SZXF1ZXN0YFxuICAgICAqIGFuZCBgdHJhbnNmb3JtUmVzcG9uc2VgLiBUaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSBhIHNpbmdsZSBmdW5jdGlvbiB0aGF0IHJldHVybnNcbiAgICAgKiB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgKGBmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyLCBzdGF0dXMpYCkgb3IgYW4gYXJyYXkgb2Ygc3VjaCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMsXG4gICAgICogd2hpY2ggYWxsb3dzIHlvdSB0byBgcHVzaGAgb3IgYHVuc2hpZnRgIGEgbmV3IHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGludG8gdGhlIHRyYW5zZm9ybWF0aW9uIGNoYWluLlxuICAgICAqXG4gICAgICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAgICAgKiAqKk5vdGU6KiogQW5ndWxhciBkb2VzIG5vdCBtYWtlIGEgY29weSBvZiB0aGUgYGRhdGFgIHBhcmFtZXRlciBiZWZvcmUgaXQgaXMgcGFzc2VkIGludG8gdGhlIGB0cmFuc2Zvcm1SZXF1ZXN0YCBwaXBlbGluZS5cbiAgICAgKiBUaGF0IG1lYW5zIGNoYW5nZXMgdG8gdGhlIHByb3BlcnRpZXMgb2YgYGRhdGFgIGFyZSBub3QgbG9jYWwgdG8gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiAoc2luY2UgSmF2YXNjcmlwdCBwYXNzZXMgb2JqZWN0cyBieSByZWZlcmVuY2UpLlxuICAgICAqIEZvciBleGFtcGxlLCB3aGVuIGNhbGxpbmcgYCRodHRwLmdldCh1cmwsICRzY29wZS5teU9iamVjdClgLCBtb2RpZmljYXRpb25zIHRvIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzIGluIGEgdHJhbnNmb3JtUmVxdWVzdFxuICAgICAqIGZ1bmN0aW9uIHdpbGwgYmUgcmVmbGVjdGVkIG9uIHRoZSBzY29wZSBhbmQgaW4gYW55IHRlbXBsYXRlcyB3aGVyZSB0aGUgb2JqZWN0IGlzIGRhdGEtYm91bmQuXG4gICAgICogVG8gcHJldmVudCB0aGlzLCB0cmFuc2Zvcm0gZnVuY3Rpb25zIHNob3VsZCBoYXZlIG5vIHNpZGUtZWZmZWN0cy5cbiAgICAgKiBJZiB5b3UgbmVlZCB0byBtb2RpZnkgcHJvcGVydGllcywgaXQgaXMgcmVjb21tZW5kZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGRhdGEsIG9yIGNyZWF0ZSBuZXcgb2JqZWN0IHRvIHJldHVybi5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKlxuICAgICAqICMjIyBEZWZhdWx0IFRyYW5zZm9ybWF0aW9uc1xuICAgICAqXG4gICAgICogVGhlIGAkaHR0cFByb3ZpZGVyYCBwcm92aWRlciBhbmQgYCRodHRwYCBzZXJ2aWNlIGV4cG9zZSBgZGVmYXVsdHMudHJhbnNmb3JtUmVxdWVzdGAgYW5kXG4gICAgICogYGRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlYCBwcm9wZXJ0aWVzLiBJZiBhIHJlcXVlc3QgZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIHRyYW5zZm9ybWF0aW9uc1xuICAgICAqIHRoZW4gdGhlc2Ugd2lsbCBiZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhdWdtZW50IG9yIHJlcGxhY2UgdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb25zIGJ5IG1vZGlmeWluZyB0aGVzZSBwcm9wZXJ0aWVzIGJ5IGFkZGluZyB0byBvclxuICAgICAqIHJlcGxhY2luZyB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBBbmd1bGFyIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbnM6XG4gICAgICpcbiAgICAgKiBSZXF1ZXN0IHRyYW5zZm9ybWF0aW9ucyAoYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMudHJhbnNmb3JtUmVxdWVzdGAgYW5kIGAkaHR0cC5kZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0YCk6XG4gICAgICpcbiAgICAgKiAtIElmIHRoZSBgZGF0YWAgcHJvcGVydHkgb2YgdGhlIHJlcXVlc3QgY29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbnMgYW4gb2JqZWN0LCBzZXJpYWxpemUgaXRcbiAgICAgKiAgIGludG8gSlNPTiBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBSZXNwb25zZSB0cmFuc2Zvcm1hdGlvbnMgKGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlYCBhbmQgYCRodHRwLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlYCk6XG4gICAgICpcbiAgICAgKiAgLSBJZiBYU1JGIHByZWZpeCBpcyBkZXRlY3RlZCwgc3RyaXAgaXQgKHNlZSBTZWN1cml0eSBDb25zaWRlcmF0aW9ucyBzZWN0aW9uIGJlbG93KS5cbiAgICAgKiAgLSBJZiBKU09OIHJlc3BvbnNlIGlzIGRldGVjdGVkLCBkZXNlcmlhbGl6ZSBpdCB1c2luZyBhIEpTT04gcGFyc2VyLlxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIyMgT3ZlcnJpZGluZyB0aGUgRGVmYXVsdCBUcmFuc2Zvcm1hdGlvbnMgUGVyIFJlcXVlc3RcbiAgICAgKlxuICAgICAqIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIHRyYW5zZm9ybWF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSByZXF1ZXN0IHRoZW4gcHJvdmlkZVxuICAgICAqIGB0cmFuc2Zvcm1SZXF1ZXN0YCBhbmQvb3IgYHRyYW5zZm9ybVJlc3BvbnNlYCBwcm9wZXJ0aWVzIG9uIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBwYXNzZWRcbiAgICAgKiBpbnRvIGAkaHR0cGAuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgaWYgeW91IHByb3ZpZGUgdGhlc2UgcHJvcGVydGllcyBvbiB0aGUgY29uZmlnIG9iamVjdCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbnMgd2lsbCBiZVxuICAgICAqIG92ZXJ3cml0dGVuLiBJZiB5b3Ugd2lzaCB0byBhdWdtZW50IHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9ucyB0aGVuIHlvdSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB5b3VyXG4gICAgICogbG9jYWwgdHJhbnNmb3JtYXRpb24gYXJyYXkuXG4gICAgICpcbiAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgZGVtb25zdHJhdGVzIGFkZGluZyBhIG5ldyByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbiB0byBiZSBydW4gYWZ0ZXIgdGhlIGRlZmF1bHQgcmVzcG9uc2VcbiAgICAgKiB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogZnVuY3Rpb24gYXBwZW5kVHJhbnNmb3JtKGRlZmF1bHRzLCB0cmFuc2Zvcm0pIHtcbiAgICAgKlxuICAgICAqICAgLy8gV2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24gaXMgYW4gYXJyYXlcbiAgICAgKiAgIGRlZmF1bHRzID0gYW5ndWxhci5pc0FycmF5KGRlZmF1bHRzKSA/IGRlZmF1bHRzIDogW2RlZmF1bHRzXTtcbiAgICAgKlxuICAgICAqICAgLy8gQXBwZW5kIHRoZSBuZXcgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGRlZmF1bHRzXG4gICAgICogICByZXR1cm4gZGVmYXVsdHMuY29uY2F0KHRyYW5zZm9ybSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogJGh0dHAoe1xuICAgICAqICAgdXJsOiAnLi4uJyxcbiAgICAgKiAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICogICB0cmFuc2Zvcm1SZXNwb25zZTogYXBwZW5kVHJhbnNmb3JtKCRodHRwLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgICByZXR1cm4gZG9UcmFuc2Zvcm0odmFsdWUpO1xuICAgICAqICAgfSlcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqXG4gICAgICogIyMgQ2FjaGluZ1xuICAgICAqXG4gICAgICoge0BsaW5rIG5nLiRodHRwIGAkaHR0cGB9IHJlc3BvbnNlcyBhcmUgbm90IGNhY2hlZCBieSBkZWZhdWx0LiBUbyBlbmFibGUgY2FjaGluZywgeW91IG11c3RcbiAgICAgKiBzZXQgdGhlIGNvbmZpZy5jYWNoZSB2YWx1ZSBvciB0aGUgZGVmYXVsdCBjYWNoZSB2YWx1ZSB0byBUUlVFIG9yIHRvIGEgY2FjaGUgb2JqZWN0IChjcmVhdGVkXG4gICAgICogd2l0aCB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSBgJGNhY2hlRmFjdG9yeWB9KS4gSWYgZGVmaW5lZCwgdGhlIHZhbHVlIG9mIGNvbmZpZy5jYWNoZSB0YWtlc1xuICAgICAqIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGVmYXVsdCBjYWNoZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEluIG9yZGVyIHRvOlxuICAgICAqICAgKiBjYWNoZSBhbGwgcmVzcG9uc2VzIC0gc2V0IHRoZSBkZWZhdWx0IGNhY2hlIHZhbHVlIHRvIFRSVUUgb3IgdG8gYSBjYWNoZSBvYmplY3RcbiAgICAgKiAgICogY2FjaGUgYSBzcGVjaWZpYyByZXNwb25zZSAtIHNldCBjb25maWcuY2FjaGUgdmFsdWUgdG8gVFJVRSBvciB0byBhIGNhY2hlIG9iamVjdFxuICAgICAqXG4gICAgICogSWYgY2FjaGluZyBpcyBlbmFibGVkLCBidXQgbmVpdGhlciB0aGUgZGVmYXVsdCBjYWNoZSBub3IgY29uZmlnLmNhY2hlIGFyZSBzZXQgdG8gYSBjYWNoZSBvYmplY3QsXG4gICAgICogdGhlbiB0aGUgZGVmYXVsdCBgJGNhY2hlRmFjdG9yeShcIiRodHRwXCIpYCBvYmplY3QgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0IGNhY2hlIHZhbHVlIGNhbiBiZSBzZXQgYnkgdXBkYXRpbmcgdGhlXG4gICAgICoge0BsaW5rIG5nLiRodHRwI2RlZmF1bHRzIGAkaHR0cC5kZWZhdWx0cy5jYWNoZWB9IHByb3BlcnR5IG9yIHRoZVxuICAgICAqIHtAbGluayAkaHR0cFByb3ZpZGVyI2RlZmF1bHRzIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmNhY2hlYH0gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBXaGVuIGNhY2hpbmcgaXMgZW5hYmxlZCwge0BsaW5rIG5nLiRodHRwIGAkaHR0cGB9IHN0b3JlcyB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIHVzaW5nXG4gICAgICogdGhlIHJlbGV2YW50IGNhY2hlIG9iamVjdC4gVGhlIG5leHQgdGltZSB0aGUgc2FtZSByZXF1ZXN0IGlzIG1hZGUsIHRoZSByZXNwb25zZSBpcyByZXR1cm5lZFxuICAgICAqIGZyb20gdGhlIGNhY2hlIHdpdGhvdXQgc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlci5cbiAgICAgKlxuICAgICAqIFRha2Ugbm90ZSB0aGF0OlxuICAgICAqXG4gICAgICogICAqIE9ubHkgR0VUIGFuZCBKU09OUCByZXF1ZXN0cyBhcmUgY2FjaGVkLlxuICAgICAqICAgKiBUaGUgY2FjaGUga2V5IGlzIHRoZSByZXF1ZXN0IFVSTCBpbmNsdWRpbmcgc2VhcmNoIHBhcmFtZXRlcnM7IGhlYWRlcnMgYXJlIG5vdCBjb25zaWRlcmVkLlxuICAgICAqICAgKiBDYWNoZWQgcmVzcG9uc2VzIGFyZSByZXR1cm5lZCBhc3luY2hyb25vdXNseSwgaW4gdGhlIHNhbWUgd2F5IGFzIHJlc3BvbnNlcyBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICogICAqIElmIG11bHRpcGxlIGlkZW50aWNhbCByZXF1ZXN0cyBhcmUgbWFkZSB1c2luZyB0aGUgc2FtZSBjYWNoZSwgd2hpY2ggaXMgbm90IHlldCBwb3B1bGF0ZWQsXG4gICAgICogICAgIG9uZSByZXF1ZXN0IHdpbGwgYmUgbWFkZSB0byB0aGUgc2VydmVyIGFuZCByZW1haW5pbmcgcmVxdWVzdHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgcmVzcG9uc2UuXG4gICAgICogICAqIEEgY2FjaGUtY29udHJvbCBoZWFkZXIgb24gdGhlIHJlc3BvbnNlIGRvZXMgbm90IGFmZmVjdCBpZiBvciBob3cgcmVzcG9uc2VzIGFyZSBjYWNoZWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqICMjIEludGVyY2VwdG9yc1xuICAgICAqXG4gICAgICogQmVmb3JlIHlvdSBzdGFydCBjcmVhdGluZyBpbnRlcmNlcHRvcnMsIGJlIHN1cmUgdG8gdW5kZXJzdGFuZCB0aGVcbiAgICAgKiB7QGxpbmsgbmcuJHEgJHEgYW5kIGRlZmVycmVkL3Byb21pc2UgQVBJc30uXG4gICAgICpcbiAgICAgKiBGb3IgcHVycG9zZXMgb2YgZ2xvYmFsIGVycm9yIGhhbmRsaW5nLCBhdXRoZW50aWNhdGlvbiwgb3IgYW55IGtpbmQgb2Ygc3luY2hyb25vdXMgb3JcbiAgICAgKiBhc3luY2hyb25vdXMgcHJlLXByb2Nlc3Npbmcgb2YgcmVxdWVzdCBvciBwb3N0cHJvY2Vzc2luZyBvZiByZXNwb25zZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBiZVxuICAgICAqIGFibGUgdG8gaW50ZXJjZXB0IHJlcXVlc3RzIGJlZm9yZSB0aGV5IGFyZSBoYW5kZWQgdG8gdGhlIHNlcnZlciBhbmRcbiAgICAgKiByZXNwb25zZXMgYmVmb3JlIHRoZXkgYXJlIGhhbmRlZCBvdmVyIHRvIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRoYXRcbiAgICAgKiBpbml0aWF0ZWQgdGhlc2UgcmVxdWVzdHMuIFRoZSBpbnRlcmNlcHRvcnMgbGV2ZXJhZ2UgdGhlIHtAbGluayBuZy4kcVxuICAgICAqIHByb21pc2UgQVBJc30gdG8gZnVsZmlsbCB0aGlzIG5lZWQgZm9yIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBwcmUtcHJvY2Vzc2luZy5cbiAgICAgKlxuICAgICAqIFRoZSBpbnRlcmNlcHRvcnMgYXJlIHNlcnZpY2UgZmFjdG9yaWVzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYCRodHRwUHJvdmlkZXJgIGJ5XG4gICAgICogYWRkaW5nIHRoZW0gdG8gdGhlIGAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9yc2AgYXJyYXkuIFRoZSBmYWN0b3J5IGlzIGNhbGxlZCBhbmRcbiAgICAgKiBpbmplY3RlZCB3aXRoIGRlcGVuZGVuY2llcyAoaWYgc3BlY2lmaWVkKSBhbmQgcmV0dXJucyB0aGUgaW50ZXJjZXB0b3IuXG4gICAgICpcbiAgICAgKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGludGVyY2VwdG9ycyAoYW5kIHR3byBraW5kcyBvZiByZWplY3Rpb24gaW50ZXJjZXB0b3JzKTpcbiAgICAgKlxuICAgICAqICAgKiBgcmVxdWVzdGA6IGludGVyY2VwdG9ycyBnZXQgY2FsbGVkIHdpdGggYSBodHRwIHtAbGluayAkaHR0cCN1c2FnZSBjb25maWd9IG9iamVjdC4gVGhlIGZ1bmN0aW9uIGlzIGZyZWUgdG9cbiAgICAgKiAgICAgbW9kaWZ5IHRoZSBgY29uZmlnYCBvYmplY3Qgb3IgY3JlYXRlIGEgbmV3IG9uZS4gVGhlIGZ1bmN0aW9uIG5lZWRzIHRvIHJldHVybiB0aGUgYGNvbmZpZ2BcbiAgICAgKiAgICAgb2JqZWN0IGRpcmVjdGx5LCBvciBhIHByb21pc2UgY29udGFpbmluZyB0aGUgYGNvbmZpZ2Agb3IgYSBuZXcgYGNvbmZpZ2Agb2JqZWN0LlxuICAgICAqICAgKiBgcmVxdWVzdEVycm9yYDogaW50ZXJjZXB0b3IgZ2V0cyBjYWxsZWQgd2hlbiBhIHByZXZpb3VzIGludGVyY2VwdG9yIHRocmV3IGFuIGVycm9yIG9yXG4gICAgICogICAgIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24uXG4gICAgICogICAqIGByZXNwb25zZWA6IGludGVyY2VwdG9ycyBnZXQgY2FsbGVkIHdpdGggaHR0cCBgcmVzcG9uc2VgIG9iamVjdC4gVGhlIGZ1bmN0aW9uIGlzIGZyZWUgdG9cbiAgICAgKiAgICAgbW9kaWZ5IHRoZSBgcmVzcG9uc2VgIG9iamVjdCBvciBjcmVhdGUgYSBuZXcgb25lLiBUaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIHRoZSBgcmVzcG9uc2VgXG4gICAgICogICAgIG9iamVjdCBkaXJlY3RseSwgb3IgYXMgYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGByZXNwb25zZWAgb3IgYSBuZXcgYHJlc3BvbnNlYCBvYmplY3QuXG4gICAgICogICAqIGByZXNwb25zZUVycm9yYDogaW50ZXJjZXB0b3IgZ2V0cyBjYWxsZWQgd2hlbiBhIHByZXZpb3VzIGludGVyY2VwdG9yIHRocmV3IGFuIGVycm9yIG9yXG4gICAgICogICAgIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24uXG4gICAgICpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogICAvLyByZWdpc3RlciB0aGUgaW50ZXJjZXB0b3IgYXMgYSBzZXJ2aWNlXG4gICAgICogICAkcHJvdmlkZS5mYWN0b3J5KCdteUh0dHBJbnRlcmNlcHRvcicsIGZ1bmN0aW9uKCRxLCBkZXBlbmRlbmN5MSwgZGVwZW5kZW5jeTIpIHtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICAvLyBvcHRpb25hbCBtZXRob2RcbiAgICAgKiAgICAgICAncmVxdWVzdCc6IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIG9uIHN1Y2Nlc3NcbiAgICAgKiAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICogICAgICAgfSxcbiAgICAgKlxuICAgICAqICAgICAgIC8vIG9wdGlvbmFsIG1ldGhvZFxuICAgICAqICAgICAgJ3JlcXVlc3RFcnJvcic6IGZ1bmN0aW9uKHJlamVjdGlvbikge1xuICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIG9uIGVycm9yXG4gICAgICogICAgICAgICBpZiAoY2FuUmVjb3ZlcihyZWplY3Rpb24pKSB7XG4gICAgICogICAgICAgICAgIHJldHVybiByZXNwb25zZU9yTmV3UHJvbWlzZVxuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICAgICAgcmV0dXJuICRxLnJlamVjdChyZWplY3Rpb24pO1xuICAgICAqICAgICAgIH0sXG4gICAgICpcbiAgICAgKlxuICAgICAqXG4gICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kXG4gICAgICogICAgICAgJ3Jlc3BvbnNlJzogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBvbiBzdWNjZXNzXG4gICAgICogICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICogICAgICAgfSxcbiAgICAgKlxuICAgICAqICAgICAgIC8vIG9wdGlvbmFsIG1ldGhvZFxuICAgICAqICAgICAgJ3Jlc3BvbnNlRXJyb3InOiBmdW5jdGlvbihyZWplY3Rpb24pIHtcbiAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBvbiBlcnJvclxuICAgICAqICAgICAgICAgaWYgKGNhblJlY292ZXIocmVqZWN0aW9uKSkge1xuICAgICAqICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VPck5ld1Byb21pc2VcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgICAgIHJldHVybiAkcS5yZWplY3QocmVqZWN0aW9uKTtcbiAgICAgKiAgICAgICB9XG4gICAgICogICAgIH07XG4gICAgICogICB9KTtcbiAgICAgKlxuICAgICAqICAgJGh0dHBQcm92aWRlci5pbnRlcmNlcHRvcnMucHVzaCgnbXlIdHRwSW50ZXJjZXB0b3InKTtcbiAgICAgKlxuICAgICAqXG4gICAgICogICAvLyBhbHRlcm5hdGl2ZWx5LCByZWdpc3RlciB0aGUgaW50ZXJjZXB0b3IgdmlhIGFuIGFub255bW91cyBmYWN0b3J5XG4gICAgICogICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKGZ1bmN0aW9uKCRxLCBkZXBlbmRlbmN5MSwgZGVwZW5kZW5jeTIpIHtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICdyZXF1ZXN0JzogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICogICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZVxuICAgICAqICAgICAgIH0sXG4gICAgICpcbiAgICAgKiAgICAgICAncmVzcG9uc2UnOiBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAqICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmVcbiAgICAgKiAgICAgICB9XG4gICAgICogICAgIH07XG4gICAgICogICB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqICMjIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zXG4gICAgICpcbiAgICAgKiBXaGVuIGRlc2lnbmluZyB3ZWIgYXBwbGljYXRpb25zLCBjb25zaWRlciBzZWN1cml0eSB0aHJlYXRzIGZyb206XG4gICAgICpcbiAgICAgKiAtIFtKU09OIHZ1bG5lcmFiaWxpdHldKGh0dHA6Ly9oYWFja2VkLmNvbS9hcmNoaXZlLzIwMDgvMTEvMjAvYW5hdG9teS1vZi1hLXN1YnRsZS1qc29uLXZ1bG5lcmFiaWxpdHkuYXNweClcbiAgICAgKiAtIFtYU1JGXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nyb3NzLXNpdGVfcmVxdWVzdF9mb3JnZXJ5KVxuICAgICAqXG4gICAgICogQm90aCBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgbXVzdCBjb29wZXJhdGUgaW4gb3JkZXIgdG8gZWxpbWluYXRlIHRoZXNlIHRocmVhdHMuIEFuZ3VsYXIgY29tZXNcbiAgICAgKiBwcmUtY29uZmlndXJlZCB3aXRoIHN0cmF0ZWdpZXMgdGhhdCBhZGRyZXNzIHRoZXNlIGlzc3VlcywgYnV0IGZvciB0aGlzIHRvIHdvcmsgYmFja2VuZCBzZXJ2ZXJcbiAgICAgKiBjb29wZXJhdGlvbiBpcyByZXF1aXJlZC5cbiAgICAgKlxuICAgICAqICMjIyBKU09OIFZ1bG5lcmFiaWxpdHkgUHJvdGVjdGlvblxuICAgICAqXG4gICAgICogQSBbSlNPTiB2dWxuZXJhYmlsaXR5XShodHRwOi8vaGFhY2tlZC5jb20vYXJjaGl2ZS8yMDA4LzExLzIwL2FuYXRvbXktb2YtYS1zdWJ0bGUtanNvbi12dWxuZXJhYmlsaXR5LmFzcHgpXG4gICAgICogYWxsb3dzIHRoaXJkIHBhcnR5IHdlYnNpdGUgdG8gdHVybiB5b3VyIEpTT04gcmVzb3VyY2UgVVJMIGludG9cbiAgICAgKiBbSlNPTlBdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSlNPTlApIHJlcXVlc3QgdW5kZXIgc29tZSBjb25kaXRpb25zLiBUb1xuICAgICAqIGNvdW50ZXIgdGhpcyB5b3VyIHNlcnZlciBjYW4gcHJlZml4IGFsbCBKU09OIHJlcXVlc3RzIHdpdGggZm9sbG93aW5nIHN0cmluZyBgXCIpXX0nLFxcblwiYC5cbiAgICAgKiBBbmd1bGFyIHdpbGwgYXV0b21hdGljYWxseSBzdHJpcCB0aGUgcHJlZml4IGJlZm9yZSBwcm9jZXNzaW5nIGl0IGFzIEpTT04uXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSBpZiB5b3VyIHNlcnZlciBuZWVkcyB0byByZXR1cm46XG4gICAgICogYGBganNcbiAgICAgKiBbJ29uZScsJ3R3byddXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiB3aGljaCBpcyB2dWxuZXJhYmxlIHRvIGF0dGFjaywgeW91ciBzZXJ2ZXIgY2FuIHJldHVybjpcbiAgICAgKiBgYGBqc1xuICAgICAqICldfScsXG4gICAgICogWydvbmUnLCd0d28nXVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW5ndWxhciB3aWxsIHN0cmlwIHRoZSBwcmVmaXgsIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBKU09OLlxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIyMgQ3Jvc3MgU2l0ZSBSZXF1ZXN0IEZvcmdlcnkgKFhTUkYpIFByb3RlY3Rpb25cbiAgICAgKlxuICAgICAqIFtYU1JGXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nyb3NzLXNpdGVfcmVxdWVzdF9mb3JnZXJ5KSBpcyBhbiBhdHRhY2sgdGVjaG5pcXVlIGJ5XG4gICAgICogd2hpY2ggdGhlIGF0dGFja2VyIGNhbiB0cmljayBhbiBhdXRoZW50aWNhdGVkIHVzZXIgaW50byB1bmtub3dpbmdseSBleGVjdXRpbmcgYWN0aW9ucyBvbiB5b3VyXG4gICAgICogd2Vic2l0ZS4gQW5ndWxhciBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBjb3VudGVyIFhTUkYuIFdoZW4gcGVyZm9ybWluZyBYSFIgcmVxdWVzdHMsIHRoZVxuICAgICAqICRodHRwIHNlcnZpY2UgcmVhZHMgYSB0b2tlbiBmcm9tIGEgY29va2llIChieSBkZWZhdWx0LCBgWFNSRi1UT0tFTmApIGFuZCBzZXRzIGl0IGFzIGFuIEhUVFBcbiAgICAgKiBoZWFkZXIgKGBYLVhTUkYtVE9LRU5gKS4gU2luY2Ugb25seSBKYXZhU2NyaXB0IHRoYXQgcnVucyBvbiB5b3VyIGRvbWFpbiBjb3VsZCByZWFkIHRoZVxuICAgICAqIGNvb2tpZSwgeW91ciBzZXJ2ZXIgY2FuIGJlIGFzc3VyZWQgdGhhdCB0aGUgWEhSIGNhbWUgZnJvbSBKYXZhU2NyaXB0IHJ1bm5pbmcgb24geW91ciBkb21haW4uXG4gICAgICogVGhlIGhlYWRlciB3aWxsIG5vdCBiZSBzZXQgZm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIFRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMsIHlvdXIgc2VydmVyIG5lZWRzIHRvIHNldCBhIHRva2VuIGluIGEgSmF2YVNjcmlwdCByZWFkYWJsZSBzZXNzaW9uXG4gICAgICogY29va2llIGNhbGxlZCBgWFNSRi1UT0tFTmAgb24gdGhlIGZpcnN0IEhUVFAgR0VUIHJlcXVlc3QuIE9uIHN1YnNlcXVlbnQgWEhSIHJlcXVlc3RzIHRoZVxuICAgICAqIHNlcnZlciBjYW4gdmVyaWZ5IHRoYXQgdGhlIGNvb2tpZSBtYXRjaGVzIGBYLVhTUkYtVE9LRU5gIEhUVFAgaGVhZGVyLCBhbmQgdGhlcmVmb3JlIGJlIHN1cmVcbiAgICAgKiB0aGF0IG9ubHkgSmF2YVNjcmlwdCBydW5uaW5nIG9uIHlvdXIgZG9tYWluIGNvdWxkIGhhdmUgc2VudCB0aGUgcmVxdWVzdC4gVGhlIHRva2VuIG11c3QgYmVcbiAgICAgKiB1bmlxdWUgZm9yIGVhY2ggdXNlciBhbmQgbXVzdCBiZSB2ZXJpZmlhYmxlIGJ5IHRoZSBzZXJ2ZXIgKHRvIHByZXZlbnQgdGhlIEphdmFTY3JpcHQgZnJvbVxuICAgICAqIG1ha2luZyB1cCBpdHMgb3duIHRva2VucykuIFdlIHJlY29tbWVuZCB0aGF0IHRoZSB0b2tlbiBpcyBhIGRpZ2VzdCBvZiB5b3VyIHNpdGUnc1xuICAgICAqIGF1dGhlbnRpY2F0aW9uIGNvb2tpZSB3aXRoIGEgW3NhbHRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NhbHRfKGNyeXB0b2dyYXBoeSYjNDE7KVxuICAgICAqIGZvciBhZGRlZCBzZWN1cml0eS5cbiAgICAgKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXJzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHhzcmZIZWFkZXJOYW1lIGFuZCB4c3JmQ29va2llTmFtZVxuICAgICAqIHByb3BlcnRpZXMgb2YgZWl0aGVyICRodHRwUHJvdmlkZXIuZGVmYXVsdHMgYXQgY29uZmlnLXRpbWUsICRodHRwLmRlZmF1bHRzIGF0IHJ1bi10aW1lLFxuICAgICAqIG9yIHRoZSBwZXItcmVxdWVzdCBjb25maWcgb2JqZWN0LlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG8gcHJldmVudCBjb2xsaXNpb25zIGluIGVudmlyb25tZW50cyB3aGVyZSBtdWx0aXBsZSBBbmd1bGFyIGFwcHMgc2hhcmUgdGhlXG4gICAgICogc2FtZSBkb21haW4gb3Igc3ViZG9tYWluLCB3ZSByZWNvbW1lbmQgdGhhdCBlYWNoIGFwcGxpY2F0aW9uIHVzZXMgdW5pcXVlIGNvb2tpZSBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBPYmplY3QgZGVzY3JpYmluZyB0aGUgcmVxdWVzdCB0byBiZSBtYWRlIGFuZCBob3cgaXQgc2hvdWxkIGJlXG4gICAgICogICAgcHJvY2Vzc2VkLiBUaGUgb2JqZWN0IGhhcyBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgKlxuICAgICAqICAgIC0gKiptZXRob2QqKiDigJMgYHtzdHJpbmd9YCDigJMgSFRUUCBtZXRob2QgKGUuZy4gJ0dFVCcsICdQT1NUJywgZXRjKVxuICAgICAqICAgIC0gKip1cmwqKiDigJMgYHtzdHJpbmd8VHJ1c3RlZE9iamVjdH1gIOKAkyBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkO1xuICAgICAqICAgICAgb3IgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGAkc2NlLnRydXN0QXNSZXNvdXJjZVVybCh1cmwpYC5cbiAgICAgKiAgICAtICoqcGFyYW1zKiog4oCTIGB7T2JqZWN0LjxzdHJpbmd8T2JqZWN0Pn1gIOKAkyBNYXAgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdoaWNoIHdpbGwgYmUgc2VyaWFsaXplZFxuICAgICAqICAgICAgd2l0aCB0aGUgYHBhcmFtU2VyaWFsaXplcmAgYW5kIGFwcGVuZGVkIGFzIEdFVCBwYXJhbWV0ZXJzLlxuICAgICAqICAgIC0gKipkYXRhKiog4oCTIGB7c3RyaW5nfE9iamVjdH1gIOKAkyBEYXRhIHRvIGJlIHNlbnQgYXMgdGhlIHJlcXVlc3QgbWVzc2FnZSBkYXRhLlxuICAgICAqICAgIC0gKipoZWFkZXJzKiog4oCTIGB7T2JqZWN0fWAg4oCTIE1hcCBvZiBzdHJpbmdzIG9yIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gc3RyaW5ncyByZXByZXNlbnRpbmdcbiAgICAgKiAgICAgIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuIElmIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBudWxsLCB0aGVcbiAgICAgKiAgICAgIGhlYWRlciB3aWxsIG5vdCBiZSBzZW50LiBGdW5jdGlvbnMgYWNjZXB0IGEgY29uZmlnIG9iamVjdCBhcyBhbiBhcmd1bWVudC5cbiAgICAgKiAgICAtICoqZXZlbnRIYW5kbGVycyoqIC0gYHtPYmplY3R9YCAtIEV2ZW50IGxpc3RlbmVycyB0byBiZSBib3VuZCB0byB0aGUgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0LlxuICAgICAqICAgICAgVG8gYmluZCBldmVudHMgdG8gdGhlIFhNTEh0dHBSZXF1ZXN0IHVwbG9hZCBvYmplY3QsIHVzZSBgdXBsb2FkRXZlbnRIYW5kbGVyc2AuXG4gICAgICogICAgICBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZiBhIGAkYXBwbHlgIGJsb2NrLlxuICAgICAqICAgIC0gKip1cGxvYWRFdmVudEhhbmRsZXJzKiogLSBge09iamVjdH1gIC0gRXZlbnQgbGlzdGVuZXJzIHRvIGJlIGJvdW5kIHRvIHRoZSBYTUxIdHRwUmVxdWVzdCB1cGxvYWRcbiAgICAgKiAgICAgIG9iamVjdC4gVG8gYmluZCBldmVudHMgdG8gdGhlIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCwgdXNlIGBldmVudEhhbmRsZXJzYC5cbiAgICAgKiAgICAgIFRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBjb250ZXh0IG9mIGEgYCRhcHBseWAgYmxvY2suXG4gICAgICogICAgLSAqKnhzcmZIZWFkZXJOYW1lKiog4oCTIGB7c3RyaW5nfWAg4oCTIE5hbWUgb2YgSFRUUCBoZWFkZXIgdG8gcG9wdWxhdGUgd2l0aCB0aGUgWFNSRiB0b2tlbi5cbiAgICAgKiAgICAtICoqeHNyZkNvb2tpZU5hbWUqKiDigJMgYHtzdHJpbmd9YCDigJMgTmFtZSBvZiBjb29raWUgY29udGFpbmluZyB0aGUgWFNSRiB0b2tlbi5cbiAgICAgKiAgICAtICoqdHJhbnNmb3JtUmVxdWVzdCoqIOKAk1xuICAgICAqICAgICAgYHtmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyKXxBcnJheS48ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcik+fWAg4oCTXG4gICAgICogICAgICB0cmFuc2Zvcm0gZnVuY3Rpb24gb3IgYW4gYXJyYXkgb2Ygc3VjaCBmdW5jdGlvbnMuIFRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gdGFrZXMgdGhlIGh0dHBcbiAgICAgKiAgICAgIHJlcXVlc3QgYm9keSBhbmQgaGVhZGVycyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBzZXJpYWxpemVkKSB2ZXJzaW9uLlxuICAgICAqICAgICAgU2VlIHtAbGluayBuZy4kaHR0cCNvdmVycmlkaW5nLXRoZS1kZWZhdWx0LXRyYW5zZm9ybWF0aW9ucy1wZXItcmVxdWVzdFxuICAgICAqICAgICAgT3ZlcnJpZGluZyB0aGUgRGVmYXVsdCBUcmFuc2Zvcm1hdGlvbnN9XG4gICAgICogICAgLSAqKnRyYW5zZm9ybVJlc3BvbnNlKiog4oCTXG4gICAgICogICAgICBge2Z1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIsIHN0YXR1cyl8QXJyYXkuPGZ1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIsIHN0YXR1cyk+fWAg4oCTXG4gICAgICogICAgICB0cmFuc2Zvcm0gZnVuY3Rpb24gb3IgYW4gYXJyYXkgb2Ygc3VjaCBmdW5jdGlvbnMuIFRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gdGFrZXMgdGhlIGh0dHBcbiAgICAgKiAgICAgIHJlc3BvbnNlIGJvZHksIGhlYWRlcnMgYW5kIHN0YXR1cyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBkZXNlcmlhbGl6ZWQpIHZlcnNpb24uXG4gICAgICogICAgICBTZWUge0BsaW5rIG5nLiRodHRwI292ZXJyaWRpbmctdGhlLWRlZmF1bHQtdHJhbnNmb3JtYXRpb25zLXBlci1yZXF1ZXN0XG4gICAgICogICAgICBPdmVycmlkaW5nIHRoZSBEZWZhdWx0IFRyYW5zZm9ybWF0aW9uc31cbiAgICAgKiAgICAtICoqcGFyYW1TZXJpYWxpemVyKiogLSBge3N0cmluZ3xmdW5jdGlvbihPYmplY3Q8c3RyaW5nLHN0cmluZz4pOnN0cmluZ31gIC0gQSBmdW5jdGlvbiB1c2VkIHRvXG4gICAgICogICAgICBwcmVwYXJlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcmVxdWVzdCBwYXJhbWV0ZXJzIChzcGVjaWZpZWQgYXMgYW4gb2JqZWN0KS5cbiAgICAgKiAgICAgIElmIHNwZWNpZmllZCBhcyBzdHJpbmcsIGl0IGlzIGludGVycHJldGVkIGFzIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGVcbiAgICAgKiAgICAgIHtAbGluayAkaW5qZWN0b3IgJGluamVjdG9yfSwgd2hpY2ggbWVhbnMgeW91IGNhbiBjcmVhdGUgeW91ciBvd24gc2VyaWFsaXplclxuICAgICAqICAgICAgYnkgcmVnaXN0ZXJpbmcgaXQgYXMgYSB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlIHNlcnZpY2V9LlxuICAgICAqICAgICAgVGhlIGRlZmF1bHQgc2VyaWFsaXplciBpcyB0aGUge0BsaW5rICRodHRwUGFyYW1TZXJpYWxpemVyICRodHRwUGFyYW1TZXJpYWxpemVyfTtcbiAgICAgKiAgICAgIGFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSB7QGxpbmsgJGh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2UgJGh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2V9XG4gICAgICogICAgLSAqKmNhY2hlKiog4oCTIGB7Ym9vbGVhbnxPYmplY3R9YCDigJMgQSBib29sZWFuIHZhbHVlIG9yIG9iamVjdCBjcmVhdGVkIHdpdGhcbiAgICAgKiAgICAgIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5IGAkY2FjaGVGYWN0b3J5YH0gdG8gZW5hYmxlIG9yIGRpc2FibGUgY2FjaGluZyBvZiB0aGUgSFRUUCByZXNwb25zZS5cbiAgICAgKiAgICAgIFNlZSB7QGxpbmsgJGh0dHAjY2FjaGluZyAkaHR0cCBDYWNoaW5nfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiAgICAtICoqdGltZW91dCoqIOKAkyBge251bWJlcnxQcm9taXNlfWAg4oCTIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciB7QGxpbmsgbmcuJHEgcHJvbWlzZX1cbiAgICAgKiAgICAgIHRoYXQgc2hvdWxkIGFib3J0IHRoZSByZXF1ZXN0IHdoZW4gcmVzb2x2ZWQuXG4gICAgICogICAgLSAqKndpdGhDcmVkZW50aWFscyoqIC0gYHtib29sZWFufWAgLSB3aGV0aGVyIHRvIHNldCB0aGUgYHdpdGhDcmVkZW50aWFsc2AgZmxhZyBvbiB0aGVcbiAgICAgKiAgICAgIFhIUiBvYmplY3QuIFNlZSBbcmVxdWVzdHMgd2l0aCBjcmVkZW50aWFsc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRUUC9BY2Nlc3NfY29udHJvbF9DT1JTI1JlcXVlc3RzX3dpdGhfY3JlZGVudGlhbHMpXG4gICAgICogICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiAgICAtICoqcmVzcG9uc2VUeXBlKiogLSBge3N0cmluZ31gIC0gc2VlXG4gICAgICogICAgICBbWE1MSHR0cFJlcXVlc3QucmVzcG9uc2VUeXBlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QjeG1saHR0cHJlcXVlc3QtcmVzcG9uc2V0eXBlKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gUmV0dXJucyBhIHtAbGluayBuZy4kcSBgUHJvbWlzZX1gIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB0byBhIHJlc3BvbnNlIG9iamVjdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgcmVxdWVzdCBzdWNjZWVkcyBvciBmYWlscy5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtBcnJheS48T2JqZWN0Pn0gcGVuZGluZ1JlcXVlc3RzIEFycmF5IG9mIGNvbmZpZyBvYmplY3RzIGZvciBjdXJyZW50bHkgcGVuZGluZ1xuICAgICAqICAgcmVxdWVzdHMuIFRoaXMgaXMgcHJpbWFyaWx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgKlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbjxleGFtcGxlIG1vZHVsZT1cImh0dHBFeGFtcGxlXCIgbmFtZT1cImh0dHAtc2VydmljZVwiPlxuPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgPGRpdiBuZy1jb250cm9sbGVyPVwiRmV0Y2hDb250cm9sbGVyXCI+XG4gICAgPHNlbGVjdCBuZy1tb2RlbD1cIm1ldGhvZFwiIGFyaWEtbGFiZWw9XCJSZXF1ZXN0IG1ldGhvZFwiPlxuICAgICAgPG9wdGlvbj5HRVQ8L29wdGlvbj5cbiAgICAgIDxvcHRpb24+SlNPTlA8L29wdGlvbj5cbiAgICA8L3NlbGVjdD5cbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cInVybFwiIHNpemU9XCI4MFwiIGFyaWEtbGFiZWw9XCJVUkxcIiAvPlxuICAgIDxidXR0b24gaWQ9XCJmZXRjaGJ0blwiIG5nLWNsaWNrPVwiZmV0Y2goKVwiPmZldGNoPC9idXR0b24+PGJyPlxuICAgIDxidXR0b24gaWQ9XCJzYW1wbGVnZXRidG5cIiBuZy1jbGljaz1cInVwZGF0ZU1vZGVsKCdHRVQnLCAnaHR0cC1oZWxsby5odG1sJylcIj5TYW1wbGUgR0VUPC9idXR0b24+XG4gICAgPGJ1dHRvbiBpZD1cInNhbXBsZWpzb25wYnRuXCJcbiAgICAgIG5nLWNsaWNrPVwidXBkYXRlTW9kZWwoJ0pTT05QJyxcbiAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vYW5ndWxhcmpzLm9yZy9ncmVldC5waHA/bmFtZT1TdXBlciUyMEhlcm8nKVwiPlxuICAgICAgU2FtcGxlIEpTT05QXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBpZD1cImludmFsaWRqc29ucGJ0blwiXG4gICAgICBuZy1jbGljaz1cInVwZGF0ZU1vZGVsKCdKU09OUCcsICdodHRwczovL2FuZ3VsYXJqcy5vcmcvZG9lc250ZXhpc3QnKVwiPlxuICAgICAgICBJbnZhbGlkIEpTT05QXG4gICAgICA8L2J1dHRvbj5cbiAgICA8cHJlPmh0dHAgc3RhdHVzIGNvZGU6IHt7c3RhdHVzfX08L3ByZT5cbiAgICA8cHJlPmh0dHAgcmVzcG9uc2UgZGF0YToge3tkYXRhfX08L3ByZT5cbiAgPC9kaXY+XG48L2ZpbGU+XG48ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gIGFuZ3VsYXIubW9kdWxlKCdodHRwRXhhbXBsZScsIFtdKVxuICAgIC5jb25maWcoWyckc2NlRGVsZWdhdGVQcm92aWRlcicsIGZ1bmN0aW9uKCRzY2VEZWxlZ2F0ZVByb3ZpZGVyKSB7XG4gICAgICAvLyBXZSBtdXN0IHdoaXRlbGlzdCB0aGUgSlNPTlAgZW5kcG9pbnQgdGhhdCB3ZSBhcmUgdXNpbmcgdG8gc2hvdyB0aGF0IHdlIHRydXN0IGl0XG4gICAgICAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybFdoaXRlbGlzdChbXG4gICAgICAgICdzZWxmJyxcbiAgICAgICAgJ2h0dHBzOi8vYW5ndWxhcmpzLm9yZy8qKidcbiAgICAgIF0pO1xuICAgIH1dKVxuICAgIC5jb250cm9sbGVyKCdGZXRjaENvbnRyb2xsZXInLCBbJyRzY29wZScsICckaHR0cCcsICckdGVtcGxhdGVDYWNoZScsXG4gICAgICBmdW5jdGlvbigkc2NvcGUsICRodHRwLCAkdGVtcGxhdGVDYWNoZSkge1xuICAgICAgICAkc2NvcGUubWV0aG9kID0gJ0dFVCc7XG4gICAgICAgICRzY29wZS51cmwgPSAnaHR0cC1oZWxsby5odG1sJztcblxuICAgICAgICAkc2NvcGUuZmV0Y2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkc2NvcGUuY29kZSA9IG51bGw7XG4gICAgICAgICAgJHNjb3BlLnJlc3BvbnNlID0gbnVsbDtcblxuICAgICAgICAgICRodHRwKHttZXRob2Q6ICRzY29wZS5tZXRob2QsIHVybDogJHNjb3BlLnVybCwgY2FjaGU6ICR0ZW1wbGF0ZUNhY2hlfSkuXG4gICAgICAgICAgICB0aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICAgICRzY29wZS5kYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICRzY29wZS5kYXRhID0gcmVzcG9uc2UuZGF0YSB8fCAnUmVxdWVzdCBmYWlsZWQnO1xuICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgICRzY29wZS51cGRhdGVNb2RlbCA9IGZ1bmN0aW9uKG1ldGhvZCwgdXJsKSB7XG4gICAgICAgICAgJHNjb3BlLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgICAkc2NvcGUudXJsID0gdXJsO1xuICAgICAgICB9O1xuICAgICAgfV0pO1xuPC9maWxlPlxuPGZpbGUgbmFtZT1cImh0dHAtaGVsbG8uaHRtbFwiPlxuICBIZWxsbywgJGh0dHAhXG48L2ZpbGU+XG48ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gIHZhciBzdGF0dXMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3N0YXR1cycpKTtcbiAgdmFyIGRhdGEgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2RhdGEnKSk7XG4gIHZhciBmZXRjaEJ0biA9IGVsZW1lbnQoYnkuaWQoJ2ZldGNoYnRuJykpO1xuICB2YXIgc2FtcGxlR2V0QnRuID0gZWxlbWVudChieS5pZCgnc2FtcGxlZ2V0YnRuJykpO1xuICB2YXIgaW52YWxpZEpzb25wQnRuID0gZWxlbWVudChieS5pZCgnaW52YWxpZGpzb25wYnRuJykpO1xuXG4gIGl0KCdzaG91bGQgbWFrZSBhbiB4aHIgR0VUIHJlcXVlc3QnLCBmdW5jdGlvbigpIHtcbiAgICBzYW1wbGVHZXRCdG4uY2xpY2soKTtcbiAgICBmZXRjaEJ0bi5jbGljaygpO1xuICAgIGV4cGVjdChzdGF0dXMuZ2V0VGV4dCgpKS50b01hdGNoKCcyMDAnKTtcbiAgICBleHBlY3QoZGF0YS5nZXRUZXh0KCkpLnRvTWF0Y2goL0hlbGxvLCBcXCRodHRwIS8pO1xuICB9KTtcblxuLy8gQ29tbWVudGVkIG91dCBkdWUgdG8gZmxha2VzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvOTE4NVxuLy8gaXQoJ3Nob3VsZCBtYWtlIGEgSlNPTlAgcmVxdWVzdCB0byBhbmd1bGFyanMub3JnJywgZnVuY3Rpb24oKSB7XG4vLyAgIHZhciBzYW1wbGVKc29ucEJ0biA9IGVsZW1lbnQoYnkuaWQoJ3NhbXBsZWpzb25wYnRuJykpO1xuLy8gICBzYW1wbGVKc29ucEJ0bi5jbGljaygpO1xuLy8gICBmZXRjaEJ0bi5jbGljaygpO1xuLy8gICBleHBlY3Qoc3RhdHVzLmdldFRleHQoKSkudG9NYXRjaCgnMjAwJyk7XG4vLyAgIGV4cGVjdChkYXRhLmdldFRleHQoKSkudG9NYXRjaCgvU3VwZXIgSGVybyEvKTtcbi8vIH0pO1xuXG4gIGl0KCdzaG91bGQgbWFrZSBKU09OUCByZXF1ZXN0IHRvIGludmFsaWQgVVJMIGFuZCBpbnZva2UgdGhlIGVycm9yIGhhbmRsZXInLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgaW52YWxpZEpzb25wQnRuLmNsaWNrKCk7XG4gICAgZmV0Y2hCdG4uY2xpY2soKTtcbiAgICBleHBlY3Qoc3RhdHVzLmdldFRleHQoKSkudG9NYXRjaCgnMCcpO1xuICAgIGV4cGVjdChkYXRhLmdldFRleHQoKSkudG9NYXRjaCgnUmVxdWVzdCBmYWlsZWQnKTtcbiAgfSk7XG48L2ZpbGU+XG48L2V4YW1wbGU+XG4gICAgICovXG4gICAgZnVuY3Rpb24gJGh0dHAocmVxdWVzdENvbmZpZykge1xuXG4gICAgICBpZiAoIWlzT2JqZWN0KHJlcXVlc3RDb25maWcpKSB7XG4gICAgICAgIHRocm93IG1pbkVycignJGh0dHAnKSgnYmFkcmVxJywgJ0h0dHAgcmVxdWVzdCBjb25maWd1cmF0aW9uIG11c3QgYmUgYW4gb2JqZWN0LiAgUmVjZWl2ZWQ6IHswfScsIHJlcXVlc3RDb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzU3RyaW5nKCRzY2UudmFsdWVPZihyZXF1ZXN0Q29uZmlnLnVybCkpKSB7XG4gICAgICAgIHRocm93IG1pbkVycignJGh0dHAnKSgnYmFkcmVxJywgJ0h0dHAgcmVxdWVzdCBjb25maWd1cmF0aW9uIHVybCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgJHNjZSB0cnVzdGVkIG9iamVjdC4gIFJlY2VpdmVkOiB7MH0nLCByZXF1ZXN0Q29uZmlnLnVybCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb25maWcgPSBleHRlbmQoe1xuICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0LFxuICAgICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgIHBhcmFtU2VyaWFsaXplcjogZGVmYXVsdHMucGFyYW1TZXJpYWxpemVyLFxuICAgICAgICBqc29ucENhbGxiYWNrUGFyYW06IGRlZmF1bHRzLmpzb25wQ2FsbGJhY2tQYXJhbVxuICAgICAgfSwgcmVxdWVzdENvbmZpZyk7XG5cbiAgICAgIGNvbmZpZy5oZWFkZXJzID0gbWVyZ2VIZWFkZXJzKHJlcXVlc3RDb25maWcpO1xuICAgICAgY29uZmlnLm1ldGhvZCA9IHVwcGVyY2FzZShjb25maWcubWV0aG9kKTtcbiAgICAgIGNvbmZpZy5wYXJhbVNlcmlhbGl6ZXIgPSBpc1N0cmluZyhjb25maWcucGFyYW1TZXJpYWxpemVyKSA/XG4gICAgICAgICAgJGluamVjdG9yLmdldChjb25maWcucGFyYW1TZXJpYWxpemVyKSA6IGNvbmZpZy5wYXJhbVNlcmlhbGl6ZXI7XG5cbiAgICAgICRicm93c2VyLiQkaW5jT3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQoKTtcblxuICAgICAgdmFyIHJlcXVlc3RJbnRlcmNlcHRvcnMgPSBbXTtcbiAgICAgIHZhciByZXNwb25zZUludGVyY2VwdG9ycyA9IFtdO1xuICAgICAgdmFyIHByb21pc2UgPSAkcS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgICAgIC8vIGFwcGx5IGludGVyY2VwdG9yc1xuICAgICAgZm9yRWFjaChyZXZlcnNlZEludGVyY2VwdG9ycywgZnVuY3Rpb24oaW50ZXJjZXB0b3IpIHtcbiAgICAgICAgaWYgKGludGVyY2VwdG9yLnJlcXVlc3QgfHwgaW50ZXJjZXB0b3IucmVxdWVzdEVycm9yKSB7XG4gICAgICAgICAgcmVxdWVzdEludGVyY2VwdG9ycy51bnNoaWZ0KGludGVyY2VwdG9yLnJlcXVlc3QsIGludGVyY2VwdG9yLnJlcXVlc3RFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9yLnJlc3BvbnNlIHx8IGludGVyY2VwdG9yLnJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICByZXNwb25zZUludGVyY2VwdG9ycy5wdXNoKGludGVyY2VwdG9yLnJlc3BvbnNlLCBpbnRlcmNlcHRvci5yZXNwb25zZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHByb21pc2UgPSBjaGFpbkludGVyY2VwdG9ycyhwcm9taXNlLCByZXF1ZXN0SW50ZXJjZXB0b3JzKTtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oc2VydmVyUmVxdWVzdCk7XG4gICAgICBwcm9taXNlID0gY2hhaW5JbnRlcmNlcHRvcnMocHJvbWlzZSwgcmVzcG9uc2VJbnRlcmNlcHRvcnMpO1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UuZmluYWxseShjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdCk7XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuXG5cbiAgICAgIGZ1bmN0aW9uIGNoYWluSW50ZXJjZXB0b3JzKHByb21pc2UsIGludGVyY2VwdG9ycykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbnRlcmNlcHRvcnMubGVuZ3RoOyBpIDwgaWk7KSB7XG4gICAgICAgICAgdmFyIHRoZW5GbiA9IGludGVyY2VwdG9yc1tpKytdO1xuICAgICAgICAgIHZhciByZWplY3RGbiA9IGludGVyY2VwdG9yc1tpKytdO1xuXG4gICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbih0aGVuRm4sIHJlamVjdEZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGludGVyY2VwdG9ycy5sZW5ndGggPSAwO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdCgpIHtcbiAgICAgICAgJGJyb3dzZXIuJCRjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdChub29wKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZXhlY3V0ZUhlYWRlckZucyhoZWFkZXJzLCBjb25maWcpIHtcbiAgICAgICAgdmFyIGhlYWRlckNvbnRlbnQsIHByb2Nlc3NlZEhlYWRlcnMgPSB7fTtcblxuICAgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKGhlYWRlckZuLCBoZWFkZXIpIHtcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihoZWFkZXJGbikpIHtcbiAgICAgICAgICAgIGhlYWRlckNvbnRlbnQgPSBoZWFkZXJGbihjb25maWcpO1xuICAgICAgICAgICAgaWYgKGhlYWRlckNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcm9jZXNzZWRIZWFkZXJzW2hlYWRlcl0gPSBoZWFkZXJDb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzZWRIZWFkZXJzW2hlYWRlcl0gPSBoZWFkZXJGbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwcm9jZXNzZWRIZWFkZXJzO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBtZXJnZUhlYWRlcnMoY29uZmlnKSB7XG4gICAgICAgIHZhciBkZWZIZWFkZXJzID0gZGVmYXVsdHMuaGVhZGVycyxcbiAgICAgICAgICAgIHJlcUhlYWRlcnMgPSBleHRlbmQoe30sIGNvbmZpZy5oZWFkZXJzKSxcbiAgICAgICAgICAgIGRlZkhlYWRlck5hbWUsIGxvd2VyY2FzZURlZkhlYWRlck5hbWUsIHJlcUhlYWRlck5hbWU7XG5cbiAgICAgICAgZGVmSGVhZGVycyA9IGV4dGVuZCh7fSwgZGVmSGVhZGVycy5jb21tb24sIGRlZkhlYWRlcnNbbG93ZXJjYXNlKGNvbmZpZy5tZXRob2QpXSk7XG5cbiAgICAgICAgLy8gdXNpbmcgZm9yLWluIGluc3RlYWQgb2YgZm9yRWFjaCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBpdGVyYXRpb24gYWZ0ZXIgaGVhZGVyIGhhcyBiZWVuIGZvdW5kXG4gICAgICAgIGRlZmF1bHRIZWFkZXJzSXRlcmF0aW9uOlxuICAgICAgICBmb3IgKGRlZkhlYWRlck5hbWUgaW4gZGVmSGVhZGVycykge1xuICAgICAgICAgIGxvd2VyY2FzZURlZkhlYWRlck5hbWUgPSBsb3dlcmNhc2UoZGVmSGVhZGVyTmFtZSk7XG5cbiAgICAgICAgICBmb3IgKHJlcUhlYWRlck5hbWUgaW4gcmVxSGVhZGVycykge1xuICAgICAgICAgICAgaWYgKGxvd2VyY2FzZShyZXFIZWFkZXJOYW1lKSA9PT0gbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSkge1xuICAgICAgICAgICAgICBjb250aW51ZSBkZWZhdWx0SGVhZGVyc0l0ZXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXFIZWFkZXJzW2RlZkhlYWRlck5hbWVdID0gZGVmSGVhZGVyc1tkZWZIZWFkZXJOYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV4ZWN1dGUgaWYgaGVhZGVyIHZhbHVlIGlzIGEgZnVuY3Rpb24gZm9yIG1lcmdlZCBoZWFkZXJzXG4gICAgICAgIHJldHVybiBleGVjdXRlSGVhZGVyRm5zKHJlcUhlYWRlcnMsIHNoYWxsb3dDb3B5KGNvbmZpZykpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzZXJ2ZXJSZXF1ZXN0KGNvbmZpZykge1xuICAgICAgICB2YXIgaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuICAgICAgICB2YXIgcmVxRGF0YSA9IHRyYW5zZm9ybURhdGEoY29uZmlnLmRhdGEsIGhlYWRlcnNHZXR0ZXIoaGVhZGVycyksIHVuZGVmaW5lZCwgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3QpO1xuXG4gICAgICAgIC8vIHN0cmlwIGNvbnRlbnQtdHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgICAgICBpZiAoaXNVbmRlZmluZWQocmVxRGF0YSkpIHtcbiAgICAgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKHZhbHVlLCBoZWFkZXIpIHtcbiAgICAgICAgICAgIGlmIChsb3dlcmNhc2UoaGVhZGVyKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSAmJiAhaXNVbmRlZmluZWQoZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgICAgIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgPSBkZWZhdWx0cy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZW5kIHJlcXVlc3RcbiAgICAgICAgcmV0dXJuIHNlbmRSZXEoY29uZmlnLCByZXFEYXRhKS50aGVuKHRyYW5zZm9ybVJlc3BvbnNlLCB0cmFuc2Zvcm1SZXNwb25zZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgICAgIC8vIG1ha2UgYSBjb3B5IHNpbmNlIHRoZSByZXNwb25zZSBtdXN0IGJlIGNhY2hlYWJsZVxuICAgICAgICB2YXIgcmVzcCA9IGV4dGVuZCh7fSwgcmVzcG9uc2UpO1xuICAgICAgICByZXNwLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UpO1xuICAgICAgICByZXR1cm4gKGlzU3VjY2VzcyhyZXNwb25zZS5zdGF0dXMpKVxuICAgICAgICAgID8gcmVzcFxuICAgICAgICAgIDogJHEucmVqZWN0KHJlc3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgICRodHRwLnBlbmRpbmdSZXF1ZXN0cyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRodHRwI2dldFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYEdFVGAgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFRydXN0ZWRPYmplY3R9IHVybCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhbiBvYmplY3QgY3JlYXRlZCBieSBhIGNhbGwgdG8gYCRzY2UudHJ1c3RBc1Jlc291cmNlVXJsKHVybClgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJGh0dHAjZGVsZXRlXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgREVMRVRFYCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VHJ1c3RlZE9iamVjdH0gdXJsIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQ7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIG9iamVjdCBjcmVhdGVkIGJ5IGEgY2FsbCB0byBgJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodXJsKWAuXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3RcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkaHR0cCNoZWFkXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgSEVBRGAgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFRydXN0ZWRPYmplY3R9IHVybCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhbiBvYmplY3QgY3JlYXRlZCBieSBhIGNhbGwgdG8gYCRzY2UudHJ1c3RBc1Jlc291cmNlVXJsKHVybClgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJGh0dHAjanNvbnBcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBKU09OUGAgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCwgc2luY2UgSlNPTlAgcmVxdWVzdHMgYXJlIHNlbnNpdGl2ZSBiZWNhdXNlIHRoZSByZXNwb25zZSBpcyBnaXZlbiBmdWxsIGFjY2VzcyB0byB0aGUgYnJvd3NlcixcbiAgICAgKiB0aGUgdXJsIG11c3QgYmUgZGVjbGFyZWQsIHZpYSB7QGxpbmsgJHNjZX0gYXMgYSB0cnVzdGVkIHJlc291cmNlIFVSTC5cbiAgICAgKiBZb3UgY2FuIHRydXN0IGEgVVJMIGJ5IGFkZGluZyBpdCB0byB0aGUgd2hpdGVsaXN0IHZpYVxuICAgICAqIHtAbGluayAkc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCAgYCRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0YH0gb3JcbiAgICAgKiBieSBleHBsaWNpdGx5IHRydXN0aW5nIHRoZSBVUkwgdmlhIHtAbGluayAkc2NlI3RydXN0QXNSZXNvdXJjZVVybCBgJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodXJsKWB9LlxuICAgICAqXG4gICAgICogSlNPTlAgcmVxdWVzdHMgbXVzdCBzcGVjaWZ5IGEgY2FsbGJhY2sgdG8gYmUgdXNlZCBpbiB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBUaGlzIGNhbGxiYWNrXG4gICAgICogaXMgcGFzc2VkIGFzIGEgcXVlcnkgcGFyYW1ldGVyIGluIHRoZSByZXF1ZXN0LiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoaXMgcGFyYW1ldGVyIGJ5XG4gICAgICogc2V0dGluZyB0aGUgYGpzb25wQ2FsbGJhY2tQYXJhbWAgcHJvcGVydHkgb24gdGhlIHJlcXVlc3QgY29uZmlnIG9iamVjdC5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqICRodHRwLmpzb25wKCdzb21lL3RydXN0ZWQvdXJsJywge2pzb25wQ2FsbGJhY2tQYXJhbTogJ2NhbGxiYWNrJ30pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIGRlZmF1bHQgY2FsbGJhY2sgcGFyYW1ldGVyIG5hbWUgaW4gYCRodHRwLmRlZmF1bHRzLmpzb25wQ2FsbGJhY2tQYXJhbWAuXG4gICAgICogSW5pdGlhbGx5IHRoaXMgaXMgc2V0IHRvIGAnY2FsbGJhY2snYC5cbiAgICAgKlxuICAgICAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cbiAgICAgKiBZb3UgY2FuIG5vIGxvbmdlciB1c2UgdGhlIGBKU09OX0NBTExCQUNLYCBzdHJpbmcgYXMgYSBwbGFjZWhvbGRlciBmb3Igc3BlY2lmeWluZyB3aGVyZSB0aGUgY2FsbGJhY2tcbiAgICAgKiBwYXJhbWV0ZXIgdmFsdWUgc2hvdWxkIGdvLlxuICAgICAqIDwvZGl2PlxuICAgICAqXG4gICAgICogSWYgeW91IHdvdWxkIGxpa2UgdG8gY3VzdG9taXNlIHdoZXJlIGFuZCBob3cgdGhlIGNhbGxiYWNrcyBhcmUgc3RvcmVkIHRoZW4gdHJ5IG92ZXJyaWRpbmdcbiAgICAgKiBvciBkZWNvcmF0aW5nIHRoZSB7QGxpbmsgJGpzb25wQ2FsbGJhY2tzfSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VHJ1c3RlZE9iamVjdH0gdXJsIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQ7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIG9iamVjdCBjcmVhdGVkIGJ5IGEgY2FsbCB0byBgJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodXJsKWAuXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3RcbiAgICAgKi9cbiAgICBjcmVhdGVTaG9ydE1ldGhvZHMoJ2dldCcsICdkZWxldGUnLCAnaGVhZCcsICdqc29ucCcpO1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRodHRwI3Bvc3RcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBQT1NUYCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkwgc3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgUmVxdWVzdCBjb250ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3RcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkaHR0cCNwdXRcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBQVVRgIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdFxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBSZXF1ZXN0IGNvbnRlbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdFxuICAgICAqL1xuXG4gICAgIC8qKlxuICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAqIEBuYW1lICRodHRwI3BhdGNoXG4gICAgICAqXG4gICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgUEFUQ0hgIHJlcXVlc3QuXG4gICAgICAqXG4gICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0XG4gICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBSZXF1ZXN0IGNvbnRlbnRcbiAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0XG4gICAgICAqL1xuICAgIGNyZWF0ZVNob3J0TWV0aG9kc1dpdGhEYXRhKCdwb3N0JywgJ3B1dCcsICdwYXRjaCcpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICAgICAgICogQG5hbWUgJGh0dHAjZGVmYXVsdHNcbiAgICAgICAgICpcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJ1bnRpbWUgZXF1aXZhbGVudCBvZiB0aGUgYCRodHRwUHJvdmlkZXIuZGVmYXVsdHNgIHByb3BlcnR5LiBBbGxvd3MgY29uZmlndXJhdGlvbiBvZlxuICAgICAgICAgKiBkZWZhdWx0IGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscyBhcyB3ZWxsIGFzIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogU2VlIFwiU2V0dGluZyBIVFRQIEhlYWRlcnNcIiBhbmQgXCJUcmFuc2Zvcm1pbmcgUmVxdWVzdHMgYW5kIFJlc3BvbnNlc1wiIHNlY3Rpb25zIGFib3ZlLlxuICAgICAgICAgKi9cbiAgICAkaHR0cC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuXG5cbiAgICByZXR1cm4gJGh0dHA7XG5cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVNob3J0TWV0aG9kcyhuYW1lcykge1xuICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgJGh0dHBbbmFtZV0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgICAgICAgIHJldHVybiAkaHR0cChleHRlbmQoe30sIGNvbmZpZyB8fCB7fSwge1xuICAgICAgICAgICAgbWV0aG9kOiBuYW1lLFxuICAgICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVNob3J0TWV0aG9kc1dpdGhEYXRhKG5hbWUpIHtcbiAgICAgIGZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICRodHRwW25hbWVdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICAgICAgICByZXR1cm4gJGh0dHAoZXh0ZW5kKHt9LCBjb25maWcgfHwge30sIHtcbiAgICAgICAgICAgIG1ldGhvZDogbmFtZSxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiAhISEgQUNDRVNTRVMgQ0xPU1VSRSBWQVJTOlxuICAgICAqICRodHRwQmFja2VuZCwgZGVmYXVsdHMsICRsb2csICRyb290U2NvcGUsIGRlZmF1bHRDYWNoZSwgJGh0dHAucGVuZGluZ1JlcXVlc3RzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2VuZFJlcShjb25maWcsIHJlcURhdGEpIHtcbiAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCksXG4gICAgICAgICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2UsXG4gICAgICAgICAgY2FjaGUsXG4gICAgICAgICAgY2FjaGVkUmVzcCxcbiAgICAgICAgICByZXFIZWFkZXJzID0gY29uZmlnLmhlYWRlcnMsXG4gICAgICAgICAgaXNKc29ucCA9IGxvd2VyY2FzZShjb25maWcubWV0aG9kKSA9PT0gJ2pzb25wJyxcbiAgICAgICAgICB1cmwgPSBjb25maWcudXJsO1xuXG4gICAgICBpZiAoaXNKc29ucCkge1xuICAgICAgICAvLyBKU09OUCBpcyBhIHByZXR0eSBzZW5zaXRpdmUgb3BlcmF0aW9uIHdoZXJlIHdlJ3JlIGFsbG93aW5nIGEgc2NyaXB0IHRvIGhhdmUgZnVsbCBhY2Nlc3MgdG9cbiAgICAgICAgLy8gb3VyIERPTSBhbmQgSlMgc3BhY2UuICBTbyB3ZSByZXF1aXJlIHRoYXQgdGhlIFVSTCBzYXRpc2ZpZXMgU0NFLlJFU09VUkNFX1VSTC5cbiAgICAgICAgdXJsID0gJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodXJsKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaW5nKHVybCkpIHtcbiAgICAgICAgLy8gSWYgaXQgaXMgbm90IGEgc3RyaW5nIHRoZW4gdGhlIFVSTCBtdXN0IGJlIGEgJHNjZSB0cnVzdGVkIG9iamVjdFxuICAgICAgICB1cmwgPSAkc2NlLnZhbHVlT2YodXJsKTtcbiAgICAgIH1cblxuICAgICAgdXJsID0gYnVpbGRVcmwodXJsLCBjb25maWcucGFyYW1TZXJpYWxpemVyKGNvbmZpZy5wYXJhbXMpKTtcblxuICAgICAgaWYgKGlzSnNvbnApIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhlIHVybCBhbmQgYWRkIHRoZSBKU09OUCBjYWxsYmFjayBwbGFjZWhvbGRlclxuICAgICAgICB1cmwgPSBzYW5pdGl6ZUpzb25wQ2FsbGJhY2tQYXJhbSh1cmwsIGNvbmZpZy5qc29ucENhbGxiYWNrUGFyYW0pO1xuICAgICAgfVxuXG4gICAgICAkaHR0cC5wZW5kaW5nUmVxdWVzdHMucHVzaChjb25maWcpO1xuICAgICAgcHJvbWlzZS50aGVuKHJlbW92ZVBlbmRpbmdSZXEsIHJlbW92ZVBlbmRpbmdSZXEpO1xuXG4gICAgICBpZiAoKGNvbmZpZy5jYWNoZSB8fCBkZWZhdWx0cy5jYWNoZSkgJiYgY29uZmlnLmNhY2hlICE9PSBmYWxzZSAmJlxuICAgICAgICAgIChjb25maWcubWV0aG9kID09PSAnR0VUJyB8fCBjb25maWcubWV0aG9kID09PSAnSlNPTlAnKSkge1xuICAgICAgICBjYWNoZSA9IGlzT2JqZWN0KGNvbmZpZy5jYWNoZSkgPyBjb25maWcuY2FjaGVcbiAgICAgICAgICAgICAgOiBpc09iamVjdChkZWZhdWx0cy5jYWNoZSkgPyBkZWZhdWx0cy5jYWNoZVxuICAgICAgICAgICAgICA6IGRlZmF1bHRDYWNoZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNhY2hlZFJlc3AgPSBjYWNoZS5nZXQodXJsKTtcbiAgICAgICAgaWYgKGlzRGVmaW5lZChjYWNoZWRSZXNwKSkge1xuICAgICAgICAgIGlmIChpc1Byb21pc2VMaWtlKGNhY2hlZFJlc3ApKSB7XG4gICAgICAgICAgICAvLyBjYWNoZWQgcmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQsIGJ1dCB0aGVyZSBpcyBubyByZXNwb25zZSB5ZXRcbiAgICAgICAgICAgIGNhY2hlZFJlc3AudGhlbihyZXNvbHZlUHJvbWlzZVdpdGhSZXN1bHQsIHJlc29sdmVQcm9taXNlV2l0aFJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNlcnZpbmcgZnJvbSBjYWNoZVxuICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FjaGVkUmVzcCkpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2FjaGVkUmVzcFsxXSwgY2FjaGVkUmVzcFswXSwgc2hhbGxvd0NvcHkoY2FjaGVkUmVzcFsyXSksIGNhY2hlZFJlc3BbM10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2FjaGVkUmVzcCwgMjAwLCB7fSwgJ09LJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1dCB0aGUgcHJvbWlzZSBmb3IgdGhlIG5vbi10cmFuc2Zvcm1lZCByZXNwb25zZSBpbnRvIGNhY2hlIGFzIGEgcGxhY2Vob2xkZXJcbiAgICAgICAgICBjYWNoZS5wdXQodXJsLCBwcm9taXNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIC8vIGlmIHdlIHdvbid0IGhhdmUgdGhlIHJlc3BvbnNlIGluIGNhY2hlLCBzZXQgdGhlIHhzcmYgaGVhZGVycyBhbmRcbiAgICAgIC8vIHNlbmQgdGhlIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmRcbiAgICAgIGlmIChpc1VuZGVmaW5lZChjYWNoZWRSZXNwKSkge1xuICAgICAgICB2YXIgeHNyZlZhbHVlID0gdXJsSXNTYW1lT3JpZ2luKGNvbmZpZy51cmwpXG4gICAgICAgICAgICA/ICQkY29va2llUmVhZGVyKClbY29uZmlnLnhzcmZDb29raWVOYW1lIHx8IGRlZmF1bHRzLnhzcmZDb29raWVOYW1lXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgICByZXFIZWFkZXJzWyhjb25maWcueHNyZkhlYWRlck5hbWUgfHwgZGVmYXVsdHMueHNyZkhlYWRlck5hbWUpXSA9IHhzcmZWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgICRodHRwQmFja2VuZChjb25maWcubWV0aG9kLCB1cmwsIHJlcURhdGEsIGRvbmUsIHJlcUhlYWRlcnMsIGNvbmZpZy50aW1lb3V0LFxuICAgICAgICAgICAgY29uZmlnLndpdGhDcmVkZW50aWFscywgY29uZmlnLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgICAgIGNyZWF0ZUFwcGx5SGFuZGxlcnMoY29uZmlnLmV2ZW50SGFuZGxlcnMpLFxuICAgICAgICAgICAgY3JlYXRlQXBwbHlIYW5kbGVycyhjb25maWcudXBsb2FkRXZlbnRIYW5kbGVycykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcblxuICAgICAgZnVuY3Rpb24gY3JlYXRlQXBwbHlIYW5kbGVycyhldmVudEhhbmRsZXJzKSB7XG4gICAgICAgIGlmIChldmVudEhhbmRsZXJzKSB7XG4gICAgICAgICAgdmFyIGFwcGx5SGFuZGxlcnMgPSB7fTtcbiAgICAgICAgICBmb3JFYWNoKGV2ZW50SGFuZGxlcnMsIGZ1bmN0aW9uKGV2ZW50SGFuZGxlciwga2V5KSB7XG4gICAgICAgICAgICBhcHBseUhhbmRsZXJzW2tleV0gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICBpZiAodXNlQXBwbHlBc3luYykge1xuICAgICAgICAgICAgICAgICRyb290U2NvcGUuJGFwcGx5QXN5bmMoY2FsbEV2ZW50SGFuZGxlcik7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHJvb3RTY29wZS4kJHBoYXNlKSB7XG4gICAgICAgICAgICAgICAgY2FsbEV2ZW50SGFuZGxlcigpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICRyb290U2NvcGUuJGFwcGx5KGNhbGxFdmVudEhhbmRsZXIpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEV2ZW50SGFuZGxlcigpIHtcbiAgICAgICAgICAgICAgICBldmVudEhhbmRsZXIoZXZlbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhcHBseUhhbmRsZXJzO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLyoqXG4gICAgICAgKiBDYWxsYmFjayByZWdpc3RlcmVkIHRvICRodHRwQmFja2VuZCgpOlxuICAgICAgICogIC0gY2FjaGVzIHRoZSByZXNwb25zZSBpZiBkZXNpcmVkXG4gICAgICAgKiAgLSByZXNvbHZlcyB0aGUgcmF3ICRodHRwIHByb21pc2VcbiAgICAgICAqICAtIGNhbGxzICRhcHBseVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBkb25lKHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnNTdHJpbmcsIHN0YXR1c1RleHQpIHtcbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgaWYgKGlzU3VjY2VzcyhzdGF0dXMpKSB7XG4gICAgICAgICAgICBjYWNoZS5wdXQodXJsLCBbc3RhdHVzLCByZXNwb25zZSwgcGFyc2VIZWFkZXJzKGhlYWRlcnNTdHJpbmcpLCBzdGF0dXNUZXh0XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBwcm9taXNlIGZyb20gdGhlIGNhY2hlXG4gICAgICAgICAgICBjYWNoZS5yZW1vdmUodXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZXNvbHZlSHR0cFByb21pc2UoKSB7XG4gICAgICAgICAgcmVzb2x2ZVByb21pc2UocmVzcG9uc2UsIHN0YXR1cywgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXNlQXBwbHlBc3luYykge1xuICAgICAgICAgICRyb290U2NvcGUuJGFwcGx5QXN5bmMocmVzb2x2ZUh0dHBQcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlSHR0cFByb21pc2UoKTtcbiAgICAgICAgICBpZiAoISRyb290U2NvcGUuJCRwaGFzZSkgJHJvb3RTY29wZS4kYXBwbHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzb2x2ZXMgdGhlIHJhdyAkaHR0cCBwcm9taXNlLlxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZShyZXNwb25zZSwgc3RhdHVzLCBoZWFkZXJzLCBzdGF0dXNUZXh0KSB7XG4gICAgICAgIC8vc3RhdHVzOiBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLCAwLCAtMSAoYWJvcnRlZCBieSB0aW1lb3V0IC8gcHJvbWlzZSlcbiAgICAgICAgc3RhdHVzID0gc3RhdHVzID49IC0xID8gc3RhdHVzIDogMDtcblxuICAgICAgICAoaXNTdWNjZXNzKHN0YXR1cykgPyBkZWZlcnJlZC5yZXNvbHZlIDogZGVmZXJyZWQucmVqZWN0KSh7XG4gICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc0dldHRlcihoZWFkZXJzKSxcbiAgICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZVdpdGhSZXN1bHQocmVzdWx0KSB7XG4gICAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdC5kYXRhLCByZXN1bHQuc3RhdHVzLCBzaGFsbG93Q29weShyZXN1bHQuaGVhZGVycygpKSwgcmVzdWx0LnN0YXR1c1RleHQpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1vdmVQZW5kaW5nUmVxKCkge1xuICAgICAgICB2YXIgaWR4ID0gJGh0dHAucGVuZGluZ1JlcXVlc3RzLmluZGV4T2YoY29uZmlnKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpICRodHRwLnBlbmRpbmdSZXF1ZXN0cy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGJ1aWxkVXJsKHVybCwgc2VyaWFsaXplZFBhcmFtcykge1xuICAgICAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gKCh1cmwuaW5kZXhPZignPycpID09PSAtMSkgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2FuaXRpemVKc29ucENhbGxiYWNrUGFyYW0odXJsLCBrZXkpIHtcbiAgICAgIGlmICgvWyY/XVtePV0rPUpTT05fQ0FMTEJBQ0svLnRlc3QodXJsKSkge1xuICAgICAgICAvLyBUaHJvdyBpZiB0aGUgdXJsIGFscmVhZHkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gSlNPTl9DQUxMQkFDS1xuICAgICAgICB0aHJvdyAkaHR0cE1pbkVycignYmFkanNvbnAnLCAnSWxsZWdhbCB1c2Ugb2YgSlNPTl9DQUxMQkFDSyBpbiB1cmwsIFwiezB9XCInLCB1cmwpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FsbGJhY2tQYXJhbVJlZ2V4ID0gbmV3IFJlZ0V4cCgnWyY/XScgKyBrZXkgKyAnPScpO1xuICAgICAgaWYgKGNhbGxiYWNrUGFyYW1SZWdleC50ZXN0KHVybCkpIHtcbiAgICAgICAgLy8gVGhyb3cgaWYgdGhlIGNhbGxiYWNrIHBhcmFtIHdhcyBhbHJlYWR5IHByb3ZpZGVkXG4gICAgICAgIHRocm93ICRodHRwTWluRXJyKCdiYWRqc29ucCcsICdJbGxlZ2FsIHVzZSBvZiBjYWxsYmFjayBwYXJhbSwgXCJ7MH1cIiwgaW4gdXJsLCBcInsxfVwiJywga2V5LCB1cmwpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaW4gdGhlIEpTT05fQ0FMTEJBQ0sgY2FsbGJhY2sgcGFyYW0gdmFsdWVcbiAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCc/JykgPT09IC0xKSA/ICc/JyA6ICcmJykgKyBrZXkgKyAnPUpTT05fQ0FMTEJBQ0snO1xuXG4gICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgfV07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICR4aHJGYWN0b3J5XG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRmFjdG9yeSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBYTUxIdHRwUmVxdWVzdCBvYmplY3RzLlxuICpcbiAqIFJlcGxhY2Ugb3IgZGVjb3JhdGUgdGhpcyBzZXJ2aWNlIHRvIGNyZWF0ZSB5b3VyIG93biBjdXN0b20gWE1MSHR0cFJlcXVlc3Qgb2JqZWN0cy5cbiAqXG4gKiBgYGBcbiAqIGFuZ3VsYXIubW9kdWxlKCdteUFwcCcsIFtdKVxuICogLmZhY3RvcnkoJyR4aHJGYWN0b3J5JywgZnVuY3Rpb24oKSB7XG4gKiAgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVYaHIobWV0aG9kLCB1cmwpIHtcbiAqICAgICByZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCh7bW96U3lzdGVtOiB0cnVlfSk7XG4gKiAgIH07XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgSFRUUCBtZXRob2Qgb2YgdGhlIHJlcXVlc3QgKEdFVCwgUE9TVCwgUFVULCAuLilcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIG9mIHRoZSByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiAkeGhyRmFjdG9yeVByb3ZpZGVyKCkge1xuICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlWGhyKCkge1xuICAgICAgcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkaHR0cEJhY2tlbmRcbiAqIEByZXF1aXJlcyAkanNvbnBDYWxsYmFja3NcbiAqIEByZXF1aXJlcyAkZG9jdW1lbnRcbiAqIEByZXF1aXJlcyAkeGhyRmFjdG9yeVxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgYmFja2VuZCB1c2VkIGJ5IHRoZSB7QGxpbmsgbmcuJGh0dHAgc2VydmljZX0gdGhhdCBkZWxlZ2F0ZXMgdG9cbiAqIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCBvciBKU09OUCBhbmQgZGVhbHMgd2l0aCBicm93c2VyIGluY29tcGF0aWJpbGl0aWVzLlxuICpcbiAqIFlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byB1c2UgdGhpcyBzZXJ2aWNlIGRpcmVjdGx5LCBpbnN0ZWFkIHVzZSB0aGUgaGlnaGVyLWxldmVsIGFic3RyYWN0aW9uczpcbiAqIHtAbGluayBuZy4kaHR0cCAkaHR0cH0gb3Ige0BsaW5rIG5nUmVzb3VyY2UuJHJlc291cmNlICRyZXNvdXJjZX0uXG4gKlxuICogRHVyaW5nIHRlc3RpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzd2FwcGVkIHdpdGgge0BsaW5rIG5nTW9jay4kaHR0cEJhY2tlbmQgbW9ja1xuICogJGh0dHBCYWNrZW5kfSB3aGljaCBjYW4gYmUgdHJhaW5lZCB3aXRoIHJlc3BvbnNlcy5cbiAqL1xuZnVuY3Rpb24gJEh0dHBCYWNrZW5kUHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IFsnJGJyb3dzZXInLCAnJGpzb25wQ2FsbGJhY2tzJywgJyRkb2N1bWVudCcsICckeGhyRmFjdG9yeScsIGZ1bmN0aW9uKCRicm93c2VyLCAkanNvbnBDYWxsYmFja3MsICRkb2N1bWVudCwgJHhockZhY3RvcnkpIHtcbiAgICByZXR1cm4gY3JlYXRlSHR0cEJhY2tlbmQoJGJyb3dzZXIsICR4aHJGYWN0b3J5LCAkYnJvd3Nlci5kZWZlciwgJGpzb25wQ2FsbGJhY2tzLCAkZG9jdW1lbnRbMF0pO1xuICB9XTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSHR0cEJhY2tlbmQoJGJyb3dzZXIsIGNyZWF0ZVhociwgJGJyb3dzZXJEZWZlciwgY2FsbGJhY2tzLCByYXdEb2N1bWVudCkge1xuICAvLyBUT0RPKHZvanRhKTogZml4IHRoZSBzaWduYXR1cmVcbiAgcmV0dXJuIGZ1bmN0aW9uKG1ldGhvZCwgdXJsLCBwb3N0LCBjYWxsYmFjaywgaGVhZGVycywgdGltZW91dCwgd2l0aENyZWRlbnRpYWxzLCByZXNwb25zZVR5cGUsIGV2ZW50SGFuZGxlcnMsIHVwbG9hZEV2ZW50SGFuZGxlcnMpIHtcbiAgICB1cmwgPSB1cmwgfHwgJGJyb3dzZXIudXJsKCk7XG5cbiAgICBpZiAobG93ZXJjYXNlKG1ldGhvZCkgPT09ICdqc29ucCcpIHtcbiAgICAgIHZhciBjYWxsYmFja1BhdGggPSBjYWxsYmFja3MuY3JlYXRlQ2FsbGJhY2sodXJsKTtcbiAgICAgIHZhciBqc29ucERvbmUgPSBqc29ucFJlcSh1cmwsIGNhbGxiYWNrUGF0aCwgZnVuY3Rpb24oc3RhdHVzLCB0ZXh0KSB7XG4gICAgICAgIC8vIGpzb25wUmVxIG9ubHkgZXZlciBzZXRzIHN0YXR1cyB0byAyMDAgKE9LKSwgNDA0IChFUlJPUikgb3IgLTEgKFdBSVRJTkcpXG4gICAgICAgIHZhciByZXNwb25zZSA9IChzdGF0dXMgPT09IDIwMCkgJiYgY2FsbGJhY2tzLmdldFJlc3BvbnNlKGNhbGxiYWNrUGF0aCk7XG4gICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywgc3RhdHVzLCByZXNwb25zZSwgJycsIHRleHQpO1xuICAgICAgICBjYWxsYmFja3MucmVtb3ZlQ2FsbGJhY2soY2FsbGJhY2tQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIHZhciB4aHIgPSBjcmVhdGVYaHIobWV0aG9kLCB1cmwpO1xuXG4gICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIHJlcXVlc3RMb2FkZWQoKSB7XG4gICAgICAgIHZhciBzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQgfHwgJyc7XG5cbiAgICAgICAgLy8gcmVzcG9uc2VUZXh0IGlzIHRoZSBvbGQtc2Nob29sIHdheSBvZiByZXRyaWV2aW5nIHJlc3BvbnNlIChzdXBwb3J0ZWQgYnkgSUU5KVxuICAgICAgICAvLyByZXNwb25zZS9yZXNwb25zZVR5cGUgcHJvcGVydGllcyB3ZXJlIGludHJvZHVjZWQgaW4gWEhSIExldmVsMiBzcGVjIChzdXBwb3J0ZWQgYnkgSUUxMClcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gKCdyZXNwb25zZScgaW4geGhyKSA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHQ7XG5cbiAgICAgICAgLy8gbm9ybWFsaXplIElFOSBidWcgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzE0NTApXG4gICAgICAgIHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzID09PSAxMjIzID8gMjA0IDogeGhyLnN0YXR1cztcblxuICAgICAgICAvLyBmaXggc3RhdHVzIGNvZGUgd2hlbiBpdCBpcyAwICgwIHN0YXR1cyBpcyB1bmRvY3VtZW50ZWQpLlxuICAgICAgICAvLyBPY2N1cnMgd2hlbiBhY2Nlc3NpbmcgZmlsZSByZXNvdXJjZXMgb3Igb24gQW5kcm9pZCA0LjEgc3RvY2sgYnJvd3NlclxuICAgICAgICAvLyB3aGlsZSByZXRyaWV2aW5nIGZpbGVzIGZyb20gYXBwbGljYXRpb24gY2FjaGUuXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDApIHtcbiAgICAgICAgICBzdGF0dXMgPSByZXNwb25zZSA/IDIwMCA6IHVybFJlc29sdmUodXJsKS5wcm90b2NvbCA9PT0gJ2ZpbGUnID8gNDA0IDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjayxcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLFxuICAgICAgICAgICAgc3RhdHVzVGV4dCk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgcmVxdWVzdEVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFRoZSByZXNwb25zZSBpcyBhbHdheXMgZW1wdHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1lcnJvci1zdGVwcyBhbmQgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtbmV0d29yay1lcnJvclxuICAgICAgICBjb21wbGV0ZVJlcXVlc3QoY2FsbGJhY2ssIC0xLCBudWxsLCBudWxsLCAnJyk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25lcnJvciA9IHJlcXVlc3RFcnJvcjtcbiAgICAgIHhoci5vbmFib3J0ID0gcmVxdWVzdEVycm9yO1xuICAgICAgeGhyLm9udGltZW91dCA9IHJlcXVlc3RFcnJvcjtcblxuICAgICAgZm9yRWFjaChldmVudEhhbmRsZXJzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgZm9yRWFjaCh1cGxvYWRFdmVudEhhbmRsZXJzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHhoci51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAod2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2VUeXBlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIFdlYktpdCBhZGRlZCBzdXBwb3J0IGZvciB0aGUganNvbiByZXNwb25zZVR5cGUgdmFsdWUgb24gMDkvMDMvMjAxM1xuICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY0OC4gVmVyc2lvbnMgb2YgU2FmYXJpIHByaW9yIHRvIDcgYXJlXG4gICAgICAgICAgLy8ga25vd24gdG8gdGhyb3cgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZSBcImpzb25cIiBhcyB0aGUgcmVzcG9uc2UgdHlwZS4gT3RoZXIgb2xkZXJcbiAgICAgICAgICAvLyBicm93c2VycyBpbXBsZW1lbnRpbmcgdGhlIHJlc3BvbnNlVHlwZVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhlIGpzb24gcmVzcG9uc2UgdHlwZSBjYW4gYmUgaWdub3JlZCBpZiBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIEpTT04gcGF5bG9hZHMgYXJlXG4gICAgICAgICAgLy8gcGFyc2VkIG9uIHRoZSBjbGllbnQtc2lkZSByZWdhcmRsZXNzLlxuICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgeGhyLnNlbmQoaXNVbmRlZmluZWQocG9zdCkgPyBudWxsIDogcG9zdCk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICB2YXIgdGltZW91dElkID0gJGJyb3dzZXJEZWZlcih0aW1lb3V0UmVxdWVzdCwgdGltZW91dCk7XG4gICAgfSBlbHNlIGlmIChpc1Byb21pc2VMaWtlKHRpbWVvdXQpKSB7XG4gICAgICB0aW1lb3V0LnRoZW4odGltZW91dFJlcXVlc3QpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gdGltZW91dFJlcXVlc3QoKSB7XG4gICAgICBpZiAoanNvbnBEb25lKSB7XG4gICAgICAgIGpzb25wRG9uZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHhocikge1xuICAgICAgICB4aHIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoY2FsbGJhY2ssIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnNTdHJpbmcsIHN0YXR1c1RleHQpIHtcbiAgICAgIC8vIGNhbmNlbCB0aW1lb3V0IGFuZCBzdWJzZXF1ZW50IHRpbWVvdXQgcHJvbWlzZSByZXNvbHV0aW9uXG4gICAgICBpZiAoaXNEZWZpbmVkKHRpbWVvdXRJZCkpIHtcbiAgICAgICAgJGJyb3dzZXJEZWZlci5jYW5jZWwodGltZW91dElkKTtcbiAgICAgIH1cbiAgICAgIGpzb25wRG9uZSA9IHhociA9IG51bGw7XG5cbiAgICAgIGNhbGxiYWNrKHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnNTdHJpbmcsIHN0YXR1c1RleHQpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBqc29ucFJlcSh1cmwsIGNhbGxiYWNrUGF0aCwgZG9uZSkge1xuICAgIHVybCA9IHVybC5yZXBsYWNlKCdKU09OX0NBTExCQUNLJywgY2FsbGJhY2tQYXRoKTtcbiAgICAvLyB3ZSBjYW4ndCB1c2UgalF1ZXJ5L2pxTGl0ZSBoZXJlIGJlY2F1c2UgalF1ZXJ5IGRvZXMgY3Jhenkgc3R1ZmYgd2l0aCBzY3JpcHQgZWxlbWVudHMsIGUuZy46XG4gICAgLy8gLSBmZXRjaGVzIGxvY2FsIHNjcmlwdHMgdmlhIFhIUiBhbmQgZXZhbHMgdGhlbVxuICAgIC8vIC0gYWRkcyBhbmQgaW1tZWRpYXRlbHkgcmVtb3ZlcyBzY3JpcHQgZWxlbWVudHMgZnJvbSB0aGUgZG9jdW1lbnRcbiAgICB2YXIgc2NyaXB0ID0gcmF3RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksIGNhbGxiYWNrID0gbnVsbDtcbiAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgIHNjcmlwdC5zcmMgPSB1cmw7XG4gICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcblxuICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIHNjcmlwdC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgY2FsbGJhY2spO1xuICAgICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgY2FsbGJhY2spO1xuICAgICAgcmF3RG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgIHZhciBzdGF0dXMgPSAtMTtcbiAgICAgIHZhciB0ZXh0ID0gJ3Vua25vd24nO1xuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdsb2FkJyAmJiAhY2FsbGJhY2tzLndhc0NhbGxlZChjYWxsYmFja1BhdGgpKSB7XG4gICAgICAgICAgZXZlbnQgPSB7IHR5cGU6ICdlcnJvcicgfTtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gZXZlbnQudHlwZTtcbiAgICAgICAgc3RhdHVzID0gZXZlbnQudHlwZSA9PT0gJ2Vycm9yJyA/IDQwNCA6IDIwMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgZG9uZShzdGF0dXMsIHRleHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNhbGxiYWNrKTtcbiAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBjYWxsYmFjayk7XG4gICAgcmF3RG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIHJldHVybiBjYWxsYmFjaztcbiAgfVxufVxuXG52YXIgJGludGVycG9sYXRlTWluRXJyID0gYW5ndWxhci4kaW50ZXJwb2xhdGVNaW5FcnIgPSBtaW5FcnIoJyRpbnRlcnBvbGF0ZScpO1xuJGludGVycG9sYXRlTWluRXJyLnRocm93Tm9jb25jYXQgPSBmdW5jdGlvbih0ZXh0KSB7XG4gIHRocm93ICRpbnRlcnBvbGF0ZU1pbkVycignbm9jb25jYXQnLFxuICAgICAgJ0Vycm9yIHdoaWxlIGludGVycG9sYXRpbmc6IHswfVxcblN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIGRpc2FsbG93cyAnICtcbiAgICAgICdpbnRlcnBvbGF0aW9ucyB0aGF0IGNvbmNhdGVuYXRlIG11bHRpcGxlIGV4cHJlc3Npb25zIHdoZW4gYSB0cnVzdGVkIHZhbHVlIGlzICcgK1xuICAgICAgJ3JlcXVpcmVkLiAgU2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRzY2UnLCB0ZXh0KTtcbn07XG5cbiRpbnRlcnBvbGF0ZU1pbkVyci5pbnRlcnIgPSBmdW5jdGlvbih0ZXh0LCBlcnIpIHtcbiAgcmV0dXJuICRpbnRlcnBvbGF0ZU1pbkVycignaW50ZXJyJywgJ0NhblxcJ3QgaW50ZXJwb2xhdGU6IHswfVxcbnsxfScsIHRleHQsIGVyci50b1N0cmluZygpKTtcbn07XG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkaW50ZXJwb2xhdGVQcm92aWRlclxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBVc2VkIGZvciBjb25maWd1cmluZyB0aGUgaW50ZXJwb2xhdGlvbiBtYXJrdXAuIERlZmF1bHRzIHRvIGB7e2AgYW5kIGB9fWAuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPlxuICogVGhpcyBmZWF0dXJlIGlzIHNvbWV0aW1lcyB1c2VkIHRvIG1peCBkaWZmZXJlbnQgbWFya3VwIGxhbmd1YWdlcywgZS5nLiB0byB3cmFwIGFuIEFuZ3VsYXJcbiAqIHRlbXBsYXRlIHdpdGhpbiBhIFB5dGhvbiBKaW5qYSB0ZW1wbGF0ZSAob3IgYW55IG90aGVyIHRlbXBsYXRlIGxhbmd1YWdlKS4gTWl4aW5nIHRlbXBsYXRpbmdcbiAqIGxhbmd1YWdlcyBpcyAqKnZlcnkgZGFuZ2Vyb3VzKiouIFRoZSBlbWJlZGRpbmcgdGVtcGxhdGUgbGFuZ3VhZ2Ugd2lsbCBub3Qgc2FmZWx5IGVzY2FwZSBBbmd1bGFyXG4gKiBleHByZXNzaW9ucywgc28gYW55IHVzZXItY29udHJvbGxlZCB2YWx1ZXMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgY2F1c2UgQ3Jvc3MgU2l0ZSBTY3JpcHRpbmcgKFhTUylcbiAqIHNlY3VyaXR5IGJ1Z3MhXG4gKiA8L2Rpdj5cbiAqXG4gKiBAZXhhbXBsZVxuPGV4YW1wbGUgbmFtZT1cImN1c3RvbS1pbnRlcnBvbGF0aW9uLW1hcmt1cFwiIG1vZHVsZT1cImN1c3RvbUludGVycG9sYXRpb25BcHBcIj5cbjxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG48c2NyaXB0PlxuICB2YXIgY3VzdG9tSW50ZXJwb2xhdGlvbkFwcCA9IGFuZ3VsYXIubW9kdWxlKCdjdXN0b21JbnRlcnBvbGF0aW9uQXBwJywgW10pO1xuXG4gIGN1c3RvbUludGVycG9sYXRpb25BcHAuY29uZmlnKGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZVByb3ZpZGVyKSB7XG4gICAgJGludGVycG9sYXRlUHJvdmlkZXIuc3RhcnRTeW1ib2woJy8vJyk7XG4gICAgJGludGVycG9sYXRlUHJvdmlkZXIuZW5kU3ltYm9sKCcvLycpO1xuICB9KTtcblxuXG4gIGN1c3RvbUludGVycG9sYXRpb25BcHAuY29udHJvbGxlcignRGVtb0NvbnRyb2xsZXInLCBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMubGFiZWwgPSBcIlRoaXMgYmluZGluZyBpcyBicm91Z2h0IHlvdSBieSAvLyBpbnRlcnBvbGF0aW9uIHN5bWJvbHMuXCI7XG4gIH0pO1xuPC9zY3JpcHQ+XG48ZGl2IG5nLWNvbnRyb2xsZXI9XCJEZW1vQ29udHJvbGxlciBhcyBkZW1vXCI+XG4gICAgLy9kZW1vLmxhYmVsLy9cbjwvZGl2PlxuPC9maWxlPlxuPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICBpdCgnc2hvdWxkIGludGVycG9sYXRlIGJpbmRpbmcgd2l0aCBjdXN0b20gc3ltYm9scycsIGZ1bmN0aW9uKCkge1xuICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2RlbW8ubGFiZWwnKSkuZ2V0VGV4dCgpKS50b0JlKCdUaGlzIGJpbmRpbmcgaXMgYnJvdWdodCB5b3UgYnkgLy8gaW50ZXJwb2xhdGlvbiBzeW1ib2xzLicpO1xuICB9KTtcbjwvZmlsZT5cbjwvZXhhbXBsZT5cbiAqL1xuZnVuY3Rpb24gJEludGVycG9sYXRlUHJvdmlkZXIoKSB7XG4gIHZhciBzdGFydFN5bWJvbCA9ICd7eyc7XG4gIHZhciBlbmRTeW1ib2wgPSAnfX0nO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRpbnRlcnBvbGF0ZVByb3ZpZGVyI3N0YXJ0U3ltYm9sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTeW1ib2wgdG8gZGVub3RlIHN0YXJ0IG9mIGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRlZCBzdHJpbmcuIERlZmF1bHRzIHRvIGB7e2AuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gdmFsdWUgbmV3IHZhbHVlIHRvIHNldCB0aGUgc3RhcnRpbmcgc3ltYm9sIHRvLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfHNlbGZ9IFJldHVybnMgdGhlIHN5bWJvbCB3aGVuIHVzZWQgYXMgZ2V0dGVyIGFuZCBzZWxmIGlmIHVzZWQgYXMgc2V0dGVyLlxuICAgKi9cbiAgdGhpcy5zdGFydFN5bWJvbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzdGFydFN5bWJvbCA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGFydFN5bWJvbDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGludGVycG9sYXRlUHJvdmlkZXIjZW5kU3ltYm9sXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTeW1ib2wgdG8gZGVub3RlIHRoZSBlbmQgb2YgZXhwcmVzc2lvbiBpbiB0aGUgaW50ZXJwb2xhdGVkIHN0cmluZy4gRGVmYXVsdHMgdG8gYH19YC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc9fSB2YWx1ZSBuZXcgdmFsdWUgdG8gc2V0IHRoZSBlbmRpbmcgc3ltYm9sIHRvLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfHNlbGZ9IFJldHVybnMgdGhlIHN5bWJvbCB3aGVuIHVzZWQgYXMgZ2V0dGVyIGFuZCBzZWxmIGlmIHVzZWQgYXMgc2V0dGVyLlxuICAgKi9cbiAgdGhpcy5lbmRTeW1ib2wgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZW5kU3ltYm9sID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVuZFN5bWJvbDtcbiAgICB9XG4gIH07XG5cblxuICB0aGlzLiRnZXQgPSBbJyRwYXJzZScsICckZXhjZXB0aW9uSGFuZGxlcicsICckc2NlJywgZnVuY3Rpb24oJHBhcnNlLCAkZXhjZXB0aW9uSGFuZGxlciwgJHNjZSkge1xuICAgIHZhciBzdGFydFN5bWJvbExlbmd0aCA9IHN0YXJ0U3ltYm9sLmxlbmd0aCxcbiAgICAgICAgZW5kU3ltYm9sTGVuZ3RoID0gZW5kU3ltYm9sLmxlbmd0aCxcbiAgICAgICAgZXNjYXBlZFN0YXJ0UmVnZXhwID0gbmV3IFJlZ0V4cChzdGFydFN5bWJvbC5yZXBsYWNlKC8uL2csIGVzY2FwZSksICdnJyksXG4gICAgICAgIGVzY2FwZWRFbmRSZWdleHAgPSBuZXcgUmVnRXhwKGVuZFN5bWJvbC5yZXBsYWNlKC8uL2csIGVzY2FwZSksICdnJyk7XG5cbiAgICBmdW5jdGlvbiBlc2NhcGUoY2gpIHtcbiAgICAgIHJldHVybiAnXFxcXFxcXFxcXFxcJyArIGNoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuZXNjYXBlVGV4dCh0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKGVzY2FwZWRTdGFydFJlZ2V4cCwgc3RhcnRTeW1ib2wpLlxuICAgICAgICByZXBsYWNlKGVzY2FwZWRFbmRSZWdleHAsIGVuZFN5bWJvbCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc3RhbnRXYXRjaERlbGVnYXRlIGluIHBhcnNlLmpzXG4gICAgZnVuY3Rpb24gY29uc3RhbnRXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIGNvbnN0YW50SW50ZXJwKSB7XG4gICAgICB2YXIgdW53YXRjaCA9IHNjb3BlLiR3YXRjaChmdW5jdGlvbiBjb25zdGFudEludGVycG9sYXRlV2F0Y2goc2NvcGUpIHtcbiAgICAgICAgdW53YXRjaCgpO1xuICAgICAgICByZXR1cm4gY29uc3RhbnRJbnRlcnAoc2NvcGUpO1xuICAgICAgfSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5KTtcbiAgICAgIHJldHVybiB1bndhdGNoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBzZXJ2aWNlXG4gICAgICogQG5hbWUgJGludGVycG9sYXRlXG4gICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIEByZXF1aXJlcyAkcGFyc2VcbiAgICAgKiBAcmVxdWlyZXMgJHNjZVxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICpcbiAgICAgKiBDb21waWxlcyBhIHN0cmluZyB3aXRoIG1hcmt1cCBpbnRvIGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24uIFRoaXMgc2VydmljZSBpcyB1c2VkIGJ5IHRoZVxuICAgICAqIEhUTUwge0BsaW5rIG5nLiRjb21waWxlICRjb21waWxlfSBzZXJ2aWNlIGZvciBkYXRhIGJpbmRpbmcuIFNlZVxuICAgICAqIHtAbGluayBuZy4kaW50ZXJwb2xhdGVQcm92aWRlciAkaW50ZXJwb2xhdGVQcm92aWRlcn0gZm9yIGNvbmZpZ3VyaW5nIHRoZVxuICAgICAqIGludGVycG9sYXRpb24gbWFya3VwLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqICAgdmFyICRpbnRlcnBvbGF0ZSA9IC4uLjsgLy8gaW5qZWN0ZWRcbiAgICAgKiAgIHZhciBleHAgPSAkaW50ZXJwb2xhdGUoJ0hlbGxvIHt7bmFtZSB8IHVwcGVyY2FzZX19IScpO1xuICAgICAqICAgZXhwZWN0KGV4cCh7bmFtZTonQW5ndWxhcid9KSkudG9FcXVhbCgnSGVsbG8gQU5HVUxBUiEnKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGAkaW50ZXJwb2xhdGVgIHRha2VzIGFuIG9wdGlvbmFsIGZvdXJ0aCBhcmd1bWVudCwgYGFsbE9yTm90aGluZ2AuIElmIGBhbGxPck5vdGhpbmdgIGlzXG4gICAgICogYHRydWVgLCB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCB1bmxlc3MgYWxsIGVtYmVkZGVkIGV4cHJlc3Npb25zXG4gICAgICogZXZhbHVhdGUgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAgIHZhciAkaW50ZXJwb2xhdGUgPSAuLi47IC8vIGluamVjdGVkXG4gICAgICogICB2YXIgY29udGV4dCA9IHtncmVldGluZzogJ0hlbGxvJywgbmFtZTogdW5kZWZpbmVkIH07XG4gICAgICpcbiAgICAgKiAgIC8vIGRlZmF1bHQgXCJmb3JnaXZpbmdcIiBtb2RlXG4gICAgICogICB2YXIgZXhwID0gJGludGVycG9sYXRlKCd7e2dyZWV0aW5nfX0ge3tuYW1lfX0hJyk7XG4gICAgICogICBleHBlY3QoZXhwKGNvbnRleHQpKS50b0VxdWFsKCdIZWxsbyAhJyk7XG4gICAgICpcbiAgICAgKiAgIC8vIFwiYWxsT3JOb3RoaW5nXCIgbW9kZVxuICAgICAqICAgZXhwID0gJGludGVycG9sYXRlKCd7e2dyZWV0aW5nfX0ge3tuYW1lfX0hJywgZmFsc2UsIG51bGwsIHRydWUpO1xuICAgICAqICAgZXhwZWN0KGV4cChjb250ZXh0KSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAqICAgY29udGV4dC5uYW1lID0gJ0FuZ3VsYXInO1xuICAgICAqICAgZXhwZWN0KGV4cChjb250ZXh0KSkudG9FcXVhbCgnSGVsbG8gQW5ndWxhciEnKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBhbGxPck5vdGhpbmdgIGlzIHVzZWZ1bCBmb3IgaW50ZXJwb2xhdGluZyBVUkxzLiBgbmdTcmNgIGFuZCBgbmdTcmNzZXRgIHVzZSB0aGlzIGJlaGF2aW9yLlxuICAgICAqXG4gICAgICogIyMjIyBFc2NhcGVkIEludGVycG9sYXRpb25cbiAgICAgKiAkaW50ZXJwb2xhdGUgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGVzY2FwaW5nIGludGVycG9sYXRpb24gbWFya2Vycy4gU3RhcnQgYW5kIGVuZCBtYXJrZXJzXG4gICAgICogY2FuIGJlIGVzY2FwZWQgYnkgcHJlY2VkaW5nIGVhY2ggb2YgdGhlaXIgY2hhcmFjdGVycyB3aXRoIGEgUkVWRVJTRSBTT0xJRFVTIFUrMDA1QyAoYmFja3NsYXNoKS5cbiAgICAgKiBJdCB3aWxsIGJlIHJlbmRlcmVkIGFzIGEgcmVndWxhciBzdGFydC9lbmQgbWFya2VyLCBhbmQgd2lsbCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gZXhwcmVzc2lvblxuICAgICAqIG9yIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIGVuYWJsZXMgd2ViLXNlcnZlcnMgdG8gcHJldmVudCBzY3JpcHQgaW5qZWN0aW9uIGF0dGFja3MgYW5kIGRlZmFjaW5nIGF0dGFja3MsIHRvIHNvbWVcbiAgICAgKiBkZWdyZWUsIHdoaWxlIGFsc28gZW5hYmxpbmcgY29kZSBleGFtcGxlcyB0byB3b3JrIHdpdGhvdXQgcmVseWluZyBvbiB0aGVcbiAgICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTm9uQmluZGFibGUgbmdOb25CaW5kYWJsZX0gZGlyZWN0aXZlLlxuICAgICAqXG4gICAgICogKipGb3Igc2VjdXJpdHkgcHVycG9zZXMsIGl0IGlzIHN0cm9uZ2x5IGVuY291cmFnZWQgdGhhdCB3ZWIgc2VydmVycyBlc2NhcGUgdXNlci1zdXBwbGllZCBkYXRhLFxuICAgICAqIHJlcGxhY2luZyBhbmdsZSBicmFja2V0cyAoJmx0OywgJmd0Oykgd2l0aCAmYW1wO2x0OyBhbmQgJmFtcDtndDsgcmVzcGVjdGl2ZWx5LCBhbmQgcmVwbGFjaW5nIGFsbFxuICAgICAqIGludGVycG9sYXRpb24gc3RhcnQvZW5kIG1hcmtlcnMgd2l0aCB0aGVpciBlc2NhcGVkIGNvdW50ZXJwYXJ0cy4qKlxuICAgICAqXG4gICAgICogRXNjYXBlZCBpbnRlcnBvbGF0aW9uIG1hcmtlcnMgYXJlIG9ubHkgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gbWFya2VycyBpbiByZW5kZXJlZFxuICAgICAqIG91dHB1dCB3aGVuIHRoZSAkaW50ZXJwb2xhdGUgc2VydmljZSBwcm9jZXNzZXMgdGhlIHRleHQuIFNvLCBmb3IgSFRNTCBlbGVtZW50cyBpbnRlcnBvbGF0ZWRcbiAgICAgKiBieSB7QGxpbmsgbmcuJGNvbXBpbGUgJGNvbXBpbGV9LCBvciBvdGhlcndpc2UgaW50ZXJwb2xhdGVkIHdpdGggdGhlIGBtdXN0SGF2ZUV4cHJlc3Npb25gIHBhcmFtZXRlclxuICAgICAqIHNldCB0byBgdHJ1ZWAsIHRoZSBpbnRlcnBvbGF0ZWQgdGV4dCBtdXN0IGNvbnRhaW4gYW4gdW5lc2NhcGVkIGludGVycG9sYXRpb24gZXhwcmVzc2lvbi4gQXMgc3VjaCxcbiAgICAgKiB0aGlzIGlzIHR5cGljYWxseSB1c2VmdWwgb25seSB3aGVuIHVzZXItZGF0YSBpcyB1c2VkIGluIHJlbmRlcmluZyBhIHRlbXBsYXRlIGZyb20gdGhlIHNlcnZlciwgb3JcbiAgICAgKiB3aGVuIG90aGVyd2lzZSB1bnRydXN0ZWQgZGF0YSBpcyB1c2VkIGJ5IGEgZGlyZWN0aXZlLlxuICAgICAqXG4gICAgICogPGV4YW1wbGUgbmFtZT1cImludGVycG9sYXRpb25cIj5cbiAgICAgKiAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgKiAgICA8ZGl2IG5nLWluaXQ9XCJ1c2VybmFtZT0nQSB1c2VyJ1wiPlxuICAgICAqICAgICAgPHAgbmctaW5pdD1cImFwcHRpdGxlPSdFc2NhcGluZyBkZW1vJ1wiPnt7YXBwdGl0bGV9fTogXFx7XFx7IHVzZXJuYW1lID0gXCJkZWZhY2VkIHZhbHVlXCI7IFxcfVxcfVxuICAgICAqICAgICAgICA8L3A+XG4gICAgICogICAgICA8cD48c3Ryb25nPnt7dXNlcm5hbWV9fTwvc3Ryb25nPiBhdHRlbXB0cyB0byBpbmplY3QgY29kZSB3aGljaCB3aWxsIGRlZmFjZSB0aGVcbiAgICAgKiAgICAgICAgYXBwbGljYXRpb24sIGJ1dCBmYWlscyB0byBhY2NvbXBsaXNoIHRoZWlyIHRhc2ssIGJlY2F1c2UgdGhlIHNlcnZlciBoYXMgY29ycmVjdGx5XG4gICAgICogICAgICAgIGVzY2FwZWQgdGhlIGludGVycG9sYXRpb24gc3RhcnQvZW5kIG1hcmtlcnMgd2l0aCBSRVZFUlNFIFNPTElEVVMgVSswMDVDIChiYWNrc2xhc2gpXG4gICAgICogICAgICAgIGNoYXJhY3RlcnMuPC9wPlxuICAgICAqICAgICAgPHA+SW5zdGVhZCwgdGhlIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdGVkIHNjcmlwdCBpbmplY3Rpb24gaXMgdmlzaWJsZSwgYW5kIGNhbiBiZSByZW1vdmVkXG4gICAgICogICAgICAgIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGFuIGFkbWluaXN0cmF0b3IuPC9wPlxuICAgICAqICAgIDwvZGl2PlxuICAgICAqICA8L2ZpbGU+XG4gICAgICogPC9leGFtcGxlPlxuICAgICAqXG4gICAgICogQGtub3duSXNzdWVcbiAgICAgKiBJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIGZvciBhbiBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbiB0byBjb250YWluIHRoZSBpbnRlcnBvbGF0aW9uIGVuZFxuICAgICAqIHN5bWJvbC4gRm9yIGV4YW1wbGUsIGB7eyAnfX0nIH19YCB3aWxsIGJlIGluY29ycmVjdGx5IGludGVycHJldGVkIGFzIGB7eyAnIH19YCArIGAnIH19YCwgaS5lLlxuICAgICAqIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUtcXVvdGUgKGAnYCkgYW5kIHRoZSBgJyB9fWAgc3RyaW5nLlxuICAgICAqXG4gICAgICogQGtub3duSXNzdWVcbiAgICAgKiBBbGwgZGlyZWN0aXZlcyBhbmQgY29tcG9uZW50cyBtdXN0IHVzZSB0aGUgc3RhbmRhcmQgYHt7YCBgfX1gIGludGVycG9sYXRpb24gc3ltYm9sc1xuICAgICAqIGluIHRoZWlyIHRlbXBsYXRlcy4gSWYgeW91IGNoYW5nZSB0aGUgYXBwbGljYXRpb24gaW50ZXJwb2xhdGlvbiBzeW1ib2xzIHRoZSB7QGxpbmsgJGNvbXBpbGV9XG4gICAgICogc2VydmljZSB3aWxsIGF0dGVtcHQgdG8gZGVub3JtYWxpemUgdGhlIHN0YW5kYXJkIHN5bWJvbHMgdG8gdGhlIGN1c3RvbSBzeW1ib2xzLlxuICAgICAqIFRoZSBkZW5vcm1hbGl6YXRpb24gcHJvY2VzcyBpcyBub3QgY2xldmVyIGVub3VnaCB0byBrbm93IG5vdCB0byByZXBsYWNlIGluc3RhbmNlcyBvZiB0aGUgc3RhbmRhcmRcbiAgICAgKiBzeW1ib2xzIHdoZXJlIHRoZXkgd291bGQgbm90IG5vcm1hbGx5IGJlIHRyZWF0ZWQgYXMgaW50ZXJwb2xhdGlvbiBzeW1ib2xzLiBGb3IgZXhhbXBsZSBpbiB0aGUgZm9sbG93aW5nXG4gICAgICogY29kZSBzbmlwcGV0IHRoZSBjbG9zaW5nIGJyYWNlcyBvZiB0aGUgbGl0ZXJhbCBvYmplY3Qgd2lsbCBnZXQgaW5jb3JyZWN0bHkgZGVub3JtYWxpemVkOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogPGRpdiBkYXRhLWNvbnRleHQ9J3tcImNvbnRleHRcIjp7XCJpZFwiOjMsXCJ0eXBlXCI6XCJwYWdlXCJ9fVwiPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIHdvcmthcm91bmQgaXMgdG8gZW5zdXJlIHRoYXQgc3VjaCBpbnN0YW5jZXMgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlOlxuICAgICAqIGBgYFxuICAgICAqIDxkaXYgZGF0YS1jb250ZXh0PSd7XCJjb250ZXh0XCI6e1wiaWRcIjozLFwidHlwZVwiOlwicGFnZVwifSB9XCI+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzE0NjEwI2lzc3VlY29tbWVudC0yMTk0MDEwOTkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGV4dCB3aXRoIG1hcmt1cCB0byBpbnRlcnBvbGF0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBtdXN0SGF2ZUV4cHJlc3Npb24gaWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgaW50ZXJwb2xhdGlvbiBzdHJpbmcgbXVzdCBoYXZlXG4gICAgICogICAgZW1iZWRkZWQgZXhwcmVzc2lvbiBpbiBvcmRlciB0byByZXR1cm4gYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4gU3RyaW5ncyB3aXRoIG5vXG4gICAgICogICAgZW1iZWRkZWQgZXhwcmVzc2lvbiB3aWxsIHJldHVybiBudWxsIGZvciB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHRydXN0ZWRDb250ZXh0IHdoZW4gcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBwYXNzZXMgdGhlIGludGVycG9sYXRlZFxuICAgICAqICAgIHJlc3VsdCB0aHJvdWdoIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWQgJHNjZS5nZXRUcnVzdGVkKGludGVycG9sYXRlZFJlc3VsdCxcbiAgICAgKiAgICB0cnVzdGVkQ29udGV4dCl9IGJlZm9yZSByZXR1cm5pbmcgaXQuICBSZWZlciB0byB0aGUge0BsaW5rIG5nLiRzY2UgJHNjZX0gc2VydmljZSB0aGF0XG4gICAgICogICAgcHJvdmlkZXMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgZm9yIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gYWxsT3JOb3RoaW5nIGlmIGB0cnVlYCwgdGhlbiB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gcmV0dXJucyB1bmRlZmluZWRcbiAgICAgKiAgICB1bmxlc3MgYWxsIGVtYmVkZGVkIGV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBgdW5kZWZpbmVkYC5cbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCl9IGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBjb21wdXRlIHRoZVxuICAgICAqICAgIGludGVycG9sYXRlZCBzdHJpbmcuIFRoZSBmdW5jdGlvbiBoYXMgdGhlc2UgcGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYGNvbnRleHRgOiBldmFsdWF0aW9uIGNvbnRleHQgZm9yIGFsbCBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgaW50ZXJwb2xhdGVkIHRleHRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiAkaW50ZXJwb2xhdGUodGV4dCwgbXVzdEhhdmVFeHByZXNzaW9uLCB0cnVzdGVkQ29udGV4dCwgYWxsT3JOb3RoaW5nKSB7XG4gICAgICAvLyBQcm92aWRlIGEgcXVpY2sgZXhpdCBhbmQgc2ltcGxpZmllZCByZXN1bHQgZnVuY3Rpb24gZm9yIHRleHQgd2l0aCBubyBpbnRlcnBvbGF0aW9uXG4gICAgICBpZiAoIXRleHQubGVuZ3RoIHx8IHRleHQuaW5kZXhPZihzdGFydFN5bWJvbCkgPT09IC0xKSB7XG4gICAgICAgIHZhciBjb25zdGFudEludGVycDtcbiAgICAgICAgaWYgKCFtdXN0SGF2ZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICB2YXIgdW5lc2NhcGVkVGV4dCA9IHVuZXNjYXBlVGV4dCh0ZXh0KTtcbiAgICAgICAgICBjb25zdGFudEludGVycCA9IHZhbHVlRm4odW5lc2NhcGVkVGV4dCk7XG4gICAgICAgICAgY29uc3RhbnRJbnRlcnAuZXhwID0gdGV4dDtcbiAgICAgICAgICBjb25zdGFudEludGVycC5leHByZXNzaW9ucyA9IFtdO1xuICAgICAgICAgIGNvbnN0YW50SW50ZXJwLiQkd2F0Y2hEZWxlZ2F0ZSA9IGNvbnN0YW50V2F0Y2hEZWxlZ2F0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uc3RhbnRJbnRlcnA7XG4gICAgICB9XG5cbiAgICAgIGFsbE9yTm90aGluZyA9ICEhYWxsT3JOb3RoaW5nO1xuICAgICAgdmFyIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgZW5kSW5kZXgsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGV4cHJlc3Npb25zID0gW10sXG4gICAgICAgICAgcGFyc2VGbnMgPSBbXSxcbiAgICAgICAgICB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGgsXG4gICAgICAgICAgZXhwLFxuICAgICAgICAgIGNvbmNhdCA9IFtdLFxuICAgICAgICAgIGV4cHJlc3Npb25Qb3NpdGlvbnMgPSBbXTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgdGV4dExlbmd0aCkge1xuICAgICAgICBpZiAoKChzdGFydEluZGV4ID0gdGV4dC5pbmRleE9mKHN0YXJ0U3ltYm9sLCBpbmRleCkpICE9PSAtMSkgJiZcbiAgICAgICAgICAgICAoKGVuZEluZGV4ID0gdGV4dC5pbmRleE9mKGVuZFN5bWJvbCwgc3RhcnRJbmRleCArIHN0YXJ0U3ltYm9sTGVuZ3RoKSkgIT09IC0xKSkge1xuICAgICAgICAgIGlmIChpbmRleCAhPT0gc3RhcnRJbmRleCkge1xuICAgICAgICAgICAgY29uY2F0LnB1c2godW5lc2NhcGVUZXh0KHRleHQuc3Vic3RyaW5nKGluZGV4LCBzdGFydEluZGV4KSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleHAgPSB0ZXh0LnN1YnN0cmluZyhzdGFydEluZGV4ICsgc3RhcnRTeW1ib2xMZW5ndGgsIGVuZEluZGV4KTtcbiAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKGV4cCk7XG4gICAgICAgICAgcGFyc2VGbnMucHVzaCgkcGFyc2UoZXhwLCBwYXJzZVN0cmluZ2lmeUludGVyY2VwdG9yKSk7XG4gICAgICAgICAgaW5kZXggPSBlbmRJbmRleCArIGVuZFN5bWJvbExlbmd0aDtcbiAgICAgICAgICBleHByZXNzaW9uUG9zaXRpb25zLnB1c2goY29uY2F0Lmxlbmd0aCk7XG4gICAgICAgICAgY29uY2F0LnB1c2goJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHdlIGRpZCBub3QgZmluZCBhbiBpbnRlcnBvbGF0aW9uLCBzbyB3ZSBoYXZlIHRvIGFkZCB0aGUgcmVtYWluZGVyIHRvIHRoZSBzZXBhcmF0b3JzIGFycmF5XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSB0ZXh0TGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25jYXQucHVzaCh1bmVzY2FwZVRleHQodGV4dC5zdWJzdHJpbmcoaW5kZXgpKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmNhdGVuYXRpbmcgZXhwcmVzc2lvbnMgbWFrZXMgaXQgaGFyZCB0byByZWFzb24gYWJvdXQgd2hldGhlciBzb21lIGNvbWJpbmF0aW9uIG9mXG4gICAgICAvLyBjb25jYXRlbmF0ZWQgdmFsdWVzIGFyZSB1bnNhZmUgdG8gdXNlIGFuZCBjb3VsZCBlYXNpbHkgbGVhZCB0byBYU1MuICBCeSByZXF1aXJpbmcgdGhhdCBhXG4gICAgICAvLyBzaW5nbGUgZXhwcmVzc2lvbiBiZSB1c2VkIGZvciBpZnJhbWVbc3JjXSwgb2JqZWN0W3NyY10sIGV0Yy4sIHdlIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCdzIHVzZWQgaXMgYXNzaWduZWQgb3IgY29uc3RydWN0ZWQgYnkgc29tZSBKUyBjb2RlIHNvbWV3aGVyZSB0aGF0IGlzIG1vcmUgdGVzdGFibGUgb3JcbiAgICAgIC8vIG1ha2UgaXQgb2J2aW91cyB0aGF0IHlvdSBib3VuZCB0aGUgdmFsdWUgdG8gc29tZSB1c2VyIGNvbnRyb2xsZWQgdmFsdWUuICBUaGlzIGhlbHBzIHJlZHVjZVxuICAgICAgLy8gdGhlIGxvYWQgd2hlbiBhdWRpdGluZyBmb3IgWFNTIGlzc3Vlcy5cbiAgICAgIGlmICh0cnVzdGVkQ29udGV4dCAmJiBjb25jYXQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICRpbnRlcnBvbGF0ZU1pbkVyci50aHJvd05vY29uY2F0KHRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW11c3RIYXZlRXhwcmVzc2lvbiB8fCBleHByZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGNvbXB1dGUgPSBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBleHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYWxsT3JOb3RoaW5nICYmIGlzVW5kZWZpbmVkKHZhbHVlc1tpXSkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbmNhdFtleHByZXNzaW9uUG9zaXRpb25zW2ldXSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbmNhdC5qb2luKCcnKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgZ2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB0cnVzdGVkQ29udGV4dCA/XG4gICAgICAgICAgICAkc2NlLmdldFRydXN0ZWQodHJ1c3RlZENvbnRleHQsIHZhbHVlKSA6XG4gICAgICAgICAgICAkc2NlLnZhbHVlT2YodmFsdWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gaW50ZXJwb2xhdGlvbkZuKGNvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBpaSA9IGV4cHJlc3Npb25zLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkoaWkpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3IgKDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBwYXJzZUZuc1tpXShjb250ZXh0KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBjb21wdXRlKHZhbHVlcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoJGludGVycG9sYXRlTWluRXJyLmludGVycih0ZXh0LCBlcnIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAvLyBhbGwgb2YgdGhlc2UgcHJvcGVydGllcyBhcmUgdW5kb2N1bWVudGVkIGZvciBub3dcbiAgICAgICAgICBleHA6IHRleHQsIC8vanVzdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHJlZ3VsYXIgd2F0Y2hlcnMgY3JlYXRlZCB2aWEgJHdhdGNoXG4gICAgICAgICAgZXhwcmVzc2lvbnM6IGV4cHJlc3Npb25zLFxuICAgICAgICAgICQkd2F0Y2hEZWxlZ2F0ZTogZnVuY3Rpb24oc2NvcGUsIGxpc3RlbmVyKSB7XG4gICAgICAgICAgICB2YXIgbGFzdFZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHNjb3BlLiR3YXRjaEdyb3VwKHBhcnNlRm5zLCAvKiogQHRoaXMgKi8gZnVuY3Rpb24gaW50ZXJwb2xhdGVGbldhdGNoZXIodmFsdWVzLCBvbGRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgdmFyIGN1cnJWYWx1ZSA9IGNvbXB1dGUodmFsdWVzKTtcbiAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBjdXJyVmFsdWUsIHZhbHVlcyAhPT0gb2xkVmFsdWVzID8gbGFzdFZhbHVlIDogY3VyclZhbHVlLCBzY29wZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdFZhbHVlID0gY3VyclZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcGFyc2VTdHJpbmdpZnlJbnRlcmNlcHRvcih2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gZ2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiBhbGxPck5vdGhpbmcgJiYgIWlzRGVmaW5lZCh2YWx1ZSkgPyB2YWx1ZSA6IHN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKCRpbnRlcnBvbGF0ZU1pbkVyci5pbnRlcnIodGV4dCwgZXJyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkaW50ZXJwb2xhdGUjc3RhcnRTeW1ib2xcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTeW1ib2wgdG8gZGVub3RlIHRoZSBzdGFydCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBge3tgLlxuICAgICAqXG4gICAgICogVXNlIHtAbGluayBuZy4kaW50ZXJwb2xhdGVQcm92aWRlciNzdGFydFN5bWJvbCBgJGludGVycG9sYXRlUHJvdmlkZXIuc3RhcnRTeW1ib2xgfSB0byBjaGFuZ2VcbiAgICAgKiB0aGUgc3ltYm9sLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gc3RhcnQgc3ltYm9sLlxuICAgICAqL1xuICAgICRpbnRlcnBvbGF0ZS5zdGFydFN5bWJvbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHN0YXJ0U3ltYm9sO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkaW50ZXJwb2xhdGUjZW5kU3ltYm9sXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU3ltYm9sIHRvIGRlbm90ZSB0aGUgZW5kIG9mIGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRlZCBzdHJpbmcuIERlZmF1bHRzIHRvIGB9fWAuXG4gICAgICpcbiAgICAgKiBVc2Uge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyI2VuZFN5bWJvbCBgJGludGVycG9sYXRlUHJvdmlkZXIuZW5kU3ltYm9sYH0gdG8gY2hhbmdlXG4gICAgICogdGhlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGVuZCBzeW1ib2wuXG4gICAgICovXG4gICAgJGludGVycG9sYXRlLmVuZFN5bWJvbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGVuZFN5bWJvbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuICRpbnRlcnBvbGF0ZTtcbiAgfV07XG59XG5cbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJEludGVydmFsUHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyRxJywgJyQkcScsICckYnJvd3NlcicsXG4gICAgICAgZnVuY3Rpb24oJHJvb3RTY29wZSwgICAkd2luZG93LCAgICRxLCAgICQkcSwgICAkYnJvd3Nlcikge1xuICAgIHZhciBpbnRlcnZhbHMgPSB7fTtcblxuXG4gICAgIC8qKlxuICAgICAgKiBAbmdkb2Mgc2VydmljZVxuICAgICAgKiBAbmFtZSAkaW50ZXJ2YWxcbiAgICAgICpcbiAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAqIEFuZ3VsYXIncyB3cmFwcGVyIGZvciBgd2luZG93LnNldEludGVydmFsYC4gVGhlIGBmbmAgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZXZlcnkgYGRlbGF5YFxuICAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICAqXG4gICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgcmVnaXN0ZXJpbmcgYW4gaW50ZXJ2YWwgZnVuY3Rpb24gaXMgYSBwcm9taXNlLiBUaGlzIHByb21pc2Ugd2lsbCBiZVxuICAgICAgKiBub3RpZmllZCB1cG9uIGVhY2ggdGljayBvZiB0aGUgaW50ZXJ2YWwsIGFuZCB3aWxsIGJlIHJlc29sdmVkIGFmdGVyIGBjb3VudGAgaXRlcmF0aW9ucywgb3JcbiAgICAgICogcnVuIGluZGVmaW5pdGVseSBpZiBgY291bnRgIGlzIG5vdCBkZWZpbmVkLiBUaGUgdmFsdWUgb2YgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRoZVxuICAgICAgKiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGF0IGhhdmUgcnVuLlxuICAgICAgKiBUbyBjYW5jZWwgYW4gaW50ZXJ2YWwsIGNhbGwgYCRpbnRlcnZhbC5jYW5jZWwocHJvbWlzZSlgLlxuICAgICAgKlxuICAgICAgKiBJbiB0ZXN0cyB5b3UgY2FuIHVzZSB7QGxpbmsgbmdNb2NrLiRpbnRlcnZhbCNmbHVzaCBgJGludGVydmFsLmZsdXNoKG1pbGxpcylgfSB0b1xuICAgICAgKiBtb3ZlIGZvcndhcmQgYnkgYG1pbGxpc2AgbWlsbGlzZWNvbmRzIGFuZCB0cmlnZ2VyIGFueSBmdW5jdGlvbnMgc2NoZWR1bGVkIHRvIHJ1biBpbiB0aGF0XG4gICAgICAqIHRpbWUuXG4gICAgICAqXG4gICAgICAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gICAgICAqICoqTm90ZSoqOiBJbnRlcnZhbHMgY3JlYXRlZCBieSB0aGlzIHNlcnZpY2UgbXVzdCBiZSBleHBsaWNpdGx5IGRlc3Ryb3llZCB3aGVuIHlvdSBhcmUgZmluaXNoZWRcbiAgICAgICogd2l0aCB0aGVtLiAgSW4gcGFydGljdWxhciB0aGV5IGFyZSBub3QgYXV0b21hdGljYWxseSBkZXN0cm95ZWQgd2hlbiBhIGNvbnRyb2xsZXIncyBzY29wZSBvciBhXG4gICAgICAqIGRpcmVjdGl2ZSdzIGVsZW1lbnQgYXJlIGRlc3Ryb3llZC5cbiAgICAgICogWW91IHNob3VsZCB0YWtlIHRoaXMgaW50byBjb25zaWRlcmF0aW9uIGFuZCBtYWtlIHN1cmUgdG8gYWx3YXlzIGNhbmNlbCB0aGUgaW50ZXJ2YWwgYXQgdGhlXG4gICAgICAqIGFwcHJvcHJpYXRlIG1vbWVudC4gIFNlZSB0aGUgZXhhbXBsZSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyBhbmQgd2hlbiB0byBkbyB0aGlzLlxuICAgICAgKiA8L2Rpdj5cbiAgICAgICpcbiAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCByZXBlYXRlZGx5LiBJZiBubyBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAgKiAgIGFyZSBwYXNzZWQgKHNlZSBiZWxvdyksIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCBpdGVyYXRpb24gY291bnQuXG4gICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gZWFjaCBmdW5jdGlvbiBjYWxsLlxuICAgICAgKiBAcGFyYW0ge251bWJlcj19IFtjb3VudD0wXSBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0LiBJZiBub3Qgc2V0LCBvciAwLCB3aWxsIHJlcGVhdFxuICAgICAgKiAgIGluZGVmaW5pdGVseS5cbiAgICAgICogQHBhcmFtIHtib29sZWFuPX0gW2ludm9rZUFwcGx5PXRydWVdIElmIHNldCB0byBgZmFsc2VgIHNraXBzIG1vZGVsIGRpcnR5IGNoZWNraW5nLCBvdGhlcndpc2VcbiAgICAgICogICB3aWxsIGludm9rZSBgZm5gIHdpdGhpbiB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5ICRhcHBseX0gYmxvY2suXG4gICAgICAqIEBwYXJhbSB7Li4uKj19IFBhc3MgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBleGVjdXRlZCBmdW5jdGlvbi5cbiAgICAgICogQHJldHVybnMge3Byb21pc2V9IEEgcHJvbWlzZSB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIG9uIGVhY2ggaXRlcmF0aW9uLlxuICAgICAgKlxuICAgICAgKiBAZXhhbXBsZVxuICAgICAgKiA8ZXhhbXBsZSBtb2R1bGU9XCJpbnRlcnZhbEV4YW1wbGVcIiBuYW1lPVwiaW50ZXJ2YWwtc2VydmljZVwiPlxuICAgICAgKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgKiAgIDxzY3JpcHQ+XG4gICAgICAqICAgICBhbmd1bGFyLm1vZHVsZSgnaW50ZXJ2YWxFeGFtcGxlJywgW10pXG4gICAgICAqICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRpbnRlcnZhbCcsXG4gICAgICAqICAgICAgICAgZnVuY3Rpb24oJHNjb3BlLCAkaW50ZXJ2YWwpIHtcbiAgICAgICogICAgICAgICAgICRzY29wZS5mb3JtYXQgPSAnTS9kL3l5IGg6bW06c3MgYSc7XG4gICAgICAqICAgICAgICAgICAkc2NvcGUuYmxvb2RfMSA9IDEwMDtcbiAgICAgICogICAgICAgICAgICRzY29wZS5ibG9vZF8yID0gMTIwO1xuICAgICAgKlxuICAgICAgKiAgICAgICAgICAgdmFyIHN0b3A7XG4gICAgICAqICAgICAgICAgICAkc2NvcGUuZmlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICogICAgICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgYSBuZXcgZmlnaHQgaWYgd2UgYXJlIGFscmVhZHkgZmlnaHRpbmdcbiAgICAgICogICAgICAgICAgICAgaWYgKCBhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSApIHJldHVybjtcbiAgICAgICpcbiAgICAgICogICAgICAgICAgICAgc3RvcCA9ICRpbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmJsb29kXzEgPiAwICYmICRzY29wZS5ibG9vZF8yID4gMCkge1xuICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLmJsb29kXzEgPSAkc2NvcGUuYmxvb2RfMSAtIDM7XG4gICAgICAqICAgICAgICAgICAgICAgICAkc2NvcGUuYmxvb2RfMiA9ICRzY29wZS5ibG9vZF8yIC0gNDtcbiAgICAgICogICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLnN0b3BGaWdodCgpO1xuICAgICAgKiAgICAgICAgICAgICAgIH1cbiAgICAgICogICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICogICAgICAgICAgIH07XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAkc2NvcGUuc3RvcEZpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAqICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSkge1xuICAgICAgKiAgICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoc3RvcCk7XG4gICAgICAqICAgICAgICAgICAgICAgc3RvcCA9IHVuZGVmaW5lZDtcbiAgICAgICogICAgICAgICAgICAgfVxuICAgICAgKiAgICAgICAgICAgfTtcbiAgICAgICpcbiAgICAgICogICAgICAgICAgICRzY29wZS5yZXNldEZpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAqICAgICAgICAgICAgICRzY29wZS5ibG9vZF8xID0gMTAwO1xuICAgICAgKiAgICAgICAgICAgICAkc2NvcGUuYmxvb2RfMiA9IDEyMDtcbiAgICAgICogICAgICAgICAgIH07XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgKiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJ2YWwgaXMgZGVzdHJveWVkIHRvb1xuICAgICAgKiAgICAgICAgICAgICAkc2NvcGUuc3RvcEZpZ2h0KCk7XG4gICAgICAqICAgICAgICAgICB9KTtcbiAgICAgICogICAgICAgICB9XSlcbiAgICAgICogICAgICAgLy8gUmVnaXN0ZXIgdGhlICdteUN1cnJlbnRUaW1lJyBkaXJlY3RpdmUgZmFjdG9yeSBtZXRob2QuXG4gICAgICAqICAgICAgIC8vIFdlIGluamVjdCAkaW50ZXJ2YWwgYW5kIGRhdGVGaWx0ZXIgc2VydmljZSBzaW5jZSB0aGUgZmFjdG9yeSBtZXRob2QgaXMgREkuXG4gICAgICAqICAgICAgIC5kaXJlY3RpdmUoJ215Q3VycmVudFRpbWUnLCBbJyRpbnRlcnZhbCcsICdkYXRlRmlsdGVyJyxcbiAgICAgICogICAgICAgICBmdW5jdGlvbigkaW50ZXJ2YWwsIGRhdGVGaWx0ZXIpIHtcbiAgICAgICogICAgICAgICAgIC8vIHJldHVybiB0aGUgZGlyZWN0aXZlIGxpbmsgZnVuY3Rpb24uIChjb21waWxlIGZ1bmN0aW9uIG5vdCBuZWVkZWQpXG4gICAgICAqICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAqICAgICAgICAgICAgIHZhciBmb3JtYXQsICAvLyBkYXRlIGZvcm1hdFxuICAgICAgKiAgICAgICAgICAgICAgICAgc3RvcFRpbWU7IC8vIHNvIHRoYXQgd2UgY2FuIGNhbmNlbCB0aGUgdGltZSB1cGRhdGVzXG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAgIC8vIHVzZWQgdG8gdXBkYXRlIHRoZSBVSVxuICAgICAgKiAgICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVUaW1lKCkge1xuICAgICAgKiAgICAgICAgICAgICAgIGVsZW1lbnQudGV4dChkYXRlRmlsdGVyKG5ldyBEYXRlKCksIGZvcm1hdCkpO1xuICAgICAgKiAgICAgICAgICAgICB9XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAgIC8vIHdhdGNoIHRoZSBleHByZXNzaW9uLCBhbmQgdXBkYXRlIHRoZSBVSSBvbiBjaGFuZ2UuXG4gICAgICAqICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5teUN1cnJlbnRUaW1lLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgKiAgICAgICAgICAgICAgIGZvcm1hdCA9IHZhbHVlO1xuICAgICAgKiAgICAgICAgICAgICAgIHVwZGF0ZVRpbWUoKTtcbiAgICAgICogICAgICAgICAgICAgfSk7XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAgIHN0b3BUaW1lID0gJGludGVydmFsKHVwZGF0ZVRpbWUsIDEwMDApO1xuICAgICAgKlxuICAgICAgKiAgICAgICAgICAgICAvLyBsaXN0ZW4gb24gRE9NIGRlc3Ryb3kgKHJlbW92YWwpIGV2ZW50LCBhbmQgY2FuY2VsIHRoZSBuZXh0IFVJIHVwZGF0ZVxuICAgICAgKiAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IHVwZGF0aW5nIHRpbWUgYWZ0ZXIgdGhlIERPTSBlbGVtZW50IHdhcyByZW1vdmVkLlxuICAgICAgKiAgICAgICAgICAgICBlbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgKiAgICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoc3RvcFRpbWUpO1xuICAgICAgKiAgICAgICAgICAgICB9KTtcbiAgICAgICogICAgICAgICAgIH1cbiAgICAgICogICAgICAgICB9XSk7XG4gICAgICAqICAgPC9zY3JpcHQ+XG4gICAgICAqXG4gICAgICAqICAgPGRpdj5cbiAgICAgICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAqICAgICAgIDxsYWJlbD5EYXRlIGZvcm1hdDogPGlucHV0IG5nLW1vZGVsPVwiZm9ybWF0XCI+PC9sYWJlbD4gPGhyLz5cbiAgICAgICogICAgICAgQ3VycmVudCB0aW1lIGlzOiA8c3BhbiBteS1jdXJyZW50LXRpbWU9XCJmb3JtYXRcIj48L3NwYW4+XG4gICAgICAqICAgICAgIDxoci8+XG4gICAgICAqICAgICAgIEJsb29kIDEgOiA8Zm9udCBjb2xvcj0ncmVkJz57e2Jsb29kXzF9fTwvZm9udD5cbiAgICAgICogICAgICAgQmxvb2QgMiA6IDxmb250IGNvbG9yPSdyZWQnPnt7Ymxvb2RfMn19PC9mb250PlxuICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLW5nLWNsaWNrPVwiZmlnaHQoKVwiPkZpZ2h0PC9idXR0b24+XG4gICAgICAqICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtbmctY2xpY2s9XCJzdG9wRmlnaHQoKVwiPlN0b3BGaWdodDwvYnV0dG9uPlxuICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLW5nLWNsaWNrPVwicmVzZXRGaWdodCgpXCI+cmVzZXRGaWdodDwvYnV0dG9uPlxuICAgICAgKiAgICAgPC9kaXY+XG4gICAgICAqICAgPC9kaXY+XG4gICAgICAqXG4gICAgICAqIDwvZmlsZT5cbiAgICAgICogPC9leGFtcGxlPlxuICAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnRlcnZhbChmbiwgZGVsYXksIGNvdW50LCBpbnZva2VBcHBseSkge1xuICAgICAgdmFyIGhhc1BhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0LFxuICAgICAgICAgIGFyZ3MgPSBoYXNQYXJhbXMgPyBzbGljZUFyZ3MoYXJndW1lbnRzLCA0KSA6IFtdLFxuICAgICAgICAgIHNldEludGVydmFsID0gJHdpbmRvdy5zZXRJbnRlcnZhbCxcbiAgICAgICAgICBjbGVhckludGVydmFsID0gJHdpbmRvdy5jbGVhckludGVydmFsLFxuICAgICAgICAgIGl0ZXJhdGlvbiA9IDAsXG4gICAgICAgICAgc2tpcEFwcGx5ID0gKGlzRGVmaW5lZChpbnZva2VBcHBseSkgJiYgIWludm9rZUFwcGx5KSxcbiAgICAgICAgICBkZWZlcnJlZCA9IChza2lwQXBwbHkgPyAkJHEgOiAkcSkuZGVmZXIoKSxcbiAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZTtcblxuICAgICAgY291bnQgPSBpc0RlZmluZWQoY291bnQpID8gY291bnQgOiAwO1xuXG4gICAgICBwcm9taXNlLiQkaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgICAgIGlmIChza2lwQXBwbHkpIHtcbiAgICAgICAgICAkYnJvd3Nlci5kZWZlcihjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZlcnJlZC5ub3RpZnkoaXRlcmF0aW9uKyspO1xuXG4gICAgICAgIGlmIChjb3VudCA+IDAgJiYgaXRlcmF0aW9uID49IGNvdW50KSB7XG4gICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpdGVyYXRpb24pO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvbWlzZS4kJGludGVydmFsSWQpO1xuICAgICAgICAgIGRlbGV0ZSBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFza2lwQXBwbHkpICRyb290U2NvcGUuJGFwcGx5KCk7XG5cbiAgICAgIH0sIGRlbGF5KTtcblxuICAgICAgaW50ZXJ2YWxzW3Byb21pc2UuJCRpbnRlcnZhbElkXSA9IGRlZmVycmVkO1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcblxuICAgICAgZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICAgIGlmICghaGFzUGFyYW1zKSB7XG4gICAgICAgICAgZm4oaXRlcmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuXG4gICAgIC8qKlxuICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAqIEBuYW1lICRpbnRlcnZhbCNjYW5jZWxcbiAgICAgICpcbiAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAqIENhbmNlbHMgYSB0YXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHByb21pc2VgLlxuICAgICAgKlxuICAgICAgKiBAcGFyYW0ge1Byb21pc2U9fSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBgJGludGVydmFsYCBmdW5jdGlvbi5cbiAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIHdhcyBzdWNjZXNzZnVsbHkgY2FuY2VsZWQuXG4gICAgICAqL1xuICAgIGludGVydmFsLmNhbmNlbCA9IGZ1bmN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlICYmIHByb21pc2UuJCRpbnRlcnZhbElkIGluIGludGVydmFscykge1xuICAgICAgICAvLyBJbnRlcnZhbCBjYW5jZWxzIHNob3VsZCBub3QgcmVwb3J0IGFzIHVuaGFuZGxlZCBwcm9taXNlLlxuICAgICAgICBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdLnByb21pc2UuY2F0Y2gobm9vcCk7XG4gICAgICAgIGludGVydmFsc1twcm9taXNlLiQkaW50ZXJ2YWxJZF0ucmVqZWN0KCdjYW5jZWxlZCcpO1xuICAgICAgICAkd2luZG93LmNsZWFySW50ZXJ2YWwocHJvbWlzZS4kJGludGVydmFsSWQpO1xuICAgICAgICBkZWxldGUgaW50ZXJ2YWxzW3Byb21pc2UuJCRpbnRlcnZhbElkXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHJldHVybiBpbnRlcnZhbDtcbiAgfV07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRqc29ucENhbGxiYWNrc1xuICogQHJlcXVpcmVzICR3aW5kb3dcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBzZXJ2aWNlIGhhbmRsZXMgdGhlIGxpZmVjeWNsZSBvZiBjYWxsYmFja3MgdG8gaGFuZGxlIEpTT05QIHJlcXVlc3RzLlxuICogT3ZlcnJpZGUgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoIHRvIGN1c3RvbWlzZSB3aGVyZSB0aGUgY2FsbGJhY2tzIGFyZSBzdG9yZWQgYW5kXG4gKiBob3cgdGhleSB2YXJ5IGNvbXBhcmVkIHRvIHRoZSByZXF1ZXN0ZWQgdXJsLlxuICovXG52YXIgJGpzb25wQ2FsbGJhY2tzUHJvdmlkZXIgPSAvKiogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG4gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsIGZ1bmN0aW9uKCR3aW5kb3cpIHtcbiAgICB2YXIgY2FsbGJhY2tzID0gJHdpbmRvdy5hbmd1bGFyLmNhbGxiYWNrcztcbiAgICB2YXIgY2FsbGJhY2tNYXAgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrSWQpIHtcbiAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgY2FsbGJhY2suZGF0YSA9IGRhdGE7XG4gICAgICAgIGNhbGxiYWNrLmNhbGxlZCA9IHRydWU7XG4gICAgICB9O1xuICAgICAgY2FsbGJhY2suaWQgPSBjYWxsYmFja0lkO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRqc29ucENhbGxiYWNrcyNjcmVhdGVDYWxsYmFja1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCB0aGUgdXJsIG9mIHRoZSBKU09OUCByZXF1ZXN0XG4gICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgY2FsbGJhY2sgcGF0aCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIgYXMgcGFydCBvZiB0aGUgSlNPTlAgcmVxdWVzdFxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiB7QGxpbmsgJGh0dHBCYWNrZW5kfSBjYWxscyB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjYWxsYmFjayBhbmQgZ2V0IGhvbGQgb2YgdGhlIHBhdGggdG8gdGhlIGNhbGxiYWNrXG4gICAgICAgKiB0byBwYXNzIHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIGl0cyBwYXlsb2FkIGluIHRoZSBKU09OUCByZXNwb25zZS5cbiAgICAgICAqL1xuICAgICAgY3JlYXRlQ2FsbGJhY2s6IGZ1bmN0aW9uKHVybCkge1xuICAgICAgICB2YXIgY2FsbGJhY2tJZCA9ICdfJyArIChjYWxsYmFja3MuJCRjb3VudGVyKyspLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgdmFyIGNhbGxiYWNrUGF0aCA9ICdhbmd1bGFyLmNhbGxiYWNrcy4nICsgY2FsbGJhY2tJZDtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2tJZCk7XG4gICAgICAgIGNhbGxiYWNrTWFwW2NhbGxiYWNrUGF0aF0gPSBjYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrUGF0aDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRqc29ucENhbGxiYWNrcyN3YXNDYWxsZWRcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja1BhdGggdGhlIHBhdGggdG8gdGhlIGNhbGxiYWNrIHRoYXQgd2FzIHNlbnQgaW4gdGhlIEpTT05QIHJlcXVlc3RcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBjYWxsYmFjayBoYXMgYmVlbiBjYWxsZWQsIGFzIGEgcmVzdWx0IG9mIHRoZSBKU09OUCByZXNwb25zZVxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiB7QGxpbmsgJGh0dHBCYWNrZW5kfSBjYWxscyB0aGlzIG1ldGhvZCB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBKU09OUCByZXNwb25zZSBhY3R1YWxseSBjYWxsZWQgdGhlXG4gICAgICAgKiBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICAgKi9cbiAgICAgIHdhc0NhbGxlZDogZnVuY3Rpb24oY2FsbGJhY2tQYXRoKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFja01hcFtjYWxsYmFja1BhdGhdLmNhbGxlZDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRqc29ucENhbGxiYWNrcyNnZXRSZXNwb25zZVxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrUGF0aCB0aGUgcGF0aCB0byB0aGUgY2FsbGJhY2sgdGhhdCB3YXMgc2VudCBpbiB0aGUgSlNPTlAgcmVxdWVzdFxuICAgICAgICogQHJldHVybnMgeyp9IHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHJlc3BvbnNlIHZpYSB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFja1xuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiB7QGxpbmsgJGh0dHBCYWNrZW5kfSBjYWxscyB0aGlzIG1ldGhvZCB0byBnZXQgaG9sZCBvZiB0aGUgZGF0YSB0aGF0IHdhcyBwcm92aWRlZCB0byB0aGUgY2FsbGJhY2tcbiAgICAgICAqIGluIHRoZSBKU09OUCByZXNwb25zZS5cbiAgICAgICAqL1xuICAgICAgZ2V0UmVzcG9uc2U6IGZ1bmN0aW9uKGNhbGxiYWNrUGF0aCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2tNYXBbY2FsbGJhY2tQYXRoXS5kYXRhO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGpzb25wQ2FsbGJhY2tzI3JlbW92ZUNhbGxiYWNrXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tQYXRoIHRoZSBwYXRoIHRvIHRoZSBjYWxsYmFjayB0aGF0IHdhcyBzZW50IGluIHRoZSBKU09OUCByZXF1ZXN0XG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIHtAbGluayAkaHR0cEJhY2tlbmR9IGNhbGxzIHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgY2FsbGJhY2sgYWZ0ZXIgdGhlIEpTT05QIHJlcXVlc3QgaGFzXG4gICAgICAgKiBjb21wbGV0ZWQgb3IgdGltZWQtb3V0LlxuICAgICAgICovXG4gICAgICByZW1vdmVDYWxsYmFjazogZnVuY3Rpb24oY2FsbGJhY2tQYXRoKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrTWFwW2NhbGxiYWNrUGF0aF07XG4gICAgICAgIGRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2suaWRdO1xuICAgICAgICBkZWxldGUgY2FsbGJhY2tNYXBbY2FsbGJhY2tQYXRoXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XTtcbn07XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRsb2NhbGVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICRsb2NhbGUgc2VydmljZSBwcm92aWRlcyBsb2NhbGl6YXRpb24gcnVsZXMgZm9yIHZhcmlvdXMgQW5ndWxhciBjb21wb25lbnRzLiBBcyBvZiByaWdodCBub3cgdGhlXG4gKiBvbmx5IHB1YmxpYyBhcGkgaXM6XG4gKlxuICogKiBgaWRgIOKAkyBge3N0cmluZ31gIOKAkyBsb2NhbGUgaWQgZm9ybWF0dGVkIGFzIGBsYW5ndWFnZUlkLWNvdW50cnlJZGAgKGUuZy4gYGVuLXVzYClcbiAqL1xuXG52YXIgUEFUSF9NQVRDSCA9IC9eKFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kLyxcbiAgICBERUZBVUxUX1BPUlRTID0geydodHRwJzogODAsICdodHRwcyc6IDQ0MywgJ2Z0cCc6IDIxfTtcbnZhciAkbG9jYXRpb25NaW5FcnIgPSBtaW5FcnIoJyRsb2NhdGlvbicpO1xuXG5cbi8qKlxuICogRW5jb2RlIHBhdGggdXNpbmcgZW5jb2RlVXJpU2VnbWVudCwgaWdub3JpbmcgZm9yd2FyZCBzbGFzaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byBlbmNvZGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aCkge1xuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJyksXG4gICAgICBpID0gc2VnbWVudHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBzZWdtZW50c1tpXSA9IGVuY29kZVVyaVNlZ21lbnQoc2VnbWVudHNbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oJy8nKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBYnNvbHV0ZVVybChhYnNvbHV0ZVVybCwgbG9jYXRpb25PYmopIHtcbiAgdmFyIHBhcnNlZFVybCA9IHVybFJlc29sdmUoYWJzb2x1dGVVcmwpO1xuXG4gIGxvY2F0aW9uT2JqLiQkcHJvdG9jb2wgPSBwYXJzZWRVcmwucHJvdG9jb2w7XG4gIGxvY2F0aW9uT2JqLiQkaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZTtcbiAgbG9jYXRpb25PYmouJCRwb3J0ID0gdG9JbnQocGFyc2VkVXJsLnBvcnQpIHx8IERFRkFVTFRfUE9SVFNbcGFyc2VkVXJsLnByb3RvY29sXSB8fCBudWxsO1xufVxuXG52YXIgRE9VQkxFX1NMQVNIX1JFR0VYID0gL15cXHMqW1xcXFwvXXsyLH0vO1xuZnVuY3Rpb24gcGFyc2VBcHBVcmwodXJsLCBsb2NhdGlvbk9iaikge1xuXG4gIGlmIChET1VCTEVfU0xBU0hfUkVHRVgudGVzdCh1cmwpKSB7XG4gICAgdGhyb3cgJGxvY2F0aW9uTWluRXJyKCdiYWRwYXRoJywgJ0ludmFsaWQgdXJsIFwiezB9XCIuJywgdXJsKTtcbiAgfVxuXG4gIHZhciBwcmVmaXhlZCA9ICh1cmwuY2hhckF0KDApICE9PSAnLycpO1xuICBpZiAocHJlZml4ZWQpIHtcbiAgICB1cmwgPSAnLycgKyB1cmw7XG4gIH1cbiAgdmFyIG1hdGNoID0gdXJsUmVzb2x2ZSh1cmwpO1xuICBsb2NhdGlvbk9iai4kJHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQocHJlZml4ZWQgJiYgbWF0Y2gucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgP1xuICAgICAgbWF0Y2gucGF0aG5hbWUuc3Vic3RyaW5nKDEpIDogbWF0Y2gucGF0aG5hbWUpO1xuICBsb2NhdGlvbk9iai4kJHNlYXJjaCA9IHBhcnNlS2V5VmFsdWUobWF0Y2guc2VhcmNoKTtcbiAgbG9jYXRpb25PYmouJCRoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoLmhhc2gpO1xuXG4gIC8vIG1ha2Ugc3VyZSBwYXRoIHN0YXJ0cyB3aXRoICcvJztcbiAgaWYgKGxvY2F0aW9uT2JqLiQkcGF0aCAmJiBsb2NhdGlvbk9iai4kJHBhdGguY2hhckF0KDApICE9PSAnLycpIHtcbiAgICBsb2NhdGlvbk9iai4kJHBhdGggPSAnLycgKyBsb2NhdGlvbk9iai4kJHBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHNlYXJjaCkge1xuICByZXR1cm4gc3RyLnNsaWNlKDAsIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiBAcmV0dXJucyB7c3RyaW5nfSByZXR1cm5zIHRleHQgZnJvbSBgdXJsYCBhZnRlciBgYmFzZWAgb3IgYHVuZGVmaW5lZGAgaWYgaXQgZG9lcyBub3QgYmVnaW4gd2l0aFxuICogICAgICAgICAgICAgICAgICAgdGhlIGV4cGVjdGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gc3RyaXBCYXNlVXJsKGJhc2UsIHVybCkge1xuICBpZiAoc3RhcnRzV2l0aCh1cmwsIGJhc2UpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHIoYmFzZS5sZW5ndGgpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3RyaXBIYXNoKHVybCkge1xuICB2YXIgaW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICByZXR1cm4gaW5kZXggPT09IC0xID8gdXJsIDogdXJsLnN1YnN0cigwLCBpbmRleCk7XG59XG5cbmZ1bmN0aW9uIHRyaW1FbXB0eUhhc2godXJsKSB7XG4gIHJldHVybiB1cmwucmVwbGFjZSgvKCMuKyl8IyQvLCAnJDEnKTtcbn1cblxuXG5mdW5jdGlvbiBzdHJpcEZpbGUodXJsKSB7XG4gIHJldHVybiB1cmwuc3Vic3RyKDAsIHN0cmlwSGFzaCh1cmwpLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbn1cblxuLyogcmV0dXJuIHRoZSBzZXJ2ZXIgb25seSAoc2NoZW1lOi8vaG9zdDpwb3J0KSAqL1xuZnVuY3Rpb24gc2VydmVyQmFzZSh1cmwpIHtcbiAgcmV0dXJuIHVybC5zdWJzdHJpbmcoMCwgdXJsLmluZGV4T2YoJy8nLCB1cmwuaW5kZXhPZignLy8nKSArIDIpKTtcbn1cblxuXG4vKipcbiAqIExvY2F0aW9uSHRtbDVVcmwgcmVwcmVzZW50cyBhIFVSTFxuICogVGhpcyBvYmplY3QgaXMgZXhwb3NlZCBhcyAkbG9jYXRpb24gc2VydmljZSB3aGVuIEhUTUw1IG1vZGUgaXMgZW5hYmxlZCBhbmQgc3VwcG9ydGVkXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwQmFzZSBhcHBsaWNhdGlvbiBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2VOb0ZpbGUgYXBwbGljYXRpb24gYmFzZSBVUkwgc3RyaXBwZWQgb2YgYW55IGZpbGVuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVByZWZpeCBVUkwgcGF0aCBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gTG9jYXRpb25IdG1sNVVybChhcHBCYXNlLCBhcHBCYXNlTm9GaWxlLCBiYXNlUHJlZml4KSB7XG4gIHRoaXMuJCRodG1sNSA9IHRydWU7XG4gIGJhc2VQcmVmaXggPSBiYXNlUHJlZml4IHx8ICcnO1xuICBwYXJzZUFic29sdXRlVXJsKGFwcEJhc2UsIHRoaXMpO1xuXG5cbiAgLyoqXG4gICAqIFBhcnNlIGdpdmVuIEhUTUw1IChyZWd1bGFyKSBVUkwgc3RyaW5nIGludG8gcHJvcGVydGllc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEhUTUw1IFVSTFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGhpcy4kJHBhcnNlID0gZnVuY3Rpb24odXJsKSB7XG4gICAgdmFyIHBhdGhVcmwgPSBzdHJpcEJhc2VVcmwoYXBwQmFzZU5vRmlsZSwgdXJsKTtcbiAgICBpZiAoIWlzU3RyaW5nKHBhdGhVcmwpKSB7XG4gICAgICB0aHJvdyAkbG9jYXRpb25NaW5FcnIoJ2lwdGhwcmZ4JywgJ0ludmFsaWQgdXJsIFwiezB9XCIsIG1pc3NpbmcgcGF0aCBwcmVmaXggXCJ7MX1cIi4nLCB1cmwsXG4gICAgICAgICAgYXBwQmFzZU5vRmlsZSk7XG4gICAgfVxuXG4gICAgcGFyc2VBcHBVcmwocGF0aFVybCwgdGhpcyk7XG5cbiAgICBpZiAoIXRoaXMuJCRwYXRoKSB7XG4gICAgICB0aGlzLiQkcGF0aCA9ICcvJztcbiAgICB9XG5cbiAgICB0aGlzLiQkY29tcG9zZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb21wb3NlIHVybCBhbmQgdXBkYXRlIGBhYnNVcmxgIHByb3BlcnR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aGlzLiQkY29tcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLFxuICAgICAgICBoYXNoID0gdGhpcy4kJGhhc2ggPyAnIycgKyBlbmNvZGVVcmlTZWdtZW50KHRoaXMuJCRoYXNoKSA6ICcnO1xuXG4gICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7XG4gICAgdGhpcy4kJGFic1VybCA9IGFwcEJhc2VOb0ZpbGUgKyB0aGlzLiQkdXJsLnN1YnN0cigxKTsgLy8gZmlyc3QgY2hhciBpcyBhbHdheXMgJy8nXG4gIH07XG5cbiAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikge1xuICAgIGlmIChyZWxIcmVmICYmIHJlbEhyZWZbMF0gPT09ICcjJykge1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBsaW5rcyB0byBoYXNoIGZyYWdtZW50czpcbiAgICAgIC8vIGtlZXAgdGhlIG9sZCB1cmwgYW5kIG9ubHkgcmVwbGFjZSB0aGUgaGFzaCBmcmFnbWVudFxuICAgICAgdGhpcy5oYXNoKHJlbEhyZWYuc2xpY2UoMSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBhcHBVcmwsIHByZXZBcHBVcmw7XG4gICAgdmFyIHJld3JpdHRlblVybDtcblxuXG4gICAgaWYgKGlzRGVmaW5lZChhcHBVcmwgPSBzdHJpcEJhc2VVcmwoYXBwQmFzZSwgdXJsKSkpIHtcbiAgICAgIHByZXZBcHBVcmwgPSBhcHBVcmw7XG4gICAgICBpZiAoYmFzZVByZWZpeCAmJiBpc0RlZmluZWQoYXBwVXJsID0gc3RyaXBCYXNlVXJsKGJhc2VQcmVmaXgsIGFwcFVybCkpKSB7XG4gICAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGUgKyAoc3RyaXBCYXNlVXJsKCcvJywgYXBwVXJsKSB8fCBhcHBVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZSArIHByZXZBcHBVcmw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0RlZmluZWQoYXBwVXJsID0gc3RyaXBCYXNlVXJsKGFwcEJhc2VOb0ZpbGUsIHVybCkpKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlTm9GaWxlICsgYXBwVXJsO1xuICAgIH0gZWxzZSBpZiAoYXBwQmFzZU5vRmlsZSA9PT0gdXJsICsgJy8nKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlTm9GaWxlO1xuICAgIH1cbiAgICBpZiAocmV3cml0dGVuVXJsKSB7XG4gICAgICB0aGlzLiQkcGFyc2UocmV3cml0dGVuVXJsKTtcbiAgICB9XG4gICAgcmV0dXJuICEhcmV3cml0dGVuVXJsO1xuICB9O1xufVxuXG5cbi8qKlxuICogTG9jYXRpb25IYXNoYmFuZ1VybCByZXByZXNlbnRzIFVSTFxuICogVGhpcyBvYmplY3QgaXMgZXhwb3NlZCBhcyAkbG9jYXRpb24gc2VydmljZSB3aGVuIGRldmVsb3BlciBkb2Vzbid0IG9wdCBpbnRvIGh0bWw1IG1vZGUuXG4gKiBJdCBhbHNvIHNlcnZlcyBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgaHRtbDUgbW9kZSBmYWxsYmFjayBvbiBsZWdhY3kgYnJvd3NlcnMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwQmFzZSBhcHBsaWNhdGlvbiBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2VOb0ZpbGUgYXBwbGljYXRpb24gYmFzZSBVUkwgc3RyaXBwZWQgb2YgYW55IGZpbGVuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gaGFzaFByZWZpeCBoYXNoYmFuZyBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gTG9jYXRpb25IYXNoYmFuZ1VybChhcHBCYXNlLCBhcHBCYXNlTm9GaWxlLCBoYXNoUHJlZml4KSB7XG5cbiAgcGFyc2VBYnNvbHV0ZVVybChhcHBCYXNlLCB0aGlzKTtcblxuXG4gIC8qKlxuICAgKiBQYXJzZSBnaXZlbiBoYXNoYmFuZyBVUkwgaW50byBwcm9wZXJ0aWVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSGFzaGJhbmcgVVJMXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aGlzLiQkcGFyc2UgPSBmdW5jdGlvbih1cmwpIHtcbiAgICB2YXIgd2l0aG91dEJhc2VVcmwgPSBzdHJpcEJhc2VVcmwoYXBwQmFzZSwgdXJsKSB8fCBzdHJpcEJhc2VVcmwoYXBwQmFzZU5vRmlsZSwgdXJsKTtcbiAgICB2YXIgd2l0aG91dEhhc2hVcmw7XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHdpdGhvdXRCYXNlVXJsKSAmJiB3aXRob3V0QmFzZVVybC5jaGFyQXQoMCkgPT09ICcjJykge1xuXG4gICAgICAvLyBUaGUgcmVzdCBvZiB0aGUgVVJMIHN0YXJ0cyB3aXRoIGEgaGFzaCBzbyB3ZSBoYXZlXG4gICAgICAvLyBnb3QgZWl0aGVyIGEgaGFzaGJhbmcgcGF0aCBvciBhIHBsYWluIGhhc2ggZnJhZ21lbnRcbiAgICAgIHdpdGhvdXRIYXNoVXJsID0gc3RyaXBCYXNlVXJsKGhhc2hQcmVmaXgsIHdpdGhvdXRCYXNlVXJsKTtcbiAgICAgIGlmIChpc1VuZGVmaW5lZCh3aXRob3V0SGFzaFVybCkpIHtcbiAgICAgICAgLy8gVGhlcmUgd2FzIG5vIGhhc2hiYW5nIHByZWZpeCBzbyB3ZSBqdXN0IGhhdmUgYSBoYXNoIGZyYWdtZW50XG4gICAgICAgIHdpdGhvdXRIYXNoVXJsID0gd2l0aG91dEJhc2VVcmw7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlcmUgd2FzIG5vIGhhc2hiYW5nIHBhdGggbm9yIGhhc2ggZnJhZ21lbnQ6XG4gICAgICAvLyBJZiB3ZSBhcmUgaW4gSFRNTDUgbW9kZSB3ZSB1c2Ugd2hhdCBpcyBsZWZ0IGFzIHRoZSBwYXRoO1xuICAgICAgLy8gT3RoZXJ3aXNlIHdlIGlnbm9yZSB3aGF0IGlzIGxlZnRcbiAgICAgIGlmICh0aGlzLiQkaHRtbDUpIHtcbiAgICAgICAgd2l0aG91dEhhc2hVcmwgPSB3aXRob3V0QmFzZVVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpdGhvdXRIYXNoVXJsID0gJyc7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh3aXRob3V0QmFzZVVybCkpIHtcbiAgICAgICAgICBhcHBCYXNlID0gdXJsO1xuICAgICAgICAgIHRoaXMucmVwbGFjZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VBcHBVcmwod2l0aG91dEhhc2hVcmwsIHRoaXMpO1xuXG4gICAgdGhpcy4kJHBhdGggPSByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHRoaXMuJCRwYXRoLCB3aXRob3V0SGFzaFVybCwgYXBwQmFzZSk7XG5cbiAgICB0aGlzLiQkY29tcG9zZSgpO1xuXG4gICAgLypcbiAgICAgKiBJbiBXaW5kb3dzLCBvbiBhbiBhbmNob3Igbm9kZSBvbiBkb2N1bWVudHMgbG9hZGVkIGZyb21cbiAgICAgKiB0aGUgZmlsZXN5c3RlbSwgdGhlIGJyb3dzZXIgd2lsbCByZXR1cm4gYSBwYXRobmFtZVxuICAgICAqIHByZWZpeGVkIHdpdGggdGhlIGRyaXZlIG5hbWUgKCcvQzovcGF0aCcpIHdoZW4gYVxuICAgICAqIHBhdGhuYW1lIHdpdGhvdXQgYSBkcml2ZSBpcyBzZXQ6XG4gICAgICogICogYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL2ZvbycpXG4gICAgICogICAqIGEucGF0aG5hbWUgPT09ICcvQzovZm9vJyAvL3RydWVcbiAgICAgKlxuICAgICAqIEluc2lkZSBvZiBBbmd1bGFyLCB3ZSdyZSBhbHdheXMgdXNpbmcgcGF0aG5hbWVzIHRoYXRcbiAgICAgKiBkbyBub3QgaW5jbHVkZSBkcml2ZSBuYW1lcyBmb3Igcm91dGluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHBhdGgsIHVybCwgYmFzZSkge1xuICAgICAgLypcbiAgICAgIE1hdGNoZXMgcGF0aHMgZm9yIGZpbGUgcHJvdG9jb2wgb24gd2luZG93cyxcbiAgICAgIHN1Y2ggYXMgL0M6L2Zvby9iYXIsIGFuZCBjYXB0dXJlcyBvbmx5IC9mb28vYmFyLlxuICAgICAgKi9cbiAgICAgIHZhciB3aW5kb3dzRmlsZVBhdGhFeHAgPSAvXlxcL1tBLVpdOihcXC8uKikvO1xuXG4gICAgICB2YXIgZmlyc3RQYXRoU2VnbWVudE1hdGNoO1xuXG4gICAgICAvL0dldCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBpbnB1dCBVUkwuXG4gICAgICBpZiAoc3RhcnRzV2l0aCh1cmwsIGJhc2UpKSB7XG4gICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGJhc2UsICcnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGlucHV0IFVSTCBpbnRlbnRpb25hbGx5IGNvbnRhaW5zIGEgZmlyc3QgcGF0aCBzZWdtZW50IHRoYXQgZW5kcyB3aXRoIGEgY29sb24uXG4gICAgICBpZiAod2luZG93c0ZpbGVQYXRoRXhwLmV4ZWModXJsKSkge1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH1cblxuICAgICAgZmlyc3RQYXRoU2VnbWVudE1hdGNoID0gd2luZG93c0ZpbGVQYXRoRXhwLmV4ZWMocGF0aCk7XG4gICAgICByZXR1cm4gZmlyc3RQYXRoU2VnbWVudE1hdGNoID8gZmlyc3RQYXRoU2VnbWVudE1hdGNoWzFdIDogcGF0aDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbXBvc2UgaGFzaGJhbmcgVVJMIGFuZCB1cGRhdGUgYGFic1VybGAgcHJvcGVydHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuJCRjb21wb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlYXJjaCA9IHRvS2V5VmFsdWUodGhpcy4kJHNlYXJjaCksXG4gICAgICAgIGhhc2ggPSB0aGlzLiQkaGFzaCA/ICcjJyArIGVuY29kZVVyaVNlZ21lbnQodGhpcy4kJGhhc2gpIDogJyc7XG5cbiAgICB0aGlzLiQkdXJsID0gZW5jb2RlUGF0aCh0aGlzLiQkcGF0aCkgKyAoc2VhcmNoID8gJz8nICsgc2VhcmNoIDogJycpICsgaGFzaDtcbiAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZSArICh0aGlzLiQkdXJsID8gaGFzaFByZWZpeCArIHRoaXMuJCR1cmwgOiAnJyk7XG4gIH07XG5cbiAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikge1xuICAgIGlmIChzdHJpcEhhc2goYXBwQmFzZSkgPT09IHN0cmlwSGFzaCh1cmwpKSB7XG4gICAgICB0aGlzLiQkcGFyc2UodXJsKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cblxuLyoqXG4gKiBMb2NhdGlvbkhhc2hiYW5nVXJsIHJlcHJlc2VudHMgVVJMXG4gKiBUaGlzIG9iamVjdCBpcyBleHBvc2VkIGFzICRsb2NhdGlvbiBzZXJ2aWNlIHdoZW4gaHRtbDUgaGlzdG9yeSBhcGkgaXMgZW5hYmxlZCBidXQgdGhlIGJyb3dzZXJcbiAqIGRvZXMgbm90IHN1cHBvcnQgaXQuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwQmFzZSBhcHBsaWNhdGlvbiBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2VOb0ZpbGUgYXBwbGljYXRpb24gYmFzZSBVUkwgc3RyaXBwZWQgb2YgYW55IGZpbGVuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gaGFzaFByZWZpeCBoYXNoYmFuZyBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwoYXBwQmFzZSwgYXBwQmFzZU5vRmlsZSwgaGFzaFByZWZpeCkge1xuICB0aGlzLiQkaHRtbDUgPSB0cnVlO1xuICBMb2NhdGlvbkhhc2hiYW5nVXJsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikge1xuICAgIGlmIChyZWxIcmVmICYmIHJlbEhyZWZbMF0gPT09ICcjJykge1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBsaW5rcyB0byBoYXNoIGZyYWdtZW50czpcbiAgICAgIC8vIGtlZXAgdGhlIG9sZCB1cmwgYW5kIG9ubHkgcmVwbGFjZSB0aGUgaGFzaCBmcmFnbWVudFxuICAgICAgdGhpcy5oYXNoKHJlbEhyZWYuc2xpY2UoMSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHJld3JpdHRlblVybDtcbiAgICB2YXIgYXBwVXJsO1xuXG4gICAgaWYgKGFwcEJhc2UgPT09IHN0cmlwSGFzaCh1cmwpKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSB1cmw7XG4gICAgfSBlbHNlIGlmICgoYXBwVXJsID0gc3RyaXBCYXNlVXJsKGFwcEJhc2VOb0ZpbGUsIHVybCkpKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlICsgaGFzaFByZWZpeCArIGFwcFVybDtcbiAgICB9IGVsc2UgaWYgKGFwcEJhc2VOb0ZpbGUgPT09IHVybCArICcvJykge1xuICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZU5vRmlsZTtcbiAgICB9XG4gICAgaWYgKHJld3JpdHRlblVybCkge1xuICAgICAgdGhpcy4kJHBhcnNlKHJld3JpdHRlblVybCk7XG4gICAgfVxuICAgIHJldHVybiAhIXJld3JpdHRlblVybDtcbiAgfTtcblxuICB0aGlzLiQkY29tcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLFxuICAgICAgICBoYXNoID0gdGhpcy4kJGhhc2ggPyAnIycgKyBlbmNvZGVVcmlTZWdtZW50KHRoaXMuJCRoYXNoKSA6ICcnO1xuXG4gICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7XG4gICAgLy8gaW5jbHVkZSBoYXNoUHJlZml4IGluICQkYWJzVXJsIHdoZW4gJCR1cmwgaXMgZW1wdHkgc28gSUU5IGRvZXMgbm90IHJlbG9hZCBwYWdlIGJlY2F1c2Ugb2YgcmVtb3ZhbCBvZiAnIydcbiAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZSArIGhhc2hQcmVmaXggKyB0aGlzLiQkdXJsO1xuICB9O1xuXG59XG5cblxudmFyIGxvY2F0aW9uUHJvdG90eXBlID0ge1xuXG4gIC8qKlxuICAgKiBFbnN1cmUgYWJzb2x1dGUgVVJMIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgJCRhYnNVcmw6JycsXG5cbiAgLyoqXG4gICAqIEFyZSB3ZSBpbiBodG1sNSBtb2RlP1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgJCRodG1sNTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEhhcyBhbnkgY2hhbmdlIGJlZW4gcmVwbGFjaW5nP1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgJCRyZXBsYWNlOiBmYWxzZSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jYWJzVXJsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS5cbiAgICpcbiAgICogUmV0dXJuIGZ1bGwgVVJMIHJlcHJlc2VudGF0aW9uIHdpdGggYWxsIHNlZ21lbnRzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHJ1bGVzIHNwZWNpZmllZCBpblxuICAgKiBbUkZDIDM5ODZdKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM5ODYudHh0KS5cbiAgICpcbiAgICpcbiAgICogYGBganNcbiAgICogLy8gZ2l2ZW4gVVJMIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvXG4gICAqIHZhciBhYnNVcmwgPSAkbG9jYXRpb24uYWJzVXJsKCk7XG4gICAqIC8vID0+IFwiaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBmdWxsIFVSTFxuICAgKi9cbiAgYWJzVXJsOiBsb2NhdGlvbkdldHRlcignJCRhYnNVcmwnKSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jdXJsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgLyBzZXR0ZXIuXG4gICAqXG4gICAqIFJldHVybiBVUkwgKGUuZy4gYC9wYXRoP2E9YiNoYXNoYCkgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBDaGFuZ2UgcGF0aCwgc2VhcmNoIGFuZCBoYXNoLCB3aGVuIGNhbGxlZCB3aXRoIHBhcmFtZXRlciBhbmQgcmV0dXJuIGAkbG9jYXRpb25gLlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cbiAgICogdmFyIHVybCA9ICRsb2NhdGlvbi51cmwoKTtcbiAgICogLy8gPT4gXCIvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc9fSB1cmwgTmV3IFVSTCB3aXRob3V0IGJhc2UgcHJlZml4IChlLmcuIGAvcGF0aD9hPWIjaGFzaGApXG4gICAqIEByZXR1cm4ge3N0cmluZ30gdXJsXG4gICAqL1xuICB1cmw6IGZ1bmN0aW9uKHVybCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh1cmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy4kJHVybDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2ggPSBQQVRIX01BVENILmV4ZWModXJsKTtcbiAgICBpZiAobWF0Y2hbMV0gfHwgdXJsID09PSAnJykgdGhpcy5wYXRoKGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFsxXSkpO1xuICAgIGlmIChtYXRjaFsyXSB8fCBtYXRjaFsxXSB8fCB1cmwgPT09ICcnKSB0aGlzLnNlYXJjaChtYXRjaFszXSB8fCAnJyk7XG4gICAgdGhpcy5oYXNoKG1hdGNoWzVdIHx8ICcnKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNwcm90b2NvbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIG9ubHkuXG4gICAqXG4gICAqIFJldHVybiBwcm90b2NvbCBvZiBjdXJyZW50IFVSTC5cbiAgICpcbiAgICpcbiAgICogYGBganNcbiAgICogLy8gZ2l2ZW4gVVJMIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvXG4gICAqIHZhciBwcm90b2NvbCA9ICRsb2NhdGlvbi5wcm90b2NvbCgpO1xuICAgKiAvLyA9PiBcImh0dHBcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBwcm90b2NvbCBvZiBjdXJyZW50IFVSTFxuICAgKi9cbiAgcHJvdG9jb2w6IGxvY2F0aW9uR2V0dGVyKCckJHByb3RvY29sJyksXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGxvY2F0aW9uI2hvc3RcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciBvbmx5LlxuICAgKlxuICAgKiBSZXR1cm4gaG9zdCBvZiBjdXJyZW50IFVSTC5cbiAgICpcbiAgICogTm90ZTogY29tcGFyZWQgdG8gdGhlIG5vbi1hbmd1bGFyIHZlcnNpb24gYGxvY2F0aW9uLmhvc3RgIHdoaWNoIHJldHVybnMgYGhvc3RuYW1lOnBvcnRgLCB0aGlzIHJldHVybnMgdGhlIGBob3N0bmFtZWAgcG9ydGlvbiBvbmx5LlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cbiAgICogdmFyIGhvc3QgPSAkbG9jYXRpb24uaG9zdCgpO1xuICAgKiAvLyA9PiBcImV4YW1wbGUuY29tXCJcbiAgICpcbiAgICogLy8gZ2l2ZW4gVVJMIGh0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAvIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94b1xuICAgKiBob3N0ID0gJGxvY2F0aW9uLmhvc3QoKTtcbiAgICogLy8gPT4gXCJleGFtcGxlLmNvbVwiXG4gICAqIGhvc3QgPSBsb2NhdGlvbi5ob3N0O1xuICAgKiAvLyA9PiBcImV4YW1wbGUuY29tOjgwODBcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBob3N0IG9mIGN1cnJlbnQgVVJMLlxuICAgKi9cbiAgaG9zdDogbG9jYXRpb25HZXR0ZXIoJyQkaG9zdCcpLFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNwb3J0XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS5cbiAgICpcbiAgICogUmV0dXJuIHBvcnQgb2YgY3VycmVudCBVUkwuXG4gICAqXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIC8vIGdpdmVuIFVSTCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94b1xuICAgKiB2YXIgcG9ydCA9ICRsb2NhdGlvbi5wb3J0KCk7XG4gICAqIC8vID0+IDgwXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHBvcnRcbiAgICovXG4gIHBvcnQ6IGxvY2F0aW9uR2V0dGVyKCckJHBvcnQnKSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jcGF0aFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLlxuICAgKlxuICAgKiBSZXR1cm4gcGF0aCBvZiBjdXJyZW50IFVSTCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIENoYW5nZSBwYXRoIHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuXG4gICAqXG4gICAqIE5vdGU6IFBhdGggc2hvdWxkIGFsd2F5cyBiZWdpbiB3aXRoIGZvcndhcmQgc2xhc2ggKC8pLCB0aGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgZm9yd2FyZCBzbGFzaFxuICAgKiBpZiBpdCBpcyBtaXNzaW5nLlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cbiAgICogdmFyIHBhdGggPSAkbG9jYXRpb24ucGF0aCgpO1xuICAgKiAvLyA9PiBcIi9zb21lL3BhdGhcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBwYXRoIE5ldyBwYXRoXG4gICAqIEByZXR1cm4geyhzdHJpbmd8b2JqZWN0KX0gcGF0aCBpZiBjYWxsZWQgd2l0aCBubyBwYXJhbWV0ZXJzLCBvciBgJGxvY2F0aW9uYCBpZiBjYWxsZWQgd2l0aCBhIHBhcmFtZXRlclxuICAgKi9cbiAgcGF0aDogbG9jYXRpb25HZXR0ZXJTZXR0ZXIoJyQkcGF0aCcsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aCAhPT0gbnVsbCA/IHBhdGgudG9TdHJpbmcoKSA6ICcnO1xuICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nID8gcGF0aCA6ICcvJyArIHBhdGg7XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNzZWFyY2hcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci5cbiAgICpcbiAgICogUmV0dXJuIHNlYXJjaCBwYXJ0IChhcyBvYmplY3QpIG9mIGN1cnJlbnQgVVJMIHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci5cbiAgICpcbiAgICogQ2hhbmdlIHNlYXJjaCBwYXJ0IHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuXG4gICAqXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIC8vIGdpdmVuIFVSTCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94b1xuICAgKiB2YXIgc2VhcmNoT2JqZWN0ID0gJGxvY2F0aW9uLnNlYXJjaCgpO1xuICAgKiAvLyA9PiB7Zm9vOiAnYmFyJywgYmF6OiAneG94byd9XG4gICAqXG4gICAqIC8vIHNldCBmb28gdG8gJ3lpcGVlJ1xuICAgKiAkbG9jYXRpb24uc2VhcmNoKCdmb28nLCAneWlwZWUnKTtcbiAgICogLy8gJGxvY2F0aW9uLnNlYXJjaCgpID0+IHtmb286ICd5aXBlZScsIGJhejogJ3hveG8nfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0LjxzdHJpbmc+fE9iamVjdC48QXJyYXkuPHN0cmluZz4+fSBzZWFyY2ggTmV3IHNlYXJjaCBwYXJhbXMgLSBzdHJpbmcgb3JcbiAgICogaGFzaCBvYmplY3QuXG4gICAqXG4gICAqIFdoZW4gY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgdGhlIG1ldGhvZCBhY3RzIGFzIGEgc2V0dGVyLCBzZXR0aW5nIHRoZSBgc2VhcmNoYCBjb21wb25lbnRcbiAgICogb2YgYCRsb2NhdGlvbmAgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICpcbiAgICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgaGFzaCBvYmplY3QgY29udGFpbmluZyBhbiBhcnJheSBvZiB2YWx1ZXMsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGVuY29kZWRcbiAgICogYXMgZHVwbGljYXRlIHNlYXJjaCBwYXJhbWV0ZXJzIGluIHRoZSBVUkwuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xOdW1iZXJ8QXJyYXk8c3RyaW5nPnxib29sZWFuKT19IHBhcmFtVmFsdWUgSWYgYHNlYXJjaGAgaXMgYSBzdHJpbmcgb3IgbnVtYmVyLCB0aGVuIGBwYXJhbVZhbHVlYFxuICAgKiB3aWxsIG92ZXJyaWRlIG9ubHkgYSBzaW5nbGUgc2VhcmNoIHByb3BlcnR5LlxuICAgKlxuICAgKiBJZiBgcGFyYW1WYWx1ZWAgaXMgYW4gYXJyYXksIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHByb3BlcnR5IG9mIHRoZSBgc2VhcmNoYCBjb21wb25lbnQgb2ZcbiAgICogYCRsb2NhdGlvbmAgc3BlY2lmaWVkIHZpYSB0aGUgZmlyc3QgYXJndW1lbnQuXG4gICAqXG4gICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgbnVsbGAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgdHJ1ZWAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGFkZGVkIHdpdGggbm9cbiAgICogdmFsdWUgbm9yIHRyYWlsaW5nIGVxdWFsIHNpZ24uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnMgdGhlIHBhcnNlZCBgc2VhcmNoYCBvYmplY3QuIElmIGNhbGxlZCB3aXRoXG4gICAqIG9uZSBvciBtb3JlIGFyZ3VtZW50cyByZXR1cm5zIGAkbG9jYXRpb25gIG9iamVjdCBpdHNlbGYuXG4gICAqL1xuICBzZWFyY2g6IGZ1bmN0aW9uKHNlYXJjaCwgcGFyYW1WYWx1ZSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gdGhpcy4kJHNlYXJjaDtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKGlzU3RyaW5nKHNlYXJjaCkgfHwgaXNOdW1iZXIoc2VhcmNoKSkge1xuICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC50b1N0cmluZygpO1xuICAgICAgICAgIHRoaXMuJCRzZWFyY2ggPSBwYXJzZUtleVZhbHVlKHNlYXJjaCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2VhcmNoKSkge1xuICAgICAgICAgIHNlYXJjaCA9IGNvcHkoc2VhcmNoLCB7fSk7XG4gICAgICAgICAgLy8gcmVtb3ZlIG9iamVjdCB1bmRlZmluZWQgb3IgbnVsbCBwcm9wZXJ0aWVzXG4gICAgICAgICAgZm9yRWFjaChzZWFyY2gsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBkZWxldGUgc2VhcmNoW2tleV07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLiQkc2VhcmNoID0gc2VhcmNoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignaXNyY2hhcmcnLFxuICAgICAgICAgICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBgJGxvY2F0aW9uI3NlYXJjaCgpYCBjYWxsIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHBhcmFtVmFsdWUpIHx8IHBhcmFtVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy4kJHNlYXJjaFtzZWFyY2hdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuJCRzZWFyY2hbc2VhcmNoXSA9IHBhcmFtVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLiQkY29tcG9zZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNoYXNoXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgLyBzZXR0ZXIuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGhhc2ggZnJhZ21lbnQgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQ2hhbmdlcyB0aGUgaGFzaCBmcmFnbWVudCB3aGVuIGNhbGxlZCB3aXRoIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGAkbG9jYXRpb25gLlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8jaGFzaFZhbHVlXG4gICAqIHZhciBoYXNoID0gJGxvY2F0aW9uLmhhc2goKTtcbiAgICogLy8gPT4gXCJoYXNoVmFsdWVcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBoYXNoIE5ldyBoYXNoIGZyYWdtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ30gaGFzaFxuICAgKi9cbiAgaGFzaDogbG9jYXRpb25HZXR0ZXJTZXR0ZXIoJyQkaGFzaCcsIGZ1bmN0aW9uKGhhc2gpIHtcbiAgICByZXR1cm4gaGFzaCAhPT0gbnVsbCA/IGhhc2gudG9TdHJpbmcoKSA6ICcnO1xuICB9KSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jcmVwbGFjZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSWYgY2FsbGVkLCBhbGwgY2hhbmdlcyB0byAkbG9jYXRpb24gZHVyaW5nIHRoZSBjdXJyZW50IGAkZGlnZXN0YCB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgaGlzdG9yeVxuICAgKiByZWNvcmQsIGluc3RlYWQgb2YgYWRkaW5nIGEgbmV3IG9uZS5cbiAgICovXG4gIHJlcGxhY2U6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJCRyZXBsYWNlID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxuZm9yRWFjaChbTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwsIExvY2F0aW9uSGFzaGJhbmdVcmwsIExvY2F0aW9uSHRtbDVVcmxdLCBmdW5jdGlvbihMb2NhdGlvbikge1xuICBMb2NhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGxvY2F0aW9uUHJvdG90eXBlKTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jc3RhdGVcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci5cbiAgICpcbiAgICogUmV0dXJuIHRoZSBoaXN0b3J5IHN0YXRlIG9iamVjdCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIENoYW5nZSB0aGUgaGlzdG9yeSBzdGF0ZSBvYmplY3Qgd2hlbiBjYWxsZWQgd2l0aCBvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuXG4gICAqIFRoZSBzdGF0ZSBvYmplY3QgaXMgbGF0ZXIgcGFzc2VkIHRvIGBwdXNoU3RhdGVgIG9yIGByZXBsYWNlU3RhdGVgLlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIG1ldGhvZCBpcyBzdXBwb3J0ZWQgb25seSBpbiBIVE1MNSBtb2RlIGFuZCBvbmx5IGluIGJyb3dzZXJzIHN1cHBvcnRpbmdcbiAgICogdGhlIEhUTUw1IEhpc3RvcnkgQVBJIChpLmUuIG1ldGhvZHMgYHB1c2hTdGF0ZWAgYW5kIGByZXBsYWNlU3RhdGVgKS4gSWYgeW91IG5lZWQgdG8gc3VwcG9ydFxuICAgKiBvbGRlciBicm93c2VycyAobGlrZSBJRTkgb3IgQW5kcm9pZCA8IDQuMCksIGRvbid0IHVzZSB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3Q9fSBzdGF0ZSBTdGF0ZSBvYmplY3QgZm9yIHB1c2hTdGF0ZSBvciByZXBsYWNlU3RhdGVcbiAgICogQHJldHVybiB7b2JqZWN0fSBzdGF0ZVxuICAgKi9cbiAgTG9jYXRpb24ucHJvdG90eXBlLnN0YXRlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLiQkc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKExvY2F0aW9uICE9PSBMb2NhdGlvbkh0bWw1VXJsIHx8ICF0aGlzLiQkaHRtbDUpIHtcbiAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignbm9zdGF0ZScsICdIaXN0b3J5IEFQSSBzdGF0ZSBzdXBwb3J0IGlzIGF2YWlsYWJsZSBvbmx5ICcgK1xuICAgICAgICAnaW4gSFRNTDUgbW9kZSBhbmQgb25seSBpbiBicm93c2VycyBzdXBwb3J0aW5nIEhUTUw1IEhpc3RvcnkgQVBJJyk7XG4gICAgfVxuICAgIC8vIFRoZSB1c2VyIG1pZ2h0IG1vZGlmeSBgc3RhdGVPYmplY3RgIGFmdGVyIGludm9raW5nIGAkbG9jYXRpb24uc3RhdGUoc3RhdGVPYmplY3QpYFxuICAgIC8vIGJ1dCB3ZSdyZSBjaGFuZ2luZyB0aGUgJCRzdGF0ZSByZWZlcmVuY2UgdG8gJGJyb3dzZXIuc3RhdGUoKSBkdXJpbmcgdGhlICRkaWdlc3RcbiAgICAvLyBzbyB0aGUgbW9kaWZpY2F0aW9uIHdpbmRvdyBpcyBuYXJyb3cuXG4gICAgdGhpcy4kJHN0YXRlID0gaXNVbmRlZmluZWQoc3RhdGUpID8gbnVsbCA6IHN0YXRlO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuXG5mdW5jdGlvbiBsb2NhdGlvbkdldHRlcihwcm9wZXJ0eSkge1xuICByZXR1cm4gLyoqIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW3Byb3BlcnR5XTtcbiAgfTtcbn1cblxuXG5mdW5jdGlvbiBsb2NhdGlvbkdldHRlclNldHRlcihwcm9wZXJ0eSwgcHJlcHJvY2Vzcykge1xuICByZXR1cm4gLyoqIEB0aGlzICovIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHldO1xuICAgIH1cblxuICAgIHRoaXNbcHJvcGVydHldID0gcHJlcHJvY2Vzcyh2YWx1ZSk7XG4gICAgdGhpcy4kJGNvbXBvc2UoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRsb2NhdGlvblxuICpcbiAqIEByZXF1aXJlcyAkcm9vdEVsZW1lbnRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSAkbG9jYXRpb24gc2VydmljZSBwYXJzZXMgdGhlIFVSTCBpbiB0aGUgYnJvd3NlciBhZGRyZXNzIGJhciAoYmFzZWQgb24gdGhlXG4gKiBbd2luZG93LmxvY2F0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi93aW5kb3cubG9jYXRpb24pKSBhbmQgbWFrZXMgdGhlIFVSTFxuICogYXZhaWxhYmxlIHRvIHlvdXIgYXBwbGljYXRpb24uIENoYW5nZXMgdG8gdGhlIFVSTCBpbiB0aGUgYWRkcmVzcyBiYXIgYXJlIHJlZmxlY3RlZCBpbnRvXG4gKiAkbG9jYXRpb24gc2VydmljZSBhbmQgY2hhbmdlcyB0byAkbG9jYXRpb24gYXJlIHJlZmxlY3RlZCBpbnRvIHRoZSBicm93c2VyIGFkZHJlc3MgYmFyLlxuICpcbiAqICoqVGhlICRsb2NhdGlvbiBzZXJ2aWNlOioqXG4gKlxuICogLSBFeHBvc2VzIHRoZSBjdXJyZW50IFVSTCBpbiB0aGUgYnJvd3NlciBhZGRyZXNzIGJhciwgc28geW91IGNhblxuICogICAtIFdhdGNoIGFuZCBvYnNlcnZlIHRoZSBVUkwuXG4gKiAgIC0gQ2hhbmdlIHRoZSBVUkwuXG4gKiAtIFN5bmNocm9uaXplcyB0aGUgVVJMIHdpdGggdGhlIGJyb3dzZXIgd2hlbiB0aGUgdXNlclxuICogICAtIENoYW5nZXMgdGhlIGFkZHJlc3MgYmFyLlxuICogICAtIENsaWNrcyB0aGUgYmFjayBvciBmb3J3YXJkIGJ1dHRvbiAob3IgY2xpY2tzIGEgSGlzdG9yeSBsaW5rKS5cbiAqICAgLSBDbGlja3Mgb24gYSBsaW5rLlxuICogLSBSZXByZXNlbnRzIHRoZSBVUkwgb2JqZWN0IGFzIGEgc2V0IG9mIG1ldGhvZHMgKHByb3RvY29sLCBob3N0LCBwb3J0LCBwYXRoLCBzZWFyY2gsIGhhc2gpLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uIERldmVsb3BlciBHdWlkZTogVXNpbmcgJGxvY2F0aW9ufVxuICovXG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlclxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzZSB0aGUgYCRsb2NhdGlvblByb3ZpZGVyYCB0byBjb25maWd1cmUgaG93IHRoZSBhcHBsaWNhdGlvbiBkZWVwIGxpbmtpbmcgcGF0aHMgYXJlIHN0b3JlZC5cbiAqL1xuZnVuY3Rpb24gJExvY2F0aW9uUHJvdmlkZXIoKSB7XG4gIHZhciBoYXNoUHJlZml4ID0gJyEnLFxuICAgICAgaHRtbDVNb2RlID0ge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZUJhc2U6IHRydWUsXG4gICAgICAgIHJld3JpdGVMaW5rczogdHJ1ZVxuICAgICAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlciNoYXNoUHJlZml4XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZpeCBpcyBgJyEnYC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBwcmVmaXggUHJlZml4IGZvciBoYXNoIHBhcnQgKGNvbnRhaW5pbmcgcGF0aCBhbmQgc2VhcmNoKVxuICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlclxuICAgKi9cbiAgdGhpcy5oYXNoUHJlZml4ID0gZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgaWYgKGlzRGVmaW5lZChwcmVmaXgpKSB7XG4gICAgICBoYXNoUHJlZml4ID0gcHJlZml4O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBoYXNoUHJlZml4O1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlciNodG1sNU1vZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEBwYXJhbSB7KGJvb2xlYW58T2JqZWN0KT19IG1vZGUgSWYgYm9vbGVhbiwgc2V0cyBgaHRtbDVNb2RlLmVuYWJsZWRgIHRvIHZhbHVlLlxuICAgKiAgIElmIG9iamVjdCwgc2V0cyBgZW5hYmxlZGAsIGByZXF1aXJlQmFzZWAgYW5kIGByZXdyaXRlTGlua3NgIHRvIHJlc3BlY3RpdmUgdmFsdWVzLiBTdXBwb3J0ZWRcbiAgICogICBwcm9wZXJ0aWVzOlxuICAgKiAgIC0gKiplbmFibGVkKiog4oCTIGB7Ym9vbGVhbn1gIOKAkyAoZGVmYXVsdDogZmFsc2UpIElmIHRydWUsIHdpbGwgcmVseSBvbiBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvXG4gICAqICAgICBjaGFuZ2UgdXJscyB3aGVyZSBzdXBwb3J0ZWQuIFdpbGwgZmFsbCBiYWNrIHRvIGhhc2gtcHJlZml4ZWQgcGF0aHMgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3RcbiAgICogICAgIHN1cHBvcnQgYHB1c2hTdGF0ZWAuXG4gICAqICAgLSAqKnJlcXVpcmVCYXNlKiogLSBge2Jvb2xlYW59YCAtIChkZWZhdWx0OiBgdHJ1ZWApIFdoZW4gaHRtbDVNb2RlIGlzIGVuYWJsZWQsIHNwZWNpZmllc1xuICAgKiAgICAgd2hldGhlciBvciBub3QgYSA8YmFzZT4gdGFnIGlzIHJlcXVpcmVkIHRvIGJlIHByZXNlbnQuIElmIGBlbmFibGVkYCBhbmQgYHJlcXVpcmVCYXNlYCBhcmVcbiAgICogICAgIHRydWUsIGFuZCBhIGJhc2UgdGFnIGlzIG5vdCBwcmVzZW50LCBhbiBlcnJvciB3aWxsIGJlIHRocm93biB3aGVuIGAkbG9jYXRpb25gIGlzIGluamVjdGVkLlxuICAgKiAgICAgU2VlIHRoZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uICRsb2NhdGlvbiBndWlkZSBmb3IgbW9yZSBpbmZvcm1hdGlvbn1cbiAgICogICAtICoqcmV3cml0ZUxpbmtzKiogLSBge2Jvb2xlYW58c3RyaW5nfWAgLSAoZGVmYXVsdDogYHRydWVgKSBXaGVuIGh0bWw1TW9kZSBpcyBlbmFibGVkLFxuICAgKiAgICAgZW5hYmxlcy9kaXNhYmxlcyBVUkwgcmV3cml0aW5nIGZvciByZWxhdGl2ZSBsaW5rcy4gSWYgc2V0IHRvIGEgc3RyaW5nLCBVUkwgcmV3cml0aW5nIHdpbGxcbiAgICogICAgIG9ubHkgaGFwcGVuIG9uIGxpbmtzIHdpdGggYW4gYXR0cmlidXRlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLiBGb3IgZXhhbXBsZSwgaWYgc2V0XG4gICAqICAgICB0byBgJ2ludGVybmFsLWxpbmsnYCwgdGhlbiB0aGUgVVJMIHdpbGwgb25seSBiZSByZXdyaXR0ZW4gZm9yIGA8YSBpbnRlcm5hbC1saW5rPmAgbGlua3MuXG4gICAqICAgICBOb3RlIHRoYXQgW2F0dHJpYnV0ZSBuYW1lIG5vcm1hbGl6YXRpb25dKGd1aWRlL2RpcmVjdGl2ZSNub3JtYWxpemF0aW9uKSBkb2VzIG5vdCBhcHBseVxuICAgKiAgICAgaGVyZSwgc28gYCdpbnRlcm5hbExpbmsnYCB3aWxsICoqbm90KiogbWF0Y2ggYCdpbnRlcm5hbC1saW5rJ2AuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IGh0bWw1TW9kZSBvYmplY3QgaWYgdXNlZCBhcyBnZXR0ZXIgb3IgaXRzZWxmIChjaGFpbmluZykgaWYgdXNlZCBhcyBzZXR0ZXJcbiAgICovXG4gIHRoaXMuaHRtbDVNb2RlID0gZnVuY3Rpb24obW9kZSkge1xuICAgIGlmIChpc0Jvb2xlYW4obW9kZSkpIHtcbiAgICAgIGh0bWw1TW9kZS5lbmFibGVkID0gbW9kZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QobW9kZSkpIHtcblxuICAgICAgaWYgKGlzQm9vbGVhbihtb2RlLmVuYWJsZWQpKSB7XG4gICAgICAgIGh0bWw1TW9kZS5lbmFibGVkID0gbW9kZS5lbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCb29sZWFuKG1vZGUucmVxdWlyZUJhc2UpKSB7XG4gICAgICAgIGh0bWw1TW9kZS5yZXF1aXJlQmFzZSA9IG1vZGUucmVxdWlyZUJhc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Jvb2xlYW4obW9kZS5yZXdyaXRlTGlua3MpIHx8IGlzU3RyaW5nKG1vZGUucmV3cml0ZUxpbmtzKSkge1xuICAgICAgICBodG1sNU1vZGUucmV3cml0ZUxpbmtzID0gbW9kZS5yZXdyaXRlTGlua3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHRtbDVNb2RlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIGV2ZW50XG4gICAqIEBuYW1lICRsb2NhdGlvbiMkbG9jYXRpb25DaGFuZ2VTdGFydFxuICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCcm9hZGNhc3RlZCBiZWZvcmUgYSBVUkwgd2lsbCBjaGFuZ2UuXG4gICAqXG4gICAqIFRoaXMgY2hhbmdlIGNhbiBiZSBwcmV2ZW50ZWQgYnkgY2FsbGluZ1xuICAgKiBgcHJldmVudERlZmF1bHRgIG1ldGhvZCBvZiB0aGUgZXZlbnQuIFNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259IGZvciBtb3JlXG4gICAqIGRldGFpbHMgYWJvdXQgZXZlbnQgb2JqZWN0LiBVcG9uIHN1Y2Nlc3NmdWwgY2hhbmdlXG4gICAqIHtAbGluayBuZy4kbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcyAkbG9jYXRpb25DaGFuZ2VTdWNjZXNzfSBpcyBmaXJlZC5cbiAgICpcbiAgICogVGhlIGBuZXdTdGF0ZWAgYW5kIGBvbGRTdGF0ZWAgcGFyYW1ldGVycyBtYXkgYmUgZGVmaW5lZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIHdoZW5cbiAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFVybCBVUkwgdGhhdCB3YXMgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5ld1N0YXRlIE5ldyBoaXN0b3J5IHN0YXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC5cbiAgICovXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBldmVudFxuICAgKiBAbmFtZSAkbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2Vzc1xuICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCcm9hZGNhc3RlZCBhZnRlciBhIFVSTCB3YXMgY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIGBuZXdTdGF0ZWAgYW5kIGBvbGRTdGF0ZWAgcGFyYW1ldGVycyBtYXkgYmUgZGVmaW5lZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIHdoZW5cbiAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFVybCBVUkwgdGhhdCB3YXMgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5ld1N0YXRlIE5ldyBoaXN0b3J5IHN0YXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC5cbiAgICovXG5cbiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRzbmlmZmVyJywgJyRyb290RWxlbWVudCcsICckd2luZG93JyxcbiAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICRicm93c2VyLCAkc25pZmZlciwgJHJvb3RFbGVtZW50LCAkd2luZG93KSB7XG4gICAgdmFyICRsb2NhdGlvbixcbiAgICAgICAgTG9jYXRpb25Nb2RlLFxuICAgICAgICBiYXNlSHJlZiA9ICRicm93c2VyLmJhc2VIcmVmKCksIC8vIGlmIGJhc2VbaHJlZl0gaXMgdW5kZWZpbmVkLCBpdCBkZWZhdWx0cyB0byAnJ1xuICAgICAgICBpbml0aWFsVXJsID0gJGJyb3dzZXIudXJsKCksXG4gICAgICAgIGFwcEJhc2U7XG5cbiAgICBpZiAoaHRtbDVNb2RlLmVuYWJsZWQpIHtcbiAgICAgIGlmICghYmFzZUhyZWYgJiYgaHRtbDVNb2RlLnJlcXVpcmVCYXNlKSB7XG4gICAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignbm9iYXNlJyxcbiAgICAgICAgICAnJGxvY2F0aW9uIGluIEhUTUw1IG1vZGUgcmVxdWlyZXMgYSA8YmFzZT4gdGFnIHRvIGJlIHByZXNlbnQhJyk7XG4gICAgICB9XG4gICAgICBhcHBCYXNlID0gc2VydmVyQmFzZShpbml0aWFsVXJsKSArIChiYXNlSHJlZiB8fCAnLycpO1xuICAgICAgTG9jYXRpb25Nb2RlID0gJHNuaWZmZXIuaGlzdG9yeSA/IExvY2F0aW9uSHRtbDVVcmwgOiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwQmFzZSA9IHN0cmlwSGFzaChpbml0aWFsVXJsKTtcbiAgICAgIExvY2F0aW9uTW9kZSA9IExvY2F0aW9uSGFzaGJhbmdVcmw7XG4gICAgfVxuICAgIHZhciBhcHBCYXNlTm9GaWxlID0gc3RyaXBGaWxlKGFwcEJhc2UpO1xuXG4gICAgJGxvY2F0aW9uID0gbmV3IExvY2F0aW9uTW9kZShhcHBCYXNlLCBhcHBCYXNlTm9GaWxlLCAnIycgKyBoYXNoUHJlZml4KTtcbiAgICAkbG9jYXRpb24uJCRwYXJzZUxpbmtVcmwoaW5pdGlhbFVybCwgaW5pdGlhbFVybCk7XG5cbiAgICAkbG9jYXRpb24uJCRzdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7XG5cbiAgICB2YXIgSUdOT1JFX1VSSV9SRUdFWFAgPSAvXlxccyooamF2YXNjcmlwdHxtYWlsdG8pOi9pO1xuXG4gICAgZnVuY3Rpb24gc2V0QnJvd3NlclVybFdpdGhGYWxsYmFjayh1cmwsIHJlcGxhY2UsIHN0YXRlKSB7XG4gICAgICB2YXIgb2xkVXJsID0gJGxvY2F0aW9uLnVybCgpO1xuICAgICAgdmFyIG9sZFN0YXRlID0gJGxvY2F0aW9uLiQkc3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICAkYnJvd3Nlci51cmwodXJsLCByZXBsYWNlLCBzdGF0ZSk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlICRsb2NhdGlvbi5zdGF0ZSgpIHJldHVybnMgcmVmZXJlbnRpYWxseSBpZGVudGljYWwgKG5vdCBqdXN0IGRlZXBseSBlcXVhbClcbiAgICAgICAgLy8gc3RhdGUgb2JqZWN0OyB0aGlzIG1ha2VzIHBvc3NpYmxlIHF1aWNrIGNoZWNraW5nIGlmIHRoZSBzdGF0ZSBjaGFuZ2VkIGluIHRoZSBkaWdlc3RcbiAgICAgICAgLy8gbG9vcC4gQ2hlY2tpbmcgZGVlcCBlcXVhbGl0eSB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLlxuICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgb2xkIHZhbHVlcyBpZiBwdXNoU3RhdGUgZmFpbHNcbiAgICAgICAgJGxvY2F0aW9uLnVybChvbGRVcmwpO1xuICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlO1xuXG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJHJvb3RFbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgcmV3cml0ZUxpbmtzID0gaHRtbDVNb2RlLnJld3JpdGVMaW5rcztcbiAgICAgIC8vIFRPRE8odm9qdGEpOiByZXdyaXRlIGxpbmsgd2hlbiBvcGVuaW5nIGluIG5ldyB0YWIvd2luZG93IChpbiBsZWdhY3kgYnJvd3NlcilcbiAgICAgIC8vIGN1cnJlbnRseSB3ZSBvcGVuIG5pY2UgdXJsIGxpbmsgYW5kIHJlZGlyZWN0IHRoZW5cblxuICAgICAgaWYgKCFyZXdyaXRlTGlua3MgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LndoaWNoID09PSAyIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMikgcmV0dXJuO1xuXG4gICAgICB2YXIgZWxtID0ganFMaXRlKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgIC8vIHRyYXZlcnNlIHRoZSBET00gdXAgdG8gZmluZCBmaXJzdCBBIHRhZ1xuICAgICAgd2hpbGUgKG5vZGVOYW1lXyhlbG1bMF0pICE9PSAnYScpIHtcbiAgICAgICAgLy8gaWdub3JlIHJld3JpdGluZyBpZiBubyBBIHRhZyAocmVhY2hlZCByb290IGVsZW1lbnQsIG9yIG5vIHBhcmVudCAtIHJlbW92ZWQgZnJvbSBkb2N1bWVudClcbiAgICAgICAgaWYgKGVsbVswXSA9PT0gJHJvb3RFbGVtZW50WzBdIHx8ICEoZWxtID0gZWxtLnBhcmVudCgpKVswXSkgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTdHJpbmcocmV3cml0ZUxpbmtzKSAmJiBpc1VuZGVmaW5lZChlbG0uYXR0cihyZXdyaXRlTGlua3MpKSkgcmV0dXJuO1xuXG4gICAgICB2YXIgYWJzSHJlZiA9IGVsbS5wcm9wKCdocmVmJyk7XG4gICAgICAvLyBnZXQgdGhlIGFjdHVhbCBocmVmIGF0dHJpYnV0ZSAtIHNlZVxuICAgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2RkMzQ3MTQ4KHY9dnMuODUpLmFzcHhcbiAgICAgIHZhciByZWxIcmVmID0gZWxtLmF0dHIoJ2hyZWYnKSB8fCBlbG0uYXR0cigneGxpbms6aHJlZicpO1xuXG4gICAgICBpZiAoaXNPYmplY3QoYWJzSHJlZikgJiYgYWJzSHJlZi50b1N0cmluZygpID09PSAnW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10nKSB7XG4gICAgICAgIC8vIFNWR0FuaW1hdGVkU3RyaW5nLmFuaW1WYWwgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBTVkdBbmltYXRlZFN0cmluZy5iYXNlVmFsLCB1bmxlc3MgZHVyaW5nXG4gICAgICAgIC8vIGFuIGFuaW1hdGlvbi5cbiAgICAgICAgYWJzSHJlZiA9IHVybFJlc29sdmUoYWJzSHJlZi5hbmltVmFsKS5ocmVmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZ25vcmUgd2hlbiB1cmwgaXMgc3RhcnRlZCB3aXRoIGphdmFzY3JpcHQ6IG9yIG1haWx0bzpcbiAgICAgIGlmIChJR05PUkVfVVJJX1JFR0VYUC50ZXN0KGFic0hyZWYpKSByZXR1cm47XG5cbiAgICAgIGlmIChhYnNIcmVmICYmICFlbG0uYXR0cigndGFyZ2V0JykgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIGlmICgkbG9jYXRpb24uJCRwYXJzZUxpbmtVcmwoYWJzSHJlZiwgcmVsSHJlZikpIHtcbiAgICAgICAgICAvLyBXZSBkbyBhIHByZXZlbnREZWZhdWx0IGZvciBhbGwgdXJscyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBhbmd1bGFyIGFwcGxpY2F0aW9uLFxuICAgICAgICAgIC8vIGluIGh0bWw1bW9kZSBhbmQgYWxzbyB3aXRob3V0LCBzbyB0aGF0IHdlIGFyZSBhYmxlIHRvIGFib3J0IG5hdmlnYXRpb24gd2l0aG91dFxuICAgICAgICAgIC8vIGdldHRpbmcgZG91YmxlIGVudHJpZXMgaW4gdGhlIGxvY2F0aW9uIGhpc3RvcnkuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvLyB1cGRhdGUgbG9jYXRpb24gbWFudWFsbHlcbiAgICAgICAgICBpZiAoJGxvY2F0aW9uLmFic1VybCgpICE9PSAkYnJvd3Nlci51cmwoKSkge1xuICAgICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgIC8vIGhhY2sgdG8gd29yayBhcm91bmQgRkY2IGJ1ZyA2ODQyMDggd2hlbiBzY2VuYXJpbyBydW5uZXIgY2xpY2tzIG9uIGxpbmtzXG4gICAgICAgICAgICAkd2luZG93LmFuZ3VsYXJbJ2ZmLTY4NDIwOC1wcmV2ZW50RGVmYXVsdCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLy8gcmV3cml0ZSBoYXNoYmFuZyB1cmwgPD4gaHRtbDUgdXJsXG4gICAgaWYgKHRyaW1FbXB0eUhhc2goJGxvY2F0aW9uLmFic1VybCgpKSAhPT0gdHJpbUVtcHR5SGFzaChpbml0aWFsVXJsKSkge1xuICAgICAgJGJyb3dzZXIudXJsKCRsb2NhdGlvbi5hYnNVcmwoKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxpemluZyA9IHRydWU7XG5cbiAgICAvLyB1cGRhdGUgJGxvY2F0aW9uIHdoZW4gJGJyb3dzZXIgdXJsIGNoYW5nZXNcbiAgICAkYnJvd3Nlci5vblVybENoYW5nZShmdW5jdGlvbihuZXdVcmwsIG5ld1N0YXRlKSB7XG5cbiAgICAgIGlmICghc3RhcnRzV2l0aChuZXdVcmwsIGFwcEJhc2VOb0ZpbGUpKSB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBuYXZpZ2F0aW5nIG91dHNpZGUgb2YgdGhlIGFwcCB0aGVuIGZvcmNlIGEgcmVsb2FkXG4gICAgICAgICR3aW5kb3cubG9jYXRpb24uaHJlZiA9IG5ld1VybDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvbGRVcmwgPSAkbG9jYXRpb24uYWJzVXJsKCk7XG4gICAgICAgIHZhciBvbGRTdGF0ZSA9ICRsb2NhdGlvbi4kJHN0YXRlO1xuICAgICAgICB2YXIgZGVmYXVsdFByZXZlbnRlZDtcbiAgICAgICAgbmV3VXJsID0gdHJpbUVtcHR5SGFzaChuZXdVcmwpO1xuICAgICAgICAkbG9jYXRpb24uJCRwYXJzZShuZXdVcmwpO1xuICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG5ld1N0YXRlO1xuXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgbmV3VXJsLCBvbGRVcmwsXG4gICAgICAgICAgICBuZXdTdGF0ZSwgb2xkU3RhdGUpLmRlZmF1bHRQcmV2ZW50ZWQ7XG5cbiAgICAgICAgLy8gaWYgdGhlIGxvY2F0aW9uIHdhcyBjaGFuZ2VkIGJ5IGEgYCRsb2NhdGlvbkNoYW5nZVN0YXJ0YCBoYW5kbGVyIHRoZW4gc3RvcFxuICAgICAgICAvLyBwcm9jZXNzaW5nIHRoaXMgbG9jYXRpb24gY2hhbmdlXG4gICAgICAgIGlmICgkbG9jYXRpb24uYWJzVXJsKCkgIT09IG5ld1VybCkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgJGxvY2F0aW9uLiQkcGFyc2Uob2xkVXJsKTtcbiAgICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgICAgIHNldEJyb3dzZXJVcmxXaXRoRmFsbGJhY2sob2xkVXJsLCBmYWxzZSwgb2xkU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluaXRpYWxpemluZyA9IGZhbHNlO1xuICAgICAgICAgIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCEkcm9vdFNjb3BlLiQkcGhhc2UpICRyb290U2NvcGUuJGRpZ2VzdCgpO1xuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlIGJyb3dzZXJcbiAgICAkcm9vdFNjb3BlLiR3YXRjaChmdW5jdGlvbiAkbG9jYXRpb25XYXRjaCgpIHtcbiAgICAgIHZhciBvbGRVcmwgPSB0cmltRW1wdHlIYXNoKCRicm93c2VyLnVybCgpKTtcbiAgICAgIHZhciBuZXdVcmwgPSB0cmltRW1wdHlIYXNoKCRsb2NhdGlvbi5hYnNVcmwoKSk7XG4gICAgICB2YXIgb2xkU3RhdGUgPSAkYnJvd3Nlci5zdGF0ZSgpO1xuICAgICAgdmFyIGN1cnJlbnRSZXBsYWNlID0gJGxvY2F0aW9uLiQkcmVwbGFjZTtcbiAgICAgIHZhciB1cmxPclN0YXRlQ2hhbmdlZCA9IG9sZFVybCAhPT0gbmV3VXJsIHx8XG4gICAgICAgICgkbG9jYXRpb24uJCRodG1sNSAmJiAkc25pZmZlci5oaXN0b3J5ICYmIG9sZFN0YXRlICE9PSAkbG9jYXRpb24uJCRzdGF0ZSk7XG5cbiAgICAgIGlmIChpbml0aWFsaXppbmcgfHwgdXJsT3JTdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgaW5pdGlhbGl6aW5nID0gZmFsc2U7XG5cbiAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBuZXdVcmwgPSAkbG9jYXRpb24uYWJzVXJsKCk7XG4gICAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgbmV3VXJsLCBvbGRVcmwsXG4gICAgICAgICAgICAgICRsb2NhdGlvbi4kJHN0YXRlLCBvbGRTdGF0ZSkuZGVmYXVsdFByZXZlbnRlZDtcblxuICAgICAgICAgIC8vIGlmIHRoZSBsb2NhdGlvbiB3YXMgY2hhbmdlZCBieSBhIGAkbG9jYXRpb25DaGFuZ2VTdGFydGAgaGFuZGxlciB0aGVuIHN0b3BcbiAgICAgICAgICAvLyBwcm9jZXNzaW5nIHRoaXMgbG9jYXRpb24gY2hhbmdlXG4gICAgICAgICAgaWYgKCRsb2NhdGlvbi5hYnNVcmwoKSAhPT0gbmV3VXJsKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgJGxvY2F0aW9uLiQkcGFyc2Uob2xkVXJsKTtcbiAgICAgICAgICAgICRsb2NhdGlvbi4kJHN0YXRlID0gb2xkU3RhdGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1cmxPclN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgICBzZXRCcm93c2VyVXJsV2l0aEZhbGxiYWNrKG5ld1VybCwgY3VycmVudFJlcGxhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkU3RhdGUgPT09ICRsb2NhdGlvbi4kJHN0YXRlID8gbnVsbCA6ICRsb2NhdGlvbi4kJHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgJGxvY2F0aW9uLiQkcmVwbGFjZSA9IGZhbHNlO1xuXG4gICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHJldHVybiBhbnl0aGluZyBiZWNhdXNlICRldmFsQXN5bmMgd2lsbCBtYWtlIHRoZSBkaWdlc3QgbG9vcCBkaXJ0eSB3aGVuXG4gICAgICAvLyB0aGVyZSBpcyBhIGNoYW5nZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRsb2NhdGlvbjtcblxuICAgIGZ1bmN0aW9uIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSkge1xuICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckbG9jYXRpb25DaGFuZ2VTdWNjZXNzJywgJGxvY2F0aW9uLmFic1VybCgpLCBvbGRVcmwsXG4gICAgICAgICRsb2NhdGlvbi4kJHN0YXRlLCBvbGRTdGF0ZSk7XG4gICAgfVxufV07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRsb2dcbiAqIEByZXF1aXJlcyAkd2luZG93XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTaW1wbGUgc2VydmljZSBmb3IgbG9nZ2luZy4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzYWZlbHkgd3JpdGVzIHRoZSBtZXNzYWdlXG4gKiBpbnRvIHRoZSBicm93c2VyJ3MgY29uc29sZSAoaWYgcHJlc2VudCkuXG4gKlxuICogVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIHNlcnZpY2UgaXMgdG8gc2ltcGxpZnkgZGVidWdnaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcuXG4gKlxuICogVGhlIGRlZmF1bHQgaXMgdG8gbG9nIGBkZWJ1Z2AgbWVzc2FnZXMuIFlvdSBjYW4gdXNlXG4gKiB7QGxpbmsgbmcuJGxvZ1Byb3ZpZGVyIG5nLiRsb2dQcm92aWRlciNkZWJ1Z0VuYWJsZWR9IHRvIGNoYW5nZSB0aGlzLlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJsb2dFeGFtcGxlXCIgbmFtZT1cImxvZy1zZXJ2aWNlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnbG9nRXhhbXBsZScsIFtdKVxuICAgICAgICAgLmNvbnRyb2xsZXIoJ0xvZ0NvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9nJywgZnVuY3Rpb24oJHNjb3BlLCAkbG9nKSB7XG4gICAgICAgICAgICRzY29wZS4kbG9nID0gJGxvZztcbiAgICAgICAgICAgJHNjb3BlLm1lc3NhZ2UgPSAnSGVsbG8gV29ybGQhJztcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkxvZ0NvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxwPlJlbG9hZCB0aGlzIHBhZ2Ugd2l0aCBvcGVuIGNvbnNvbGUsIGVudGVyIHRleHQgYW5kIGhpdCB0aGUgbG9nIGJ1dHRvbi4uLjwvcD5cbiAgICAgICAgIDxsYWJlbD5NZXNzYWdlOlxuICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJtZXNzYWdlXCIgLz48L2xhYmVsPlxuICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cIiRsb2cubG9nKG1lc3NhZ2UpXCI+bG9nPC9idXR0b24+XG4gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiJGxvZy53YXJuKG1lc3NhZ2UpXCI+d2FybjwvYnV0dG9uPlxuICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cIiRsb2cuaW5mbyhtZXNzYWdlKVwiPmluZm88L2J1dHRvbj5cbiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCIkbG9nLmVycm9yKG1lc3NhZ2UpXCI+ZXJyb3I8L2J1dHRvbj5cbiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCIkbG9nLmRlYnVnKG1lc3NhZ2UpXCI+ZGVidWc8L2J1dHRvbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkbG9nUHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2UgdGhlIGAkbG9nUHJvdmlkZXJgIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGFwcGxpY2F0aW9uIGxvZ3MgbWVzc2FnZXNcbiAqL1xuZnVuY3Rpb24gJExvZ1Byb3ZpZGVyKCkge1xuICB2YXIgZGVidWcgPSB0cnVlLFxuICAgICAgc2VsZiA9IHRoaXM7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGxvZ1Byb3ZpZGVyI2RlYnVnRW5hYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQHBhcmFtIHtib29sZWFuPX0gZmxhZyBlbmFibGUgb3IgZGlzYWJsZSBkZWJ1ZyBsZXZlbCBtZXNzYWdlc1xuICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlclxuICAgKi9cbiAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSBmdW5jdGlvbihmbGFnKSB7XG4gICAgaWYgKGlzRGVmaW5lZChmbGFnKSkge1xuICAgICAgZGVidWcgPSBmbGFnO1xuICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVidWc7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsIGZ1bmN0aW9uKCR3aW5kb3cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkbG9nI2xvZ1xuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogV3JpdGUgYSBsb2cgbWVzc2FnZVxuICAgICAgICovXG4gICAgICBsb2c6IGNvbnNvbGVMb2coJ2xvZycpLFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRsb2cjaW5mb1xuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogV3JpdGUgYW4gaW5mb3JtYXRpb24gbWVzc2FnZVxuICAgICAgICovXG4gICAgICBpbmZvOiBjb25zb2xlTG9nKCdpbmZvJyksXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGxvZyN3YXJuXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBXcml0ZSBhIHdhcm5pbmcgbWVzc2FnZVxuICAgICAgICovXG4gICAgICB3YXJuOiBjb25zb2xlTG9nKCd3YXJuJyksXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGxvZyNlcnJvclxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogV3JpdGUgYW4gZXJyb3IgbWVzc2FnZVxuICAgICAgICovXG4gICAgICBlcnJvcjogY29uc29sZUxvZygnZXJyb3InKSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkbG9nI2RlYnVnXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBXcml0ZSBhIGRlYnVnIG1lc3NhZ2VcbiAgICAgICAqL1xuICAgICAgZGVidWc6IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGZuID0gY29uc29sZUxvZygnZGVidWcnKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICBmbi5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pKClcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0RXJyb3IoYXJnKSB7XG4gICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGFyZy5zdGFjaykge1xuICAgICAgICAgIGFyZyA9IChhcmcubWVzc2FnZSAmJiBhcmcuc3RhY2suaW5kZXhPZihhcmcubWVzc2FnZSkgPT09IC0xKVxuICAgICAgICAgICAgICA/ICdFcnJvcjogJyArIGFyZy5tZXNzYWdlICsgJ1xcbicgKyBhcmcuc3RhY2tcbiAgICAgICAgICAgICAgOiBhcmcuc3RhY2s7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJnLnNvdXJjZVVSTCkge1xuICAgICAgICAgIGFyZyA9IGFyZy5tZXNzYWdlICsgJ1xcbicgKyBhcmcuc291cmNlVVJMICsgJzonICsgYXJnLmxpbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uc29sZUxvZyh0eXBlKSB7XG4gICAgICB2YXIgY29uc29sZSA9ICR3aW5kb3cuY29uc29sZSB8fCB7fSxcbiAgICAgICAgICBsb2dGbiA9IGNvbnNvbGVbdHlwZV0gfHwgY29uc29sZS5sb2cgfHwgbm9vcCxcbiAgICAgICAgICBoYXNBcHBseSA9IGZhbHNlO1xuXG4gICAgICAvLyBOb3RlOiByZWFkaW5nIGxvZ0ZuLmFwcGx5IHRocm93cyBhbiBlcnJvciBpbiBJRTExIGluIElFOCBkb2N1bWVudCBtb2RlLlxuICAgICAgLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IGNvbnNvbGUubG9nIGhhcyB0eXBlIFwib2JqZWN0XCIgaW4gSUU4Li4uXG4gICAgICB0cnkge1xuICAgICAgICBoYXNBcHBseSA9ICEhbG9nRm4uYXBwbHk7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxuICAgICAgaWYgKGhhc0FwcGx5KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgIGZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChmb3JtYXRFcnJvcihhcmcpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbG9nRm4uYXBwbHkoY29uc29sZSwgYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGFyZSBJRSB3aGljaCBlaXRoZXIgZG9lc24ndCBoYXZlIHdpbmRvdy5jb25zb2xlID0+IHRoaXMgaXMgbm9vcCBhbmQgd2UgZG8gbm90aGluZyxcbiAgICAgIC8vIG9yIHdlIGFyZSBJRSB3aGVyZSBjb25zb2xlLmxvZyBkb2Vzbid0IGhhdmUgYXBwbHkgc28gd2UgbG9nIGF0IGxlYXN0IGZpcnN0IDIgYXJnc1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZzEsIGFyZzIpIHtcbiAgICAgICAgbG9nRm4oYXJnMSwgYXJnMiA9PSBudWxsID8gJycgOiBhcmcyKTtcbiAgICAgIH07XG4gICAgfVxuICB9XTtcbn1cblxuLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKlxuICogICAgIEFueSBjb21taXRzIHRvIHRoaXMgZmlsZSBzaG91bGQgYmUgcmV2aWV3ZWQgd2l0aCBzZWN1cml0eSBpbiBtaW5kLiAgKlxuICogICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBjYW4gcG90ZW50aWFsbHkgY3JlYXRlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gKlxuICogICAgICAgICAgQW4gYXBwcm92YWwgZnJvbSAyIENvcmUgbWVtYmVycyB3aXRoIGhpc3Rvcnkgb2YgbW9kaWZ5aW5nICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlIGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogIERvZXMgdGhlIGNoYW5nZSBzb21laG93IGFsbG93IGZvciBhcmJpdHJhcnkgamF2YXNjcmlwdCB0byBiZSBleGVjdXRlZD8gKlxuICogICAgT3IgYWxsb3dzIGZvciBzb21lb25lIHRvIGNoYW5nZSB0aGUgcHJvdG90eXBlIG9mIGJ1aWx0LWluIG9iamVjdHM/ICAgKlxuICogICAgIE9yIGdpdmVzIHVuZGVzaXJlZCBhY2Nlc3MgdG8gdmFyaWFibGVzIGxpa2VzIGRvY3VtZW50IG9yIHdpbmRvdz8gICAgKlxuICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi9cblxudmFyICRwYXJzZU1pbkVyciA9IG1pbkVycignJHBhcnNlJyk7XG5cbnZhciBvYmplY3RWYWx1ZU9mID0ge30uY29uc3RydWN0b3IucHJvdG90eXBlLnZhbHVlT2Y7XG5cbi8vIFNhbmRib3hpbmcgQW5ndWxhciBFeHByZXNzaW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBbmd1bGFyIGV4cHJlc3Npb25zIGFyZSBubyBsb25nZXIgc2FuZGJveGVkLiBTbyBpdCBpcyBub3cgZXZlbiBlYXNpZXIgdG8gYWNjZXNzIGFyYml0cmFyeSBKUyBjb2RlIGJ5XG4vLyB2YXJpb3VzIG1lYW5zIHN1Y2ggYXMgb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIG5hdGl2ZSBKUyBmdW5jdGlvbnMgbGlrZSB0aGUgRnVuY3Rpb24gY29uc3RydWN0b3IuXG4vL1xuLy8gQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBBbmd1bGFyIGV4cHJlc3Npb246XG4vL1xuLy8gICB7fS50b1N0cmluZy5jb25zdHJ1Y3RvcignYWxlcnQoXCJldmlsIEpTIGNvZGVcIiknKVxuLy9cbi8vIEl0IGlzIGltcG9ydGFudCB0byByZWFsaXplIHRoYXQgaWYgeW91IGNyZWF0ZSBhbiBleHByZXNzaW9uIGZyb20gYSBzdHJpbmcgdGhhdCBjb250YWlucyB1c2VyIHByb3ZpZGVkXG4vLyBjb250ZW50IHRoZW4gaXQgaXMgcG9zc2libGUgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNvbnRhaW5zIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSB0byBhbiBYU1Mgc3R5bGUgYXR0YWNrLlxuLy9cbi8vIFNlZSBodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9ndWlkZS9zZWN1cml0eVxuXG5cbmZ1bmN0aW9uIGdldFN0cmluZ1ZhbHVlKG5hbWUpIHtcbiAgLy8gUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzdHJpbmdzLiBUaGlzIG1lYW5zIHRoYXQgbm9uLXN0cmluZyBvYmplY3RzIGNhbm5vdCBiZSB1c2VkXG4gIC8vIGFzIGtleXMgaW4gYW4gb2JqZWN0LiBBbnkgbm9uLXN0cmluZyBvYmplY3QsIGluY2x1ZGluZyBhIG51bWJlciwgaXMgdHlwZWNhc3RlZFxuICAvLyBpbnRvIGEgc3RyaW5nIHZpYSB0aGUgdG9TdHJpbmcgbWV0aG9kLlxuICAvLyAtLSBNRE4sIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9Qcm9wZXJ0eV9hY2Nlc3NvcnMjUHJvcGVydHlfbmFtZXNcbiAgLy9cbiAgLy8gU28sIHRvIGVuc3VyZSB0aGF0IHdlIGFyZSBjaGVja2luZyB0aGUgc2FtZSBgbmFtZWAgdGhhdCBKYXZhU2NyaXB0IHdvdWxkIHVzZSwgd2UgY2FzdCBpdFxuICAvLyB0byBhIHN0cmluZy4gSXQncyBub3QgYWx3YXlzIHBvc3NpYmxlLiBJZiBgbmFtZWAgaXMgYW4gb2JqZWN0IGFuZCBpdHMgYHRvU3RyaW5nYCBtZXRob2QgaXNcbiAgLy8gJ2Jyb2tlbicgKGRvZXNuJ3QgcmV0dXJuIGEgc3RyaW5nLCBpc24ndCBhIGZ1bmN0aW9uLCBldGMuKSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd246XG4gIC8vXG4gIC8vIFR5cGVFcnJvcjogQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVxuICAvL1xuICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2UgZG9uJ3QgY2F0Y2ggdGhpcyBlcnJvciBoZXJlIGFuZCBhbGxvdyBpdCB0byBwcm9wYWdhdGUgdXAgdGhlIGNhbGxcbiAgLy8gc3RhY2suIE5vdGUgdGhhdCB5b3UnbGwgZ2V0IHRoZSBzYW1lIGVycm9yIGluIEphdmFTY3JpcHQgaWYgeW91IHRyeSB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB1c2luZ1xuICAvLyBzdWNoIGEgJ2Jyb2tlbicgb2JqZWN0IGFzIGEga2V5LlxuICByZXR1cm4gbmFtZSArICcnO1xufVxuXG5cbnZhciBPUEVSQVRPUlMgPSBjcmVhdGVNYXAoKTtcbmZvckVhY2goJysgLSAqIC8gJSA9PT0gIT09ID09ICE9IDwgPiA8PSA+PSAmJiB8fCAhID0gfCcuc3BsaXQoJyAnKSwgZnVuY3Rpb24ob3BlcmF0b3IpIHsgT1BFUkFUT1JTW29wZXJhdG9yXSA9IHRydWU7IH0pO1xudmFyIEVTQ0FQRSA9IHsnbic6J1xcbicsICdmJzonXFxmJywgJ3InOidcXHInLCAndCc6J1xcdCcsICd2JzonXFx2JywgJ1xcJyc6J1xcJycsICdcIic6J1wiJ307XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgTGV4ZXIgPSBmdW5jdGlvbiBMZXhlcihvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG59O1xuXG5MZXhlci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBMZXhlcixcblxuICBsZXg6IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMudG9rZW5zID0gW107XG5cbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7XG4gICAgICBpZiAoY2ggPT09ICdcIicgfHwgY2ggPT09ICdcXCcnKSB7XG4gICAgICAgIHRoaXMucmVhZFN0cmluZyhjaCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNOdW1iZXIoY2gpIHx8IGNoID09PSAnLicgJiYgdGhpcy5pc051bWJlcih0aGlzLnBlZWsoKSkpIHtcbiAgICAgICAgdGhpcy5yZWFkTnVtYmVyKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5wZWVrTXVsdGljaGFyKCkpKSB7XG4gICAgICAgIHRoaXMucmVhZElkZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXMoY2gsICcoKXt9W10uLDs6PycpKSB7XG4gICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiBjaH0pO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNXaGl0ZXNwYWNlKGNoKSkge1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY2gyID0gY2ggKyB0aGlzLnBlZWsoKTtcbiAgICAgICAgdmFyIGNoMyA9IGNoMiArIHRoaXMucGVlaygyKTtcbiAgICAgICAgdmFyIG9wMSA9IE9QRVJBVE9SU1tjaF07XG4gICAgICAgIHZhciBvcDIgPSBPUEVSQVRPUlNbY2gyXTtcbiAgICAgICAgdmFyIG9wMyA9IE9QRVJBVE9SU1tjaDNdO1xuICAgICAgICBpZiAob3AxIHx8IG9wMiB8fCBvcDMpIHtcbiAgICAgICAgICB2YXIgdG9rZW4gPSBvcDMgPyBjaDMgOiAob3AyID8gY2gyIDogY2gpO1xuICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiB0b2tlbiwgb3BlcmF0b3I6IHRydWV9KTtcbiAgICAgICAgICB0aGlzLmluZGV4ICs9IHRva2VuLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgbmV4dCBjaGFyYWN0ZXIgJywgdGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfSxcblxuICBpczogZnVuY3Rpb24oY2gsIGNoYXJzKSB7XG4gICAgcmV0dXJuIGNoYXJzLmluZGV4T2YoY2gpICE9PSAtMTtcbiAgfSxcblxuICBwZWVrOiBmdW5jdGlvbihpKSB7XG4gICAgdmFyIG51bSA9IGkgfHwgMTtcbiAgICByZXR1cm4gKHRoaXMuaW5kZXggKyBudW0gPCB0aGlzLnRleHQubGVuZ3RoKSA/IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCArIG51bSkgOiBmYWxzZTtcbiAgfSxcblxuICBpc051bWJlcjogZnVuY3Rpb24oY2gpIHtcbiAgICByZXR1cm4gKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpICYmIHR5cGVvZiBjaCA9PT0gJ3N0cmluZyc7XG4gIH0sXG5cbiAgaXNXaGl0ZXNwYWNlOiBmdW5jdGlvbihjaCkge1xuICAgIC8vIElFIHRyZWF0cyBub24tYnJlYWtpbmcgc3BhY2UgYXMgXFx1MDBBMFxuICAgIHJldHVybiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXHQnIHx8XG4gICAgICAgICAgICBjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICdcXHYnIHx8IGNoID09PSAnXFx1MDBBMCcpO1xuICB9LFxuXG4gIGlzSWRlbnRpZmllclN0YXJ0OiBmdW5jdGlvbihjaCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaXNJZGVudGlmaWVyU3RhcnQgP1xuICAgICAgICB0aGlzLm9wdGlvbnMuaXNJZGVudGlmaWVyU3RhcnQoY2gsIHRoaXMuY29kZVBvaW50QXQoY2gpKSA6XG4gICAgICAgIHRoaXMuaXNWYWxpZElkZW50aWZpZXJTdGFydChjaCk7XG4gIH0sXG5cbiAgaXNWYWxpZElkZW50aWZpZXJTdGFydDogZnVuY3Rpb24oY2gpIHtcbiAgICByZXR1cm4gKCdhJyA8PSBjaCAmJiBjaCA8PSAneicgfHxcbiAgICAgICAgICAgICdBJyA8PSBjaCAmJiBjaCA8PSAnWicgfHxcbiAgICAgICAgICAgICdfJyA9PT0gY2ggfHwgY2ggPT09ICckJyk7XG4gIH0sXG5cbiAgaXNJZGVudGlmaWVyQ29udGludWU6IGZ1bmN0aW9uKGNoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pc0lkZW50aWZpZXJDb250aW51ZSA/XG4gICAgICAgIHRoaXMub3B0aW9ucy5pc0lkZW50aWZpZXJDb250aW51ZShjaCwgdGhpcy5jb2RlUG9pbnRBdChjaCkpIDpcbiAgICAgICAgdGhpcy5pc1ZhbGlkSWRlbnRpZmllckNvbnRpbnVlKGNoKTtcbiAgfSxcblxuICBpc1ZhbGlkSWRlbnRpZmllckNvbnRpbnVlOiBmdW5jdGlvbihjaCwgY3ApIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSWRlbnRpZmllclN0YXJ0KGNoLCBjcCkgfHwgdGhpcy5pc051bWJlcihjaCk7XG4gIH0sXG5cbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uKGNoKSB7XG4gICAgaWYgKGNoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICByZXR1cm4gKGNoLmNoYXJDb2RlQXQoMCkgPDwgMTApICsgY2guY2hhckNvZGVBdCgxKSAtIDB4MzVGREMwMDtcbiAgfSxcblxuICBwZWVrTXVsdGljaGFyOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2ggPSB0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpO1xuICAgIHZhciBwZWVrID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKCFwZWVrKSB7XG4gICAgICByZXR1cm4gY2g7XG4gICAgfVxuICAgIHZhciBjcDEgPSBjaC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBjcDIgPSBwZWVrLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGNwMSA+PSAweEQ4MDAgJiYgY3AxIDw9IDB4REJGRiAmJiBjcDIgPj0gMHhEQzAwICYmIGNwMiA8PSAweERGRkYpIHtcbiAgICAgIHJldHVybiBjaCArIHBlZWs7XG4gICAgfVxuICAgIHJldHVybiBjaDtcbiAgfSxcblxuICBpc0V4cE9wZXJhdG9yOiBmdW5jdGlvbihjaCkge1xuICAgIHJldHVybiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnIHx8IHRoaXMuaXNOdW1iZXIoY2gpKTtcbiAgfSxcblxuICB0aHJvd0Vycm9yOiBmdW5jdGlvbihlcnJvciwgc3RhcnQsIGVuZCkge1xuICAgIGVuZCA9IGVuZCB8fCB0aGlzLmluZGV4O1xuICAgIHZhciBjb2xTdHIgPSAoaXNEZWZpbmVkKHN0YXJ0KVxuICAgICAgICAgICAgPyAncyAnICsgc3RhcnQgKyAgJy0nICsgdGhpcy5pbmRleCArICcgWycgKyB0aGlzLnRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpICsgJ10nXG4gICAgICAgICAgICA6ICcgJyArIGVuZCk7XG4gICAgdGhyb3cgJHBhcnNlTWluRXJyKCdsZXhlcnInLCAnTGV4ZXIgRXJyb3I6IHswfSBhdCBjb2x1bW57MX0gaW4gZXhwcmVzc2lvbiBbezJ9XS4nLFxuICAgICAgICBlcnJvciwgY29sU3RyLCB0aGlzLnRleHQpO1xuICB9LFxuXG4gIHJlYWROdW1iZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBudW1iZXIgPSAnJztcbiAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgdmFyIGNoID0gbG93ZXJjYXNlKHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCkpO1xuICAgICAgaWYgKGNoID09PSAnLicgfHwgdGhpcy5pc051bWJlcihjaCkpIHtcbiAgICAgICAgbnVtYmVyICs9IGNoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHBlZWtDaCA9IHRoaXMucGVlaygpO1xuICAgICAgICBpZiAoY2ggPT09ICdlJyAmJiB0aGlzLmlzRXhwT3BlcmF0b3IocGVla0NoKSkge1xuICAgICAgICAgIG51bWJlciArPSBjaDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRXhwT3BlcmF0b3IoY2gpICYmXG4gICAgICAgICAgICBwZWVrQ2ggJiYgdGhpcy5pc051bWJlcihwZWVrQ2gpICYmXG4gICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PT0gJ2UnKSB7XG4gICAgICAgICAgbnVtYmVyICs9IGNoO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNFeHBPcGVyYXRvcihjaCkgJiZcbiAgICAgICAgICAgICghcGVla0NoIHx8ICF0aGlzLmlzTnVtYmVyKHBlZWtDaCkpICYmXG4gICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PT0gJ2UnKSB7XG4gICAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdJbnZhbGlkIGV4cG9uZW50Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICB9XG4gICAgdGhpcy50b2tlbnMucHVzaCh7XG4gICAgICBpbmRleDogc3RhcnQsXG4gICAgICB0ZXh0OiBudW1iZXIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIHZhbHVlOiBOdW1iZXIobnVtYmVyKVxuICAgIH0pO1xuICB9LFxuXG4gIHJlYWRJZGVudDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmluZGV4ICs9IHRoaXMucGVla011bHRpY2hhcigpLmxlbmd0aDtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgIHZhciBjaCA9IHRoaXMucGVla011bHRpY2hhcigpO1xuICAgICAgaWYgKCF0aGlzLmlzSWRlbnRpZmllckNvbnRpbnVlKGNoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXggKz0gY2gubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLnRva2Vucy5wdXNoKHtcbiAgICAgIGluZGV4OiBzdGFydCxcbiAgICAgIHRleHQ6IHRoaXMudGV4dC5zbGljZShzdGFydCwgdGhpcy5pbmRleCksXG4gICAgICBpZGVudGlmaWVyOiB0cnVlXG4gICAgfSk7XG4gIH0sXG5cbiAgcmVhZFN0cmluZzogZnVuY3Rpb24ocXVvdGUpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuaW5kZXgrKztcbiAgICB2YXIgc3RyaW5nID0gJyc7XG4gICAgdmFyIHJhd1N0cmluZyA9IHF1b3RlO1xuICAgIHZhciBlc2NhcGUgPSBmYWxzZTtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7XG4gICAgICByYXdTdHJpbmcgKz0gY2g7XG4gICAgICBpZiAoZXNjYXBlKSB7XG4gICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7XG4gICAgICAgICAgdmFyIGhleCA9IHRoaXMudGV4dC5zdWJzdHJpbmcodGhpcy5pbmRleCArIDEsIHRoaXMuaW5kZXggKyA1KTtcbiAgICAgICAgICBpZiAoIWhleC5tYXRjaCgvW1xcZGEtZl17NH0vaSkpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcignSW52YWxpZCB1bmljb2RlIGVzY2FwZSBbXFxcXHUnICsgaGV4ICsgJ10nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbmRleCArPSA0O1xuICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVwID0gRVNDQVBFW2NoXTtcbiAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcgKyAocmVwIHx8IGNoKTtcbiAgICAgICAgfVxuICAgICAgICBlc2NhcGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcXFxcJykge1xuICAgICAgICBlc2NhcGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gcXVvdGUpIHtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogc3RhcnQsXG4gICAgICAgICAgdGV4dDogcmF3U3RyaW5nLFxuICAgICAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiBzdHJpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZyArPSBjaDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICB9XG4gICAgdGhpcy50aHJvd0Vycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGUnLCBzdGFydCk7XG4gIH1cbn07XG5cbnZhciBBU1QgPSBmdW5jdGlvbiBBU1QobGV4ZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5sZXhlciA9IGxleGVyO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xufTtcblxuQVNULlByb2dyYW0gPSAnUHJvZ3JhbSc7XG5BU1QuRXhwcmVzc2lvblN0YXRlbWVudCA9ICdFeHByZXNzaW9uU3RhdGVtZW50JztcbkFTVC5Bc3NpZ25tZW50RXhwcmVzc2lvbiA9ICdBc3NpZ25tZW50RXhwcmVzc2lvbic7XG5BU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic7XG5BU1QuTG9naWNhbEV4cHJlc3Npb24gPSAnTG9naWNhbEV4cHJlc3Npb24nO1xuQVNULkJpbmFyeUV4cHJlc3Npb24gPSAnQmluYXJ5RXhwcmVzc2lvbic7XG5BU1QuVW5hcnlFeHByZXNzaW9uID0gJ1VuYXJ5RXhwcmVzc2lvbic7XG5BU1QuQ2FsbEV4cHJlc3Npb24gPSAnQ2FsbEV4cHJlc3Npb24nO1xuQVNULk1lbWJlckV4cHJlc3Npb24gPSAnTWVtYmVyRXhwcmVzc2lvbic7XG5BU1QuSWRlbnRpZmllciA9ICdJZGVudGlmaWVyJztcbkFTVC5MaXRlcmFsID0gJ0xpdGVyYWwnO1xuQVNULkFycmF5RXhwcmVzc2lvbiA9ICdBcnJheUV4cHJlc3Npb24nO1xuQVNULlByb3BlcnR5ID0gJ1Byb3BlcnR5JztcbkFTVC5PYmplY3RFeHByZXNzaW9uID0gJ09iamVjdEV4cHJlc3Npb24nO1xuQVNULlRoaXNFeHByZXNzaW9uID0gJ1RoaXNFeHByZXNzaW9uJztcbkFTVC5Mb2NhbHNFeHByZXNzaW9uID0gJ0xvY2Fsc0V4cHJlc3Npb24nO1xuXG4vLyBJbnRlcm5hbCB1c2Ugb25seVxuQVNULk5HVmFsdWVQYXJhbWV0ZXIgPSAnTkdWYWx1ZVBhcmFtZXRlcic7XG5cbkFTVC5wcm90b3R5cGUgPSB7XG4gIGFzdDogZnVuY3Rpb24odGV4dCkge1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy50b2tlbnMgPSB0aGlzLmxleGVyLmxleCh0ZXh0KTtcblxuICAgIHZhciB2YWx1ZSA9IHRoaXMucHJvZ3JhbSgpO1xuXG4gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy50aHJvd0Vycm9yKCdpcyBhbiB1bmV4cGVjdGVkIHRva2VuJywgdGhpcy50b2tlbnNbMF0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBwcm9ncmFtOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYm9keSA9IFtdO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID4gMCAmJiAhdGhpcy5wZWVrKCd9JywgJyknLCAnOycsICddJykpXG4gICAgICAgIGJvZHkucHVzaCh0aGlzLmV4cHJlc3Npb25TdGF0ZW1lbnQoKSk7XG4gICAgICBpZiAoIXRoaXMuZXhwZWN0KCc7JykpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogQVNULlByb2dyYW0sIGJvZHk6IGJvZHl9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBleHByZXNzaW9uU3RhdGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geyB0eXBlOiBBU1QuRXhwcmVzc2lvblN0YXRlbWVudCwgZXhwcmVzc2lvbjogdGhpcy5maWx0ZXJDaGFpbigpIH07XG4gIH0sXG5cbiAgZmlsdGVyQ2hhaW46IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZWZ0ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgd2hpbGUgKHRoaXMuZXhwZWN0KCd8JykpIHtcbiAgICAgIGxlZnQgPSB0aGlzLmZpbHRlcihsZWZ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQ7XG4gIH0sXG5cbiAgZXhwcmVzc2lvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWdubWVudCgpO1xuICB9LFxuXG4gIGFzc2lnbm1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnRlcm5hcnkoKTtcbiAgICBpZiAodGhpcy5leHBlY3QoJz0nKSkge1xuICAgICAgaWYgKCFpc0Fzc2lnbmFibGUocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2x2YWwnLCAnVHJ5aW5nIHRvIGFzc2lnbiBhIHZhbHVlIHRvIGEgbm9uIGwtdmFsdWUnKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0geyB0eXBlOiBBU1QuQXNzaWdubWVudEV4cHJlc3Npb24sIGxlZnQ6IHJlc3VsdCwgcmlnaHQ6IHRoaXMuYXNzaWdubWVudCgpLCBvcGVyYXRvcjogJz0nfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcblxuICB0ZXJuYXJ5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGVzdCA9IHRoaXMubG9naWNhbE9SKCk7XG4gICAgdmFyIGFsdGVybmF0ZTtcbiAgICB2YXIgY29uc2VxdWVudDtcbiAgICBpZiAodGhpcy5leHBlY3QoJz8nKSkge1xuICAgICAgYWx0ZXJuYXRlID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICBpZiAodGhpcy5jb25zdW1lKCc6JykpIHtcbiAgICAgICAgY29uc2VxdWVudCA9IHRoaXMuZXhwcmVzc2lvbigpO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBBU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uLCB0ZXN0OiB0ZXN0LCBhbHRlcm5hdGU6IGFsdGVybmF0ZSwgY29uc2VxdWVudDogY29uc2VxdWVudH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXN0O1xuICB9LFxuXG4gIGxvZ2ljYWxPUjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLmxvZ2ljYWxBTkQoKTtcbiAgICB3aGlsZSAodGhpcy5leHBlY3QoJ3x8JykpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5Mb2dpY2FsRXhwcmVzc2lvbiwgb3BlcmF0b3I6ICd8fCcsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLmxvZ2ljYWxBTkQoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBsb2dpY2FsQU5EOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVmdCA9IHRoaXMuZXF1YWxpdHkoKTtcbiAgICB3aGlsZSAodGhpcy5leHBlY3QoJyYmJykpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5Mb2dpY2FsRXhwcmVzc2lvbiwgb3BlcmF0b3I6ICcmJicsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLmVxdWFsaXR5KCl9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBlcXVhbGl0eTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLnJlbGF0aW9uYWwoKTtcbiAgICB2YXIgdG9rZW47XG4gICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCc9PScsJyE9JywnPT09JywnIT09JykpKSB7XG4gICAgICBsZWZ0ID0geyB0eXBlOiBBU1QuQmluYXJ5RXhwcmVzc2lvbiwgb3BlcmF0b3I6IHRva2VuLnRleHQsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLnJlbGF0aW9uYWwoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICByZWxhdGlvbmFsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVmdCA9IHRoaXMuYWRkaXRpdmUoKTtcbiAgICB2YXIgdG9rZW47XG4gICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCc8JywgJz4nLCAnPD0nLCAnPj0nKSkpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5CaW5hcnlFeHByZXNzaW9uLCBvcGVyYXRvcjogdG9rZW4udGV4dCwgbGVmdDogbGVmdCwgcmlnaHQ6IHRoaXMuYWRkaXRpdmUoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBhZGRpdGl2ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLm11bHRpcGxpY2F0aXZlKCk7XG4gICAgdmFyIHRva2VuO1xuICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnKycsJy0nKSkpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5CaW5hcnlFeHByZXNzaW9uLCBvcGVyYXRvcjogdG9rZW4udGV4dCwgbGVmdDogbGVmdCwgcmlnaHQ6IHRoaXMubXVsdGlwbGljYXRpdmUoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBtdWx0aXBsaWNhdGl2ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLnVuYXJ5KCk7XG4gICAgdmFyIHRva2VuO1xuICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnKicsJy8nLCclJykpKSB7XG4gICAgICBsZWZ0ID0geyB0eXBlOiBBU1QuQmluYXJ5RXhwcmVzc2lvbiwgb3BlcmF0b3I6IHRva2VuLnRleHQsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLnVuYXJ5KCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQ7XG4gIH0sXG5cbiAgdW5hcnk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2tlbjtcbiAgICBpZiAoKHRva2VuID0gdGhpcy5leHBlY3QoJysnLCAnLScsICchJykpKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBBU1QuVW5hcnlFeHByZXNzaW9uLCBvcGVyYXRvcjogdG9rZW4udGV4dCwgcHJlZml4OiB0cnVlLCBhcmd1bWVudDogdGhpcy51bmFyeSgpIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByaW1hcnkoKTtcbiAgICB9XG4gIH0sXG5cbiAgcHJpbWFyeTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByaW1hcnk7XG4gICAgaWYgKHRoaXMuZXhwZWN0KCcoJykpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLmZpbHRlckNoYWluKCk7XG4gICAgICB0aGlzLmNvbnN1bWUoJyknKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZXhwZWN0KCdbJykpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLmFycmF5RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZXhwZWN0KCd7JykpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLm9iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxmUmVmZXJlbnRpYWwuaGFzT3duUHJvcGVydHkodGhpcy5wZWVrKCkudGV4dCkpIHtcbiAgICAgIHByaW1hcnkgPSBjb3B5KHRoaXMuc2VsZlJlZmVyZW50aWFsW3RoaXMuY29uc3VtZSgpLnRleHRdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5saXRlcmFscy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnBlZWsoKS50ZXh0KSkge1xuICAgICAgcHJpbWFyeSA9IHsgdHlwZTogQVNULkxpdGVyYWwsIHZhbHVlOiB0aGlzLm9wdGlvbnMubGl0ZXJhbHNbdGhpcy5jb25zdW1lKCkudGV4dF19O1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkuaWRlbnRpZmllcikge1xuICAgICAgcHJpbWFyeSA9IHRoaXMuaWRlbnRpZmllcigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkuY29uc3RhbnQpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLmNvbnN0YW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGhyb3dFcnJvcignbm90IGEgcHJpbWFyeSBleHByZXNzaW9uJywgdGhpcy5wZWVrKCkpO1xuICAgIH1cblxuICAgIHZhciBuZXh0O1xuICAgIHdoaWxlICgobmV4dCA9IHRoaXMuZXhwZWN0KCcoJywgJ1snLCAnLicpKSkge1xuICAgICAgaWYgKG5leHQudGV4dCA9PT0gJygnKSB7XG4gICAgICAgIHByaW1hcnkgPSB7dHlwZTogQVNULkNhbGxFeHByZXNzaW9uLCBjYWxsZWU6IHByaW1hcnksIGFyZ3VtZW50czogdGhpcy5wYXJzZUFyZ3VtZW50cygpIH07XG4gICAgICAgIHRoaXMuY29uc3VtZSgnKScpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0LnRleHQgPT09ICdbJykge1xuICAgICAgICBwcmltYXJ5ID0geyB0eXBlOiBBU1QuTWVtYmVyRXhwcmVzc2lvbiwgb2JqZWN0OiBwcmltYXJ5LCBwcm9wZXJ0eTogdGhpcy5leHByZXNzaW9uKCksIGNvbXB1dGVkOiB0cnVlIH07XG4gICAgICAgIHRoaXMuY29uc3VtZSgnXScpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0LnRleHQgPT09ICcuJykge1xuICAgICAgICBwcmltYXJ5ID0geyB0eXBlOiBBU1QuTWVtYmVyRXhwcmVzc2lvbiwgb2JqZWN0OiBwcmltYXJ5LCBwcm9wZXJ0eTogdGhpcy5pZGVudGlmaWVyKCksIGNvbXB1dGVkOiBmYWxzZSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdJTVBPU1NJQkxFJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcmltYXJ5O1xuICB9LFxuXG4gIGZpbHRlcjogZnVuY3Rpb24oYmFzZUV4cHJlc3Npb24pIHtcbiAgICB2YXIgYXJncyA9IFtiYXNlRXhwcmVzc2lvbl07XG4gICAgdmFyIHJlc3VsdCA9IHt0eXBlOiBBU1QuQ2FsbEV4cHJlc3Npb24sIGNhbGxlZTogdGhpcy5pZGVudGlmaWVyKCksIGFyZ3VtZW50czogYXJncywgZmlsdGVyOiB0cnVlfTtcblxuICAgIHdoaWxlICh0aGlzLmV4cGVjdCgnOicpKSB7XG4gICAgICBhcmdzLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgcGFyc2VBcmd1bWVudHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgaWYgKHRoaXMucGVla1Rva2VuKCkudGV4dCAhPT0gJyknKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGFyZ3MucHVzaCh0aGlzLmZpbHRlckNoYWluKCkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9LFxuXG4gIGlkZW50aWZpZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2tlbiA9IHRoaXMuY29uc3VtZSgpO1xuICAgIGlmICghdG9rZW4uaWRlbnRpZmllcikge1xuICAgICAgdGhpcy50aHJvd0Vycm9yKCdpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyJywgdG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBBU1QuSWRlbnRpZmllciwgbmFtZTogdG9rZW4udGV4dCB9O1xuICB9LFxuXG4gIGNvbnN0YW50OiBmdW5jdGlvbigpIHtcbiAgICAvLyBUT0RPIGNoZWNrIHRoYXQgaXQgaXMgYSBjb25zdGFudFxuICAgIHJldHVybiB7IHR5cGU6IEFTVC5MaXRlcmFsLCB2YWx1ZTogdGhpcy5jb25zdW1lKCkudmFsdWUgfTtcbiAgfSxcblxuICBhcnJheURlY2xhcmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICBpZiAodGhpcy5wZWVrVG9rZW4oKS50ZXh0ICE9PSAnXScpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRoaXMucGVlaygnXScpKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCB0cmFpbGluZyBjb21tYXMgcGVyIEVTNS4xLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZSgnXScpO1xuXG4gICAgcmV0dXJuIHsgdHlwZTogQVNULkFycmF5RXhwcmVzc2lvbiwgZWxlbWVudHM6IGVsZW1lbnRzIH07XG4gIH0sXG5cbiAgb2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFtdLCBwcm9wZXJ0eTtcbiAgICBpZiAodGhpcy5wZWVrVG9rZW4oKS50ZXh0ICE9PSAnfScpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRoaXMucGVlaygnfScpKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCB0cmFpbGluZyBjb21tYXMgcGVyIEVTNS4xLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHByb3BlcnR5ID0ge3R5cGU6IEFTVC5Qcm9wZXJ0eSwga2luZDogJ2luaXQnfTtcbiAgICAgICAgaWYgKHRoaXMucGVlaygpLmNvbnN0YW50KSB7XG4gICAgICAgICAgcHJvcGVydHkua2V5ID0gdGhpcy5jb25zdGFudCgpO1xuICAgICAgICAgIHByb3BlcnR5LmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKCc6Jyk7XG4gICAgICAgICAgcHJvcGVydHkudmFsdWUgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgcHJvcGVydHkua2V5ID0gdGhpcy5pZGVudGlmaWVyKCk7XG4gICAgICAgICAgcHJvcGVydHkuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAodGhpcy5wZWVrKCc6JykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uc3VtZSgnOicpO1xuICAgICAgICAgICAgcHJvcGVydHkudmFsdWUgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvcGVydHkudmFsdWUgPSBwcm9wZXJ0eS5rZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygnWycpKSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKCdbJyk7XG4gICAgICAgICAgcHJvcGVydHkua2V5ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKCddJyk7XG4gICAgICAgICAgcHJvcGVydHkuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY29uc3VtZSgnOicpO1xuICAgICAgICAgIHByb3BlcnR5LnZhbHVlID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdpbnZhbGlkIGtleScsIHRoaXMucGVlaygpKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZSgnfScpO1xuXG4gICAgcmV0dXJuIHt0eXBlOiBBU1QuT2JqZWN0RXhwcmVzc2lvbiwgcHJvcGVydGllczogcHJvcGVydGllcyB9O1xuICB9LFxuXG4gIHRocm93RXJyb3I6IGZ1bmN0aW9uKG1zZywgdG9rZW4pIHtcbiAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3N5bnRheCcsXG4gICAgICAgICdTeW50YXggRXJyb3I6IFRva2VuIFxcJ3swfVxcJyB7MX0gYXQgY29sdW1uIHsyfSBvZiB0aGUgZXhwcmVzc2lvbiBbezN9XSBzdGFydGluZyBhdCBbezR9XS4nLFxuICAgICAgICAgIHRva2VuLnRleHQsIG1zZywgKHRva2VuLmluZGV4ICsgMSksIHRoaXMudGV4dCwgdGhpcy50ZXh0LnN1YnN0cmluZyh0b2tlbi5pbmRleCkpO1xuICB9LFxuXG4gIGNvbnN1bWU6IGZ1bmN0aW9uKGUxKSB7XG4gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCd1ZW9lJywgJ1VuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246IHswfScsIHRoaXMudGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIHRva2VuID0gdGhpcy5leHBlY3QoZTEpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHRoaXMudGhyb3dFcnJvcignaXMgdW5leHBlY3RlZCwgZXhwZWN0aW5nIFsnICsgZTEgKyAnXScsIHRoaXMucGVlaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9LFxuXG4gIHBlZWtUb2tlbjogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCd1ZW9lJywgJ1VuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246IHswfScsIHRoaXMudGV4dCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2Vuc1swXTtcbiAgfSxcblxuICBwZWVrOiBmdW5jdGlvbihlMSwgZTIsIGUzLCBlNCkge1xuICAgIHJldHVybiB0aGlzLnBlZWtBaGVhZCgwLCBlMSwgZTIsIGUzLCBlNCk7XG4gIH0sXG5cbiAgcGVla0FoZWFkOiBmdW5jdGlvbihpLCBlMSwgZTIsIGUzLCBlNCkge1xuICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPiBpKSB7XG4gICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2Vuc1tpXTtcbiAgICAgIHZhciB0ID0gdG9rZW4udGV4dDtcbiAgICAgIGlmICh0ID09PSBlMSB8fCB0ID09PSBlMiB8fCB0ID09PSBlMyB8fCB0ID09PSBlNCB8fFxuICAgICAgICAgICghZTEgJiYgIWUyICYmICFlMyAmJiAhZTQpKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIGV4cGVjdDogZnVuY3Rpb24oZTEsIGUyLCBlMywgZTQpIHtcbiAgICB2YXIgdG9rZW4gPSB0aGlzLnBlZWsoZTEsIGUyLCBlMywgZTQpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgdGhpcy50b2tlbnMuc2hpZnQoKTtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIHNlbGZSZWZlcmVudGlhbDoge1xuICAgICd0aGlzJzoge3R5cGU6IEFTVC5UaGlzRXhwcmVzc2lvbiB9LFxuICAgICckbG9jYWxzJzoge3R5cGU6IEFTVC5Mb2NhbHNFeHByZXNzaW9uIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gaWZEZWZpbmVkKHYsIGQpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ICE9PSAndW5kZWZpbmVkJyA/IHYgOiBkO1xufVxuXG5mdW5jdGlvbiBwbHVzRm4obCwgcikge1xuICBpZiAodHlwZW9mIGwgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gcjtcbiAgaWYgKHR5cGVvZiByID09PSAndW5kZWZpbmVkJykgcmV0dXJuIGw7XG4gIHJldHVybiBsICsgcjtcbn1cblxuZnVuY3Rpb24gaXNTdGF0ZWxlc3MoJGZpbHRlciwgZmlsdGVyTmFtZSkge1xuICB2YXIgZm4gPSAkZmlsdGVyKGZpbHRlck5hbWUpO1xuICByZXR1cm4gIWZuLiRzdGF0ZWZ1bDtcbn1cblxuZnVuY3Rpb24gZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhhc3QsICRmaWx0ZXIpIHtcbiAgdmFyIGFsbENvbnN0YW50cztcbiAgdmFyIGFyZ3NUb1dhdGNoO1xuICB2YXIgaXNTdGF0ZWxlc3NGaWx0ZXI7XG4gIHN3aXRjaCAoYXN0LnR5cGUpIHtcbiAgY2FzZSBBU1QuUHJvZ3JhbTpcbiAgICBhbGxDb25zdGFudHMgPSB0cnVlO1xuICAgIGZvckVhY2goYXN0LmJvZHksIGZ1bmN0aW9uKGV4cHIpIHtcbiAgICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoZXhwci5leHByZXNzaW9uLCAkZmlsdGVyKTtcbiAgICAgIGFsbENvbnN0YW50cyA9IGFsbENvbnN0YW50cyAmJiBleHByLmV4cHJlc3Npb24uY29uc3RhbnQ7XG4gICAgfSk7XG4gICAgYXN0LmNvbnN0YW50ID0gYWxsQ29uc3RhbnRzO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5MaXRlcmFsOlxuICAgIGFzdC5jb25zdGFudCA9IHRydWU7XG4gICAgYXN0LnRvV2F0Y2ggPSBbXTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuVW5hcnlFeHByZXNzaW9uOlxuICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LmFyZ3VtZW50LCAkZmlsdGVyKTtcbiAgICBhc3QuY29uc3RhbnQgPSBhc3QuYXJndW1lbnQuY29uc3RhbnQ7XG4gICAgYXN0LnRvV2F0Y2ggPSBhc3QuYXJndW1lbnQudG9XYXRjaDtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuQmluYXJ5RXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5sZWZ0LCAkZmlsdGVyKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5yaWdodCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LmxlZnQuY29uc3RhbnQgJiYgYXN0LnJpZ2h0LmNvbnN0YW50O1xuICAgIGFzdC50b1dhdGNoID0gYXN0LmxlZnQudG9XYXRjaC5jb25jYXQoYXN0LnJpZ2h0LnRvV2F0Y2gpO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5Mb2dpY2FsRXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5sZWZ0LCAkZmlsdGVyKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5yaWdodCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LmxlZnQuY29uc3RhbnQgJiYgYXN0LnJpZ2h0LmNvbnN0YW50O1xuICAgIGFzdC50b1dhdGNoID0gYXN0LmNvbnN0YW50ID8gW10gOiBbYXN0XTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uOlxuICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LnRlc3QsICRmaWx0ZXIpO1xuICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LmFsdGVybmF0ZSwgJGZpbHRlcik7XG4gICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhhc3QuY29uc2VxdWVudCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LnRlc3QuY29uc3RhbnQgJiYgYXN0LmFsdGVybmF0ZS5jb25zdGFudCAmJiBhc3QuY29uc2VxdWVudC5jb25zdGFudDtcbiAgICBhc3QudG9XYXRjaCA9IGFzdC5jb25zdGFudCA/IFtdIDogW2FzdF07XG4gICAgYnJlYWs7XG4gIGNhc2UgQVNULklkZW50aWZpZXI6XG4gICAgYXN0LmNvbnN0YW50ID0gZmFsc2U7XG4gICAgYXN0LnRvV2F0Y2ggPSBbYXN0XTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuTWVtYmVyRXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5vYmplY3QsICRmaWx0ZXIpO1xuICAgIGlmIChhc3QuY29tcHV0ZWQpIHtcbiAgICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LnByb3BlcnR5LCAkZmlsdGVyKTtcbiAgICB9XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0Lm9iamVjdC5jb25zdGFudCAmJiAoIWFzdC5jb21wdXRlZCB8fCBhc3QucHJvcGVydHkuY29uc3RhbnQpO1xuICAgIGFzdC50b1dhdGNoID0gW2FzdF07XG4gICAgYnJlYWs7XG4gIGNhc2UgQVNULkNhbGxFeHByZXNzaW9uOlxuICAgIGlzU3RhdGVsZXNzRmlsdGVyID0gYXN0LmZpbHRlciA/IGlzU3RhdGVsZXNzKCRmaWx0ZXIsIGFzdC5jYWxsZWUubmFtZSkgOiBmYWxzZTtcbiAgICBhbGxDb25zdGFudHMgPSBpc1N0YXRlbGVzc0ZpbHRlcjtcbiAgICBhcmdzVG9XYXRjaCA9IFtdO1xuICAgIGZvckVhY2goYXN0LmFyZ3VtZW50cywgZnVuY3Rpb24oZXhwcikge1xuICAgICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhleHByLCAkZmlsdGVyKTtcbiAgICAgIGFsbENvbnN0YW50cyA9IGFsbENvbnN0YW50cyAmJiBleHByLmNvbnN0YW50O1xuICAgICAgaWYgKCFleHByLmNvbnN0YW50KSB7XG4gICAgICAgIGFyZ3NUb1dhdGNoLnB1c2guYXBwbHkoYXJnc1RvV2F0Y2gsIGV4cHIudG9XYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXN0LmNvbnN0YW50ID0gYWxsQ29uc3RhbnRzO1xuICAgIGFzdC50b1dhdGNoID0gaXNTdGF0ZWxlc3NGaWx0ZXIgPyBhcmdzVG9XYXRjaCA6IFthc3RdO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5Bc3NpZ25tZW50RXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5sZWZ0LCAkZmlsdGVyKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5yaWdodCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LmxlZnQuY29uc3RhbnQgJiYgYXN0LnJpZ2h0LmNvbnN0YW50O1xuICAgIGFzdC50b1dhdGNoID0gW2FzdF07XG4gICAgYnJlYWs7XG4gIGNhc2UgQVNULkFycmF5RXhwcmVzc2lvbjpcbiAgICBhbGxDb25zdGFudHMgPSB0cnVlO1xuICAgIGFyZ3NUb1dhdGNoID0gW107XG4gICAgZm9yRWFjaChhc3QuZWxlbWVudHMsIGZ1bmN0aW9uKGV4cHIpIHtcbiAgICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoZXhwciwgJGZpbHRlcik7XG4gICAgICBhbGxDb25zdGFudHMgPSBhbGxDb25zdGFudHMgJiYgZXhwci5jb25zdGFudDtcbiAgICAgIGlmICghZXhwci5jb25zdGFudCkge1xuICAgICAgICBhcmdzVG9XYXRjaC5wdXNoLmFwcGx5KGFyZ3NUb1dhdGNoLCBleHByLnRvV2F0Y2gpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGFzdC5jb25zdGFudCA9IGFsbENvbnN0YW50cztcbiAgICBhc3QudG9XYXRjaCA9IGFyZ3NUb1dhdGNoO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5PYmplY3RFeHByZXNzaW9uOlxuICAgIGFsbENvbnN0YW50cyA9IHRydWU7XG4gICAgYXJnc1RvV2F0Y2ggPSBbXTtcbiAgICBmb3JFYWNoKGFzdC5wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhwcm9wZXJ0eS52YWx1ZSwgJGZpbHRlcik7XG4gICAgICBhbGxDb25zdGFudHMgPSBhbGxDb25zdGFudHMgJiYgcHJvcGVydHkudmFsdWUuY29uc3RhbnQgJiYgIXByb3BlcnR5LmNvbXB1dGVkO1xuICAgICAgaWYgKCFwcm9wZXJ0eS52YWx1ZS5jb25zdGFudCkge1xuICAgICAgICBhcmdzVG9XYXRjaC5wdXNoLmFwcGx5KGFyZ3NUb1dhdGNoLCBwcm9wZXJ0eS52YWx1ZS50b1dhdGNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBhc3QuY29uc3RhbnQgPSBhbGxDb25zdGFudHM7XG4gICAgYXN0LnRvV2F0Y2ggPSBhcmdzVG9XYXRjaDtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuVGhpc0V4cHJlc3Npb246XG4gICAgYXN0LmNvbnN0YW50ID0gZmFsc2U7XG4gICAgYXN0LnRvV2F0Y2ggPSBbXTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuTG9jYWxzRXhwcmVzc2lvbjpcbiAgICBhc3QuY29uc3RhbnQgPSBmYWxzZTtcbiAgICBhc3QudG9XYXRjaCA9IFtdO1xuICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElucHV0cyhib2R5KSB7XG4gIGlmIChib2R5Lmxlbmd0aCAhPT0gMSkgcmV0dXJuO1xuICB2YXIgbGFzdEV4cHJlc3Npb24gPSBib2R5WzBdLmV4cHJlc3Npb247XG4gIHZhciBjYW5kaWRhdGUgPSBsYXN0RXhwcmVzc2lvbi50b1dhdGNoO1xuICBpZiAoY2FuZGlkYXRlLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgcmV0dXJuIGNhbmRpZGF0ZVswXSAhPT0gbGFzdEV4cHJlc3Npb24gPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQXNzaWduYWJsZShhc3QpIHtcbiAgcmV0dXJuIGFzdC50eXBlID09PSBBU1QuSWRlbnRpZmllciB8fCBhc3QudHlwZSA9PT0gQVNULk1lbWJlckV4cHJlc3Npb247XG59XG5cbmZ1bmN0aW9uIGFzc2lnbmFibGVBU1QoYXN0KSB7XG4gIGlmIChhc3QuYm9keS5sZW5ndGggPT09IDEgJiYgaXNBc3NpZ25hYmxlKGFzdC5ib2R5WzBdLmV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIHt0eXBlOiBBU1QuQXNzaWdubWVudEV4cHJlc3Npb24sIGxlZnQ6IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24sIHJpZ2h0OiB7dHlwZTogQVNULk5HVmFsdWVQYXJhbWV0ZXJ9LCBvcGVyYXRvcjogJz0nfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0xpdGVyYWwoYXN0KSB7XG4gIHJldHVybiBhc3QuYm9keS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCA9PT0gMSAmJiAoXG4gICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgPT09IEFTVC5MaXRlcmFsIHx8XG4gICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgPT09IEFTVC5BcnJheUV4cHJlc3Npb24gfHxcbiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSA9PT0gQVNULk9iamVjdEV4cHJlc3Npb24pO1xufVxuXG5mdW5jdGlvbiBpc0NvbnN0YW50KGFzdCkge1xuICByZXR1cm4gYXN0LmNvbnN0YW50O1xufVxuXG5mdW5jdGlvbiBBU1RDb21waWxlcihhc3RCdWlsZGVyLCAkZmlsdGVyKSB7XG4gIHRoaXMuYXN0QnVpbGRlciA9IGFzdEJ1aWxkZXI7XG4gIHRoaXMuJGZpbHRlciA9ICRmaWx0ZXI7XG59XG5cbkFTVENvbXBpbGVyLnByb3RvdHlwZSA9IHtcbiAgY29tcGlsZTogZnVuY3Rpb24oZXhwcmVzc2lvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXN0ID0gdGhpcy5hc3RCdWlsZGVyLmFzdChleHByZXNzaW9uKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbmV4dElkOiAwLFxuICAgICAgZmlsdGVyczoge30sXG4gICAgICBmbjoge3ZhcnM6IFtdLCBib2R5OiBbXSwgb3duOiB7fX0sXG4gICAgICBhc3NpZ246IHt2YXJzOiBbXSwgYm9keTogW10sIG93bjoge319LFxuICAgICAgaW5wdXRzOiBbXVxuICAgIH07XG4gICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhhc3QsIHNlbGYuJGZpbHRlcik7XG4gICAgdmFyIGV4dHJhID0gJyc7XG4gICAgdmFyIGFzc2lnbmFibGU7XG4gICAgdGhpcy5zdGFnZSA9ICdhc3NpZ24nO1xuICAgIGlmICgoYXNzaWduYWJsZSA9IGFzc2lnbmFibGVBU1QoYXN0KSkpIHtcbiAgICAgIHRoaXMuc3RhdGUuY29tcHV0aW5nID0gJ2Fzc2lnbic7XG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgIHRoaXMucmVjdXJzZShhc3NpZ25hYmxlLCByZXN1bHQpO1xuICAgICAgdGhpcy5yZXR1cm5fKHJlc3VsdCk7XG4gICAgICBleHRyYSA9ICdmbi5hc3NpZ249JyArIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbignYXNzaWduJywgJ3MsdixsJyk7XG4gICAgfVxuICAgIHZhciB0b1dhdGNoID0gZ2V0SW5wdXRzKGFzdC5ib2R5KTtcbiAgICBzZWxmLnN0YWdlID0gJ2lucHV0cyc7XG4gICAgZm9yRWFjaCh0b1dhdGNoLCBmdW5jdGlvbih3YXRjaCwga2V5KSB7XG4gICAgICB2YXIgZm5LZXkgPSAnZm4nICsga2V5O1xuICAgICAgc2VsZi5zdGF0ZVtmbktleV0gPSB7dmFyczogW10sIGJvZHk6IFtdLCBvd246IHt9fTtcbiAgICAgIHNlbGYuc3RhdGUuY29tcHV0aW5nID0gZm5LZXk7XG4gICAgICB2YXIgaW50b0lkID0gc2VsZi5uZXh0SWQoKTtcbiAgICAgIHNlbGYucmVjdXJzZSh3YXRjaCwgaW50b0lkKTtcbiAgICAgIHNlbGYucmV0dXJuXyhpbnRvSWQpO1xuICAgICAgc2VsZi5zdGF0ZS5pbnB1dHMucHVzaChmbktleSk7XG4gICAgICB3YXRjaC53YXRjaElkID0ga2V5O1xuICAgIH0pO1xuICAgIHRoaXMuc3RhdGUuY29tcHV0aW5nID0gJ2ZuJztcbiAgICB0aGlzLnN0YWdlID0gJ21haW4nO1xuICAgIHRoaXMucmVjdXJzZShhc3QpO1xuICAgIHZhciBmblN0cmluZyA9XG4gICAgICAvLyBUaGUgYnVpbGQgYW5kIG1pbmlmaWNhdGlvbiBzdGVwcyByZW1vdmUgdGhlIHN0cmluZyBcInVzZSBzdHJpY3RcIiBmcm9tIHRoZSBjb2RlLCBidXQgdGhpcyBpcyBkb25lIHVzaW5nIGEgcmVnZXguXG4gICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhpcyB1bnRpbCB3ZSBkbyBhIGJldHRlciBqb2IgYXQgb25seSByZW1vdmluZyB0aGUgcHJlZml4IG9ubHkgd2hlbiB3ZSBzaG91bGQuXG4gICAgICAnXCInICsgdGhpcy5VU0UgKyAnICcgKyB0aGlzLlNUUklDVCArICdcIjtcXG4nICtcbiAgICAgIHRoaXMuZmlsdGVyUHJlZml4KCkgK1xuICAgICAgJ3ZhciBmbj0nICsgdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uKCdmbicsICdzLGwsYSxpJykgK1xuICAgICAgZXh0cmEgK1xuICAgICAgdGhpcy53YXRjaEZucygpICtcbiAgICAgICdyZXR1cm4gZm47JztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIHZhciBmbiA9IChuZXcgRnVuY3Rpb24oJyRmaWx0ZXInLFxuICAgICAgICAnZ2V0U3RyaW5nVmFsdWUnLFxuICAgICAgICAnaWZEZWZpbmVkJyxcbiAgICAgICAgJ3BsdXMnLFxuICAgICAgICBmblN0cmluZykpKFxuICAgICAgICAgIHRoaXMuJGZpbHRlcixcbiAgICAgICAgICBnZXRTdHJpbmdWYWx1ZSxcbiAgICAgICAgICBpZkRlZmluZWQsXG4gICAgICAgICAgcGx1c0ZuKTtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGFnZSA9IHVuZGVmaW5lZDtcbiAgICBmbi5saXRlcmFsID0gaXNMaXRlcmFsKGFzdCk7XG4gICAgZm4uY29uc3RhbnQgPSBpc0NvbnN0YW50KGFzdCk7XG4gICAgcmV0dXJuIGZuO1xuICB9LFxuXG4gIFVTRTogJ3VzZScsXG5cbiAgU1RSSUNUOiAnc3RyaWN0JyxcblxuICB3YXRjaEZuczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBmbnMgPSB0aGlzLnN0YXRlLmlucHV0cztcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yRWFjaChmbnMsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCd2YXIgJyArIG5hbWUgKyAnPScgKyBzZWxmLmdlbmVyYXRlRnVuY3Rpb24obmFtZSwgJ3MnKSk7XG4gICAgfSk7XG4gICAgaWYgKGZucy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCdmbi5pbnB1dHM9WycgKyBmbnMuam9pbignLCcpICsgJ107Jyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuam9pbignJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVGdW5jdGlvbjogZnVuY3Rpb24obmFtZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuICdmdW5jdGlvbignICsgcGFyYW1zICsgJyl7JyArXG4gICAgICAgIHRoaXMudmFyc1ByZWZpeChuYW1lKSArXG4gICAgICAgIHRoaXMuYm9keShuYW1lKSArXG4gICAgICAgICd9Oyc7XG4gIH0sXG5cbiAgZmlsdGVyUHJlZml4OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yRWFjaCh0aGlzLnN0YXRlLmZpbHRlcnMsIGZ1bmN0aW9uKGlkLCBmaWx0ZXIpIHtcbiAgICAgIHBhcnRzLnB1c2goaWQgKyAnPSRmaWx0ZXIoJyArIHNlbGYuZXNjYXBlKGZpbHRlcikgKyAnKScpO1xuICAgIH0pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGgpIHJldHVybiAndmFyICcgKyBwYXJ0cy5qb2luKCcsJykgKyAnOyc7XG4gICAgcmV0dXJuICcnO1xuICB9LFxuXG4gIHZhcnNQcmVmaXg6IGZ1bmN0aW9uKHNlY3Rpb24pIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVtzZWN0aW9uXS52YXJzLmxlbmd0aCA/ICd2YXIgJyArIHRoaXMuc3RhdGVbc2VjdGlvbl0udmFycy5qb2luKCcsJykgKyAnOycgOiAnJztcbiAgfSxcblxuICBib2R5OiBmdW5jdGlvbihzZWN0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVbc2VjdGlvbl0uYm9keS5qb2luKCcnKTtcbiAgfSxcblxuICByZWN1cnNlOiBmdW5jdGlvbihhc3QsIGludG9JZCwgbmFtZUlkLCByZWN1cnNpb25GbiwgY3JlYXRlLCBza2lwV2F0Y2hJZENoZWNrKSB7XG4gICAgdmFyIGxlZnQsIHJpZ2h0LCBzZWxmID0gdGhpcywgYXJncywgZXhwcmVzc2lvbiwgY29tcHV0ZWQ7XG4gICAgcmVjdXJzaW9uRm4gPSByZWN1cnNpb25GbiB8fCBub29wO1xuICAgIGlmICghc2tpcFdhdGNoSWRDaGVjayAmJiBpc0RlZmluZWQoYXN0LndhdGNoSWQpKSB7XG4gICAgICBpbnRvSWQgPSBpbnRvSWQgfHwgdGhpcy5uZXh0SWQoKTtcbiAgICAgIHRoaXMuaWZfKCdpJyxcbiAgICAgICAgdGhpcy5sYXp5QXNzaWduKGludG9JZCwgdGhpcy5jb21wdXRlZE1lbWJlcignaScsIGFzdC53YXRjaElkKSksXG4gICAgICAgIHRoaXMubGF6eVJlY3Vyc2UoYXN0LCBpbnRvSWQsIG5hbWVJZCwgcmVjdXJzaW9uRm4sIGNyZWF0ZSwgdHJ1ZSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoYXN0LnR5cGUpIHtcbiAgICBjYXNlIEFTVC5Qcm9ncmFtOlxuICAgICAgZm9yRWFjaChhc3QuYm9keSwgZnVuY3Rpb24oZXhwcmVzc2lvbiwgcG9zKSB7XG4gICAgICAgIHNlbGYucmVjdXJzZShleHByZXNzaW9uLmV4cHJlc3Npb24sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmdW5jdGlvbihleHByKSB7IHJpZ2h0ID0gZXhwcjsgfSk7XG4gICAgICAgIGlmIChwb3MgIT09IGFzdC5ib2R5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBzZWxmLmN1cnJlbnQoKS5ib2R5LnB1c2gocmlnaHQsICc7Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5yZXR1cm5fKHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5MaXRlcmFsOlxuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuZXNjYXBlKGFzdC52YWx1ZSk7XG4gICAgICB0aGlzLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8IGV4cHJlc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBU1QuVW5hcnlFeHByZXNzaW9uOlxuICAgICAgdGhpcy5yZWN1cnNlKGFzdC5hcmd1bWVudCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZ1bmN0aW9uKGV4cHIpIHsgcmlnaHQgPSBleHByOyB9KTtcbiAgICAgIGV4cHJlc3Npb24gPSBhc3Qub3BlcmF0b3IgKyAnKCcgKyB0aGlzLmlmRGVmaW5lZChyaWdodCwgMCkgKyAnKSc7XG4gICAgICB0aGlzLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgcmVjdXJzaW9uRm4oZXhwcmVzc2lvbik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5CaW5hcnlFeHByZXNzaW9uOlxuICAgICAgdGhpcy5yZWN1cnNlKGFzdC5sZWZ0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24oZXhwcikgeyBsZWZ0ID0gZXhwcjsgfSk7XG4gICAgICB0aGlzLnJlY3Vyc2UoYXN0LnJpZ2h0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24oZXhwcikgeyByaWdodCA9IGV4cHI7IH0pO1xuICAgICAgaWYgKGFzdC5vcGVyYXRvciA9PT0gJysnKSB7XG4gICAgICAgIGV4cHJlc3Npb24gPSB0aGlzLnBsdXMobGVmdCwgcmlnaHQpO1xuICAgICAgfSBlbHNlIGlmIChhc3Qub3BlcmF0b3IgPT09ICctJykge1xuICAgICAgICBleHByZXNzaW9uID0gdGhpcy5pZkRlZmluZWQobGVmdCwgMCkgKyBhc3Qub3BlcmF0b3IgKyB0aGlzLmlmRGVmaW5lZChyaWdodCwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHByZXNzaW9uID0gJygnICsgbGVmdCArICcpJyArIGFzdC5vcGVyYXRvciArICcoJyArIHJpZ2h0ICsgJyknO1xuICAgICAgfVxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGV4cHJlc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBU1QuTG9naWNhbEV4cHJlc3Npb246XG4gICAgICBpbnRvSWQgPSBpbnRvSWQgfHwgdGhpcy5uZXh0SWQoKTtcbiAgICAgIHNlbGYucmVjdXJzZShhc3QubGVmdCwgaW50b0lkKTtcbiAgICAgIHNlbGYuaWZfKGFzdC5vcGVyYXRvciA9PT0gJyYmJyA/IGludG9JZCA6IHNlbGYubm90KGludG9JZCksIHNlbGYubGF6eVJlY3Vyc2UoYXN0LnJpZ2h0LCBpbnRvSWQpKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5Db25kaXRpb25hbEV4cHJlc3Npb246XG4gICAgICBpbnRvSWQgPSBpbnRvSWQgfHwgdGhpcy5uZXh0SWQoKTtcbiAgICAgIHNlbGYucmVjdXJzZShhc3QudGVzdCwgaW50b0lkKTtcbiAgICAgIHNlbGYuaWZfKGludG9JZCwgc2VsZi5sYXp5UmVjdXJzZShhc3QuYWx0ZXJuYXRlLCBpbnRvSWQpLCBzZWxmLmxhenlSZWN1cnNlKGFzdC5jb25zZXF1ZW50LCBpbnRvSWQpKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5JZGVudGlmaWVyOlxuICAgICAgaW50b0lkID0gaW50b0lkIHx8IHRoaXMubmV4dElkKCk7XG4gICAgICBpZiAobmFtZUlkKSB7XG4gICAgICAgIG5hbWVJZC5jb250ZXh0ID0gc2VsZi5zdGFnZSA9PT0gJ2lucHV0cycgPyAncycgOiB0aGlzLmFzc2lnbih0aGlzLm5leHRJZCgpLCB0aGlzLmdldEhhc093blByb3BlcnR5KCdsJywgYXN0Lm5hbWUpICsgJz9sOnMnKTtcbiAgICAgICAgbmFtZUlkLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgIG5hbWVJZC5uYW1lID0gYXN0Lm5hbWU7XG4gICAgICB9XG4gICAgICBzZWxmLmlmXyhzZWxmLnN0YWdlID09PSAnaW5wdXRzJyB8fCBzZWxmLm5vdChzZWxmLmdldEhhc093blByb3BlcnR5KCdsJywgYXN0Lm5hbWUpKSxcbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5pZl8oc2VsZi5zdGFnZSA9PT0gJ2lucHV0cycgfHwgJ3MnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWZfKFxuICAgICAgICAgICAgICAgIHNlbGYuaXNOdWxsKHNlbGYubm9uQ29tcHV0ZWRNZW1iZXIoJ3MnLCBhc3QubmFtZSkpLFxuICAgICAgICAgICAgICAgIHNlbGYubGF6eUFzc2lnbihzZWxmLm5vbkNvbXB1dGVkTWVtYmVyKCdzJywgYXN0Lm5hbWUpLCAne30nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsIHNlbGYubm9uQ29tcHV0ZWRNZW1iZXIoJ3MnLCBhc3QubmFtZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBpbnRvSWQgJiYgc2VsZi5sYXp5QXNzaWduKGludG9JZCwgc2VsZi5ub25Db21wdXRlZE1lbWJlcignbCcsIGFzdC5uYW1lKSlcbiAgICAgICAgKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5NZW1iZXJFeHByZXNzaW9uOlxuICAgICAgbGVmdCA9IG5hbWVJZCAmJiAobmFtZUlkLmNvbnRleHQgPSB0aGlzLm5leHRJZCgpKSB8fCB0aGlzLm5leHRJZCgpO1xuICAgICAgaW50b0lkID0gaW50b0lkIHx8IHRoaXMubmV4dElkKCk7XG4gICAgICBzZWxmLnJlY3Vyc2UoYXN0Lm9iamVjdCwgbGVmdCwgdW5kZWZpbmVkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5pZl8oc2VsZi5ub3ROdWxsKGxlZnQpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoYXN0LmNvbXB1dGVkKSB7XG4gICAgICAgICAgICByaWdodCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgICAgICBzZWxmLnJlY3Vyc2UoYXN0LnByb3BlcnR5LCByaWdodCk7XG4gICAgICAgICAgICBzZWxmLmdldFN0cmluZ1ZhbHVlKHJpZ2h0KTtcbiAgICAgICAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWZfKHNlbGYubm90KHNlbGYuY29tcHV0ZWRNZW1iZXIobGVmdCwgcmlnaHQpKSwgc2VsZi5sYXp5QXNzaWduKHNlbGYuY29tcHV0ZWRNZW1iZXIobGVmdCwgcmlnaHQpLCAne30nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHByZXNzaW9uID0gc2VsZi5jb21wdXRlZE1lbWJlcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgICAgICAgaWYgKG5hbWVJZCkge1xuICAgICAgICAgICAgICBuYW1lSWQuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBuYW1lSWQubmFtZSA9IHJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3JlYXRlICYmIGNyZWF0ZSAhPT0gMSkge1xuICAgICAgICAgICAgICBzZWxmLmlmXyhzZWxmLmlzTnVsbChzZWxmLm5vbkNvbXB1dGVkTWVtYmVyKGxlZnQsIGFzdC5wcm9wZXJ0eS5uYW1lKSksIHNlbGYubGF6eUFzc2lnbihzZWxmLm5vbkNvbXB1dGVkTWVtYmVyKGxlZnQsIGFzdC5wcm9wZXJ0eS5uYW1lKSwgJ3t9JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHNlbGYubm9uQ29tcHV0ZWRNZW1iZXIobGVmdCwgYXN0LnByb3BlcnR5Lm5hbWUpO1xuICAgICAgICAgICAgc2VsZi5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmIChuYW1lSWQpIHtcbiAgICAgICAgICAgICAgbmFtZUlkLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIG5hbWVJZC5uYW1lID0gYXN0LnByb3BlcnR5Lm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsICd1bmRlZmluZWQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICB9LCAhIWNyZWF0ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5DYWxsRXhwcmVzc2lvbjpcbiAgICAgIGludG9JZCA9IGludG9JZCB8fCB0aGlzLm5leHRJZCgpO1xuICAgICAgaWYgKGFzdC5maWx0ZXIpIHtcbiAgICAgICAgcmlnaHQgPSBzZWxmLmZpbHRlcihhc3QuY2FsbGVlLm5hbWUpO1xuICAgICAgICBhcmdzID0gW107XG4gICAgICAgIGZvckVhY2goYXN0LmFyZ3VtZW50cywgZnVuY3Rpb24oZXhwcikge1xuICAgICAgICAgIHZhciBhcmd1bWVudCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgICAgc2VsZi5yZWN1cnNlKGV4cHIsIGFyZ3VtZW50KTtcbiAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IHJpZ2h0ICsgJygnICsgYXJncy5qb2luKCcsJykgKyAnKSc7XG4gICAgICAgIHNlbGYuYXNzaWduKGludG9JZCwgZXhwcmVzc2lvbik7XG4gICAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByaWdodCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgIGxlZnQgPSB7fTtcbiAgICAgICAgYXJncyA9IFtdO1xuICAgICAgICBzZWxmLnJlY3Vyc2UoYXN0LmNhbGxlZSwgcmlnaHQsIGxlZnQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuaWZfKHNlbGYubm90TnVsbChyaWdodCksIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZm9yRWFjaChhc3QuYXJndW1lbnRzLCBmdW5jdGlvbihleHByKSB7XG4gICAgICAgICAgICAgIHNlbGYucmVjdXJzZShleHByLCBhc3QuY29uc3RhbnQgPyB1bmRlZmluZWQgOiBzZWxmLm5leHRJZCgpLCB1bmRlZmluZWQsIGZ1bmN0aW9uKGFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChsZWZ0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHNlbGYubWVtYmVyKGxlZnQuY29udGV4dCwgbGVmdC5uYW1lLCBsZWZ0LmNvbXB1dGVkKSArICcoJyArIGFyZ3Muam9pbignLCcpICsgJyknO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHJpZ2h0ICsgJygnICsgYXJncy5qb2luKCcsJykgKyAnKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5hc3NpZ24oaW50b0lkLCAndW5kZWZpbmVkJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVjdXJzaW9uRm4oaW50b0lkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5Bc3NpZ25tZW50RXhwcmVzc2lvbjpcbiAgICAgIHJpZ2h0ID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgIGxlZnQgPSB7fTtcbiAgICAgIHRoaXMucmVjdXJzZShhc3QubGVmdCwgdW5kZWZpbmVkLCBsZWZ0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5pZl8oc2VsZi5ub3ROdWxsKGxlZnQuY29udGV4dCksIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYucmVjdXJzZShhc3QucmlnaHQsIHJpZ2h0KTtcbiAgICAgICAgICBleHByZXNzaW9uID0gc2VsZi5tZW1iZXIobGVmdC5jb250ZXh0LCBsZWZ0Lm5hbWUsIGxlZnQuY29tcHV0ZWQpICsgYXN0Lm9wZXJhdG9yICsgcmlnaHQ7XG4gICAgICAgICAgc2VsZi5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgICAgICByZWN1cnNpb25GbihpbnRvSWQgfHwgZXhwcmVzc2lvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSwgMSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5BcnJheUV4cHJlc3Npb246XG4gICAgICBhcmdzID0gW107XG4gICAgICBmb3JFYWNoKGFzdC5lbGVtZW50cywgZnVuY3Rpb24oZXhwcikge1xuICAgICAgICBzZWxmLnJlY3Vyc2UoZXhwciwgYXN0LmNvbnN0YW50ID8gdW5kZWZpbmVkIDogc2VsZi5uZXh0SWQoKSwgdW5kZWZpbmVkLCBmdW5jdGlvbihhcmd1bWVudCkge1xuICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBleHByZXNzaW9uID0gJ1snICsgYXJncy5qb2luKCcsJykgKyAnXSc7XG4gICAgICB0aGlzLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8IGV4cHJlc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBU1QuT2JqZWN0RXhwcmVzc2lvbjpcbiAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIGNvbXB1dGVkID0gZmFsc2U7XG4gICAgICBmb3JFYWNoKGFzdC5wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAocHJvcGVydHkuY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb21wdXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICAgIGludG9JZCA9IGludG9JZCB8fCB0aGlzLm5leHRJZCgpO1xuICAgICAgICB0aGlzLmFzc2lnbihpbnRvSWQsICd7fScpO1xuICAgICAgICBmb3JFYWNoKGFzdC5wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgICAgIGlmIChwcm9wZXJ0eS5jb21wdXRlZCkge1xuICAgICAgICAgICAgbGVmdCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgICAgICBzZWxmLnJlY3Vyc2UocHJvcGVydHkua2V5LCBsZWZ0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGVmdCA9IHByb3BlcnR5LmtleS50eXBlID09PSBBU1QuSWRlbnRpZmllciA/XG4gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmtleS5uYW1lIDpcbiAgICAgICAgICAgICAgICAgICAgICAgKCcnICsgcHJvcGVydHkua2V5LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmlnaHQgPSBzZWxmLm5leHRJZCgpO1xuICAgICAgICAgIHNlbGYucmVjdXJzZShwcm9wZXJ0eS52YWx1ZSwgcmlnaHQpO1xuICAgICAgICAgIHNlbGYuYXNzaWduKHNlbGYubWVtYmVyKGludG9JZCwgbGVmdCwgcHJvcGVydHkuY29tcHV0ZWQpLCByaWdodCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yRWFjaChhc3QucHJvcGVydGllcywgZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgICBzZWxmLnJlY3Vyc2UocHJvcGVydHkudmFsdWUsIGFzdC5jb25zdGFudCA/IHVuZGVmaW5lZCA6IHNlbGYubmV4dElkKCksIHVuZGVmaW5lZCwgZnVuY3Rpb24oZXhwcikge1xuICAgICAgICAgICAgYXJncy5wdXNoKHNlbGYuZXNjYXBlKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LmtleS50eXBlID09PSBBU1QuSWRlbnRpZmllciA/IHByb3BlcnR5LmtleS5uYW1lIDpcbiAgICAgICAgICAgICAgICAgICgnJyArIHByb3BlcnR5LmtleS52YWx1ZSkpICtcbiAgICAgICAgICAgICAgICAnOicgKyBleHByKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cHJlc3Npb24gPSAneycgKyBhcmdzLmpvaW4oJywnKSArICd9JztcbiAgICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgIH1cbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCB8fCBleHByZXNzaW9uKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQVNULlRoaXNFeHByZXNzaW9uOlxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCAncycpO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8ICdzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5Mb2NhbHNFeHByZXNzaW9uOlxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCAnbCcpO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8ICdsJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5OR1ZhbHVlUGFyYW1ldGVyOlxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCAndicpO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8ICd2Jyk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH0sXG5cbiAgZ2V0SGFzT3duUHJvcGVydHk6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gICAgdmFyIGtleSA9IGVsZW1lbnQgKyAnLicgKyBwcm9wZXJ0eTtcbiAgICB2YXIgb3duID0gdGhpcy5jdXJyZW50KCkub3duO1xuICAgIGlmICghb3duLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIG93bltrZXldID0gdGhpcy5uZXh0SWQoZmFsc2UsIGVsZW1lbnQgKyAnJiYoJyArIHRoaXMuZXNjYXBlKHByb3BlcnR5KSArICcgaW4gJyArIGVsZW1lbnQgKyAnKScpO1xuICAgIH1cbiAgICByZXR1cm4gb3duW2tleV07XG4gIH0sXG5cbiAgYXNzaWduOiBmdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKGlkLCAnPScsIHZhbHVlLCAnOycpO1xuICAgIHJldHVybiBpZDtcbiAgfSxcblxuICBmaWx0ZXI6IGZ1bmN0aW9uKGZpbHRlck5hbWUpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZmlsdGVycy5oYXNPd25Qcm9wZXJ0eShmaWx0ZXJOYW1lKSkge1xuICAgICAgdGhpcy5zdGF0ZS5maWx0ZXJzW2ZpbHRlck5hbWVdID0gdGhpcy5uZXh0SWQodHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlLmZpbHRlcnNbZmlsdGVyTmFtZV07XG4gIH0sXG5cbiAgaWZEZWZpbmVkOiBmdW5jdGlvbihpZCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuICdpZkRlZmluZWQoJyArIGlkICsgJywnICsgdGhpcy5lc2NhcGUoZGVmYXVsdFZhbHVlKSArICcpJztcbiAgfSxcblxuICBwbHVzOiBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiAncGx1cygnICsgbGVmdCArICcsJyArIHJpZ2h0ICsgJyknO1xuICB9LFxuXG4gIHJldHVybl86IGZ1bmN0aW9uKGlkKSB7XG4gICAgdGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKCdyZXR1cm4gJywgaWQsICc7Jyk7XG4gIH0sXG5cbiAgaWZfOiBmdW5jdGlvbih0ZXN0LCBhbHRlcm5hdGUsIGNvbnNlcXVlbnQpIHtcbiAgICBpZiAodGVzdCA9PT0gdHJ1ZSkge1xuICAgICAgYWx0ZXJuYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBib2R5ID0gdGhpcy5jdXJyZW50KCkuYm9keTtcbiAgICAgIGJvZHkucHVzaCgnaWYoJywgdGVzdCwgJyl7Jyk7XG4gICAgICBhbHRlcm5hdGUoKTtcbiAgICAgIGJvZHkucHVzaCgnfScpO1xuICAgICAgaWYgKGNvbnNlcXVlbnQpIHtcbiAgICAgICAgYm9keS5wdXNoKCdlbHNleycpO1xuICAgICAgICBjb25zZXF1ZW50KCk7XG4gICAgICAgIGJvZHkucHVzaCgnfScpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBub3Q6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gJyEoJyArIGV4cHJlc3Npb24gKyAnKSc7XG4gIH0sXG5cbiAgaXNOdWxsOiBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24gKyAnPT1udWxsJztcbiAgfSxcblxuICBub3ROdWxsOiBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24gKyAnIT1udWxsJztcbiAgfSxcblxuICBub25Db21wdXRlZE1lbWJlcjogZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICB2YXIgU0FGRV9JREVOVElGSUVSID0gL15bJF9hLXpBLVpdWyRfYS16QS1aMC05XSokLztcbiAgICB2YXIgVU5TQUZFX0NIQVJBQ1RFUlMgPSAvW14kX2EtekEtWjAtOV0vZztcbiAgICBpZiAoU0FGRV9JREVOVElGSUVSLnRlc3QocmlnaHQpKSB7XG4gICAgICByZXR1cm4gbGVmdCArICcuJyArIHJpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCAgKyAnW1wiJyArIHJpZ2h0LnJlcGxhY2UoVU5TQUZFX0NIQVJBQ1RFUlMsIHRoaXMuc3RyaW5nRXNjYXBlRm4pICsgJ1wiXSc7XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkTWVtYmVyOiBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBsZWZ0ICsgJ1snICsgcmlnaHQgKyAnXSc7XG4gIH0sXG5cbiAgbWVtYmVyOiBmdW5jdGlvbihsZWZ0LCByaWdodCwgY29tcHV0ZWQpIHtcbiAgICBpZiAoY29tcHV0ZWQpIHJldHVybiB0aGlzLmNvbXB1dGVkTWVtYmVyKGxlZnQsIHJpZ2h0KTtcbiAgICByZXR1cm4gdGhpcy5ub25Db21wdXRlZE1lbWJlcihsZWZ0LCByaWdodCk7XG4gIH0sXG5cbiAgZ2V0U3RyaW5nVmFsdWU6IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICB0aGlzLmFzc2lnbihpdGVtLCAnZ2V0U3RyaW5nVmFsdWUoJyArIGl0ZW0gKyAnKScpO1xuICB9LFxuXG4gIGxhenlSZWN1cnNlOiBmdW5jdGlvbihhc3QsIGludG9JZCwgbmFtZUlkLCByZWN1cnNpb25GbiwgY3JlYXRlLCBza2lwV2F0Y2hJZENoZWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYucmVjdXJzZShhc3QsIGludG9JZCwgbmFtZUlkLCByZWN1cnNpb25GbiwgY3JlYXRlLCBza2lwV2F0Y2hJZENoZWNrKTtcbiAgICB9O1xuICB9LFxuXG4gIGxhenlBc3NpZ246IGZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmFzc2lnbihpZCwgdmFsdWUpO1xuICAgIH07XG4gIH0sXG5cbiAgc3RyaW5nRXNjYXBlUmVnZXg6IC9bXiBhLXpBLVowLTldL2csXG5cbiAgc3RyaW5nRXNjYXBlRm46IGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gJ1xcXFx1JyArICgnMDAwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk7XG4gIH0sXG5cbiAgZXNjYXBlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHJldHVybiAnXFwnJyArIHZhbHVlLnJlcGxhY2UodGhpcy5zdHJpbmdFc2NhcGVSZWdleCwgdGhpcy5zdHJpbmdFc2NhcGVGbikgKyAnXFwnJztcbiAgICBpZiAoaXNOdW1iZXIodmFsdWUpKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiAndHJ1ZSc7XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuICdmYWxzZSc7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ3VuZGVmaW5lZCc7XG5cbiAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2VzYycsICdJTVBPU1NJQkxFJyk7XG4gIH0sXG5cbiAgbmV4dElkOiBmdW5jdGlvbihza2lwLCBpbml0KSB7XG4gICAgdmFyIGlkID0gJ3YnICsgKHRoaXMuc3RhdGUubmV4dElkKyspO1xuICAgIGlmICghc2tpcCkge1xuICAgICAgdGhpcy5jdXJyZW50KCkudmFycy5wdXNoKGlkICsgKGluaXQgPyAnPScgKyBpbml0IDogJycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9LFxuXG4gIGN1cnJlbnQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMuc3RhdGUuY29tcHV0aW5nXTtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBBU1RJbnRlcnByZXRlcihhc3RCdWlsZGVyLCAkZmlsdGVyKSB7XG4gIHRoaXMuYXN0QnVpbGRlciA9IGFzdEJ1aWxkZXI7XG4gIHRoaXMuJGZpbHRlciA9ICRmaWx0ZXI7XG59XG5cbkFTVEludGVycHJldGVyLnByb3RvdHlwZSA9IHtcbiAgY29tcGlsZTogZnVuY3Rpb24oZXhwcmVzc2lvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXN0ID0gdGhpcy5hc3RCdWlsZGVyLmFzdChleHByZXNzaW9uKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdCwgc2VsZi4kZmlsdGVyKTtcbiAgICB2YXIgYXNzaWduYWJsZTtcbiAgICB2YXIgYXNzaWduO1xuICAgIGlmICgoYXNzaWduYWJsZSA9IGFzc2lnbmFibGVBU1QoYXN0KSkpIHtcbiAgICAgIGFzc2lnbiA9IHRoaXMucmVjdXJzZShhc3NpZ25hYmxlKTtcbiAgICB9XG4gICAgdmFyIHRvV2F0Y2ggPSBnZXRJbnB1dHMoYXN0LmJvZHkpO1xuICAgIHZhciBpbnB1dHM7XG4gICAgaWYgKHRvV2F0Y2gpIHtcbiAgICAgIGlucHV0cyA9IFtdO1xuICAgICAgZm9yRWFjaCh0b1dhdGNoLCBmdW5jdGlvbih3YXRjaCwga2V5KSB7XG4gICAgICAgIHZhciBpbnB1dCA9IHNlbGYucmVjdXJzZSh3YXRjaCk7XG4gICAgICAgIHdhdGNoLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIGlucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgICAgd2F0Y2gud2F0Y2hJZCA9IGtleTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcbiAgICBmb3JFYWNoKGFzdC5ib2R5LCBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgICBleHByZXNzaW9ucy5wdXNoKHNlbGYucmVjdXJzZShleHByZXNzaW9uLmV4cHJlc3Npb24pKTtcbiAgICB9KTtcbiAgICB2YXIgZm4gPSBhc3QuYm9keS5sZW5ndGggPT09IDAgPyBub29wIDpcbiAgICAgICAgICAgICBhc3QuYm9keS5sZW5ndGggPT09IDEgPyBleHByZXNzaW9uc1swXSA6XG4gICAgICAgICAgICAgZnVuY3Rpb24oc2NvcGUsIGxvY2Fscykge1xuICAgICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZTtcbiAgICAgICAgICAgICAgIGZvckVhY2goZXhwcmVzc2lvbnMsIGZ1bmN0aW9uKGV4cCkge1xuICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBleHAoc2NvcGUsIGxvY2Fscyk7XG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIHJldHVybiBsYXN0VmFsdWU7XG4gICAgICAgICAgICAgfTtcbiAgICBpZiAoYXNzaWduKSB7XG4gICAgICBmbi5hc3NpZ24gPSBmdW5jdGlvbihzY29wZSwgdmFsdWUsIGxvY2Fscykge1xuICAgICAgICByZXR1cm4gYXNzaWduKHNjb3BlLCBsb2NhbHMsIHZhbHVlKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpbnB1dHMpIHtcbiAgICAgIGZuLmlucHV0cyA9IGlucHV0cztcbiAgICB9XG4gICAgZm4ubGl0ZXJhbCA9IGlzTGl0ZXJhbChhc3QpO1xuICAgIGZuLmNvbnN0YW50ID0gaXNDb25zdGFudChhc3QpO1xuICAgIHJldHVybiBmbjtcbiAgfSxcblxuICByZWN1cnNlOiBmdW5jdGlvbihhc3QsIGNvbnRleHQsIGNyZWF0ZSkge1xuICAgIHZhciBsZWZ0LCByaWdodCwgc2VsZiA9IHRoaXMsIGFyZ3M7XG4gICAgaWYgKGFzdC5pbnB1dCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzKGFzdC5pbnB1dCwgYXN0LndhdGNoSWQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGFzdC50eXBlKSB7XG4gICAgY2FzZSBBU1QuTGl0ZXJhbDpcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlKGFzdC52YWx1ZSwgY29udGV4dCk7XG4gICAgY2FzZSBBU1QuVW5hcnlFeHByZXNzaW9uOlxuICAgICAgcmlnaHQgPSB0aGlzLnJlY3Vyc2UoYXN0LmFyZ3VtZW50KTtcbiAgICAgIHJldHVybiB0aGlzWyd1bmFyeScgKyBhc3Qub3BlcmF0b3JdKHJpZ2h0LCBjb250ZXh0KTtcbiAgICBjYXNlIEFTVC5CaW5hcnlFeHByZXNzaW9uOlxuICAgICAgbGVmdCA9IHRoaXMucmVjdXJzZShhc3QubGVmdCk7XG4gICAgICByaWdodCA9IHRoaXMucmVjdXJzZShhc3QucmlnaHQpO1xuICAgICAgcmV0dXJuIHRoaXNbJ2JpbmFyeScgKyBhc3Qub3BlcmF0b3JdKGxlZnQsIHJpZ2h0LCBjb250ZXh0KTtcbiAgICBjYXNlIEFTVC5Mb2dpY2FsRXhwcmVzc2lvbjpcbiAgICAgIGxlZnQgPSB0aGlzLnJlY3Vyc2UoYXN0LmxlZnQpO1xuICAgICAgcmlnaHQgPSB0aGlzLnJlY3Vyc2UoYXN0LnJpZ2h0KTtcbiAgICAgIHJldHVybiB0aGlzWydiaW5hcnknICsgYXN0Lm9wZXJhdG9yXShsZWZ0LCByaWdodCwgY29udGV4dCk7XG4gICAgY2FzZSBBU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uOlxuICAgICAgcmV0dXJuIHRoaXNbJ3Rlcm5hcnk/OiddKFxuICAgICAgICB0aGlzLnJlY3Vyc2UoYXN0LnRlc3QpLFxuICAgICAgICB0aGlzLnJlY3Vyc2UoYXN0LmFsdGVybmF0ZSksXG4gICAgICAgIHRoaXMucmVjdXJzZShhc3QuY29uc2VxdWVudCksXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG4gICAgY2FzZSBBU1QuSWRlbnRpZmllcjpcbiAgICAgIHJldHVybiBzZWxmLmlkZW50aWZpZXIoYXN0Lm5hbWUsIGNvbnRleHQsIGNyZWF0ZSk7XG4gICAgY2FzZSBBU1QuTWVtYmVyRXhwcmVzc2lvbjpcbiAgICAgIGxlZnQgPSB0aGlzLnJlY3Vyc2UoYXN0Lm9iamVjdCwgZmFsc2UsICEhY3JlYXRlKTtcbiAgICAgIGlmICghYXN0LmNvbXB1dGVkKSB7XG4gICAgICAgIHJpZ2h0ID0gYXN0LnByb3BlcnR5Lm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAoYXN0LmNvbXB1dGVkKSByaWdodCA9IHRoaXMucmVjdXJzZShhc3QucHJvcGVydHkpO1xuICAgICAgcmV0dXJuIGFzdC5jb21wdXRlZCA/XG4gICAgICAgIHRoaXMuY29tcHV0ZWRNZW1iZXIobGVmdCwgcmlnaHQsIGNvbnRleHQsIGNyZWF0ZSkgOlxuICAgICAgICB0aGlzLm5vbkNvbXB1dGVkTWVtYmVyKGxlZnQsIHJpZ2h0LCBjb250ZXh0LCBjcmVhdGUpO1xuICAgIGNhc2UgQVNULkNhbGxFeHByZXNzaW9uOlxuICAgICAgYXJncyA9IFtdO1xuICAgICAgZm9yRWFjaChhc3QuYXJndW1lbnRzLCBmdW5jdGlvbihleHByKSB7XG4gICAgICAgIGFyZ3MucHVzaChzZWxmLnJlY3Vyc2UoZXhwcikpO1xuICAgICAgfSk7XG4gICAgICBpZiAoYXN0LmZpbHRlcikgcmlnaHQgPSB0aGlzLiRmaWx0ZXIoYXN0LmNhbGxlZS5uYW1lKTtcbiAgICAgIGlmICghYXN0LmZpbHRlcikgcmlnaHQgPSB0aGlzLnJlY3Vyc2UoYXN0LmNhbGxlZSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gYXN0LmZpbHRlciA/XG4gICAgICAgIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goYXJnc1tpXShzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgdmFsdWUgPSByaWdodC5hcHBseSh1bmRlZmluZWQsIHZhbHVlcywgaW5wdXRzKTtcbiAgICAgICAgICByZXR1cm4gY29udGV4dCA/IHtjb250ZXh0OiB1bmRlZmluZWQsIG5hbWU6IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfSA6IHZhbHVlO1xuICAgICAgICB9IDpcbiAgICAgICAgZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgICAgICB2YXIgcmhzID0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICBpZiAocmhzLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICB2YWx1ZXMucHVzaChhcmdzW2ldKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHJocy52YWx1ZS5hcHBseShyaHMuY29udGV4dCwgdmFsdWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IHZhbHVlfSA6IHZhbHVlO1xuICAgICAgICB9O1xuICAgIGNhc2UgQVNULkFzc2lnbm1lbnRFeHByZXNzaW9uOlxuICAgICAgbGVmdCA9IHRoaXMucmVjdXJzZShhc3QubGVmdCwgdHJ1ZSwgMSk7XG4gICAgICByaWdodCA9IHRoaXMucmVjdXJzZShhc3QucmlnaHQpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICAgIHZhciBsaHMgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgdmFyIHJocyA9IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgbGhzLmNvbnRleHRbbGhzLm5hbWVdID0gcmhzO1xuICAgICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogcmhzfSA6IHJocztcbiAgICAgIH07XG4gICAgY2FzZSBBU1QuQXJyYXlFeHByZXNzaW9uOlxuICAgICAgYXJncyA9IFtdO1xuICAgICAgZm9yRWFjaChhc3QuZWxlbWVudHMsIGZ1bmN0aW9uKGV4cHIpIHtcbiAgICAgICAgYXJncy5wdXNoKHNlbGYucmVjdXJzZShleHByKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgICB2YXIgdmFsdWUgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFsdWUucHVzaChhcmdzW2ldKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IHZhbHVlfSA6IHZhbHVlO1xuICAgICAgfTtcbiAgICBjYXNlIEFTVC5PYmplY3RFeHByZXNzaW9uOlxuICAgICAgYXJncyA9IFtdO1xuICAgICAgZm9yRWFjaChhc3QucHJvcGVydGllcywgZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5LmNvbXB1dGVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKHtrZXk6IHNlbGYucmVjdXJzZShwcm9wZXJ0eS5rZXkpLFxuICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5yZWN1cnNlKHByb3BlcnR5LnZhbHVlKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyZ3MucHVzaCh7a2V5OiBwcm9wZXJ0eS5rZXkudHlwZSA9PT0gQVNULklkZW50aWZpZXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5rZXkubmFtZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnJyArIHByb3BlcnR5LmtleS52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5yZWN1cnNlKHByb3BlcnR5LnZhbHVlKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgICB2YXIgdmFsdWUgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGFyZ3NbaV0uY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIHZhbHVlW2FyZ3NbaV0ua2V5KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKV0gPSBhcmdzW2ldLnZhbHVlKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVbYXJnc1tpXS5rZXldID0gYXJnc1tpXS52YWx1ZShzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiB2YWx1ZX0gOiB2YWx1ZTtcbiAgICAgIH07XG4gICAgY2FzZSBBU1QuVGhpc0V4cHJlc3Npb246XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IHNjb3BlfSA6IHNjb3BlO1xuICAgICAgfTtcbiAgICBjYXNlIEFTVC5Mb2NhbHNFeHByZXNzaW9uOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGxvY2Fsc30gOiBsb2NhbHM7XG4gICAgICB9O1xuICAgIGNhc2UgQVNULk5HVmFsdWVQYXJhbWV0ZXI6XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhc3NpZ259IDogYXNzaWduO1xuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgJ3VuYXJ5Kyc6IGZ1bmN0aW9uKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gYXJndW1lbnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgaWYgKGlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgIGFyZyA9ICthcmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcgPSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ3VuYXJ5LSc6IGZ1bmN0aW9uKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gYXJndW1lbnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgaWYgKGlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgIGFyZyA9IC1hcmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcgPSAtMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICd1bmFyeSEnOiBmdW5jdGlvbihhcmd1bWVudCwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGFyZyA9ICFhcmd1bWVudChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Kyc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgbGhzID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICB2YXIgcmhzID0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgdmFyIGFyZyA9IHBsdXNGbihsaHMsIHJocyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5LSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgbGhzID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICB2YXIgcmhzID0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgdmFyIGFyZyA9IChpc0RlZmluZWQobGhzKSA/IGxocyA6IDApIC0gKGlzRGVmaW5lZChyaHMpID8gcmhzIDogMCk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Kic6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgKiByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Lyc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgLyByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5JSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgJSByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5PT09JzogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBhcmcgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSA9PT0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ2JpbmFyeSE9PSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgIT09IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICdiaW5hcnk9PSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPT0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ2JpbmFyeSE9JzogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICAgIHZhciBhcmcgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSAhPSByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5PCc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPCByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Pic6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPiByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5PD0nOiBmdW5jdGlvbihsZWZ0LCByaWdodCwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGFyZyA9IGxlZnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIDw9IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICdiaW5hcnk+PSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPj0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ2JpbmFyeSYmJzogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBhcmcgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSAmJiByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5fHwnOiBmdW5jdGlvbihsZWZ0LCByaWdodCwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGFyZyA9IGxlZnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHx8IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICd0ZXJuYXJ5PzonOiBmdW5jdGlvbih0ZXN0LCBhbHRlcm5hdGUsIGNvbnNlcXVlbnQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBhcmcgPSB0ZXN0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSA/IGFsdGVybmF0ZShzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgOiBjb25zZXF1ZW50KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gIHZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbnRleHQgPyB7Y29udGV4dDogdW5kZWZpbmVkLCBuYW1lOiB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX0gOiB2YWx1ZTsgfTtcbiAgfSxcbiAgaWRlbnRpZmllcjogZnVuY3Rpb24obmFtZSwgY29udGV4dCwgY3JlYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYmFzZSA9IGxvY2FscyAmJiAobmFtZSBpbiBsb2NhbHMpID8gbG9jYWxzIDogc2NvcGU7XG4gICAgICBpZiAoY3JlYXRlICYmIGNyZWF0ZSAhPT0gMSAmJiBiYXNlICYmIGJhc2VbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBiYXNlW25hbWVdID0ge307XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBiYXNlID8gYmFzZVtuYW1lXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB7Y29udGV4dDogYmFzZSwgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBjb21wdXRlZE1lbWJlcjogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQsIGNyZWF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGxocyA9IGxlZnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgdmFyIHJocztcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGlmIChsaHMgIT0gbnVsbCkge1xuICAgICAgICByaHMgPSByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICAgIHJocyA9IGdldFN0cmluZ1ZhbHVlKHJocyk7XG4gICAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgICAgaWYgKGxocyAmJiAhKGxoc1tyaHNdKSkge1xuICAgICAgICAgICAgbGhzW3Joc10gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBsaHNbcmhzXTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB7Y29udGV4dDogbGhzLCBuYW1lOiByaHMsIHZhbHVlOiB2YWx1ZX07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbm9uQ29tcHV0ZWRNZW1iZXI6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0LCBjcmVhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBsaHMgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgIGlmIChsaHMgJiYgbGhzW3JpZ2h0XSA9PSBudWxsKSB7XG4gICAgICAgICAgbGhzW3JpZ2h0XSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBsaHMgIT0gbnVsbCA/IGxoc1tyaWdodF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4ge2NvbnRleHQ6IGxocywgbmFtZTogcmlnaHQsIHZhbHVlOiB2YWx1ZX07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgaW5wdXRzOiBmdW5jdGlvbihpbnB1dCwgd2F0Y2hJZCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgdmFsdWUsIGxvY2FscywgaW5wdXRzKSB7XG4gICAgICBpZiAoaW5wdXRzKSByZXR1cm4gaW5wdXRzW3dhdGNoSWRdO1xuICAgICAgcmV0dXJuIGlucHV0KHNjb3BlLCB2YWx1ZSwgbG9jYWxzKTtcbiAgICB9O1xuICB9XG59O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKGxleGVyLCAkZmlsdGVyLCBvcHRpb25zKSB7XG4gIHRoaXMubGV4ZXIgPSBsZXhlcjtcbiAgdGhpcy4kZmlsdGVyID0gJGZpbHRlcjtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgdGhpcy5hc3QgPSBuZXcgQVNUKGxleGVyLCBvcHRpb25zKTtcbiAgdGhpcy5hc3RDb21waWxlciA9IG9wdGlvbnMuY3NwID8gbmV3IEFTVEludGVycHJldGVyKHRoaXMuYXN0LCAkZmlsdGVyKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBU1RDb21waWxlcih0aGlzLmFzdCwgJGZpbHRlcik7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogUGFyc2VyLFxuXG4gIHBhcnNlOiBmdW5jdGlvbih0ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuYXN0Q29tcGlsZXIuY29tcGlsZSh0ZXh0KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0VmFsdWVPZih2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZS52YWx1ZU9mKSA/IHZhbHVlLnZhbHVlT2YoKSA6IG9iamVjdFZhbHVlT2YuY2FsbCh2YWx1ZSk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRwYXJzZVxuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBDb252ZXJ0cyBBbmd1bGFyIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGludG8gYSBmdW5jdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogICB2YXIgZ2V0dGVyID0gJHBhcnNlKCd1c2VyLm5hbWUnKTtcbiAqICAgdmFyIHNldHRlciA9IGdldHRlci5hc3NpZ247XG4gKiAgIHZhciBjb250ZXh0ID0ge3VzZXI6e25hbWU6J2FuZ3VsYXInfX07XG4gKiAgIHZhciBsb2NhbHMgPSB7dXNlcjp7bmFtZTonbG9jYWwnfX07XG4gKlxuICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQpKS50b0VxdWFsKCdhbmd1bGFyJyk7XG4gKiAgIHNldHRlcihjb250ZXh0LCAnbmV3VmFsdWUnKTtcbiAqICAgZXhwZWN0KGNvbnRleHQudXNlci5uYW1lKS50b0VxdWFsKCduZXdWYWx1ZScpO1xuICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQsIGxvY2FscykpLnRvRXF1YWwoJ2xvY2FsJyk7XG4gKiBgYGBcbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246XG4gKlxuICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nc1xuICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuXG4gKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluXG4gKiAgICAgIGBjb250ZXh0YC5cbiAqXG4gKiAgICBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gYWxzbyBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgICAqIGBsaXRlcmFsYCDigJMgYHtib29sZWFufWAg4oCTIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24ncyB0b3AtbGV2ZWwgbm9kZSBpcyBhIEphdmFTY3JpcHRcbiAqICAgICAgICBsaXRlcmFsLlxuICogICAgICAqIGBjb25zdGFudGAg4oCTIGB7Ym9vbGVhbn1gIOKAkyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIG1hZGUgZW50aXJlbHkgb2YgSmF2YVNjcmlwdFxuICogICAgICAgIGNvbnN0YW50IGxpdGVyYWxzLlxuICogICAgICAqIGBhc3NpZ25gIOKAkyBgez9mdW5jdGlvbihjb250ZXh0LCB2YWx1ZSl9YCDigJMgaWYgdGhlIGV4cHJlc3Npb24gaXMgYXNzaWduYWJsZSwgdGhpcyB3aWxsIGJlXG4gKiAgICAgICAgc2V0IHRvIGEgZnVuY3Rpb24gdG8gY2hhbmdlIGl0cyB2YWx1ZSBvbiB0aGUgZ2l2ZW4gY29udGV4dC5cbiAqXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJHBhcnNlUHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBgJHBhcnNlUHJvdmlkZXJgIGNhbiBiZSB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUge0BsaW5rIG5nLiRwYXJzZSAkcGFyc2V9XG4gKiAgc2VydmljZS5cbiAqL1xuZnVuY3Rpb24gJFBhcnNlUHJvdmlkZXIoKSB7XG4gIHZhciBjYWNoZSA9IGNyZWF0ZU1hcCgpO1xuICB2YXIgbGl0ZXJhbHMgPSB7XG4gICAgJ3RydWUnOiB0cnVlLFxuICAgICdmYWxzZSc6IGZhbHNlLFxuICAgICdudWxsJzogbnVsbCxcbiAgICAndW5kZWZpbmVkJzogdW5kZWZpbmVkXG4gIH07XG4gIHZhciBpZGVudFN0YXJ0LCBpZGVudENvbnRpbnVlO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRwYXJzZVByb3ZpZGVyI2FkZExpdGVyYWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIENvbmZpZ3VyZSAkcGFyc2Ugc2VydmljZSB0byBhZGQgbGl0ZXJhbCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHByZXNlbnQgYXMgbGl0ZXJhbCBhdCBleHByZXNzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpdGVyYWxOYW1lIFRva2VuIGZvciB0aGUgbGl0ZXJhbCB2YWx1ZS4gVGhlIGxpdGVyYWwgbmFtZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbGl0ZXJhbCBuYW1lLlxuICAgKiBAcGFyYW0geyp9IGxpdGVyYWxWYWx1ZSBWYWx1ZSBmb3IgdGhpcyBsaXRlcmFsLiBBbGwgbGl0ZXJhbCB2YWx1ZXMgbXVzdCBiZSBwcmltaXRpdmVzIG9yIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiovXG4gIHRoaXMuYWRkTGl0ZXJhbCA9IGZ1bmN0aW9uKGxpdGVyYWxOYW1lLCBsaXRlcmFsVmFsdWUpIHtcbiAgICBsaXRlcmFsc1tsaXRlcmFsTmFtZV0gPSBsaXRlcmFsVmFsdWU7XG4gIH07XG5cbiAvKipcbiAgKiBAbmdkb2MgbWV0aG9kXG4gICogQG5hbWUgJHBhcnNlUHJvdmlkZXIjc2V0SWRlbnRpZmllckZuc1xuICAqXG4gICogQGRlc2NyaXB0aW9uXG4gICpcbiAgKiBBbGxvd3MgZGVmaW5pbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbG93ZWQgaW4gQW5ndWxhciBleHByZXNzaW9ucy4gVGhlIGZ1bmN0aW9uXG4gICogYGlkZW50aWZpZXJTdGFydGAgd2lsbCBnZXQgY2FsbGVkIHRvIGtub3cgaWYgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgdG8gYmUgdGhlXG4gICogZmlyc3QgY2hhcmFjdGVyIGZvciBhbiBpZGVudGlmaWVyLiBUaGUgZnVuY3Rpb24gYGlkZW50aWZpZXJDb250aW51ZWAgd2lsbCBnZXQgY2FsbGVkIHRvIGtub3cgaWZcbiAgKiBhIGdpdmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIGNoYXJhY3RlciB0byBiZSBhIGZvbGxvdy11cCBpZGVudGlmaWVyIGNoYXJhY3Rlci4gVGhlIGZ1bmN0aW9uc1xuICAqIGBpZGVudGlmaWVyU3RhcnRgIGFuZCBgaWRlbnRpZmllckNvbnRpbnVlYCB3aWxsIHJlY2VpdmUgYXMgYXJndW1lbnRzIHRoZSBzaW5nbGUgY2hhcmFjdGVyIHRvIGJlXG4gICogaWRlbnRpZmllciBhbmQgdGhlIGNoYXJhY3RlciBjb2RlIHBvaW50LiBUaGVzZSBhcmd1bWVudHMgd2lsbCBiZSBgc3RyaW5nYCBhbmQgYG51bWVyaWNgLiBLZWVwIGluXG4gICogbWluZCB0aGF0IHRoZSBgc3RyaW5nYCBwYXJhbWV0ZXIgY2FuIGJlIHR3byBjaGFyYWN0ZXJzIGxvbmcgZGVwZW5kaW5nIG9uIHRoZSBjaGFyYWN0ZXJcbiAgKiByZXByZXNlbnRhdGlvbi4gSXQgaXMgZXhwZWN0ZWQgZm9yIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYHRydWVgIG9yIGBmYWxzZWAsIHdoZXRoZXIgdGhhdFxuICAqIGNoYXJhY3RlciBpcyBhbGxvd2VkIG9yIG5vdC5cbiAgKlxuICAqIFNpbmNlIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZXh0ZW5zaXZlbHksIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBmYXN0LFxuICAqIGFzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGVzZSBmdW5jdGlvbnMgaGF2ZSBhIGRpcmVjdCBpbXBhY3Qgb24gdGhlIGV4cHJlc3Npb25zIHBhcnNpbmcgc3BlZWQuXG4gICpcbiAgKiBAcGFyYW0ge2Z1bmN0aW9uPX0gaWRlbnRpZmllclN0YXJ0IFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgZGVjaWRlIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpc1xuICAqICAgYSB2YWxpZCBpZGVudGlmaWVyIHN0YXJ0IGNoYXJhY3Rlci5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9uPX0gaWRlbnRpZmllckNvbnRpbnVlIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgZGVjaWRlIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpc1xuICAqICAgYSB2YWxpZCBpZGVudGlmaWVyIGNvbnRpbnVlIGNoYXJhY3Rlci5cbiAgKi9cbiAgdGhpcy5zZXRJZGVudGlmaWVyRm5zID0gZnVuY3Rpb24oaWRlbnRpZmllclN0YXJ0LCBpZGVudGlmaWVyQ29udGludWUpIHtcbiAgICBpZGVudFN0YXJ0ID0gaWRlbnRpZmllclN0YXJ0O1xuICAgIGlkZW50Q29udGludWUgPSBpZGVudGlmaWVyQ29udGludWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdGhpcy4kZ2V0ID0gWyckZmlsdGVyJywgZnVuY3Rpb24oJGZpbHRlcikge1xuICAgIHZhciBub1Vuc2FmZUV2YWwgPSBjc3AoKS5ub1Vuc2FmZUV2YWw7XG4gICAgdmFyICRwYXJzZU9wdGlvbnMgPSB7XG4gICAgICAgICAgY3NwOiBub1Vuc2FmZUV2YWwsXG4gICAgICAgICAgbGl0ZXJhbHM6IGNvcHkobGl0ZXJhbHMpLFxuICAgICAgICAgIGlzSWRlbnRpZmllclN0YXJ0OiBpc0Z1bmN0aW9uKGlkZW50U3RhcnQpICYmIGlkZW50U3RhcnQsXG4gICAgICAgICAgaXNJZGVudGlmaWVyQ29udGludWU6IGlzRnVuY3Rpb24oaWRlbnRDb250aW51ZSkgJiYgaWRlbnRDb250aW51ZVxuICAgICAgICB9O1xuICAgIHJldHVybiAkcGFyc2U7XG5cbiAgICBmdW5jdGlvbiAkcGFyc2UoZXhwLCBpbnRlcmNlcHRvckZuKSB7XG4gICAgICB2YXIgcGFyc2VkRXhwcmVzc2lvbiwgb25lVGltZSwgY2FjaGVLZXk7XG5cbiAgICAgIHN3aXRjaCAodHlwZW9mIGV4cCkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIGV4cCA9IGV4cC50cmltKCk7XG4gICAgICAgICAgY2FjaGVLZXkgPSBleHA7XG5cbiAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uID0gY2FjaGVbY2FjaGVLZXldO1xuXG4gICAgICAgICAgaWYgKCFwYXJzZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhwLmNoYXJBdCgwKSA9PT0gJzonICYmIGV4cC5jaGFyQXQoMSkgPT09ICc6Jykge1xuICAgICAgICAgICAgICBvbmVUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZXhwID0gZXhwLnN1YnN0cmluZygyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZXhlciA9IG5ldyBMZXhlcigkcGFyc2VPcHRpb25zKTtcbiAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxleGVyLCAkZmlsdGVyLCAkcGFyc2VPcHRpb25zKTtcbiAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2UoZXhwKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRFeHByZXNzaW9uLmNvbnN0YW50KSB7XG4gICAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlID0gY29uc3RhbnRXYXRjaERlbGVnYXRlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvbmVUaW1lKSB7XG4gICAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlID0gcGFyc2VkRXhwcmVzc2lvbi5saXRlcmFsID9cbiAgICAgICAgICAgICAgICAgIG9uZVRpbWVMaXRlcmFsV2F0Y2hEZWxlZ2F0ZSA6IG9uZVRpbWVXYXRjaERlbGVnYXRlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZWRFeHByZXNzaW9uLmlucHV0cykge1xuICAgICAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZSA9IGlucHV0c1dhdGNoRGVsZWdhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWNoZVtjYWNoZUtleV0gPSBwYXJzZWRFeHByZXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWRkSW50ZXJjZXB0b3IocGFyc2VkRXhwcmVzc2lvbiwgaW50ZXJjZXB0b3JGbik7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBhZGRJbnRlcmNlcHRvcihleHAsIGludGVyY2VwdG9yRm4pO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGFkZEludGVyY2VwdG9yKG5vb3AsIGludGVyY2VwdG9yRm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2sobmV3VmFsdWUsIG9sZFZhbHVlT2ZWYWx1ZSkge1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCB8fCBvbGRWYWx1ZU9mVmFsdWUgPT0gbnVsbCkgeyAvLyBudWxsL3VuZGVmaW5lZFxuICAgICAgICByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlT2ZWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcpIHtcblxuICAgICAgICAvLyBhdHRlbXB0IHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgcHJpbWl0aXZlIHR5cGVcbiAgICAgICAgLy8gVE9ETyhkb2NzKTogYWRkIGEgbm90ZSB0byBkb2NzIHRoYXQgYnkgaW1wbGVtZW50aW5nIHZhbHVlT2YgZXZlbiBvYmplY3RzIGFuZCBhcnJheXMgY2FuXG4gICAgICAgIC8vICAgICAgICAgICAgIGJlIGNoZWFwbHkgZGlydHktY2hlY2tlZFxuICAgICAgICBuZXdWYWx1ZSA9IGdldFZhbHVlT2YobmV3VmFsdWUpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gb2JqZWN0cy9hcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgLSBkZWVwLXdhdGNoaW5nIHRoZW0gd291bGQgYmUgdG9vIGV4cGVuc2l2ZVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZhbGwtdGhyb3VnaCB0byB0aGUgcHJpbWl0aXZlIGVxdWFsaXR5IGNoZWNrXG4gICAgICB9XG5cbiAgICAgIC8vUHJpbWl0aXZlIG9yIE5hTlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgcmV0dXJuIG5ld1ZhbHVlID09PSBvbGRWYWx1ZU9mVmFsdWUgfHwgKG5ld1ZhbHVlICE9PSBuZXdWYWx1ZSAmJiBvbGRWYWx1ZU9mVmFsdWUgIT09IG9sZFZhbHVlT2ZWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5wdXRzV2F0Y2hEZWxlZ2F0ZShzY29wZSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBwYXJzZWRFeHByZXNzaW9uLCBwcmV0dHlQcmludEV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBpbnB1dEV4cHJlc3Npb25zID0gcGFyc2VkRXhwcmVzc2lvbi5pbnB1dHM7XG4gICAgICB2YXIgbGFzdFJlc3VsdDtcblxuICAgICAgaWYgKGlucHV0RXhwcmVzc2lvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhciBvbGRJbnB1dFZhbHVlT2YgPSBleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrOyAvLyBpbml0IHRvIHNvbWV0aGluZyB1bmlxdWUgc28gdGhhdCBlcXVhbHMgY2hlY2sgZmFpbHNcbiAgICAgICAgaW5wdXRFeHByZXNzaW9ucyA9IGlucHV0RXhwcmVzc2lvbnNbMF07XG4gICAgICAgIHJldHVybiBzY29wZS4kd2F0Y2goZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0V2F0Y2goc2NvcGUpIHtcbiAgICAgICAgICB2YXIgbmV3SW5wdXRWYWx1ZSA9IGlucHV0RXhwcmVzc2lvbnMoc2NvcGUpO1xuICAgICAgICAgIGlmICghZXhwcmVzc2lvbklucHV0RGlydHlDaGVjayhuZXdJbnB1dFZhbHVlLCBvbGRJbnB1dFZhbHVlT2YpKSB7XG4gICAgICAgICAgICBsYXN0UmVzdWx0ID0gcGFyc2VkRXhwcmVzc2lvbihzY29wZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtuZXdJbnB1dFZhbHVlXSk7XG4gICAgICAgICAgICBvbGRJbnB1dFZhbHVlT2YgPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgICAgICB9LCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHByZXR0eVByaW50RXhwcmVzc2lvbik7XG4gICAgICB9XG5cbiAgICAgIHZhciBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXMgPSBbXTtcbiAgICAgIHZhciBvbGRJbnB1dFZhbHVlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIG9sZElucHV0VmFsdWVPZlZhbHVlc1tpXSA9IGV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2s7IC8vIGluaXQgdG8gc29tZXRoaW5nIHVuaXF1ZSBzbyB0aGF0IGVxdWFscyBjaGVjayBmYWlsc1xuICAgICAgICBvbGRJbnB1dFZhbHVlc1tpXSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY29wZS4kd2F0Y2goZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0c1dhdGNoKHNjb3BlKSB7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgdmFyIG5ld0lucHV0VmFsdWUgPSBpbnB1dEV4cHJlc3Npb25zW2ldKHNjb3BlKTtcbiAgICAgICAgICBpZiAoY2hhbmdlZCB8fCAoY2hhbmdlZCA9ICFleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrKG5ld0lucHV0VmFsdWUsIG9sZElucHV0VmFsdWVPZlZhbHVlc1tpXSkpKSB7XG4gICAgICAgICAgICBvbGRJbnB1dFZhbHVlc1tpXSA9IG5ld0lucHV0VmFsdWU7XG4gICAgICAgICAgICBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXNbaV0gPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICBsYXN0UmVzdWx0ID0gcGFyc2VkRXhwcmVzc2lvbihzY29wZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9sZElucHV0VmFsdWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgICAgfSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBwcmV0dHlQcmludEV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZVRpbWVXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24sIHByZXR0eVByaW50RXhwcmVzc2lvbikge1xuICAgICAgdmFyIHVud2F0Y2gsIGxhc3RWYWx1ZTtcbiAgICAgIGlmIChwYXJzZWRFeHByZXNzaW9uLmlucHV0cykge1xuICAgICAgICB1bndhdGNoID0gaW5wdXRzV2F0Y2hEZWxlZ2F0ZShzY29wZSwgb25lVGltZUxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbiwgcHJldHR5UHJpbnRFeHByZXNzaW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2gob25lVGltZVdhdGNoLCBvbmVUaW1lTGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndhdGNoO1xuXG4gICAgICBmdW5jdGlvbiBvbmVUaW1lV2F0Y2goc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlZEV4cHJlc3Npb24oc2NvcGUpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gb25lVGltZUxpc3RlbmVyKHZhbHVlLCBvbGQsIHNjb3BlKSB7XG4gICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcikpIHtcbiAgICAgICAgICBsaXN0ZW5lcih2YWx1ZSwgb2xkLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICBzY29wZS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGxhc3RWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdW53YXRjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24pIHtcbiAgICAgIHZhciB1bndhdGNoLCBsYXN0VmFsdWU7XG4gICAgICB1bndhdGNoID0gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIG9uZVRpbWVXYXRjaChzY29wZSkge1xuICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7XG4gICAgICB9LCBmdW5jdGlvbiBvbmVUaW1lTGlzdGVuZXIodmFsdWUsIG9sZCwgc2NvcGUpIHtcbiAgICAgICAgbGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVyKSkge1xuICAgICAgICAgIGxpc3RlbmVyKHZhbHVlLCBvbGQsIHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBbGxEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgIHNjb3BlLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChpc0FsbERlZmluZWQobGFzdFZhbHVlKSkgdW53YXRjaCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBvYmplY3RFcXVhbGl0eSk7XG5cbiAgICAgIHJldHVybiB1bndhdGNoO1xuXG4gICAgICBmdW5jdGlvbiBpc0FsbERlZmluZWQodmFsdWUpIHtcbiAgICAgICAgdmFyIGFsbERlZmluZWQgPSB0cnVlO1xuICAgICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICBpZiAoIWlzRGVmaW5lZCh2YWwpKSBhbGxEZWZpbmVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYWxsRGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25zdGFudFdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbikge1xuICAgICAgdmFyIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2goZnVuY3Rpb24gY29uc3RhbnRXYXRjaChzY29wZSkge1xuICAgICAgICB1bndhdGNoKCk7XG4gICAgICAgIHJldHVybiBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTtcbiAgICAgIH0sIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSk7XG4gICAgICByZXR1cm4gdW53YXRjaDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRJbnRlcmNlcHRvcihwYXJzZWRFeHByZXNzaW9uLCBpbnRlcmNlcHRvckZuKSB7XG4gICAgICBpZiAoIWludGVyY2VwdG9yRm4pIHJldHVybiBwYXJzZWRFeHByZXNzaW9uO1xuICAgICAgdmFyIHdhdGNoRGVsZWdhdGUgPSBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZTtcbiAgICAgIHZhciB1c2VJbnB1dHMgPSBmYWxzZTtcblxuICAgICAgdmFyIHJlZ3VsYXJXYXRjaCA9XG4gICAgICAgICAgd2F0Y2hEZWxlZ2F0ZSAhPT0gb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlICYmXG4gICAgICAgICAgd2F0Y2hEZWxlZ2F0ZSAhPT0gb25lVGltZVdhdGNoRGVsZWdhdGU7XG5cbiAgICAgIHZhciBmbiA9IHJlZ3VsYXJXYXRjaCA/IGZ1bmN0aW9uIHJlZ3VsYXJJbnRlcmNlcHRlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdXNlSW5wdXRzICYmIGlucHV0cyA/IGlucHV0c1swXSA6IHBhcnNlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JGbih2YWx1ZSwgc2NvcGUsIGxvY2Fscyk7XG4gICAgICB9IDogZnVuY3Rpb24gb25lVGltZUludGVyY2VwdGVkRXhwcmVzc2lvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGludGVyY2VwdG9yRm4odmFsdWUsIHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAvLyB3ZSBvbmx5IHJldHVybiB0aGUgaW50ZXJjZXB0b3IncyByZXN1bHQgaWYgdGhlXG4gICAgICAgIC8vIGluaXRpYWwgdmFsdWUgaXMgZGVmaW5lZCAoZm9yIGJpbmQtb25jZSlcbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZCh2YWx1ZSkgPyByZXN1bHQgOiB2YWx1ZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFByb3BhZ2F0ZSAkJHdhdGNoRGVsZWdhdGVzIG90aGVyIHRoZW4gaW5wdXRzV2F0Y2hEZWxlZ2F0ZVxuICAgICAgdXNlSW5wdXRzID0gIXBhcnNlZEV4cHJlc3Npb24uaW5wdXRzO1xuICAgICAgaWYgKHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlICYmXG4gICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgIT09IGlucHV0c1dhdGNoRGVsZWdhdGUpIHtcbiAgICAgICAgZm4uJCR3YXRjaERlbGVnYXRlID0gcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGU7XG4gICAgICAgIGZuLmlucHV0cyA9IHBhcnNlZEV4cHJlc3Npb24uaW5wdXRzO1xuICAgICAgfSBlbHNlIGlmICghaW50ZXJjZXB0b3JGbi4kc3RhdGVmdWwpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gaW50ZXJjZXB0b3IsIGJ1dCBubyB3YXRjaERlbGVnYXRlIHRoZW4gdHJlYXQgdGhlIGludGVyY2VwdG9yIGxpa2VcbiAgICAgICAgLy8gd2UgdHJlYXQgZmlsdGVycyAtIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBwdXJlIGZ1bmN0aW9uIHVubGVzcyBmbGFnZ2VkIHdpdGggJHN0YXRlZnVsXG4gICAgICAgIGZuLiQkd2F0Y2hEZWxlZ2F0ZSA9IGlucHV0c1dhdGNoRGVsZWdhdGU7XG4gICAgICAgIGZuLmlucHV0cyA9IHBhcnNlZEV4cHJlc3Npb24uaW5wdXRzID8gcGFyc2VkRXhwcmVzc2lvbi5pbnB1dHMgOiBbcGFyc2VkRXhwcmVzc2lvbl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbjtcbiAgICB9XG4gIH1dO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkcVxuICogQHJlcXVpcmVzICRyb290U2NvcGVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc2VydmljZSB0aGF0IGhlbHBzIHlvdSBydW4gZnVuY3Rpb25zIGFzeW5jaHJvbm91c2x5LCBhbmQgdXNlIHRoZWlyIHJldHVybiB2YWx1ZXMgKG9yIGV4Y2VwdGlvbnMpXG4gKiB3aGVuIHRoZXkgYXJlIGRvbmUgcHJvY2Vzc2luZy5cbiAqXG4gKiBUaGlzIGlzIGEgW1Byb21pc2VzL0ErXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyktY29tcGxpYW50IGltcGxlbWVudGF0aW9uIG9mIHByb21pc2VzL2RlZmVycmVkXG4gKiBvYmplY3RzIGluc3BpcmVkIGJ5IFtLcmlzIEtvd2FsJ3MgUV0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKS5cbiAqXG4gKiAkcSBjYW4gYmUgdXNlZCBpbiB0d28gZmFzaGlvbnMgLS0tIG9uZSB3aGljaCBpcyBtb3JlIHNpbWlsYXIgdG8gS3JpcyBLb3dhbCdzIFEgb3IgalF1ZXJ5J3MgRGVmZXJyZWRcbiAqIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZSBvdGhlciB3aGljaCByZXNlbWJsZXMgRVM2IChFUzIwMTUpIHByb21pc2VzIHRvIHNvbWUgZGVncmVlLlxuICpcbiAqICMgJHEgY29uc3RydWN0b3JcbiAqXG4gKiBUaGUgc3RyZWFtbGluZWQgRVM2IHN0eWxlIHByb21pc2UgaXMgZXNzZW50aWFsbHkganVzdCB1c2luZyAkcSBhcyBhIGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIGEgYHJlc29sdmVyYFxuICogZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG5hdGl2ZSBQcm9taXNlIGltcGxlbWVudGF0aW9uIGZyb20gRVM2LFxuICogc2VlIFtNRE5dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2UpLlxuICpcbiAqIFdoaWxlIHRoZSBjb25zdHJ1Y3Rvci1zdHlsZSB1c2UgaXMgc3VwcG9ydGVkLCBub3QgYWxsIG9mIHRoZSBzdXBwb3J0aW5nIG1ldGhvZHMgZnJvbSBFUzYgcHJvbWlzZXMgYXJlXG4gKiBhdmFpbGFibGUgeWV0LlxuICpcbiAqIEl0IGNhbiBiZSB1c2VkIGxpa2Ugc286XG4gKlxuICogYGBganNcbiAqICAgLy8gZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhhbXBsZSBsZXQncyBhc3N1bWUgdGhhdCB2YXJpYWJsZXMgYCRxYCBhbmQgYG9rVG9HcmVldGBcbiAqICAgLy8gYXJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlICh0aGV5IGNvdWxkIGhhdmUgYmVlbiBpbmplY3RlZCBvciBwYXNzZWQgaW4pLlxuICpcbiAqICAgZnVuY3Rpb24gYXN5bmNHcmVldChuYW1lKSB7XG4gKiAgICAgLy8gcGVyZm9ybSBzb21lIGFzeW5jaHJvbm91cyBvcGVyYXRpb24sIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBwcm9taXNlIHdoZW4gYXBwcm9wcmlhdGUuXG4gKiAgICAgcmV0dXJuICRxKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICogICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAqICAgICAgICAgaWYgKG9rVG9HcmVldChuYW1lKSkge1xuICogICAgICAgICAgIHJlc29sdmUoJ0hlbGxvLCAnICsgbmFtZSArICchJyk7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgcmVqZWN0KCdHcmVldGluZyAnICsgbmFtZSArICcgaXMgbm90IGFsbG93ZWQuJyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0sIDEwMDApO1xuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICB2YXIgcHJvbWlzZSA9IGFzeW5jR3JlZXQoJ1JvYmluIEhvb2QnKTtcbiAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7XG4gKiAgICAgYWxlcnQoJ1N1Y2Nlc3M6ICcgKyBncmVldGluZyk7XG4gKiAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pO1xuICogICB9KTtcbiAqIGBgYFxuICpcbiAqIE5vdGU6IHByb2dyZXNzL25vdGlmeSBjYWxsYmFja3MgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIHZpYSB0aGUgRVM2LXN0eWxlIGludGVyZmFjZS5cbiAqXG4gKiBOb3RlOiB1bmxpa2UgRVM2IGJlaGF2aW9yLCBhbiBleGNlcHRpb24gdGhyb3duIGluIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIE5PVCBpbXBsaWNpdGx5IHJlamVjdCB0aGUgcHJvbWlzZS5cbiAqXG4gKiBIb3dldmVyLCB0aGUgbW9yZSB0cmFkaXRpb25hbCBDb21tb25KUy1zdHlsZSB1c2FnZSBpcyBzdGlsbCBhdmFpbGFibGUsIGFuZCBkb2N1bWVudGVkIGJlbG93LlxuICpcbiAqIFtUaGUgQ29tbW9uSlMgUHJvbWlzZSBwcm9wb3NhbF0oaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvUHJvbWlzZXMpIGRlc2NyaWJlcyBhIHByb21pc2UgYXMgYW5cbiAqIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4gYWN0aW9uIHRoYXQgaXNcbiAqIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseSwgYW5kIG1heSBvciBtYXkgbm90IGJlIGZpbmlzaGVkIGF0IGFueSBnaXZlbiBwb2ludCBpbiB0aW1lLlxuICpcbiAqIEZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGRlYWxpbmcgd2l0aCBlcnJvciBoYW5kbGluZywgZGVmZXJyZWQgYW5kIHByb21pc2UgQVBJcyBhcmUgdG9cbiAqIGFzeW5jaHJvbm91cyBwcm9ncmFtbWluZyB3aGF0IGB0cnlgLCBgY2F0Y2hgIGFuZCBgdGhyb3dgIGtleXdvcmRzIGFyZSB0byBzeW5jaHJvbm91cyBwcm9ncmFtbWluZy5cbiAqXG4gKiBgYGBqc1xuICogICAvLyBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBleGFtcGxlIGxldCdzIGFzc3VtZSB0aGF0IHZhcmlhYmxlcyBgJHFgIGFuZCBgb2tUb0dyZWV0YFxuICogICAvLyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUgKHRoZXkgY291bGQgaGF2ZSBiZWVuIGluamVjdGVkIG9yIHBhc3NlZCBpbikuXG4gKlxuICogICBmdW5jdGlvbiBhc3luY0dyZWV0KG5hbWUpIHtcbiAqICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICpcbiAqICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICogICAgICAgZGVmZXJyZWQubm90aWZ5KCdBYm91dCB0byBncmVldCAnICsgbmFtZSArICcuJyk7XG4gKlxuICogICAgICAgaWYgKG9rVG9HcmVldChuYW1lKSkge1xuICogICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCdIZWxsbywgJyArIG5hbWUgKyAnIScpO1xuICogICAgICAgfSBlbHNlIHtcbiAqICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCdHcmVldGluZyAnICsgbmFtZSArICcgaXMgbm90IGFsbG93ZWQuJyk7XG4gKiAgICAgICB9XG4gKiAgICAgfSwgMTAwMCk7XG4gKlxuICogICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICogICB9XG4gKlxuICogICB2YXIgcHJvbWlzZSA9IGFzeW5jR3JlZXQoJ1JvYmluIEhvb2QnKTtcbiAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7XG4gKiAgICAgYWxlcnQoJ1N1Y2Nlc3M6ICcgKyBncmVldGluZyk7XG4gKiAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pO1xuICogICB9LCBmdW5jdGlvbih1cGRhdGUpIHtcbiAqICAgICBhbGVydCgnR290IG5vdGlmaWNhdGlvbjogJyArIHVwZGF0ZSk7XG4gKiAgIH0pO1xuICogYGBgXG4gKlxuICogQXQgZmlyc3QgaXQgbWlnaHQgbm90IGJlIG9idmlvdXMgd2h5IHRoaXMgZXh0cmEgY29tcGxleGl0eSBpcyB3b3J0aCB0aGUgdHJvdWJsZS4gVGhlIHBheW9mZlxuICogY29tZXMgaW4gdGhlIHdheSBvZiBndWFyYW50ZWVzIHRoYXQgcHJvbWlzZSBhbmQgZGVmZXJyZWQgQVBJcyBtYWtlLCBzZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvdW5jb21tb25qcy9ibG9iL21hc3Rlci9wcm9taXNlcy9zcGVjaWZpY2F0aW9uLm1kLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0aGUgcHJvbWlzZSBhcGkgYWxsb3dzIGZvciBjb21wb3NpdGlvbiB0aGF0IGlzIHZlcnkgaGFyZCB0byBkbyB3aXRoIHRoZVxuICogdHJhZGl0aW9uYWwgY2FsbGJhY2sgKFtDUFNdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29udGludWF0aW9uLXBhc3Npbmdfc3R5bGUpKSBhcHByb2FjaC5cbiAqIEZvciBtb3JlIG9uIHRoaXMgcGxlYXNlIHNlZSB0aGUgW1EgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKSBlc3BlY2lhbGx5IHRoZVxuICogc2VjdGlvbiBvbiBzZXJpYWwgb3IgcGFyYWxsZWwgam9pbmluZyBvZiBwcm9taXNlcy5cbiAqXG4gKiAjIFRoZSBEZWZlcnJlZCBBUElcbiAqXG4gKiBBIG5ldyBpbnN0YW5jZSBvZiBkZWZlcnJlZCBpcyBjb25zdHJ1Y3RlZCBieSBjYWxsaW5nIGAkcS5kZWZlcigpYC5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiB0aGUgZGVmZXJyZWQgb2JqZWN0IGlzIHRvIGV4cG9zZSB0aGUgYXNzb2NpYXRlZCBQcm9taXNlIGluc3RhbmNlIGFzIHdlbGwgYXMgQVBJc1xuICogdGhhdCBjYW4gYmUgdXNlZCBmb3Igc2lnbmFsaW5nIHRoZSBzdWNjZXNzZnVsIG9yIHVuc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCBhcyB3ZWxsIGFzIHRoZSBzdGF0dXNcbiAqIG9mIHRoZSB0YXNrLlxuICpcbiAqICoqTWV0aG9kcyoqXG4gKlxuICogLSBgcmVzb2x2ZSh2YWx1ZSlgIOKAkyByZXNvbHZlcyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGB2YWx1ZWAuIElmIHRoZSB2YWx1ZSBpcyBhIHJlamVjdGlvblxuICogICBjb25zdHJ1Y3RlZCB2aWEgYCRxLnJlamVjdGAsIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaW5zdGVhZC5cbiAqIC0gYHJlamVjdChyZWFzb24pYCDigJMgcmVqZWN0cyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGByZWFzb25gLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAqICAgcmVzb2x2aW5nIGl0IHdpdGggYSByZWplY3Rpb24gY29uc3RydWN0ZWQgdmlhIGAkcS5yZWplY3RgLlxuICogLSBgbm90aWZ5KHZhbHVlKWAgLSBwcm92aWRlcyB1cGRhdGVzIG9uIHRoZSBzdGF0dXMgb2YgdGhlIHByb21pc2UncyBleGVjdXRpb24uIFRoaXMgbWF5IGJlIGNhbGxlZFxuICogICBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgdGhlIHByb21pc2UgaXMgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkLlxuICpcbiAqICoqUHJvcGVydGllcyoqXG4gKlxuICogLSBwcm9taXNlIOKAkyBge1Byb21pc2V9YCDigJMgcHJvbWlzZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVmZXJyZWQuXG4gKlxuICpcbiAqICMgVGhlIFByb21pc2UgQVBJXG4gKlxuICogQSBuZXcgcHJvbWlzZSBpbnN0YW5jZSBpcyBjcmVhdGVkIHdoZW4gYSBkZWZlcnJlZCBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5XG4gKiBjYWxsaW5nIGBkZWZlcnJlZC5wcm9taXNlYC5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiB0aGUgcHJvbWlzZSBvYmplY3QgaXMgdG8gYWxsb3cgZm9yIGludGVyZXN0ZWQgcGFydGllcyB0byBnZXQgYWNjZXNzIHRvIHRoZSByZXN1bHRcbiAqIG9mIHRoZSBkZWZlcnJlZCB0YXNrIHdoZW4gaXQgY29tcGxldGVzLlxuICpcbiAqICoqTWV0aG9kcyoqXG4gKlxuICogLSBgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIFtlcnJvckNhbGxiYWNrXSwgW25vdGlmeUNhbGxiYWNrXSlgIOKAkyByZWdhcmRsZXNzIG9mIHdoZW4gdGhlIHByb21pc2Ugd2FzIG9yXG4gKiAgIHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQsIGB0aGVuYCBjYWxscyBvbmUgb2YgdGhlIHN1Y2Nlc3Mgb3IgZXJyb3IgY2FsbGJhY2tzIGFzeW5jaHJvbm91c2x5XG4gKiAgIGFzIHNvb24gYXMgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUuIFRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50OiB0aGUgcmVzdWx0XG4gKiAgIG9yIHJlamVjdGlvbiByZWFzb24uIEFkZGl0aW9uYWxseSwgdGhlIG5vdGlmeSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIHplcm8gb3IgbW9yZSB0aW1lcyB0b1xuICogICBwcm92aWRlIGEgcHJvZ3Jlc3MgaW5kaWNhdGlvbiwgYmVmb3JlIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIG9yIHJlamVjdGVkLlxuICpcbiAqICAgVGhpcyBtZXRob2QgKnJldHVybnMgYSBuZXcgcHJvbWlzZSogd2hpY2ggaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlXG4gKiAgIGBzdWNjZXNzQ2FsbGJhY2tgLCBgZXJyb3JDYWxsYmFja2AgKHVubGVzcyB0aGF0IHZhbHVlIGlzIGEgcHJvbWlzZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyByZXNvbHZlZFxuICogICB3aXRoIHRoZSB2YWx1ZSB3aGljaCBpcyByZXNvbHZlZCBpbiB0aGF0IHByb21pc2UgdXNpbmdcbiAqICAgW3Byb21pc2UgY2hhaW5pbmddKGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2VzNi9wcm9taXNlcy8jdG9jLXByb21pc2VzLXF1ZXVlcykpLlxuICogICBJdCBhbHNvIG5vdGlmaWVzIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBgbm90aWZ5Q2FsbGJhY2tgIG1ldGhvZC4gVGhlIHByb21pc2UgY2Fubm90IGJlXG4gKiAgIHJlc29sdmVkIG9yIHJlamVjdGVkIGZyb20gdGhlIG5vdGlmeUNhbGxiYWNrIG1ldGhvZC4gVGhlIGVycm9yQ2FsbGJhY2sgYW5kIG5vdGlmeUNhbGxiYWNrXG4gKiAgIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuXG4gKlxuICogLSBgY2F0Y2goZXJyb3JDYWxsYmFjaylgIOKAkyBzaG9ydGhhbmQgZm9yIGBwcm9taXNlLnRoZW4obnVsbCwgZXJyb3JDYWxsYmFjaylgXG4gKlxuICogLSBgZmluYWxseShjYWxsYmFjaywgbm90aWZ5Q2FsbGJhY2spYCDigJMgYWxsb3dzIHlvdSB0byBvYnNlcnZlIGVpdGhlciB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIGEgcHJvbWlzZSxcbiAqICAgYnV0IHRvIGRvIHNvIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBmaW5hbCB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgdG8gcmVsZWFzZSByZXNvdXJjZXMgb3IgZG8gc29tZVxuICogICBjbGVhbi11cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgd2hldGhlciB0aGUgcHJvbWlzZSB3YXMgcmVqZWN0ZWQgb3IgcmVzb2x2ZWQuIFNlZSB0aGUgW2Z1bGxcbiAqICAgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL3dpa2kvQVBJLVJlZmVyZW5jZSNwcm9taXNlZmluYWxseWNhbGxiYWNrKSBmb3JcbiAqICAgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiAjIENoYWluaW5nIHByb21pc2VzXG4gKlxuICogQmVjYXVzZSBjYWxsaW5nIHRoZSBgdGhlbmAgbWV0aG9kIG9mIGEgcHJvbWlzZSByZXR1cm5zIGEgbmV3IGRlcml2ZWQgcHJvbWlzZSwgaXQgaXMgZWFzaWx5XG4gKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBjaGFpbiBvZiBwcm9taXNlczpcbiAqXG4gKiBgYGBqc1xuICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gKiAgICAgcmV0dXJuIHJlc3VsdCArIDE7XG4gKiAgIH0pO1xuICpcbiAqICAgLy8gcHJvbWlzZUIgd2lsbCBiZSByZXNvbHZlZCBpbW1lZGlhdGVseSBhZnRlciBwcm9taXNlQSBpcyByZXNvbHZlZCBhbmQgaXRzIHZhbHVlXG4gKiAgIC8vIHdpbGwgYmUgdGhlIHJlc3VsdCBvZiBwcm9taXNlQSBpbmNyZW1lbnRlZCBieSAxXG4gKiBgYGBcbiAqXG4gKiBJdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgY2hhaW5zIG9mIGFueSBsZW5ndGggYW5kIHNpbmNlIGEgcHJvbWlzZSBjYW4gYmUgcmVzb2x2ZWQgd2l0aCBhbm90aGVyXG4gKiBwcm9taXNlICh3aGljaCB3aWxsIGRlZmVyIGl0cyByZXNvbHV0aW9uIGZ1cnRoZXIpLCBpdCBpcyBwb3NzaWJsZSB0byBwYXVzZS9kZWZlciByZXNvbHV0aW9uIG9mXG4gKiB0aGUgcHJvbWlzZXMgYXQgYW55IHBvaW50IGluIHRoZSBjaGFpbi4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgcG93ZXJmdWwgQVBJcyBsaWtlXG4gKiAkaHR0cCdzIHJlc3BvbnNlIGludGVyY2VwdG9ycy5cbiAqXG4gKlxuICogIyBEaWZmZXJlbmNlcyBiZXR3ZWVuIEtyaXMgS293YWwncyBRIGFuZCAkcVxuICpcbiAqICBUaGVyZSBhcmUgdHdvIG1haW4gZGlmZmVyZW5jZXM6XG4gKlxuICogLSAkcSBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlfSBTY29wZSBtb2RlbCBvYnNlcnZhdGlvblxuICogICBtZWNoYW5pc20gaW4gYW5ndWxhciwgd2hpY2ggbWVhbnMgZmFzdGVyIHByb3BhZ2F0aW9uIG9mIHJlc29sdXRpb24gb3IgcmVqZWN0aW9uIGludG8geW91clxuICogICBtb2RlbHMgYW5kIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGJyb3dzZXIgcmVwYWludHMsIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBmbGlja2VyaW5nIFVJLlxuICogLSBRIGhhcyBtYW55IG1vcmUgZmVhdHVyZXMgdGhhbiAkcSwgYnV0IHRoYXQgY29tZXMgYXQgYSBjb3N0IG9mIGJ5dGVzLiAkcSBpcyB0aW55LCBidXQgY29udGFpbnNcbiAqICAgYWxsIHRoZSBpbXBvcnRhbnQgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGNvbW1vbiBhc3luYyB0YXNrcy5cbiAqXG4gKiAjIFRlc3RpbmdcbiAqXG4gKiAgYGBganNcbiAqICAgIGl0KCdzaG91bGQgc2ltdWxhdGUgcHJvbWlzZScsIGluamVjdChmdW5jdGlvbigkcSwgJHJvb3RTY29wZSkge1xuICogICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICogICAgICB2YXIgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7XG4gKiAgICAgIHZhciByZXNvbHZlZFZhbHVlO1xuICpcbiAqICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7IHJlc29sdmVkVmFsdWUgPSB2YWx1ZTsgfSk7XG4gKiAgICAgIGV4cGVjdChyZXNvbHZlZFZhbHVlKS50b0JlVW5kZWZpbmVkKCk7XG4gKlxuICogICAgICAvLyBTaW11bGF0ZSByZXNvbHZpbmcgb2YgcHJvbWlzZVxuICogICAgICBkZWZlcnJlZC5yZXNvbHZlKDEyMyk7XG4gKiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgJ3RoZW4nIGZ1bmN0aW9uIGRvZXMgbm90IGdldCBjYWxsZWQgc3luY2hyb25vdXNseS5cbiAqICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnQgdGhlIHByb21pc2UgQVBJIHRvIGFsd2F5cyBiZSBhc3luYywgd2hldGhlciBvciBub3RcbiAqICAgICAgLy8gaXQgZ290IGNhbGxlZCBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LlxuICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9CZVVuZGVmaW5lZCgpO1xuICpcbiAqICAgICAgLy8gUHJvcGFnYXRlIHByb21pc2UgcmVzb2x1dGlvbiB0byAndGhlbicgZnVuY3Rpb25zIHVzaW5nICRhcHBseSgpLlxuICogICAgICAkcm9vdFNjb3BlLiRhcHBseSgpO1xuICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9FcXVhbCgxMjMpO1xuICogICAgfSkpO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oZnVuY3Rpb24sIGZ1bmN0aW9uKX0gcmVzb2x2ZXIgRnVuY3Rpb24gd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHJlc29sdmluZyBvclxuICogICByZWplY3RpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgcHJvbWlzZS4gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJlc29sdmVzIHRoZVxuICogICBwcm9taXNlLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJlamVjdHMgdGhlIHByb21pc2UuXG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBuZXdseSBjcmVhdGVkIHByb21pc2UuXG4gKi9cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkcVByb3ZpZGVyXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICovXG5mdW5jdGlvbiAkUVByb3ZpZGVyKCkge1xuICB2YXIgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgPSB0cnVlO1xuICB0aGlzLiRnZXQgPSBbJyRyb290U2NvcGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCBmdW5jdGlvbigkcm9vdFNjb3BlLCAkZXhjZXB0aW9uSGFuZGxlcikge1xuICAgIHJldHVybiBxRmFjdG9yeShmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGNhbGxiYWNrKTtcbiAgICB9LCAkZXhjZXB0aW9uSGFuZGxlciwgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMpO1xuICB9XTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkcVByb3ZpZGVyI2Vycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXRyaWV2ZXMgb3Igb3ZlcnJpZGVzIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhIHJlamVjdGVkIHByb21pc2UgaXMgbm90IGhhbmRsZWQuXG4gICAqIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IHZhbHVlIFdoZXRoZXIgdG8gZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhIHJlamVjdGVkIHByb21pc2UgaXMgbm90IGhhbmRsZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufG5nLiRxUHJvdmlkZXJ9IEN1cnJlbnQgdmFsdWUgd2hlbiBjYWxsZWQgd2l0aG91dCBhIG5ldyB2YWx1ZSBvciBzZWxmIGZvclxuICAgKiAgICBjaGFpbmluZyBvdGhlcndpc2UuXG4gICAqL1xuICB0aGlzLmVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnM7XG4gICAgfVxuICB9O1xufVxuXG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICQkUVByb3ZpZGVyKCkge1xuICB2YXIgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgPSB0cnVlO1xuICB0aGlzLiRnZXQgPSBbJyRicm93c2VyJywgJyRleGNlcHRpb25IYW5kbGVyJywgZnVuY3Rpb24oJGJyb3dzZXIsICRleGNlcHRpb25IYW5kbGVyKSB7XG4gICAgcmV0dXJuIHFGYWN0b3J5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAkYnJvd3Nlci5kZWZlcihjYWxsYmFjayk7XG4gICAgfSwgJGV4Y2VwdGlvbkhhbmRsZXIsIGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zKTtcbiAgfV07XG5cbiAgdGhpcy5lcnJvck9uVW5oYW5kbGVkUmVqZWN0aW9ucyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgcHJvbWlzZSBtYW5hZ2VyLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oZnVuY3Rpb24pfSBuZXh0VGljayBGdW5jdGlvbiBmb3IgZXhlY3V0aW5nIGZ1bmN0aW9ucyBpbiB0aGUgbmV4dCB0dXJuLlxuICogQHBhcmFtIHtmdW5jdGlvbiguLi4qKX0gZXhjZXB0aW9uSGFuZGxlciBGdW5jdGlvbiBpbnRvIHdoaWNoIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBhcmUgcGFzc2VkIGZvclxuICogICAgIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiBAIHBhcmFtIHs9Ym9vbGVhbn0gZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgV2hldGhlciBhbiBlcnJvciBzaG91bGQgYmUgZ2VuZXJhdGVkIG9uIHVuaGFuZGxlZFxuICogICAgIHByb21pc2VzIHJlamVjdGlvbnMuXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIG1hbmFnZXIuXG4gKi9cbmZ1bmN0aW9uIHFGYWN0b3J5KG5leHRUaWNrLCBleGNlcHRpb25IYW5kbGVyLCBlcnJvck9uVW5oYW5kbGVkUmVqZWN0aW9ucykge1xuICB2YXIgJHFNaW5FcnIgPSBtaW5FcnIoJyRxJywgVHlwZUVycm9yKTtcbiAgdmFyIHF1ZXVlU2l6ZSA9IDA7XG4gIHZhciBjaGVja1F1ZXVlID0gW107XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgbmcuJHEjZGVmZXJcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENyZWF0ZXMgYSBgRGVmZXJyZWRgIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGEgdGFzayB3aGljaCB3aWxsIGZpbmlzaCBpbiB0aGUgZnV0dXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7RGVmZXJyZWR9IFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgZGVmZXJyZWQuXG4gICAqL1xuICBmdW5jdGlvbiBkZWZlcigpIHtcbiAgICByZXR1cm4gbmV3IERlZmVycmVkKCk7XG4gIH1cblxuICBmdW5jdGlvbiBEZWZlcnJlZCgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKCk7XG4gICAgLy9Ob24gcHJvdG90eXBlIG1ldGhvZHMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdW5ib3VuZCBleGVjdXRpb24gOi9cbiAgICB0aGlzLnJlc29sdmUgPSBmdW5jdGlvbih2YWwpIHsgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdmFsKTsgfTtcbiAgICB0aGlzLnJlamVjdCA9IGZ1bmN0aW9uKHJlYXNvbikgeyByZWplY3RQcm9taXNlKHByb21pc2UsIHJlYXNvbik7IH07XG4gICAgdGhpcy5ub3RpZnkgPSBmdW5jdGlvbihwcm9ncmVzcykgeyBub3RpZnlQcm9taXNlKHByb21pc2UsIHByb2dyZXNzKTsgfTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gUHJvbWlzZSgpIHtcbiAgICB0aGlzLiQkc3RhdGUgPSB7IHN0YXR1czogMCB9O1xuICB9XG5cbiAgZXh0ZW5kKFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb2dyZXNzQmFjaykge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKG9uRnVsZmlsbGVkKSAmJiBpc1VuZGVmaW5lZChvblJlamVjdGVkKSAmJiBpc1VuZGVmaW5lZChwcm9ncmVzc0JhY2spKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBQcm9taXNlKCk7XG5cbiAgICAgIHRoaXMuJCRzdGF0ZS5wZW5kaW5nID0gdGhpcy4kJHN0YXRlLnBlbmRpbmcgfHwgW107XG4gICAgICB0aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtyZXN1bHQsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9ncmVzc0JhY2tdKTtcbiAgICAgIGlmICh0aGlzLiQkc3RhdGUuc3RhdHVzID4gMCkgc2NoZWR1bGVQcm9jZXNzUXVldWUodGhpcy4kJHN0YXRlKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICAnZmluYWxseSc6IGZ1bmN0aW9uKGNhbGxiYWNrLCBwcm9ncmVzc0JhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNhbGxiYWNrKHZhbHVlLCByZXNvbHZlLCBjYWxsYmFjayk7XG4gICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICByZXR1cm4gaGFuZGxlQ2FsbGJhY2soZXJyb3IsIHJlamVjdCwgY2FsbGJhY2spO1xuICAgICAgfSwgcHJvZ3Jlc3NCYWNrKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3NRdWV1ZShzdGF0ZSkge1xuICAgIHZhciBmbiwgcHJvbWlzZSwgcGVuZGluZztcblxuICAgIHBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nO1xuICAgIHN0YXRlLnByb2Nlc3NTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBzdGF0ZS5wZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwZW5kaW5nLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgc3RhdGUucHVyID0gdHJ1ZTtcbiAgICAgICAgcHJvbWlzZSA9IHBlbmRpbmdbaV1bMF07XG4gICAgICAgIGZuID0gcGVuZGluZ1tpXVtzdGF0ZS5zdGF0dXNdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZm4oc3RhdGUudmFsdWUpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3RQcm9taXNlKHByb21pc2UsIHN0YXRlLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3RQcm9taXNlKHByb21pc2UsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC0tcXVldWVTaXplO1xuICAgICAgaWYgKGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zICYmIHF1ZXVlU2l6ZSA9PT0gMCkge1xuICAgICAgICBuZXh0VGljayhwcm9jZXNzQ2hlY2tzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzQ2hlY2tzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bm1vZGlmaWVkLWxvb3AtY29uZGl0aW9uXG4gICAgd2hpbGUgKCFxdWV1ZVNpemUgJiYgY2hlY2tRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHZhciB0b0NoZWNrID0gY2hlY2tRdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKCF0b0NoZWNrLnB1cikge1xuICAgICAgICB0b0NoZWNrLnB1ciA9IHRydWU7XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnUG9zc2libHkgdW5oYW5kbGVkIHJlamVjdGlvbjogJyArIHRvRGVidWdTdHJpbmcodG9DaGVjay52YWx1ZSk7XG4gICAgICAgIGlmICh0b0NoZWNrLnZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBleGNlcHRpb25IYW5kbGVyKHRvQ2hlY2sudmFsdWUsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhjZXB0aW9uSGFuZGxlcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGVQcm9jZXNzUXVldWUoc3RhdGUpIHtcbiAgICBpZiAoZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgJiYgIXN0YXRlLnBlbmRpbmcgJiYgc3RhdGUuc3RhdHVzID09PSAyICYmICFzdGF0ZS5wdXIpIHtcbiAgICAgIGlmIChxdWV1ZVNpemUgPT09IDAgJiYgY2hlY2tRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbmV4dFRpY2socHJvY2Vzc0NoZWNrcyk7XG4gICAgICB9XG4gICAgICBjaGVja1F1ZXVlLnB1c2goc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUucHJvY2Vzc1NjaGVkdWxlZCB8fCAhc3RhdGUucGVuZGluZykgcmV0dXJuO1xuICAgIHN0YXRlLnByb2Nlc3NTY2hlZHVsZWQgPSB0cnVlO1xuICAgICsrcXVldWVTaXplO1xuICAgIG5leHRUaWNrKGZ1bmN0aW9uKCkgeyBwcm9jZXNzUXVldWUoc3RhdGUpOyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHZhbCkge1xuICAgIGlmIChwcm9taXNlLiQkc3RhdGUuc3RhdHVzKSByZXR1cm47XG4gICAgaWYgKHZhbCA9PT0gcHJvbWlzZSkge1xuICAgICAgJCRyZWplY3QocHJvbWlzZSwgJHFNaW5FcnIoXG4gICAgICAgICdxY3ljbGUnLFxuICAgICAgICAnRXhwZWN0ZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHZhbHVlIG90aGVyIHRoYW4gaXRzZWxmIFxcJ3swfVxcJycsXG4gICAgICAgIHZhbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkJHJlc29sdmUocHJvbWlzZSwgdmFsKTtcbiAgICB9XG5cbiAgfVxuXG4gIGZ1bmN0aW9uICQkcmVzb2x2ZShwcm9taXNlLCB2YWwpIHtcbiAgICB2YXIgdGhlbjtcbiAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaXNPYmplY3QodmFsKSB8fCBpc0Z1bmN0aW9uKHZhbCkpIHRoZW4gPSB2YWwudGhlbjtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKHRoZW4pKSB7XG4gICAgICAgIHByb21pc2UuJCRzdGF0ZS5zdGF0dXMgPSAtMTtcbiAgICAgICAgdGhlbi5jYWxsKHZhbCwgZG9SZXNvbHZlLCBkb1JlamVjdCwgZG9Ob3RpZnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZS4kJHN0YXRlLnZhbHVlID0gdmFsO1xuICAgICAgICBwcm9taXNlLiQkc3RhdGUuc3RhdHVzID0gMTtcbiAgICAgICAgc2NoZWR1bGVQcm9jZXNzUXVldWUocHJvbWlzZS4kJHN0YXRlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkb1JlamVjdChlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb1Jlc29sdmUodmFsKSB7XG4gICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAkJHJlc29sdmUocHJvbWlzZSwgdmFsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZG9SZWplY3QodmFsKSB7XG4gICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAkJHJlamVjdChwcm9taXNlLCB2YWwpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkb05vdGlmeShwcm9ncmVzcykge1xuICAgICAgbm90aWZ5UHJvbWlzZShwcm9taXNlLCBwcm9ncmVzcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShwcm9taXNlLCByZWFzb24pIHtcbiAgICBpZiAocHJvbWlzZS4kJHN0YXRlLnN0YXR1cykgcmV0dXJuO1xuICAgICQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gIH1cblxuICBmdW5jdGlvbiAkJHJlamVjdChwcm9taXNlLCByZWFzb24pIHtcbiAgICBwcm9taXNlLiQkc3RhdGUudmFsdWUgPSByZWFzb247XG4gICAgcHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA9IDI7XG4gICAgc2NoZWR1bGVQcm9jZXNzUXVldWUocHJvbWlzZS4kJHN0YXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdGlmeVByb21pc2UocHJvbWlzZSwgcHJvZ3Jlc3MpIHtcbiAgICB2YXIgY2FsbGJhY2tzID0gcHJvbWlzZS4kJHN0YXRlLnBlbmRpbmc7XG5cbiAgICBpZiAoKHByb21pc2UuJCRzdGF0ZS5zdGF0dXMgPD0gMCkgJiYgY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIG5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2FsbGJhY2ssIHJlc3VsdDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQgPSBjYWxsYmFja3NbaV1bMF07XG4gICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja3NbaV1bM107XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5vdGlmeVByb21pc2UocmVzdWx0LCBpc0Z1bmN0aW9uKGNhbGxiYWNrKSA/IGNhbGxiYWNrKHByb2dyZXNzKSA6IHByb2dyZXNzKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJHEjcmVqZWN0XG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDcmVhdGVzIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGFzIHJlamVjdGVkIHdpdGggdGhlIHNwZWNpZmllZCBgcmVhc29uYC4gVGhpcyBhcGkgc2hvdWxkIGJlXG4gICAqIHVzZWQgdG8gZm9yd2FyZCByZWplY3Rpb24gaW4gYSBjaGFpbiBvZiBwcm9taXNlcy4gSWYgeW91IGFyZSBkZWFsaW5nIHdpdGggdGhlIGxhc3QgcHJvbWlzZSBpblxuICAgKiBhIHByb21pc2UgY2hhaW4sIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0LlxuICAgKlxuICAgKiBXaGVuIGNvbXBhcmluZyBkZWZlcnJlZHMvcHJvbWlzZXMgdG8gdGhlIGZhbWlsaWFyIGJlaGF2aW9yIG9mIHRyeS9jYXRjaC90aHJvdywgdGhpbmsgb2ZcbiAgICogYHJlamVjdGAgYXMgdGhlIGB0aHJvd2Aga2V5d29yZCBpbiBKYXZhU2NyaXB0LiBUaGlzIGFsc28gbWVhbnMgdGhhdCBpZiB5b3UgXCJjYXRjaFwiIGFuIGVycm9yIHZpYVxuICAgKiBhIHByb21pc2UgZXJyb3IgY2FsbGJhY2sgYW5kIHlvdSB3YW50IHRvIGZvcndhcmQgdGhlIGVycm9yIHRvIHRoZSBwcm9taXNlIGRlcml2ZWQgZnJvbSB0aGVcbiAgICogY3VycmVudCBwcm9taXNlLCB5b3UgaGF2ZSB0byBcInJldGhyb3dcIiB0aGUgZXJyb3IgYnkgcmV0dXJuaW5nIGEgcmVqZWN0aW9uIGNvbnN0cnVjdGVkIHZpYVxuICAgKiBgcmVqZWN0YC5cbiAgICpcbiAgICogYGBganNcbiAgICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAqICAgICAvLyBzdWNjZXNzOiBkbyBzb21ldGhpbmcgYW5kIHJlc29sdmUgcHJvbWlzZUJcbiAgICogICAgIC8vICAgICAgICAgIHdpdGggdGhlIG9sZCBvciBhIG5ldyByZXN1bHRcbiAgICogICAgIHJldHVybiByZXN1bHQ7XG4gICAqICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAqICAgICAvLyBlcnJvcjogaGFuZGxlIHRoZSBlcnJvciBpZiBwb3NzaWJsZSBhbmRcbiAgICogICAgIC8vICAgICAgICByZXNvbHZlIHByb21pc2VCIHdpdGggbmV3UHJvbWlzZU9yVmFsdWUsXG4gICAqICAgICAvLyAgICAgICAgb3RoZXJ3aXNlIGZvcndhcmQgdGhlIHJlamVjdGlvbiB0byBwcm9taXNlQlxuICAgKiAgICAgaWYgKGNhbkhhbmRsZShyZWFzb24pKSB7XG4gICAqICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcmVjb3ZlclxuICAgKiAgICAgIHJldHVybiBuZXdQcm9taXNlT3JWYWx1ZTtcbiAgICogICAgIH1cbiAgICogICAgIHJldHVybiAkcS5yZWplY3QocmVhc29uKTtcbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gcmVhc29uIENvbnN0YW50LCBtZXNzYWdlLCBleGNlcHRpb24gb3IgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVqZWN0aW9uIHJlYXNvbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgYSBwcm9taXNlIHRoYXQgd2FzIGFscmVhZHkgcmVzb2x2ZWQgYXMgcmVqZWN0ZWQgd2l0aCB0aGUgYHJlYXNvbmAuXG4gICAqL1xuICBmdW5jdGlvbiByZWplY3QocmVhc29uKSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBQcm9taXNlKCk7XG4gICAgcmVqZWN0UHJvbWlzZShyZXN1bHQsIHJlYXNvbik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrKHZhbHVlLCByZXNvbHZlciwgY2FsbGJhY2spIHtcbiAgICB2YXIgY2FsbGJhY2tPdXRwdXQgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIGNhbGxiYWNrT3V0cHV0ID0gY2FsbGJhY2soKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KGUpO1xuICAgIH1cbiAgICBpZiAoaXNQcm9taXNlTGlrZShjYWxsYmFja091dHB1dCkpIHtcbiAgICAgIHJldHVybiBjYWxsYmFja091dHB1dC50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIodmFsdWUpO1xuICAgICAgfSwgcmVqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc29sdmVyKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkcSN3aGVuXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXcmFwcyBhbiBvYmplY3QgdGhhdCBtaWdodCBiZSBhIHZhbHVlIG9yIGEgKDNyZCBwYXJ0eSkgdGhlbi1hYmxlIHByb21pc2UgaW50byBhICRxIHByb21pc2UuXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggYW4gb2JqZWN0IHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlIGEgcHJvbWlzZSwgb3IgaWZcbiAgICogdGhlIHByb21pc2UgY29tZXMgZnJvbSBhIHNvdXJjZSB0aGF0IGNhbid0IGJlIHRydXN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb3IgYSBwcm9taXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb249fSBzdWNjZXNzQ2FsbGJhY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbj19IGVycm9yQ2FsbGJhY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbj19IHByb2dyZXNzQ2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgYSBwcm9taXNlIG9mIHRoZSBwYXNzZWQgdmFsdWUgb3IgcHJvbWlzZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHdoZW4odmFsdWUsIGNhbGxiYWNrLCBlcnJiYWNrLCBwcm9ncmVzc0JhY2spIHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IFByb21pc2UoKTtcbiAgICByZXNvbHZlUHJvbWlzZShyZXN1bHQsIHZhbHVlKTtcbiAgICByZXR1cm4gcmVzdWx0LnRoZW4oY2FsbGJhY2ssIGVycmJhY2ssIHByb2dyZXNzQmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkcSNyZXNvbHZlXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbGlhcyBvZiB7QGxpbmsgbmcuJHEjd2hlbiB3aGVufSB0byBtYWludGFpbiBuYW1pbmcgY29uc2lzdGVuY3kgd2l0aCBFUzYuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb3IgYSBwcm9taXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb249fSBzdWNjZXNzQ2FsbGJhY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbj19IGVycm9yQ2FsbGJhY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbj19IHByb2dyZXNzQ2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgYSBwcm9taXNlIG9mIHRoZSBwYXNzZWQgdmFsdWUgb3IgcHJvbWlzZVxuICAgKi9cbiAgdmFyIHJlc29sdmUgPSB3aGVuO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRxI2FsbFxuICAgKiBAa2luZCBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ29tYmluZXMgbXVsdGlwbGUgcHJvbWlzZXMgaW50byBhIHNpbmdsZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBhbGwgb2YgdGhlIGlucHV0XG4gICAqIHByb21pc2VzIGFyZSByZXNvbHZlZC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheS48UHJvbWlzZT58T2JqZWN0LjxQcm9taXNlPn0gcHJvbWlzZXMgQW4gYXJyYXkgb3IgaGFzaCBvZiBwcm9taXNlcy5cbiAgICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgYSBzaW5nbGUgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhbiBhcnJheS9oYXNoIG9mIHZhbHVlcyxcbiAgICogICBlYWNoIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb21pc2UgYXQgdGhlIHNhbWUgaW5kZXgva2V5IGluIHRoZSBgcHJvbWlzZXNgIGFycmF5L2hhc2guXG4gICAqICAgSWYgYW55IG9mIHRoZSBwcm9taXNlcyBpcyByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLCB0aGlzIHJlc3VsdGluZyBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWRcbiAgICogICB3aXRoIHRoZSBzYW1lIHJlamVjdGlvbiB2YWx1ZS5cbiAgICovXG5cbiAgZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBQcm9taXNlKCksXG4gICAgICAgIGNvdW50ZXIgPSAwLFxuICAgICAgICByZXN1bHRzID0gaXNBcnJheShwcm9taXNlcykgPyBbXSA6IHt9O1xuXG4gICAgZm9yRWFjaChwcm9taXNlcywgZnVuY3Rpb24ocHJvbWlzZSwga2V5KSB7XG4gICAgICBjb3VudGVyKys7XG4gICAgICB3aGVuKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0c1trZXldID0gdmFsdWU7XG4gICAgICAgIGlmICghKC0tY291bnRlcikpIHJlc29sdmVQcm9taXNlKHJlc3VsdCwgcmVzdWx0cyk7XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgcmVqZWN0UHJvbWlzZShyZXN1bHQsIHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChjb3VudGVyID09PSAwKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZShyZXN1bHQsIHJlc3VsdHMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkcSNyYWNlXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9yIHJlamVjdHMgYXMgc29vbiBhcyBvbmUgb2YgdGhvc2UgcHJvbWlzZXNcbiAgICogcmVzb2x2ZXMgb3IgcmVqZWN0cywgd2l0aCB0aGUgdmFsdWUgb3IgcmVhc29uIGZyb20gdGhhdCBwcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5LjxQcm9taXNlPnxPYmplY3QuPFByb21pc2U+fSBwcm9taXNlcyBBbiBhcnJheSBvciBoYXNoIG9mIHByb21pc2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb3IgcmVqZWN0cyBhcyBzb29uIGFzIG9uZSBvZiB0aGUgYHByb21pc2VzYFxuICAgKiByZXNvbHZlcyBvciByZWplY3RzLCB3aXRoIHRoZSB2YWx1ZSBvciByZWFzb24gZnJvbSB0aGF0IHByb21pc2UuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHJhY2UocHJvbWlzZXMpIHtcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuXG4gICAgZm9yRWFjaChwcm9taXNlcywgZnVuY3Rpb24ocHJvbWlzZSkge1xuICAgICAgd2hlbihwcm9taXNlKS50aGVuKGRlZmVycmVkLnJlc29sdmUsIGRlZmVycmVkLnJlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRRKHJlc29sdmVyKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKHJlc29sdmVyKSkge1xuICAgICAgdGhyb3cgJHFNaW5FcnIoJ25vcnNsdnInLCAnRXhwZWN0ZWQgcmVzb2x2ZXJGbiwgZ290IFxcJ3swfVxcJycsIHJlc29sdmVyKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKCk7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlRm4odmFsdWUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RGbihyZWFzb24pIHtcbiAgICAgIHJlamVjdFByb21pc2UocHJvbWlzZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXNvbHZlcihyZXNvbHZlRm4sIHJlamVjdEZuKTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgLy8gTGV0J3MgbWFrZSB0aGUgaW5zdGFuY2VvZiBvcGVyYXRvciB3b3JrIGZvciBwcm9taXNlcywgc28gdGhhdFxuICAvLyBgbmV3ICRxKGZuKSBpbnN0YW5jZW9mICRxYCB3b3VsZCBldmFsdWF0ZSB0byB0cnVlLlxuICAkUS5wcm90b3R5cGUgPSBQcm9taXNlLnByb3RvdHlwZTtcblxuICAkUS5kZWZlciA9IGRlZmVyO1xuICAkUS5yZWplY3QgPSByZWplY3Q7XG4gICRRLndoZW4gPSB3aGVuO1xuICAkUS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgJFEuYWxsID0gYWxsO1xuICAkUS5yYWNlID0gcmFjZTtcblxuICByZXR1cm4gJFE7XG59XG5cbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJCRSQUZQcm92aWRlcigpIHsgLy9yQUZcbiAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgJyR0aW1lb3V0JywgZnVuY3Rpb24oJHdpbmRvdywgJHRpbWVvdXQpIHtcbiAgICB2YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gJHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbiAgICB2YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSAkd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aW5kb3cud2Via2l0Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG4gICAgdmFyIHJhZlN1cHBvcnRlZCA9ICEhcmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuICAgIHZhciByYWYgPSByYWZTdXBwb3J0ZWRcbiAgICAgID8gZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICB2YXIgaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICA6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgdmFyIHRpbWVyID0gJHRpbWVvdXQoZm4sIDE2LjY2LCBmYWxzZSk7IC8vIDEwMDAgLyA2MCA9IDE2LjY2NlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbCh0aW1lcik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgIHJhZi5zdXBwb3J0ZWQgPSByYWZTdXBwb3J0ZWQ7XG5cbiAgICByZXR1cm4gcmFmO1xuICB9XTtcbn1cblxuLyoqXG4gKiBERVNJR04gTk9URVNcbiAqXG4gKiBUaGUgZGVzaWduIGRlY2lzaW9ucyBiZWhpbmQgdGhlIHNjb3BlIGFyZSBoZWF2aWx5IGZhdm9yZWQgZm9yIHNwZWVkIGFuZCBtZW1vcnkgY29uc3VtcHRpb24uXG4gKlxuICogVGhlIHR5cGljYWwgdXNlIG9mIHNjb3BlIGlzIHRvIHdhdGNoIHRoZSBleHByZXNzaW9ucywgd2hpY2ggbW9zdCBvZiB0aGUgdGltZSByZXR1cm4gdGhlIHNhbWVcbiAqIHZhbHVlIGFzIGxhc3QgdGltZSBzbyB3ZSBvcHRpbWl6ZSB0aGUgb3BlcmF0aW9uLlxuICpcbiAqIENsb3N1cmVzIGNvbnN0cnVjdGlvbiBpcyBleHBlbnNpdmUgaW4gdGVybXMgb2Ygc3BlZWQgYXMgd2VsbCBhcyBtZW1vcnk6XG4gKiAgIC0gTm8gY2xvc3VyZXMsIGluc3RlYWQgdXNlIHByb3RvdHlwaWNhbCBpbmhlcml0YW5jZSBmb3IgQVBJXG4gKiAgIC0gSW50ZXJuYWwgc3RhdGUgbmVlZHMgdG8gYmUgc3RvcmVkIG9uIHNjb3BlIGRpcmVjdGx5LCB3aGljaCBtZWFucyB0aGF0IHByaXZhdGUgc3RhdGUgaXNcbiAqICAgICBleHBvc2VkIGFzICQkX19fXyBwcm9wZXJ0aWVzXG4gKlxuICogTG9vcCBvcGVyYXRpb25zIGFyZSBvcHRpbWl6ZWQgYnkgdXNpbmcgd2hpbGUoY291bnQtLSkgeyAuLi4gfVxuICogICAtIFRoaXMgbWVhbnMgdGhhdCBpbiBvcmRlciB0byBrZWVwIHRoZSBzYW1lIG9yZGVyIG9mIGV4ZWN1dGlvbiBhcyBhZGRpdGlvbiB3ZSBoYXZlIHRvIGFkZFxuICogICAgIGl0ZW1zIHRvIHRoZSBhcnJheSBhdCB0aGUgYmVnaW5uaW5nICh1bnNoaWZ0KSBpbnN0ZWFkIG9mIGF0IHRoZSBlbmQgKHB1c2gpXG4gKlxuICogQ2hpbGQgc2NvcGVzIGFyZSBjcmVhdGVkIGFuZCByZW1vdmVkIG9mdGVuXG4gKiAgIC0gVXNpbmcgYW4gYXJyYXkgd291bGQgYmUgc2xvdyBzaW5jZSBpbnNlcnRzIGluIHRoZSBtaWRkbGUgYXJlIGV4cGVuc2l2ZTsgc28gd2UgdXNlIGxpbmtlZCBsaXN0c1xuICpcbiAqIFRoZXJlIGFyZSBmZXdlciB3YXRjaGVzIHRoYW4gb2JzZXJ2ZXJzLiBUaGlzIGlzIHdoeSB5b3UgZG9uJ3Qgd2FudCB0aGUgb2JzZXJ2ZXIgdG8gYmUgaW1wbGVtZW50ZWRcbiAqIGluIHRoZSBzYW1lIHdheSBhcyB3YXRjaC4gV2F0Y2ggcmVxdWlyZXMgcmV0dXJuIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGljaCBpcyBleHBlbnNpdmVcbiAqIHRvIGNvbnN0cnVjdC5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkcm9vdFNjb3BlUHJvdmlkZXJcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFByb3ZpZGVyIGZvciB0aGUgJHJvb3RTY29wZSBzZXJ2aWNlLlxuICovXG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgJHJvb3RTY29wZVByb3ZpZGVyI2RpZ2VzdFR0bFxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogU2V0cyB0aGUgbnVtYmVyIG9mIGAkZGlnZXN0YCBpdGVyYXRpb25zIHRoZSBzY29wZSBzaG91bGQgYXR0ZW1wdCB0byBleGVjdXRlIGJlZm9yZSBnaXZpbmcgdXAgYW5kXG4gKiBhc3N1bWluZyB0aGF0IHRoZSBtb2RlbCBpcyB1bnN0YWJsZS5cbiAqXG4gKiBUaGUgY3VycmVudCBkZWZhdWx0IGlzIDEwIGl0ZXJhdGlvbnMuXG4gKlxuICogSW4gY29tcGxleCBhcHBsaWNhdGlvbnMgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBgJHdhdGNoYHMgd2lsbCByZXN1bHQgaW5cbiAqIHNldmVyYWwgZGlnZXN0IGl0ZXJhdGlvbnMuIEhvd2V2ZXIgaWYgYW4gYXBwbGljYXRpb24gbmVlZHMgbW9yZSB0aGFuIHRoZSBkZWZhdWx0IDEwIGRpZ2VzdFxuICogaXRlcmF0aW9ucyBmb3IgaXRzIG1vZGVsIHRvIHN0YWJpbGl6ZSB0aGVuIHlvdSBzaG91bGQgaW52ZXN0aWdhdGUgd2hhdCBpcyBjYXVzaW5nIHRoZSBtb2RlbCB0b1xuICogY29udGludW91c2x5IGNoYW5nZSBkdXJpbmcgdGhlIGRpZ2VzdC5cbiAqXG4gKiBJbmNyZWFzaW5nIHRoZSBUVEwgY291bGQgaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMsIHNvIHlvdSBzaG91bGQgbm90IGNoYW5nZSBpdCB3aXRob3V0XG4gKiBwcm9wZXIganVzdGlmaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIG51bWJlciBvZiBkaWdlc3QgaXRlcmF0aW9ucy5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRyb290U2NvcGVcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogRXZlcnkgYXBwbGljYXRpb24gaGFzIGEgc2luZ2xlIHJvb3Qge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9LlxuICogQWxsIG90aGVyIHNjb3BlcyBhcmUgZGVzY2VuZGFudCBzY29wZXMgb2YgdGhlIHJvb3Qgc2NvcGUuIFNjb3BlcyBwcm92aWRlIHNlcGFyYXRpb25cbiAqIGJldHdlZW4gdGhlIG1vZGVsIGFuZCB0aGUgdmlldywgdmlhIGEgbWVjaGFuaXNtIGZvciB3YXRjaGluZyB0aGUgbW9kZWwgZm9yIGNoYW5nZXMuXG4gKiBUaGV5IGFsc28gcHJvdmlkZSBldmVudCBlbWlzc2lvbi9icm9hZGNhc3QgYW5kIHN1YnNjcmlwdGlvbiBmYWNpbGl0eS4gU2VlIHRoZVxuICoge0BsaW5rIGd1aWRlL3Njb3BlIGRldmVsb3BlciBndWlkZSBvbiBzY29wZXN9LlxuICovXG5mdW5jdGlvbiAkUm9vdFNjb3BlUHJvdmlkZXIoKSB7XG4gIHZhciBUVEwgPSAxMDtcbiAgdmFyICRyb290U2NvcGVNaW5FcnIgPSBtaW5FcnIoJyRyb290U2NvcGUnKTtcbiAgdmFyIGxhc3REaXJ0eVdhdGNoID0gbnVsbDtcbiAgdmFyIGFwcGx5QXN5bmNJZCA9IG51bGw7XG5cbiAgdGhpcy5kaWdlc3RUdGwgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBUVEwgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFRUTDtcbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZFNjb3BlQ2xhc3MocGFyZW50KSB7XG4gICAgZnVuY3Rpb24gQ2hpbGRTY29wZSgpIHtcbiAgICAgIHRoaXMuJCR3YXRjaGVycyA9IHRoaXMuJCRuZXh0U2libGluZyA9XG4gICAgICAgICAgdGhpcy4kJGNoaWxkSGVhZCA9IHRoaXMuJCRjaGlsZFRhaWwgPSBudWxsO1xuICAgICAgdGhpcy4kJGxpc3RlbmVycyA9IHt9O1xuICAgICAgdGhpcy4kJGxpc3RlbmVyQ291bnQgPSB7fTtcbiAgICAgIHRoaXMuJCR3YXRjaGVyc0NvdW50ID0gMDtcbiAgICAgIHRoaXMuJGlkID0gbmV4dFVpZCgpO1xuICAgICAgdGhpcy4kJENoaWxkU2NvcGUgPSBudWxsO1xuICAgIH1cbiAgICBDaGlsZFNjb3BlLnByb3RvdHlwZSA9IHBhcmVudDtcbiAgICByZXR1cm4gQ2hpbGRTY29wZTtcbiAgfVxuXG4gIHRoaXMuJGdldCA9IFsnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHBhcnNlJywgJyRicm93c2VyJyxcbiAgICAgIGZ1bmN0aW9uKCRleGNlcHRpb25IYW5kbGVyLCAkcGFyc2UsICRicm93c2VyKSB7XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95Q2hpbGRTY29wZSgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LmN1cnJlbnRTY29wZS4kJGRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW5VcFNjb3BlKCRzY29wZSkge1xuXG4gICAgICAvLyBTdXBwb3J0OiBJRSA5IG9ubHlcbiAgICAgIGlmIChtc2llID09PSA5KSB7XG4gICAgICAgIC8vIFRoZXJlIGlzIGEgbWVtb3J5IGxlYWsgaW4gSUU5IGlmIGFsbCBjaGlsZCBzY29wZXMgYXJlIG5vdCBkaXNjb25uZWN0ZWRcbiAgICAgICAgLy8gY29tcGxldGVseSB3aGVuIGEgc2NvcGUgaXMgZGVzdHJveWVkLiBTbyB0aGlzIGNvZGUgd2lsbCByZWN1cnNlIHVwIHRocm91Z2hcbiAgICAgICAgLy8gYWxsIHRoaXMgc2NvcGVzIGNoaWxkcmVuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZSBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy8xMDcwNlxuICAgICAgICBpZiAoJHNjb3BlLiQkY2hpbGRIZWFkKSB7XG4gICAgICAgICAgY2xlYW5VcFNjb3BlKCRzY29wZS4kJGNoaWxkSGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRzY29wZS4kJG5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgY2xlYW5VcFNjb3BlKCRzY29wZS4kJG5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29kZSBiZWxvdyB3b3JrcyBhcm91bmQgSUU5IGFuZCBWOCdzIG1lbW9yeSBsZWFrc1xuICAgICAgLy9cbiAgICAgIC8vIFNlZTpcbiAgICAgIC8vIC0gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzMjYzI2XG4gICAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzY3OTQjaXNzdWVjb21tZW50LTM4NjQ4OTA5XG4gICAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzEzMTMjaXNzdWVjb21tZW50LTEwMzc4NDUxXG5cbiAgICAgICRzY29wZS4kcGFyZW50ID0gJHNjb3BlLiQkbmV4dFNpYmxpbmcgPSAkc2NvcGUuJCRwcmV2U2libGluZyA9ICRzY29wZS4kJGNoaWxkSGVhZCA9XG4gICAgICAgICAgJHNjb3BlLiQkY2hpbGRUYWlsID0gJHNjb3BlLiRyb290ID0gJHNjb3BlLiQkd2F0Y2hlcnMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyB0eXBlXG4gICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZVxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQSByb290IHNjb3BlIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlICRyb290U2NvcGV9IGtleSBmcm9tIHRoZVxuICAgICAqIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBDaGlsZCBzY29wZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlXG4gICAgICoge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG5ldyAkbmV3KCl9IG1ldGhvZC4gKE1vc3Qgc2NvcGVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2hlblxuICAgICAqIGNvbXBpbGVkIEhUTUwgdGVtcGxhdGUgaXMgZXhlY3V0ZWQuKSBTZWUgYWxzbyB0aGUge0BsaW5rIGd1aWRlL3Njb3BlIFNjb3BlcyBndWlkZX0gZm9yXG4gICAgICogYW4gaW4tZGVwdGggaW50cm9kdWN0aW9uIGFuZCB1c2FnZSBleGFtcGxlcy5cbiAgICAgKlxuICAgICAqXG4gICAgICogIyBJbmhlcml0YW5jZVxuICAgICAqIEEgc2NvcGUgY2FuIGluaGVyaXQgZnJvbSBhIHBhcmVudCBzY29wZSwgYXMgaW4gdGhpcyBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICAgICB2YXIgcGFyZW50ID0gJHJvb3RTY29wZTtcbiAgICAgICAgIHZhciBjaGlsZCA9IHBhcmVudC4kbmV3KCk7XG5cbiAgICAgICAgIHBhcmVudC5zYWx1dGF0aW9uID0gXCJIZWxsb1wiO1xuICAgICAgICAgZXhwZWN0KGNoaWxkLnNhbHV0YXRpb24pLnRvRXF1YWwoJ0hlbGxvJyk7XG5cbiAgICAgICAgIGNoaWxkLnNhbHV0YXRpb24gPSBcIldlbGNvbWVcIjtcbiAgICAgICAgIGV4cGVjdChjaGlsZC5zYWx1dGF0aW9uKS50b0VxdWFsKCdXZWxjb21lJyk7XG4gICAgICAgICBleHBlY3QocGFyZW50LnNhbHV0YXRpb24pLnRvRXF1YWwoJ0hlbGxvJyk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaGVuIGludGVyYWN0aW5nIHdpdGggYFNjb3BlYCBpbiB0ZXN0cywgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIG9uIHRoZVxuICAgICAqIGluc3RhbmNlcyBvZiBgU2NvcGVgIHR5cGUuIFNlZSB7QGxpbmsgbmdNb2NrLiRyb290U2NvcGUuU2NvcGUgbmdNb2NrIFNjb3BlfSBmb3IgYWRkaXRpb25hbFxuICAgICAqIGRldGFpbHMuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uKCk+PX0gcHJvdmlkZXJzIE1hcCBvZiBzZXJ2aWNlIGZhY3Rvcnkgd2hpY2ggbmVlZCB0byBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgZm9yIHRoZSBjdXJyZW50IHNjb3BlLiBEZWZhdWx0cyB0byB7QGxpbmsgbmd9LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0LjxzdHJpbmcsICo+PX0gaW5zdGFuY2VDYWNoZSBQcm92aWRlcyBwcmUtaW5zdGFudGlhdGVkIHNlcnZpY2VzIHdoaWNoIHNob3VsZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kL292ZXJyaWRlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IGBwcm92aWRlcnNgLiBUaGlzIGlzIGhhbmR5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHVuaXQtdGVzdGluZyBhbmQgaGF2aW5nIHRoZSBuZWVkIHRvIG92ZXJyaWRlIGEgZGVmYXVsdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBOZXdseSBjcmVhdGVkIHNjb3BlLlxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2NvcGUoKSB7XG4gICAgICB0aGlzLiRpZCA9IG5leHRVaWQoKTtcbiAgICAgIHRoaXMuJCRwaGFzZSA9IHRoaXMuJHBhcmVudCA9IHRoaXMuJCR3YXRjaGVycyA9XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLiQkbmV4dFNpYmxpbmcgPSB0aGlzLiQkcHJldlNpYmxpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgdGhpcy4kJGNoaWxkSGVhZCA9IHRoaXMuJCRjaGlsZFRhaWwgPSBudWxsO1xuICAgICAgdGhpcy4kcm9vdCA9IHRoaXM7XG4gICAgICB0aGlzLiQkZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICB0aGlzLiQkbGlzdGVuZXJzID0ge307XG4gICAgICB0aGlzLiQkbGlzdGVuZXJDb3VudCA9IHt9O1xuICAgICAgdGhpcy4kJHdhdGNoZXJzQ291bnQgPSAwO1xuICAgICAgdGhpcy4kJGlzb2xhdGVCaW5kaW5ncyA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIHByb3BlcnR5XG4gICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkaWRcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFVuaXF1ZSBzY29wZSBJRCAobW9ub3RvbmljYWxseSBpbmNyZWFzaW5nKSB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKi9cblxuICAgICAvKipcbiAgICAgICogQG5nZG9jIHByb3BlcnR5XG4gICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJHBhcmVudFxuICAgICAgKlxuICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICogUmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgc2NvcGUuXG4gICAgICAqL1xuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eVxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkcm9vdFxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogUmVmZXJlbmNlIHRvIHRoZSByb290IHNjb3BlLlxuICAgICAgICovXG5cbiAgICBTY29wZS5wcm90b3R5cGUgPSB7XG4gICAgICBjb25zdHJ1Y3RvcjogU2NvcGUsXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJG5ld1xuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIENyZWF0ZXMgYSBuZXcgY2hpbGQge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9LlxuICAgICAgICpcbiAgICAgICAqIFRoZSBwYXJlbnQgc2NvcGUgd2lsbCBwcm9wYWdhdGUgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCgpfSBldmVudC5cbiAgICAgICAqIFRoZSBzY29wZSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzY29wZSBoaWVyYXJjaHkgdXNpbmcge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRlc3Ryb3kgJGRlc3Ryb3koKX0uXG4gICAgICAgKlxuICAgICAgICoge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRlc3Ryb3kgJGRlc3Ryb3koKX0gbXVzdCBiZSBjYWxsZWQgb24gYSBzY29wZSB3aGVuIGl0IGlzXG4gICAgICAgKiBkZXNpcmVkIGZvciB0aGUgc2NvcGUgYW5kIGl0cyBjaGlsZCBzY29wZXMgdG8gYmUgcGVybWFuZW50bHkgZGV0YWNoZWQgZnJvbSB0aGUgcGFyZW50IGFuZFxuICAgICAgICogdGh1cyBzdG9wIHBhcnRpY2lwYXRpbmcgaW4gbW9kZWwgY2hhbmdlIGRldGVjdGlvbiBhbmQgbGlzdGVuZXIgbm90aWZpY2F0aW9uIGJ5IGludm9raW5nLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNvbGF0ZSBJZiB0cnVlLCB0aGVuIHRoZSBzY29wZSBkb2VzIG5vdCBwcm90b3R5cGljYWxseSBpbmhlcml0IGZyb20gdGhlXG4gICAgICAgKiAgICAgICAgIHBhcmVudCBzY29wZS4gVGhlIHNjb3BlIGlzIGlzb2xhdGVkLCBhcyBpdCBjYW4gbm90IHNlZSBwYXJlbnQgc2NvcGUgcHJvcGVydGllcy5cbiAgICAgICAqICAgICAgICAgV2hlbiBjcmVhdGluZyB3aWRnZXRzLCBpdCBpcyB1c2VmdWwgZm9yIHRoZSB3aWRnZXQgdG8gbm90IGFjY2lkZW50YWxseSByZWFkIHBhcmVudFxuICAgICAgICogICAgICAgICBzdGF0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge1Njb3BlfSBbcGFyZW50PXRoaXNdIFRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBgU2NvcGVgfSB0aGF0IHdpbGwgYmUgdGhlIGAkcGFyZW50YFxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbmV3bHkgY3JlYXRlZCBzY29wZS4gRGVmYXVsdHMgdG8gYHRoaXNgIHNjb3BlIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0cmFuc2NsdWRlIHNjb3BlIHRvIGNvcnJlY3RseSBwbGFjZSBpdFxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc2NvcGUgaGllcmFyY2h5IHdoaWxlIG1haW50YWluaW5nIHRoZSBjb3JyZWN0IHByb3RvdHlwaWNhbFxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgbmV3bHkgY3JlYXRlZCBjaGlsZCBzY29wZS5cbiAgICAgICAqXG4gICAgICAgKi9cbiAgICAgICRuZXc6IGZ1bmN0aW9uKGlzb2xhdGUsIHBhcmVudCkge1xuICAgICAgICB2YXIgY2hpbGQ7XG5cbiAgICAgICAgcGFyZW50ID0gcGFyZW50IHx8IHRoaXM7XG5cbiAgICAgICAgaWYgKGlzb2xhdGUpIHtcbiAgICAgICAgICBjaGlsZCA9IG5ldyBTY29wZSgpO1xuICAgICAgICAgIGNoaWxkLiRyb290ID0gdGhpcy4kcm9vdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIGNoaWxkIHNjb3BlIGNsYXNzIGlmIHNvbWVib2R5IGFza3MgZm9yIG9uZSxcbiAgICAgICAgICAvLyBidXQgY2FjaGUgaXQgdG8gYWxsb3cgdGhlIFZNIHRvIG9wdGltaXplIGxvb2t1cHMuXG4gICAgICAgICAgaWYgKCF0aGlzLiQkQ2hpbGRTY29wZSkge1xuICAgICAgICAgICAgdGhpcy4kJENoaWxkU2NvcGUgPSBjcmVhdGVDaGlsZFNjb3BlQ2xhc3ModGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoaWxkID0gbmV3IHRoaXMuJCRDaGlsZFNjb3BlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGQuJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgY2hpbGQuJCRwcmV2U2libGluZyA9IHBhcmVudC4kJGNoaWxkVGFpbDtcbiAgICAgICAgaWYgKHBhcmVudC4kJGNoaWxkSGVhZCkge1xuICAgICAgICAgIHBhcmVudC4kJGNoaWxkVGFpbC4kJG5leHRTaWJsaW5nID0gY2hpbGQ7XG4gICAgICAgICAgcGFyZW50LiQkY2hpbGRUYWlsID0gY2hpbGQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50LiQkY2hpbGRIZWFkID0gcGFyZW50LiQkY2hpbGRUYWlsID0gY2hpbGQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaGVuIHRoZSBuZXcgc2NvcGUgaXMgbm90IGlzb2xhdGVkIG9yIHdlIGluaGVyaXQgZnJvbSBgdGhpc2AsIGFuZFxuICAgICAgICAvLyB0aGUgcGFyZW50IHNjb3BlIGlzIGRlc3Ryb3llZCwgdGhlIHByb3BlcnR5IGAkJGRlc3Ryb3llZGAgaXMgaW5oZXJpdGVkXG4gICAgICAgIC8vIHByb3RvdHlwaWNhbGx5LiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgc2V0XG4gICAgICAgIC8vIHdoZW4gdGhlIHBhcmVudCBzY29wZSBpcyBkZXN0cm95ZWQuXG4gICAgICAgIC8vIFRoZSBsaXN0ZW5lciBuZWVkcyB0byBiZSBhZGRlZCBhZnRlciB0aGUgcGFyZW50IGlzIHNldFxuICAgICAgICBpZiAoaXNvbGF0ZSB8fCBwYXJlbnQgIT09IHRoaXMpIGNoaWxkLiRvbignJGRlc3Ryb3knLCBkZXN0cm95Q2hpbGRTY29wZSk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyR3YXRjaFxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIFJlZ2lzdGVycyBhIGBsaXN0ZW5lcmAgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQgd2hlbmV2ZXIgdGhlIGB3YXRjaEV4cHJlc3Npb25gIGNoYW5nZXMuXG4gICAgICAgKlxuICAgICAgICogLSBUaGUgYHdhdGNoRXhwcmVzc2lvbmAgaXMgY2FsbGVkIG9uIGV2ZXJ5IGNhbGwgdG8ge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdFxuICAgICAgICogICAkZGlnZXN0KCl9IGFuZCBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgd2F0Y2hlZC4gKGB3YXRjaEV4cHJlc3Npb25gIHNob3VsZCBub3QgY2hhbmdlXG4gICAgICAgKiAgIGl0cyB2YWx1ZSB3aGVuIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgaW5wdXQgYmVjYXVzZSBpdCBtYXkgYmUgZXhlY3V0ZWQgbXVsdGlwbGVcbiAgICAgICAqICAgdGltZXMgYnkge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9LiBUaGF0IGlzLCBgd2F0Y2hFeHByZXNzaW9uYCBzaG91bGQgYmVcbiAgICAgICAqICAgW2lkZW1wb3RlbnRdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSWRlbXBvdGVuY2UpLilcbiAgICAgICAqIC0gVGhlIGBsaXN0ZW5lcmAgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBgd2F0Y2hFeHByZXNzaW9uYCBhbmQgdGhlXG4gICAgICAgKiAgIHByZXZpb3VzIGNhbGwgdG8gYHdhdGNoRXhwcmVzc2lvbmAgYXJlIG5vdCBlcXVhbCAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBpbml0aWFsIHJ1bixcbiAgICAgICAqICAgc2VlIGJlbG93KS4gSW5lcXVhbGl0eSBpcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byByZWZlcmVuY2UgaW5lcXVhbGl0eSxcbiAgICAgICAqICAgW3N0cmljdCBjb21wYXJpc29uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQ29tcGFyaXNvbl9PcGVyYXRvcnMpXG4gICAgICAgKiAgICB2aWEgdGhlIGAhPT1gIEphdmFzY3JpcHQgb3BlcmF0b3IsIHVubGVzcyBgb2JqZWN0RXF1YWxpdHkgPT0gdHJ1ZWBcbiAgICAgICAqICAgKHNlZSBuZXh0IHBvaW50KVxuICAgICAgICogLSBXaGVuIGBvYmplY3RFcXVhbGl0eSA9PSB0cnVlYCwgaW5lcXVhbGl0eSBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbmAgaXMgZGV0ZXJtaW5lZFxuICAgICAgICogICBhY2NvcmRpbmcgdG8gdGhlIHtAbGluayBhbmd1bGFyLmVxdWFsc30gZnVuY3Rpb24uIFRvIHNhdmUgdGhlIHZhbHVlIG9mIHRoZSBvYmplY3QgZm9yXG4gICAgICAgKiAgIGxhdGVyIGNvbXBhcmlzb24sIHRoZSB7QGxpbmsgYW5ndWxhci5jb3B5fSBmdW5jdGlvbiBpcyB1c2VkLiBUaGlzIHRoZXJlZm9yZSBtZWFucyB0aGF0XG4gICAgICAgKiAgIHdhdGNoaW5nIGNvbXBsZXggb2JqZWN0cyB3aWxsIGhhdmUgYWR2ZXJzZSBtZW1vcnkgYW5kIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy5cbiAgICAgICAqIC0gVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgaW4gb2JqZWN0cyB0aGF0IGFyZVxuICAgICAgICogICBvciBjb250YWluIFtGaWxlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvRmlsZSkgb2JqZWN0cyBkdWUgdG8gbGltaXRhdGlvbnMgd2l0aCB7QGxpbmsgYW5ndWxhci5jb3B5IGBhbmd1bGFyLmNvcHlgfS5cbiAgICAgICAqIC0gVGhlIHdhdGNoIGBsaXN0ZW5lcmAgbWF5IGNoYW5nZSB0aGUgbW9kZWwsIHdoaWNoIG1heSB0cmlnZ2VyIG90aGVyIGBsaXN0ZW5lcmBzIHRvIGZpcmUuXG4gICAgICAgKiAgIFRoaXMgaXMgYWNoaWV2ZWQgYnkgcmVydW5uaW5nIHRoZSB3YXRjaGVycyB1bnRpbCBubyBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4gVGhlIHJlcnVuXG4gICAgICAgKiAgIGl0ZXJhdGlvbiBsaW1pdCBpcyAxMCB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgZGVhZGxvY2suXG4gICAgICAgKlxuICAgICAgICpcbiAgICAgICAqIElmIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdH0gaXMgY2FsbGVkLFxuICAgICAgICogeW91IGNhbiByZWdpc3RlciBhIGB3YXRjaEV4cHJlc3Npb25gIGZ1bmN0aW9uIHdpdGggbm8gYGxpc3RlbmVyYC4gKEJlIHByZXBhcmVkIGZvclxuICAgICAgICogbXVsdGlwbGUgY2FsbHMgdG8geW91ciBgd2F0Y2hFeHByZXNzaW9uYCBiZWNhdXNlIGl0IHdpbGwgZXhlY3V0ZSBtdWx0aXBsZSB0aW1lcyBpbiBhXG4gICAgICAgKiBzaW5nbGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBjeWNsZSBpZiBhIGNoYW5nZSBpcyBkZXRlY3RlZC4pXG4gICAgICAgKlxuICAgICAgICogQWZ0ZXIgYSB3YXRjaGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2NvcGUsIHRoZSBgbGlzdGVuZXJgIGZuIGlzIGNhbGxlZCBhc3luY2hyb25vdXNseVxuICAgICAgICogKHZpYSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZXZhbEFzeW5jICRldmFsQXN5bmN9KSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgICogd2F0Y2hlci4gSW4gcmFyZSBjYXNlcywgdGhpcyBpcyB1bmRlc2lyYWJsZSBiZWNhdXNlIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQgd2hlbiB0aGUgcmVzdWx0XG4gICAgICAgKiBvZiBgd2F0Y2hFeHByZXNzaW9uYCBkaWRuJ3QgY2hhbmdlLiBUbyBkZXRlY3QgdGhpcyBzY2VuYXJpbyB3aXRoaW4gdGhlIGBsaXN0ZW5lcmAgZm4sIHlvdVxuICAgICAgICogY2FuIGNvbXBhcmUgdGhlIGBuZXdWYWxgIGFuZCBgb2xkVmFsYC4gSWYgdGhlc2UgdHdvIHZhbHVlcyBhcmUgaWRlbnRpY2FsIChgPT09YCkgdGhlbiB0aGVcbiAgICAgICAqIGxpc3RlbmVyIHdhcyBjYWxsZWQgZHVlIHRvIGluaXRpYWxpemF0aW9uLlxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICogIyBFeGFtcGxlXG4gICAgICAgKiBgYGBqc1xuICAgICAgICAgICAvLyBsZXQncyBhc3N1bWUgdGhhdCBzY29wZSB3YXMgZGVwZW5kZW5jeSBpbmplY3RlZCBhcyB0aGUgJHJvb3RTY29wZVxuICAgICAgICAgICB2YXIgc2NvcGUgPSAkcm9vdFNjb3BlO1xuICAgICAgICAgICBzY29wZS5uYW1lID0gJ21pc2tvJztcbiAgICAgICAgICAgc2NvcGUuY291bnRlciA9IDA7XG5cbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7XG4gICAgICAgICAgIHNjb3BlLiR3YXRjaCgnbmFtZScsIGZ1bmN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgIHNjb3BlLmNvdW50ZXIgPSBzY29wZS5jb3VudGVyICsgMTtcbiAgICAgICAgICAgfSk7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDApO1xuXG4gICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgICAgLy8gdGhlIGxpc3RlbmVyIGlzIGFsd2F5cyBjYWxsZWQgZHVyaW5nIHRoZSBmaXJzdCAkZGlnZXN0IGxvb3AgYWZ0ZXIgaXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7XG5cbiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICAvLyBidXQgbm93IGl0IHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7XG5cbiAgICAgICAgICAgc2NvcGUubmFtZSA9ICdhZGFtJztcbiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgyKTtcblxuXG5cbiAgICAgICAgICAgLy8gVXNpbmcgYSBmdW5jdGlvbiBhcyBhIHdhdGNoRXhwcmVzc2lvblxuICAgICAgICAgICB2YXIgZm9vZDtcbiAgICAgICAgICAgc2NvcGUuZm9vZENvdW50ZXIgPSAwO1xuICAgICAgICAgICBleHBlY3Qoc2NvcGUuZm9vZENvdW50ZXIpLnRvRXF1YWwoMCk7XG4gICAgICAgICAgIHNjb3BlLiR3YXRjaChcbiAgICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIGJlaW5nIHdhdGNoZWQuIEl0IGlzIGNhbGxlZCBmb3IgZWFjaCB0dXJuIG9mIHRoZSAkZGlnZXN0IGxvb3BcbiAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIGZvb2Q7IH0sXG4gICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2hhbmdlIGxpc3RlbmVyLCBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgYWJvdmUgZnVuY3Rpb24gY2hhbmdlc1xuICAgICAgICAgICAgIGZ1bmN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgICAgaWYgKCBuZXdWYWx1ZSAhPT0gb2xkVmFsdWUgKSB7XG4gICAgICAgICAgICAgICAgIC8vIE9ubHkgaW5jcmVtZW50IHRoZSBjb3VudGVyIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgIHNjb3BlLmZvb2RDb3VudGVyID0gc2NvcGUuZm9vZENvdW50ZXIgKyAxO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgKTtcbiAgICAgICAgICAgLy8gTm8gZGlnZXN0IGhhcyBiZWVuIHJ1biBzbyB0aGUgY291bnRlciB3aWxsIGJlIHplcm9cbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmZvb2RDb3VudGVyKS50b0VxdWFsKDApO1xuXG4gICAgICAgICAgIC8vIFJ1biB0aGUgZGlnZXN0IGJ1dCBzaW5jZSBmb29kIGhhcyBub3QgY2hhbmdlZCBjb3VudCB3aWxsIHN0aWxsIGJlIHplcm9cbiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICBleHBlY3Qoc2NvcGUuZm9vZENvdW50ZXIpLnRvRXF1YWwoMCk7XG5cbiAgICAgICAgICAgLy8gVXBkYXRlIGZvb2QgYW5kIHJ1biBkaWdlc3QuICBOb3cgdGhlIGNvdW50ZXIgd2lsbCBpbmNyZW1lbnRcbiAgICAgICAgICAgZm9vZCA9ICdjaGVlc2VidXJnZXInO1xuICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgxKTtcblxuICAgICAgICogYGBgXG4gICAgICAgKlxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0geyhmdW5jdGlvbigpfHN0cmluZyl9IHdhdGNoRXhwcmVzc2lvbiBFeHByZXNzaW9uIHRoYXQgaXMgZXZhbHVhdGVkIG9uIGVhY2hcbiAgICAgICAqICAgIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdH0gY3ljbGUuIEEgY2hhbmdlIGluIHRoZSByZXR1cm4gdmFsdWUgdHJpZ2dlcnNcbiAgICAgICAqICAgIGEgY2FsbCB0byB0aGUgYGxpc3RlbmVyYC5cbiAgICAgICAqXG4gICAgICAgKiAgICAtIGBzdHJpbmdgOiBFdmFsdWF0ZWQgYXMge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn1cbiAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGNhbGxlZCB3aXRoIGN1cnJlbnQgYHNjb3BlYCBhcyBhIHBhcmFtZXRlci5cbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwsIHNjb3BlKX0gbGlzdGVuZXIgQ2FsbGJhY2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB2YWx1ZVxuICAgICAgICogICAgb2YgYHdhdGNoRXhwcmVzc2lvbmAgY2hhbmdlcy5cbiAgICAgICAqXG4gICAgICAgKiAgICAtIGBuZXdWYWxgIGNvbnRhaW5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uYFxuICAgICAgICogICAgLSBgb2xkVmFsYCBjb250YWlucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGB3YXRjaEV4cHJlc3Npb25gXG4gICAgICAgKiAgICAtIGBzY29wZWAgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBbb2JqZWN0RXF1YWxpdHk9ZmFsc2VdIENvbXBhcmUgZm9yIG9iamVjdCBlcXVhbGl0eSB1c2luZyB7QGxpbmsgYW5ndWxhci5lcXVhbHN9IGluc3RlYWQgb2ZcbiAgICAgICAqICAgICBjb21wYXJpbmcgZm9yIHJlZmVyZW5jZSBlcXVhbGl0eS5cbiAgICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSBSZXR1cm5zIGEgZGVyZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICAgKi9cbiAgICAgICR3YXRjaDogZnVuY3Rpb24od2F0Y2hFeHAsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcHJldHR5UHJpbnRFeHByZXNzaW9uKSB7XG4gICAgICAgIHZhciBnZXQgPSAkcGFyc2Uod2F0Y2hFeHApO1xuXG4gICAgICAgIGlmIChnZXQuJCR3YXRjaERlbGVnYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIGdldC4kJHdhdGNoRGVsZWdhdGUodGhpcywgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBnZXQsIHdhdGNoRXhwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzLFxuICAgICAgICAgICAgYXJyYXkgPSBzY29wZS4kJHdhdGNoZXJzLFxuICAgICAgICAgICAgd2F0Y2hlciA9IHtcbiAgICAgICAgICAgICAgZm46IGxpc3RlbmVyLFxuICAgICAgICAgICAgICBsYXN0OiBpbml0V2F0Y2hWYWwsXG4gICAgICAgICAgICAgIGdldDogZ2V0LFxuICAgICAgICAgICAgICBleHA6IHByZXR0eVByaW50RXhwcmVzc2lvbiB8fCB3YXRjaEV4cCxcbiAgICAgICAgICAgICAgZXE6ICEhb2JqZWN0RXF1YWxpdHlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsO1xuXG4gICAgICAgIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpIHtcbiAgICAgICAgICB3YXRjaGVyLmZuID0gbm9vcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYXJyYXkpIHtcbiAgICAgICAgICBhcnJheSA9IHNjb3BlLiQkd2F0Y2hlcnMgPSBbXTtcbiAgICAgICAgICBhcnJheS4kJGRpZ2VzdFdhdGNoSW5kZXggPSAtMTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSB1c2UgdW5zaGlmdCBzaW5jZSB3ZSB1c2UgYSB3aGlsZSBsb29wIGluICRkaWdlc3QgZm9yIHNwZWVkLlxuICAgICAgICAvLyB0aGUgd2hpbGUgbG9vcCByZWFkcyBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICBhcnJheS51bnNoaWZ0KHdhdGNoZXIpO1xuICAgICAgICBhcnJheS4kJGRpZ2VzdFdhdGNoSW5kZXgrKztcbiAgICAgICAgaW5jcmVtZW50V2F0Y2hlcnNDb3VudCh0aGlzLCAxKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVyZWdpc3RlcldhdGNoKCkge1xuICAgICAgICAgIHZhciBpbmRleCA9IGFycmF5UmVtb3ZlKGFycmF5LCB3YXRjaGVyKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgaW5jcmVtZW50V2F0Y2hlcnNDb3VudChzY29wZSwgLTEpO1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgYXJyYXkuJCRkaWdlc3RXYXRjaEluZGV4KSB7XG4gICAgICAgICAgICAgIGFycmF5LiQkZGlnZXN0V2F0Y2hJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsYXN0RGlydHlXYXRjaCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJHdhdGNoR3JvdXBcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBBIHZhcmlhbnQgb2Yge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoICR3YXRjaCgpfSB3aGVyZSBpdCB3YXRjaGVzIGFuIGFycmF5IG9mIGB3YXRjaEV4cHJlc3Npb25zYC5cbiAgICAgICAqIElmIGFueSBvbmUgZXhwcmVzc2lvbiBpbiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VzIHRoZSBgbGlzdGVuZXJgIGlzIGV4ZWN1dGVkLlxuICAgICAgICpcbiAgICAgICAqIC0gVGhlIGl0ZW1zIGluIHRoZSBgd2F0Y2hFeHByZXNzaW9uc2AgYXJyYXkgYXJlIG9ic2VydmVkIHZpYSB0aGUgc3RhbmRhcmQgYCR3YXRjaGAgb3BlcmF0aW9uLiBUaGVpciByZXR1cm5cbiAgICAgICAqICAgdmFsdWVzIGFyZSBleGFtaW5lZCBmb3IgY2hhbmdlcyBvbiBldmVyeSBjYWxsIHRvIGAkZGlnZXN0YC5cbiAgICAgICAqIC0gVGhlIGBsaXN0ZW5lcmAgaXMgY2FsbGVkIHdoZW5ldmVyIGFueSBleHByZXNzaW9uIGluIHRoZSBgd2F0Y2hFeHByZXNzaW9uc2AgYXJyYXkgY2hhbmdlcy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmd8RnVuY3Rpb24oc2NvcGUpPn0gd2F0Y2hFeHByZXNzaW9ucyBBcnJheSBvZiBleHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgaW5kaXZpZHVhbGx5XG4gICAgICAgKiB3YXRjaGVkIHVzaW5nIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCAkd2F0Y2goKX1cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ld1ZhbHVlcywgb2xkVmFsdWVzLCBzY29wZSl9IGxpc3RlbmVyIENhbGxiYWNrIGNhbGxlZCB3aGVuZXZlciB0aGUgcmV0dXJuIHZhbHVlIG9mIGFueVxuICAgICAgICogICAgZXhwcmVzc2lvbiBpbiBgd2F0Y2hFeHByZXNzaW9uc2AgY2hhbmdlc1xuICAgICAgICogICAgVGhlIGBuZXdWYWx1ZXNgIGFycmF5IGNvbnRhaW5zIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgLCB3aXRoIHRoZSBpbmRleGVzIG1hdGNoaW5nXG4gICAgICAgKiAgICB0aG9zZSBvZiBgd2F0Y2hFeHByZXNzaW9uYFxuICAgICAgICogICAgYW5kIHRoZSBgb2xkVmFsdWVzYCBhcnJheSBjb250YWlucyB0aGUgcHJldmlvdXMgdmFsdWVzIG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uc2AsIHdpdGggdGhlIGluZGV4ZXMgbWF0Y2hpbmdcbiAgICAgICAqICAgIHRob3NlIG9mIGB3YXRjaEV4cHJlc3Npb25gXG4gICAgICAgKiAgICBUaGUgYHNjb3BlYCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuXG4gICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlLXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgYWxsIGxpc3RlbmVycy5cbiAgICAgICAqL1xuICAgICAgJHdhdGNoR3JvdXA6IGZ1bmN0aW9uKHdhdGNoRXhwcmVzc2lvbnMsIGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZXMgPSBuZXcgQXJyYXkod2F0Y2hFeHByZXNzaW9ucy5sZW5ndGgpO1xuICAgICAgICB2YXIgbmV3VmFsdWVzID0gbmV3IEFycmF5KHdhdGNoRXhwcmVzc2lvbnMubGVuZ3RoKTtcbiAgICAgICAgdmFyIGRlcmVnaXN0ZXJGbnMgPSBbXTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgY2hhbmdlUmVhY3Rpb25TY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGZpcnN0UnVuID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXdhdGNoRXhwcmVzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gTm8gZXhwcmVzc2lvbnMgbWVhbnMgd2UgY2FsbCB0aGUgbGlzdGVuZXIgQVNBUFxuICAgICAgICAgIHZhciBzaG91bGRDYWxsID0gdHJ1ZTtcbiAgICAgICAgICBzZWxmLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkQ2FsbCkgbGlzdGVuZXIobmV3VmFsdWVzLCBuZXdWYWx1ZXMsIHNlbGYpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBkZXJlZ2lzdGVyV2F0Y2hHcm91cCgpIHtcbiAgICAgICAgICAgIHNob3VsZENhbGwgPSBmYWxzZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdhdGNoRXhwcmVzc2lvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHNpemUgb2Ygb25lXG4gICAgICAgICAgcmV0dXJuIHRoaXMuJHdhdGNoKHdhdGNoRXhwcmVzc2lvbnNbMF0sIGZ1bmN0aW9uIHdhdGNoR3JvdXBBY3Rpb24odmFsdWUsIG9sZFZhbHVlLCBzY29wZSkge1xuICAgICAgICAgICAgbmV3VmFsdWVzWzBdID0gdmFsdWU7XG4gICAgICAgICAgICBvbGRWYWx1ZXNbMF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgKHZhbHVlID09PSBvbGRWYWx1ZSkgPyBuZXdWYWx1ZXMgOiBvbGRWYWx1ZXMsIHNjb3BlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2god2F0Y2hFeHByZXNzaW9ucywgZnVuY3Rpb24oZXhwciwgaSkge1xuICAgICAgICAgIHZhciB1bndhdGNoRm4gPSBzZWxmLiR3YXRjaChleHByLCBmdW5jdGlvbiB3YXRjaEdyb3VwU3ViQWN0aW9uKHZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgbmV3VmFsdWVzW2ldID0gdmFsdWU7XG4gICAgICAgICAgICBvbGRWYWx1ZXNbaV0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgIGlmICghY2hhbmdlUmVhY3Rpb25TY2hlZHVsZWQpIHtcbiAgICAgICAgICAgICAgY2hhbmdlUmVhY3Rpb25TY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBzZWxmLiRldmFsQXN5bmMod2F0Y2hHcm91cEFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGVyZWdpc3RlckZucy5wdXNoKHVud2F0Y2hGbik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIHdhdGNoR3JvdXBBY3Rpb24oKSB7XG4gICAgICAgICAgY2hhbmdlUmVhY3Rpb25TY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGlmIChmaXJzdFJ1bikge1xuICAgICAgICAgICAgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgbmV3VmFsdWVzLCBzZWxmKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWVzLCBvbGRWYWx1ZXMsIHNlbGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBkZXJlZ2lzdGVyV2F0Y2hHcm91cCgpIHtcbiAgICAgICAgICB3aGlsZSAoZGVyZWdpc3RlckZucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlcmVnaXN0ZXJGbnMuc2hpZnQoKSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyR3YXRjaENvbGxlY3Rpb25cbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBTaGFsbG93IHdhdGNoZXMgdGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFuZCBmaXJlcyB3aGVuZXZlciBhbnkgb2YgdGhlIHByb3BlcnRpZXMgY2hhbmdlXG4gICAgICAgKiAoZm9yIGFycmF5cywgdGhpcyBpbXBsaWVzIHdhdGNoaW5nIHRoZSBhcnJheSBpdGVtczsgZm9yIG9iamVjdCBtYXBzLCB0aGlzIGltcGxpZXMgd2F0Y2hpbmdcbiAgICAgICAqIHRoZSBwcm9wZXJ0aWVzKS4gSWYgYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQsIHRoZSBgbGlzdGVuZXJgIGNhbGxiYWNrIGlzIGZpcmVkLlxuICAgICAgICpcbiAgICAgICAqIC0gVGhlIGBvYmpgIGNvbGxlY3Rpb24gaXMgb2JzZXJ2ZWQgdmlhIHN0YW5kYXJkICR3YXRjaCBvcGVyYXRpb24gYW5kIGlzIGV4YW1pbmVkIG9uIGV2ZXJ5XG4gICAgICAgKiAgIGNhbGwgdG8gJGRpZ2VzdCgpIHRvIHNlZSBpZiBhbnkgaXRlbXMgaGF2ZSBiZWVuIGFkZGVkLCByZW1vdmVkLCBvciBtb3ZlZC5cbiAgICAgICAqIC0gVGhlIGBsaXN0ZW5lcmAgaXMgY2FsbGVkIHdoZW5ldmVyIGFueXRoaW5nIHdpdGhpbiB0aGUgYG9iamAgaGFzIGNoYW5nZWQuIEV4YW1wbGVzIGluY2x1ZGVcbiAgICAgICAqICAgYWRkaW5nLCByZW1vdmluZywgYW5kIG1vdmluZyBpdGVtcyBiZWxvbmdpbmcgdG8gYW4gb2JqZWN0IG9yIGFycmF5LlxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKiAjIEV4YW1wbGVcbiAgICAgICAqIGBgYGpzXG4gICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydpZ29yJywgJ21hdGlhcycsICdtaXNrbycsICdqYW1lcyddO1xuICAgICAgICAgICRzY29wZS5kYXRhQ291bnQgPSA0O1xuXG4gICAgICAgICAgJHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ25hbWVzJywgZnVuY3Rpb24obmV3TmFtZXMsIG9sZE5hbWVzKSB7XG4gICAgICAgICAgICAkc2NvcGUuZGF0YUNvdW50ID0gbmV3TmFtZXMubGVuZ3RoO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZXhwZWN0KCRzY29wZS5kYXRhQ291bnQpLnRvRXF1YWwoNCk7XG4gICAgICAgICAgJHNjb3BlLiRkaWdlc3QoKTtcblxuICAgICAgICAgIC8vc3RpbGwgYXQgNCAuLi4gbm8gY2hhbmdlc1xuICAgICAgICAgIGV4cGVjdCgkc2NvcGUuZGF0YUNvdW50KS50b0VxdWFsKDQpO1xuXG4gICAgICAgICAgJHNjb3BlLm5hbWVzLnBvcCgpO1xuICAgICAgICAgICRzY29wZS4kZGlnZXN0KCk7XG5cbiAgICAgICAgICAvL25vdyB0aGVyZSdzIGJlZW4gYSBjaGFuZ2VcbiAgICAgICAgICBleHBlY3QoJHNjb3BlLmRhdGFDb3VudCkudG9FcXVhbCgzKTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbihzY29wZSl9IG9iaiBFdmFsdWF0ZWQgYXMge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0uIFRoZVxuICAgICAgICogICAgZXhwcmVzc2lvbiB2YWx1ZSBzaG91bGQgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9yIGFuIGFycmF5IHdoaWNoIGlzIG9ic2VydmVkIG9uIGVhY2hcbiAgICAgICAqICAgIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdH0gY3ljbGUuIEFueSBzaGFsbG93IGNoYW5nZSB3aXRoaW4gdGhlXG4gICAgICAgKiAgICBjb2xsZWN0aW9uIHdpbGwgdHJpZ2dlciBhIGNhbGwgdG8gdGhlIGBsaXN0ZW5lcmAuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXdDb2xsZWN0aW9uLCBvbGRDb2xsZWN0aW9uLCBzY29wZSl9IGxpc3RlbmVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkXG4gICAgICAgKiAgICB3aGVuIGEgY2hhbmdlIGlzIGRldGVjdGVkLlxuICAgICAgICogICAgLSBUaGUgYG5ld0NvbGxlY3Rpb25gIG9iamVjdCBpcyB0aGUgbmV3bHkgbW9kaWZpZWQgZGF0YSBvYnRhaW5lZCBmcm9tIHRoZSBgb2JqYCBleHByZXNzaW9uXG4gICAgICAgKiAgICAtIFRoZSBgb2xkQ29sbGVjdGlvbmAgb2JqZWN0IGlzIGEgY29weSBvZiB0aGUgZm9ybWVyIGNvbGxlY3Rpb24gZGF0YS5cbiAgICAgICAqICAgICAgRHVlIHRvIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zLCB0aGVgb2xkQ29sbGVjdGlvbmAgdmFsdWUgaXMgY29tcHV0ZWQgb25seSBpZiB0aGVcbiAgICAgICAqICAgICAgYGxpc3RlbmVyYCBmdW5jdGlvbiBkZWNsYXJlcyB0d28gb3IgbW9yZSBhcmd1bWVudHMuXG4gICAgICAgKiAgICAtIFRoZSBgc2NvcGVgIGFyZ3VtZW50IHJlZmVycyB0byB0aGUgY3VycmVudCBzY29wZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlLXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyBsaXN0ZW5lci4gV2hlbiB0aGVcbiAgICAgICAqICAgIGRlLXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpcyBleGVjdXRlZCwgdGhlIGludGVybmFsIHdhdGNoIG9wZXJhdGlvbiBpcyB0ZXJtaW5hdGVkLlxuICAgICAgICovXG4gICAgICAkd2F0Y2hDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmosIGxpc3RlbmVyKSB7XG4gICAgICAgICR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvci4kc3RhdGVmdWwgPSB0cnVlO1xuXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgdmFsdWUsIHVwZGF0ZWQgb24gZWFjaCBkaXJ0eS1jaGVjayBydW5cbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuICAgICAgICAvLyBhIHNoYWxsb3cgY29weSBvZiB0aGUgbmV3VmFsdWUgZnJvbSB0aGUgbGFzdCBkaXJ0eS1jaGVjayBydW4sXG4gICAgICAgIC8vIHVwZGF0ZWQgdG8gbWF0Y2ggbmV3VmFsdWUgZHVyaW5nIGRpcnR5LWNoZWNrIHJ1blxuICAgICAgICB2YXIgb2xkVmFsdWU7XG4gICAgICAgIC8vIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBuZXdWYWx1ZSBmcm9tIHdoZW4gdGhlIGxhc3QgY2hhbmdlIGhhcHBlbmVkXG4gICAgICAgIHZhciB2ZXJ5T2xkVmFsdWU7XG4gICAgICAgIC8vIG9ubHkgdHJhY2sgdmVyeU9sZFZhbHVlIGlmIHRoZSBsaXN0ZW5lciBpcyBhc2tpbmcgZm9yIGl0XG4gICAgICAgIHZhciB0cmFja1ZlcnlPbGRWYWx1ZSA9IChsaXN0ZW5lci5sZW5ndGggPiAxKTtcbiAgICAgICAgdmFyIGNoYW5nZURldGVjdGVkID0gMDtcbiAgICAgICAgdmFyIGNoYW5nZURldGVjdG9yID0gJHBhcnNlKG9iaiwgJHdhdGNoQ29sbGVjdGlvbkludGVyY2VwdG9yKTtcbiAgICAgICAgdmFyIGludGVybmFsQXJyYXkgPSBbXTtcbiAgICAgICAgdmFyIGludGVybmFsT2JqZWN0ID0ge307XG4gICAgICAgIHZhciBpbml0UnVuID0gdHJ1ZTtcbiAgICAgICAgdmFyIG9sZExlbmd0aCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gJHdhdGNoQ29sbGVjdGlvbkludGVyY2VwdG9yKF92YWx1ZSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgIHZhciBuZXdMZW5ndGgsIGtleSwgYm90aE5hTiwgbmV3SXRlbSwgb2xkSXRlbTtcblxuICAgICAgICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgdW5kZWZpbmVkLCB0aGVuIHJldHVybiB1bmRlZmluZWQgYXMgdGhlIHdhdGNoIG1heSBiZSBhIG9uZS10aW1lIHdhdGNoXG4gICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKG5ld1ZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgICAgaWYgKCFpc09iamVjdChuZXdWYWx1ZSkpIHsgLy8gaWYgcHJpbWl0aXZlXG4gICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5TGlrZShuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gaW50ZXJuYWxBcnJheSkge1xuICAgICAgICAgICAgICAvLyB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIHNvbWV0aGluZyB3aGljaCB3YXMgbm90IGFuIGFycmF5IGludG8gYXJyYXkuXG4gICAgICAgICAgICAgIG9sZFZhbHVlID0gaW50ZXJuYWxBcnJheTtcbiAgICAgICAgICAgICAgb2xkTGVuZ3RoID0gb2xkVmFsdWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3TGVuZ3RoID0gbmV3VmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAob2xkTGVuZ3RoICE9PSBuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gaWYgbGVuZ3RocyBkbyBub3QgbWF0Y2ggd2UgbmVlZCB0byB0cmlnZ2VyIGNoYW5nZSBub3RpZmljYXRpb25cbiAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKztcbiAgICAgICAgICAgICAgb2xkVmFsdWUubGVuZ3RoID0gb2xkTGVuZ3RoID0gbmV3TGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29weSB0aGUgaXRlbXMgdG8gb2xkVmFsdWUgYW5kIGxvb2sgZm9yIGNoYW5nZXMuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIG9sZEl0ZW0gPSBvbGRWYWx1ZVtpXTtcbiAgICAgICAgICAgICAgbmV3SXRlbSA9IG5ld1ZhbHVlW2ldO1xuXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAgICAgICAgYm90aE5hTiA9IChvbGRJdGVtICE9PSBvbGRJdGVtKSAmJiAobmV3SXRlbSAhPT0gbmV3SXRlbSk7XG4gICAgICAgICAgICAgIGlmICghYm90aE5hTiAmJiAob2xkSXRlbSAhPT0gbmV3SXRlbSkpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrO1xuICAgICAgICAgICAgICAgIG9sZFZhbHVlW2ldID0gbmV3SXRlbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IGludGVybmFsT2JqZWN0KSB7XG4gICAgICAgICAgICAgIC8vIHdlIGFyZSB0cmFuc2l0aW9uaW5nIGZyb20gc29tZXRoaW5nIHdoaWNoIHdhcyBub3QgYW4gb2JqZWN0IGludG8gb2JqZWN0LlxuICAgICAgICAgICAgICBvbGRWYWx1ZSA9IGludGVybmFsT2JqZWN0ID0ge307XG4gICAgICAgICAgICAgIG9sZExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb3B5IHRoZSBpdGVtcyB0byBvbGRWYWx1ZSBhbmQgbG9vayBmb3IgY2hhbmdlcy5cbiAgICAgICAgICAgIG5ld0xlbmd0aCA9IDA7XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChuZXdWYWx1ZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIG5ld0xlbmd0aCsrO1xuICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXdWYWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgIG9sZEl0ZW0gPSBvbGRWYWx1ZVtrZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGtleSBpbiBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgICAgICAgICAgICAgYm90aE5hTiA9IChvbGRJdGVtICE9PSBvbGRJdGVtKSAmJiAobmV3SXRlbSAhPT0gbmV3SXRlbSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWJvdGhOYU4gJiYgKG9sZEl0ZW0gIT09IG5ld0l0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7XG4gICAgICAgICAgICAgICAgICAgIG9sZFZhbHVlW2tleV0gPSBuZXdJdGVtO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvbGRMZW5ndGgrKztcbiAgICAgICAgICAgICAgICAgIG9sZFZhbHVlW2tleV0gPSBuZXdJdGVtO1xuICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvbGRMZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gd2UgdXNlZCB0byBoYXZlIG1vcmUga2V5cywgbmVlZCB0byBmaW5kIHRoZW0gYW5kIGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKztcbiAgICAgICAgICAgICAgZm9yIChrZXkgaW4gb2xkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobmV3VmFsdWUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgIG9sZExlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIG9sZFZhbHVlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGFuZ2VEZXRlY3RlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uICR3YXRjaENvbGxlY3Rpb25BY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGluaXRSdW4pIHtcbiAgICAgICAgICAgIGluaXRSdW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlLCBuZXdWYWx1ZSwgc2VsZik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlLCB2ZXJ5T2xkVmFsdWUsIHNlbGYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG1ha2UgYSBjb3B5IGZvciB0aGUgbmV4dCB0aW1lIGEgY29sbGVjdGlvbiBpcyBjaGFuZ2VkXG4gICAgICAgICAgaWYgKHRyYWNrVmVyeU9sZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAvL3ByaW1pdGl2ZVxuICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUxpa2UobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZSA9IG5ldyBBcnJheShuZXdWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlW2ldID0gbmV3VmFsdWVbaV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGlmIG9iamVjdFxuICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWUgPSB7fTtcbiAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwobmV3VmFsdWUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZVtrZXldID0gbmV3VmFsdWVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy4kd2F0Y2goY2hhbmdlRGV0ZWN0b3IsICR3YXRjaENvbGxlY3Rpb25BY3Rpb24pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3RcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBQcm9jZXNzZXMgYWxsIG9mIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggd2F0Y2hlcnN9IG9mIHRoZSBjdXJyZW50IHNjb3BlIGFuZFxuICAgICAgICogaXRzIGNoaWxkcmVuLiBCZWNhdXNlIGEge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXJ9J3MgbGlzdGVuZXIgY2FuIGNoYW5nZVxuICAgICAgICogdGhlIG1vZGVsLCB0aGUgYCRkaWdlc3QoKWAga2VlcHMgY2FsbGluZyB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXJzfVxuICAgICAgICogdW50aWwgbm8gbW9yZSBsaXN0ZW5lcnMgYXJlIGZpcmluZy4gVGhpcyBtZWFucyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGdldCBpbnRvIGFuIGluZmluaXRlXG4gICAgICAgKiBsb29wLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYCdNYXhpbXVtIGl0ZXJhdGlvbiBsaW1pdCBleGNlZWRlZC4nYCBpZiB0aGUgbnVtYmVyIG9mXG4gICAgICAgKiBpdGVyYXRpb25zIGV4Y2VlZHMgMTAuXG4gICAgICAgKlxuICAgICAgICogVXN1YWxseSwgeW91IGRvbid0IGNhbGwgYCRkaWdlc3QoKWAgZGlyZWN0bHkgaW5cbiAgICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDb250cm9sbGVyIGNvbnRyb2xsZXJzfSBvciBpblxuICAgICAgICoge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlIGRpcmVjdGl2ZXN9LlxuICAgICAgICogSW5zdGVhZCwgeW91IHNob3VsZCBjYWxsIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRhcHBseSAkYXBwbHkoKX0gKHR5cGljYWxseSBmcm9tIHdpdGhpblxuICAgICAgICogYSB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgZGlyZWN0aXZlfSksIHdoaWNoIHdpbGwgZm9yY2UgYSBgJGRpZ2VzdCgpYC5cbiAgICAgICAqXG4gICAgICAgKiBJZiB5b3Ugd2FudCB0byBiZSBub3RpZmllZCB3aGVuZXZlciBgJGRpZ2VzdCgpYCBpcyBjYWxsZWQsXG4gICAgICAgKiB5b3UgY2FuIHJlZ2lzdGVyIGEgYHdhdGNoRXhwcmVzc2lvbmAgZnVuY3Rpb24gd2l0aFxuICAgICAgICoge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoICR3YXRjaCgpfSB3aXRoIG5vIGBsaXN0ZW5lcmAuXG4gICAgICAgKlxuICAgICAgICogSW4gdW5pdCB0ZXN0cywgeW91IG1heSBuZWVkIHRvIGNhbGwgYCRkaWdlc3QoKWAgdG8gc2ltdWxhdGUgdGhlIHNjb3BlIGxpZmUgY3ljbGUuXG4gICAgICAgKlxuICAgICAgICogIyBFeGFtcGxlXG4gICAgICAgKiBgYGBqc1xuICAgICAgICAgICB2YXIgc2NvcGUgPSAuLi47XG4gICAgICAgICAgIHNjb3BlLm5hbWUgPSAnbWlza28nO1xuICAgICAgICAgICBzY29wZS5jb3VudGVyID0gMDtcblxuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgwKTtcbiAgICAgICAgICAgc2NvcGUuJHdhdGNoKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgc2NvcGUuY291bnRlciA9IHNjb3BlLmNvdW50ZXIgKyAxO1xuICAgICAgICAgICB9KTtcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7XG5cbiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICAvLyB0aGUgbGlzdGVuZXIgaXMgYWx3YXlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0ICRkaWdlc3QgbG9vcCBhZnRlciBpdCB3YXMgcmVnaXN0ZXJlZFxuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgxKTtcblxuICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgIC8vIGJ1dCBub3cgaXQgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyB0aGUgdmFsdWUgY2hhbmdlc1xuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgxKTtcblxuICAgICAgICAgICBzY29wZS5uYW1lID0gJ2FkYW0nO1xuICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDIpO1xuICAgICAgICogYGBgXG4gICAgICAgKlxuICAgICAgICovXG4gICAgICAkZGlnZXN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHdhdGNoLCB2YWx1ZSwgbGFzdCwgZm4sIGdldCxcbiAgICAgICAgICAgIHdhdGNoZXJzLFxuICAgICAgICAgICAgZGlydHksIHR0bCA9IFRUTCxcbiAgICAgICAgICAgIG5leHQsIGN1cnJlbnQsIHRhcmdldCA9IHRoaXMsXG4gICAgICAgICAgICB3YXRjaExvZyA9IFtdLFxuICAgICAgICAgICAgbG9nSWR4LCBhc3luY1Rhc2s7XG5cbiAgICAgICAgYmVnaW5QaGFzZSgnJGRpZ2VzdCcpO1xuICAgICAgICAvLyBDaGVjayBmb3IgY2hhbmdlcyB0byBicm93c2VyIHVybCB0aGF0IGhhcHBlbmVkIGluIHN5bmMgYmVmb3JlIHRoZSBjYWxsIHRvICRkaWdlc3RcbiAgICAgICAgJGJyb3dzZXIuJCRjaGVja1VybENoYW5nZSgpO1xuXG4gICAgICAgIGlmICh0aGlzID09PSAkcm9vdFNjb3BlICYmIGFwcGx5QXN5bmNJZCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHJvb3Qgc2NvcGUsIGFuZCAkYXBwbHlBc3luYyBoYXMgc2NoZWR1bGVkIGEgZGVmZXJyZWQgJGFwcGx5KCksIHRoZW5cbiAgICAgICAgICAvLyBjYW5jZWwgdGhlIHNjaGVkdWxlZCAkYXBwbHkgYW5kIGZsdXNoIHRoZSBxdWV1ZSBvZiBleHByZXNzaW9ucyB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgICAgJGJyb3dzZXIuZGVmZXIuY2FuY2VsKGFwcGx5QXN5bmNJZCk7XG4gICAgICAgICAgZmx1c2hBcHBseUFzeW5jKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0RGlydHlXYXRjaCA9IG51bGw7XG5cbiAgICAgICAgZG8geyAvLyBcIndoaWxlIGRpcnR5XCIgbG9vcFxuICAgICAgICAgIGRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgY3VycmVudCA9IHRhcmdldDtcblxuICAgICAgICAgIC8vIEl0J3Mgc2FmZSBmb3IgYXN5bmNRdWV1ZVBvc2l0aW9uIHRvIGJlIGEgbG9jYWwgdmFyaWFibGUgaGVyZSBiZWNhdXNlIHRoaXMgbG9vcCBjYW4ndFxuICAgICAgICAgIC8vIGJlIHJlZW50ZXJlZCByZWN1cnNpdmVseS4gQ2FsbGluZyAkZGlnZXN0IGZyb20gYSBmdW5jdGlvbiBwYXNzZWQgdG8gJGFwcGx5QXN5bmMgd291bGRcbiAgICAgICAgICAvLyBsZWFkIHRvIGEgJyRkaWdlc3QgYWxyZWFkeSBpbiBwcm9ncmVzcycgZXJyb3IuXG4gICAgICAgICAgZm9yICh2YXIgYXN5bmNRdWV1ZVBvc2l0aW9uID0gMDsgYXN5bmNRdWV1ZVBvc2l0aW9uIDwgYXN5bmNRdWV1ZS5sZW5ndGg7IGFzeW5jUXVldWVQb3NpdGlvbisrKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhc3luY1Rhc2sgPSBhc3luY1F1ZXVlW2FzeW5jUXVldWVQb3NpdGlvbl07XG4gICAgICAgICAgICAgIGFzeW5jVGFzay5zY29wZS4kZXZhbChhc3luY1Rhc2suZXhwcmVzc2lvbiwgYXN5bmNUYXNrLmxvY2Fscyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3luY1F1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICB0cmF2ZXJzZVNjb3Blc0xvb3A6XG4gICAgICAgICAgZG8geyAvLyBcInRyYXZlcnNlIHRoZSBzY29wZXNcIiBsb29wXG4gICAgICAgICAgICBpZiAoKHdhdGNoZXJzID0gY3VycmVudC4kJHdhdGNoZXJzKSkge1xuICAgICAgICAgICAgICAvLyBwcm9jZXNzIG91ciB3YXRjaGVzXG4gICAgICAgICAgICAgIHdhdGNoZXJzLiQkZGlnZXN0V2F0Y2hJbmRleCA9IHdhdGNoZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgd2hpbGUgKHdhdGNoZXJzLiQkZGlnZXN0V2F0Y2hJbmRleC0tKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHdhdGNoID0gd2F0Y2hlcnNbd2F0Y2hlcnMuJCRkaWdlc3RXYXRjaEluZGV4XTtcbiAgICAgICAgICAgICAgICAgIC8vIE1vc3QgY29tbW9uIHdhdGNoZXMgYXJlIG9uIHByaW1pdGl2ZXMsIGluIHdoaWNoIGNhc2Ugd2UgY2FuIHNob3J0XG4gICAgICAgICAgICAgICAgICAvLyBjaXJjdWl0IGl0IHdpdGggPT09IG9wZXJhdG9yLCBvbmx5IHdoZW4gPT09IGZhaWxzIGRvIHdlIHVzZSAuZXF1YWxzXG4gICAgICAgICAgICAgICAgICBpZiAod2F0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0ID0gd2F0Y2guZ2V0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlID0gZ2V0KGN1cnJlbnQpKSAhPT0gKGxhc3QgPSB3YXRjaC5sYXN0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgISh3YXRjaC5lcVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXF1YWxzKHZhbHVlLCBsYXN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGlzTnVtYmVyTmFOKHZhbHVlKSAmJiBpc051bWJlck5hTihsYXN0KSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGxhc3REaXJ0eVdhdGNoID0gd2F0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgd2F0Y2gubGFzdCA9IHdhdGNoLmVxID8gY29weSh2YWx1ZSwgbnVsbCkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmbiA9IHdhdGNoLmZuO1xuICAgICAgICAgICAgICAgICAgICAgIGZuKHZhbHVlLCAoKGxhc3QgPT09IGluaXRXYXRjaFZhbCkgPyB2YWx1ZSA6IGxhc3QpLCBjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodHRsIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nSWR4ID0gNCAtIHR0bDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2F0Y2hMb2dbbG9nSWR4XSkgd2F0Y2hMb2dbbG9nSWR4XSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hMb2dbbG9nSWR4XS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiBpc0Z1bmN0aW9uKHdhdGNoLmV4cCkgPyAnZm46ICcgKyAod2F0Y2guZXhwLm5hbWUgfHwgd2F0Y2guZXhwLnRvU3RyaW5nKCkpIDogd2F0Y2guZXhwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWw6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRWYWw6IGxhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YXRjaCA9PT0gbGFzdERpcnR5V2F0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbW9zdCByZWNlbnRseSBkaXJ0eSB3YXRjaGVyIGlzIG5vdyBjbGVhbiwgc2hvcnQgY2lyY3VpdCBzaW5jZSB0aGUgcmVtYWluaW5nIHdhdGNoZXJzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhbHJlYWR5IGJlZW4gdGVzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgIGRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdHJhdmVyc2VTY29wZXNMb29wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluc2FuaXR5IFdhcm5pbmc6IHNjb3BlIGRlcHRoLWZpcnN0IHRyYXZlcnNhbFxuICAgICAgICAgICAgLy8geWVzLCB0aGlzIGNvZGUgaXMgYSBiaXQgY3JhenksIGJ1dCBpdCB3b3JrcyBhbmQgd2UgaGF2ZSB0ZXN0cyB0byBwcm92ZSBpdCFcbiAgICAgICAgICAgIC8vIHRoaXMgcGllY2Ugc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB0cmF2ZXJzYWwgaW4gJGJyb2FkY2FzdFxuICAgICAgICAgICAgaWYgKCEobmV4dCA9ICgoY3VycmVudC4kJHdhdGNoZXJzQ291bnQgJiYgY3VycmVudC4kJGNoaWxkSGVhZCkgfHxcbiAgICAgICAgICAgICAgICAoY3VycmVudCAhPT0gdGFyZ2V0ICYmIGN1cnJlbnQuJCRuZXh0U2libGluZykpKSkge1xuICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPT0gdGFyZ2V0ICYmICEobmV4dCA9IGN1cnJlbnQuJCRuZXh0U2libGluZykpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC4kcGFyZW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAoKGN1cnJlbnQgPSBuZXh0KSk7XG5cbiAgICAgICAgICAvLyBgYnJlYWsgdHJhdmVyc2VTY29wZXNMb29wO2AgdGFrZXMgdXMgdG8gaGVyZVxuXG4gICAgICAgICAgaWYgKChkaXJ0eSB8fCBhc3luY1F1ZXVlLmxlbmd0aCkgJiYgISh0dGwtLSkpIHtcbiAgICAgICAgICAgIGNsZWFyUGhhc2UoKTtcbiAgICAgICAgICAgIHRocm93ICRyb290U2NvcGVNaW5FcnIoJ2luZmRpZycsXG4gICAgICAgICAgICAgICAgJ3swfSAkZGlnZXN0KCkgaXRlcmF0aW9ucyByZWFjaGVkLiBBYm9ydGluZyFcXG4nICtcbiAgICAgICAgICAgICAgICAnV2F0Y2hlcnMgZmlyZWQgaW4gdGhlIGxhc3QgNSBpdGVyYXRpb25zOiB7MX0nLFxuICAgICAgICAgICAgICAgIFRUTCwgd2F0Y2hMb2cpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IHdoaWxlIChkaXJ0eSB8fCBhc3luY1F1ZXVlLmxlbmd0aCk7XG5cbiAgICAgICAgY2xlYXJQaGFzZSgpO1xuXG4gICAgICAgIC8vIHBvc3REaWdlc3RRdWV1ZVBvc2l0aW9uIGlzbid0IGxvY2FsIGhlcmUgYmVjYXVzZSB0aGlzIGxvb3AgY2FuIGJlIHJlZW50ZXJlZCByZWN1cnNpdmVseS5cbiAgICAgICAgd2hpbGUgKHBvc3REaWdlc3RRdWV1ZVBvc2l0aW9uIDwgcG9zdERpZ2VzdFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwb3N0RGlnZXN0UXVldWVbcG9zdERpZ2VzdFF1ZXVlUG9zaXRpb24rK10oKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9zdERpZ2VzdFF1ZXVlLmxlbmd0aCA9IHBvc3REaWdlc3RRdWV1ZVBvc2l0aW9uID0gMDtcbiAgICAgIH0sXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgZXZlbnRcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGRlc3Ryb3lcbiAgICAgICAqIEBldmVudFR5cGUgYnJvYWRjYXN0IG9uIHNjb3BlIGJlaW5nIGRlc3Ryb3llZFxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogQnJvYWRjYXN0ZWQgd2hlbiBhIHNjb3BlIGFuZCBpdHMgY2hpbGRyZW4gYXJlIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgICAqXG4gICAgICAgKiBOb3RlIHRoYXQsIGluIEFuZ3VsYXJKUywgdGhlcmUgaXMgYWxzbyBhIGAkZGVzdHJveWAgalF1ZXJ5IGV2ZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0b1xuICAgICAgICogY2xlYW4gdXAgRE9NIGJpbmRpbmdzIGJlZm9yZSBhbiBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICAgICAgICovXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveVxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgc2NvcGUgKGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuKSBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuIFJlbW92YWwgaW1wbGllc1xuICAgICAgICogdGhhdCBjYWxscyB0byB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3QoKX0gd2lsbCBubyBsb25nZXJcbiAgICAgICAqIHByb3BhZ2F0ZSB0byB0aGUgY3VycmVudCBzY29wZSBhbmQgaXRzIGNoaWxkcmVuLiBSZW1vdmFsIGFsc28gaW1wbGllcyB0aGF0IHRoZSBjdXJyZW50XG4gICAgICAgKiBzY29wZSBpcyBlbGlnaWJsZSBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBgJGRlc3Ryb3koKWAgaXMgdXN1YWxseSB1c2VkIGJ5IGRpcmVjdGl2ZXMgc3VjaCBhc1xuICAgICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBuZ1JlcGVhdH0gZm9yIG1hbmFnaW5nIHRoZVxuICAgICAgICogdW5yb2xsaW5nIG9mIHRoZSBsb29wLlxuICAgICAgICpcbiAgICAgICAqIEp1c3QgYmVmb3JlIGEgc2NvcGUgaXMgZGVzdHJveWVkLCBhIGAkZGVzdHJveWAgZXZlbnQgaXMgYnJvYWRjYXN0ZWQgb24gdGhpcyBzY29wZS5cbiAgICAgICAqIEFwcGxpY2F0aW9uIGNvZGUgY2FuIHJlZ2lzdGVyIGEgYCRkZXN0cm95YCBldmVudCBoYW5kbGVyIHRoYXQgd2lsbCBnaXZlIGl0IGEgY2hhbmNlIHRvXG4gICAgICAgKiBwZXJmb3JtIGFueSBuZWNlc3NhcnkgY2xlYW51cC5cbiAgICAgICAqXG4gICAgICAgKiBOb3RlIHRoYXQsIGluIEFuZ3VsYXJKUywgdGhlcmUgaXMgYWxzbyBhIGAkZGVzdHJveWAgalF1ZXJ5IGV2ZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0b1xuICAgICAgICogY2xlYW4gdXAgRE9NIGJpbmRpbmdzIGJlZm9yZSBhbiBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICAgICAgICovXG4gICAgICAkZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFdlIGNhbid0IGRlc3Ryb3kgYSBzY29wZSB0aGF0IGhhcyBiZWVuIGFscmVhZHkgZGVzdHJveWVkLlxuICAgICAgICBpZiAodGhpcy4kJGRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50O1xuXG4gICAgICAgIHRoaXMuJGJyb2FkY2FzdCgnJGRlc3Ryb3knKTtcbiAgICAgICAgdGhpcy4kJGRlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMgPT09ICRyb290U2NvcGUpIHtcbiAgICAgICAgICAvL1JlbW92ZSBoYW5kbGVycyBhdHRhY2hlZCB0byB3aW5kb3cgd2hlbiAkcm9vdFNjb3BlIGlzIHJlbW92ZWRcbiAgICAgICAgICAkYnJvd3Nlci4kJGFwcGxpY2F0aW9uRGVzdHJveWVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmNyZW1lbnRXYXRjaGVyc0NvdW50KHRoaXMsIC10aGlzLiQkd2F0Y2hlcnNDb3VudCk7XG4gICAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiB0aGlzLiQkbGlzdGVuZXJDb3VudCkge1xuICAgICAgICAgIGRlY3JlbWVudExpc3RlbmVyQ291bnQodGhpcywgdGhpcy4kJGxpc3RlbmVyQ291bnRbZXZlbnROYW1lXSwgZXZlbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldmVyIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBwYXJlbnQgc2NvcGVzIChhZnRlciB0aGlzIGNsZWFudXAsIHRoZSBjdXJyZW50IHNjb3BlIHNob3VsZFxuICAgICAgICAvLyBub3QgYmUgcmV0YWluZWQgYnkgYW55IG9mIG91ciByZWZlcmVuY2VzIGFuZCBzaG91bGQgYmUgZWxpZ2libGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbilcbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuJCRjaGlsZEhlYWQgPT09IHRoaXMpIHBhcmVudC4kJGNoaWxkSGVhZCA9IHRoaXMuJCRuZXh0U2libGluZztcbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuJCRjaGlsZFRhaWwgPT09IHRoaXMpIHBhcmVudC4kJGNoaWxkVGFpbCA9IHRoaXMuJCRwcmV2U2libGluZztcbiAgICAgICAgaWYgKHRoaXMuJCRwcmV2U2libGluZykgdGhpcy4kJHByZXZTaWJsaW5nLiQkbmV4dFNpYmxpbmcgPSB0aGlzLiQkbmV4dFNpYmxpbmc7XG4gICAgICAgIGlmICh0aGlzLiQkbmV4dFNpYmxpbmcpIHRoaXMuJCRuZXh0U2libGluZy4kJHByZXZTaWJsaW5nID0gdGhpcy4kJHByZXZTaWJsaW5nO1xuXG4gICAgICAgIC8vIERpc2FibGUgbGlzdGVuZXJzLCB3YXRjaGVycyBhbmQgYXBwbHkvZGlnZXN0IG1ldGhvZHNcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9IHRoaXMuJGRpZ2VzdCA9IHRoaXMuJGFwcGx5ID0gdGhpcy4kZXZhbEFzeW5jID0gdGhpcy4kYXBwbHlBc3luYyA9IG5vb3A7XG4gICAgICAgIHRoaXMuJG9uID0gdGhpcy4kd2F0Y2ggPSB0aGlzLiR3YXRjaEdyb3VwID0gZnVuY3Rpb24oKSB7IHJldHVybiBub29wOyB9O1xuICAgICAgICB0aGlzLiQkbGlzdGVuZXJzID0ge307XG5cbiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgbmV4dCBzaWJsaW5nIHRvIHByZXZlbnQgYGNsZWFuVXBTY29wZWAgZGVzdHJveWluZyB0aG9zZSB0b29cbiAgICAgICAgdGhpcy4kJG5leHRTaWJsaW5nID0gbnVsbDtcbiAgICAgICAgY2xlYW5VcFNjb3BlKHRoaXMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRldmFsXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogRXhlY3V0ZXMgdGhlIGBleHByZXNzaW9uYCBvbiB0aGUgY3VycmVudCBzY29wZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBbnkgZXhjZXB0aW9ucyBpblxuICAgICAgICogdGhlIGV4cHJlc3Npb24gYXJlIHByb3BhZ2F0ZWQgKHVuY2F1Z2h0KS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBldmFsdWF0aW5nIEFuZ3VsYXJcbiAgICAgICAqIGV4cHJlc3Npb25zLlxuICAgICAgICpcbiAgICAgICAqICMgRXhhbXBsZVxuICAgICAgICogYGBganNcbiAgICAgICAgICAgdmFyIHNjb3BlID0gbmcuJHJvb3RTY29wZS5TY29wZSgpO1xuICAgICAgICAgICBzY29wZS5hID0gMTtcbiAgICAgICAgICAgc2NvcGUuYiA9IDI7XG5cbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLiRldmFsKCdhK2InKSkudG9FcXVhbCgzKTtcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLiRldmFsKGZ1bmN0aW9uKHNjb3BlKXsgcmV0dXJuIHNjb3BlLmEgKyBzY29wZS5iOyB9KSkudG9FcXVhbCgzKTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cHJlc3Npb24gQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICpcbiAgICAgICAqICAgIC0gYHN0cmluZ2A6IGV4ZWN1dGUgdXNpbmcgdGhlIHJ1bGVzIGFzIGRlZmluZWQgaW4gIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LlxuICAgICAgICogICAgLSBgZnVuY3Rpb24oc2NvcGUpYDogZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBgc2NvcGVgIHBhcmFtZXRlci5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0geyhvYmplY3QpPX0gbG9jYWxzIExvY2FsIHZhcmlhYmxlcyBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW4gc2NvcGUuXG4gICAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLlxuICAgICAgICovXG4gICAgICAkZXZhbDogZnVuY3Rpb24oZXhwciwgbG9jYWxzKSB7XG4gICAgICAgIHJldHVybiAkcGFyc2UoZXhwcikodGhpcywgbG9jYWxzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZXZhbEFzeW5jXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogRXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24gb24gdGhlIGN1cnJlbnQgc2NvcGUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBgJGV2YWxBc3luY2AgbWFrZXMgbm8gZ3VhcmFudGVlcyBhcyB0byB3aGVuIHRoZSBgZXhwcmVzc2lvbmAgd2lsbCBiZSBleGVjdXRlZCwgb25seVxuICAgICAgICogdGhhdDpcbiAgICAgICAqXG4gICAgICAgKiAgIC0gaXQgd2lsbCBleGVjdXRlIGFmdGVyIHRoZSBmdW5jdGlvbiB0aGF0IHNjaGVkdWxlZCB0aGUgZXZhbHVhdGlvbiAocHJlZmVyYWJseSBiZWZvcmUgRE9NXG4gICAgICAgKiAgICAgcmVuZGVyaW5nKS5cbiAgICAgICAqICAgLSBhdCBsZWFzdCBvbmUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0IGN5Y2xlfSB3aWxsIGJlIHBlcmZvcm1lZCBhZnRlclxuICAgICAgICogICAgIGBleHByZXNzaW9uYCBleGVjdXRpb24uXG4gICAgICAgKlxuICAgICAgICogQW55IGV4Y2VwdGlvbnMgZnJvbSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBleHByZXNzaW9uIGFyZSBmb3J3YXJkZWQgdG8gdGhlXG4gICAgICAgKiB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9IHNlcnZpY2UuXG4gICAgICAgKlxuICAgICAgICogX19Ob3RlOl9fIGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG91dHNpZGUgb2YgYSBgJGRpZ2VzdGAgY3ljbGUsIGEgbmV3IGAkZGlnZXN0YCBjeWNsZVxuICAgICAgICogd2lsbCBiZSBzY2hlZHVsZWQuIEhvd2V2ZXIsIGl0IGlzIGVuY291cmFnZWQgdG8gYWx3YXlzIGNhbGwgY29kZSB0aGF0IGNoYW5nZXMgdGhlIG1vZGVsXG4gICAgICAgKiBmcm9tIHdpdGhpbiBhbiBgJGFwcGx5YCBjYWxsLiBUaGF0IGluY2x1ZGVzIGNvZGUgZXZhbHVhdGVkIHZpYSBgJGV2YWxBc3luY2AuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHsoc3RyaW5nfGZ1bmN0aW9uKCkpPX0gZXhwcmVzc2lvbiBBbiBhbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQuXG4gICAgICAgKlxuICAgICAgICogICAgLSBgc3RyaW5nYDogZXhlY3V0ZSB1c2luZyB0aGUgcnVsZXMgYXMgZGVmaW5lZCBpbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS5cbiAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHsob2JqZWN0KT19IGxvY2FscyBMb2NhbCB2YXJpYWJsZXMgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluIHNjb3BlLlxuICAgICAgICovXG4gICAgICAkZXZhbEFzeW5jOiBmdW5jdGlvbihleHByLCBsb2NhbHMpIHtcbiAgICAgICAgLy8gaWYgd2UgYXJlIG91dHNpZGUgb2YgYW4gJGRpZ2VzdCBsb29wIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSBzY2hlZHVsaW5nIGFzeW5jXG4gICAgICAgIC8vIHRhc2sgYWxzbyBzY2hlZHVsZSBhc3luYyBhdXRvLWZsdXNoXG4gICAgICAgIGlmICghJHJvb3RTY29wZS4kJHBoYXNlICYmICFhc3luY1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICRicm93c2VyLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGFzeW5jUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICRyb290U2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXN5bmNRdWV1ZS5wdXNoKHtzY29wZTogdGhpcywgZXhwcmVzc2lvbjogJHBhcnNlKGV4cHIpLCBsb2NhbHM6IGxvY2Fsc30pO1xuICAgICAgfSxcblxuICAgICAgJCRwb3N0RGlnZXN0OiBmdW5jdGlvbihmbikge1xuICAgICAgICBwb3N0RGlnZXN0UXVldWUucHVzaChmbik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGFwcGx5XG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogYCRhcHBseSgpYCBpcyB1c2VkIHRvIGV4ZWN1dGUgYW4gZXhwcmVzc2lvbiBpbiBhbmd1bGFyIGZyb20gb3V0c2lkZSBvZiB0aGUgYW5ndWxhclxuICAgICAgICogZnJhbWV3b3JrLiAoRm9yIGV4YW1wbGUgZnJvbSBicm93c2VyIERPTSBldmVudHMsIHNldFRpbWVvdXQsIFhIUiBvciB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMpLlxuICAgICAgICogQmVjYXVzZSB3ZSBhcmUgY2FsbGluZyBpbnRvIHRoZSBhbmd1bGFyIGZyYW1ld29yayB3ZSBuZWVkIHRvIHBlcmZvcm0gcHJvcGVyIHNjb3BlIGxpZmVcbiAgICAgICAqIGN5Y2xlIG9mIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb24gaGFuZGxpbmd9LFxuICAgICAgICoge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCBleGVjdXRpbmcgd2F0Y2hlc30uXG4gICAgICAgKlxuICAgICAgICogIyMgTGlmZSBjeWNsZVxuICAgICAgICpcbiAgICAgICAqICMgUHNldWRvLUNvZGUgb2YgYCRhcHBseSgpYFxuICAgICAgICogYGBganNcbiAgICAgICAgICAgZnVuY3Rpb24gJGFwcGx5KGV4cHIpIHtcbiAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgcmV0dXJuICRldmFsKGV4cHIpO1xuICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAkcm9vdC4kZGlnZXN0KCk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgKiBgYGBcbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICogU2NvcGUncyBgJGFwcGx5KClgIG1ldGhvZCB0cmFuc2l0aW9ucyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc3RhZ2VzOlxuICAgICAgICpcbiAgICAgICAqIDEuIFRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyBleGVjdXRlZCB1c2luZyB0aGVcbiAgICAgICAqICAgIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRldmFsICRldmFsKCl9IG1ldGhvZC5cbiAgICAgICAqIDIuIEFueSBleGNlcHRpb25zIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZVxuICAgICAgICogICAge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLlxuICAgICAgICogMy4gVGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCB3YXRjaH0gbGlzdGVuZXJzIGFyZSBmaXJlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcbiAgICAgICAqICAgIGV4cHJlc3Npb24gd2FzIGV4ZWN1dGVkIHVzaW5nIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3QoKX0gbWV0aG9kLlxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHAgQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICpcbiAgICAgICAqICAgIC0gYHN0cmluZ2A6IGV4ZWN1dGUgdXNpbmcgdGhlIHJ1bGVzIGFzIGRlZmluZWQgaW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0uXG4gICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuXG4gICAgICAgKlxuICAgICAgICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgJGFwcGx5OiBmdW5jdGlvbihleHByKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYmVnaW5QaGFzZSgnJGFwcGx5Jyk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRldmFsKGV4cHIpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbGVhclBoYXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICRyb290U2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuc2FmZS1maW5hbGx5XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRhcHBseUFzeW5jXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogU2NoZWR1bGUgdGhlIGludm9jYXRpb24gb2YgJGFwcGx5IHRvIG9jY3VyIGF0IGEgbGF0ZXIgdGltZS4gVGhlIGFjdHVhbCB0aW1lIGRpZmZlcmVuY2VcbiAgICAgICAqIHZhcmllcyBhY3Jvc3MgYnJvd3NlcnMsIGJ1dCBpcyB0eXBpY2FsbHkgYXJvdW5kIH4xMCBtaWxsaXNlY29uZHMuXG4gICAgICAgKlxuICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBxdWV1ZSB1cCBtdWx0aXBsZSBleHByZXNzaW9ucyB3aGljaCBuZWVkIHRvIGJlIGV2YWx1YXRlZCBpbiB0aGUgc2FtZVxuICAgICAgICogZGlnZXN0LlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cCBBbiBhbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQuXG4gICAgICAgKlxuICAgICAgICogICAgLSBgc3RyaW5nYDogZXhlY3V0ZSB1c2luZyB0aGUgcnVsZXMgYXMgZGVmaW5lZCBpbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS5cbiAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggY3VycmVudCBgc2NvcGVgIHBhcmFtZXRlci5cbiAgICAgICAqL1xuICAgICAgJGFwcGx5QXN5bmM6IGZ1bmN0aW9uKGV4cHIpIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcztcbiAgICAgICAgaWYgKGV4cHIpIHtcbiAgICAgICAgICBhcHBseUFzeW5jUXVldWUucHVzaCgkYXBwbHlBc3luY0V4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGV4cHIgPSAkcGFyc2UoZXhwcik7XG4gICAgICAgIHNjaGVkdWxlQXBwbHlBc3luYygpO1xuXG4gICAgICAgIGZ1bmN0aW9uICRhcHBseUFzeW5jRXhwcmVzc2lvbigpIHtcbiAgICAgICAgICBzY29wZS4kZXZhbChleHByKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRvblxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIExpc3RlbnMgb24gZXZlbnRzIG9mIGEgZ2l2ZW4gdHlwZS4gU2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRlbWl0ICRlbWl0fSBmb3JcbiAgICAgICAqIGRpc2N1c3Npb24gb2YgZXZlbnQgbGlmZSBjeWNsZS5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24gZm9ybWF0IGlzOiBgZnVuY3Rpb24oZXZlbnQsIGFyZ3MuLi4pYC4gVGhlIGBldmVudGAgb2JqZWN0XG4gICAgICAgKiBwYXNzZWQgaW50byB0aGUgbGlzdGVuZXIgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAgICAgICAqXG4gICAgICAgKiAgIC0gYHRhcmdldFNjb3BlYCAtIGB7U2NvcGV9YDogdGhlIHNjb3BlIG9uIHdoaWNoIHRoZSBldmVudCB3YXMgYCRlbWl0YC1lZCBvclxuICAgICAgICogICAgIGAkYnJvYWRjYXN0YC1lZC5cbiAgICAgICAqICAgLSBgY3VycmVudFNjb3BlYCAtIGB7U2NvcGV9YDogdGhlIHNjb3BlIHRoYXQgaXMgY3VycmVudGx5IGhhbmRsaW5nIHRoZSBldmVudC4gT25jZSB0aGVcbiAgICAgICAqICAgICBldmVudCBwcm9wYWdhdGVzIHRocm91Z2ggdGhlIHNjb3BlIGhpZXJhcmNoeSwgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gbnVsbC5cbiAgICAgICAqICAgLSBgbmFtZWAgLSBge3N0cmluZ31gOiBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqICAgLSBgc3RvcFByb3BhZ2F0aW9uYCAtIGB7ZnVuY3Rpb249fWA6IGNhbGxpbmcgYHN0b3BQcm9wYWdhdGlvbmAgZnVuY3Rpb24gd2lsbCBjYW5jZWxcbiAgICAgICAqICAgICBmdXJ0aGVyIGV2ZW50IHByb3BhZ2F0aW9uIChhdmFpbGFibGUgb25seSBmb3IgZXZlbnRzIHRoYXQgd2VyZSBgJGVtaXRgLWVkKS5cbiAgICAgICAqICAgLSBgcHJldmVudERlZmF1bHRgIC0gYHtmdW5jdGlvbn1gOiBjYWxsaW5nIGBwcmV2ZW50RGVmYXVsdGAgc2V0cyBgZGVmYXVsdFByZXZlbnRlZGAgZmxhZ1xuICAgICAgICogICAgIHRvIHRydWUuXG4gICAgICAgKiAgIC0gYGRlZmF1bHRQcmV2ZW50ZWRgIC0gYHtib29sZWFufWA6IHRydWUgaWYgYHByZXZlbnREZWZhdWx0YCB3YXMgY2FsbGVkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gbGlzdGVuIG9uLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudCwgLi4uYXJncyl9IGxpc3RlbmVyIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgZW1pdHRlZC5cbiAgICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSBSZXR1cm5zIGEgZGVyZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICAgKi9cbiAgICAgICRvbjogZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIG5hbWVkTGlzdGVuZXJzID0gdGhpcy4kJGxpc3RlbmVyc1tuYW1lXTtcbiAgICAgICAgaWYgKCFuYW1lZExpc3RlbmVycykge1xuICAgICAgICAgIHRoaXMuJCRsaXN0ZW5lcnNbbmFtZV0gPSBuYW1lZExpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIG5hbWVkTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcztcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmICghY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV0pIHtcbiAgICAgICAgICAgIGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV0rKztcbiAgICAgICAgfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQpKTtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgaW5kZXhPZkxpc3RlbmVyID0gbmFtZWRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgaWYgKGluZGV4T2ZMaXN0ZW5lciAhPT0gLTEpIHtcbiAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzW2luZGV4T2ZMaXN0ZW5lcl0gPSBudWxsO1xuICAgICAgICAgICAgZGVjcmVtZW50TGlzdGVuZXJDb3VudChzZWxmLCAxLCBuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZW1pdFxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYG5hbWVgIHVwd2FyZHMgdGhyb3VnaCB0aGUgc2NvcGUgaGllcmFyY2h5IG5vdGlmeWluZyB0aGVcbiAgICAgICAqIHJlZ2lzdGVyZWQge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG9ufSBsaXN0ZW5lcnMuXG4gICAgICAgKlxuICAgICAgICogVGhlIGV2ZW50IGxpZmUgY3ljbGUgc3RhcnRzIGF0IHRoZSBzY29wZSBvbiB3aGljaCBgJGVtaXRgIHdhcyBjYWxsZWQuIEFsbFxuICAgICAgICoge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG9uIGxpc3RlbmVyc30gbGlzdGVuaW5nIGZvciBgbmFtZWAgZXZlbnQgb24gdGhpcyBzY29wZSBnZXRcbiAgICAgICAqIG5vdGlmaWVkLiBBZnRlcndhcmRzLCB0aGUgZXZlbnQgdHJhdmVyc2VzIHVwd2FyZHMgdG93YXJkIHRoZSByb290IHNjb3BlIGFuZCBjYWxscyBhbGxcbiAgICAgICAqIHJlZ2lzdGVyZWQgbGlzdGVuZXJzIGFsb25nIHRoZSB3YXkuIFRoZSBldmVudCB3aWxsIHN0b3AgcHJvcGFnYXRpbmcgaWYgb25lIG9mIHRoZSBsaXN0ZW5lcnNcbiAgICAgICAqIGNhbmNlbHMgaXQuXG4gICAgICAgKlxuICAgICAgICogQW55IGV4Y2VwdGlvbiBlbWl0dGVkIGZyb20gdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IHdpbGwgYmUgcGFzc2VkXG4gICAgICAgKiBvbnRvIHRoZSB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9IHNlcnZpY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZSB0byBlbWl0LlxuICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIE9wdGlvbmFsIG9uZSBvciBtb3JlIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCBvbnRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEV2ZW50IG9iamVjdCAoc2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0pLlxuICAgICAgICovXG4gICAgICAkZW1pdDogZnVuY3Rpb24obmFtZSwgYXJncykge1xuICAgICAgICB2YXIgZW1wdHkgPSBbXSxcbiAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzLFxuICAgICAgICAgICAgc2NvcGUgPSB0aGlzLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uID0gZmFsc2UsXG4gICAgICAgICAgICBldmVudCA9IHtcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0U2NvcGU6IHNjb3BlLFxuICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge3N0b3BQcm9wYWdhdGlvbiA9IHRydWU7fSxcbiAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxpc3RlbmVyQXJncyA9IGNvbmNhdChbZXZlbnRdLCBhcmd1bWVudHMsIDEpLFxuICAgICAgICAgICAgaSwgbGVuZ3RoO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBuYW1lZExpc3RlbmVycyA9IHNjb3BlLiQkbGlzdGVuZXJzW25hbWVdIHx8IGVtcHR5O1xuICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IHNjb3BlO1xuICAgICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IG5hbWVkTGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIGxpc3RlbmVycyB3ZXJlIGRlcmVnaXN0ZXJlZCwgZGVmcmFnbWVudCB0aGUgYXJyYXlcbiAgICAgICAgICAgIGlmICghbmFtZWRMaXN0ZW5lcnNbaV0pIHtcbiAgICAgICAgICAgICAgbmFtZWRMaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgIGxlbmd0aC0tO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vYWxsb3cgYWxsIGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBzY29wZSB0byBydW5cbiAgICAgICAgICAgICAgbmFtZWRMaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwgbGlzdGVuZXJBcmdzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vaWYgYW55IGxpc3RlbmVyIG9uIHRoZSBjdXJyZW50IHNjb3BlIHN0b3BzIHByb3BhZ2F0aW9uLCBwcmV2ZW50IGJ1YmJsaW5nXG4gICAgICAgICAgaWYgKHN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy90cmF2ZXJzZSB1cHdhcmRzXG4gICAgICAgICAgc2NvcGUgPSBzY29wZS4kcGFyZW50O1xuICAgICAgICB9IHdoaWxlIChzY29wZSk7XG5cbiAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9LFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkYnJvYWRjYXN0XG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogRGlzcGF0Y2hlcyBhbiBldmVudCBgbmFtZWAgZG93bndhcmRzIHRvIGFsbCBjaGlsZCBzY29wZXMgKGFuZCB0aGVpciBjaGlsZHJlbikgbm90aWZ5aW5nIHRoZVxuICAgICAgICogcmVnaXN0ZXJlZCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259IGxpc3RlbmVycy5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgZXZlbnQgbGlmZSBjeWNsZSBzdGFydHMgYXQgdGhlIHNjb3BlIG9uIHdoaWNoIGAkYnJvYWRjYXN0YCB3YXMgY2FsbGVkLiBBbGxcbiAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IGxpc3RlbmluZyBmb3IgYG5hbWVgIGV2ZW50IG9uIHRoaXMgc2NvcGUgZ2V0XG4gICAgICAgKiBub3RpZmllZC4gQWZ0ZXJ3YXJkcywgdGhlIGV2ZW50IHByb3BhZ2F0ZXMgdG8gYWxsIGRpcmVjdCBhbmQgaW5kaXJlY3Qgc2NvcGVzIG9mIHRoZSBjdXJyZW50XG4gICAgICAgKiBzY29wZSBhbmQgY2FsbHMgYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzIGFsb25nIHRoZSB3YXkuIFRoZSBldmVudCBjYW5ub3QgYmUgY2FuY2VsZWQuXG4gICAgICAgKlxuICAgICAgICogQW55IGV4Y2VwdGlvbiBlbWl0dGVkIGZyb20gdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IHdpbGwgYmUgcGFzc2VkXG4gICAgICAgKiBvbnRvIHRoZSB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9IHNlcnZpY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZSB0byBicm9hZGNhc3QuXG4gICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgb25lIG9yIG1vcmUgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIG9udG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gRXZlbnQgb2JqZWN0LCBzZWUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG9ufVxuICAgICAgICovXG4gICAgICAkYnJvYWRjYXN0OiBmdW5jdGlvbihuYW1lLCBhcmdzKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLFxuICAgICAgICAgICAgY3VycmVudCA9IHRhcmdldCxcbiAgICAgICAgICAgIG5leHQgPSB0YXJnZXQsXG4gICAgICAgICAgICBldmVudCA9IHtcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgdGFyZ2V0U2NvcGU6IHRhcmdldCxcbiAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXRhcmdldC4kJGxpc3RlbmVyQ291bnRbbmFtZV0pIHJldHVybiBldmVudDtcblxuICAgICAgICB2YXIgbGlzdGVuZXJBcmdzID0gY29uY2F0KFtldmVudF0sIGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICBsaXN0ZW5lcnMsIGksIGxlbmd0aDtcblxuICAgICAgICAvL2Rvd24gd2hpbGUgeW91IGNhbiwgdGhlbiB1cCBhbmQgbmV4dCBzaWJsaW5nIG9yIHVwIGFuZCBuZXh0IHNpYmxpbmcgdW50aWwgYmFjayBhdCByb290XG4gICAgICAgIHdoaWxlICgoY3VycmVudCA9IG5leHQpKSB7XG4gICAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gY3VycmVudDtcbiAgICAgICAgICBsaXN0ZW5lcnMgPSBjdXJyZW50LiQkbGlzdGVuZXJzW25hbWVdIHx8IFtdO1xuICAgICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gaWYgbGlzdGVuZXJzIHdlcmUgZGVyZWdpc3RlcmVkLCBkZWZyYWdtZW50IHRoZSBhcnJheVxuICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcnNbaV0pIHtcbiAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICBsZW5ndGgtLTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShudWxsLCBsaXN0ZW5lckFyZ3MpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJbnNhbml0eSBXYXJuaW5nOiBzY29wZSBkZXB0aC1maXJzdCB0cmF2ZXJzYWxcbiAgICAgICAgICAvLyB5ZXMsIHRoaXMgY29kZSBpcyBhIGJpdCBjcmF6eSwgYnV0IGl0IHdvcmtzIGFuZCB3ZSBoYXZlIHRlc3RzIHRvIHByb3ZlIGl0IVxuICAgICAgICAgIC8vIHRoaXMgcGllY2Ugc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB0cmF2ZXJzYWwgaW4gJGRpZ2VzdFxuICAgICAgICAgIC8vICh0aG91Z2ggaXQgZGlmZmVycyBkdWUgdG8gaGF2aW5nIHRoZSBleHRyYSBjaGVjayBmb3IgJCRsaXN0ZW5lckNvdW50KVxuICAgICAgICAgIGlmICghKG5leHQgPSAoKGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdICYmIGN1cnJlbnQuJCRjaGlsZEhlYWQpIHx8XG4gICAgICAgICAgICAgIChjdXJyZW50ICE9PSB0YXJnZXQgJiYgY3VycmVudC4kJG5leHRTaWJsaW5nKSkpKSB7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPT0gdGFyZ2V0ICYmICEobmV4dCA9IGN1cnJlbnQuJCRuZXh0U2libGluZykpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuJHBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5jdXJyZW50U2NvcGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciAkcm9vdFNjb3BlID0gbmV3IFNjb3BlKCk7XG5cbiAgICAvL1RoZSBpbnRlcm5hbCBxdWV1ZXMuIEV4cG9zZSB0aGVtIG9uIHRoZSAkcm9vdFNjb3BlIGZvciBkZWJ1Z2dpbmcvdGVzdGluZyBwdXJwb3Nlcy5cbiAgICB2YXIgYXN5bmNRdWV1ZSA9ICRyb290U2NvcGUuJCRhc3luY1F1ZXVlID0gW107XG4gICAgdmFyIHBvc3REaWdlc3RRdWV1ZSA9ICRyb290U2NvcGUuJCRwb3N0RGlnZXN0UXVldWUgPSBbXTtcbiAgICB2YXIgYXBwbHlBc3luY1F1ZXVlID0gJHJvb3RTY29wZS4kJGFwcGx5QXN5bmNRdWV1ZSA9IFtdO1xuXG4gICAgdmFyIHBvc3REaWdlc3RRdWV1ZVBvc2l0aW9uID0gMDtcblxuICAgIHJldHVybiAkcm9vdFNjb3BlO1xuXG5cbiAgICBmdW5jdGlvbiBiZWdpblBoYXNlKHBoYXNlKSB7XG4gICAgICBpZiAoJHJvb3RTY29wZS4kJHBoYXNlKSB7XG4gICAgICAgIHRocm93ICRyb290U2NvcGVNaW5FcnIoJ2lucHJvZycsICd7MH0gYWxyZWFkeSBpbiBwcm9ncmVzcycsICRyb290U2NvcGUuJCRwaGFzZSk7XG4gICAgICB9XG5cbiAgICAgICRyb290U2NvcGUuJCRwaGFzZSA9IHBoYXNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyUGhhc2UoKSB7XG4gICAgICAkcm9vdFNjb3BlLiQkcGhhc2UgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluY3JlbWVudFdhdGNoZXJzQ291bnQoY3VycmVudCwgY291bnQpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY3VycmVudC4kJHdhdGNoZXJzQ291bnQgKz0gY291bnQ7XG4gICAgICB9IHdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQuJHBhcmVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY3JlbWVudExpc3RlbmVyQ291bnQoY3VycmVudCwgY291bnQsIG5hbWUpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV0gLT0gY291bnQ7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQuJHBhcmVudCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGZ1bmN0aW9uIHVzZWQgYXMgYW4gaW5pdGlhbCB2YWx1ZSBmb3Igd2F0Y2hlcnMuXG4gICAgICogYmVjYXVzZSBpdCdzIHVuaXF1ZSB3ZSBjYW4gZWFzaWx5IHRlbGwgaXQgYXBhcnQgZnJvbSBvdGhlciB2YWx1ZXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0V2F0Y2hWYWwoKSB7fVxuXG4gICAgZnVuY3Rpb24gZmx1c2hBcHBseUFzeW5jKCkge1xuICAgICAgd2hpbGUgKGFwcGx5QXN5bmNRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhcHBseUFzeW5jUXVldWUuc2hpZnQoKSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFwcGx5QXN5bmNJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVBcHBseUFzeW5jKCkge1xuICAgICAgaWYgKGFwcGx5QXN5bmNJZCA9PT0gbnVsbCkge1xuICAgICAgICBhcHBseUFzeW5jSWQgPSAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAkcm9vdFNjb3BlLiRhcHBseShmbHVzaEFwcGx5QXN5bmMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkcm9vdEVsZW1lbnRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSByb290IGVsZW1lbnQgb2YgQW5ndWxhciBhcHBsaWNhdGlvbi4gVGhpcyBpcyBlaXRoZXIgdGhlIGVsZW1lbnQgd2hlcmUge0BsaW5rXG4gKiBuZy5kaXJlY3RpdmU6bmdBcHAgbmdBcHB9IHdhcyBkZWNsYXJlZCBvciB0aGUgZWxlbWVudCBwYXNzZWQgaW50b1xuICoge0BsaW5rIGFuZ3VsYXIuYm9vdHN0cmFwfS4gVGhlIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgcm9vdCBlbGVtZW50IG9mIGFwcGxpY2F0aW9uLiBJdCBpcyBhbHNvIHRoZVxuICogbG9jYXRpb24gd2hlcmUgdGhlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0gc2VydmljZSBnZXRzXG4gKiBwdWJsaXNoZWQsIGFuZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIGAkcm9vdEVsZW1lbnQuaW5qZWN0b3IoKWAuXG4gKi9cblxuXG4vLyB0aGUgaW1wbGVtZW50YXRpb24gaXMgaW4gYW5ndWxhci5ib290c3RyYXBcblxuLyoqXG4gKiBAdGhpc1xuICogQGRlc2NyaXB0aW9uXG4gKiBQcml2YXRlIHNlcnZpY2UgdG8gc2FuaXRpemUgdXJpcyBmb3IgbGlua3MgYW5kIGltYWdlcy4gVXNlZCBieSAkY29tcGlsZSBhbmQgJHNhbml0aXplLlxuICovXG5mdW5jdGlvbiAkJFNhbml0aXplVXJpUHJvdmlkZXIoKSB7XG4gIHZhciBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCA9IC9eXFxzKihodHRwcz98ZnRwfG1haWx0b3x0ZWx8ZmlsZSk6LyxcbiAgICBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSAvXlxccyooKGh0dHBzP3xmdHB8ZmlsZXxibG9iKTp8ZGF0YTppbWFnZVxcLykvO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZVxuICAgKiB1cmxzIGR1cmluZyBhW2hyZWZdIHNhbml0aXphdGlvbi5cbiAgICpcbiAgICogVGhlIHNhbml0aXphdGlvbiBpcyBhIHNlY3VyaXR5IG1lYXN1cmUgYWltZWQgYXQgcHJldmVudCBYU1MgYXR0YWNrcyB2aWEgaHRtbCBsaW5rcy5cbiAgICpcbiAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBhW2hyZWZdIHZpYSBkYXRhLWJpbmRpbmcgaXMgZmlyc3Qgbm9ybWFsaXplZCBhbmQgdHVybmVkIGludG9cbiAgICogYW4gYWJzb2x1dGUgdXJsLiBBZnRlcndhcmRzLCB0aGUgdXJsIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0YFxuICAgKiByZWd1bGFyIGV4cHJlc3Npb24uIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSBvcmlnaW5hbCB1cmwgaXMgd3JpdHRlbiBpbnRvIHRoZSBkb20uIE90aGVyd2lzZSxcbiAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlZ0V4cD19IHJlZ2V4cCBOZXcgcmVnZXhwIHRvIHdoaXRlbGlzdCB1cmxzIHdpdGguXG4gICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3JcbiAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLlxuICAgKi9cbiAgdGhpcy5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkge1xuICAgIGlmIChpc0RlZmluZWQocmVnZXhwKSkge1xuICAgICAgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSByZWdleHA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0O1xuICB9O1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXRyaWV2ZXMgb3Igb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgZm9yIHdoaXRlbGlzdGluZyBvZiBzYWZlXG4gICAqIHVybHMgZHVyaW5nIGltZ1tzcmNdIHNhbml0aXphdGlvbi5cbiAgICpcbiAgICogVGhlIHNhbml0aXphdGlvbiBpcyBhIHNlY3VyaXR5IG1lYXN1cmUgYWltZWQgYXQgcHJldmVudCBYU1MgYXR0YWNrcyB2aWEgaHRtbCBsaW5rcy5cbiAgICpcbiAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBpbWdbc3JjXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvXG4gICAqIGFuIGFic29sdXRlIHVybC4gQWZ0ZXJ3YXJkcywgdGhlIHVybCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3RgXG4gICAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG9yaWdpbmFsIHVybCBpcyB3cml0dGVuIGludG8gdGhlIGRvbS4gT3RoZXJ3aXNlLFxuICAgKiB0aGUgYWJzb2x1dGUgdXJsIGlzIHByZWZpeGVkIHdpdGggYCd1bnNhZmU6J2Agc3RyaW5nIGFuZCBvbmx5IHRoZW4gaXMgaXQgd3JpdHRlbiBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7UmVnRXhwPX0gcmVnZXhwIE5ldyByZWdleHAgdG8gd2hpdGVsaXN0IHVybHMgd2l0aC5cbiAgICogQHJldHVybnMge1JlZ0V4cHxuZy4kY29tcGlsZVByb3ZpZGVyfSBDdXJyZW50IFJlZ0V4cCBpZiBjYWxsZWQgd2l0aG91dCB2YWx1ZSBvciBzZWxmIGZvclxuICAgKiAgICBjaGFpbmluZyBvdGhlcndpc2UuXG4gICAqL1xuICB0aGlzLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkge1xuICAgIGlmIChpc0RlZmluZWQocmVnZXhwKSkge1xuICAgICAgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gcmVnZXhwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3Q7XG4gIH07XG5cbiAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHNhbml0aXplVXJpKHVyaSwgaXNJbWFnZSkge1xuICAgICAgdmFyIHJlZ2V4ID0gaXNJbWFnZSA/IGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA6IGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0O1xuICAgICAgdmFyIG5vcm1hbGl6ZWRWYWw7XG4gICAgICBub3JtYWxpemVkVmFsID0gdXJsUmVzb2x2ZSh1cmkpLmhyZWY7XG4gICAgICBpZiAobm9ybWFsaXplZFZhbCAhPT0gJycgJiYgIW5vcm1hbGl6ZWRWYWwubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgIHJldHVybiAndW5zYWZlOicgKyBub3JtYWxpemVkVmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVyaTtcbiAgICB9O1xuICB9O1xufVxuXG4vKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqXG4gKiAgICAgQW55IGNvbW1pdHMgdG8gdGhpcyBmaWxlIHNob3VsZCBiZSByZXZpZXdlZCB3aXRoIHNlY3VyaXR5IGluIG1pbmQuICAqXG4gKiAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIGNhbiBwb3RlbnRpYWxseSBjcmVhdGUgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLiAqXG4gKiAgICAgICAgICBBbiBhcHByb3ZhbCBmcm9tIDIgQ29yZSBtZW1iZXJzIHdpdGggaGlzdG9yeSBvZiBtb2RpZnlpbmcgICAgICAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gKiAgRG9lcyB0aGUgY2hhbmdlIHNvbWVob3cgYWxsb3cgZm9yIGFyYml0cmFyeSBqYXZhc2NyaXB0IHRvIGJlIGV4ZWN1dGVkPyAqXG4gKiAgICBPciBhbGxvd3MgZm9yIHNvbWVvbmUgdG8gY2hhbmdlIHRoZSBwcm90b3R5cGUgb2YgYnVpbHQtaW4gb2JqZWN0cz8gICAqXG4gKiAgICAgT3IgZ2l2ZXMgdW5kZXNpcmVkIGFjY2VzcyB0byB2YXJpYWJsZXMgbGlrZXMgZG9jdW1lbnQgb3Igd2luZG93PyAgICAqXG4gKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqL1xuXG4vKiBleHBvcnRlZCAkU2NlUHJvdmlkZXIsICRTY2VEZWxlZ2F0ZVByb3ZpZGVyICovXG5cbnZhciAkc2NlTWluRXJyID0gbWluRXJyKCckc2NlJyk7XG5cbnZhciBTQ0VfQ09OVEVYVFMgPSB7XG4gIEhUTUw6ICdodG1sJyxcbiAgQ1NTOiAnY3NzJyxcbiAgVVJMOiAndXJsJyxcbiAgLy8gUkVTT1VSQ0VfVVJMIGlzIGEgc3VidHlwZSBvZiBVUkwgdXNlZCBpbiBjb250ZXh0cyB3aGVyZSBhIHByaXZpbGVnZWQgcmVzb3VyY2UgaXMgc291cmNlZCBmcm9tIGFcbiAgLy8gdXJsLiAgKGUuZy4gbmctaW5jbHVkZSwgc2NyaXB0IHNyYywgdGVtcGxhdGVVcmwpXG4gIFJFU09VUkNFX1VSTDogJ3Jlc291cmNlVXJsJyxcbiAgSlM6ICdqcydcbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9sbG93LlxuXG52YXIgVU5ERVJTQ09SRV9MT1dFUkNBU0VfUkVHRVhQID0gL18oW2Etel0pL2c7XG5cbmZ1bmN0aW9uIHNuYWtlVG9DYW1lbChuYW1lKSB7XG4gIHJldHVybiBuYW1lXG4gICAgLnJlcGxhY2UoVU5ERVJTQ09SRV9MT1dFUkNBU0VfUkVHRVhQLCBmbkNhbWVsQ2FzZVJlcGxhY2UpO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RNYXRjaGVyKG1hdGNoZXIpIHtcbiAgaWYgKG1hdGNoZXIgPT09ICdzZWxmJykge1xuICAgIHJldHVybiBtYXRjaGVyO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKG1hdGNoZXIpKSB7XG4gICAgLy8gU3RyaW5ncyBtYXRjaCBleGFjdGx5IGV4Y2VwdCBmb3IgMiB3aWxkY2FyZHMgLSAnKicgYW5kICcqKicuXG4gICAgLy8gJyonIG1hdGNoZXMgYW55IGNoYXJhY3RlciBleGNlcHQgdGhvc2UgZnJvbSB0aGUgc2V0ICc6Ly4/JicuXG4gICAgLy8gJyoqJyBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgKGxpa2UgLiogaW4gYSBSZWdFeHApLlxuICAgIC8vIE1vcmUgdGhhbiAyIConcyByYWlzZXMgYW4gZXJyb3IgYXMgaXQncyBpbGwgZGVmaW5lZC5cbiAgICBpZiAobWF0Y2hlci5pbmRleE9mKCcqKionKSA+IC0xKSB7XG4gICAgICB0aHJvdyAkc2NlTWluRXJyKCdpd2NhcmQnLFxuICAgICAgICAgICdJbGxlZ2FsIHNlcXVlbmNlICoqKiBpbiBzdHJpbmcgbWF0Y2hlci4gIFN0cmluZzogezB9JywgbWF0Y2hlcik7XG4gICAgfVxuICAgIG1hdGNoZXIgPSBlc2NhcGVGb3JSZWdleHAobWF0Y2hlcikuXG4gICAgICAgICAgICAgICAgICByZXBsYWNlKC9cXFxcXFwqXFxcXFxcKi9nLCAnLionKS5cbiAgICAgICAgICAgICAgICAgIHJlcGxhY2UoL1xcXFxcXCovZywgJ1teOi8uPyY7XSonKTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXicgKyBtYXRjaGVyICsgJyQnKTtcbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChtYXRjaGVyKSkge1xuICAgIC8vIFRoZSBvbmx5IG90aGVyIHR5cGUgb2YgbWF0Y2hlciBhbGxvd2VkIGlzIGEgUmVnZXhwLlxuICAgIC8vIE1hdGNoIGVudGlyZSBVUkwgLyBkaXNhbGxvdyBwYXJ0aWFsIG1hdGNoZXMuXG4gICAgLy8gRmxhZ3MgYXJlIHJlc2V0IChpLmUuIG5vIGdsb2JhbCwgaWdub3JlQ2FzZSBvciBtdWx0aWxpbmUpXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgbWF0Y2hlci5zb3VyY2UgKyAnJCcpO1xuICB9IGVsc2Uge1xuICAgIHRocm93ICRzY2VNaW5FcnIoJ2ltYXRjaGVyJyxcbiAgICAgICAgJ01hdGNoZXJzIG1heSBvbmx5IGJlIFwic2VsZlwiLCBzdHJpbmcgcGF0dGVybnMgb3IgUmVnRXhwIG9iamVjdHMnKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGFkanVzdE1hdGNoZXJzKG1hdGNoZXJzKSB7XG4gIHZhciBhZGp1c3RlZE1hdGNoZXJzID0gW107XG4gIGlmIChpc0RlZmluZWQobWF0Y2hlcnMpKSB7XG4gICAgZm9yRWFjaChtYXRjaGVycywgZnVuY3Rpb24obWF0Y2hlcikge1xuICAgICAgYWRqdXN0ZWRNYXRjaGVycy5wdXNoKGFkanVzdE1hdGNoZXIobWF0Y2hlcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBhZGp1c3RlZE1hdGNoZXJzO1xufVxuXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRzY2VEZWxlZ2F0ZVxuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBgJHNjZURlbGVnYXRlYCBpcyBhIHNlcnZpY2UgdGhhdCBpcyB1c2VkIGJ5IHRoZSBgJHNjZWAgc2VydmljZSB0byBwcm92aWRlIHtAbGluayBuZy4kc2NlIFN0cmljdFxuICogQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0gc2VydmljZXMgdG8gQW5ndWxhckpTLlxuICpcbiAqIFR5cGljYWxseSwgeW91IHdvdWxkIGNvbmZpZ3VyZSBvciBvdmVycmlkZSB0aGUge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSAkc2NlRGVsZWdhdGV9IGluc3RlYWQgb2ZcbiAqIHRoZSBgJHNjZWAgc2VydmljZSB0byBjdXN0b21pemUgdGhlIHdheSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyB3b3JrcyBpbiBBbmd1bGFySlMuICBUaGlzIGlzXG4gKiBiZWNhdXNlLCB3aGlsZSB0aGUgYCRzY2VgIHByb3ZpZGVzIG51bWVyb3VzIHNob3J0aGFuZCBtZXRob2RzLCBldGMuLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0b1xuICogb3ZlcnJpZGUgMyBjb3JlIGZ1bmN0aW9ucyAoYHRydXN0QXNgLCBgZ2V0VHJ1c3RlZGAgYW5kIGB2YWx1ZU9mYCkgdG8gcmVwbGFjZSB0aGUgd2F5IHRoaW5nc1xuICogd29yayBiZWNhdXNlIGAkc2NlYCBkZWxlZ2F0ZXMgdG8gYCRzY2VEZWxlZ2F0ZWAgZm9yIHRoZXNlIG9wZXJhdGlvbnMuXG4gKlxuICogUmVmZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyICRzY2VEZWxlZ2F0ZVByb3ZpZGVyfSB0byBjb25maWd1cmUgdGhpcyBzZXJ2aWNlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIGAkc2NlRGVsZWdhdGVgIHNob3VsZCB3b3JrIG91dCBvZiB0aGUgYm94IHdpdGggbGl0dGxlIHBhaW4uICBXaGlsZSB5b3VcbiAqIGNhbiBvdmVycmlkZSBpdCBjb21wbGV0ZWx5IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgYCRzY2VgLCB0aGUgY29tbW9uIGNhc2Ugd291bGRcbiAqIGludm9sdmUgY29uZmlndXJpbmcgdGhlIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciAkc2NlRGVsZWdhdGVQcm92aWRlcn0gaW5zdGVhZCBieSBzZXR0aW5nXG4gKiB5b3VyIG93biB3aGl0ZWxpc3RzIGFuZCBibGFja2xpc3RzIGZvciB0cnVzdGluZyBVUkxzIHVzZWQgZm9yIGxvYWRpbmcgQW5ndWxhckpTIHJlc291cmNlcyBzdWNoIGFzXG4gKiB0ZW1wbGF0ZXMuICBSZWZlciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3RcbiAqICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0fSBhbmQge0BsaW5rXG4gKiBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdCAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybEJsYWNrbGlzdH1cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJHNjZURlbGVnYXRlUHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogVGhlIGAkc2NlRGVsZWdhdGVQcm92aWRlcmAgcHJvdmlkZXIgYWxsb3dzIGRldmVsb3BlcnMgdG8gY29uZmlndXJlIHRoZSB7QGxpbmsgbmcuJHNjZURlbGVnYXRlXG4gKiAkc2NlRGVsZWdhdGV9IHNlcnZpY2UuICBUaGlzIGFsbG93cyBvbmUgdG8gZ2V0L3NldCB0aGUgd2hpdGVsaXN0cyBhbmQgYmxhY2tsaXN0cyB1c2VkIHRvIGVuc3VyZVxuICogdGhhdCB0aGUgVVJMcyB1c2VkIGZvciBzb3VyY2luZyBBbmd1bGFyIHRlbXBsYXRlcyBhcmUgc2FmZS4gIFJlZmVyIHtAbGlua1xuICogbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3QgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxXaGl0ZWxpc3R9IGFuZFxuICoge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsQmxhY2tsaXN0fVxuICpcbiAqIEZvciB0aGUgZ2VuZXJhbCBkZXRhaWxzIGFib3V0IHRoaXMgc2VydmljZSBpbiBBbmd1bGFyLCByZWFkIHRoZSBtYWluIHBhZ2UgZm9yIHtAbGluayBuZy4kc2NlXG4gKiBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0uXG4gKlxuICogKipFeGFtcGxlKio6ICBDb25zaWRlciB0aGUgZm9sbG93aW5nIGNhc2UuIDxhIG5hbWU9XCJleGFtcGxlXCI+PC9hPlxuICpcbiAqIC0geW91ciBhcHAgaXMgaG9zdGVkIGF0IHVybCBgaHR0cDovL215YXBwLmV4YW1wbGUuY29tL2BcbiAqIC0gYnV0IHNvbWUgb2YgeW91ciB0ZW1wbGF0ZXMgYXJlIGhvc3RlZCBvbiBvdGhlciBkb21haW5zIHlvdSBjb250cm9sIHN1Y2ggYXNcbiAqICAgYGh0dHA6Ly9zcnYwMS5hc3NldHMuZXhhbXBsZS5jb20vYCwgYGh0dHA6Ly9zcnYwMi5hc3NldHMuZXhhbXBsZS5jb20vYCwgZXRjLlxuICogLSBhbmQgeW91IGhhdmUgYW4gb3BlbiByZWRpcmVjdCBhdCBgaHR0cDovL215YXBwLmV4YW1wbGUuY29tL2NsaWNrVGhydT8uLi5gLlxuICpcbiAqIEhlcmUgaXMgd2hhdCBhIHNlY3VyZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNjZW5hcmlvIG1pZ2h0IGxvb2sgbGlrZTpcbiAqXG4gKiBgYGBcbiAqICBhbmd1bGFyLm1vZHVsZSgnbXlBcHAnLCBbXSkuY29uZmlnKGZ1bmN0aW9uKCRzY2VEZWxlZ2F0ZVByb3ZpZGVyKSB7XG4gKiAgICAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybFdoaXRlbGlzdChbXG4gKiAgICAgIC8vIEFsbG93IHNhbWUgb3JpZ2luIHJlc291cmNlIGxvYWRzLlxuICogICAgICAnc2VsZicsXG4gKiAgICAgIC8vIEFsbG93IGxvYWRpbmcgZnJvbSBvdXIgYXNzZXRzIGRvbWFpbi4gIE5vdGljZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICogYW5kICoqLlxuICogICAgICAnaHR0cDovL3NydiouYXNzZXRzLmV4YW1wbGUuY29tLyoqJ1xuICogICAgXSk7XG4gKlxuICogICAgLy8gVGhlIGJsYWNrbGlzdCBvdmVycmlkZXMgdGhlIHdoaXRlbGlzdCBzbyB0aGUgb3BlbiByZWRpcmVjdCBoZXJlIGlzIGJsb2NrZWQuXG4gKiAgICAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybEJsYWNrbGlzdChbXG4gKiAgICAgICdodHRwOi8vbXlhcHAuZXhhbXBsZS5jb20vY2xpY2tUaHJ1KionXG4gKiAgICBdKTtcbiAqICB9KTtcbiAqIGBgYFxuICovXG5cbmZ1bmN0aW9uICRTY2VEZWxlZ2F0ZVByb3ZpZGVyKCkge1xuICB0aGlzLlNDRV9DT05URVhUUyA9IFNDRV9DT05URVhUUztcblxuICAvLyBSZXNvdXJjZSBVUkxzIGNhbiBhbHNvIGJlIHRydXN0ZWQgYnkgcG9saWN5LlxuICB2YXIgcmVzb3VyY2VVcmxXaGl0ZWxpc3QgPSBbJ3NlbGYnXSxcbiAgICAgIHJlc291cmNlVXJsQmxhY2tsaXN0ID0gW107XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3RcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheT19IHdoaXRlbGlzdCBXaGVuIHByb3ZpZGVkLCByZXBsYWNlcyB0aGUgcmVzb3VyY2VVcmxXaGl0ZWxpc3Qgd2l0aCB0aGUgdmFsdWVcbiAgICogICAgcHJvdmlkZWQuICBUaGlzIG11c3QgYmUgYW4gYXJyYXkgb3IgbnVsbC4gIEEgc25hcHNob3Qgb2YgdGhpcyBhcnJheSBpcyB1c2VkIHNvIGZ1cnRoZXJcbiAgICogICAgY2hhbmdlcyB0byB0aGUgYXJyYXkgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgIEZvbGxvdyB7QGxpbmsgbmcuJHNjZSNyZXNvdXJjZVVybFBhdHRlcm5JdGVtIHRoaXMgbGlua30gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGl0ZW1zXG4gICAqICAgIGFsbG93ZWQgaW4gdGhpcyBhcnJheS5cbiAgICpcbiAgICogICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAgICogICAgKipOb3RlOioqIGFuIGVtcHR5IHdoaXRlbGlzdCBhcnJheSB3aWxsIGJsb2NrIGFsbCBVUkxzIVxuICAgKiAgICA8L2Rpdj5cbiAgICpcbiAgICogQHJldHVybiB7QXJyYXl9IHRoZSBjdXJyZW50bHkgc2V0IHdoaXRlbGlzdCBhcnJheS5cbiAgICpcbiAgICogVGhlICoqZGVmYXVsdCB2YWx1ZSoqIHdoZW4gbm8gd2hpdGVsaXN0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IGlzIGBbJ3NlbGYnXWAgYWxsb3dpbmcgb25seVxuICAgKiBzYW1lIG9yaWdpbiByZXNvdXJjZSByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMvR2V0cyB0aGUgd2hpdGVsaXN0IG9mIHRydXN0ZWQgcmVzb3VyY2UgVVJMcy5cbiAgICovXG4gIHRoaXMucmVzb3VyY2VVcmxXaGl0ZWxpc3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICByZXNvdXJjZVVybFdoaXRlbGlzdCA9IGFkanVzdE1hdGNoZXJzKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlVXJsV2hpdGVsaXN0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0XG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk9fSBibGFja2xpc3QgV2hlbiBwcm92aWRlZCwgcmVwbGFjZXMgdGhlIHJlc291cmNlVXJsQmxhY2tsaXN0IHdpdGggdGhlIHZhbHVlXG4gICAqICAgIHByb3ZpZGVkLiAgVGhpcyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwuICBBIHNuYXBzaG90IG9mIHRoaXMgYXJyYXkgaXMgdXNlZCBzbyBmdXJ0aGVyXG4gICAqICAgIGNoYW5nZXMgdG8gdGhlIGFycmF5IGFyZSBpZ25vcmVkLlxuICAgKlxuICAgKiAgICBGb2xsb3cge0BsaW5rIG5nLiRzY2UjcmVzb3VyY2VVcmxQYXR0ZXJuSXRlbSB0aGlzIGxpbmt9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtc1xuICAgKiAgICBhbGxvd2VkIGluIHRoaXMgYXJyYXkuXG4gICAqXG4gICAqICAgIFRoZSB0eXBpY2FsIHVzYWdlIGZvciB0aGUgYmxhY2tsaXN0IGlzIHRvICoqYmxvY2tcbiAgICogICAgW29wZW4gcmVkaXJlY3RzXShodHRwOi8vY3dlLm1pdHJlLm9yZy9kYXRhL2RlZmluaXRpb25zLzYwMS5odG1sKSoqIHNlcnZlZCBieSB5b3VyIGRvbWFpbiBhc1xuICAgKiAgICB0aGVzZSB3b3VsZCBvdGhlcndpc2UgYmUgdHJ1c3RlZCBidXQgYWN0dWFsbHkgcmV0dXJuIGNvbnRlbnQgZnJvbSB0aGUgcmVkaXJlY3RlZCBkb21haW4uXG4gICAqXG4gICAqICAgIEZpbmFsbHksICoqdGhlIGJsYWNrbGlzdCBvdmVycmlkZXMgdGhlIHdoaXRlbGlzdCoqIGFuZCBoYXMgdGhlIGZpbmFsIHNheS5cbiAgICpcbiAgICogQHJldHVybiB7QXJyYXl9IHRoZSBjdXJyZW50bHkgc2V0IGJsYWNrbGlzdCBhcnJheS5cbiAgICpcbiAgICogVGhlICoqZGVmYXVsdCB2YWx1ZSoqIHdoZW4gbm8gd2hpdGVsaXN0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IGlzIHRoZSBlbXB0eSBhcnJheSAoaS5lLiB0aGVyZVxuICAgKiBpcyBubyBibGFja2xpc3QuKVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cy9HZXRzIHRoZSBibGFja2xpc3Qgb2YgdHJ1c3RlZCByZXNvdXJjZSBVUkxzLlxuICAgKi9cblxuICB0aGlzLnJlc291cmNlVXJsQmxhY2tsaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmVzb3VyY2VVcmxCbGFja2xpc3QgPSBhZGp1c3RNYXRjaGVycyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZVVybEJsYWNrbGlzdDtcbiAgfTtcblxuICB0aGlzLiRnZXQgPSBbJyRpbmplY3RvcicsIGZ1bmN0aW9uKCRpbmplY3Rvcikge1xuXG4gICAgdmFyIGh0bWxTYW5pdGl6ZXIgPSBmdW5jdGlvbiBodG1sU2FuaXRpemVyKGh0bWwpIHtcbiAgICAgIHRocm93ICRzY2VNaW5FcnIoJ3Vuc2FmZScsICdBdHRlbXB0aW5nIHRvIHVzZSBhbiB1bnNhZmUgdmFsdWUgaW4gYSBzYWZlIGNvbnRleHQuJyk7XG4gICAgfTtcblxuICAgIGlmICgkaW5qZWN0b3IuaGFzKCckc2FuaXRpemUnKSkge1xuICAgICAgaHRtbFNhbml0aXplciA9ICRpbmplY3Rvci5nZXQoJyRzYW5pdGl6ZScpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gbWF0Y2hVcmwobWF0Y2hlciwgcGFyc2VkVXJsKSB7XG4gICAgICBpZiAobWF0Y2hlciA9PT0gJ3NlbGYnKSB7XG4gICAgICAgIHJldHVybiB1cmxJc1NhbWVPcmlnaW4ocGFyc2VkVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlZmluaXRlbHkgYSByZWdleC4gIFNlZSBhZGp1c3RNYXRjaGVycygpXG4gICAgICAgIHJldHVybiAhIW1hdGNoZXIuZXhlYyhwYXJzZWRVcmwuaHJlZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXNvdXJjZVVybEFsbG93ZWRCeVBvbGljeSh1cmwpIHtcbiAgICAgIHZhciBwYXJzZWRVcmwgPSB1cmxSZXNvbHZlKHVybC50b1N0cmluZygpKTtcbiAgICAgIHZhciBpLCBuLCBhbGxvd2VkID0gZmFsc2U7XG4gICAgICAvLyBFbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgaXRlbSBmcm9tIHRoZSB3aGl0ZWxpc3QgYWxsb3dzIHRoaXMgdXJsLlxuICAgICAgZm9yIChpID0gMCwgbiA9IHJlc291cmNlVXJsV2hpdGVsaXN0Lmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICBpZiAobWF0Y2hVcmwocmVzb3VyY2VVcmxXaGl0ZWxpc3RbaV0sIHBhcnNlZFVybCkpIHtcbiAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFsbG93ZWQpIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm8gaXRlbSBmcm9tIHRoZSBibGFja2xpc3QgYmxvY2tlZCB0aGlzIHVybC5cbiAgICAgICAgZm9yIChpID0gMCwgbiA9IHJlc291cmNlVXJsQmxhY2tsaXN0Lmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIGlmIChtYXRjaFVybChyZXNvdXJjZVVybEJsYWNrbGlzdFtpXSwgcGFyc2VkVXJsKSkge1xuICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxsb3dlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUhvbGRlclR5cGUoQmFzZSkge1xuICAgICAgdmFyIGhvbGRlclR5cGUgPSBmdW5jdGlvbiBUcnVzdGVkVmFsdWVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZSkge1xuICAgICAgICB0aGlzLiQkdW53cmFwVHJ1c3RlZFZhbHVlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRydXN0ZWRWYWx1ZTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICBpZiAoQmFzZSkge1xuICAgICAgICBob2xkZXJUeXBlLnByb3RvdHlwZSA9IG5ldyBCYXNlKCk7XG4gICAgICB9XG4gICAgICBob2xkZXJUeXBlLnByb3RvdHlwZS52YWx1ZU9mID0gZnVuY3Rpb24gc2NlVmFsdWVPZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTtcbiAgICAgIH07XG4gICAgICBob2xkZXJUeXBlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHNjZVRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpLnRvU3RyaW5nKCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGhvbGRlclR5cGU7XG4gICAgfVxuXG4gICAgdmFyIHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UgPSBnZW5lcmF0ZUhvbGRlclR5cGUoKSxcbiAgICAgICAgYnlUeXBlID0ge307XG5cbiAgICBieVR5cGVbU0NFX0NPTlRFWFRTLkhUTUxdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpO1xuICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuQ1NTXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTtcbiAgICBieVR5cGVbU0NFX0NPTlRFWFRTLlVSTF0gPSBnZW5lcmF0ZUhvbGRlclR5cGUodHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSk7XG4gICAgYnlUeXBlW1NDRV9DT05URVhUUy5KU10gPSBnZW5lcmF0ZUhvbGRlclR5cGUodHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSk7XG4gICAgYnlUeXBlW1NDRV9DT05URVhUUy5SRVNPVVJDRV9VUkxdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKGJ5VHlwZVtTQ0VfQ09OVEVYVFMuVVJMXSk7XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZURlbGVnYXRlI3RydXN0QXNcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgaXMgdHJ1c3RlZCBieSBhbmd1bGFyIGZvciB1c2UgaW4gc3BlY2lmaWVkIHN0cmljdFxuICAgICAqIGNvbnRleHR1YWwgZXNjYXBpbmcgY29udGV4dHMgKHN1Y2ggYXMgbmctYmluZC1odG1sLCBuZy1pbmNsdWRlLCBhbnkgc3JjXG4gICAgICogYXR0cmlidXRlIGludGVycG9sYXRpb24sIGFueSBkb20gZXZlbnQgYmluZGluZyBhdHRyaWJ1dGUgaW50ZXJwb2xhdGlvblxuICAgICAqIHN1Y2ggYXMgZm9yIG9uY2xpY2ssICBldGMuKSB0aGF0IHVzZXMgdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqIFNlZSB7QGxpbmsgbmcuJHNjZSAkc2NlfSBmb3IgZW5hYmxpbmcgc3RyaWN0IGNvbnRleHR1YWwgZXNjYXBpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgc2FmZSBmb3IgdXNlLiAgZS5nLiB1cmwsXG4gICAgICogICByZXNvdXJjZVVybCwgaHRtbCwganMgYW5kIGNzcy5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdHJ1c3RlZC9zYWZlLlxuICAgICAqIEByZXR1cm5zIHsqfSBBIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RhbmQgaW4gZm9yIHRoZSBwcm92aWRlZCBgdmFsdWVgIGluIHBsYWNlc1xuICAgICAqIHdoZXJlIEFuZ3VsYXIgZXhwZWN0cyBhICRzY2UudHJ1c3RBcygpIHJldHVybiB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVzdEFzKHR5cGUsIHRydXN0ZWRWYWx1ZSkge1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gKGJ5VHlwZS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSA/IGJ5VHlwZVt0eXBlXSA6IG51bGwpO1xuICAgICAgaWYgKCFDb25zdHJ1Y3Rvcikge1xuICAgICAgICB0aHJvdyAkc2NlTWluRXJyKCdpY29udGV4dCcsXG4gICAgICAgICAgICAnQXR0ZW1wdGVkIHRvIHRydXN0IGEgdmFsdWUgaW4gaW52YWxpZCBjb250ZXh0LiBDb250ZXh0OiB7MH07IFZhbHVlOiB7MX0nLFxuICAgICAgICAgICAgdHlwZSwgdHJ1c3RlZFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cnVzdGVkVmFsdWUgPT09IG51bGwgfHwgaXNVbmRlZmluZWQodHJ1c3RlZFZhbHVlKSB8fCB0cnVzdGVkVmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGVkVmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBBbGwgdGhlIGN1cnJlbnQgY29udGV4dHMgaW4gU0NFX0NPTlRFWFRTIGhhcHBlbiB0byBiZSBzdHJpbmdzLiAgSW4gb3JkZXIgdG8gYXZvaWQgdHJ1c3RpbmdcbiAgICAgIC8vIG11dGFibGUgb2JqZWN0cywgd2UgZW5zdXJlIGhlcmUgdGhhdCB0aGUgdmFsdWUgcGFzc2VkIGluIGlzIGFjdHVhbGx5IGEgc3RyaW5nLlxuICAgICAgaWYgKHR5cGVvZiB0cnVzdGVkVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93ICRzY2VNaW5FcnIoJ2l0eXBlJyxcbiAgICAgICAgICAgICdBdHRlbXB0ZWQgdG8gdHJ1c3QgYSBub24tc3RyaW5nIHZhbHVlIGluIGEgY29udGVudCByZXF1aXJpbmcgYSBzdHJpbmc6IENvbnRleHQ6IHswfScsXG4gICAgICAgICAgICB0eXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IodHJ1c3RlZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZURlbGVnYXRlI3ZhbHVlT2ZcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIElmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGhhZCBiZWVuIHJldHVybmVkIGJ5IGEgcHJpb3IgY2FsbCB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXNcbiAgICAgKiBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSwgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCBoYWQgYmVlbiBwYXNzZWQgdG8ge0BsaW5rXG4gICAgICogbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBub3QgYSB2YWx1ZSB0aGF0IGhhZCBiZWVuIHJldHVybmVkIGJ5IHtAbGlua1xuICAgICAqIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9LCByZXR1cm5zIGl0IGFzLWlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcmVzdWx0IG9mIGEgcHJpb3Ige0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9XG4gICAgICogICAgICBjYWxsIG9yIGFueXRoaW5nIGVsc2UuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSBgdmFsdWVgIHRoYXQgd2FzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzXG4gICAgICogICAgIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9IGlmIGB2YWx1ZWAgaXMgdGhlIHJlc3VsdCBvZiBzdWNoIGEgY2FsbC4gIE90aGVyd2lzZSwgcmV0dXJuc1xuICAgICAqICAgICBgdmFsdWVgIHVuY2hhbmdlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZU9mKG1heWJlVHJ1c3RlZCkge1xuICAgICAgaWYgKG1heWJlVHJ1c3RlZCBpbnN0YW5jZW9mIHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpIHtcbiAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZC4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZURlbGVnYXRlI2dldFRydXN0ZWRcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFRha2VzIHRoZSByZXN1bHQgb2YgYSB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0gY2FsbCBhbmRcbiAgICAgKiByZXR1cm5zIHRoZSBvcmlnaW5hbGx5IHN1cHBsaWVkIHZhbHVlIGlmIHRoZSBxdWVyaWVkIGNvbnRleHQgdHlwZSBpcyBhIHN1cGVydHlwZSBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIHR5cGUuICBJZiB0aGlzIGNvbmRpdGlvbiBpc24ndCBzYXRpc2ZpZWQsIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICpcbiAgICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+XG4gICAgICogRGlzYWJsaW5nIGF1dG8tZXNjYXBpbmcgaXMgZXh0cmVtZWx5IGRhbmdlcm91cywgaXQgdXN1YWxseSBjcmVhdGVzIGEgQ3Jvc3MgU2l0ZSBTY3JpcHRpbmdcbiAgICAgKiAoWFNTKSB2dWxuZXJhYmlsaXR5IGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAgICogPC9kaXY+XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgdG8gYmUgdXNlZC5cbiAgICAgKiBAcGFyYW0geyp9IG1heWJlVHJ1c3RlZCBUaGUgcmVzdWx0IG9mIGEgcHJpb3Ige0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzXG4gICAgICogICAgIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9IGNhbGwuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGUgd2FzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzXG4gICAgICogICAgIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9IGlmIHZhbGlkIGluIHRoaXMgY29udGV4dC4gIE90aGVyd2lzZSwgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUcnVzdGVkKHR5cGUsIG1heWJlVHJ1c3RlZCkge1xuICAgICAgaWYgKG1heWJlVHJ1c3RlZCA9PT0gbnVsbCB8fCBpc1VuZGVmaW5lZChtYXliZVRydXN0ZWQpIHx8IG1heWJlVHJ1c3RlZCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZDtcbiAgICAgIH1cbiAgICAgIHZhciBjb25zdHJ1Y3RvciA9IChieVR5cGUuaGFzT3duUHJvcGVydHkodHlwZSkgPyBieVR5cGVbdHlwZV0gOiBudWxsKTtcbiAgICAgIGlmIChjb25zdHJ1Y3RvciAmJiBtYXliZVRydXN0ZWQgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gbWF5YmVUcnVzdGVkLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlbiB3ZSBtYXkgb25seSB0YWtlIG9uZSBvZiB0d28gYWN0aW9ucy5cbiAgICAgIC8vIDEuIHNhbml0aXplIHRoZSB2YWx1ZSBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlLCBvclxuICAgICAgLy8gMi4gdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgICAgaWYgKHR5cGUgPT09IFNDRV9DT05URVhUUy5SRVNPVVJDRV9VUkwpIHtcbiAgICAgICAgaWYgKGlzUmVzb3VyY2VVcmxBbGxvd2VkQnlQb2xpY3kobWF5YmVUcnVzdGVkKSkge1xuICAgICAgICAgIHJldHVybiBtYXliZVRydXN0ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgJHNjZU1pbkVycignaW5zZWN1cmwnLFxuICAgICAgICAgICAgICAnQmxvY2tlZCBsb2FkaW5nIHJlc291cmNlIGZyb20gdXJsIG5vdCBhbGxvd2VkIGJ5ICRzY2VEZWxlZ2F0ZSBwb2xpY3kuICBVUkw6IHswfScsXG4gICAgICAgICAgICAgIG1heWJlVHJ1c3RlZC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBTQ0VfQ09OVEVYVFMuSFRNTCkge1xuICAgICAgICByZXR1cm4gaHRtbFNhbml0aXplcihtYXliZVRydXN0ZWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgJHNjZU1pbkVycigndW5zYWZlJywgJ0F0dGVtcHRpbmcgdG8gdXNlIGFuIHVuc2FmZSB2YWx1ZSBpbiBhIHNhZmUgY29udGV4dC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0cnVzdEFzOiB0cnVzdEFzLFxuICAgICAgICAgICAgIGdldFRydXN0ZWQ6IGdldFRydXN0ZWQsXG4gICAgICAgICAgICAgdmFsdWVPZjogdmFsdWVPZiB9O1xuICB9XTtcbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJHNjZVByb3ZpZGVyXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoZSAkc2NlUHJvdmlkZXIgcHJvdmlkZXIgYWxsb3dzIGRldmVsb3BlcnMgdG8gY29uZmlndXJlIHRoZSB7QGxpbmsgbmcuJHNjZSAkc2NlfSBzZXJ2aWNlLlxuICogLSAgIGVuYWJsZS9kaXNhYmxlIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIChTQ0UpIGluIGEgbW9kdWxlXG4gKiAtICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2l0aCBhIGN1c3RvbSBkZWxlZ2F0ZVxuICpcbiAqIFJlYWQgbW9yZSBhYm91dCB7QGxpbmsgbmcuJHNjZSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0uXG4gKi9cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJHNjZVxuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBgJHNjZWAgaXMgYSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgc2VydmljZXMgdG8gQW5ndWxhckpTLlxuICpcbiAqICMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmdcbiAqXG4gKiBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKSBpcyBhIG1vZGUgaW4gd2hpY2ggQW5ndWxhckpTIHJlcXVpcmVzIGJpbmRpbmdzIGluIGNlcnRhaW5cbiAqIGNvbnRleHRzIHRvIHJlc3VsdCBpbiBhIHZhbHVlIHRoYXQgaXMgbWFya2VkIGFzIHNhZmUgdG8gdXNlIGZvciB0aGF0IGNvbnRleHQuICBPbmUgZXhhbXBsZSBvZlxuICogc3VjaCBhIGNvbnRleHQgaXMgYmluZGluZyBhcmJpdHJhcnkgaHRtbCBjb250cm9sbGVkIGJ5IHRoZSB1c2VyIHZpYSBgbmctYmluZC1odG1sYC4gIFdlIHJlZmVyXG4gKiB0byB0aGVzZSBjb250ZXh0cyBhcyBwcml2aWxlZ2VkIG9yIFNDRSBjb250ZXh0cy5cbiAqXG4gKiBBcyBvZiB2ZXJzaW9uIDEuMiwgQW5ndWxhciBzaGlwcyB3aXRoIFNDRSBlbmFibGVkIGJ5IGRlZmF1bHQuXG4gKlxuICogTm90ZTogIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBJRTwxMSBpbiBxdWlya3MgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLiAgSW4gdGhpcyBtb2RlLCBJRTwxMSBhbGxvd1xuICogb25lIHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGphdmFzY3JpcHQgYnkgdGhlIHVzZSBvZiB0aGUgZXhwcmVzc2lvbigpIHN5bnRheC4gIFJlZmVyXG4gKiA8aHR0cDovL2Jsb2dzLm1zZG4uY29tL2IvaWUvYXJjaGl2ZS8yMDA4LzEwLzE2L2VuZGluZy1leHByZXNzaW9ucy5hc3B4PiB0byBsZWFybiBtb3JlIGFib3V0IHRoZW0uXG4gKiBZb3UgY2FuIGVuc3VyZSB5b3VyIGRvY3VtZW50IGlzIGluIHN0YW5kYXJkcyBtb2RlIGFuZCBub3QgcXVpcmtzIG1vZGUgYnkgYWRkaW5nIGA8IWRvY3R5cGUgaHRtbD5gXG4gKiB0byB0aGUgdG9wIG9mIHlvdXIgSFRNTCBkb2N1bWVudC5cbiAqXG4gKiBTQ0UgYXNzaXN0cyBpbiB3cml0aW5nIGNvZGUgaW4gYSB3YXkgdGhhdCAoYSkgaXMgc2VjdXJlIGJ5IGRlZmF1bHQgYW5kIChiKSBtYWtlcyBhdWRpdGluZyBmb3JcbiAqIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyBzdWNoIGFzIFhTUywgY2xpY2tqYWNraW5nLCBldGMuIGEgbG90IGVhc2llci5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIGJpbmRpbmcgaW4gYSBwcml2aWxlZ2VkIGNvbnRleHQ6XG4gKlxuICogYGBgXG4gKiA8aW5wdXQgbmctbW9kZWw9XCJ1c2VySHRtbFwiIGFyaWEtbGFiZWw9XCJVc2VyIGlucHV0XCI+XG4gKiA8ZGl2IG5nLWJpbmQtaHRtbD1cInVzZXJIdG1sXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCBgbmctYmluZC1odG1sYCBpcyBib3VuZCB0byBgdXNlckh0bWxgIGNvbnRyb2xsZWQgYnkgdGhlIHVzZXIuICBXaXRoIFNDRVxuICogZGlzYWJsZWQsIHRoaXMgYXBwbGljYXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHJlbmRlciBhcmJpdHJhcnkgSFRNTCBpbnRvIHRoZSBESVYuXG4gKiBJbiBhIG1vcmUgcmVhbGlzdGljIGV4YW1wbGUsIG9uZSBtYXkgYmUgcmVuZGVyaW5nIHVzZXIgY29tbWVudHMsIGJsb2cgYXJ0aWNsZXMsIGV0Yy4gdmlhXG4gKiBiaW5kaW5ncy4gIChIVE1MIGlzIGp1c3Qgb25lIGV4YW1wbGUgb2YgYSBjb250ZXh0IHdoZXJlIHJlbmRlcmluZyB1c2VyIGNvbnRyb2xsZWQgaW5wdXQgY3JlYXRlc1xuICogc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLilcbiAqXG4gKiBGb3IgdGhlIGNhc2Ugb2YgSFRNTCwgeW91IG1pZ2h0IHVzZSBhIGxpYnJhcnksIGVpdGhlciBvbiB0aGUgY2xpZW50IHNpZGUsIG9yIG9uIHRoZSBzZXJ2ZXIgc2lkZSxcbiAqIHRvIHNhbml0aXplIHVuc2FmZSBIVE1MIGJlZm9yZSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBhbmQgcmVuZGVyaW5nIGl0IGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBIb3cgd291bGQgeW91IGVuc3VyZSB0aGF0IGV2ZXJ5IHBsYWNlIHRoYXQgdXNlZCB0aGVzZSB0eXBlcyBvZiBiaW5kaW5ncyB3YXMgYm91bmQgdG8gYSB2YWx1ZSB0aGF0XG4gKiB3YXMgc2FuaXRpemVkIGJ5IHlvdXIgbGlicmFyeSAob3IgcmV0dXJuZWQgYXMgc2FmZSBmb3IgcmVuZGVyaW5nIGJ5IHlvdXIgc2VydmVyPykgIEhvdyBjYW4geW91XG4gKiBlbnN1cmUgdGhhdCB5b3UgZGlkbid0IGFjY2lkZW50YWxseSBkZWxldGUgdGhlIGxpbmUgdGhhdCBzYW5pdGl6ZWQgdGhlIHZhbHVlLCBvciByZW5hbWVkIHNvbWVcbiAqIHByb3BlcnRpZXMvZmllbGRzIGFuZCBmb3Jnb3QgdG8gdXBkYXRlIHRoZSBiaW5kaW5nIHRvIHRoZSBzYW5pdGl6ZWQgdmFsdWU/XG4gKlxuICogVG8gYmUgc2VjdXJlIGJ5IGRlZmF1bHQsIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGFueSBzdWNoIGJpbmRpbmdzIGFyZSBkaXNhbGxvd2VkIHVubGVzcyB5b3UgY2FuXG4gKiBkZXRlcm1pbmUgdGhhdCBzb21ldGhpbmcgZXhwbGljaXRseSBzYXlzIGl0J3Mgc2FmZSB0byB1c2UgYSB2YWx1ZSBmb3IgYmluZGluZyBpbiB0aGF0XG4gKiBjb250ZXh0LiAgWW91IGNhbiB0aGVuIGF1ZGl0IHlvdXIgY29kZSAoYSBzaW1wbGUgZ3JlcCB3b3VsZCBkbykgdG8gZW5zdXJlIHRoYXQgdGhpcyBpcyBvbmx5IGRvbmVcbiAqIGZvciB0aG9zZSB2YWx1ZXMgdGhhdCB5b3UgY2FuIGVhc2lseSB0ZWxsIGFyZSBzYWZlIC0gYmVjYXVzZSB0aGV5IHdlcmUgcmVjZWl2ZWQgZnJvbSB5b3VyIHNlcnZlcixcbiAqIHNhbml0aXplZCBieSB5b3VyIGxpYnJhcnksIGV0Yy4gIFlvdSBjYW4gb3JnYW5pemUgeW91ciBjb2RlYmFzZSB0byBoZWxwIHdpdGggdGhpcyAtIHBlcmhhcHNcbiAqIGFsbG93aW5nIG9ubHkgdGhlIGZpbGVzIGluIGEgc3BlY2lmaWMgZGlyZWN0b3J5IHRvIGRvIHRoaXMuICBFbnN1cmluZyB0aGF0IHRoZSBpbnRlcm5hbCBBUElcbiAqIGV4cG9zZWQgYnkgdGhhdCBjb2RlIGRvZXNuJ3QgbWFya3VwIGFyYml0cmFyeSB2YWx1ZXMgYXMgc2FmZSB0aGVuIGJlY29tZXMgYSBtb3JlIG1hbmFnZWFibGUgdGFzay5cbiAqXG4gKiBJbiB0aGUgY2FzZSBvZiBBbmd1bGFySlMnIFNDRSBzZXJ2aWNlLCBvbmUgdXNlcyB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzICRzY2UudHJ1c3RBc31cbiAqIChhbmQgc2hvcnRoYW5kIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzSHRtbCAkc2NlLnRydXN0QXNIdG1sfSwgZXRjLikgdG9cbiAqIG9idGFpbiB2YWx1ZXMgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IFNDRSAvIHByaXZpbGVnZWQgY29udGV4dHMuXG4gKlxuICpcbiAqICMjIEhvdyBkb2VzIGl0IHdvcms/XG4gKlxuICogSW4gcHJpdmlsZWdlZCBjb250ZXh0cywgZGlyZWN0aXZlcyBhbmQgY29kZSB3aWxsIGJpbmQgdG8gdGhlIHJlc3VsdCBvZiB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkXG4gKiAkc2NlLmdldFRydXN0ZWQoY29udGV4dCwgdmFsdWUpfSByYXRoZXIgdGhhbiB0byB0aGUgdmFsdWUgZGlyZWN0bHkuICBEaXJlY3RpdmVzIHVzZSB7QGxpbmtcbiAqIG5nLiRzY2UjcGFyc2VBcyAkc2NlLnBhcnNlQXN9IHJhdGhlciB0aGFuIGAkcGFyc2VgIHRvIHdhdGNoIGF0dHJpYnV0ZSBiaW5kaW5ncywgd2hpY2ggcGVyZm9ybXMgdGhlXG4gKiB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkICRzY2UuZ2V0VHJ1c3RlZH0gYmVoaW5kIHRoZSBzY2VuZXMgb24gbm9uLWNvbnN0YW50IGxpdGVyYWxzLlxuICpcbiAqIEFzIGFuIGV4YW1wbGUsIHtAbGluayBuZy5kaXJlY3RpdmU6bmdCaW5kSHRtbCBuZ0JpbmRIdG1sfSB1c2VzIHtAbGlua1xuICogbmcuJHNjZSNwYXJzZUFzSHRtbCAkc2NlLnBhcnNlQXNIdG1sKGJpbmRpbmcgZXhwcmVzc2lvbil9LiAgSGVyZSdzIHRoZSBhY3R1YWwgY29kZSAoc2xpZ2h0bHlcbiAqIHNpbXBsaWZpZWQpOlxuICpcbiAqIGBgYFxuICogdmFyIG5nQmluZEh0bWxEaXJlY3RpdmUgPSBbJyRzY2UnLCBmdW5jdGlvbigkc2NlKSB7XG4gKiAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikge1xuICogICAgIHNjb3BlLiR3YXRjaCgkc2NlLnBhcnNlQXNIdG1sKGF0dHIubmdCaW5kSHRtbCksIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgICAgICBlbGVtZW50Lmh0bWwodmFsdWUgfHwgJycpO1xuICogICAgIH0pO1xuICogICB9O1xuICogfV07XG4gKiBgYGBcbiAqXG4gKiAjIyBJbXBhY3Qgb24gbG9hZGluZyB0ZW1wbGF0ZXNcbiAqXG4gKiBUaGlzIGFwcGxpZXMgYm90aCB0byB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luY2x1ZGUgYG5nLWluY2x1ZGVgfSBkaXJlY3RpdmUgYXMgd2VsbCBhc1xuICogYHRlbXBsYXRlVXJsYCdzIHNwZWNpZmllZCBieSB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlIGRpcmVjdGl2ZXN9LlxuICpcbiAqIEJ5IGRlZmF1bHQsIEFuZ3VsYXIgb25seSBsb2FkcyB0ZW1wbGF0ZXMgZnJvbSB0aGUgc2FtZSBkb21haW4gYW5kIHByb3RvY29sIGFzIHRoZSBhcHBsaWNhdGlvblxuICogZG9jdW1lbnQuICBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkUmVzb3VyY2VVcmxcbiAqICRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsfSBvbiB0aGUgdGVtcGxhdGUgVVJMLiAgVG8gbG9hZCB0ZW1wbGF0ZXMgZnJvbSBvdGhlciBkb21haW5zIGFuZC9vclxuICogcHJvdG9jb2xzLCB5b3UgbWF5IGVpdGhlciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3Qgd2hpdGVsaXN0XG4gKiB0aGVtfSBvciB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzUmVzb3VyY2VVcmwgd3JhcCBpdH0gaW50byBhIHRydXN0ZWQgdmFsdWUuXG4gKlxuICogKlBsZWFzZSBub3RlKjpcbiAqIFRoZSBicm93c2VyJ3NcbiAqIFtTYW1lIE9yaWdpbiBQb2xpY3ldKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYnJvd3NlcnNlYy93aWtpL1BhcnQyI1NhbWUtb3JpZ2luX3BvbGljeV9mb3JfWE1MSHR0cFJlcXVlc3QpXG4gKiBhbmQgW0Nyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nIChDT1JTKV0oaHR0cDovL3d3dy53My5vcmcvVFIvY29ycy8pXG4gKiBwb2xpY3kgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhpcyBhbmQgbWF5IGZ1cnRoZXIgcmVzdHJpY3Qgd2hldGhlciB0aGUgdGVtcGxhdGUgaXMgc3VjY2Vzc2Z1bGx5XG4gKiBsb2FkZWQuICBUaGlzIG1lYW5zIHRoYXQgd2l0aG91dCB0aGUgcmlnaHQgQ09SUyBwb2xpY3ksIGxvYWRpbmcgdGVtcGxhdGVzIGZyb20gYSBkaWZmZXJlbnQgZG9tYWluXG4gKiB3b24ndCB3b3JrIG9uIGFsbCBicm93c2Vycy4gIEFsc28sIGxvYWRpbmcgdGVtcGxhdGVzIGZyb20gYGZpbGU6Ly9gIFVSTCBkb2VzIG5vdCB3b3JrIG9uIHNvbWVcbiAqIGJyb3dzZXJzLlxuICpcbiAqICMjIFRoaXMgZmVlbHMgbGlrZSB0b28gbXVjaCBvdmVyaGVhZFxuICpcbiAqIEl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgU0NFIG9ubHkgYXBwbGllcyB0byBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb25zLlxuICpcbiAqIElmIHlvdXIgZXhwcmVzc2lvbnMgYXJlIGNvbnN0YW50IGxpdGVyYWxzLCB0aGV5J3JlIGF1dG9tYXRpY2FsbHkgdHJ1c3RlZCBhbmQgeW91IGRvbid0IG5lZWQgdG9cbiAqIGNhbGwgYCRzY2UudHJ1c3RBc2Agb24gdGhlbSAocmVtZW1iZXIgdG8gaW5jbHVkZSB0aGUgYG5nU2FuaXRpemVgIG1vZHVsZSkgKGUuZy5cbiAqIGA8ZGl2IG5nLWJpbmQtaHRtbD1cIic8Yj5pbXBsaWNpdGx5IHRydXN0ZWQ8L2I+J1wiPjwvZGl2PmApIGp1c3Qgd29ya3MuXG4gKlxuICogQWRkaXRpb25hbGx5LCBgYVtocmVmXWAgYW5kIGBpbWdbc3JjXWAgYXV0b21hdGljYWxseSBzYW5pdGl6ZSB0aGVpciBVUkxzIGFuZCBkbyBub3QgcGFzcyB0aGVtXG4gKiB0aHJvdWdoIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWQgJHNjZS5nZXRUcnVzdGVkfS4gIFNDRSBkb2Vzbid0IHBsYXkgYSByb2xlIGhlcmUuXG4gKlxuICogVGhlIGluY2x1ZGVkIHtAbGluayBuZy4kc2NlRGVsZWdhdGUgJHNjZURlbGVnYXRlfSBjb21lcyB3aXRoIHNhbmUgZGVmYXVsdHMgdG8gYWxsb3cgeW91IHRvIGxvYWRcbiAqIHRlbXBsYXRlcyBpbiBgbmctaW5jbHVkZWAgZnJvbSB5b3VyIGFwcGxpY2F0aW9uJ3MgZG9tYWluIHdpdGhvdXQgaGF2aW5nIHRvIGV2ZW4ga25vdyBhYm91dCBTQ0UuXG4gKiBJdCBibG9ja3MgbG9hZGluZyB0ZW1wbGF0ZXMgZnJvbSBvdGhlciBkb21haW5zIG9yIGxvYWRpbmcgdGVtcGxhdGVzIG92ZXIgaHR0cCBmcm9tIGFuIGh0dHBzXG4gKiBzZXJ2ZWQgZG9jdW1lbnQuICBZb3UgY2FuIGNoYW5nZSB0aGVzZSBieSBzZXR0aW5nIHlvdXIgb3duIGN1c3RvbSB7QGxpbmtcbiAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0IHdoaXRlbGlzdHN9IGFuZCB7QGxpbmtcbiAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0IGJsYWNrbGlzdHN9IGZvciBtYXRjaGluZyBzdWNoIFVSTHMuXG4gKlxuICogVGhpcyBzaWduaWZpY2FudGx5IHJlZHVjZXMgdGhlIG92ZXJoZWFkLiAgSXQgaXMgZmFyIGVhc2llciB0byBwYXkgdGhlIHNtYWxsIG92ZXJoZWFkIGFuZCBoYXZlIGFuXG4gKiBhcHBsaWNhdGlvbiB0aGF0J3Mgc2VjdXJlIGFuZCBjYW4gYmUgYXVkaXRlZCB0byB2ZXJpZnkgdGhhdCB3aXRoIG11Y2ggbW9yZSBlYXNlIHRoYW4gYm9sdGluZ1xuICogc2VjdXJpdHkgb250byBhbiBhcHBsaWNhdGlvbiBsYXRlci5cbiAqXG4gKiA8YSBuYW1lPVwiY29udGV4dHNcIj48L2E+XG4gKiAjIyBXaGF0IHRydXN0ZWQgY29udGV4dCB0eXBlcyBhcmUgc3VwcG9ydGVkP1xuICpcbiAqIHwgQ29udGV4dCAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgYCRzY2UuSFRNTGAgICAgICAgICB8IEZvciBIVE1MIHRoYXQncyBzYWZlIHRvIHNvdXJjZSBpbnRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQmluZEh0bWwgbmdCaW5kSHRtbH0gZGlyZWN0aXZlIHVzZXMgdGhpcyBjb250ZXh0IGZvciBiaW5kaW5ncy4gSWYgYW4gdW5zYWZlIHZhbHVlIGlzIGVuY291bnRlcmVkIGFuZCB0aGUge0BsaW5rIG5nU2FuaXRpemUgJHNhbml0aXplfSBtb2R1bGUgaXMgcHJlc2VudCB0aGlzIHdpbGwgc2FuaXRpemUgdGhlIHZhbHVlIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IuIHxcbiAqIHwgYCRzY2UuQ1NTYCAgICAgICAgICB8IEZvciBDU1MgdGhhdCdzIHNhZmUgdG8gc291cmNlIGludG8gdGhlIGFwcGxpY2F0aW9uLiAgQ3VycmVudGx5IHVudXNlZC4gIEZlZWwgZnJlZSB0byB1c2UgaXQgaW4geW91ciBvd24gZGlyZWN0aXZlcy4gfFxuICogfCBgJHNjZS5VUkxgICAgICAgICAgIHwgRm9yIFVSTHMgdGhhdCBhcmUgc2FmZSB0byBmb2xsb3cgYXMgbGlua3MuICBDdXJyZW50bHkgdW51c2VkIChgPGEgaHJlZj1gIGFuZCBgPGltZyBzcmM9YCBzYW5pdGl6ZSB0aGVpciB1cmxzIGFuZCBkb24ndCBjb25zdGl0dXRlIGFuIFNDRSBjb250ZXh0LiB8XG4gKiB8IGAkc2NlLlJFU09VUkNFX1VSTGAgfCBGb3IgVVJMcyB0aGF0IGFyZSBub3Qgb25seSBzYWZlIHRvIGZvbGxvdyBhcyBsaW5rcywgYnV0IHdob3NlIGNvbnRlbnRzIGFyZSBhbHNvIHNhZmUgdG8gaW5jbHVkZSBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgRXhhbXBsZXMgaW5jbHVkZSBgbmctaW5jbHVkZWAsIGBzcmNgIC8gYG5nU3JjYCBiaW5kaW5ncyBmb3IgdGFncyBvdGhlciB0aGFuIGBJTUdgLCBgVklERU9gLCBgQVVESU9gLCBgU09VUkNFYCwgYW5kIGBUUkFDS2AgKGUuZy4gYElGUkFNRWAsIGBPQkpFQ1RgLCBldGMuKSAgPGJyPjxicj5Ob3RlIHRoYXQgYCRzY2UuUkVTT1VSQ0VfVVJMYCBtYWtlcyBhIHN0cm9uZ2VyIHN0YXRlbWVudCBhYm91dCB0aGUgVVJMIHRoYW4gYCRzY2UuVVJMYCBkb2VzIGFuZCB0aGVyZWZvcmUgY29udGV4dHMgcmVxdWlyaW5nIHZhbHVlcyB0cnVzdGVkIGZvciBgJHNjZS5SRVNPVVJDRV9VUkxgIGNhbiBiZSB1c2VkIGFueXdoZXJlIHRoYXQgdmFsdWVzIHRydXN0ZWQgZm9yIGAkc2NlLlVSTGAgYXJlIHJlcXVpcmVkLiB8XG4gKiB8IGAkc2NlLkpTYCAgICAgICAgICAgfCBGb3IgSmF2YVNjcmlwdCB0aGF0IGlzIHNhZmUgdG8gZXhlY3V0ZSBpbiB5b3VyIGFwcGxpY2F0aW9uJ3MgY29udGV4dC4gIEN1cnJlbnRseSB1bnVzZWQuICBGZWVsIGZyZWUgdG8gdXNlIGl0IGluIHlvdXIgb3duIGRpcmVjdGl2ZXMuIHxcbiAqXG4gKiAjIyBGb3JtYXQgb2YgaXRlbXMgaW4ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0IHJlc291cmNlVXJsV2hpdGVsaXN0fS97QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxCbGFja2xpc3QgQmxhY2tsaXN0fSA8YSBuYW1lPVwicmVzb3VyY2VVcmxQYXR0ZXJuSXRlbVwiPjwvYT5cbiAqXG4gKiAgRWFjaCBlbGVtZW50IGluIHRoZXNlIGFycmF5cyBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAtICoqJ3NlbGYnKipcbiAqICAgIC0gVGhlIHNwZWNpYWwgKipzdHJpbmcqKiwgYCdzZWxmJ2AsIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFnYWluc3QgYWxsIFVSTHMgb2YgdGhlICoqc2FtZVxuICogICAgICBkb21haW4qKiBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQgdXNpbmcgdGhlICoqc2FtZSBwcm90b2NvbCoqLlxuICogIC0gKipTdHJpbmcqKiAoZXhjZXB0IHRoZSBzcGVjaWFsIHZhbHVlIGAnc2VsZidgKVxuICogICAgLSBUaGUgc3RyaW5nIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgZnVsbCAqbm9ybWFsaXplZCAvIGFic29sdXRlIFVSTCogb2YgdGhlIHJlc291cmNlXG4gKiAgICAgIGJlaW5nIHRlc3RlZCAoc3Vic3RyaW5nIG1hdGNoZXMgYXJlIG5vdCBnb29kIGVub3VnaC4pXG4gKiAgICAtIFRoZXJlIGFyZSBleGFjdGx5ICoqdHdvIHdpbGRjYXJkIHNlcXVlbmNlcyoqIC0gYCpgIGFuZCBgKipgLiAgQWxsIG90aGVyIGNoYXJhY3RlcnNcbiAqICAgICAgbWF0Y2ggdGhlbXNlbHZlcy5cbiAqICAgIC0gYCpgOiBtYXRjaGVzIHplcm8gb3IgbW9yZSBvY2N1cnJlbmNlcyBvZiBhbnkgY2hhcmFjdGVyIG90aGVyIHRoYW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgNlxuICogICAgICBjaGFyYWN0ZXJzOiAnYDpgJywgJ2AvYCcsICdgLmAnLCAnYD9gJywgJ2AmYCcgYW5kICdgO2AnLiAgSXQncyBhIHVzZWZ1bCB3aWxkY2FyZCBmb3IgdXNlXG4gKiAgICAgIGluIGEgd2hpdGVsaXN0LlxuICogICAgLSBgKipgOiBtYXRjaGVzIHplcm8gb3IgbW9yZSBvY2N1cnJlbmNlcyBvZiAqYW55KiBjaGFyYWN0ZXIuICBBcyBzdWNoLCBpdCdzIG5vdFxuICogICAgICBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGEgc2NoZW1lLCBkb21haW4sIGV0Yy4gYXMgaXQgd291bGQgbWF0Y2ggdG9vIG11Y2guICAoZS5nLlxuICogICAgICBodHRwOi8vKiouZXhhbXBsZS5jb20vIHdvdWxkIG1hdGNoIGh0dHA6Ly9ldmlsLmNvbS8/aWdub3JlPS5leGFtcGxlLmNvbS8gYW5kIHRoYXQgbWlnaHRcbiAqICAgICAgbm90IGhhdmUgYmVlbiB0aGUgaW50ZW50aW9uLikgIEl0cyB1c2FnZSBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIHBhdGggaXMgb2suICAoZS5nLlxuICogICAgICBodHRwOi8vZm9vLmV4YW1wbGUuY29tL3RlbXBsYXRlcy8qKikuXG4gKiAgLSAqKlJlZ0V4cCoqICgqc2VlIGNhdmVhdCBiZWxvdyopXG4gKiAgICAtICpDYXZlYXQqOiAgV2hpbGUgcmVndWxhciBleHByZXNzaW9ucyBhcmUgcG93ZXJmdWwgYW5kIG9mZmVyIGdyZWF0IGZsZXhpYmlsaXR5LCAgdGhlaXIgc3ludGF4XG4gKiAgICAgIChhbmQgYWxsIHRoZSBpbmV2aXRhYmxlIGVzY2FwaW5nKSBtYWtlcyB0aGVtICpoYXJkZXIgdG8gbWFpbnRhaW4qLiAgSXQncyBlYXN5IHRvXG4gKiAgICAgIGFjY2lkZW50YWxseSBpbnRyb2R1Y2UgYSBidWcgd2hlbiBvbmUgdXBkYXRlcyBhIGNvbXBsZXggZXhwcmVzc2lvbiAoaW1obywgYWxsIHJlZ2V4ZXMgc2hvdWxkXG4gKiAgICAgIGhhdmUgZ29vZCB0ZXN0IGNvdmVyYWdlKS4gIEZvciBpbnN0YW5jZSwgdGhlIHVzZSBvZiBgLmAgaW4gdGhlIHJlZ2V4IGlzIGNvcnJlY3Qgb25seSBpbiBhXG4gKiAgICAgIHNtYWxsIG51bWJlciBvZiBjYXNlcy4gIEEgYC5gIGNoYXJhY3RlciBpbiB0aGUgcmVnZXggdXNlZCB3aGVuIG1hdGNoaW5nIHRoZSBzY2hlbWUgb3IgYVxuICogICAgICBzdWJkb21haW4gY291bGQgYmUgbWF0Y2hlZCBhZ2FpbnN0IGEgYDpgIG9yIGxpdGVyYWwgYC5gIHRoYXQgd2FzIGxpa2VseSBub3QgaW50ZW5kZWQuICAgSXRcbiAqICAgICAgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgc3RyaW5nIHBhdHRlcm5zIGFuZCBvbmx5IGZhbGwgYmFjayB0byByZWd1bGFyIGV4cHJlc3Npb25zXG4gKiAgICAgIGFzIGEgbGFzdCByZXNvcnQuXG4gKiAgICAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBSZWdFeHAgKGkuZS4gbm90IGEgc3RyaW5nLikgIEl0IGlzXG4gKiAgICAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgKiplbnRpcmUqKiAqbm9ybWFsaXplZCAvIGFic29sdXRlIFVSTCogb2YgdGhlIHJlc291cmNlIGJlaW5nIHRlc3RlZFxuICogICAgICAoZXZlbiB3aGVuIHRoZSBSZWdFeHAgZGlkIG5vdCBoYXZlIHRoZSBgXmAgYW5kIGAkYCBjb2Rlcy4pICBJbiBhZGRpdGlvbiwgYW55IGZsYWdzXG4gKiAgICAgIHByZXNlbnQgb24gdGhlIFJlZ0V4cCAoc3VjaCBhcyBtdWx0aWxpbmUsIGdsb2JhbCwgaWdub3JlQ2FzZSkgYXJlIGlnbm9yZWQuXG4gKiAgICAtIElmIHlvdSBhcmUgZ2VuZXJhdGluZyB5b3VyIEphdmFTY3JpcHQgZnJvbSBzb21lIG90aGVyIHRlbXBsYXRpbmcgZW5naW5lIChub3RcbiAqICAgICAgcmVjb21tZW5kZWQsIGUuZy4gaW4gaXNzdWUgWyM0MDA2XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy80MDA2KSksXG4gKiAgICAgIHJlbWVtYmVyIHRvIGVzY2FwZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiAoYW5kIGJlIGF3YXJlIHRoYXQgeW91IG1pZ2h0IG5lZWQgbW9yZSB0aGFuXG4gKiAgICAgIG9uZSBsZXZlbCBvZiBlc2NhcGluZyBkZXBlbmRpbmcgb24geW91ciB0ZW1wbGF0aW5nIGVuZ2luZSBhbmQgdGhlIHdheSB5b3UgaW50ZXJwb2xhdGVkXG4gKiAgICAgIHRoZSB2YWx1ZS4pICBEbyBtYWtlIHVzZSBvZiB5b3VyIHBsYXRmb3JtJ3MgZXNjYXBpbmcgbWVjaGFuaXNtIGFzIGl0IG1pZ2h0IGJlIGdvb2RcbiAqICAgICAgZW5vdWdoIGJlZm9yZSBjb2RpbmcgeW91ciBvd24uICBFLmcuIFJ1YnkgaGFzXG4gKiAgICAgIFtSZWdleHAuZXNjYXBlKHN0cildKGh0dHA6Ly93d3cucnVieS1kb2Mub3JnL2NvcmUtMi4wLjAvUmVnZXhwLmh0bWwjbWV0aG9kLWMtZXNjYXBlKVxuICogICAgICBhbmQgUHl0aG9uIGhhcyBbcmUuZXNjYXBlXShodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvcmUuaHRtbCNyZS5lc2NhcGUpLlxuICogICAgICBKYXZhc2NyaXB0IGxhY2tzIGEgc2ltaWxhciBidWlsdCBpbiBmdW5jdGlvbiBmb3IgZXNjYXBpbmcuICBUYWtlIGEgbG9vayBhdCBHb29nbGVcbiAqICAgICAgQ2xvc3VyZSBsaWJyYXJ5J3MgW2dvb2cuc3RyaW5nLnJlZ0V4cEVzY2FwZShzKV0oXG4gKiAgICAgIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX3N0cmluZ19zdHJpbmcuanMuc291cmNlLmh0bWwjbGluZTk2MikuXG4gKlxuICogUmVmZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyICRzY2VEZWxlZ2F0ZVByb3ZpZGVyfSBmb3IgYW4gZXhhbXBsZS5cbiAqXG4gKiAjIyBTaG93IG1lIGFuIGV4YW1wbGUgdXNpbmcgU0NFLlxuICpcbiAqIDxleGFtcGxlIG1vZHVsZT1cIm15U2NlQXBwXCIgZGVwcz1cImFuZ3VsYXItc2FuaXRpemUuanNcIiBuYW1lPVwic2NlLXNlcnZpY2VcIj5cbiAqIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgIDxkaXYgbmctY29udHJvbGxlcj1cIkFwcENvbnRyb2xsZXIgYXMgbXlDdHJsXCI+XG4gKiAgICAgPGkgbmctYmluZC1odG1sPVwibXlDdHJsLmV4cGxpY2l0bHlUcnVzdGVkSHRtbFwiIGlkPVwiZXhwbGljaXRseVRydXN0ZWRIdG1sXCI+PC9pPjxicj48YnI+XG4gKiAgICAgPGI+VXNlciBjb21tZW50czwvYj48YnI+XG4gKiAgICAgQnkgZGVmYXVsdCwgSFRNTCB0aGF0IGlzbid0IGV4cGxpY2l0bHkgdHJ1c3RlZCAoZS5nLiBBbGljZSdzIGNvbW1lbnQpIGlzIHNhbml0aXplZCB3aGVuXG4gKiAgICAgJHNhbml0aXplIGlzIGF2YWlsYWJsZS4gIElmICRzYW5pdGl6ZSBpc24ndCBhdmFpbGFibGUsIHRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciBpbnN0ZWFkIG9mIGFuXG4gKiAgICAgZXhwbG9pdC5cbiAqICAgICA8ZGl2IGNsYXNzPVwid2VsbFwiPlxuICogICAgICAgPGRpdiBuZy1yZXBlYXQ9XCJ1c2VyQ29tbWVudCBpbiBteUN0cmwudXNlckNvbW1lbnRzXCI+XG4gKiAgICAgICAgIDxiPnt7dXNlckNvbW1lbnQubmFtZX19PC9iPjpcbiAqICAgICAgICAgPHNwYW4gbmctYmluZC1odG1sPVwidXNlckNvbW1lbnQuaHRtbENvbW1lbnRcIiBjbGFzcz1cImh0bWxDb21tZW50XCI+PC9zcGFuPlxuICogICAgICAgICA8YnI+XG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9kaXY+XG4gKiA8L2ZpbGU+XG4gKlxuICogPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICogICBhbmd1bGFyLm1vZHVsZSgnbXlTY2VBcHAnLCBbJ25nU2FuaXRpemUnXSlcbiAqICAgICAuY29udHJvbGxlcignQXBwQ29udHJvbGxlcicsIFsnJGh0dHAnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJHNjZScsXG4gKiAgICAgICBmdW5jdGlvbiBBcHBDb250cm9sbGVyKCRodHRwLCAkdGVtcGxhdGVDYWNoZSwgJHNjZSkge1xuICogICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gKiAgICAgICAgICRodHRwLmdldCgndGVzdF9kYXRhLmpzb24nLCB7Y2FjaGU6ICR0ZW1wbGF0ZUNhY2hlfSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICogICAgICAgICAgIHNlbGYudXNlckNvbW1lbnRzID0gcmVzcG9uc2UuZGF0YTtcbiAqICAgICAgICAgfSk7XG4gKiAgICAgICAgIHNlbGYuZXhwbGljaXRseVRydXN0ZWRIdG1sID0gJHNjZS50cnVzdEFzSHRtbChcbiAqICAgICAgICAgICAgICc8c3BhbiBvbm1vdXNlb3Zlcj1cInRoaXMudGV4dENvbnRlbnQ9JnF1b3Q7RXhwbGljaXRseSB0cnVzdGVkIEhUTUwgYnlwYXNzZXMgJyArXG4gKiAgICAgICAgICAgICAnc2FuaXRpemF0aW9uLiZxdW90O1wiPkhvdmVyIG92ZXIgdGhpcyB0ZXh0Ljwvc3Bhbj4nKTtcbiAqICAgICAgIH1dKTtcbiAqIDwvZmlsZT5cbiAqXG4gKiA8ZmlsZSBuYW1lPVwidGVzdF9kYXRhLmpzb25cIj5cbiAqIFtcbiAqICAgeyBcIm5hbWVcIjogXCJBbGljZVwiLFxuICogICAgIFwiaHRtbENvbW1lbnRcIjpcbiAqICAgICAgICAgXCI8c3BhbiBvbm1vdXNlb3Zlcj0ndGhpcy50ZXh0Q29udGVudD1cXFwiUFdOM0QhXFxcIic+SXMgPGk+YW55b25lPC9pPiByZWFkaW5nIHRoaXM/PC9zcGFuPlwiXG4gKiAgIH0sXG4gKiAgIHsgXCJuYW1lXCI6IFwiQm9iXCIsXG4gKiAgICAgXCJodG1sQ29tbWVudFwiOiBcIjxpPlllcyE8L2k+ICBBbSBJIHRoZSBvbmx5IG90aGVyIG9uZT9cIlxuICogICB9XG4gKiBdXG4gKiA8L2ZpbGU+XG4gKlxuICogPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICBkZXNjcmliZSgnU0NFIGRvYyBkZW1vJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgaXQoJ3Nob3VsZCBzYW5pdGl6ZSB1bnRydXN0ZWQgdmFsdWVzJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcuaHRtbENvbW1lbnQnKSkuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2lubmVySFRNTCcpKVxuICogICAgICAgICAgIC50b0JlKCc8c3Bhbj5JcyA8aT5hbnlvbmU8L2k+IHJlYWRpbmcgdGhpcz88L3NwYW4+Jyk7XG4gKiAgICAgfSk7XG4gKlxuICogICAgIGl0KCdzaG91bGQgTk9UIHNhbml0aXplIGV4cGxpY2l0bHkgdHJ1c3RlZCB2YWx1ZXMnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdleHBsaWNpdGx5VHJ1c3RlZEh0bWwnKSkuZ2V0QXR0cmlidXRlKCdpbm5lckhUTUwnKSkudG9CZShcbiAqICAgICAgICAgICAnPHNwYW4gb25tb3VzZW92ZXI9XCJ0aGlzLnRleHRDb250ZW50PSZxdW90O0V4cGxpY2l0bHkgdHJ1c3RlZCBIVE1MIGJ5cGFzc2VzICcgK1xuICogICAgICAgICAgICdzYW5pdGl6YXRpb24uJnF1b3Q7XCI+SG92ZXIgb3ZlciB0aGlzIHRleHQuPC9zcGFuPicpO1xuICogICAgIH0pO1xuICogICB9KTtcbiAqIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKlxuICpcbiAqICMjIENhbiBJIGRpc2FibGUgU0NFIGNvbXBsZXRlbHk/XG4gKlxuICogWWVzLCB5b3UgY2FuLiAgSG93ZXZlciwgdGhpcyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZC4gIFNDRSBnaXZlcyB5b3UgYSBsb3Qgb2Ygc2VjdXJpdHkgYmVuZWZpdHNcbiAqIGZvciBsaXR0bGUgY29kaW5nIG92ZXJoZWFkLiAgSXQgd2lsbCBiZSBtdWNoIGhhcmRlciB0byB0YWtlIGFuIFNDRSBkaXNhYmxlZCBhcHBsaWNhdGlvbiBhbmRcbiAqIGVpdGhlciBzZWN1cmUgaXQgb24geW91ciBvd24gb3IgZW5hYmxlIFNDRSBhdCBhIGxhdGVyIHN0YWdlLiAgSXQgbWlnaHQgbWFrZSBzZW5zZSB0byBkaXNhYmxlIFNDRVxuICogZm9yIGNhc2VzIHdoZXJlIHlvdSBoYXZlIGEgbG90IG9mIGV4aXN0aW5nIGNvZGUgdGhhdCB3YXMgd3JpdHRlbiBiZWZvcmUgU0NFIHdhcyBpbnRyb2R1Y2VkIGFuZFxuICogeW91J3JlIG1pZ3JhdGluZyB0aGVtIGEgbW9kdWxlIGF0IGEgdGltZS5cbiAqXG4gKiBUaGF0IHNhaWQsIGhlcmUncyBob3cgeW91IGNhbiBjb21wbGV0ZWx5IGRpc2FibGUgU0NFOlxuICpcbiAqIGBgYFxuICogYW5ndWxhci5tb2R1bGUoJ215QXBwV2l0aFNjZURpc2FibGVkbXlBcHAnLCBbXSkuY29uZmlnKGZ1bmN0aW9uKCRzY2VQcm92aWRlcikge1xuICogICAvLyBDb21wbGV0ZWx5IGRpc2FibGUgU0NFLiAgRm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMgb25seSFcbiAqICAgLy8gRG8gbm90IHVzZSBpbiBuZXcgcHJvamVjdHMuXG4gKiAgICRzY2VQcm92aWRlci5lbmFibGVkKGZhbHNlKTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICovXG5cbmZ1bmN0aW9uICRTY2VQcm92aWRlcigpIHtcbiAgdmFyIGVuYWJsZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRzY2VQcm92aWRlciNlbmFibGVkXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IHZhbHVlIElmIHByb3ZpZGVkLCB0aGVuIGVuYWJsZXMvZGlzYWJsZXMgU0NFLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIFNDRSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFbmFibGVzL2Rpc2FibGVzIFNDRSBhbmQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICovXG4gIHRoaXMuZW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIGVuYWJsZWQgPSAhIXZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZW5hYmxlZDtcbiAgfTtcblxuXG4gIC8qIERlc2lnbiBub3RlcyBvbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgU0NFLlxuICAgKlxuICAgKiBUaGUgQVBJIGNvbnRyYWN0IGZvciB0aGUgU0NFIGRlbGVnYXRlXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogVGhlIFNDRSBkZWxlZ2F0ZSBvYmplY3QgbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgMyBtZXRob2RzOlxuICAgKlxuICAgKiAtIHRydXN0QXMoY29udGV4dEVudW0sIHZhbHVlKVxuICAgKiAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byB0ZWxsIHRoZSBTQ0Ugc2VydmljZSB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBPSyB0byB1c2UgaW4gdGhlXG4gICAqICAgICBjb250ZXh0cyBzcGVjaWZpZWQgYnkgY29udGV4dEVudW0uICBJdCBtdXN0IHJldHVybiBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5XG4gICAqICAgICBnZXRUcnVzdGVkKCkgZm9yIGEgY29tcGF0aWJsZSBjb250ZXh0RW51bSBhbmQgcmV0dXJuIHRoaXMgdmFsdWUuXG4gICAqXG4gICAqIC0gdmFsdWVPZih2YWx1ZSlcbiAgICogICAgIEZvciB2YWx1ZXMgdGhhdCB3ZXJlIG5vdCBwcm9kdWNlZCBieSB0cnVzdEFzKCksIHJldHVybiB0aGVtIGFzIGlzLiAgRm9yIHZhbHVlcyB0aGF0IHdlcmVcbiAgICogICAgIHByb2R1Y2VkIGJ5IHRydXN0QXMoKSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHZhbHVlIHRvIHRydXN0QXMuICBCYXNpY2FsbHksIGlmXG4gICAqICAgICB0cnVzdEFzIGlzIHdyYXBwaW5nIHRoZSBnaXZlbiB2YWx1ZXMgaW50byBzb21lIHR5cGUsIHRoaXMgb3BlcmF0aW9uIHVud3JhcHMgaXQgd2hlbiBnaXZlblxuICAgKiAgICAgc3VjaCBhIHZhbHVlLlxuICAgKlxuICAgKiAtIGdldFRydXN0ZWQoY29udGV4dEVudW0sIHZhbHVlKVxuICAgKiAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byB1c2UgaW4gdGhlIGNvbnRleHQgc3BlY2lmaWVkIGJ5XG4gICAqICAgICBjb250ZXh0RW51bSBvciB0aHJvdyBhbmQgZXhjZXB0aW9uIG90aGVyd2lzZS5cbiAgICpcbiAgICogTk9URTogVGhpcyBjb250cmFjdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1Qgc3RhdGUgdGhhdCB2YWx1ZXMgcmV0dXJuZWQgYnkgdHJ1c3RBcygpIG11c3QgYmVcbiAgICogb3BhcXVlIG9yIHdyYXBwZWQgaW4gc29tZSBob2xkZXIgb2JqZWN0LiAgVGhhdCBoYXBwZW5zIHRvIGJlIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIEZvclxuICAgKiBpbnN0YW5jZSwgYW4gaW1wbGVtZW50YXRpb24gY291bGQgbWFpbnRhaW4gYSByZWdpc3RyeSBvZiBhbGwgdHJ1c3RlZCBvYmplY3RzIGJ5IGNvbnRleHQuICBJblxuICAgKiBzdWNoIGEgY2FzZSwgdHJ1c3RBcygpIHdvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGluLiAgZ2V0VHJ1c3RlZCgpIHdvdWxkXG4gICAqIHJldHVybiB0aGUgc2FtZSBvYmplY3QgcGFzc2VkIGluIGlmIGl0IHdhcyBmb3VuZCBpbiB0aGUgcmVnaXN0cnkgdW5kZXIgYSBjb21wYXRpYmxlIGNvbnRleHQgb3JcbiAgICogdGhyb3cgYW4gZXhjZXB0aW9uIG90aGVyd2lzZS4gIEFuIGltcGxlbWVudGF0aW9uIG1pZ2h0IG9ubHkgd3JhcCB2YWx1ZXMgc29tZSBvZiB0aGUgdGltZSBiYXNlZFxuICAgKiBvbiBzb21lIGNyaXRlcmlhLiAgZ2V0VHJ1c3RlZCgpIG1pZ2h0IHJldHVybiBhIHZhbHVlIGFuZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBzcGVjaWFsXG4gICAqIGNvbnN0YW50cyBvciBvYmplY3RzIGV2ZW4gaWYgbm90IHdyYXBwZWQuICBBbGwgc3VjaCBpbXBsZW1lbnRhdGlvbnMgZnVsZmlsbCB0aGlzIGNvbnRyYWN0LlxuICAgKlxuICAgKlxuICAgKiBBIG5vdGUgb24gdGhlIGluaGVyaXRhbmNlIG1vZGVsIGZvciBTQ0UgY29udGV4dHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEkndmUgdXNlZCBpbmhlcml0YW5jZSBhbmQgbWFkZSBSRVNPVVJDRV9VUkwgd3JhcHBlZCB0eXBlcyBhIHN1YnR5cGUgb2YgVVJMIHdyYXBwZWQgdHlwZXMuICBUaGlzXG4gICAqIGlzIHB1cmVseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgKlxuICAgKiBUaGUgY29udHJhY3QgaXMgc2ltcGx5IHRoaXM6XG4gICAqXG4gICAqICAgICBnZXRUcnVzdGVkKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSkgc3VjY2VlZGluZyBpbXBsaWVzIHRoYXQgZ2V0VHJ1c3RlZCgkc2NlLlVSTCwgdmFsdWUpXG4gICAqICAgICB3aWxsIGFsc28gc3VjY2VlZC5cbiAgICpcbiAgICogSW5oZXJpdGFuY2UgaGFwcGVucyB0byBjYXB0dXJlIHRoaXMgaW4gYSBuYXR1cmFsIHdheS4gIEluIHNvbWUgZnV0dXJlLCB3ZVxuICAgKiBtYXkgbm90IHVzZSBpbmhlcml0YW5jZSBhbnltb3JlLiAgVGhhdCBpcyBPSyBiZWNhdXNlIG5vIGNvZGUgb3V0c2lkZSBvZlxuICAgKiBzY2UuanMgYW5kIHNjZVNwZWNzLmpzIHdvdWxkIG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyBkZXRhaWwuXG4gICAqL1xuXG4gIHRoaXMuJGdldCA9IFsnJHBhcnNlJywgJyRzY2VEZWxlZ2F0ZScsIGZ1bmN0aW9uKFxuICAgICAgICAgICAgICAgICRwYXJzZSwgICAkc2NlRGVsZWdhdGUpIHtcbiAgICAvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHlcbiAgICAvLyBQcmVyZXE6IEVuc3VyZSB0aGF0IHdlJ3JlIG5vdCBydW5uaW5nIGluIElFPDExIHF1aXJrcyBtb2RlLiAgSW4gdGhhdCBtb2RlLCBJRSA8IDExIGFsbG93XG4gICAgLy8gdGhlIFwiZXhwcmVzc2lvbihqYXZhc2NyaXB0IGV4cHJlc3Npb24pXCIgc3ludGF4IHdoaWNoIGlzIGluc2VjdXJlLlxuICAgIGlmIChlbmFibGVkICYmIG1zaWUgPCA4KSB7XG4gICAgICB0aHJvdyAkc2NlTWluRXJyKCdpZXF1aXJrcycsXG4gICAgICAgICdTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyBkb2VzIG5vdCBzdXBwb3J0IEludGVybmV0IEV4cGxvcmVyIHZlcnNpb24gPCAxMSBpbiBxdWlya3MgJyArXG4gICAgICAgICdtb2RlLiAgWW91IGNhbiBmaXggdGhpcyBieSBhZGRpbmcgdGhlIHRleHQgPCFkb2N0eXBlIGh0bWw+IHRvIHRoZSB0b3Agb2YgeW91ciBIVE1MICcgK1xuICAgICAgICAnZG9jdW1lbnQuICBTZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJHNjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgc2NlID0gc2hhbGxvd0NvcHkoU0NFX0NPTlRFWFRTKTtcblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI2lzRW5hYmxlZFxuICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIFNDRSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuICBJZiB5b3Ugd2FudCB0byBzZXQgdGhlIHZhbHVlLCB5b3VcbiAgICAgKiBoYXZlIHRvIGRvIGl0IGF0IG1vZHVsZSBjb25maWcgdGltZSBvbiB7QGxpbmsgbmcuJHNjZVByb3ZpZGVyICRzY2VQcm92aWRlcn0uXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIFNDRSBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIHNjZS5pc0VuYWJsZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBlbmFibGVkO1xuICAgIH07XG4gICAgc2NlLnRydXN0QXMgPSAkc2NlRGVsZWdhdGUudHJ1c3RBcztcbiAgICBzY2UuZ2V0VHJ1c3RlZCA9ICRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkO1xuICAgIHNjZS52YWx1ZU9mID0gJHNjZURlbGVnYXRlLnZhbHVlT2Y7XG5cbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHNjZS50cnVzdEFzID0gc2NlLmdldFRydXN0ZWQgPSBmdW5jdGlvbih0eXBlLCB2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4gICAgICBzY2UudmFsdWVPZiA9IGlkZW50aXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3BhcnNlQXNcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIENvbnZlcnRzIEFuZ3VsYXIge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaW50byBhIGZ1bmN0aW9uLiAgVGhpcyBpcyBsaWtlIHtAbGlua1xuICAgICAqIG5nLiRwYXJzZSAkcGFyc2V9IGFuZCBpcyBpZGVudGljYWwgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBhIGxpdGVyYWwgY29uc3RhbnQuICBPdGhlcndpc2UsIGl0XG4gICAgICogd3JhcHMgdGhlIGV4cHJlc3Npb24gaW4gYSBjYWxsIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWQgJHNjZS5nZXRUcnVzdGVkKCp0eXBlKixcbiAgICAgKiAqcmVzdWx0Kil9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBTQ0UgY29udGV4dCBpbiB3aGljaCB0aGlzIHJlc3VsdCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS5cbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOlxuICAgICAqXG4gICAgICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nc1xuICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLlxuICAgICAqICAgICogYGxvY2Fsc2Ag4oCTIGB7b2JqZWN0PX1gIOKAkyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW5cbiAgICAgKiAgICAgIGBjb250ZXh0YC5cbiAgICAgKi9cbiAgICBzY2UucGFyc2VBcyA9IGZ1bmN0aW9uIHNjZVBhcnNlQXModHlwZSwgZXhwcikge1xuICAgICAgdmFyIHBhcnNlZCA9ICRwYXJzZShleHByKTtcbiAgICAgIGlmIChwYXJzZWQubGl0ZXJhbCAmJiBwYXJzZWQuY29uc3RhbnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAkcGFyc2UoZXhwciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2NlLmdldFRydXN0ZWQodHlwZSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjdHJ1c3RBc1xuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfS4gIEFzIHN1Y2gsXG4gICAgICogcmV0dXJucyBhbiBvYmplY3QgdGhhdCBpcyB0cnVzdGVkIGJ5IGFuZ3VsYXIgZm9yIHVzZSBpbiBzcGVjaWZpZWQgc3RyaWN0IGNvbnRleHR1YWxcbiAgICAgKiBlc2NhcGluZyBjb250ZXh0cyAoc3VjaCBhcyBuZy1iaW5kLWh0bWwsIG5nLWluY2x1ZGUsIGFueSBzcmMgYXR0cmlidXRlXG4gICAgICogaW50ZXJwb2xhdGlvbiwgYW55IGRvbSBldmVudCBiaW5kaW5nIGF0dHJpYnV0ZSBpbnRlcnBvbGF0aW9uIHN1Y2ggYXMgZm9yIG9uY2xpY2ssICBldGMuKVxuICAgICAqIHRoYXQgdXNlcyB0aGUgcHJvdmlkZWQgdmFsdWUuICBTZWUgKiB7QGxpbmsgbmcuJHNjZSAkc2NlfSBmb3IgZW5hYmxpbmcgc3RyaWN0IGNvbnRleHR1YWxcbiAgICAgKiBlc2NhcGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBraW5kIG9mIGNvbnRleHQgaW4gd2hpY2ggdGhpcyB2YWx1ZSBpcyBzYWZlIGZvciB1c2UuICBlLmcuIHVybCxcbiAgICAgKiAgIHJlc291cmNlVXJsLCBodG1sLCBqcyBhbmQgY3NzLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCB0cnVzdGVkL3NhZmUuXG4gICAgICogQHJldHVybnMgeyp9IEEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBzdGFuZCBpbiBmb3IgdGhlIHByb3ZpZGVkIGB2YWx1ZWAgaW4gcGxhY2VzXG4gICAgICogd2hlcmUgQW5ndWxhciBleHBlY3RzIGEgJHNjZS50cnVzdEFzKCkgcmV0dXJuIHZhbHVlLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjdHJ1c3RBc0h0bWxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzSHRtbCh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzKCRzY2UuSFRNTCwgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRydXN0QXMuXG4gICAgICogQHJldHVybnMgeyp9IEFuIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZEh0bWxcbiAgICAgKiAgICAgJHNjZS5nZXRUcnVzdGVkSHRtbCh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzXG4gICAgICogICAgIG9ubHkgYWNjZXB0IGV4cHJlc3Npb25zIHRoYXQgYXJlIGVpdGhlciBsaXRlcmFsIGNvbnN0YW50cyBvciBhcmUgdGhlXG4gICAgICogICAgIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzICRzY2UudHJ1c3RBc30uKVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjdHJ1c3RBc1VybFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnRydXN0QXNVcmwodmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLlVSTCwgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRydXN0QXMuXG4gICAgICogQHJldHVybnMgeyp9IEFuIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFVybFxuICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRVcmwodmFsdWUpfSB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIHZhbHVlLiAgKHByaXZpbGVnZWQgZGlyZWN0aXZlc1xuICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZVxuICAgICAqICAgICByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LilcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNSZXNvdXJjZVVybFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnRydXN0QXNSZXNvdXJjZVVybCh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSlgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJ1c3RBcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkUmVzb3VyY2VVcmxcbiAgICAgKiAgICAgJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodmFsdWUpfSB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIHZhbHVlLiAgKHByaXZpbGVnZWQgZGlyZWN0aXZlc1xuICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZSByZXR1cm5cbiAgICAgKiAgICAgdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LilcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNKc1xuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnRydXN0QXNKcyh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzKCRzY2UuSlMsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0cnVzdEFzLlxuICAgICAqIEByZXR1cm5zIHsqfSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWRKc1xuICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRKcyh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzXG4gICAgICogICAgIG9ubHkgYWNjZXB0IGV4cHJlc3Npb25zIHRoYXQgYXJlIGVpdGhlciBsaXRlcmFsIGNvbnN0YW50cyBvciBhcmUgdGhlXG4gICAgICogICAgIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzICRzY2UudHJ1c3RBc30uKVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWRgfS4gIEFzIHN1Y2gsXG4gICAgICogdGFrZXMgdGhlIHJlc3VsdCBvZiBhIHtAbGluayBuZy4kc2NlI3RydXN0QXMgYCRzY2UudHJ1c3RBc2B9KCkgY2FsbCBhbmQgcmV0dXJucyB0aGVcbiAgICAgKiBvcmlnaW5hbGx5IHN1cHBsaWVkIHZhbHVlIGlmIHRoZSBxdWVyaWVkIGNvbnRleHQgdHlwZSBpcyBhIHN1cGVydHlwZSBvZiB0aGUgY3JlYXRlZCB0eXBlLlxuICAgICAqIElmIHRoaXMgY29uZGl0aW9uIGlzbid0IHNhdGlzZmllZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBraW5kIG9mIGNvbnRleHQgaW4gd2hpY2ggdGhpcyB2YWx1ZSBpcyB0byBiZSB1c2VkLlxuICAgICAqIEBwYXJhbSB7Kn0gbWF5YmVUcnVzdGVkIFRoZSByZXN1bHQgb2YgYSBwcmlvciB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzIGAkc2NlLnRydXN0QXNgfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGUgd2FzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG9cbiAgICAgKiAgICAgICAgICAgICAge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyBgJHNjZS50cnVzdEFzYH0gaWYgdmFsaWQgaW4gdGhpcyBjb250ZXh0LlxuICAgICAqICAgICAgICAgICAgICBPdGhlcndpc2UsIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSNnZXRUcnVzdGVkSHRtbFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRIdG1sKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5IVE1MLCB2YWx1ZSlgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgJHNjZS5nZXRUcnVzdGVkYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBgJHNjZS5nZXRUcnVzdGVkKCRzY2UuSFRNTCwgdmFsdWUpYFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZENzc1xuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRDc3ModmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZCgkc2NlLkNTUywgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLkNTUywgdmFsdWUpYFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZFVybFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRVcmwodmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZCgkc2NlLlVSTCwgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLlVSTCwgdmFsdWUpYFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZGAuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpYFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZEpzXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UuZ2V0VHJ1c3RlZEpzKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5KUywgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLkpTLCB2YWx1ZSlgXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzSHRtbFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnBhcnNlQXNIdG1sKGV4cHJlc3Npb24gc3RyaW5nKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLkhUTUwsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLlxuICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246XG4gICAgICpcbiAgICAgKiAgICAqIGBjb250ZXh0YCDigJMgYHtvYmplY3R9YCDigJMgYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzXG4gICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuXG4gICAgICogICAgKiBgbG9jYWxzYCDigJMgYHtvYmplY3Q9fWAg4oCTIGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpblxuICAgICAqICAgICAgYGNvbnRleHRgLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc0Nzc1xuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnBhcnNlQXNDc3ModmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2UjcGFyc2VBcyBgJHNjZS5wYXJzZUFzKCRzY2UuQ1NTLCB2YWx1ZSlgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS5cbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOlxuICAgICAqXG4gICAgICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nc1xuICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLlxuICAgICAqICAgICogYGxvY2Fsc2Ag4oCTIGB7b2JqZWN0PX1gIOKAkyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW5cbiAgICAgKiAgICAgIGBjb250ZXh0YC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3BhcnNlQXNVcmxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzVXJsKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLlVSTCwgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjpcbiAgICAgKlxuICAgICAqICAgICogYGNvbnRleHRgIOKAkyBge29iamVjdH1gIOKAkyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3NcbiAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS5cbiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluXG4gICAgICogICAgICBgY29udGV4dGAuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzUmVzb3VyY2VVcmxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzUmVzb3VyY2VVcmwodmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2UjcGFyc2VBcyBgJHNjZS5wYXJzZUFzKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSlgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS5cbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOlxuICAgICAqXG4gICAgICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nc1xuICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLlxuICAgICAqICAgICogYGxvY2Fsc2Ag4oCTIGB7b2JqZWN0PX1gIOKAkyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW5cbiAgICAgKiAgICAgIGBjb250ZXh0YC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3BhcnNlQXNKc1xuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnBhcnNlQXNKcyh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5KUywgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjpcbiAgICAgKlxuICAgICAqICAgICogYGNvbnRleHRgIOKAkyBge29iamVjdH1gIOKAkyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3NcbiAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS5cbiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluXG4gICAgICogICAgICBgY29udGV4dGAuXG4gICAgICovXG5cbiAgICAvLyBTaG9ydGhhbmQgZGVsZWdhdGlvbnMuXG4gICAgdmFyIHBhcnNlID0gc2NlLnBhcnNlQXMsXG4gICAgICAgIGdldFRydXN0ZWQgPSBzY2UuZ2V0VHJ1c3RlZCxcbiAgICAgICAgdHJ1c3RBcyA9IHNjZS50cnVzdEFzO1xuXG4gICAgZm9yRWFjaChTQ0VfQ09OVEVYVFMsIGZ1bmN0aW9uKGVudW1WYWx1ZSwgbmFtZSkge1xuICAgICAgdmFyIGxOYW1lID0gbG93ZXJjYXNlKG5hbWUpO1xuICAgICAgc2NlW3NuYWtlVG9DYW1lbCgncGFyc2VfYXNfJyArIGxOYW1lKV0gPSBmdW5jdGlvbihleHByKSB7XG4gICAgICAgIHJldHVybiBwYXJzZShlbnVtVmFsdWUsIGV4cHIpO1xuICAgICAgfTtcbiAgICAgIHNjZVtzbmFrZVRvQ2FtZWwoJ2dldF90cnVzdGVkXycgKyBsTmFtZSldID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGdldFRydXN0ZWQoZW51bVZhbHVlLCB2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgc2NlW3NuYWtlVG9DYW1lbCgndHJ1c3RfYXNfJyArIGxOYW1lKV0gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1c3RBcyhlbnVtVmFsdWUsIHZhbHVlKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NlO1xuICB9XTtcbn1cblxuLyogZXhwb3J0ZWQgJFNuaWZmZXJQcm92aWRlciAqL1xuXG4vKipcbiAqICEhISBUaGlzIGlzIGFuIHVuZG9jdW1lbnRlZCBcInByaXZhdGVcIiBzZXJ2aWNlICEhIVxuICpcbiAqIEBuYW1lICRzbmlmZmVyXG4gKiBAcmVxdWlyZXMgJHdpbmRvd1xuICogQHJlcXVpcmVzICRkb2N1bWVudFxuICogQHRoaXNcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhpc3RvcnkgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IGh0bWw1IGhpc3RvcnkgYXBpID9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHJhbnNpdGlvbnMgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IENTUyB0cmFuc2l0aW9uIGV2ZW50cyA/XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFuaW1hdGlvbnMgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IENTUyBhbmltYXRpb24gZXZlbnRzID9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgaXMgdmVyeSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGVzdGluZyBicm93c2VyJ3MgZmVhdHVyZXMuXG4gKi9cbmZ1bmN0aW9uICRTbmlmZmVyUHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckZG9jdW1lbnQnLCBmdW5jdGlvbigkd2luZG93LCAkZG9jdW1lbnQpIHtcbiAgICB2YXIgZXZlbnRTdXBwb3J0ID0ge30sXG4gICAgICAgIC8vIENocm9tZSBQYWNrYWdlZCBBcHBzIGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgYGhpc3RvcnkucHVzaFN0YXRlYC5cbiAgICAgICAgLy8gSWYgbm90IHNhbmRib3hlZCwgdGhleSBjYW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIGBjaHJvbWUuYXBwLnJ1bnRpbWVgXG4gICAgICAgIC8vIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9hcHBzL2FwaV9pbmRleCkuIElmIHNhbmRib3hlZCwgdGhleSBjYW4gYmUgZGV0ZWN0ZWQgYnlcbiAgICAgICAgLy8gdGhlIHByZXNlbmNlIG9mIGFuIGV4dGVuc2lvbiBydW50aW1lIElEIGFuZCB0aGUgYWJzZW5jZSBvZiBvdGhlciBDaHJvbWUgcnVudGltZSBBUElzXG4gICAgICAgIC8vIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9hcHBzL21hbmlmZXN0L3NhbmRib3gpLlxuICAgICAgICBpc0Nocm9tZVBhY2thZ2VkQXBwID1cbiAgICAgICAgICAgICR3aW5kb3cuY2hyb21lICYmXG4gICAgICAgICAgICAoJHdpbmRvdy5jaHJvbWUuYXBwICYmICR3aW5kb3cuY2hyb21lLmFwcC5ydW50aW1lIHx8XG4gICAgICAgICAgICAgICAgISR3aW5kb3cuY2hyb21lLmFwcCAmJiAkd2luZG93LmNocm9tZS5ydW50aW1lICYmICR3aW5kb3cuY2hyb21lLnJ1bnRpbWUuaWQpLFxuICAgICAgICBoYXNIaXN0b3J5UHVzaFN0YXRlID0gIWlzQ2hyb21lUGFja2FnZWRBcHAgJiYgJHdpbmRvdy5oaXN0b3J5ICYmICR3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUsXG4gICAgICAgIGFuZHJvaWQgPVxuICAgICAgICAgIHRvSW50KCgvYW5kcm9pZCAoXFxkKykvLmV4ZWMobG93ZXJjYXNlKCgkd2luZG93Lm5hdmlnYXRvciB8fCB7fSkudXNlckFnZW50KSkgfHwgW10pWzFdKSxcbiAgICAgICAgYm94ZWUgPSAvQm94ZWUvaS50ZXN0KCgkd2luZG93Lm5hdmlnYXRvciB8fCB7fSkudXNlckFnZW50KSxcbiAgICAgICAgZG9jdW1lbnQgPSAkZG9jdW1lbnRbMF0gfHwge30sXG4gICAgICAgIGJvZHlTdHlsZSA9IGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5zdHlsZSxcbiAgICAgICAgdHJhbnNpdGlvbnMgPSBmYWxzZSxcbiAgICAgICAgYW5pbWF0aW9ucyA9IGZhbHNlO1xuXG4gICAgaWYgKGJvZHlTdHlsZSkge1xuICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCA8NSwgQmxhY2tiZXJyeSBCcm93c2VyIDEwLCBkZWZhdWx0IENocm9tZSBpbiBBbmRyb2lkIDQuNC54XG4gICAgICAvLyBNZW50aW9uZWQgYnJvd3NlcnMgbmVlZCBhIC13ZWJraXQtIHByZWZpeCBmb3IgdHJhbnNpdGlvbnMgJiBhbmltYXRpb25zLlxuICAgICAgdHJhbnNpdGlvbnMgPSAhISgndHJhbnNpdGlvbicgaW4gYm9keVN0eWxlIHx8ICd3ZWJraXRUcmFuc2l0aW9uJyBpbiBib2R5U3R5bGUpO1xuICAgICAgYW5pbWF0aW9ucyA9ICEhKCdhbmltYXRpb24nIGluIGJvZHlTdHlsZSB8fCAnd2Via2l0QW5pbWF0aW9uJyBpbiBib2R5U3R5bGUpO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEFuZHJvaWQgaGFzIGhpc3RvcnkucHVzaFN0YXRlLCBidXQgaXQgZG9lcyBub3QgdXBkYXRlIGxvY2F0aW9uIGNvcnJlY3RseVxuICAgICAgLy8gc28gbGV0J3Mgbm90IHVzZSB0aGUgaGlzdG9yeSBBUEkgYXQgYWxsLlxuICAgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0xNzQ3MVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvOTA0XG5cbiAgICAgIC8vIG9sZGVyIHdlYmtpdCBicm93c2VyICg1MzMuOSkgb24gQm94ZWUgYm94IGhhcyBleGFjdGx5IHRoZSBzYW1lIHByb2JsZW0gYXMgQW5kcm9pZCBoYXNcbiAgICAgIC8vIHNvIGxldCdzIG5vdCB1c2UgdGhlIGhpc3RvcnkgQVBJIGFsc29cbiAgICAgIC8vIFdlIGFyZSBwdXJwb3NlZnVsbHkgdXNpbmcgYCEoYW5kcm9pZCA8IDQpYCB0byBjb3ZlciB0aGUgY2FzZSB3aGVuIGBhbmRyb2lkYCBpcyB1bmRlZmluZWRcbiAgICAgIGhpc3Rvcnk6ICEhKGhhc0hpc3RvcnlQdXNoU3RhdGUgJiYgIShhbmRyb2lkIDwgNCkgJiYgIWJveGVlKSxcbiAgICAgIGhhc0V2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHlcbiAgICAgICAgLy8gSUU5IGltcGxlbWVudHMgJ2lucHV0JyBldmVudCBpdCdzIHNvIGZ1YmFyZWQgdGhhdCB3ZSByYXRoZXIgcHJldGVuZCB0aGF0IGl0IGRvZXNuJ3QgaGF2ZVxuICAgICAgICAvLyBpdC4gSW4gcGFydGljdWxhciB0aGUgZXZlbnQgaXMgbm90IGZpcmVkIHdoZW4gYmFja3NwYWNlIG9yIGRlbGV0ZSBrZXkgYXJlIHByZXNzZWQgb3JcbiAgICAgICAgLy8gd2hlbiBjdXQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC5cbiAgICAgICAgLy8gSUUxMCsgaW1wbGVtZW50cyAnaW5wdXQnIGV2ZW50IGJ1dCBpdCBlcnJvbmVvdXNseSBmaXJlcyB1bmRlciB2YXJpb3VzIHNpdHVhdGlvbnMsXG4gICAgICAgIC8vIGUuZy4gd2hlbiBwbGFjZWhvbGRlciBjaGFuZ2VzLCBvciBhIGZvcm0gaXMgZm9jdXNlZC5cbiAgICAgICAgaWYgKGV2ZW50ID09PSAnaW5wdXQnICYmIG1zaWUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoaXNVbmRlZmluZWQoZXZlbnRTdXBwb3J0W2V2ZW50XSkpIHtcbiAgICAgICAgICB2YXIgZGl2RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgZXZlbnRTdXBwb3J0W2V2ZW50XSA9ICdvbicgKyBldmVudCBpbiBkaXZFbG07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXZlbnRTdXBwb3J0W2V2ZW50XTtcbiAgICAgIH0sXG4gICAgICBjc3A6IGNzcCgpLFxuICAgICAgdHJhbnNpdGlvbnM6IHRyYW5zaXRpb25zLFxuICAgICAgYW5pbWF0aW9uczogYW5pbWF0aW9ucyxcbiAgICAgIGFuZHJvaWQ6IGFuZHJvaWRcbiAgICB9O1xuICB9XTtcbn1cblxudmFyICR0ZW1wbGF0ZVJlcXVlc3RNaW5FcnIgPSBtaW5FcnIoJyRjb21waWxlJyk7XG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkdGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2VkIHRvIGNvbmZpZ3VyZSB0aGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHtAbGluayAkaHR0cH0gc2VydmljZSB3aGVuIG1ha2luZyBhIHRlbXBsYXRlIHJlcXVlc3QuXG4gKlxuICogRm9yIGV4YW1wbGUsIGl0IGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBcIkFjY2VwdFwiIGhlYWRlciB0aGF0IGlzIHNlbnQgdG8gdGhlIHNlcnZlciwgd2hlblxuICogcmVxdWVzdGluZyBhIHRlbXBsYXRlLlxuICovXG5mdW5jdGlvbiAkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIoKSB7XG5cbiAgdmFyIGh0dHBPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICR0ZW1wbGF0ZVJlcXVlc3RQcm92aWRlciNodHRwT3B0aW9uc1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgJGh0dHB9IHNlcnZpY2Ugd2hlbiBtYWtpbmcgdGhlIHJlcXVlc3QuXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgdG8gb3ZlcnJpZGUgb3B0aW9ucyBzdWNoIGFzIHRoZSBcIkFjY2VwdFwiIGhlYWRlciBmb3IgdGVtcGxhdGUgcmVxdWVzdHMuXG4gICAqXG4gICAqIFRoZSB7QGxpbmsgJHRlbXBsYXRlUmVxdWVzdH0gd2lsbCBzZXQgdGhlIGBjYWNoZWAgYW5kIHRoZSBgdHJhbnNmb3JtUmVzcG9uc2VgIHByb3BlcnRpZXMgb2YgdGhlXG4gICAqIG9wdGlvbnMgaWYgbm90IG92ZXJyaWRkZW4gaGVyZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc9fSB2YWx1ZSBuZXcgdmFsdWUgZm9yIHRoZSB7QGxpbmsgJGh0dHB9IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8c2VsZn0gUmV0dXJucyB0aGUge0BsaW5rICRodHRwfSBvcHRpb25zIHdoZW4gdXNlZCBhcyBnZXR0ZXIgYW5kIHNlbGYgaWYgdXNlZCBhcyBzZXR0ZXIuXG4gICAqL1xuICB0aGlzLmh0dHBPcHRpb25zID0gZnVuY3Rpb24odmFsKSB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgaHR0cE9wdGlvbnMgPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGh0dHBPcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAbmdkb2Mgc2VydmljZVxuICAgKiBAbmFtZSAkdGVtcGxhdGVSZXF1ZXN0XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgYCR0ZW1wbGF0ZVJlcXVlc3RgIHNlcnZpY2UgcnVucyBzZWN1cml0eSBjaGVja3MgdGhlbiBkb3dubG9hZHMgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIHVzaW5nXG4gICAqIGAkaHR0cGAgYW5kLCB1cG9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgY29udGVudHMgaW5zaWRlIG9mIGAkdGVtcGxhdGVDYWNoZWAuIElmIHRoZSBIVFRQIHJlcXVlc3RcbiAgICogZmFpbHMgb3IgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdGhlIEhUVFAgcmVxdWVzdCBpcyBlbXB0eSwgYSBgJGNvbXBpbGVgIGVycm9yIHdpbGwgYmUgdGhyb3duICh0aGVcbiAgICogZXhjZXB0aW9uIGNhbiBiZSB0aHdhcnRlZCBieSBzZXR0aW5nIHRoZSAybmQgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiB0byB0cnVlKS4gTm90ZSB0aGF0IHRoZVxuICAgKiBjb250ZW50cyBvZiBgJHRlbXBsYXRlQ2FjaGVgIGFyZSB0cnVzdGVkLCBzbyB0aGUgY2FsbCB0byBgJHNjZS5nZXRUcnVzdGVkVXJsKHRwbClgIGlzIG9taXR0ZWRcbiAgICogd2hlbiBgdHBsYCBpcyBvZiB0eXBlIHN0cmluZyBhbmQgYCR0ZW1wbGF0ZUNhY2hlYCBoYXMgdGhlIG1hdGNoaW5nIGVudHJ5LlxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCB0byBwYXNzIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBgJGh0dHBgIHNlcnZpY2UsIHN1Y2ggYXMgc2V0dGluZyB0aGUgQWNjZXB0IGhlYWRlciB5b3VcbiAgICogY2FuIGNvbmZpZ3VyZSB0aGlzIHZpYSB7QGxpbmsgJHRlbXBsYXRlUmVxdWVzdFByb3ZpZGVyI2h0dHBPcHRpb25zfS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8VHJ1c3RlZFJlc291cmNlVXJsfSB0cGwgVGhlIEhUVFAgcmVxdWVzdCB0ZW1wbGF0ZSBVUkxcbiAgICogQHBhcmFtIHtib29sZWFuPX0gaWdub3JlUmVxdWVzdEVycm9yIFdoZXRoZXIgb3Igbm90IHRvIGlnbm9yZSB0aGUgZXhjZXB0aW9uIHdoZW4gdGhlIHJlcXVlc3QgZmFpbHMgb3IgdGhlIHRlbXBsYXRlIGlzIGVtcHR5XG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSBmb3IgdGhlIEhUVFAgcmVzcG9uc2UgZGF0YSBvZiB0aGUgZ2l2ZW4gVVJMLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gdG90YWxQZW5kaW5nUmVxdWVzdHMgdG90YWwgYW1vdW50IG9mIHBlbmRpbmcgdGVtcGxhdGUgcmVxdWVzdHMgYmVpbmcgZG93bmxvYWRlZC5cbiAgICovXG4gIHRoaXMuJGdldCA9IFsnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJGh0dHAnLCAnJHEnLCAnJHNjZScsXG4gICAgZnVuY3Rpb24oJGV4Y2VwdGlvbkhhbmRsZXIsICR0ZW1wbGF0ZUNhY2hlLCAkaHR0cCwgJHEsICRzY2UpIHtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdEZuKHRwbCwgaWdub3JlUmVxdWVzdEVycm9yKSB7XG4gICAgICAgIGhhbmRsZVJlcXVlc3RGbi50b3RhbFBlbmRpbmdSZXF1ZXN0cysrO1xuXG4gICAgICAgIC8vIFdlIGNvbnNpZGVyIHRoZSB0ZW1wbGF0ZSBjYWNoZSBob2xkcyBvbmx5IHRydXN0ZWQgdGVtcGxhdGVzLCBzb1xuICAgICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gZ28gdGhyb3VnaCB3aGl0ZWxpc3RpbmcgYWdhaW4gZm9yIGtleXMgdGhhdCBhbHJlYWR5XG4gICAgICAgIC8vIGFyZSBpbmNsdWRlZCBpbiB0aGVyZS4gVGhpcyBhbHNvIG1ha2VzIEFuZ3VsYXIgYWNjZXB0IGFueSBzY3JpcHRcbiAgICAgICAgLy8gZGlyZWN0aXZlLCBubyBtYXR0ZXIgaXRzIG5hbWUuIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gdW53cmFwIHRydXN0ZWRcbiAgICAgICAgLy8gdHlwZXMuXG4gICAgICAgIGlmICghaXNTdHJpbmcodHBsKSB8fCBpc1VuZGVmaW5lZCgkdGVtcGxhdGVDYWNoZS5nZXQodHBsKSkpIHtcbiAgICAgICAgICB0cGwgPSAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh0cGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybVJlc3BvbnNlID0gJGh0dHAuZGVmYXVsdHMgJiYgJGh0dHAuZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2U7XG5cbiAgICAgICAgaWYgKGlzQXJyYXkodHJhbnNmb3JtUmVzcG9uc2UpKSB7XG4gICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2UgPSB0cmFuc2Zvcm1SZXNwb25zZS5maWx0ZXIoZnVuY3Rpb24odHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lciAhPT0gZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1SZXNwb25zZSA9PT0gZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybSkge1xuICAgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAkaHR0cC5nZXQodHBsLCBleHRlbmQoe1xuICAgICAgICAgICAgY2FjaGU6ICR0ZW1wbGF0ZUNhY2hlLFxuICAgICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IHRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICAgfSwgaHR0cE9wdGlvbnMpKVxuICAgICAgICAgIC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdEZuLnRvdGFsUGVuZGluZ1JlcXVlc3RzLS07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgJHRlbXBsYXRlQ2FjaGUucHV0KHRwbCwgcmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICB9LCBoYW5kbGVFcnJvcik7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRXJyb3IocmVzcCkge1xuICAgICAgICAgIGlmICghaWdub3JlUmVxdWVzdEVycm9yKSB7XG4gICAgICAgICAgICByZXNwID0gJHRlbXBsYXRlUmVxdWVzdE1pbkVycigndHBsb2FkJyxcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGU6IHswfSAoSFRUUCBzdGF0dXM6IHsxfSB7Mn0pJyxcbiAgICAgICAgICAgICAgICB0cGwsIHJlc3Auc3RhdHVzLCByZXNwLnN0YXR1c1RleHQpO1xuXG4gICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihyZXNwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gJHEucmVqZWN0KHJlc3ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZVJlcXVlc3RGbi50b3RhbFBlbmRpbmdSZXF1ZXN0cyA9IDA7XG5cbiAgICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0Rm47XG4gICAgfVxuICBdO1xufVxuXG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICQkVGVzdGFiaWxpdHlQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRsb2NhdGlvbicsXG4gICAgICAgZnVuY3Rpb24oJHJvb3RTY29wZSwgICAkYnJvd3NlciwgICAkbG9jYXRpb24pIHtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lICR0ZXN0YWJpbGl0eVxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogVGhlIHByaXZhdGUgJCR0ZXN0YWJpbGl0eSBzZXJ2aWNlIHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiBtZXRob2RzIGZvciB1c2Ugd2hlbiBkZWJ1Z2dpbmdcbiAgICAgKiBvciBieSBhdXRvbWF0ZWQgdGVzdCBhbmQgZGVidWdnaW5nIHRvb2xzLlxuICAgICAqL1xuICAgIHZhciB0ZXN0YWJpbGl0eSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSNmaW5kQmluZGluZ3NcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgYm91bmQgKHZpYSBuZy1iaW5kIG9yIHt7fX0pXG4gICAgICogdG8gZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhlIGlucHV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHJvb3QgdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF9leGFjdE1hdGNoIElmIHRydWUsIG9ubHkgcmV0dXJucyBleGFjdCBtYXRjaGVzXG4gICAgICogICAgIGZvciB0aGUgZXhwcmVzc2lvbi4gRmlsdGVycyBhbmQgd2hpdGVzcGFjZSBhcmUgaWdub3JlZC5cbiAgICAgKi9cbiAgICB0ZXN0YWJpbGl0eS5maW5kQmluZGluZ3MgPSBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBvcHRfZXhhY3RNYXRjaCkge1xuICAgICAgdmFyIGJpbmRpbmdzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZy1iaW5kaW5nJyk7XG4gICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykge1xuICAgICAgICB2YXIgZGF0YUJpbmRpbmcgPSBhbmd1bGFyLmVsZW1lbnQoYmluZGluZykuZGF0YSgnJGJpbmRpbmcnKTtcbiAgICAgICAgaWYgKGRhdGFCaW5kaW5nKSB7XG4gICAgICAgICAgZm9yRWFjaChkYXRhQmluZGluZywgZnVuY3Rpb24oYmluZGluZ05hbWUpIHtcbiAgICAgICAgICAgIGlmIChvcHRfZXhhY3RNYXRjaCkge1xuICAgICAgICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoJyhefFxcXFxzKScgKyBlc2NhcGVGb3JSZWdleHAoZXhwcmVzc2lvbikgKyAnKFxcXFxzfFxcXFx8fCQpJyk7XG4gICAgICAgICAgICAgIGlmIChtYXRjaGVyLnRlc3QoYmluZGluZ05hbWUpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGJpbmRpbmcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoYmluZGluZ05hbWUuaW5kZXhPZihleHByZXNzaW9uKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goYmluZGluZyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSNmaW5kTW9kZWxzXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHR3by13YXkgZm91bmQgdmlhIG5nLW1vZGVsIHRvXG4gICAgICogZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhlIGlucHV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHJvb3QgdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIG1vZGVsIGV4cHJlc3Npb24gdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRfZXhhY3RNYXRjaCBJZiB0cnVlLCBvbmx5IHJldHVybnMgZXhhY3QgbWF0Y2hlc1xuICAgICAqICAgICBmb3IgdGhlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgdGVzdGFiaWxpdHkuZmluZE1vZGVscyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIG9wdF9leGFjdE1hdGNoKSB7XG4gICAgICB2YXIgcHJlZml4ZXMgPSBbJ25nLScsICdkYXRhLW5nLScsICduZ1xcXFw6J107XG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHByZWZpeGVzLmxlbmd0aDsgKytwKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVFcXVhbHMgPSBvcHRfZXhhY3RNYXRjaCA/ICc9JyA6ICcqPSc7XG4gICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIHByZWZpeGVzW3BdICsgJ21vZGVsJyArIGF0dHJpYnV0ZUVxdWFscyArICdcIicgKyBleHByZXNzaW9uICsgJ1wiXSc7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSNnZXRMb2NhdGlvblxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRjdXQgZm9yIGdldHRpbmcgdGhlIGxvY2F0aW9uIGluIGEgYnJvd3NlciBhZ25vc3RpYyB3YXkuIFJldHVybnNcbiAgICAgKiAgICAgdGhlIHBhdGgsIHNlYXJjaCwgYW5kIGhhc2guIChlLmcuIC9wYXRoP2E9YiNoYXNoKVxuICAgICAqL1xuICAgIHRlc3RhYmlsaXR5LmdldExvY2F0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gJGxvY2F0aW9uLnVybCgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I3NldExvY2F0aW9uXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGN1dCBmb3IgbmF2aWdhdGluZyB0byBhIGxvY2F0aW9uIHdpdGhvdXQgZG9pbmcgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgbG9jYXRpb24gdXJsIChwYXRoLCBzZWFyY2ggYW5kIGhhc2gsXG4gICAgICogICAgIGUuZy4gL3BhdGg/YT1iI2hhc2gpIHRvIGdvIHRvLlxuICAgICAqL1xuICAgIHRlc3RhYmlsaXR5LnNldExvY2F0aW9uID0gZnVuY3Rpb24odXJsKSB7XG4gICAgICBpZiAodXJsICE9PSAkbG9jYXRpb24udXJsKCkpIHtcbiAgICAgICAgJGxvY2F0aW9uLnVybCh1cmwpO1xuICAgICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSN3aGVuU3RhYmxlXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBDYWxscyB0aGUgY2FsbGJhY2sgd2hlbiAkdGltZW91dCBhbmQgJGh0dHAgcmVxdWVzdHMgYXJlIGNvbXBsZXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgdGVzdGFiaWxpdHkud2hlblN0YWJsZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAkYnJvd3Nlci5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzKGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRlc3RhYmlsaXR5O1xuICB9XTtcbn1cblxuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkVGltZW91dFByb3ZpZGVyKCkge1xuICB0aGlzLiRnZXQgPSBbJyRyb290U2NvcGUnLCAnJGJyb3dzZXInLCAnJHEnLCAnJCRxJywgJyRleGNlcHRpb25IYW5kbGVyJyxcbiAgICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAgICRicm93c2VyLCAgICRxLCAgICQkcSwgICAkZXhjZXB0aW9uSGFuZGxlcikge1xuXG4gICAgdmFyIGRlZmVycmVkcyA9IHt9O1xuXG5cbiAgICAgLyoqXG4gICAgICAqIEBuZ2RvYyBzZXJ2aWNlXG4gICAgICAqIEBuYW1lICR0aW1lb3V0XG4gICAgICAqXG4gICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgKiBBbmd1bGFyJ3Mgd3JhcHBlciBmb3IgYHdpbmRvdy5zZXRUaW1lb3V0YC4gVGhlIGBmbmAgZnVuY3Rpb24gaXMgd3JhcHBlZCBpbnRvIGEgdHJ5L2NhdGNoXG4gICAgICAqIGJsb2NrIGFuZCBkZWxlZ2F0ZXMgYW55IGV4Y2VwdGlvbnMgdG9cbiAgICAgICoge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLlxuICAgICAgKlxuICAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIGNhbGxpbmcgYCR0aW1lb3V0YCBpcyBhIHByb21pc2UsIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2hlblxuICAgICAgKiB0aGUgZGVsYXkgaGFzIHBhc3NlZCBhbmQgdGhlIHRpbWVvdXQgZnVuY3Rpb24sIGlmIHByb3ZpZGVkLCBpcyBleGVjdXRlZC5cbiAgICAgICpcbiAgICAgICogVG8gY2FuY2VsIGEgdGltZW91dCByZXF1ZXN0LCBjYWxsIGAkdGltZW91dC5jYW5jZWwocHJvbWlzZSlgLlxuICAgICAgKlxuICAgICAgKiBJbiB0ZXN0cyB5b3UgY2FuIHVzZSB7QGxpbmsgbmdNb2NrLiR0aW1lb3V0IGAkdGltZW91dC5mbHVzaCgpYH0gdG9cbiAgICAgICogc3luY2hyb25vdXNseSBmbHVzaCB0aGUgcXVldWUgb2YgZGVmZXJyZWQgZnVuY3Rpb25zLlxuICAgICAgKlxuICAgICAgKiBJZiB5b3Ugb25seSB3YW50IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgYWZ0ZXIgc29tZSBzcGVjaWZpZWQgZGVsYXlcbiAgICAgICogdGhlbiB5b3UgY2FuIGNhbGwgYCR0aW1lb3V0YCB3aXRob3V0IHRoZSBgZm5gIGZ1bmN0aW9uLlxuICAgICAgKlxuICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk9fSBmbiBBIGZ1bmN0aW9uLCB3aG9zZSBleGVjdXRpb24gc2hvdWxkIGJlIGRlbGF5ZWQuXG4gICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gW2RlbGF5PTBdIERlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICAgICogQHBhcmFtIHtib29sZWFuPX0gW2ludm9rZUFwcGx5PXRydWVdIElmIHNldCB0byBgZmFsc2VgIHNraXBzIG1vZGVsIGRpcnR5IGNoZWNraW5nLCBvdGhlcndpc2VcbiAgICAgICogICB3aWxsIGludm9rZSBgZm5gIHdpdGhpbiB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5ICRhcHBseX0gYmxvY2suXG4gICAgICAqIEBwYXJhbSB7Li4uKj19IFBhc3MgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBleGVjdXRlZCBmdW5jdGlvbi5cbiAgICAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4gVGhlIHByb21pc2VcbiAgICAgICogICB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYGZuYCBmdW5jdGlvbi5cbiAgICAgICpcbiAgICAgICovXG4gICAgZnVuY3Rpb24gdGltZW91dChmbiwgZGVsYXksIGludm9rZUFwcGx5KSB7XG4gICAgICBpZiAoIWlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAgIGludm9rZUFwcGx5ID0gZGVsYXk7XG4gICAgICAgIGRlbGF5ID0gZm47XG4gICAgICAgIGZuID0gbm9vcDtcbiAgICAgIH1cblxuICAgICAgdmFyIGFyZ3MgPSBzbGljZUFyZ3MoYXJndW1lbnRzLCAzKSxcbiAgICAgICAgICBza2lwQXBwbHkgPSAoaXNEZWZpbmVkKGludm9rZUFwcGx5KSAmJiAhaW52b2tlQXBwbHkpLFxuICAgICAgICAgIGRlZmVycmVkID0gKHNraXBBcHBseSA/ICQkcSA6ICRxKS5kZWZlcigpLFxuICAgICAgICAgIHByb21pc2UgPSBkZWZlcnJlZC5wcm9taXNlLFxuICAgICAgICAgIHRpbWVvdXRJZDtcblxuICAgICAgdGltZW91dElkID0gJGJyb3dzZXIuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShmbi5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZSk7XG4gICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZGVsZXRlIGRlZmVycmVkc1twcm9taXNlLiQkdGltZW91dElkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2tpcEFwcGx5KSAkcm9vdFNjb3BlLiRhcHBseSgpO1xuICAgICAgfSwgZGVsYXkpO1xuXG4gICAgICBwcm9taXNlLiQkdGltZW91dElkID0gdGltZW91dElkO1xuICAgICAgZGVmZXJyZWRzW3RpbWVvdXRJZF0gPSBkZWZlcnJlZDtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG5cbiAgICAgLyoqXG4gICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICogQG5hbWUgJHRpbWVvdXQjY2FuY2VsXG4gICAgICAqXG4gICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgKiBDYW5jZWxzIGEgdGFzayBhc3NvY2lhdGVkIHdpdGggdGhlIGBwcm9taXNlYC4gQXMgYSByZXN1bHQgb2YgdGhpcywgdGhlIHByb21pc2Ugd2lsbCBiZVxuICAgICAgKiByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLlxuICAgICAgKlxuICAgICAgKiBAcGFyYW0ge1Byb21pc2U9fSBwcm9taXNlIFByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGAkdGltZW91dGAgZnVuY3Rpb24uXG4gICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdGFzayBoYXNuJ3QgZXhlY3V0ZWQgeWV0IGFuZCB3YXMgc3VjY2Vzc2Z1bGx5XG4gICAgICAqICAgY2FuY2VsZWQuXG4gICAgICAqL1xuICAgIHRpbWVvdXQuY2FuY2VsID0gZnVuY3Rpb24ocHJvbWlzZSkge1xuICAgICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS4kJHRpbWVvdXRJZCBpbiBkZWZlcnJlZHMpIHtcbiAgICAgICAgLy8gVGltZW91dCBjYW5jZWxzIHNob3VsZCBub3QgcmVwb3J0IGFuIHVuaGFuZGxlZCBwcm9taXNlLlxuICAgICAgICBkZWZlcnJlZHNbcHJvbWlzZS4kJHRpbWVvdXRJZF0ucHJvbWlzZS5jYXRjaChub29wKTtcbiAgICAgICAgZGVmZXJyZWRzW3Byb21pc2UuJCR0aW1lb3V0SWRdLnJlamVjdCgnY2FuY2VsZWQnKTtcbiAgICAgICAgZGVsZXRlIGRlZmVycmVkc1twcm9taXNlLiQkdGltZW91dElkXTtcbiAgICAgICAgcmV0dXJuICRicm93c2VyLmRlZmVyLmNhbmNlbChwcm9taXNlLiQkdGltZW91dElkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1dO1xufVxuXG4vLyBOT1RFOiAgVGhlIHVzYWdlIG9mIHdpbmRvdyBhbmQgZG9jdW1lbnQgaW5zdGVhZCBvZiAkd2luZG93IGFuZCAkZG9jdW1lbnQgaGVyZSBpc1xuLy8gZGVsaWJlcmF0ZS4gIFRoaXMgc2VydmljZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBiZWhhdmlvciBvZiBhbmNob3Igbm9kZXMgY3JlYXRlZCBieSB0aGVcbi8vIGJyb3dzZXIgKHJlc29sdmluZyBhbmQgcGFyc2luZyBVUkxzKSB0aGF0IGlzIHVubGlrZWx5IHRvIGJlIHByb3ZpZGVkIGJ5IG1vY2sgb2JqZWN0cyBhbmRcbi8vIGNhdXNlIHVzIHRvIGJyZWFrIHRlc3RzLiAgSW4gYWRkaXRpb24sIHdoZW4gdGhlIGJyb3dzZXIgcmVzb2x2ZXMgYSBVUkwgZm9yIFhIUiwgaXRcbi8vIGRvZXNuJ3Qga25vdyBhYm91dCBtb2NrZWQgbG9jYXRpb25zIGFuZCByZXNvbHZlcyBVUkxzIHRvIHRoZSByZWFsIGRvY3VtZW50IC0gd2hpY2ggaXNcbi8vIGV4YWN0bHkgdGhlIGJlaGF2aW9yIG5lZWRlZCBoZXJlLiAgVGhlcmUgaXMgbGl0dGxlIHZhbHVlIGlzIG1vY2tpbmcgdGhlc2Ugb3V0IGZvciB0aGlzXG4vLyBzZXJ2aWNlLlxudmFyIHVybFBhcnNpbmdOb2RlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbnZhciBvcmlnaW5VcmwgPSB1cmxSZXNvbHZlKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuXG4vKipcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBOb3RlcyBmb3Igbm9uLUlFIGJyb3dzZXJzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBc3NpZ25pbmcgYSBVUkwgdG8gdGhlIGhyZWYgcHJvcGVydHkgb2YgYW4gYW5jaG9yIERPTSBub2RlLCBldmVuIG9uZSBhdHRhY2hlZCB0byB0aGUgRE9NLFxuICogcmVzdWx0cyBib3RoIGluIHRoZSBub3JtYWxpemluZyBhbmQgcGFyc2luZyBvZiB0aGUgVVJMLiAgTm9ybWFsaXppbmcgbWVhbnMgdGhhdCBhIHJlbGF0aXZlXG4gKiBVUkwgd2lsbCBiZSByZXNvbHZlZCBpbnRvIGFuIGFic29sdXRlIFVSTCBpbiB0aGUgY29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuXG4gKiBQYXJzaW5nIG1lYW5zIHRoYXQgdGhlIGFuY2hvciBub2RlJ3MgaG9zdCwgaG9zdG5hbWUsIHByb3RvY29sLCBwb3J0LCBwYXRobmFtZSBhbmQgcmVsYXRlZFxuICogcHJvcGVydGllcyBhcmUgYWxsIHBvcHVsYXRlZCB0byByZWZsZWN0IHRoZSBub3JtYWxpemVkIFVSTC4gIFRoaXMgYXBwcm9hY2ggaGFzIHdpZGVcbiAqIGNvbXBhdGliaWxpdHkgLSBTYWZhcmkgMSssIE1vemlsbGEgMSssIE9wZXJhIDcrLGUgZXRjLiAgU2VlXG4gKiBodHRwOi8vd3d3LmFwdGFuYS5jb20vcmVmZXJlbmNlL2h0bWwvYXBpL0hUTUxBbmNob3JFbGVtZW50Lmh0bWxcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBOb3RlcyBmb3IgSUVcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogSUUgPD0gMTAgbm9ybWFsaXplcyB0aGUgVVJMIHdoZW4gYXNzaWduZWQgdG8gdGhlIGFuY2hvciBub2RlIHNpbWlsYXIgdG8gdGhlIG90aGVyXG4gKiBicm93c2Vycy4gIEhvd2V2ZXIsIHRoZSBwYXJzZWQgY29tcG9uZW50cyB3aWxsIG5vdCBiZSBzZXQgaWYgdGhlIFVSTCBhc3NpZ25lZCBkaWQgbm90IHNwZWNpZnlcbiAqIHRoZW0uICAoZS5nLiBpZiB5b3UgYXNzaWduIGEuaHJlZiA9IFwiZm9vXCIsIHRoZW4gYS5wcm90b2NvbCwgYS5ob3N0LCBldGMuIHdpbGwgYmUgZW1wdHkuKSAgV2VcbiAqIHdvcmsgYXJvdW5kIHRoYXQgYnkgcGVyZm9ybWluZyB0aGUgcGFyc2luZyBpbiBhIDJuZCBzdGVwIGJ5IHRha2luZyBhIHByZXZpb3VzbHkgbm9ybWFsaXplZFxuICogVVJMIChlLmcuIGJ5IGFzc2lnbmluZyB0byBhLmhyZWYpIGFuZCBhc3NpZ25pbmcgaXQgYS5ocmVmIGFnYWluLiAgVGhpcyBjb3JyZWN0bHkgcG9wdWxhdGVzIHRoZVxuICogcHJvcGVydGllcyBzdWNoIGFzIHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCwgZXRjLlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxBbmNob3JFbGVtZW50XG4gKiAgIGh0dHA6Ly93d3cuYXB0YW5hLmNvbS9yZWZlcmVuY2UvaHRtbC9hcGkvSFRNTEFuY2hvckVsZW1lbnQuaHRtbFxuICogICBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzI5MDJcbiAqICAgaHR0cDovL2phbWVzLnBhZG9sc2V5LmNvbS9qYXZhc2NyaXB0L3BhcnNpbmctdXJscy13aXRoLXRoZS1kb20vXG4gKlxuICogQGtpbmQgZnVuY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWQuXG4gKiBAZGVzY3JpcHRpb24gTm9ybWFsaXplcyBhbmQgcGFyc2VzIGEgVVJMLlxuICogQHJldHVybnMge29iamVjdH0gUmV0dXJucyB0aGUgbm9ybWFsaXplZCBVUkwgYXMgYSBkaWN0aW9uYXJ5LlxuICpcbiAqICAgfCBtZW1iZXIgbmFtZSAgIHwgRGVzY3JpcHRpb24gICAgfFxuICogICB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18XG4gKiAgIHwgaHJlZiAgICAgICAgICB8IEEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBwcm92aWRlZCBVUkwgaWYgaXQgd2FzIG5vdCBhbiBhYnNvbHV0ZSBVUkwgfFxuICogICB8IHByb3RvY29sICAgICAgfCBUaGUgcHJvdG9jb2wgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBjb2xvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgfCBob3N0ICAgICAgICAgIHwgVGhlIGhvc3QgYW5kIHBvcnQgKGlmIHRoZSBwb3J0IGlzIG5vbi1kZWZhdWx0KSBvZiB0aGUgbm9ybWFsaXplZFVybCAgICB8XG4gKiAgIHwgc2VhcmNoICAgICAgICB8IFRoZSBzZWFyY2ggcGFyYW1zLCBtaW51cyB0aGUgcXVlc3Rpb24gbWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICB8IGhhc2ggICAgICAgICAgfCBUaGUgaGFzaCBzdHJpbmcsIG1pbnVzIHRoZSBoYXNoIHN5bWJvbFxuICogICB8IGhvc3RuYW1lICAgICAgfCBUaGUgaG9zdG5hbWVcbiAqICAgfCBwb3J0ICAgICAgICAgIHwgVGhlIHBvcnQsIHdpdGhvdXQgXCI6XCJcbiAqICAgfCBwYXRobmFtZSAgICAgIHwgVGhlIHBhdGhuYW1lLCBiZWdpbm5pbmcgd2l0aCBcIi9cIlxuICpcbiAqL1xuZnVuY3Rpb24gdXJsUmVzb2x2ZSh1cmwpIHtcbiAgdmFyIGhyZWYgPSB1cmw7XG5cbiAgLy8gU3VwcG9ydDogSUUgOS0xMSBvbmx5XG4gIGlmIChtc2llKSB7XG4gICAgLy8gTm9ybWFsaXplIGJlZm9yZSBwYXJzZS4gIFJlZmVyIEltcGxlbWVudGF0aW9uIE5vdGVzIG9uIHdoeSB0aGlzIGlzXG4gICAgLy8gZG9uZSBpbiB0d28gc3RlcHMgb24gSUUuXG4gICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gIH1cblxuICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gIHJldHVybiB7XG4gICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJylcbiAgICAgID8gdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgIDogJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIHJlcXVlc3QgVVJMIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgc2FtZS1vcmlnaW4gcmVxdWVzdCBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZXF1ZXN0VXJsIFRoZSB1cmwgb2YgdGhlIHJlcXVlc3QgYXMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHJlc29sdmVkXG4gKiBvciBhIHBhcnNlZCBVUkwgb2JqZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgZm9yIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHVybElzU2FtZU9yaWdpbihyZXF1ZXN0VXJsKSB7XG4gIHZhciBwYXJzZWQgPSAoaXNTdHJpbmcocmVxdWVzdFVybCkpID8gdXJsUmVzb2x2ZShyZXF1ZXN0VXJsKSA6IHJlcXVlc3RVcmw7XG4gIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VcmwucHJvdG9jb2wgJiZcbiAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVXJsLmhvc3QpO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkd2luZG93XG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSByZWZlcmVuY2UgdG8gdGhlIGJyb3dzZXIncyBgd2luZG93YCBvYmplY3QuIFdoaWxlIGB3aW5kb3dgXG4gKiBpcyBnbG9iYWxseSBhdmFpbGFibGUgaW4gSmF2YVNjcmlwdCwgaXQgY2F1c2VzIHRlc3RhYmlsaXR5IHByb2JsZW1zLCBiZWNhdXNlXG4gKiBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gSW4gYW5ndWxhciB3ZSBhbHdheXMgcmVmZXIgdG8gaXQgdGhyb3VnaCB0aGVcbiAqIGAkd2luZG93YCBzZXJ2aWNlLCBzbyBpdCBtYXkgYmUgb3ZlcnJpZGRlbiwgcmVtb3ZlZCBvciBtb2NrZWQgZm9yIHRlc3RpbmcuXG4gKlxuICogRXhwcmVzc2lvbnMsIGxpa2UgdGhlIG9uZSBkZWZpbmVkIGZvciB0aGUgYG5nQ2xpY2tgIGRpcmVjdGl2ZSBpbiB0aGUgZXhhbXBsZVxuICogYmVsb3csIGFyZSBldmFsdWF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlcmVmb3JlLCB0aGVyZSBpc1xuICogbm8gcmlzayBvZiBpbmFkdmVydGVudGx5IGNvZGluZyBpbiBhIGRlcGVuZGVuY3kgb24gYSBnbG9iYWwgdmFsdWUgaW4gc3VjaCBhblxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwid2luZG93RXhhbXBsZVwiIG5hbWU9XCJ3aW5kb3ctc2VydmljZVwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnd2luZG93RXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICckd2luZG93JywgZnVuY3Rpb24oJHNjb3BlLCAkd2luZG93KSB7XG4gICAgICAgICAgICAgJHNjb3BlLmdyZWV0aW5nID0gJ0hlbGxvLCBXb3JsZCEnO1xuICAgICAgICAgICAgICRzY29wZS5kb0dyZWV0aW5nID0gZnVuY3Rpb24oZ3JlZXRpbmcpIHtcbiAgICAgICAgICAgICAgICR3aW5kb3cuYWxlcnQoZ3JlZXRpbmcpO1xuICAgICAgICAgICAgIH07XG4gICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJncmVldGluZ1wiIGFyaWEtbGFiZWw9XCJncmVldGluZ1wiIC8+XG4gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiZG9HcmVldGluZyhncmVldGluZylcIj5BTEVSVDwvYnV0dG9uPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgIGl0KCdzaG91bGQgZGlzcGxheSB0aGUgZ3JlZXRpbmcgaW4gdGhlIGlucHV0IGJveCcsIGZ1bmN0aW9uKCkge1xuICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2dyZWV0aW5nJykpLnNlbmRLZXlzKCdIZWxsbywgRTJFIFRlc3RzJyk7XG4gICAgICAgLy8gSWYgd2UgY2xpY2sgdGhlIGJ1dHRvbiBpdCB3aWxsIGJsb2NrIHRoZSB0ZXN0IHJ1bm5lclxuICAgICAgIC8vIGVsZW1lbnQoJzpidXR0b24nKS5jbGljaygpO1xuICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuZnVuY3Rpb24gJFdpbmRvd1Byb3ZpZGVyKCkge1xuICB0aGlzLiRnZXQgPSB2YWx1ZUZuKHdpbmRvdyk7XG59XG5cbi8qKlxuICogQG5hbWUgJCRjb29raWVSZWFkZXJcbiAqIEByZXF1aXJlcyAkZG9jdW1lbnRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgaXMgYSBwcml2YXRlIHNlcnZpY2UgZm9yIHJlYWRpbmcgY29va2llcyB1c2VkIGJ5ICRodHRwIGFuZCBuZ0Nvb2tpZXNcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGEga2V5L3ZhbHVlIG1hcCBvZiB0aGUgY3VycmVudCBjb29raWVzXG4gKi9cbmZ1bmN0aW9uICQkQ29va2llUmVhZGVyKCRkb2N1bWVudCkge1xuICB2YXIgcmF3RG9jdW1lbnQgPSAkZG9jdW1lbnRbMF0gfHwge307XG4gIHZhciBsYXN0Q29va2llcyA9IHt9O1xuICB2YXIgbGFzdENvb2tpZVN0cmluZyA9ICcnO1xuXG4gIGZ1bmN0aW9uIHNhZmVHZXRDb29raWUocmF3RG9jdW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJhd0RvY3VtZW50LmNvb2tpZSB8fCAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2FmZURlY29kZVVSSUNvbXBvbmVudChzdHIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb29raWVBcnJheSwgY29va2llLCBpLCBpbmRleCwgbmFtZTtcbiAgICB2YXIgY3VycmVudENvb2tpZVN0cmluZyA9IHNhZmVHZXRDb29raWUocmF3RG9jdW1lbnQpO1xuXG4gICAgaWYgKGN1cnJlbnRDb29raWVTdHJpbmcgIT09IGxhc3RDb29raWVTdHJpbmcpIHtcbiAgICAgIGxhc3RDb29raWVTdHJpbmcgPSBjdXJyZW50Q29va2llU3RyaW5nO1xuICAgICAgY29va2llQXJyYXkgPSBsYXN0Q29va2llU3RyaW5nLnNwbGl0KCc7ICcpO1xuICAgICAgbGFzdENvb2tpZXMgPSB7fTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGNvb2tpZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvb2tpZSA9IGNvb2tpZUFycmF5W2ldO1xuICAgICAgICBpbmRleCA9IGNvb2tpZS5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHsgLy9pZ25vcmUgbmFtZWxlc3MgY29va2llc1xuICAgICAgICAgIG5hbWUgPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTtcbiAgICAgICAgICAvLyB0aGUgZmlyc3QgdmFsdWUgdGhhdCBpcyBzZWVuIGZvciBhIGNvb2tpZSBpcyB0aGUgbW9zdFxuICAgICAgICAgIC8vIHNwZWNpZmljIG9uZS4gIHZhbHVlcyBmb3IgdGhlIHNhbWUgY29va2llIG5hbWUgdGhhdFxuICAgICAgICAgIC8vIGZvbGxvdyBhcmUgZm9yIGxlc3Mgc3BlY2lmaWMgcGF0aHMuXG4gICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGxhc3RDb29raWVzW25hbWVdKSkge1xuICAgICAgICAgICAgbGFzdENvb2tpZXNbbmFtZV0gPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXN0Q29va2llcztcbiAgfTtcbn1cblxuJCRDb29raWVSZWFkZXIuJGluamVjdCA9IFsnJGRvY3VtZW50J107XG5cbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJCRDb29raWVSZWFkZXJQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gJCRDb29raWVSZWFkZXI7XG59XG5cbi8qIGdsb2JhbCBjdXJyZW5jeUZpbHRlcjogdHJ1ZSxcbiBkYXRlRmlsdGVyOiB0cnVlLFxuIGZpbHRlckZpbHRlcjogdHJ1ZSxcbiBqc29uRmlsdGVyOiB0cnVlLFxuIGxpbWl0VG9GaWx0ZXI6IHRydWUsXG4gbG93ZXJjYXNlRmlsdGVyOiB0cnVlLFxuIG51bWJlckZpbHRlcjogdHJ1ZSxcbiBvcmRlckJ5RmlsdGVyOiB0cnVlLFxuIHVwcGVyY2FzZUZpbHRlcjogdHJ1ZSxcbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJGZpbHRlclByb3ZpZGVyXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBGaWx0ZXJzIGFyZSBqdXN0IGZ1bmN0aW9ucyB3aGljaCB0cmFuc2Zvcm0gaW5wdXQgdG8gYW4gb3V0cHV0LiBIb3dldmVyIGZpbHRlcnMgbmVlZCB0byBiZVxuICogRGVwZW5kZW5jeSBJbmplY3RlZC4gVG8gYWNoaWV2ZSB0aGlzIGEgZmlsdGVyIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIGlzXG4gKiBhbm5vdGF0ZWQgd2l0aCBkZXBlbmRlbmNpZXMgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIGZpbHRlciBmdW5jdGlvbi5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIEZpbHRlciBuYW1lcyBtdXN0IGJlIHZhbGlkIGFuZ3VsYXIge0BsaW5rIGV4cHJlc3Npb259IGlkZW50aWZpZXJzLCBzdWNoIGFzIGB1cHBlcmNhc2VgIG9yIGBvcmRlckJ5YC5cbiAqIE5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGh5cGhlbnMgYW5kIGRvdHMsIGFyZSBub3QgYWxsb3dlZC4gSWYgeW91IHdpc2ggdG8gbmFtZXNwYWNlXG4gKiB5b3VyIGZpbHRlcnMsIHRoZW4geW91IGNhbiB1c2UgY2FwaXRhbGl6YXRpb24gKGBteWFwcFN1YnNlY3Rpb25GaWx0ZXJ4YCkgb3IgdW5kZXJzY29yZXNcbiAqIChgbXlhcHBfc3Vic2VjdGlvbl9maWx0ZXJ4YCkuXG4gKiA8L2Rpdj5cbiAqXG4gKiBgYGBqc1xuICogICAvLyBGaWx0ZXIgcmVnaXN0cmF0aW9uXG4gKiAgIGZ1bmN0aW9uIE15TW9kdWxlKCRwcm92aWRlLCAkZmlsdGVyUHJvdmlkZXIpIHtcbiAqICAgICAvLyBjcmVhdGUgYSBzZXJ2aWNlIHRvIGRlbW9uc3RyYXRlIGluamVjdGlvbiAobm90IGFsd2F5cyBuZWVkZWQpXG4gKiAgICAgJHByb3ZpZGUudmFsdWUoJ2dyZWV0JywgZnVuY3Rpb24obmFtZSl7XG4gKiAgICAgICByZXR1cm4gJ0hlbGxvICcgKyBuYW1lICsgJyEnO1xuICogICAgIH0pO1xuICpcbiAqICAgICAvLyByZWdpc3RlciBhIGZpbHRlciBmYWN0b3J5IHdoaWNoIHVzZXMgdGhlXG4gKiAgICAgLy8gZ3JlZXQgc2VydmljZSB0byBkZW1vbnN0cmF0ZSBESS5cbiAqICAgICAkZmlsdGVyUHJvdmlkZXIucmVnaXN0ZXIoJ2dyZWV0JywgZnVuY3Rpb24oZ3JlZXQpe1xuICogICAgICAgLy8gcmV0dXJuIHRoZSBmaWx0ZXIgZnVuY3Rpb24gd2hpY2ggdXNlcyB0aGUgZ3JlZXQgc2VydmljZVxuICogICAgICAgLy8gdG8gZ2VuZXJhdGUgc2FsdXRhdGlvblxuICogICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRleHQpIHtcbiAqICAgICAgICAgLy8gZmlsdGVycyBuZWVkIHRvIGJlIGZvcmdpdmluZyBzbyBjaGVjayBpbnB1dCB2YWxpZGl0eVxuICogICAgICAgICByZXR1cm4gdGV4dCAmJiBncmVldCh0ZXh0KSB8fCB0ZXh0O1xuICogICAgICAgfTtcbiAqICAgICB9KTtcbiAqICAgfVxuICogYGBgXG4gKlxuICogVGhlIGZpbHRlciBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGAkaW5qZWN0b3JgIHVuZGVyIHRoZSBmaWx0ZXIgbmFtZSBzdWZmaXggd2l0aFxuICogYEZpbHRlcmAuXG4gKlxuICogYGBganNcbiAqICAgaXQoJ3Nob3VsZCBiZSB0aGUgc2FtZSBpbnN0YW5jZScsIGluamVjdChcbiAqICAgICBmdW5jdGlvbigkZmlsdGVyUHJvdmlkZXIpIHtcbiAqICAgICAgICRmaWx0ZXJQcm92aWRlci5yZWdpc3RlcigncmV2ZXJzZScsIGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgIHJldHVybiAuLi47XG4gKiAgICAgICB9KTtcbiAqICAgICB9LFxuICogICAgIGZ1bmN0aW9uKCRmaWx0ZXIsIHJldmVyc2VGaWx0ZXIpIHtcbiAqICAgICAgIGV4cGVjdCgkZmlsdGVyKCdyZXZlcnNlJykpLnRvQmUocmV2ZXJzZUZpbHRlcik7XG4gKiAgICAgfSk7XG4gKiBgYGBcbiAqXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGFuZ3VsYXIgZmlsdGVycyB3b3JrLCBhbmQgaG93IHRvIGNyZWF0ZSB5b3VyIG93biBmaWx0ZXJzLCBzZWVcbiAqIHtAbGluayBndWlkZS9maWx0ZXIgRmlsdGVyc30gaW4gdGhlIEFuZ3VsYXIgRGV2ZWxvcGVyIEd1aWRlLlxuICovXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRmaWx0ZXJcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKiBAZGVzY3JpcHRpb25cbiAqIEZpbHRlcnMgYXJlIHVzZWQgZm9yIGZvcm1hdHRpbmcgZGF0YSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gKlxuICogVGhleSBjYW4gYmUgdXNlZCBpbiB2aWV3IHRlbXBsYXRlcywgY29udHJvbGxlcnMgb3Igc2VydmljZXMuQW5ndWxhciBjb21lc1xuICogd2l0aCBhIGNvbGxlY3Rpb24gb2YgW2J1aWx0LWluIGZpbHRlcnNdKGFwaS9uZy9maWx0ZXIpLCBidXQgaXQgaXMgZWFzeSB0b1xuICogZGVmaW5lIHlvdXIgb3duIGFzIHdlbGwuXG4gKlxuICogVGhlIGdlbmVyYWwgc3ludGF4IGluIHRlbXBsYXRlcyBpcyBhcyBmb2xsb3dzOlxuICpcbiAqIGBgYGh0bWxcbiAqIHt7IGV4cHJlc3Npb24gW3wgZmlsdGVyX25hbWVbOnBhcmFtZXRlcl92YWx1ZV0gLi4uIF0gfX1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpbHRlciBmdW5jdGlvbiB0byByZXRyaWV2ZVxuICogQHJldHVybiB7RnVuY3Rpb259IHRoZSBmaWx0ZXIgZnVuY3Rpb25cbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwiJGZpbHRlclwiIG1vZHVsZT1cImZpbHRlckV4YW1wbGVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJNYWluQ3RybFwiPlxuICAgICAgICA8aDM+e3sgb3JpZ2luYWxUZXh0IH19PC9oMz5cbiAgICAgICAgPGgzPnt7IGZpbHRlcmVkVGV4dCB9fTwvaDM+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cblxuICAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICBhbmd1bGFyLm1vZHVsZSgnZmlsdGVyRXhhbXBsZScsIFtdKVxuICAgICAgLmNvbnRyb2xsZXIoJ01haW5DdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkZmlsdGVyKSB7XG4gICAgICAgICRzY29wZS5vcmlnaW5hbFRleHQgPSAnaGVsbG8nO1xuICAgICAgICAkc2NvcGUuZmlsdGVyZWRUZXh0ID0gJGZpbHRlcigndXBwZXJjYXNlJykoJHNjb3BlLm9yaWdpbmFsVGV4dCk7XG4gICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICAqL1xuJEZpbHRlclByb3ZpZGVyLiRpbmplY3QgPSBbJyRwcm92aWRlJ107XG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICRGaWx0ZXJQcm92aWRlcigkcHJvdmlkZSkge1xuICB2YXIgc3VmZml4ID0gJ0ZpbHRlcic7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGZpbHRlclByb3ZpZGVyI3JlZ2lzdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBOYW1lIG9mIHRoZSBmaWx0ZXIgZnVuY3Rpb24sIG9yIGFuIG9iamVjdCBtYXAgb2YgZmlsdGVycyB3aGVyZVxuICAgKiAgICB0aGUga2V5cyBhcmUgdGhlIGZpbHRlciBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGZpbHRlciBmYWN0b3JpZXMuXG4gICAqXG4gICAqICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gICAqICAgICoqTm90ZToqKiBGaWx0ZXIgbmFtZXMgbXVzdCBiZSB2YWxpZCBhbmd1bGFyIHtAbGluayBleHByZXNzaW9ufSBpZGVudGlmaWVycywgc3VjaCBhcyBgdXBwZXJjYXNlYCBvciBgb3JkZXJCeWAuXG4gICAqICAgIE5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGh5cGhlbnMgYW5kIGRvdHMsIGFyZSBub3QgYWxsb3dlZC4gSWYgeW91IHdpc2ggdG8gbmFtZXNwYWNlXG4gICAqICAgIHlvdXIgZmlsdGVycywgdGhlbiB5b3UgY2FuIHVzZSBjYXBpdGFsaXphdGlvbiAoYG15YXBwU3Vic2VjdGlvbkZpbHRlcnhgKSBvciB1bmRlcnNjb3Jlc1xuICAgKiAgICAoYG15YXBwX3N1YnNlY3Rpb25fZmlsdGVyeGApLlxuICAgKiAgICA8L2Rpdj5cbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhIHN0cmluZywgYSBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGUgZmlsdGVyIHRvIGJlIHJlZ2lzdGVyZWQuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJlZ2lzdGVyZWQgZmlsdGVyIGluc3RhbmNlLCBvciBpZiBhIG1hcCBvZiBmaWx0ZXJzIHdhcyBwcm92aWRlZCB0aGVuIGEgbWFwXG4gICAqICAgIG9mIHRoZSByZWdpc3RlcmVkIGZpbHRlciBpbnN0YW5jZXMuXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCBmYWN0b3J5KSB7XG4gICAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICB2YXIgZmlsdGVycyA9IHt9O1xuICAgICAgZm9yRWFjaChuYW1lLCBmdW5jdGlvbihmaWx0ZXIsIGtleSkge1xuICAgICAgICBmaWx0ZXJzW2tleV0gPSByZWdpc3RlcihrZXksIGZpbHRlcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJHByb3ZpZGUuZmFjdG9yeShuYW1lICsgc3VmZml4LCBmYWN0b3J5KTtcbiAgICB9XG4gIH1cbiAgdGhpcy5yZWdpc3RlciA9IHJlZ2lzdGVyO1xuXG4gIHRoaXMuJGdldCA9IFsnJGluamVjdG9yJywgZnVuY3Rpb24oJGluamVjdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHJldHVybiAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBzdWZmaXgpO1xuICAgIH07XG4gIH1dO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAvKiBnbG9iYWxcbiAgICBjdXJyZW5jeUZpbHRlcjogZmFsc2UsXG4gICAgZGF0ZUZpbHRlcjogZmFsc2UsXG4gICAgZmlsdGVyRmlsdGVyOiBmYWxzZSxcbiAgICBqc29uRmlsdGVyOiBmYWxzZSxcbiAgICBsaW1pdFRvRmlsdGVyOiBmYWxzZSxcbiAgICBsb3dlcmNhc2VGaWx0ZXI6IGZhbHNlLFxuICAgIG51bWJlckZpbHRlcjogZmFsc2UsXG4gICAgb3JkZXJCeUZpbHRlcjogZmFsc2UsXG4gICAgdXBwZXJjYXNlRmlsdGVyOiBmYWxzZVxuICAqL1xuXG4gIHJlZ2lzdGVyKCdjdXJyZW5jeScsIGN1cnJlbmN5RmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ2RhdGUnLCBkYXRlRmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ2ZpbHRlcicsIGZpbHRlckZpbHRlcik7XG4gIHJlZ2lzdGVyKCdqc29uJywganNvbkZpbHRlcik7XG4gIHJlZ2lzdGVyKCdsaW1pdFRvJywgbGltaXRUb0ZpbHRlcik7XG4gIHJlZ2lzdGVyKCdsb3dlcmNhc2UnLCBsb3dlcmNhc2VGaWx0ZXIpO1xuICByZWdpc3RlcignbnVtYmVyJywgbnVtYmVyRmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ29yZGVyQnknLCBvcmRlckJ5RmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ3VwcGVyY2FzZScsIHVwcGVyY2FzZUZpbHRlcik7XG59XG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgZmlsdGVyXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2VsZWN0cyBhIHN1YnNldCBvZiBpdGVtcyBmcm9tIGBhcnJheWAgYW5kIHJldHVybnMgaXQgYXMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvdXJjZSBhcnJheS5cbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdHxmdW5jdGlvbigpfSBleHByZXNzaW9uIFRoZSBwcmVkaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VsZWN0aW5nIGl0ZW1zIGZyb21cbiAqICAgYGFycmF5YC5cbiAqXG4gKiAgIENhbiBiZSBvbmUgb2Y6XG4gKlxuICogICAtIGBzdHJpbmdgOiBUaGUgc3RyaW5nIGlzIHVzZWQgZm9yIG1hdGNoaW5nIGFnYWluc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBgYXJyYXlgLiBBbGwgc3RyaW5ncyBvclxuICogICAgIG9iamVjdHMgd2l0aCBzdHJpbmcgcHJvcGVydGllcyBpbiBgYXJyYXlgIHRoYXQgbWF0Y2ggdGhpcyBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4gVGhpcyBhbHNvXG4gKiAgICAgYXBwbGllcyB0byBuZXN0ZWQgb2JqZWN0IHByb3BlcnRpZXMuXG4gKiAgICAgVGhlIHByZWRpY2F0ZSBjYW4gYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoIGAhYC5cbiAqXG4gKiAgIC0gYE9iamVjdGA6IEEgcGF0dGVybiBvYmplY3QgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHNwZWNpZmljIHByb3BlcnRpZXMgb24gb2JqZWN0cyBjb250YWluZWRcbiAqICAgICBieSBgYXJyYXlgLiBGb3IgZXhhbXBsZSBge25hbWU6XCJNXCIsIHBob25lOlwiMVwifWAgcHJlZGljYXRlIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGl0ZW1zXG4gKiAgICAgd2hpY2ggaGF2ZSBwcm9wZXJ0eSBgbmFtZWAgY29udGFpbmluZyBcIk1cIiBhbmQgcHJvcGVydHkgYHBob25lYCBjb250YWluaW5nIFwiMVwiLiBBIHNwZWNpYWxcbiAqICAgICBwcm9wZXJ0eSBuYW1lIChgJGAgYnkgZGVmYXVsdCkgY2FuIGJlIHVzZWQgKGUuZy4gYXMgaW4gYHskOiBcInRleHRcIn1gKSB0byBhY2NlcHQgYSBtYXRjaFxuICogICAgIGFnYWluc3QgYW55IHByb3BlcnR5IG9mIHRoZSBvYmplY3Qgb3IgaXRzIG5lc3RlZCBvYmplY3QgcHJvcGVydGllcy4gVGhhdCdzIGVxdWl2YWxlbnQgdG8gdGhlXG4gKiAgICAgc2ltcGxlIHN1YnN0cmluZyBtYXRjaCB3aXRoIGEgYHN0cmluZ2AgYXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUgc3BlY2lhbCBwcm9wZXJ0eSBuYW1lIGNhbiBiZVxuICogICAgIG92ZXJ3cml0dGVuLCB1c2luZyB0aGUgYGFueVByb3BlcnR5S2V5YCBwYXJhbWV0ZXIuXG4gKiAgICAgVGhlIHByZWRpY2F0ZSBjYW4gYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoIGAhYC5cbiAqICAgICBGb3IgZXhhbXBsZSBge25hbWU6IFwiIU1cIn1gIHByZWRpY2F0ZSB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBoYXZlIHByb3BlcnR5IGBuYW1lYFxuICogICAgIG5vdCBjb250YWluaW5nIFwiTVwiLlxuICpcbiAqICAgICBOb3RlIHRoYXQgYSBuYW1lZCBwcm9wZXJ0eSB3aWxsIG1hdGNoIHByb3BlcnRpZXMgb24gdGhlIHNhbWUgbGV2ZWwgb25seSwgd2hpbGUgdGhlIHNwZWNpYWxcbiAqICAgICBgJGAgcHJvcGVydHkgd2lsbCBtYXRjaCBwcm9wZXJ0aWVzIG9uIHRoZSBzYW1lIGxldmVsIG9yIGRlZXBlci4gRS5nLiBhbiBhcnJheSBpdGVtIGxpa2VcbiAqICAgICBge25hbWU6IHtmaXJzdDogJ0pvaG4nLCBsYXN0OiAnRG9lJ319YCB3aWxsICoqbm90KiogYmUgbWF0Y2hlZCBieSBge25hbWU6ICdKb2huJ31gLCBidXRcbiAqICAgICAqKndpbGwqKiBiZSBtYXRjaGVkIGJ5IGB7JDogJ0pvaG4nfWAuXG4gKlxuICogICAtIGBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGFycmF5KWA6IEEgcHJlZGljYXRlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFyYml0cmFyeSBmaWx0ZXJzLlxuICogICAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXksIHdpdGggdGhlIGVsZW1lbnQsIGl0cyBpbmRleCwgYW5kXG4gKiAgICAgdGhlIGVudGlyZSBhcnJheSBpdHNlbGYgYXMgYXJndW1lbnRzLlxuICpcbiAqICAgICBUaGUgZmluYWwgcmVzdWx0IGlzIGFuIGFycmF5IG9mIHRob3NlIGVsZW1lbnRzIHRoYXQgdGhlIHByZWRpY2F0ZSByZXR1cm5lZCB0cnVlIGZvci5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpfHRydWV8ZmFsc2V9IFtjb21wYXJhdG9yXSBDb21wYXJhdG9yIHdoaWNoIGlzIHVzZWQgaW5cbiAqICAgICBkZXRlcm1pbmluZyBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgKGZyb20gdGhlIGZpbHRlciBleHByZXNzaW9uKSBhbmQgYWN0dWFsIHZhbHVlIChmcm9tXG4gKiAgICAgdGhlIG9iamVjdCBpbiB0aGUgYXJyYXkpIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgbWF0Y2guXG4gKlxuICogICBDYW4gYmUgb25lIG9mOlxuICpcbiAqICAgLSBgZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZClgOlxuICogICAgIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGdpdmVuIHRoZSBvYmplY3QgdmFsdWUgYW5kIHRoZSBwcmVkaWNhdGUgdmFsdWUgdG8gY29tcGFyZSBhbmRcbiAqICAgICBzaG91bGQgcmV0dXJuIHRydWUgaWYgYm90aCB2YWx1ZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwuXG4gKlxuICogICAtIGB0cnVlYDogQSBzaG9ydGhhbmQgZm9yIGBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7IHJldHVybiBhbmd1bGFyLmVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKX1gLlxuICogICAgIFRoaXMgaXMgZXNzZW50aWFsbHkgc3RyaWN0IGNvbXBhcmlzb24gb2YgZXhwZWN0ZWQgYW5kIGFjdHVhbC5cbiAqXG4gKiAgIC0gYGZhbHNlYDogQSBzaG9ydCBoYW5kIGZvciBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgbG9vayBmb3IgYSBzdWJzdHJpbmcgbWF0Y2ggaW4gYSBjYXNlXG4gKiAgICAgaW5zZW5zaXRpdmUgd2F5LiBQcmltaXRpdmUgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4gT2JqZWN0cyBhcmUgbm90IGNvbXBhcmVkIGFnYWluc3RcbiAqICAgICBwcmltaXRpdmVzLCB1bmxlc3MgdGhleSBoYXZlIGEgY3VzdG9tIGB0b1N0cmluZ2AgbWV0aG9kIChlLmcuIGBEYXRlYCBvYmplY3RzKS5cbiAqXG4gKlxuICogICBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYW55UHJvcGVydHlLZXldIFRoZSBzcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBtYXRjaGVzIGFnYWluc3QgYW55IHByb3BlcnR5LlxuICogICAgIEJ5IGRlZmF1bHQgYCRgLlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwiZmlsdGVyLWZpbHRlclwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxkaXYgbmctaW5pdD1cImZyaWVuZHMgPSBbe25hbWU6J0pvaG4nLCBwaG9uZTonNTU1LTEyNzYnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J01hcnknLCBwaG9uZTonODAwLUJJRy1NQVJZJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidNaWtlJywgcGhvbmU6JzU1NS00MzIxJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidBZGFtJywgcGhvbmU6JzU1NS01Njc4J30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidKdWxpZScsIHBob25lOic1NTUtODc2NSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonSnVsaWV0dGUnLCBwaG9uZTonNTU1LTU2NzgnfV1cIj48L2Rpdj5cblxuICAgICAgIDxsYWJlbD5TZWFyY2g6IDxpbnB1dCBuZy1tb2RlbD1cInNlYXJjaFRleHRcIj48L2xhYmVsPlxuICAgICAgIDx0YWJsZSBpZD1cInNlYXJjaFRleHRSZXN1bHRzXCI+XG4gICAgICAgICA8dHI+PHRoPk5hbWU8L3RoPjx0aD5QaG9uZTwvdGg+PC90cj5cbiAgICAgICAgIDx0ciBuZy1yZXBlYXQ9XCJmcmllbmQgaW4gZnJpZW5kcyB8IGZpbHRlcjpzZWFyY2hUZXh0XCI+XG4gICAgICAgICAgIDx0ZD57e2ZyaWVuZC5uYW1lfX08L3RkPlxuICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+XG4gICAgICAgICA8L3RyPlxuICAgICAgIDwvdGFibGU+XG4gICAgICAgPGhyPlxuICAgICAgIDxsYWJlbD5Bbnk6IDxpbnB1dCBuZy1tb2RlbD1cInNlYXJjaC4kXCI+PC9sYWJlbD4gPGJyPlxuICAgICAgIDxsYWJlbD5OYW1lIG9ubHkgPGlucHV0IG5nLW1vZGVsPVwic2VhcmNoLm5hbWVcIj48L2xhYmVsPjxicj5cbiAgICAgICA8bGFiZWw+UGhvbmUgb25seSA8aW5wdXQgbmctbW9kZWw9XCJzZWFyY2gucGhvbmVcIj48L2xhYmVsPjxicj5cbiAgICAgICA8bGFiZWw+RXF1YWxpdHkgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwic3RyaWN0XCI+PC9sYWJlbD48YnI+XG4gICAgICAgPHRhYmxlIGlkPVwic2VhcmNoT2JqUmVzdWx0c1wiPlxuICAgICAgICAgPHRyPjx0aD5OYW1lPC90aD48dGg+UGhvbmU8L3RoPjwvdHI+XG4gICAgICAgICA8dHIgbmctcmVwZWF0PVwiZnJpZW5kT2JqIGluIGZyaWVuZHMgfCBmaWx0ZXI6c2VhcmNoOnN0cmljdFwiPlxuICAgICAgICAgICA8dGQ+e3tmcmllbmRPYmoubmFtZX19PC90ZD5cbiAgICAgICAgICAgPHRkPnt7ZnJpZW5kT2JqLnBob25lfX08L3RkPlxuICAgICAgICAgPC90cj5cbiAgICAgICA8L3RhYmxlPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICB2YXIgZXhwZWN0RnJpZW5kTmFtZXMgPSBmdW5jdGlvbihleHBlY3RlZE5hbWVzLCBrZXkpIHtcbiAgICAgICAgIGVsZW1lbnQuYWxsKGJ5LnJlcGVhdGVyKGtleSArICcgaW4gZnJpZW5kcycpLmNvbHVtbihrZXkgKyAnLm5hbWUnKSkudGhlbihmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24od2QsIGkpIHtcbiAgICAgICAgICAgICBleHBlY3Qod2QuZ2V0VGV4dCgpKS50b01hdGNoKGV4cGVjdGVkTmFtZXNbaV0pO1xuICAgICAgICAgICB9KTtcbiAgICAgICAgIH0pO1xuICAgICAgIH07XG5cbiAgICAgICBpdCgnc2hvdWxkIHNlYXJjaCBhY3Jvc3MgYWxsIGZpZWxkcyB3aGVuIGZpbHRlcmluZyB3aXRoIGEgc3RyaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICB2YXIgc2VhcmNoVGV4dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlYXJjaFRleHQnKSk7XG4gICAgICAgICBzZWFyY2hUZXh0LmNsZWFyKCk7XG4gICAgICAgICBzZWFyY2hUZXh0LnNlbmRLZXlzKCdtJyk7XG4gICAgICAgICBleHBlY3RGcmllbmROYW1lcyhbJ01hcnknLCAnTWlrZScsICdBZGFtJ10sICdmcmllbmQnKTtcblxuICAgICAgICAgc2VhcmNoVGV4dC5jbGVhcigpO1xuICAgICAgICAgc2VhcmNoVGV4dC5zZW5kS2V5cygnNzYnKTtcbiAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnSm9obicsICdKdWxpZSddLCAnZnJpZW5kJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNlYXJjaCBpbiBzcGVjaWZpYyBmaWVsZHMgd2hlbiBmaWx0ZXJpbmcgd2l0aCBhIHByZWRpY2F0ZSBvYmplY3QnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIHZhciBzZWFyY2hBbnkgPSBlbGVtZW50KGJ5Lm1vZGVsKCdzZWFyY2guJCcpKTtcbiAgICAgICAgIHNlYXJjaEFueS5jbGVhcigpO1xuICAgICAgICAgc2VhcmNoQW55LnNlbmRLZXlzKCdpJyk7XG4gICAgICAgICBleHBlY3RGcmllbmROYW1lcyhbJ01hcnknLCAnTWlrZScsICdKdWxpZScsICdKdWxpZXR0ZSddLCAnZnJpZW5kT2JqJyk7XG4gICAgICAgfSk7XG4gICAgICAgaXQoJ3Nob3VsZCB1c2UgYSBlcXVhbCBjb21wYXJpc29uIHdoZW4gY29tcGFyYXRvciBpcyB0cnVlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICB2YXIgc2VhcmNoTmFtZSA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlYXJjaC5uYW1lJykpO1xuICAgICAgICAgdmFyIHN0cmljdCA9IGVsZW1lbnQoYnkubW9kZWwoJ3N0cmljdCcpKTtcbiAgICAgICAgIHNlYXJjaE5hbWUuY2xlYXIoKTtcbiAgICAgICAgIHNlYXJjaE5hbWUuc2VuZEtleXMoJ0p1bGllJyk7XG4gICAgICAgICBzdHJpY3QuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnSnVsaWUnXSwgJ2ZyaWVuZE9iaicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuZnVuY3Rpb24gZmlsdGVyRmlsdGVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIGV4cHJlc3Npb24sIGNvbXBhcmF0b3IsIGFueVByb3BlcnR5S2V5KSB7XG4gICAgaWYgKCFpc0FycmF5TGlrZShhcnJheSkpIHtcbiAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG1pbkVycignZmlsdGVyJykoJ25vdGFycmF5JywgJ0V4cGVjdGVkIGFycmF5IGJ1dCByZWNlaXZlZDogezB9JywgYXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFueVByb3BlcnR5S2V5ID0gYW55UHJvcGVydHlLZXkgfHwgJyQnO1xuICAgIHZhciBleHByZXNzaW9uVHlwZSA9IGdldFR5cGVGb3JGaWx0ZXIoZXhwcmVzc2lvbik7XG4gICAgdmFyIHByZWRpY2F0ZUZuO1xuICAgIHZhciBtYXRjaEFnYWluc3RBbnlQcm9wO1xuXG4gICAgc3dpdGNoIChleHByZXNzaW9uVHlwZSkge1xuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICBwcmVkaWNhdGVGbiA9IGV4cHJlc3Npb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBtYXRjaEFnYWluc3RBbnlQcm9wID0gdHJ1ZTtcbiAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcHJlZGljYXRlRm4gPSBjcmVhdGVQcmVkaWNhdGVGbihleHByZXNzaW9uLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYXJyYXksIHByZWRpY2F0ZUZuKTtcbiAgfTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYGZpbHRlckZpbHRlcmBcbmZ1bmN0aW9uIGNyZWF0ZVByZWRpY2F0ZUZuKGV4cHJlc3Npb24sIGNvbXBhcmF0b3IsIGFueVByb3BlcnR5S2V5LCBtYXRjaEFnYWluc3RBbnlQcm9wKSB7XG4gIHZhciBzaG91bGRNYXRjaFByaW1pdGl2ZXMgPSBpc09iamVjdChleHByZXNzaW9uKSAmJiAoYW55UHJvcGVydHlLZXkgaW4gZXhwcmVzc2lvbik7XG4gIHZhciBwcmVkaWNhdGVGbjtcblxuICBpZiAoY29tcGFyYXRvciA9PT0gdHJ1ZSkge1xuICAgIGNvbXBhcmF0b3IgPSBlcXVhbHM7XG4gIH0gZWxzZSBpZiAoIWlzRnVuY3Rpb24oY29tcGFyYXRvcikpIHtcbiAgICBjb21wYXJhdG9yID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKGFjdHVhbCkpIHtcbiAgICAgICAgLy8gTm8gc3Vic3RyaW5nIG1hdGNoaW5nIGFnYWluc3QgYHVuZGVmaW5lZGBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKChhY3R1YWwgPT09IG51bGwpIHx8IChleHBlY3RlZCA9PT0gbnVsbCkpIHtcbiAgICAgICAgLy8gTm8gc3Vic3RyaW5nIG1hdGNoaW5nIGFnYWluc3QgYG51bGxgOyBvbmx5IG1hdGNoIGFnYWluc3QgYG51bGxgXG4gICAgICAgIHJldHVybiBhY3R1YWwgPT09IGV4cGVjdGVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KGV4cGVjdGVkKSB8fCAoaXNPYmplY3QoYWN0dWFsKSAmJiAhaGFzQ3VzdG9tVG9TdHJpbmcoYWN0dWFsKSkpIHtcbiAgICAgICAgLy8gU2hvdWxkIG5vdCBjb21wYXJlIHByaW1pdGl2ZXMgYWdhaW5zdCBvYmplY3RzLCB1bmxlc3MgdGhleSBoYXZlIGN1c3RvbSBgdG9TdHJpbmdgIG1ldGhvZFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGFjdHVhbCA9IGxvd2VyY2FzZSgnJyArIGFjdHVhbCk7XG4gICAgICBleHBlY3RlZCA9IGxvd2VyY2FzZSgnJyArIGV4cGVjdGVkKTtcbiAgICAgIHJldHVybiBhY3R1YWwuaW5kZXhPZihleHBlY3RlZCkgIT09IC0xO1xuICAgIH07XG4gIH1cblxuICBwcmVkaWNhdGVGbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICBpZiAoc2hvdWxkTWF0Y2hQcmltaXRpdmVzICYmICFpc09iamVjdChpdGVtKSkge1xuICAgICAgcmV0dXJuIGRlZXBDb21wYXJlKGl0ZW0sIGV4cHJlc3Npb25bYW55UHJvcGVydHlLZXldLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gZGVlcENvbXBhcmUoaXRlbSwgZXhwcmVzc2lvbiwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIG1hdGNoQWdhaW5zdEFueVByb3ApO1xuICB9O1xuXG4gIHJldHVybiBwcmVkaWNhdGVGbjtcbn1cblxuZnVuY3Rpb24gZGVlcENvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIG1hdGNoQWdhaW5zdEFueVByb3AsIGRvbnRNYXRjaFdob2xlT2JqZWN0KSB7XG4gIHZhciBhY3R1YWxUeXBlID0gZ2V0VHlwZUZvckZpbHRlcihhY3R1YWwpO1xuICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZUZvckZpbHRlcihleHBlY3RlZCk7XG5cbiAgaWYgKChleHBlY3RlZFR5cGUgPT09ICdzdHJpbmcnKSAmJiAoZXhwZWN0ZWQuY2hhckF0KDApID09PSAnIScpKSB7XG4gICAgcmV0dXJuICFkZWVwQ29tcGFyZShhY3R1YWwsIGV4cGVjdGVkLnN1YnN0cmluZygxKSwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIG1hdGNoQWdhaW5zdEFueVByb3ApO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkoYWN0dWFsKSkge1xuICAgIC8vIEluIGNhc2UgYGFjdHVhbGAgaXMgYW4gYXJyYXksIGNvbnNpZGVyIGl0IGEgbWF0Y2hcbiAgICAvLyBpZiBBTlkgb2YgaXQncyBpdGVtcyBtYXRjaGVzIGBleHBlY3RlZGBcbiAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgcmV0dXJuIGRlZXBDb21wYXJlKGl0ZW0sIGV4cGVjdGVkLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7XG4gICAgfSk7XG4gIH1cblxuICBzd2l0Y2ggKGFjdHVhbFR5cGUpIHtcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgdmFyIGtleTtcbiAgICAgIGlmIChtYXRjaEFnYWluc3RBbnlQcm9wKSB7XG4gICAgICAgIGZvciAoa2V5IGluIGFjdHVhbCkge1xuICAgICAgICAgIGlmICgoa2V5LmNoYXJBdCgwKSAhPT0gJyQnKSAmJiBkZWVwQ29tcGFyZShhY3R1YWxba2V5XSwgZXhwZWN0ZWQsIGNvbXBhcmF0b3IsIGFueVByb3BlcnR5S2V5LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb250TWF0Y2hXaG9sZU9iamVjdCA/IGZhbHNlIDogZGVlcENvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGtleSBpbiBleHBlY3RlZCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZFZhbCA9IGV4cGVjdGVkW2tleV07XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRWYWwpIHx8IGlzVW5kZWZpbmVkKGV4cGVjdGVkVmFsKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG1hdGNoQW55UHJvcGVydHkgPSBrZXkgPT09IGFueVByb3BlcnR5S2V5O1xuICAgICAgICAgIHZhciBhY3R1YWxWYWwgPSBtYXRjaEFueVByb3BlcnR5ID8gYWN0dWFsIDogYWN0dWFsW2tleV07XG4gICAgICAgICAgaWYgKCFkZWVwQ29tcGFyZShhY3R1YWxWYWwsIGV4cGVjdGVkVmFsLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgbWF0Y2hBbnlQcm9wZXJ0eSwgbWF0Y2hBbnlQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihhY3R1YWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb21wYXJhdG9yKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICB9XG59XG5cbi8vIFVzZWQgZm9yIGVhc2lseSBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBgbnVsbGAgYW5kIGFjdHVhbCBgb2JqZWN0YFxuZnVuY3Rpb24gZ2V0VHlwZUZvckZpbHRlcih2YWwpIHtcbiAgcmV0dXJuICh2YWwgPT09IG51bGwpID8gJ251bGwnIDogdHlwZW9mIHZhbDtcbn1cblxudmFyIE1BWF9ESUdJVFMgPSAyMjtcbnZhciBERUNJTUFMX1NFUCA9ICcuJztcbnZhciBaRVJPX0NIQVIgPSAnMCc7XG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgY3VycmVuY3lcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGEgY3VycmVuY3kgKGllICQxLDIzNC41NikuIFdoZW4gbm8gY3VycmVuY3kgc3ltYm9sIGlzIHByb3ZpZGVkLCBkZWZhdWx0XG4gKiBzeW1ib2wgZm9yIGN1cnJlbnQgbG9jYWxlIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCBJbnB1dCB0byBmaWx0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZz19IHN5bWJvbCBDdXJyZW5jeSBzeW1ib2wgb3IgaWRlbnRpZmllciB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge251bWJlcj19IGZyYWN0aW9uU2l6ZSBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdGhlIGFtb3VudCB0bywgZGVmYXVsdHMgdG8gZGVmYXVsdCBtYXggZnJhY3Rpb24gc2l6ZSBmb3IgY3VycmVudCBsb2NhbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZvcm1hdHRlZCBudW1iZXIuXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJjdXJyZW5jeUV4YW1wbGVcIiBuYW1lPVwiY3VycmVuY3ktZmlsdGVyXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjdXJyZW5jeUV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAkc2NvcGUuYW1vdW50ID0gMTIzNC41NjtcbiAgICAgICAgICAgfV0pO1xuICAgICAgIDwvc2NyaXB0PlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwiYW1vdW50XCIgYXJpYS1sYWJlbD1cImFtb3VudFwiPiA8YnI+XG4gICAgICAgICBkZWZhdWx0IGN1cnJlbmN5IHN5bWJvbCAoJCk6IDxzcGFuIGlkPVwiY3VycmVuY3ktZGVmYXVsdFwiPnt7YW1vdW50IHwgY3VycmVuY3l9fTwvc3Bhbj48YnI+XG4gICAgICAgICBjdXN0b20gY3VycmVuY3kgaWRlbnRpZmllciAoVVNEJCk6IDxzcGFuIGlkPVwiY3VycmVuY3ktY3VzdG9tXCI+e3thbW91bnQgfCBjdXJyZW5jeTpcIlVTRCRcIn19PC9zcGFuPjxicj5cbiAgICAgICAgIG5vIGZyYWN0aW9ucyAoMCk6IDxzcGFuIGlkPVwiY3VycmVuY3ktbm8tZnJhY3Rpb25zXCI+e3thbW91bnQgfCBjdXJyZW5jeTpcIlVTRCRcIjowfX08L3NwYW4+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgaW5pdCB3aXRoIDEyMzQuNTYnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXJyZW5jeS1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnJDEsMjM0LjU2Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM0LjU2Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktbm8tZnJhY3Rpb25zJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM1Jyk7XG4gICAgICAgfSk7XG4gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09PSAnc2FmYXJpJykge1xuICAgICAgICAgICAvLyBTYWZhcmkgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgbWludXMga2V5LiBTZWVcbiAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNDgxXG4gICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2Ftb3VudCcpKS5jbGVhcigpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnYW1vdW50JykpLnNlbmRLZXlzKCctMTIzNCcpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LWRlZmF1bHQnKSkuZ2V0VGV4dCgpKS50b0JlKCctJDEsMjM0LjAwJyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnLVVTRCQxLDIzNC4wMCcpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LW5vLWZyYWN0aW9ucycpKS5nZXRUZXh0KCkpLnRvQmUoJy1VU0QkMSwyMzQnKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5jdXJyZW5jeUZpbHRlci4kaW5qZWN0ID0gWyckbG9jYWxlJ107XG5mdW5jdGlvbiBjdXJyZW5jeUZpbHRlcigkbG9jYWxlKSB7XG4gIHZhciBmb3JtYXRzID0gJGxvY2FsZS5OVU1CRVJfRk9STUFUUztcbiAgcmV0dXJuIGZ1bmN0aW9uKGFtb3VudCwgY3VycmVuY3lTeW1ib2wsIGZyYWN0aW9uU2l6ZSkge1xuICAgIGlmIChpc1VuZGVmaW5lZChjdXJyZW5jeVN5bWJvbCkpIHtcbiAgICAgIGN1cnJlbmN5U3ltYm9sID0gZm9ybWF0cy5DVVJSRU5DWV9TWU07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKGZyYWN0aW9uU2l6ZSkpIHtcbiAgICAgIGZyYWN0aW9uU2l6ZSA9IGZvcm1hdHMuUEFUVEVSTlNbMV0ubWF4RnJhYztcbiAgICB9XG5cbiAgICAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZCBwYXNzIGl0IHRocm91Z2hcbiAgICByZXR1cm4gKGFtb3VudCA9PSBudWxsKVxuICAgICAgICA/IGFtb3VudFxuICAgICAgICA6IGZvcm1hdE51bWJlcihhbW91bnQsIGZvcm1hdHMuUEFUVEVSTlNbMV0sIGZvcm1hdHMuR1JPVVBfU0VQLCBmb3JtYXRzLkRFQ0lNQUxfU0VQLCBmcmFjdGlvblNpemUpLlxuICAgICAgICAgICAgcmVwbGFjZSgvXFx1MDBBNC9nLCBjdXJyZW5jeVN5bWJvbCk7XG4gIH07XG59XG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgbnVtYmVyXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRm9ybWF0cyBhIG51bWJlciBhcyB0ZXh0LlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZCwgaXQgd2lsbCBqdXN0IGJlIHJldHVybmVkLlxuICogSWYgdGhlIGlucHV0IGlzIGluZmluaXRlIChJbmZpbml0eSBvciAtSW5maW5pdHkpLCB0aGUgSW5maW5pdHkgc3ltYm9sICfiiJ4nIG9yICct4oieJyBpcyByZXR1cm5lZCwgcmVzcGVjdGl2ZWx5LlxuICogSWYgdGhlIGlucHV0IGlzIG5vdCBhIG51bWJlciBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuXG4gKlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gbnVtYmVyIE51bWJlciB0byBmb3JtYXQuXG4gKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nKT19IGZyYWN0aW9uU2l6ZSBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdGhlIG51bWJlciB0by5cbiAqIElmIHRoaXMgaXMgbm90IHByb3ZpZGVkIHRoZW4gdGhlIGZyYWN0aW9uIHNpemUgaXMgY29tcHV0ZWQgZnJvbSB0aGUgY3VycmVudCBsb2NhbGUncyBudW1iZXJcbiAqIGZvcm1hdHRpbmcgcGF0dGVybi4gSW4gdGhlIGNhc2Ugb2YgdGhlIGRlZmF1bHQgbG9jYWxlLCBpdCB3aWxsIGJlIDMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBOdW1iZXIgcm91bmRlZCB0byBgZnJhY3Rpb25TaXplYCBhcHByb3ByaWF0ZWx5IGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgY3VycmVudFxuICogICAgICAgICAgICAgICAgICAgbG9jYWxlIChlLmcuLCBpbiB0aGUgZW5fVVMgbG9jYWxlIGl0IHdpbGwgaGF2ZSBcIi5cIiBhcyB0aGUgZGVjaW1hbCBzZXBhcmF0b3IgYW5kXG4gKiAgICAgICAgICAgICAgICAgICBpbmNsdWRlIFwiLFwiIGdyb3VwIHNlcGFyYXRvcnMgYWZ0ZXIgZWFjaCB0aGlyZCBkaWdpdCkuXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG1vZHVsZT1cIm51bWJlckZpbHRlckV4YW1wbGVcIiBuYW1lPVwibnVtYmVyLWZpbHRlclwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnbnVtYmVyRmlsdGVyRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS52YWwgPSAxMjM0LjU2Nzg5O1xuICAgICAgICAgICB9XSk7XG4gICAgICAgPC9zY3JpcHQ+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxsYWJlbD5FbnRlciBudW1iZXI6IDxpbnB1dCBuZy1tb2RlbD0ndmFsJz48L2xhYmVsPjxicj5cbiAgICAgICAgIERlZmF1bHQgZm9ybWF0dGluZzogPHNwYW4gaWQ9J251bWJlci1kZWZhdWx0Jz57e3ZhbCB8IG51bWJlcn19PC9zcGFuPjxicj5cbiAgICAgICAgIE5vIGZyYWN0aW9uczogPHNwYW4+e3t2YWwgfCBudW1iZXI6MH19PC9zcGFuPjxicj5cbiAgICAgICAgIE5lZ2F0aXZlIG51bWJlcjogPHNwYW4+e3stdmFsIHwgbnVtYmVyOjR9fTwvc3Bhbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgbnVtYmVycycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ251bWJlci1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnMSwyMzQuNTY4Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd2YWwgfCBudW1iZXI6MCcpKS5nZXRUZXh0KCkpLnRvQmUoJzEsMjM1Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCctdmFsIHwgbnVtYmVyOjQnKSkuZ2V0VGV4dCgpKS50b0JlKCctMSwyMzQuNTY3OScpO1xuICAgICAgIH0pO1xuXG4gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbCcpKS5jbGVhcigpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsJykpLnNlbmRLZXlzKCczMzc0LjMzMycpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ251bWJlci1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnMywzNzQuMzMzJyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd2YWwgfCBudW1iZXI6MCcpKS5nZXRUZXh0KCkpLnRvQmUoJzMsMzc0Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCctdmFsIHwgbnVtYmVyOjQnKSkuZ2V0VGV4dCgpKS50b0JlKCctMywzNzQuMzMzMCcpO1xuICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xubnVtYmVyRmlsdGVyLiRpbmplY3QgPSBbJyRsb2NhbGUnXTtcbmZ1bmN0aW9uIG51bWJlckZpbHRlcigkbG9jYWxlKSB7XG4gIHZhciBmb3JtYXRzID0gJGxvY2FsZS5OVU1CRVJfRk9STUFUUztcbiAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgZnJhY3Rpb25TaXplKSB7XG5cbiAgICAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZCBwYXNzIGl0IHRocm91Z2hcbiAgICByZXR1cm4gKG51bWJlciA9PSBudWxsKVxuICAgICAgICA/IG51bWJlclxuICAgICAgICA6IGZvcm1hdE51bWJlcihudW1iZXIsIGZvcm1hdHMuUEFUVEVSTlNbMF0sIGZvcm1hdHMuR1JPVVBfU0VQLCBmb3JtYXRzLkRFQ0lNQUxfU0VQLFxuICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvblNpemUpO1xuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgbnVtYmVyIChhcyBhIHN0cmluZykgaW50byB0aHJlZSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHVzZWRcbiAqIGZvciBmb3JtYXR0aW5nIHRoZSBudW1iZXIuXG4gKlxuICogKFNpZ25pZmljYW50IGJpdHMgb2YgdGhpcyBwYXJzZSBhbGdvcml0aG0gY2FtZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWtlTWNsL2JpZy5qcy8pXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBudW1TdHIgVGhlIG51bWJlciB0byBwYXJzZVxuICogQHJldHVybiB7b2JqZWN0fSBBbiBvYmplY3QgZGVzY3JpYmluZyB0aGlzIG51bWJlciwgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGtleXM6XG4gKiAgLSBkIDogYW4gYXJyYXkgb2YgZGlnaXRzIGNvbnRhaW5pbmcgbGVhZGluZyB6ZXJvcyBhcyBuZWNlc3NhcnlcbiAqICAtIGkgOiB0aGUgbnVtYmVyIG9mIHRoZSBkaWdpdHMgaW4gYGRgIHRoYXQgYXJlIHRvIHRoZSBsZWZ0IG9mIHRoZSBkZWNpbWFsIHBvaW50XG4gKiAgLSBlIDogdGhlIGV4cG9uZW50IGZvciBudW1iZXJzIHRoYXQgd291bGQgbmVlZCBtb3JlIHRoYW4gYE1BWF9ESUdJVFNgIGRpZ2l0cyBpbiBgZGBcbiAqXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKG51bVN0cikge1xuICB2YXIgZXhwb25lbnQgPSAwLCBkaWdpdHMsIG51bWJlck9mSW50ZWdlckRpZ2l0cztcbiAgdmFyIGksIGosIHplcm9zO1xuXG4gIC8vIERlY2ltYWwgcG9pbnQ/XG4gIGlmICgobnVtYmVyT2ZJbnRlZ2VyRGlnaXRzID0gbnVtU3RyLmluZGV4T2YoREVDSU1BTF9TRVApKSA+IC0xKSB7XG4gICAgbnVtU3RyID0gbnVtU3RyLnJlcGxhY2UoREVDSU1BTF9TRVAsICcnKTtcbiAgfVxuXG4gIC8vIEV4cG9uZW50aWFsIGZvcm0/XG4gIGlmICgoaSA9IG51bVN0ci5zZWFyY2goL2UvaSkpID4gMCkge1xuICAgIC8vIFdvcmsgb3V0IHRoZSBleHBvbmVudC5cbiAgICBpZiAobnVtYmVyT2ZJbnRlZ2VyRGlnaXRzIDwgMCkgbnVtYmVyT2ZJbnRlZ2VyRGlnaXRzID0gaTtcbiAgICBudW1iZXJPZkludGVnZXJEaWdpdHMgKz0gK251bVN0ci5zbGljZShpICsgMSk7XG4gICAgbnVtU3RyID0gbnVtU3RyLnN1YnN0cmluZygwLCBpKTtcbiAgfSBlbHNlIGlmIChudW1iZXJPZkludGVnZXJEaWdpdHMgPCAwKSB7XG4gICAgLy8gVGhlcmUgd2FzIG5vIGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQgc28gaXQgaXMgYW4gaW50ZWdlci5cbiAgICBudW1iZXJPZkludGVnZXJEaWdpdHMgPSBudW1TdHIubGVuZ3RoO1xuICB9XG5cbiAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zLlxuICBmb3IgKGkgPSAwOyBudW1TdHIuY2hhckF0KGkpID09PSBaRVJPX0NIQVI7IGkrKykgeyAvKiBlbXB0eSAqLyB9XG5cbiAgaWYgKGkgPT09ICh6ZXJvcyA9IG51bVN0ci5sZW5ndGgpKSB7XG4gICAgLy8gVGhlIGRpZ2l0cyBhcmUgYWxsIHplcm8uXG4gICAgZGlnaXRzID0gWzBdO1xuICAgIG51bWJlck9mSW50ZWdlckRpZ2l0cyA9IDE7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvc1xuICAgIHplcm9zLS07XG4gICAgd2hpbGUgKG51bVN0ci5jaGFyQXQoemVyb3MpID09PSBaRVJPX0NIQVIpIHplcm9zLS07XG5cbiAgICAvLyBUcmFpbGluZyB6ZXJvcyBhcmUgaW5zaWduaWZpY2FudCBzbyBpZ25vcmUgdGhlbVxuICAgIG51bWJlck9mSW50ZWdlckRpZ2l0cyAtPSBpO1xuICAgIGRpZ2l0cyA9IFtdO1xuICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIGFycmF5IG9mIGRpZ2l0cyB3aXRob3V0IGxlYWRpbmcvdHJhaWxpbmcgemVyb3MuXG4gICAgZm9yIChqID0gMDsgaSA8PSB6ZXJvczsgaSsrLCBqKyspIHtcbiAgICAgIGRpZ2l0c1tqXSA9ICtudW1TdHIuY2hhckF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBudW1iZXIgb3ZlcmZsb3dzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGlnaXRzIHRoZW4gdXNlIGFuIGV4cG9uZW50LlxuICBpZiAobnVtYmVyT2ZJbnRlZ2VyRGlnaXRzID4gTUFYX0RJR0lUUykge1xuICAgIGRpZ2l0cyA9IGRpZ2l0cy5zcGxpY2UoMCwgTUFYX0RJR0lUUyAtIDEpO1xuICAgIGV4cG9uZW50ID0gbnVtYmVyT2ZJbnRlZ2VyRGlnaXRzIC0gMTtcbiAgICBudW1iZXJPZkludGVnZXJEaWdpdHMgPSAxO1xuICB9XG5cbiAgcmV0dXJuIHsgZDogZGlnaXRzLCBlOiBleHBvbmVudCwgaTogbnVtYmVyT2ZJbnRlZ2VyRGlnaXRzIH07XG59XG5cbi8qKlxuICogUm91bmQgdGhlIHBhcnNlZCBudW1iZXIgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlZCB0aGUgcGFyc2VkTnVtYmVyIGluLXBsYWNlXG4gKi9cbmZ1bmN0aW9uIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgZnJhY3Rpb25TaXplLCBtaW5GcmFjLCBtYXhGcmFjKSB7XG4gICAgdmFyIGRpZ2l0cyA9IHBhcnNlZE51bWJlci5kO1xuICAgIHZhciBmcmFjdGlvbkxlbiA9IGRpZ2l0cy5sZW5ndGggLSBwYXJzZWROdW1iZXIuaTtcblxuICAgIC8vIGRldGVybWluZSBmcmFjdGlvblNpemUgaWYgaXQgaXMgbm90IHNwZWNpZmllZDsgYCtmcmFjdGlvblNpemVgIGNvbnZlcnRzIGl0IHRvIGEgbnVtYmVyXG4gICAgZnJhY3Rpb25TaXplID0gKGlzVW5kZWZpbmVkKGZyYWN0aW9uU2l6ZSkpID8gTWF0aC5taW4oTWF0aC5tYXgobWluRnJhYywgZnJhY3Rpb25MZW4pLCBtYXhGcmFjKSA6ICtmcmFjdGlvblNpemU7XG5cbiAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0IHRvIHdoZXJlIHJvdW5kaW5nIGlzIHRvIG9jY3VyXG4gICAgdmFyIHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyBwYXJzZWROdW1iZXIuaTtcbiAgICB2YXIgZGlnaXQgPSBkaWdpdHNbcm91bmRBdF07XG5cbiAgICBpZiAocm91bmRBdCA+IDApIHtcbiAgICAgIC8vIERyb3AgZnJhY3Rpb25hbCBkaWdpdHMgYmV5b25kIGByb3VuZEF0YFxuICAgICAgZGlnaXRzLnNwbGljZShNYXRoLm1heChwYXJzZWROdW1iZXIuaSwgcm91bmRBdCkpO1xuXG4gICAgICAvLyBTZXQgbm9uLWZyYWN0aW9uYWwgZGlnaXRzIGJleW9uZCBgcm91bmRBdGAgdG8gMFxuICAgICAgZm9yICh2YXIgaiA9IHJvdW5kQXQ7IGogPCBkaWdpdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGlnaXRzW2pdID0gMDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugcm91bmRlZCB0byB6ZXJvIHNvIHJlc2V0IHRoZSBwYXJzZWROdW1iZXJcbiAgICAgIGZyYWN0aW9uTGVuID0gTWF0aC5tYXgoMCwgZnJhY3Rpb25MZW4pO1xuICAgICAgcGFyc2VkTnVtYmVyLmkgPSAxO1xuICAgICAgZGlnaXRzLmxlbmd0aCA9IE1hdGgubWF4KDEsIHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyAxKTtcbiAgICAgIGRpZ2l0c1swXSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJvdW5kQXQ7IGkrKykgZGlnaXRzW2ldID0gMDtcbiAgICB9XG5cbiAgICBpZiAoZGlnaXQgPj0gNSkge1xuICAgICAgaWYgKHJvdW5kQXQgLSAxIDwgMCkge1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA+IHJvdW5kQXQ7IGstLSkge1xuICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApO1xuICAgICAgICAgIHBhcnNlZE51bWJlci5pKys7XG4gICAgICAgIH1cbiAgICAgICAgZGlnaXRzLnVuc2hpZnQoMSk7XG4gICAgICAgIHBhcnNlZE51bWJlci5pKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWdpdHNbcm91bmRBdCAtIDFdKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGFkIG91dCB3aXRoIHplcm9zIHRvIGdldCB0aGUgcmVxdWlyZWQgZnJhY3Rpb24gbGVuZ3RoXG4gICAgZm9yICg7IGZyYWN0aW9uTGVuIDwgTWF0aC5tYXgoMCwgZnJhY3Rpb25TaXplKTsgZnJhY3Rpb25MZW4rKykgZGlnaXRzLnB1c2goMCk7XG5cblxuICAgIC8vIERvIGFueSBjYXJyeWluZywgZS5nLiBhIGRpZ2l0IHdhcyByb3VuZGVkIHVwIHRvIDEwXG4gICAgdmFyIGNhcnJ5ID0gZGlnaXRzLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uKGNhcnJ5LCBkLCBpLCBkaWdpdHMpIHtcbiAgICAgIGQgPSBkICsgY2Fycnk7XG4gICAgICBkaWdpdHNbaV0gPSBkICUgMTA7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihkIC8gMTApO1xuICAgIH0sIDApO1xuICAgIGlmIChjYXJyeSkge1xuICAgICAgZGlnaXRzLnVuc2hpZnQoY2FycnkpO1xuICAgICAgcGFyc2VkTnVtYmVyLmkrKztcbiAgICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGEgbnVtYmVyIGludG8gYSBzdHJpbmdcbiAqIEBwYXJhbSAge251bWJlcn0gbnVtYmVyICAgICAgIFRoZSBudW1iZXIgdG8gZm9ybWF0XG4gKiBAcGFyYW0gIHt7XG4gKiAgICAgICAgICAgbWluRnJhYywgLy8gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgZnJhY3Rpb24gcGFydCBvZiB0aGUgbnVtYmVyXG4gKiAgICAgICAgICAgbWF4RnJhYywgLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgZnJhY3Rpb24gcGFydCBvZiB0aGUgbnVtYmVyXG4gKiAgICAgICAgICAgZ1NpemUsICAgLy8gbnVtYmVyIG9mIGRpZ2l0cyBpbiBlYWNoIGdyb3VwIG9mIHNlcGFyYXRlZCBkaWdpdHNcbiAqICAgICAgICAgICBsZ1NpemUsICAvLyBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBsYXN0IGdyb3VwIG9mIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgc2VwYXJhdG9yXG4gKiAgICAgICAgICAgbmVnUHJlLCAgLy8gdGhlIHN0cmluZyB0byBnbyBpbiBmcm9udCBvZiBhIG5lZ2F0aXZlIG51bWJlciAoZS5nLiBgLWAgb3IgYChgKSlcbiAqICAgICAgICAgICBwb3NQcmUsICAvLyB0aGUgc3RyaW5nIHRvIGdvIGluIGZyb250IG9mIGEgcG9zaXRpdmUgbnVtYmVyXG4gKiAgICAgICAgICAgbmVnU3VmLCAgLy8gdGhlIHN0cmluZyB0byBnbyBhZnRlciBhIG5lZ2F0aXZlIG51bWJlciAoZS5nLiBgKWApXG4gKiAgICAgICAgICAgcG9zU3VmICAgLy8gdGhlIHN0cmluZyB0byBnbyBhZnRlciBhIHBvc2l0aXZlIG51bWJlclxuICogICAgICAgICB9fSBwYXR0ZXJuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGdyb3VwU2VwICAgICBUaGUgc3RyaW5nIHRvIHNlcGFyYXRlIGdyb3VwcyBvZiBudW1iZXIgKGUuZy4gYCxgKVxuICogQHBhcmFtICB7c3RyaW5nfSBkZWNpbWFsU2VwICAgVGhlIHN0cmluZyB0byBhY3QgYXMgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIChlLmcuIGAuYClcbiAqIEBwYXJhbSAge1t0eXBlXX0gZnJhY3Rpb25TaXplIFRoZSBzaXplIG9mIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIG51bWJlclxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgVGhlIG51bWJlciBmb3JtYXR0ZWQgYXMgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG51bWJlciwgcGF0dGVybiwgZ3JvdXBTZXAsIGRlY2ltYWxTZXAsIGZyYWN0aW9uU2l6ZSkge1xuXG4gIGlmICghKGlzU3RyaW5nKG51bWJlcikgfHwgaXNOdW1iZXIobnVtYmVyKSkgfHwgaXNOYU4obnVtYmVyKSkgcmV0dXJuICcnO1xuXG4gIHZhciBpc0luZmluaXR5ID0gIWlzRmluaXRlKG51bWJlcik7XG4gIHZhciBpc1plcm8gPSBmYWxzZTtcbiAgdmFyIG51bVN0ciA9IE1hdGguYWJzKG51bWJlcikgKyAnJyxcbiAgICAgIGZvcm1hdHRlZFRleHQgPSAnJyxcbiAgICAgIHBhcnNlZE51bWJlcjtcblxuICBpZiAoaXNJbmZpbml0eSkge1xuICAgIGZvcm1hdHRlZFRleHQgPSAnXFx1MjIxZSc7XG4gIH0gZWxzZSB7XG4gICAgcGFyc2VkTnVtYmVyID0gcGFyc2UobnVtU3RyKTtcblxuICAgIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgZnJhY3Rpb25TaXplLCBwYXR0ZXJuLm1pbkZyYWMsIHBhdHRlcm4ubWF4RnJhYyk7XG5cbiAgICB2YXIgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmQ7XG4gICAgdmFyIGludGVnZXJMZW4gPSBwYXJzZWROdW1iZXIuaTtcbiAgICB2YXIgZXhwb25lbnQgPSBwYXJzZWROdW1iZXIuZTtcbiAgICB2YXIgZGVjaW1hbHMgPSBbXTtcbiAgICBpc1plcm8gPSBkaWdpdHMucmVkdWNlKGZ1bmN0aW9uKGlzWmVybywgZCkgeyByZXR1cm4gaXNaZXJvICYmICFkOyB9LCB0cnVlKTtcblxuICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVyc1xuICAgIHdoaWxlIChpbnRlZ2VyTGVuIDwgMCkge1xuICAgICAgZGlnaXRzLnVuc2hpZnQoMCk7XG4gICAgICBpbnRlZ2VyTGVuKys7XG4gICAgfVxuXG4gICAgLy8gZXh0cmFjdCBkZWNpbWFscyBkaWdpdHNcbiAgICBpZiAoaW50ZWdlckxlbiA+IDApIHtcbiAgICAgIGRlY2ltYWxzID0gZGlnaXRzLnNwbGljZShpbnRlZ2VyTGVuLCBkaWdpdHMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjaW1hbHMgPSBkaWdpdHM7XG4gICAgICBkaWdpdHMgPSBbMF07XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IHRoZSBpbnRlZ2VyIGRpZ2l0cyB3aXRoIGdyb3VwaW5nIHNlcGFyYXRvcnNcbiAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgaWYgKGRpZ2l0cy5sZW5ndGggPj0gcGF0dGVybi5sZ1NpemUpIHtcbiAgICAgIGdyb3Vwcy51bnNoaWZ0KGRpZ2l0cy5zcGxpY2UoLXBhdHRlcm4ubGdTaXplLCBkaWdpdHMubGVuZ3RoKS5qb2luKCcnKSk7XG4gICAgfVxuICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoID4gcGF0dGVybi5nU2l6ZSkge1xuICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLnNwbGljZSgtcGF0dGVybi5nU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpO1xuICAgIH1cbiAgICBpZiAoZGlnaXRzLmxlbmd0aCkge1xuICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLmpvaW4oJycpKTtcbiAgICB9XG4gICAgZm9ybWF0dGVkVGV4dCA9IGdyb3Vwcy5qb2luKGdyb3VwU2VwKTtcblxuICAgIC8vIGFwcGVuZCB0aGUgZGVjaW1hbCBkaWdpdHNcbiAgICBpZiAoZGVjaW1hbHMubGVuZ3RoKSB7XG4gICAgICBmb3JtYXR0ZWRUZXh0ICs9IGRlY2ltYWxTZXAgKyBkZWNpbWFscy5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoZXhwb25lbnQpIHtcbiAgICAgIGZvcm1hdHRlZFRleHQgKz0gJ2UrJyArIGV4cG9uZW50O1xuICAgIH1cbiAgfVxuICBpZiAobnVtYmVyIDwgMCAmJiAhaXNaZXJvKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4ubmVnUHJlICsgZm9ybWF0dGVkVGV4dCArIHBhdHRlcm4ubmVnU3VmO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXR0ZXJuLnBvc1ByZSArIGZvcm1hdHRlZFRleHQgKyBwYXR0ZXJuLnBvc1N1ZjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYWROdW1iZXIobnVtLCBkaWdpdHMsIHRyaW0sIG5lZ1dyYXApIHtcbiAgdmFyIG5lZyA9ICcnO1xuICBpZiAobnVtIDwgMCB8fCAobmVnV3JhcCAmJiBudW0gPD0gMCkpIHtcbiAgICBpZiAobmVnV3JhcCkge1xuICAgICAgbnVtID0gLW51bSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG51bSA9IC1udW07XG4gICAgICBuZWcgPSAnLSc7XG4gICAgfVxuICB9XG4gIG51bSA9ICcnICsgbnVtO1xuICB3aGlsZSAobnVtLmxlbmd0aCA8IGRpZ2l0cykgbnVtID0gWkVST19DSEFSICsgbnVtO1xuICBpZiAodHJpbSkge1xuICAgIG51bSA9IG51bS5zdWJzdHIobnVtLmxlbmd0aCAtIGRpZ2l0cyk7XG4gIH1cbiAgcmV0dXJuIG5lZyArIG51bTtcbn1cblxuXG5mdW5jdGlvbiBkYXRlR2V0dGVyKG5hbWUsIHNpemUsIG9mZnNldCwgdHJpbSwgbmVnV3JhcCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgdmFsdWUgPSBkYXRlWydnZXQnICsgbmFtZV0oKTtcbiAgICBpZiAob2Zmc2V0ID4gMCB8fCB2YWx1ZSA+IC1vZmZzZXQpIHtcbiAgICAgIHZhbHVlICs9IG9mZnNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAwICYmIG9mZnNldCA9PT0gLTEyKSB2YWx1ZSA9IDEyO1xuICAgIHJldHVybiBwYWROdW1iZXIodmFsdWUsIHNpemUsIHRyaW0sIG5lZ1dyYXApO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkYXRlU3RyR2V0dGVyKG5hbWUsIHNob3J0Rm9ybSwgc3RhbmRBbG9uZSkge1xuICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgZm9ybWF0cykge1xuICAgIHZhciB2YWx1ZSA9IGRhdGVbJ2dldCcgKyBuYW1lXSgpO1xuICAgIHZhciBwcm9wUHJlZml4ID0gKHN0YW5kQWxvbmUgPyAnU1RBTkRBTE9ORScgOiAnJykgKyAoc2hvcnRGb3JtID8gJ1NIT1JUJyA6ICcnKTtcbiAgICB2YXIgZ2V0ID0gdXBwZXJjYXNlKHByb3BQcmVmaXggKyBuYW1lKTtcblxuICAgIHJldHVybiBmb3JtYXRzW2dldF1bdmFsdWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0aW1lWm9uZUdldHRlcihkYXRlLCBmb3JtYXRzLCBvZmZzZXQpIHtcbiAgdmFyIHpvbmUgPSAtMSAqIG9mZnNldDtcbiAgdmFyIHBhZGRlZFpvbmUgPSAoem9uZSA+PSAwKSA/ICcrJyA6ICcnO1xuXG4gIHBhZGRlZFpvbmUgKz0gcGFkTnVtYmVyKE1hdGhbem9uZSA+IDAgPyAnZmxvb3InIDogJ2NlaWwnXSh6b25lIC8gNjApLCAyKSArXG4gICAgICAgICAgICAgICAgcGFkTnVtYmVyKE1hdGguYWJzKHpvbmUgJSA2MCksIDIpO1xuXG4gIHJldHVybiBwYWRkZWRab25lO1xufVxuXG5mdW5jdGlvbiBnZXRGaXJzdFRodXJzZGF5T2ZZZWFyKHllYXIpIHtcbiAgICAvLyAwID0gaW5kZXggb2YgSmFudWFyeVxuICAgIHZhciBkYXlPZldlZWtPbkZpcnN0ID0gKG5ldyBEYXRlKHllYXIsIDAsIDEpKS5nZXREYXkoKTtcbiAgICAvLyA0ID0gaW5kZXggb2YgVGh1cnNkYXkgKCsxIHRvIGFjY291bnQgZm9yIDFzdCA9IDUpXG4gICAgLy8gMTEgPSBpbmRleCBvZiAqbmV4dCogVGh1cnNkYXkgKCsxIGFjY291bnQgZm9yIDFzdCA9IDEyKVxuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAoKGRheU9mV2Vla09uRmlyc3QgPD0gNCkgPyA1IDogMTIpIC0gZGF5T2ZXZWVrT25GaXJzdCk7XG59XG5cbmZ1bmN0aW9uIGdldFRodXJzZGF5VGhpc1dlZWsoZGF0ZXRpbWUpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZXRpbWUuZ2V0RnVsbFllYXIoKSwgZGF0ZXRpbWUuZ2V0TW9udGgoKSxcbiAgICAgIC8vIDQgPSBpbmRleCBvZiBUaHVyc2RheVxuICAgICAgZGF0ZXRpbWUuZ2V0RGF0ZSgpICsgKDQgLSBkYXRldGltZS5nZXREYXkoKSkpO1xufVxuXG5mdW5jdGlvbiB3ZWVrR2V0dGVyKHNpemUpIHtcbiAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICB2YXIgZmlyc3RUaHVycyA9IGdldEZpcnN0VGh1cnNkYXlPZlllYXIoZGF0ZS5nZXRGdWxsWWVhcigpKSxcbiAgICAgICAgIHRoaXNUaHVycyA9IGdldFRodXJzZGF5VGhpc1dlZWsoZGF0ZSk7XG5cbiAgICAgIHZhciBkaWZmID0gK3RoaXNUaHVycyAtICtmaXJzdFRodXJzLFxuICAgICAgICAgcmVzdWx0ID0gMSArIE1hdGgucm91bmQoZGlmZiAvIDYuMDQ4ZTgpOyAvLyA2LjA0OGU4IG1zIHBlciB3ZWVrXG5cbiAgICAgIHJldHVybiBwYWROdW1iZXIocmVzdWx0LCBzaXplKTtcbiAgIH07XG59XG5cbmZ1bmN0aW9uIGFtcG1HZXR0ZXIoZGF0ZSwgZm9ybWF0cykge1xuICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgMTIgPyBmb3JtYXRzLkFNUE1TWzBdIDogZm9ybWF0cy5BTVBNU1sxXTtcbn1cblxuZnVuY3Rpb24gZXJhR2V0dGVyKGRhdGUsIGZvcm1hdHMpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSA8PSAwID8gZm9ybWF0cy5FUkFTWzBdIDogZm9ybWF0cy5FUkFTWzFdO1xufVxuXG5mdW5jdGlvbiBsb25nRXJhR2V0dGVyKGRhdGUsIGZvcm1hdHMpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSA8PSAwID8gZm9ybWF0cy5FUkFOQU1FU1swXSA6IGZvcm1hdHMuRVJBTkFNRVNbMV07XG59XG5cbnZhciBEQVRFX0ZPUk1BVFMgPSB7XG4gIHl5eXk6IGRhdGVHZXR0ZXIoJ0Z1bGxZZWFyJywgNCwgMCwgZmFsc2UsIHRydWUpLFxuICAgIHl5OiBkYXRlR2V0dGVyKCdGdWxsWWVhcicsIDIsIDAsIHRydWUsIHRydWUpLFxuICAgICB5OiBkYXRlR2V0dGVyKCdGdWxsWWVhcicsIDEsIDAsIGZhbHNlLCB0cnVlKSxcbiAgTU1NTTogZGF0ZVN0ckdldHRlcignTW9udGgnKSxcbiAgIE1NTTogZGF0ZVN0ckdldHRlcignTW9udGgnLCB0cnVlKSxcbiAgICBNTTogZGF0ZUdldHRlcignTW9udGgnLCAyLCAxKSxcbiAgICAgTTogZGF0ZUdldHRlcignTW9udGgnLCAxLCAxKSxcbiAgTExMTDogZGF0ZVN0ckdldHRlcignTW9udGgnLCBmYWxzZSwgdHJ1ZSksXG4gICAgZGQ6IGRhdGVHZXR0ZXIoJ0RhdGUnLCAyKSxcbiAgICAgZDogZGF0ZUdldHRlcignRGF0ZScsIDEpLFxuICAgIEhIOiBkYXRlR2V0dGVyKCdIb3VycycsIDIpLFxuICAgICBIOiBkYXRlR2V0dGVyKCdIb3VycycsIDEpLFxuICAgIGhoOiBkYXRlR2V0dGVyKCdIb3VycycsIDIsIC0xMiksXG4gICAgIGg6IGRhdGVHZXR0ZXIoJ0hvdXJzJywgMSwgLTEyKSxcbiAgICBtbTogZGF0ZUdldHRlcignTWludXRlcycsIDIpLFxuICAgICBtOiBkYXRlR2V0dGVyKCdNaW51dGVzJywgMSksXG4gICAgc3M6IGRhdGVHZXR0ZXIoJ1NlY29uZHMnLCAyKSxcbiAgICAgczogZGF0ZUdldHRlcignU2Vjb25kcycsIDEpLFxuICAgICAvLyB3aGlsZSBJU08gODYwMSByZXF1aXJlcyBmcmFjdGlvbnMgdG8gYmUgcHJlZml4ZWQgd2l0aCBgLmAgb3IgYCxgXG4gICAgIC8vIHdlIGNhbiBiZSBqdXN0IHNhZmVseSByZWx5IG9uIHVzaW5nIGBzc3NgIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHNpbmdsZSBvciB0d28gZGlnaXQgZnJhY3Rpb25zXG4gICBzc3M6IGRhdGVHZXR0ZXIoJ01pbGxpc2Vjb25kcycsIDMpLFxuICBFRUVFOiBkYXRlU3RyR2V0dGVyKCdEYXknKSxcbiAgIEVFRTogZGF0ZVN0ckdldHRlcignRGF5JywgdHJ1ZSksXG4gICAgIGE6IGFtcG1HZXR0ZXIsXG4gICAgIFo6IHRpbWVab25lR2V0dGVyLFxuICAgIHd3OiB3ZWVrR2V0dGVyKDIpLFxuICAgICB3OiB3ZWVrR2V0dGVyKDEpLFxuICAgICBHOiBlcmFHZXR0ZXIsXG4gICAgIEdHOiBlcmFHZXR0ZXIsXG4gICAgIEdHRzogZXJhR2V0dGVyLFxuICAgICBHR0dHOiBsb25nRXJhR2V0dGVyXG59O1xuXG52YXIgREFURV9GT1JNQVRTX1NQTElUID0gLygoPzpbXnlNTGRIaG1zYVpFd0cnXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpFK3x5K3xNK3xMK3xkK3xIK3xoK3xtK3xzK3xhfFp8Ryt8dyspKSguKikvLFxuICAgIE5VTUJFUl9TVFJJTkcgPSAvXi0/XFxkKyQvO1xuXG4vKipcbiAqIEBuZ2RvYyBmaWx0ZXJcbiAqIEBuYW1lIGRhdGVcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiAgIEZvcm1hdHMgYGRhdGVgIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgYGZvcm1hdGAuXG4gKlxuICogICBgZm9ybWF0YCBzdHJpbmcgY2FuIGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6XG4gKlxuICogICAqIGAneXl5eSdgOiA0IGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIgKGUuZy4gQUQgMSA9PiAwMDAxLCBBRCAyMDEwID0+IDIwMTApXG4gKiAgICogYCd5eSdgOiAyIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIsIHBhZGRlZCAoMDAtOTkpLiAoZS5nLiBBRCAyMDAxID0+IDAxLCBBRCAyMDEwID0+IDEwKVxuICogICAqIGAneSdgOiAxIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIsIGUuZy4gKEFEIDEgPT4gMSwgQUQgMTk5ID0+IDE5OSlcbiAqICAgKiBgJ01NTU0nYDogTW9udGggaW4geWVhciAoSmFudWFyeS1EZWNlbWJlcilcbiAqICAgKiBgJ01NTSdgOiBNb250aCBpbiB5ZWFyIChKYW4tRGVjKVxuICogICAqIGAnTU0nYDogTW9udGggaW4geWVhciwgcGFkZGVkICgwMS0xMilcbiAqICAgKiBgJ00nYDogTW9udGggaW4geWVhciAoMS0xMilcbiAqICAgKiBgJ0xMTEwnYDogU3RhbmQtYWxvbmUgbW9udGggaW4geWVhciAoSmFudWFyeS1EZWNlbWJlcilcbiAqICAgKiBgJ2RkJ2A6IERheSBpbiBtb250aCwgcGFkZGVkICgwMS0zMSlcbiAqICAgKiBgJ2QnYDogRGF5IGluIG1vbnRoICgxLTMxKVxuICogICAqIGAnRUVFRSdgOiBEYXkgaW4gV2VlaywoU3VuZGF5LVNhdHVyZGF5KVxuICogICAqIGAnRUVFJ2A6IERheSBpbiBXZWVrLCAoU3VuLVNhdClcbiAqICAgKiBgJ0hIJ2A6IEhvdXIgaW4gZGF5LCBwYWRkZWQgKDAwLTIzKVxuICogICAqIGAnSCdgOiBIb3VyIGluIGRheSAoMC0yMylcbiAqICAgKiBgJ2hoJ2A6IEhvdXIgaW4gQU0vUE0sIHBhZGRlZCAoMDEtMTIpXG4gKiAgICogYCdoJ2A6IEhvdXIgaW4gQU0vUE0sICgxLTEyKVxuICogICAqIGAnbW0nYDogTWludXRlIGluIGhvdXIsIHBhZGRlZCAoMDAtNTkpXG4gKiAgICogYCdtJ2A6IE1pbnV0ZSBpbiBob3VyICgwLTU5KVxuICogICAqIGAnc3MnYDogU2Vjb25kIGluIG1pbnV0ZSwgcGFkZGVkICgwMC01OSlcbiAqICAgKiBgJ3MnYDogU2Vjb25kIGluIG1pbnV0ZSAoMC01OSlcbiAqICAgKiBgJ3NzcydgOiBNaWxsaXNlY29uZCBpbiBzZWNvbmQsIHBhZGRlZCAoMDAwLTk5OSlcbiAqICAgKiBgJ2EnYDogQU0vUE0gbWFya2VyXG4gKiAgICogYCdaJ2A6IDQgZGlnaXQgKCtzaWduKSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGltZXpvbmUgb2Zmc2V0ICgtMTIwMC0rMTIwMClcbiAqICAgKiBgJ3d3J2A6IFdlZWsgb2YgeWVhciwgcGFkZGVkICgwMC01MykuIFdlZWsgMDEgaXMgdGhlIHdlZWsgd2l0aCB0aGUgZmlyc3QgVGh1cnNkYXkgb2YgdGhlIHllYXJcbiAqICAgKiBgJ3cnYDogV2VlayBvZiB5ZWFyICgwLTUzKS4gV2VlayAxIGlzIHRoZSB3ZWVrIHdpdGggdGhlIGZpcnN0IFRodXJzZGF5IG9mIHRoZSB5ZWFyXG4gKiAgICogYCdHJ2AsIGAnR0cnYCwgYCdHR0cnYDogVGhlIGFiYnJldmlhdGVkIGZvcm0gb2YgdGhlIGVyYSBzdHJpbmcgKGUuZy4gJ0FEJylcbiAqICAgKiBgJ0dHR0cnYDogVGhlIGxvbmcgZm9ybSBvZiB0aGUgZXJhIHN0cmluZyAoZS5nLiAnQW5ubyBEb21pbmknKVxuICpcbiAqICAgYGZvcm1hdGAgc3RyaW5nIGNhbiBhbHNvIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHByZWRlZmluZWRcbiAqICAge0BsaW5rIGd1aWRlL2kxOG4gbG9jYWxpemFibGUgZm9ybWF0c306XG4gKlxuICogICAqIGAnbWVkaXVtJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSBoOm1tOnNzIGEnYCBmb3IgZW5fVVMgbG9jYWxlXG4gKiAgICAgKGUuZy4gU2VwIDMsIDIwMTAgMTI6MDU6MDggUE0pXG4gKiAgICogYCdzaG9ydCdgOiBlcXVpdmFsZW50IHRvIGAnTS9kL3l5IGg6bW0gYSdgIGZvciBlbl9VUyAgbG9jYWxlIChlLmcuIDkvMy8xMCAxMjowNSBQTSlcbiAqICAgKiBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdFRUVFLCBNTU1NIGQsIHknYCBmb3IgZW5fVVMgIGxvY2FsZVxuICogICAgIChlLmcuIEZyaWRheSwgU2VwdGVtYmVyIDMsIDIwMTApXG4gKiAgICogYCdsb25nRGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAnTU1NTSBkLCB5J2AgZm9yIGVuX1VTICBsb2NhbGUgKGUuZy4gU2VwdGVtYmVyIDMsIDIwMTApXG4gKiAgICogYCdtZWRpdW1EYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSdgIGZvciBlbl9VUyAgbG9jYWxlIChlLmcuIFNlcCAzLCAyMDEwKVxuICogICAqIGAnc2hvcnREYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXknYCBmb3IgZW5fVVMgbG9jYWxlIChlLmcuIDkvMy8xMClcbiAqICAgKiBgJ21lZGl1bVRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW06c3MgYSdgIGZvciBlbl9VUyBsb2NhbGUgKGUuZy4gMTI6MDU6MDggUE0pXG4gKiAgICogYCdzaG9ydFRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW0gYSdgIGZvciBlbl9VUyBsb2NhbGUgKGUuZy4gMTI6MDUgUE0pXG4gKlxuICogICBgZm9ybWF0YCBzdHJpbmcgY2FuIGNvbnRhaW4gbGl0ZXJhbCB2YWx1ZXMuIFRoZXNlIG5lZWQgdG8gYmUgZXNjYXBlZCBieSBzdXJyb3VuZGluZyB3aXRoIHNpbmdsZSBxdW90ZXMgKGUuZy5cbiAqICAgYFwiaCAnaW4gdGhlIG1vcm5pbmcnXCJgKS4gSW4gb3JkZXIgdG8gb3V0cHV0IGEgc2luZ2xlIHF1b3RlLCBlc2NhcGUgaXQgLSBpLmUuLCB0d28gc2luZ2xlIHF1b3RlcyBpbiBhIHNlcXVlbmNlXG4gKiAgIChlLmcuIGBcImggJ28nJ2Nsb2NrJ1wiYCkuXG4gKlxuICogQHBhcmFtIHsoRGF0ZXxudW1iZXJ8c3RyaW5nKX0gZGF0ZSBEYXRlIHRvIGZvcm1hdCBlaXRoZXIgYXMgRGF0ZSBvYmplY3QsIG1pbGxpc2Vjb25kcyAoc3RyaW5nIG9yXG4gKiAgICBudW1iZXIpIG9yIHZhcmlvdXMgSVNPIDg2MDEgZGF0ZXRpbWUgc3RyaW5nIGZvcm1hdHMgKGUuZy4geXl5eS1NTS1kZFRISDptbTpzcy5zc3NaIGFuZCBpdHNcbiAqICAgIHNob3J0ZXIgdmVyc2lvbnMgbGlrZSB5eXl5LU1NLWRkVEhIOm1tWiwgeXl5eS1NTS1kZCBvciB5eXl5TU1kZFRISG1tc3NaKS4gSWYgbm8gdGltZXpvbmUgaXNcbiAqICAgIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGlucHV0LCB0aGUgdGltZSBpcyBjb25zaWRlcmVkIHRvIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gZm9ybWF0IEZvcm1hdHRpbmcgcnVsZXMgKHNlZSBEZXNjcmlwdGlvbikuIElmIG5vdCBzcGVjaWZpZWQsXG4gKiAgICBgbWVkaXVtRGF0ZWAgaXMgdXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gdGltZXpvbmUgVGltZXpvbmUgdG8gYmUgdXNlZCBmb3IgZm9ybWF0dGluZy4gSXQgdW5kZXJzdGFuZHMgVVRDL0dNVCBhbmQgdGhlXG4gKiAgICBjb250aW5lbnRhbCBVUyB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucywgYnV0IGZvciBnZW5lcmFsIHVzZSwgdXNlIGEgdGltZSB6b25lIG9mZnNldCwgZm9yXG4gKiAgICBleGFtcGxlLCBgJyswNDMwJ2AgKDQgaG91cnMsIDMwIG1pbnV0ZXMgZWFzdCBvZiB0aGUgR3JlZW53aWNoIG1lcmlkaWFuKVxuICogICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyIHdpbGwgYmUgdXNlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZvcm1hdHRlZCBzdHJpbmcgb3IgdGhlIGlucHV0IGlmIGlucHV0IGlzIG5vdCByZWNvZ25pemVkIGFzIGRhdGUvbWlsbGlzLlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwiZmlsdGVyLWRhdGVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8c3BhbiBuZy1ub24tYmluZGFibGU+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZTonbWVkaXVtJ319PC9zcGFuPjpcbiAgICAgICAgICAgPHNwYW4+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZTonbWVkaXVtJ319PC9zcGFuPjxicj5cbiAgICAgICA8c3BhbiBuZy1ub24tYmluZGFibGU+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJ319PC9zcGFuPjpcbiAgICAgICAgICA8c3Bhbj57ezEyODgzMjM2MjMwMDYgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tOnNzIFonfX08L3NwYW4+PGJyPlxuICAgICAgIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57ezEyODgzMjM2MjMwMDYgfCBkYXRlOidNTS9kZC95eXl5IEAgaDptbWEnfX08L3NwYW4+OlxuICAgICAgICAgIDxzcGFuPnt7JzEyODgzMjM2MjMwMDYnIHwgZGF0ZTonTU0vZGQveXl5eSBAIGg6bW1hJ319PC9zcGFuPjxicj5cbiAgICAgICA8c3BhbiBuZy1ub24tYmluZGFibGU+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZTpcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVwifX08L3NwYW4+OlxuICAgICAgICAgIDxzcGFuPnt7JzEyODgzMjM2MjMwMDYnIHwgZGF0ZTpcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVwifX08L3NwYW4+PGJyPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGZvcm1hdCBkYXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKFwiMTI4ODMyMzYyMzAwNiB8IGRhdGU6J21lZGl1bSdcIikpLmdldFRleHQoKSkuXG4gICAgICAgICAgICB0b01hdGNoKC9PY3QgMlxcZCwgMjAxMCBcXGR7MSwyfTpcXGR7Mn06XFxkezJ9IChBTXxQTSkvKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoXCIxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJ1wiKSkuZ2V0VGV4dCgpKS5cbiAgICAgICAgICAgIHRvTWF0Y2goLzIwMTAtMTAtMlxcZCBcXGR7Mn06XFxkezJ9OlxcZHsyfSAoLXxcXCspP1xcZHs0fS8pO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZyhcIicxMjg4MzIzNjIzMDA2JyB8IGRhdGU6J01NL2RkL3l5eXkgQCBoOm1tYSdcIikpLmdldFRleHQoKSkuXG4gICAgICAgICAgICB0b01hdGNoKC8xMFxcLzJcXGRcXC8yMDEwIEAgXFxkezEsMn06XFxkezJ9KEFNfFBNKS8pO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZyhcIicxMjg4MzIzNjIzMDA2JyB8IGRhdGU6XFxcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVxcXCJcIikpLmdldFRleHQoKSkuXG4gICAgICAgICAgICB0b01hdGNoKC8xMFxcLzJcXGRcXC8yMDEwIGF0IFxcZHsxLDJ9OlxcZHsyfShBTXxQTSkvKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5kYXRlRmlsdGVyLiRpbmplY3QgPSBbJyRsb2NhbGUnXTtcbmZ1bmN0aW9uIGRhdGVGaWx0ZXIoJGxvY2FsZSkge1xuXG5cbiAgdmFyIFJfSVNPODYwMV9TVFIgPSAvXihcXGR7NH0pLT8oXFxkXFxkKS0/KFxcZFxcZCkoPzpUKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlxcLihcXGQrKSk/KT8pPyhafChbKy1dKShcXGRcXGQpOj8oXFxkXFxkKSk/KT8kLztcbiAgICAgICAgICAgICAgICAgICAgIC8vIDEgICAgICAgIDIgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNSAgICAgICAgICA2ICAgICAgICAgIDcgICAgICAgICAgOCAgOSAgICAgMTAgICAgICAxMVxuICBmdW5jdGlvbiBqc29uU3RyaW5nVG9EYXRlKHN0cmluZykge1xuICAgIHZhciBtYXRjaDtcbiAgICBpZiAoKG1hdGNoID0gc3RyaW5nLm1hdGNoKFJfSVNPODYwMV9TVFIpKSkge1xuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgwKSxcbiAgICAgICAgICB0ekhvdXIgPSAwLFxuICAgICAgICAgIHR6TWluICA9IDAsXG4gICAgICAgICAgZGF0ZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENGdWxsWWVhciA6IGRhdGUuc2V0RnVsbFllYXIsXG4gICAgICAgICAgdGltZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENIb3VycyA6IGRhdGUuc2V0SG91cnM7XG5cbiAgICAgIGlmIChtYXRjaFs5XSkge1xuICAgICAgICB0ekhvdXIgPSB0b0ludChtYXRjaFs5XSArIG1hdGNoWzEwXSk7XG4gICAgICAgIHR6TWluID0gdG9JbnQobWF0Y2hbOV0gKyBtYXRjaFsxMV0pO1xuICAgICAgfVxuICAgICAgZGF0ZVNldHRlci5jYWxsKGRhdGUsIHRvSW50KG1hdGNoWzFdKSwgdG9JbnQobWF0Y2hbMl0pIC0gMSwgdG9JbnQobWF0Y2hbM10pKTtcbiAgICAgIHZhciBoID0gdG9JbnQobWF0Y2hbNF0gfHwgMCkgLSB0ekhvdXI7XG4gICAgICB2YXIgbSA9IHRvSW50KG1hdGNoWzVdIHx8IDApIC0gdHpNaW47XG4gICAgICB2YXIgcyA9IHRvSW50KG1hdGNoWzZdIHx8IDApO1xuICAgICAgdmFyIG1zID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KCcwLicgKyAobWF0Y2hbN10gfHwgMCkpICogMTAwMCk7XG4gICAgICB0aW1lU2V0dGVyLmNhbGwoZGF0ZSwgaCwgbSwgcywgbXMpO1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cblxuXG4gIHJldHVybiBmdW5jdGlvbihkYXRlLCBmb3JtYXQsIHRpbWV6b25lKSB7XG4gICAgdmFyIHRleHQgPSAnJyxcbiAgICAgICAgcGFydHMgPSBbXSxcbiAgICAgICAgZm4sIG1hdGNoO1xuXG4gICAgZm9ybWF0ID0gZm9ybWF0IHx8ICdtZWRpdW1EYXRlJztcbiAgICBmb3JtYXQgPSAkbG9jYWxlLkRBVEVUSU1FX0ZPUk1BVFNbZm9ybWF0XSB8fCBmb3JtYXQ7XG4gICAgaWYgKGlzU3RyaW5nKGRhdGUpKSB7XG4gICAgICBkYXRlID0gTlVNQkVSX1NUUklORy50ZXN0KGRhdGUpID8gdG9JbnQoZGF0ZSkgOiBqc29uU3RyaW5nVG9EYXRlKGRhdGUpO1xuICAgIH1cblxuICAgIGlmIChpc051bWJlcihkYXRlKSkge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIH1cblxuICAgIGlmICghaXNEYXRlKGRhdGUpIHx8ICFpc0Zpbml0ZShkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIHdoaWxlIChmb3JtYXQpIHtcbiAgICAgIG1hdGNoID0gREFURV9GT1JNQVRTX1NQTElULmV4ZWMoZm9ybWF0KTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBwYXJ0cyA9IGNvbmNhdChwYXJ0cywgbWF0Y2gsIDEpO1xuICAgICAgICBmb3JtYXQgPSBwYXJ0cy5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2goZm9ybWF0KTtcbiAgICAgICAgZm9ybWF0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZGF0ZVRpbWV6b25lT2Zmc2V0KTtcbiAgICAgIGRhdGUgPSBjb252ZXJ0VGltZXpvbmVUb0xvY2FsKGRhdGUsIHRpbWV6b25lLCB0cnVlKTtcbiAgICB9XG4gICAgZm9yRWFjaChwYXJ0cywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGZuID0gREFURV9GT1JNQVRTW3ZhbHVlXTtcbiAgICAgIHRleHQgKz0gZm4gPyBmbihkYXRlLCAkbG9jYWxlLkRBVEVUSU1FX0ZPUk1BVFMsIGRhdGVUaW1lem9uZU9mZnNldClcbiAgICAgICAgICAgICAgICAgOiB2YWx1ZSA9PT0gJ1xcJ1xcJycgPyAnXFwnJyA6IHZhbHVlLnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICdcXCcnKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9O1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUganNvblxuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgQWxsb3dzIHlvdSB0byBjb252ZXJ0IGEgSmF2YVNjcmlwdCBvYmplY3QgaW50byBKU09OIHN0cmluZy5cbiAqXG4gKiAgIFRoaXMgZmlsdGVyIGlzIG1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gV2hlbiB1c2luZyB0aGUgZG91YmxlIGN1cmx5IHt7dmFsdWV9fSBub3RhdGlvblxuICogICB0aGUgYmluZGluZyBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBKU09OLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IEFueSBKYXZhU2NyaXB0IG9iamVjdCAoaW5jbHVkaW5nIGFycmF5cyBhbmQgcHJpbWl0aXZlIHR5cGVzKSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0ge251bWJlcj19IHNwYWNpbmcgVGhlIG51bWJlciBvZiBzcGFjZXMgdG8gdXNlIHBlciBpbmRlbnRhdGlvbiwgZGVmYXVsdHMgdG8gMi5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEpTT04gc3RyaW5nLlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cImZpbHRlci1qc29uXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHByZSBpZD1cImRlZmF1bHQtc3BhY2luZ1wiPnt7IHsnbmFtZSc6J3ZhbHVlJ30gfCBqc29uIH19PC9wcmU+XG4gICAgICAgPHByZSBpZD1cImN1c3RvbS1zcGFjaW5nXCI+e3sgeyduYW1lJzondmFsdWUnfSB8IGpzb246NCB9fTwvcHJlPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGpzb25pZnkgZmlsdGVyZWQgb2JqZWN0cycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2RlZmF1bHQtc3BhY2luZycpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1xce1xcbiB7Mn1cIm5hbWVcIjogP1widmFsdWVcIlxcbn0vKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXN0b20tc3BhY2luZycpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1xce1xcbiB7NH1cIm5hbWVcIjogP1widmFsdWVcIlxcbn0vKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICpcbiAqL1xuZnVuY3Rpb24ganNvbkZpbHRlcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgc3BhY2luZykge1xuICAgIGlmIChpc1VuZGVmaW5lZChzcGFjaW5nKSkge1xuICAgICAgICBzcGFjaW5nID0gMjtcbiAgICB9XG4gICAgcmV0dXJuIHRvSnNvbihvYmplY3QsIHNwYWNpbmcpO1xuICB9O1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgbG93ZXJjYXNlXG4gKiBAa2luZCBmdW5jdGlvblxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gbG93ZXJjYXNlLlxuICogQHNlZSBhbmd1bGFyLmxvd2VyY2FzZVxuICovXG52YXIgbG93ZXJjYXNlRmlsdGVyID0gdmFsdWVGbihsb3dlcmNhc2UpO1xuXG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgdXBwZXJjYXNlXG4gKiBAa2luZCBmdW5jdGlvblxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gdXBwZXJjYXNlLlxuICogQHNlZSBhbmd1bGFyLnVwcGVyY2FzZVxuICovXG52YXIgdXBwZXJjYXNlRmlsdGVyID0gdmFsdWVGbih1cHBlcmNhc2UpO1xuXG4vKipcbiAqIEBuZ2RvYyBmaWx0ZXJcbiAqIEBuYW1lIGxpbWl0VG9cbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9yIHN0cmluZyBjb250YWluaW5nIG9ubHkgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMgYXJlXG4gKiB0YWtlbiBmcm9tIGVpdGhlciB0aGUgYmVnaW5uaW5nIG9yIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBhcnJheSwgc3RyaW5nIG9yIG51bWJlciwgYXMgc3BlY2lmaWVkIGJ5XG4gKiB0aGUgdmFsdWUgYW5kIHNpZ24gKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiBgbGltaXRgLiBPdGhlciBhcnJheS1saWtlIG9iamVjdHMgYXJlIGFsc28gc3VwcG9ydGVkXG4gKiAoZS5nLiBhcnJheSBzdWJjbGFzc2VzLCBOb2RlTGlzdHMsIGpxTGl0ZS9qUXVlcnkgY29sbGVjdGlvbnMgZXRjKS4gSWYgYSBudW1iZXIgaXMgdXNlZCBhcyBpbnB1dCxcbiAqIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5TGlrZXxzdHJpbmd8bnVtYmVyfSBpbnB1dCAtIEFycmF5L2FycmF5LWxpa2UsIHN0cmluZyBvciBudW1iZXIgdG8gYmUgbGltaXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGltaXQgLSBUaGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBhcnJheSBvciBzdHJpbmcuIElmIHRoZSBgbGltaXRgIG51bWJlclxuICogICAgIGlzIHBvc2l0aXZlLCBgbGltaXRgIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSBhcnJheS9zdHJpbmcgYXJlIGNvcGllZC5cbiAqICAgICBJZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLCBgbGltaXRgIG51bWJlciAgb2YgaXRlbXMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYXJyYXkvc3RyaW5nXG4gKiAgICAgYXJlIGNvcGllZC4gVGhlIGBsaW1pdGAgd2lsbCBiZSB0cmltbWVkIGlmIGl0IGV4Y2VlZHMgYGFycmF5Lmxlbmd0aGAuIElmIGBsaW1pdGAgaXMgdW5kZWZpbmVkLFxuICogICAgIHRoZSBpbnB1dCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gYmVnaW4gLSBJbmRleCBhdCB3aGljaCB0byBiZWdpbiBsaW1pdGF0aW9uLiBBcyBhIG5lZ2F0aXZlIGluZGV4LFxuICogICAgIGBiZWdpbmAgaW5kaWNhdGVzIGFuIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGlucHV0YC4gRGVmYXVsdHMgdG8gYDBgLlxuICogQHJldHVybnMge0FycmF5fHN0cmluZ30gQSBuZXcgc3ViLWFycmF5IG9yIHN1YnN0cmluZyBvZiBsZW5ndGggYGxpbWl0YCBvciBsZXNzIGlmIHRoZSBpbnB1dCBoYWRcbiAqICAgICBsZXNzIHRoYW4gYGxpbWl0YCBlbGVtZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwibGltaXRUb0V4YW1wbGVcIiBuYW1lPVwibGltaXQtdG8tZmlsdGVyXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdsaW1pdFRvRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS5udW1iZXJzID0gWzEsMiwzLDQsNSw2LDcsOCw5XTtcbiAgICAgICAgICAgICAkc2NvcGUubGV0dGVycyA9IFwiYWJjZGVmZ2hpXCI7XG4gICAgICAgICAgICAgJHNjb3BlLmxvbmdOdW1iZXIgPSAyMzQ1NDMyMzQyO1xuICAgICAgICAgICAgICRzY29wZS5udW1MaW1pdCA9IDM7XG4gICAgICAgICAgICAgJHNjb3BlLmxldHRlckxpbWl0ID0gMztcbiAgICAgICAgICAgICAkc2NvcGUubG9uZ051bWJlckxpbWl0ID0gMztcbiAgICAgICAgICAgfV0pO1xuICAgICAgIDwvc2NyaXB0PlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICBMaW1pdCB7e251bWJlcnN9fSB0bzpcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgc3RlcD1cIjFcIiBuZy1tb2RlbD1cIm51bUxpbWl0XCI+XG4gICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgPHA+T3V0cHV0IG51bWJlcnM6IHt7IG51bWJlcnMgfCBsaW1pdFRvOm51bUxpbWl0IH19PC9wPlxuICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgTGltaXQge3tsZXR0ZXJzfX0gdG86XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHN0ZXA9XCIxXCIgbmctbW9kZWw9XCJsZXR0ZXJMaW1pdFwiPlxuICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgIDxwPk91dHB1dCBsZXR0ZXJzOiB7eyBsZXR0ZXJzIHwgbGltaXRUbzpsZXR0ZXJMaW1pdCB9fTwvcD5cbiAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIExpbWl0IHt7bG9uZ051bWJlcn19IHRvOlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiMVwiIG5nLW1vZGVsPVwibG9uZ051bWJlckxpbWl0XCI+XG4gICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgPHA+T3V0cHV0IGxvbmcgbnVtYmVyOiB7eyBsb25nTnVtYmVyIHwgbGltaXRUbzpsb25nTnVtYmVyTGltaXQgfX08L3A+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIHZhciBudW1MaW1pdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbnVtTGltaXQnKSk7XG4gICAgICAgdmFyIGxldHRlckxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsZXR0ZXJMaW1pdCcpKTtcbiAgICAgICB2YXIgbG9uZ051bWJlckxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsb25nTnVtYmVyTGltaXQnKSk7XG4gICAgICAgdmFyIGxpbWl0ZWROdW1iZXJzID0gZWxlbWVudChieS5iaW5kaW5nKCdudW1iZXJzIHwgbGltaXRUbzpudW1MaW1pdCcpKTtcbiAgICAgICB2YXIgbGltaXRlZExldHRlcnMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xldHRlcnMgfCBsaW1pdFRvOmxldHRlckxpbWl0JykpO1xuICAgICAgIHZhciBsaW1pdGVkTG9uZ051bWJlciA9IGVsZW1lbnQoYnkuYmluZGluZygnbG9uZ051bWJlciB8IGxpbWl0VG86bG9uZ051bWJlckxpbWl0JykpO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBsaW1pdCB0aGUgbnVtYmVyIGFycmF5IHRvIGZpcnN0IHRocmVlIGl0ZW1zJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QobnVtTGltaXRJbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJzMnKTtcbiAgICAgICAgIGV4cGVjdChsZXR0ZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpO1xuICAgICAgICAgZXhwZWN0KGxvbmdOdW1iZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpO1xuICAgICAgICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFsxLDIsM10nKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmMnKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTG9uZ051bWJlci5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsb25nIG51bWJlcjogMjM0Jyk7XG4gICAgICAgfSk7XG5cbiAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBzYWZhcmkgYW5kIHByb3RyYWN0b3IgdGhhdCBkb2Vzbid0IGxpa2UgdGhlIG1pbnVzIGtleVxuICAgICAgIC8vIGl0KCdzaG91bGQgdXBkYXRlIHRoZSBvdXRwdXQgd2hlbiAtMyBpcyBlbnRlcmVkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgLy8gICBudW1MaW1pdElucHV0LmNsZWFyKCk7XG4gICAgICAgLy8gICBudW1MaW1pdElucHV0LnNlbmRLZXlzKCctMycpO1xuICAgICAgIC8vICAgbGV0dGVyTGltaXRJbnB1dC5jbGVhcigpO1xuICAgICAgIC8vICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnLTMnKTtcbiAgICAgICAvLyAgIGxvbmdOdW1iZXJMaW1pdElucHV0LmNsZWFyKCk7XG4gICAgICAgLy8gICBsb25nTnVtYmVyTGltaXRJbnB1dC5zZW5kS2V5cygnLTMnKTtcbiAgICAgICAvLyAgIGV4cGVjdChsaW1pdGVkTnVtYmVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBudW1iZXJzOiBbNyw4LDldJyk7XG4gICAgICAgLy8gICBleHBlY3QobGltaXRlZExldHRlcnMuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbGV0dGVyczogZ2hpJyk7XG4gICAgICAgLy8gICBleHBlY3QobGltaXRlZExvbmdOdW1iZXIuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbG9uZyBudW1iZXI6IDM0MicpO1xuICAgICAgIC8vIH0pO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUgb2YgaW5wdXQgYXJyYXknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIG51bUxpbWl0SW5wdXQuY2xlYXIoKTtcbiAgICAgICAgIG51bUxpbWl0SW5wdXQuc2VuZEtleXMoJzEwMCcpO1xuICAgICAgICAgbGV0dGVyTGltaXRJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnMTAwJyk7XG4gICAgICAgICBsb25nTnVtYmVyTGltaXRJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbG9uZ051bWJlckxpbWl0SW5wdXQuc2VuZEtleXMoJzEwMCcpO1xuICAgICAgICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFsxLDIsMyw0LDUsNiw3LDgsOV0nKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmNkZWZnaGknKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTG9uZ051bWJlci5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsb25nIG51bWJlcjogMjM0NTQzMjM0MicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4qL1xuZnVuY3Rpb24gbGltaXRUb0ZpbHRlcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBsaW1pdCwgYmVnaW4pIHtcbiAgICBpZiAoTWF0aC5hYnMoTnVtYmVyKGxpbWl0KSkgPT09IEluZmluaXR5KSB7XG4gICAgICBsaW1pdCA9IE51bWJlcihsaW1pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbWl0ID0gdG9JbnQobGltaXQpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXJOYU4obGltaXQpKSByZXR1cm4gaW5wdXQ7XG5cbiAgICBpZiAoaXNOdW1iZXIoaW5wdXQpKSBpbnB1dCA9IGlucHV0LnRvU3RyaW5nKCk7XG4gICAgaWYgKCFpc0FycmF5TGlrZShpbnB1dCkpIHJldHVybiBpbnB1dDtcblxuICAgIGJlZ2luID0gKCFiZWdpbiB8fCBpc05hTihiZWdpbikpID8gMCA6IHRvSW50KGJlZ2luKTtcbiAgICBiZWdpbiA9IChiZWdpbiA8IDApID8gTWF0aC5tYXgoMCwgaW5wdXQubGVuZ3RoICsgYmVnaW4pIDogYmVnaW47XG5cbiAgICBpZiAobGltaXQgPj0gMCkge1xuICAgICAgcmV0dXJuIHNsaWNlRm4oaW5wdXQsIGJlZ2luLCBiZWdpbiArIGxpbWl0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGJlZ2luID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzbGljZUZuKGlucHV0LCBsaW1pdCwgaW5wdXQubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzbGljZUZuKGlucHV0LCBNYXRoLm1heCgwLCBiZWdpbiArIGxpbWl0KSwgYmVnaW4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gc2xpY2VGbihpbnB1dCwgYmVnaW4sIGVuZCkge1xuICBpZiAoaXNTdHJpbmcoaW5wdXQpKSByZXR1cm4gaW5wdXQuc2xpY2UoYmVnaW4sIGVuZCk7XG5cbiAgcmV0dXJuIHNsaWNlLmNhbGwoaW5wdXQsIGJlZ2luLCBlbmQpO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBmaWx0ZXJcbiAqIEBuYW1lIG9yZGVyQnlcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBgY29sbGVjdGlvbmAsIG9yZGVyZWQgYnkgYSBgY29tcGFyYXRvcmBcbiAqIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZXMgY29tcHV0ZWQgdXNpbmcgdGhlIGBleHByZXNzaW9uYCBwcmVkaWNhdGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGBbe2lkOiAnZm9vJ30sIHtpZDogJ2Jhcid9XSB8IG9yZGVyQnk6J2lkJ2Agd291bGQgcmVzdWx0IGluXG4gKiBgW3tpZDogJ2Jhcid9LCB7aWQ6ICdmb28nfV1gLlxuICpcbiAqIFRoZSBgY29sbGVjdGlvbmAgY2FuIGJlIGFuIEFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0IChlLmcuIE5vZGVMaXN0LCBqUXVlcnkgb2JqZWN0LCBUeXBlZEFycmF5LFxuICogU3RyaW5nLCBldGMpLlxuICpcbiAqIFRoZSBgZXhwcmVzc2lvbmAgY2FuIGJlIGEgc2luZ2xlIHByZWRpY2F0ZSwgb3IgYSBsaXN0IG9mIHByZWRpY2F0ZXMgZWFjaCBzZXJ2aW5nIGFzIGEgdGllLWJyZWFrZXJcbiAqIGZvciB0aGUgcHJlY2VkaW5nIG9uZS4gVGhlIGBleHByZXNzaW9uYCBpcyBldmFsdWF0ZWQgYWdhaW5zdCBlYWNoIGl0ZW0gYW5kIHRoZSBvdXRwdXQgaXMgdXNlZFxuICogZm9yIGNvbXBhcmluZyB3aXRoIG90aGVyIGl0ZW1zLlxuICpcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZSBzb3J0aW5nIG9yZGVyIGJ5IHNldHRpbmcgYHJldmVyc2VgIHRvIGB0cnVlYC4gQnkgZGVmYXVsdCwgaXRlbXMgYXJlIHNvcnRlZCBpblxuICogYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIFRoZSBjb21wYXJpc29uIGlzIGRvbmUgdXNpbmcgdGhlIGBjb21wYXJhdG9yYCBmdW5jdGlvbi4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsIGEgZGVmYXVsdCwgYnVpbHQtaW5cbiAqIGNvbXBhcmF0b3IgaXMgdXNlZCAoc2VlIGJlbG93IGZvciBkZXRhaWxzIC0gaW4gYSBudXRzaGVsbCwgaXQgY29tcGFyZXMgbnVtYmVycyBudW1lcmljYWxseSBhbmRcbiAqIHN0cmluZ3MgYWxwaGFiZXRpY2FsbHkpLlxuICpcbiAqICMjIyBVbmRlciB0aGUgaG9vZFxuICpcbiAqIE9yZGVyaW5nIHRoZSBzcGVjaWZpZWQgYGNvbGxlY3Rpb25gIGhhcHBlbnMgaW4gdHdvIHBoYXNlczpcbiAqXG4gKiAxLiBBbGwgaXRlbXMgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSBwcmVkaWNhdGUgKG9yIHByZWRpY2F0ZXMpLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlcyBhcmUgc2F2ZWRcbiAqICAgIGFsb25nIHdpdGggdGhlaXIgdHlwZSAoYHN0cmluZ2AsIGBudW1iZXJgIGV0YykuIEZvciBleGFtcGxlLCBhbiBpdGVtIGB7bGFiZWw6ICdmb28nfWAsIHBhc3NlZFxuICogICAgdGhyb3VnaCBhIHByZWRpY2F0ZSB0aGF0IGV4dHJhY3RzIHRoZSB2YWx1ZSBvZiB0aGUgYGxhYmVsYCBwcm9wZXJ0eSwgd291bGQgYmUgdHJhbnNmb3JtZWQgdG86XG4gKiAgICBgYGBcbiAqICAgIHtcbiAqICAgICAgdmFsdWU6ICdmb28nLFxuICogICAgICB0eXBlOiAnc3RyaW5nJyxcbiAqICAgICAgaW5kZXg6IC4uLlxuICogICAgfVxuICogICAgYGBgXG4gKiAyLiBUaGUgY29tcGFyYXRvciBmdW5jdGlvbiBpcyB1c2VkIHRvIHNvcnQgdGhlIGl0ZW1zLCBiYXNlZCBvbiB0aGUgZGVyaXZlZCB2YWx1ZXMsIHR5cGVzIGFuZFxuICogICAgaW5kaWNlcy5cbiAqXG4gKiBJZiB5b3UgdXNlIGEgY3VzdG9tIGNvbXBhcmF0b3IsIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggcGFpcnMgb2Ygb2JqZWN0cyBvZiB0aGUgZm9ybVxuICogYHt2YWx1ZTogLi4uLCB0eXBlOiAnLi4uJywgaW5kZXg6IC4uLn1gIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm4gYDBgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbFxuICogKGFzIGZhciBhcyB0aGUgY29tcGFyYXRvciBpcyBjb25jZXJuZWQpLCBgLTFgIGlmIHRoZSAxc3Qgb25lIHNob3VsZCBiZSByYW5rZWQgaGlnaGVyIHRoYW4gdGhlXG4gKiBzZWNvbmQsIG9yIGAxYCBvdGhlcndpc2UuXG4gKlxuICogSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNvcnRpbmcgd2lsbCBiZSBkZXRlcm1pbmlzdGljIGFjcm9zcyBwbGF0Zm9ybXMsIGlmIG5vbmUgb2YgdGhlXG4gKiBzcGVjaWZpZWQgcHJlZGljYXRlcyBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0d28gaXRlbXMsIGBvcmRlckJ5YCB3aWxsIGF1dG9tYXRpY2FsbHkgaW50cm9kdWNlIGFcbiAqIGR1bW15IHByZWRpY2F0ZSB0aGF0IHJldHVybnMgdGhlIGl0ZW0ncyBpbmRleCBhcyBgdmFsdWVgLlxuICogKElmIHlvdSBhcmUgdXNpbmcgYSBjdXN0b20gY29tcGFyYXRvciwgbWFrZSBzdXJlIGl0IGNhbiBoYW5kbGUgdGhpcyBwcmVkaWNhdGUgYXMgd2VsbC4pXG4gKlxuICogRmluYWxseSwgaW4gYW4gYXR0ZW1wdCB0byBzaW1wbGlmeSB0aGluZ3MsIGlmIGEgcHJlZGljYXRlIHJldHVybnMgYW4gb2JqZWN0IGFzIHRoZSBleHRyYWN0ZWRcbiAqIHZhbHVlIGZvciBhbiBpdGVtLCBgb3JkZXJCeWAgd2lsbCB0cnkgdG8gY29udmVydCB0aGF0IG9iamVjdCB0byBhIHByaW1pdGl2ZSB2YWx1ZSwgYmVmb3JlIHBhc3NpbmdcbiAqIGl0IHRvIHRoZSBjb21wYXJhdG9yLiBUaGUgZm9sbG93aW5nIHJ1bGVzIGdvdmVybiB0aGUgY29udmVyc2lvbjpcbiAqXG4gKiAxLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGB2YWx1ZU9mKClgIG1ldGhvZCB0aGF0IHJldHVybnMgYSBwcmltaXRpdmUsIGl0cyByZXR1cm4gdmFsdWUgd2lsbCBiZVxuICogICAgdXNlZCBpbnN0ZWFkLjxiciAvPlxuICogICAgKElmIHRoZSBvYmplY3QgaGFzIGEgYHZhbHVlT2YoKWAgbWV0aG9kIHRoYXQgcmV0dXJucyBhbm90aGVyIG9iamVjdCwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0XG4gKiAgICB3aWxsIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBzdGVwcy4pXG4gKiAyLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGN1c3RvbSBgdG9TdHJpbmcoKWAgbWV0aG9kIChpLmUuIG5vdCB0aGUgb25lIGluaGVyaXRlZCBmcm9tIGBPYmplY3RgKSB0aGF0XG4gKiAgICByZXR1cm5zIGEgcHJpbWl0aXZlLCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLjxiciAvPlxuICogICAgKElmIHRoZSBvYmplY3QgaGFzIGEgYHRvU3RyaW5nKClgIG1ldGhvZCB0aGF0IHJldHVybnMgYW5vdGhlciBvYmplY3QsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdFxuICogICAgd2lsbCBiZSB1c2VkIGluIHN1YnNlcXVlbnQgc3RlcHMuKVxuICogMy4gTm8gY29udmVyc2lvbjsgdGhlIG9iamVjdCBpdHNlbGYgaXMgdXNlZC5cbiAqXG4gKiAjIyMgVGhlIGRlZmF1bHQgY29tcGFyYXRvclxuICpcbiAqIFRoZSBkZWZhdWx0LCBidWlsdC1pbiBjb21wYXJhdG9yIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBtb3N0IHVzZWNhc2VzLiBJbiBzaG9ydCwgaXQgY29tcGFyZXNcbiAqIG51bWJlcnMgbnVtZXJpY2FsbHksIHN0cmluZ3MgYWxwaGFiZXRpY2FsbHkgKGFuZCBjYXNlLWluc2Vuc2l0aXZlbHkpLCBmb3Igb2JqZWN0cyBmYWxscyBiYWNrIHRvXG4gKiB1c2luZyB0aGVpciBpbmRleCBpbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiwgYW5kIHNvcnRzIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgYnkgdHlwZS5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseSwgaXQgZm9sbG93cyB0aGVzZSBzdGVwcyB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGl0ZW1zOlxuICpcbiAqIDEuIElmIHRoZSBjb21wYXJlZCB2YWx1ZXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgY29tcGFyZSB0aGUgdHlwZXMgdGhlbXNlbHZlcyBhbHBoYWJldGljYWxseS5cbiAqIDIuIElmIGJvdGggdmFsdWVzIGFyZSBvZiB0eXBlIGBzdHJpbmdgLCBjb21wYXJlIHRoZW0gYWxwaGFiZXRpY2FsbHkgaW4gYSBjYXNlLSBhbmRcbiAqICAgIGxvY2FsZS1pbnNlbnNpdGl2ZSB3YXkuXG4gKiAzLiBJZiBib3RoIHZhbHVlcyBhcmUgb2JqZWN0cywgY29tcGFyZSB0aGVpciBpbmRpY2VzIGluc3RlYWQuXG4gKiA0LiBPdGhlcndpc2UsIHJldHVybjpcbiAqICAgIC0gIGAwYCwgaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwgKGJ5IHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29uLCBpLmUuIHVzaW5nIGA9PT1gKS5cbiAqICAgIC0gYC0xYCwgaWYgdGhlIDFzdCB2YWx1ZSBpcyBcImxlc3MgdGhhblwiIHRoZSAybmQgdmFsdWUgKGNvbXBhcmVkIHVzaW5nIHRoZSBgPGAgb3BlcmF0b3IpLlxuICogICAgLSAgYDFgLCBvdGhlcndpc2UuXG4gKlxuICogKipOb3RlOioqIElmIHlvdSBub3RpY2UgbnVtYmVycyBub3QgYmVpbmcgc29ydGVkIGFzIGV4cGVjdGVkLCBtYWtlIHN1cmUgdGhleSBhcmUgYWN0dWFsbHkgYmVpbmdcbiAqICAgICAgICAgICBzYXZlZCBhcyBudW1iZXJzIGFuZCBub3Qgc3RyaW5ncy5cbiAqICoqTm90ZToqKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygc29ydGluZywgYG51bGxgIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyB0aGUgc3RyaW5nIGAnbnVsbCdgIChpLmUuXG4gKiAgICAgICAgICAgYHR5cGU6ICdzdHJpbmcnYCwgYHZhbHVlOiAnbnVsbCdgKS4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBzb3J0IG9yZGVyIHJlbGF0aXZlIHRvXG4gKiAgICAgICAgICAgb3RoZXIgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlMaWtlfSBjb2xsZWN0aW9uIC0gVGhlIGNvbGxlY3Rpb24gKGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0KSB0byBzb3J0LlxuICogQHBhcmFtIHsoRnVuY3Rpb258c3RyaW5nfEFycmF5LjxGdW5jdGlvbnxzdHJpbmc+KT19IGV4cHJlc3Npb24gLSBBIHByZWRpY2F0ZSAob3IgbGlzdCBvZlxuICogICAgcHJlZGljYXRlcykgdG8gYmUgdXNlZCBieSB0aGUgY29tcGFyYXRvciB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIGVsZW1lbnRzLlxuICpcbiAqICAgIENhbiBiZSBvbmUgb2Y6XG4gKlxuICogICAgLSBgRnVuY3Rpb25gOiBBIGdldHRlciBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggaXRlbSBhcyBhcmd1bWVudCBhbmRcbiAqICAgICAgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcuXG4gKiAgICAtIGBzdHJpbmdgOiBBbiBBbmd1bGFyIGV4cHJlc3Npb24uIFRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IGVhY2ggaXRlbSBhbmQgdGhlXG4gKiAgICAgIHJlc3VsdCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcuIEZvciBleGFtcGxlLCB1c2UgYCdsYWJlbCdgIHRvIHNvcnQgYnkgYSBwcm9wZXJ0eSBjYWxsZWRcbiAqICAgICAgYGxhYmVsYCBvciBgJ2xhYmVsLnN1YnN0cmluZygwLCAzKSdgIHRvIHNvcnQgYnkgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBvZiB0aGUgYGxhYmVsYFxuICogICAgICBwcm9wZXJ0eS48YnIgLz5cbiAqICAgICAgKFRoZSByZXN1bHQgb2YgYSBjb25zdGFudCBleHByZXNzaW9uIGlzIGludGVycHJldGVkIGFzIGEgcHJvcGVydHkgbmFtZSB0byBiZSB1c2VkIGZvclxuICogICAgICBjb21wYXJpc29uLiBGb3IgZXhhbXBsZSwgdXNlIGAnXCJzcGVjaWFsIG5hbWVcIidgIChub3RlIHRoZSBleHRyYSBwYWlyIG9mIHF1b3RlcykgdG8gc29ydCBieSBhXG4gKiAgICAgIHByb3BlcnR5IGNhbGxlZCBgc3BlY2lhbCBuYW1lYC4pPGJyIC8+XG4gKiAgICAgIEFuIGV4cHJlc3Npb24gY2FuIGJlIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCBgK2Agb3IgYC1gIHRvIGNvbnRyb2wgdGhlIHNvcnRpbmcgZGlyZWN0aW9uLFxuICogICAgICBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZy4gRm9yIGV4YW1wbGUsIGAnK2xhYmVsJ2Agb3IgYCctbGFiZWwnYC4gSWYgbm8gcHJvcGVydHkgaXMgcHJvdmlkZWQsXG4gKiAgICAgIChlLmcuIGAnKydgIG9yIGAnLSdgKSwgdGhlIGNvbGxlY3Rpb24gZWxlbWVudCBpdHNlbGYgaXMgdXNlZCBpbiBjb21wYXJpc29ucy5cbiAqICAgIC0gYEFycmF5YDogQW4gYXJyYXkgb2YgZnVuY3Rpb24gYW5kL29yIHN0cmluZyBwcmVkaWNhdGVzLiBJZiBhIHByZWRpY2F0ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZVxuICogICAgICByZWxhdGl2ZSBvcmRlciBvZiB0d28gaXRlbXMsIHRoZSBuZXh0IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdGllLWJyZWFrZXIuXG4gKlxuICogKipOb3RlOioqIElmIHRoZSBwcmVkaWNhdGUgaXMgbWlzc2luZyBvciBlbXB0eSB0aGVuIGl0IGRlZmF1bHRzIHRvIGAnKydgLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHJldmVyc2UgLSBJZiBgdHJ1ZWAsIHJldmVyc2UgdGhlIHNvcnRpbmcgb3JkZXIuXG4gKiBAcGFyYW0geyhGdW5jdGlvbik9fSBjb21wYXJhdG9yIC0gVGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIG9yZGVyIG9mXG4gKiAgICB2YWx1ZSBwYWlycy4gSWYgb21pdHRlZCwgdGhlIGJ1aWx0LWluIGNvbXBhcmF0b3Igd2lsbCBiZSB1c2VkLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX0gLSBUaGUgc29ydGVkIGFycmF5LlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIE9yZGVyaW5nIGEgdGFibGUgd2l0aCBgbmdSZXBlYXRgXG4gKlxuICogVGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIGEgc2ltcGxlIHtAbGluayBuZ1JlcGVhdCBuZ1JlcGVhdH0sIHdoZXJlIHRoZSBkYXRhIGlzIHNvcnRlZCBieVxuICogYWdlIGluIGRlc2NlbmRpbmcgb3JkZXIgKGV4cHJlc3Npb24gaXMgc2V0IHRvIGAnLWFnZSdgKS4gVGhlIGBjb21wYXJhdG9yYCBpcyBub3Qgc2V0LCB3aGljaCBtZWFuc1xuICogaXQgZGVmYXVsdHMgdG8gdGhlIGJ1aWx0LWluIGNvbXBhcmF0b3IuXG4gKlxuICAgPGV4YW1wbGUgbmFtZT1cIm9yZGVyQnktc3RhdGljXCIgbW9kdWxlPVwib3JkZXJCeUV4YW1wbGUxXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZyaWVuZHNcIj5cbiAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgICA8dGg+UGhvbmUgTnVtYmVyPC90aD5cbiAgICAgICAgICAgICA8dGg+QWdlPC90aD5cbiAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgPHRyIG5nLXJlcGVhdD1cImZyaWVuZCBpbiBmcmllbmRzIHwgb3JkZXJCeTonLWFnZSdcIj5cbiAgICAgICAgICAgICA8dGQ+e3tmcmllbmQubmFtZX19PC90ZD5cbiAgICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLmFnZX19PC90ZD5cbiAgICAgICAgICAgPC90cj5cbiAgICAgICAgIDwvdGFibGU+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgIGFuZ3VsYXIubW9kdWxlKCdvcmRlckJ5RXhhbXBsZTEnLCBbXSlcbiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICRzY29wZS5mcmllbmRzID0gW1xuICAgICAgICAgICAgIHtuYW1lOiAnSm9obicsICAgcGhvbmU6ICc1NTUtMTIxMicsICBhZ2U6IDEwfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01hcnknLCAgIHBob25lOiAnNTU1LTk4NzYnLCAgYWdlOiAxOX0sXG4gICAgICAgICAgICAge25hbWU6ICdNaWtlJywgICBwaG9uZTogJzU1NS00MzIxJywgIGFnZTogMjF9LFxuICAgICAgICAgICAgIHtuYW1lOiAnQWRhbScsICAgcGhvbmU6ICc1NTUtNTY3OCcsICBhZ2U6IDM1fSxcbiAgICAgICAgICAgICB7bmFtZTogJ0p1bGllJywgIHBob25lOiAnNTU1LTg3NjUnLCAgYWdlOiAyOX1cbiAgICAgICAgICAgXTtcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgLmZyaWVuZHMge1xuICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICAgICB9XG5cbiAgICAgICAuZnJpZW5kcyB0aCB7XG4gICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7XG4gICAgICAgfVxuICAgICAgIC5mcmllbmRzIHRkLCAuZnJpZW5kcyB0aCB7XG4gICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkO1xuICAgICAgICAgcGFkZGluZzogNXB4IDEwcHg7XG4gICAgICAgfVxuICAgICAgIC5mcmllbmRzIHRkOmZpcnN0LWNoaWxkLCAuZnJpZW5kcyB0aDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgICB9XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIC8vIEVsZW1lbnQgbG9jYXRvcnNcbiAgICAgICB2YXIgbmFtZXMgPSBlbGVtZW50LmFsbChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBieSBhZ2UgaW4gcmV2ZXJzZSBvcmRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgwKS5nZXRUZXh0KCkpLnRvQmUoJ0FkYW0nKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoMSkuZ2V0VGV4dCgpKS50b0JlKCdKdWxpZScpO1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgyKS5nZXRUZXh0KCkpLnRvQmUoJ01pa2UnKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoMykuZ2V0VGV4dCgpKS50b0JlKCdNYXJ5Jyk7XG4gICAgICAgICBleHBlY3QobmFtZXMuZ2V0KDQpLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKiA8aHIgLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIENoYW5naW5nIHBhcmFtZXRlcnMgZHluYW1pY2FsbHlcbiAqXG4gKiBBbGwgcGFyYW1ldGVycyBjYW4gYmUgY2hhbmdlZCBkeW5hbWljYWxseS4gVGhlIG5leHQgZXhhbXBsZSBzaG93cyBob3cgeW91IGNhbiBtYWtlIHRoZSBjb2x1bW5zIG9mXG4gKiBhIHRhYmxlIHNvcnRhYmxlLCBieSBiaW5kaW5nIHRoZSBgZXhwcmVzc2lvbmAgYW5kIGByZXZlcnNlYCBwYXJhbWV0ZXJzIHRvIHNjb3BlIHByb3BlcnRpZXMuXG4gKlxuICAgPGV4YW1wbGUgbmFtZT1cIm9yZGVyQnktZHluYW1pY1wiIG1vZHVsZT1cIm9yZGVyQnlFeGFtcGxlMlwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICA8cHJlPlNvcnQgYnkgPSB7e3Byb3BlcnR5TmFtZX19OyByZXZlcnNlID0ge3tyZXZlcnNlfX08L3ByZT5cbiAgICAgICAgIDxoci8+XG4gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwicHJvcGVydHlOYW1lID0gbnVsbDsgcmV2ZXJzZSA9IGZhbHNlXCI+U2V0IHRvIHVuc29ydGVkPC9idXR0b24+XG4gICAgICAgICA8aHIvPlxuICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZnJpZW5kc1wiPlxuICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInNvcnRCeSgnbmFtZScpXCI+TmFtZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3J0b3JkZXJcIiBuZy1zaG93PVwicHJvcGVydHlOYW1lID09PSAnbmFtZSdcIiBuZy1jbGFzcz1cIntyZXZlcnNlOiByZXZlcnNlfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzb3J0QnkoJ3Bob25lJylcIj5QaG9uZSBOdW1iZXI8L2J1dHRvbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydG9yZGVyXCIgbmctc2hvdz1cInByb3BlcnR5TmFtZSA9PT0gJ3Bob25lJ1wiIG5nLWNsYXNzPVwie3JldmVyc2U6IHJldmVyc2V9XCI+PC9zcGFuPlxuICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInNvcnRCeSgnYWdlJylcIj5BZ2U8L2J1dHRvbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydG9yZGVyXCIgbmctc2hvdz1cInByb3BlcnR5TmFtZSA9PT0gJ2FnZSdcIiBuZy1jbGFzcz1cIntyZXZlcnNlOiByZXZlcnNlfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICA8dHIgbmctcmVwZWF0PVwiZnJpZW5kIGluIGZyaWVuZHMgfCBvcmRlckJ5OnByb3BlcnR5TmFtZTpyZXZlcnNlXCI+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLnBob25lfX08L3RkPlxuICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5hZ2V9fTwvdGQ+XG4gICAgICAgICAgIDwvdHI+XG4gICAgICAgICA8L3RhYmxlPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUyJywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICB2YXIgZnJpZW5kcyA9IFtcbiAgICAgICAgICAgICB7bmFtZTogJ0pvaG4nLCAgIHBob25lOiAnNTU1LTEyMTInLCAgYWdlOiAxMH0sXG4gICAgICAgICAgICAge25hbWU6ICdNYXJ5JywgICBwaG9uZTogJzU1NS05ODc2JywgIGFnZTogMTl9LFxuICAgICAgICAgICAgIHtuYW1lOiAnTWlrZScsICAgcGhvbmU6ICc1NTUtNDMyMScsICBhZ2U6IDIxfSxcbiAgICAgICAgICAgICB7bmFtZTogJ0FkYW0nLCAgIHBob25lOiAnNTU1LTU2NzgnLCAgYWdlOiAzNX0sXG4gICAgICAgICAgICAge25hbWU6ICdKdWxpZScsICBwaG9uZTogJzU1NS04NzY1JywgIGFnZTogMjl9XG4gICAgICAgICAgIF07XG5cbiAgICAgICAgICAgJHNjb3BlLnByb3BlcnR5TmFtZSA9ICdhZ2UnO1xuICAgICAgICAgICAkc2NvcGUucmV2ZXJzZSA9IHRydWU7XG4gICAgICAgICAgICRzY29wZS5mcmllbmRzID0gZnJpZW5kcztcblxuICAgICAgICAgICAkc2NvcGUuc29ydEJ5ID0gZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgJHNjb3BlLnJldmVyc2UgPSAoJHNjb3BlLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlOYW1lKSA/ICEkc2NvcGUucmV2ZXJzZSA6IGZhbHNlO1xuICAgICAgICAgICAgICRzY29wZS5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgICAgIH07XG4gICAgICAgICB9XSk7XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIC5mcmllbmRzIHtcbiAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgfVxuXG4gICAgICAgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZCwgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcbiAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZDpmaXJzdC1jaGlsZCwgLmZyaWVuZHMgdGg6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgfVxuXG4gICAgICAgLnNvcnRvcmRlcjphZnRlciB7XG4gICAgICAgICBjb250ZW50OiAnXFwyNWIyJzsgICAvLyBCTEFDSyBVUC1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgICAuc29ydG9yZGVyLnJldmVyc2U6YWZ0ZXIge1xuICAgICAgICAgY29udGVudDogJ1xcMjViYyc7ICAgLy8gQkxBQ0sgRE9XTi1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgLy8gRWxlbWVudCBsb2NhdG9yc1xuICAgICAgIHZhciB1bnNvcnRCdXR0b24gPSBlbGVtZW50KGJ5LnBhcnRpYWxCdXR0b25UZXh0KCd1bnNvcnRlZCcpKTtcbiAgICAgICB2YXIgbmFtZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ05hbWUnKSk7XG4gICAgICAgdmFyIHBob25lSGVhZGVyID0gZWxlbWVudChieS5wYXJ0aWFsQnV0dG9uVGV4dCgnUGhvbmUnKSk7XG4gICAgICAgdmFyIGFnZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ0FnZScpKTtcbiAgICAgICB2YXIgZmlyc3ROYW1lID0gZWxlbWVudChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKS5yb3coMCkpO1xuICAgICAgIHZhciBsYXN0TmFtZSA9IGVsZW1lbnQoYnkucmVwZWF0ZXIoJ2ZyaWVuZHMnKS5jb2x1bW4oJ2ZyaWVuZC5uYW1lJykucm93KDQpKTtcblxuICAgICAgIGl0KCdzaG91bGQgc29ydCBmcmllbmRzIGJ5IHNvbWUgcHJvcGVydHksIHdoZW4gY2xpY2tpbmcgb24gdGhlIGNvbHVtbiBoZWFkZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHBob25lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWFyeScpO1xuXG4gICAgICAgICBuYW1lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWlrZScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBpbiByZXZlcnNlIG9yZGVyLCB3aGVuIGNsaWNraW5nIG9uIHRoZSBzYW1lIGNvbHVtbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0FkYW0nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcblxuICAgICAgICAgYWdlSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG9yZGVyLCB3aGVuIGNsaWNraW5nIFwiU2V0IHRvIHVuc29ydGVkXCInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHVuc29ydEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0p1bGllJyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqIDxociAvPlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgVXNpbmcgYG9yZGVyQnlgIGluc2lkZSBhIGNvbnRyb2xsZXJcbiAqXG4gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNhbGwgdGhlIGBvcmRlckJ5YCBmaWx0ZXIgbWFudWFsbHksIGJ5IGluamVjdGluZyBgb3JkZXJCeUZpbHRlcmAsIGFuZFxuICogY2FsbGluZyBpdCB3aXRoIHRoZSBkZXNpcmVkIHBhcmFtZXRlcnMuIChBbHRlcm5hdGl2ZWx5LCB5b3UgY291bGQgaW5qZWN0IHRoZSBgJGZpbHRlcmAgZmFjdG9yeVxuICogYW5kIHJldHJpZXZlIHRoZSBgb3JkZXJCeWAgZmlsdGVyIHdpdGggYCRmaWx0ZXIoJ29yZGVyQnknKWAuKVxuICpcbiAgIDxleGFtcGxlIG5hbWU9XCJvcmRlckJ5LWNhbGwtbWFudWFsbHlcIiBtb2R1bGU9XCJvcmRlckJ5RXhhbXBsZTNcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgPHByZT5Tb3J0IGJ5ID0ge3twcm9wZXJ0eU5hbWV9fTsgcmV2ZXJzZSA9IHt7cmV2ZXJzZX19PC9wcmU+XG4gICAgICAgICA8aHIvPlxuICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInNvcnRCeShudWxsKVwiPlNldCB0byB1bnNvcnRlZDwvYnV0dG9uPlxuICAgICAgICAgPGhyLz5cbiAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZyaWVuZHNcIj5cbiAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzb3J0QnkoJ25hbWUnKVwiPk5hbWU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydG9yZGVyXCIgbmctc2hvdz1cInByb3BlcnR5TmFtZSA9PT0gJ25hbWUnXCIgbmctY2xhc3M9XCJ7cmV2ZXJzZTogcmV2ZXJzZX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwic29ydEJ5KCdwaG9uZScpXCI+UGhvbmUgTnVtYmVyPC9idXR0b24+XG4gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnRvcmRlclwiIG5nLXNob3c9XCJwcm9wZXJ0eU5hbWUgPT09ICdwaG9uZSdcIiBuZy1jbGFzcz1cIntyZXZlcnNlOiByZXZlcnNlfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzb3J0QnkoJ2FnZScpXCI+QWdlPC9idXR0b24+XG4gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnRvcmRlclwiIG5nLXNob3c9XCJwcm9wZXJ0eU5hbWUgPT09ICdhZ2UnXCIgbmctY2xhc3M9XCJ7cmV2ZXJzZTogcmV2ZXJzZX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgPHRyIG5nLXJlcGVhdD1cImZyaWVuZCBpbiBmcmllbmRzXCI+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLnBob25lfX08L3RkPlxuICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5hZ2V9fTwvdGQ+XG4gICAgICAgICAgIDwvdHI+XG4gICAgICAgICA8L3RhYmxlPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUzJywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICdvcmRlckJ5RmlsdGVyJywgZnVuY3Rpb24oJHNjb3BlLCBvcmRlckJ5KSB7XG4gICAgICAgICAgIHZhciBmcmllbmRzID0gW1xuICAgICAgICAgICAgIHtuYW1lOiAnSm9obicsICAgcGhvbmU6ICc1NTUtMTIxMicsICBhZ2U6IDEwfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01hcnknLCAgIHBob25lOiAnNTU1LTk4NzYnLCAgYWdlOiAxOX0sXG4gICAgICAgICAgICAge25hbWU6ICdNaWtlJywgICBwaG9uZTogJzU1NS00MzIxJywgIGFnZTogMjF9LFxuICAgICAgICAgICAgIHtuYW1lOiAnQWRhbScsICAgcGhvbmU6ICc1NTUtNTY3OCcsICBhZ2U6IDM1fSxcbiAgICAgICAgICAgICB7bmFtZTogJ0p1bGllJywgIHBob25lOiAnNTU1LTg3NjUnLCAgYWdlOiAyOX1cbiAgICAgICAgICAgXTtcblxuICAgICAgICAgICAkc2NvcGUucHJvcGVydHlOYW1lID0gJ2FnZSc7XG4gICAgICAgICAgICRzY29wZS5yZXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICAgJHNjb3BlLmZyaWVuZHMgPSBvcmRlckJ5KGZyaWVuZHMsICRzY29wZS5wcm9wZXJ0eU5hbWUsICRzY29wZS5yZXZlcnNlKTtcblxuICAgICAgICAgICAkc2NvcGUuc29ydEJ5ID0gZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgJHNjb3BlLnJldmVyc2UgPSAocHJvcGVydHlOYW1lICE9PSBudWxsICYmICRzY29wZS5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgICAgPyAhJHNjb3BlLnJldmVyc2UgOiBmYWxzZTtcbiAgICAgICAgICAgICAkc2NvcGUucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgICRzY29wZS5mcmllbmRzID0gb3JkZXJCeShmcmllbmRzLCAkc2NvcGUucHJvcGVydHlOYW1lLCAkc2NvcGUucmV2ZXJzZSk7XG4gICAgICAgICAgIH07XG4gICAgICAgICB9XSk7XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIC5mcmllbmRzIHtcbiAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgfVxuXG4gICAgICAgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZCwgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcbiAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZDpmaXJzdC1jaGlsZCwgLmZyaWVuZHMgdGg6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgfVxuXG4gICAgICAgLnNvcnRvcmRlcjphZnRlciB7XG4gICAgICAgICBjb250ZW50OiAnXFwyNWIyJzsgICAvLyBCTEFDSyBVUC1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgICAuc29ydG9yZGVyLnJldmVyc2U6YWZ0ZXIge1xuICAgICAgICAgY29udGVudDogJ1xcMjViYyc7ICAgLy8gQkxBQ0sgRE9XTi1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgLy8gRWxlbWVudCBsb2NhdG9yc1xuICAgICAgIHZhciB1bnNvcnRCdXR0b24gPSBlbGVtZW50KGJ5LnBhcnRpYWxCdXR0b25UZXh0KCd1bnNvcnRlZCcpKTtcbiAgICAgICB2YXIgbmFtZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ05hbWUnKSk7XG4gICAgICAgdmFyIHBob25lSGVhZGVyID0gZWxlbWVudChieS5wYXJ0aWFsQnV0dG9uVGV4dCgnUGhvbmUnKSk7XG4gICAgICAgdmFyIGFnZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ0FnZScpKTtcbiAgICAgICB2YXIgZmlyc3ROYW1lID0gZWxlbWVudChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKS5yb3coMCkpO1xuICAgICAgIHZhciBsYXN0TmFtZSA9IGVsZW1lbnQoYnkucmVwZWF0ZXIoJ2ZyaWVuZHMnKS5jb2x1bW4oJ2ZyaWVuZC5uYW1lJykucm93KDQpKTtcblxuICAgICAgIGl0KCdzaG91bGQgc29ydCBmcmllbmRzIGJ5IHNvbWUgcHJvcGVydHksIHdoZW4gY2xpY2tpbmcgb24gdGhlIGNvbHVtbiBoZWFkZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHBob25lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWFyeScpO1xuXG4gICAgICAgICBuYW1lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWlrZScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBpbiByZXZlcnNlIG9yZGVyLCB3aGVuIGNsaWNraW5nIG9uIHRoZSBzYW1lIGNvbHVtbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0FkYW0nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcblxuICAgICAgICAgYWdlSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG9yZGVyLCB3aGVuIGNsaWNraW5nIFwiU2V0IHRvIHVuc29ydGVkXCInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHVuc29ydEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0p1bGllJyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqIDxociAvPlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgVXNpbmcgYSBjdXN0b20gY29tcGFyYXRvclxuICpcbiAqIElmIHlvdSBoYXZlIHZlcnkgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGFib3V0IHRoZSB3YXkgaXRlbXMgYXJlIHNvcnRlZCwgeW91IGNhbiBwYXNzIHlvdXIgb3duXG4gKiBjb21wYXJhdG9yIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IG5lZWQgdG8gY29tcGFyZSBzb21lIHN0cmluZ3MgaW4gYSBsb2NhbGUtc2Vuc2l0aXZlXG4gKiB3YXkuIChXaGVuIHNwZWNpZnlpbmcgYSBjdXN0b20gY29tcGFyYXRvciwgeW91IGFsc28gbmVlZCB0byBwYXNzIGEgdmFsdWUgZm9yIHRoZSBgcmV2ZXJzZWBcbiAqIGFyZ3VtZW50IC0gcGFzc2luZyBgZmFsc2VgIHJldGFpbnMgdGhlIGRlZmF1bHQgc29ydGluZyBvcmRlciwgaS5lLiBhc2NlbmRpbmcuKVxuICpcbiAgIDxleGFtcGxlIG5hbWU9XCJvcmRlckJ5LWN1c3RvbS1jb21wYXJhdG9yXCIgbW9kdWxlPVwib3JkZXJCeUV4YW1wbGU0XCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJmcmllbmRzLWNvbnRhaW5lciBjdXN0b20tY29tcGFyYXRvclwiPlxuICAgICAgICAgICA8aDM+TG9jYWxlLXNlbnNpdGl2ZSBDb21wYXJhdG9yPC9oMz5cbiAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZnJpZW5kc1wiPlxuICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgICAgIDx0aD5GYXZvcml0ZSBMZXR0ZXI8L3RoPlxuICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD1cImZyaWVuZCBpbiBmcmllbmRzIHwgb3JkZXJCeTonZmF2b3JpdGVMZXR0ZXInOmZhbHNlOmxvY2FsZVNlbnNpdGl2ZUNvbXBhcmF0b3JcIj5cbiAgICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5uYW1lfX08L3RkPlxuICAgICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLmZhdm9yaXRlTGV0dGVyfX08L3RkPlxuICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICA8L2Rpdj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJmcmllbmRzLWNvbnRhaW5lciBkZWZhdWx0LWNvbXBhcmF0b3JcIj5cbiAgICAgICAgICAgPGgzPkRlZmF1bHQgQ29tcGFyYXRvcjwvaDM+XG4gICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZyaWVuZHNcIj5cbiAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XG4gICAgICAgICAgICAgICA8dGg+RmF2b3JpdGUgTGV0dGVyPC90aD5cbiAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9XCJmcmllbmQgaW4gZnJpZW5kcyB8IG9yZGVyQnk6J2Zhdm9yaXRlTGV0dGVyJ1wiPlxuICAgICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgICA8dGQ+e3tmcmllbmQuZmF2b3JpdGVMZXR0ZXJ9fTwvdGQ+XG4gICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGU0JywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAkc2NvcGUuZnJpZW5kcyA9IFtcbiAgICAgICAgICAgICB7bmFtZTogJ0pvaG4nLCAgIGZhdm9yaXRlTGV0dGVyOiAnw4QnfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01hcnknLCAgIGZhdm9yaXRlTGV0dGVyOiAnw5wnfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01pa2UnLCAgIGZhdm9yaXRlTGV0dGVyOiAnw5YnfSxcbiAgICAgICAgICAgICB7bmFtZTogJ0FkYW0nLCAgIGZhdm9yaXRlTGV0dGVyOiAnSCd9LFxuICAgICAgICAgICAgIHtuYW1lOiAnSnVsaWUnLCAgZmF2b3JpdGVMZXR0ZXI6ICdaJ31cbiAgICAgICAgICAgXTtcblxuICAgICAgICAgICAkc2NvcGUubG9jYWxlU2Vuc2l0aXZlQ29tcGFyYXRvciA9IGZ1bmN0aW9uKHYxLCB2Mikge1xuICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGdldCBzdHJpbmdzLCBqdXN0IGNvbXBhcmUgYnkgaW5kZXhcbiAgICAgICAgICAgICBpZiAodjEudHlwZSAhPT0gJ3N0cmluZycgfHwgdjIudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgIHJldHVybiAodjEuaW5kZXggPCB2Mi5pbmRleCkgPyAtMSA6IDE7XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgLy8gQ29tcGFyZSBzdHJpbmdzIGFscGhhYmV0aWNhbGx5LCB0YWtpbmcgbG9jYWxlIGludG8gYWNjb3VudFxuICAgICAgICAgICAgIHJldHVybiB2MS52YWx1ZS5sb2NhbGVDb21wYXJlKHYyLnZhbHVlKTtcbiAgICAgICAgICAgfTtcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgLmZyaWVuZHMtY29udGFpbmVyIHtcbiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgIG1hcmdpbjogMCAzMHB4O1xuICAgICAgIH1cblxuICAgICAgIC5mcmllbmRzIHtcbiAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgfVxuXG4gICAgICAgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZCwgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcbiAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZDpmaXJzdC1jaGlsZCwgLmZyaWVuZHMgdGg6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgfVxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAvLyBFbGVtZW50IGxvY2F0b3JzXG4gICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuY3NzKCcuY3VzdG9tLWNvbXBhcmF0b3InKSk7XG4gICAgICAgdmFyIG5hbWVzID0gY29udGFpbmVyLmFsbChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBieSBmYXZvcml0ZSBsZXR0ZXIgKGluIGNvcnJlY3QgYWxwaGFiZXRpY2FsIG9yZGVyKScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgwKS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoMSkuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobmFtZXMuZ2V0KDIpLmdldFRleHQoKSkudG9CZSgnTWlrZScpO1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgzKS5nZXRUZXh0KCkpLnRvQmUoJ01hcnknKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoNCkuZ2V0VGV4dCgpKS50b0JlKCdKdWxpZScpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKlxuICovXG5vcmRlckJ5RmlsdGVyLiRpbmplY3QgPSBbJyRwYXJzZSddO1xuZnVuY3Rpb24gb3JkZXJCeUZpbHRlcigkcGFyc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCBzb3J0UHJlZGljYXRlLCByZXZlcnNlT3JkZXIsIGNvbXBhcmVGbikge1xuXG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiBhcnJheTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGFycmF5KSkge1xuICAgICAgdGhyb3cgbWluRXJyKCdvcmRlckJ5JykoJ25vdGFycmF5JywgJ0V4cGVjdGVkIGFycmF5IGJ1dCByZWNlaXZlZDogezB9JywgYXJyYXkpO1xuICAgIH1cblxuICAgIGlmICghaXNBcnJheShzb3J0UHJlZGljYXRlKSkgeyBzb3J0UHJlZGljYXRlID0gW3NvcnRQcmVkaWNhdGVdOyB9XG4gICAgaWYgKHNvcnRQcmVkaWNhdGUubGVuZ3RoID09PSAwKSB7IHNvcnRQcmVkaWNhdGUgPSBbJysnXTsgfVxuXG4gICAgdmFyIHByZWRpY2F0ZXMgPSBwcm9jZXNzUHJlZGljYXRlcyhzb3J0UHJlZGljYXRlKTtcblxuICAgIHZhciBkZXNjZW5kaW5nID0gcmV2ZXJzZU9yZGVyID8gLTEgOiAxO1xuXG4gICAgLy8gRGVmaW5lIHRoZSBgY29tcGFyZSgpYCBmdW5jdGlvbi4gVXNlIGEgZGVmYXVsdCBjb21wYXJhdG9yIGlmIG5vbmUgaXMgc3BlY2lmaWVkLlxuICAgIHZhciBjb21wYXJlID0gaXNGdW5jdGlvbihjb21wYXJlRm4pID8gY29tcGFyZUZuIDogZGVmYXVsdENvbXBhcmU7XG5cbiAgICAvLyBUaGUgbmV4dCB0aHJlZSBsaW5lcyBhcmUgYSB2ZXJzaW9uIG9mIGEgU3dhcnR6aWFuIFRyYW5zZm9ybSBpZGlvbSBmcm9tIFBlcmxcbiAgICAvLyAoc29tZXRpbWVzIGNhbGxlZCB0aGUgRGVjb3JhdGUtU29ydC1VbmRlY29yYXRlIGlkaW9tKVxuICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY2h3YXJ0emlhbl90cmFuc2Zvcm1cbiAgICB2YXIgY29tcGFyZVZhbHVlcyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChhcnJheSwgZ2V0Q29tcGFyaXNvbk9iamVjdCk7XG4gICAgY29tcGFyZVZhbHVlcy5zb3J0KGRvQ29tcGFyaXNvbik7XG4gICAgYXJyYXkgPSBjb21wYXJlVmFsdWVzLm1hcChmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtLnZhbHVlOyB9KTtcblxuICAgIHJldHVybiBhcnJheTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBhcmlzb25PYmplY3QodmFsdWUsIGluZGV4KSB7XG4gICAgICAvLyBOT1RFOiBXZSBhcmUgYWRkaW5nIGFuIGV4dHJhIGB0aWVCcmVha2VyYCB2YWx1ZSBiYXNlZCBvbiB0aGUgZWxlbWVudCdzIGluZGV4LlxuICAgICAgLy8gVGhpcyB3aWxsIGJlIHVzZWQgdG8ga2VlcCB0aGUgc29ydCBzdGFibGUgd2hlbiBub25lIG9mIHRoZSBpbnB1dCBwcmVkaWNhdGVzIGNhblxuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0d28gZWxlbWVudHMuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHRpZUJyZWFrZXI6IHt2YWx1ZTogaW5kZXgsIHR5cGU6ICdudW1iZXInLCBpbmRleDogaW5kZXh9LFxuICAgICAgICBwcmVkaWNhdGVWYWx1ZXM6IHByZWRpY2F0ZXMubWFwKGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgICAgIHJldHVybiBnZXRQcmVkaWNhdGVWYWx1ZShwcmVkaWNhdGUuZ2V0KHZhbHVlKSwgaW5kZXgpO1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb0NvbXBhcmlzb24odjEsIHYyKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwcmVkaWNhdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmUodjEucHJlZGljYXRlVmFsdWVzW2ldLCB2Mi5wcmVkaWNhdGVWYWx1ZXNbaV0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIHByZWRpY2F0ZXNbaV0uZGVzY2VuZGluZyAqIGRlc2NlbmRpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBhcmUodjEudGllQnJlYWtlciwgdjIudGllQnJlYWtlcikgKiBkZXNjZW5kaW5nO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBwcm9jZXNzUHJlZGljYXRlcyhzb3J0UHJlZGljYXRlcykge1xuICAgIHJldHVybiBzb3J0UHJlZGljYXRlcy5tYXAoZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICB2YXIgZGVzY2VuZGluZyA9IDEsIGdldCA9IGlkZW50aXR5O1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihwcmVkaWNhdGUpKSB7XG4gICAgICAgIGdldCA9IHByZWRpY2F0ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcocHJlZGljYXRlKSkge1xuICAgICAgICBpZiAoKHByZWRpY2F0ZS5jaGFyQXQoMCkgPT09ICcrJyB8fCBwcmVkaWNhdGUuY2hhckF0KDApID09PSAnLScpKSB7XG4gICAgICAgICAgZGVzY2VuZGluZyA9IHByZWRpY2F0ZS5jaGFyQXQoMCkgPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVkaWNhdGUgIT09ICcnKSB7XG4gICAgICAgICAgZ2V0ID0gJHBhcnNlKHByZWRpY2F0ZSk7XG4gICAgICAgICAgaWYgKGdldC5jb25zdGFudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IGdldCgpO1xuICAgICAgICAgICAgZ2V0ID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlW2tleV07IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge2dldDogZ2V0LCBkZXNjZW5kaW5nOiBkZXNjZW5kaW5nfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6IC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvYmplY3RWYWx1ZSh2YWx1ZSkge1xuICAgIC8vIElmIGB2YWx1ZU9mYCBpcyBhIHZhbGlkIGZ1bmN0aW9uIHVzZSB0aGF0XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUudmFsdWVPZikpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvLyBJZiBgdG9TdHJpbmdgIGlzIGEgdmFsaWQgZnVuY3Rpb24gYW5kIG5vdCB0aGUgb25lIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIHVzZSB0aGF0XG4gICAgaWYgKGhhc0N1c3RvbVRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZWRpY2F0ZVZhbHVlKHZhbHVlLCBpbmRleCkge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZSA9ICdzdHJpbmcnO1xuICAgICAgdmFsdWUgPSAnbnVsbCc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFsdWUgPSBvYmplY3RWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IHZhbHVlLCB0eXBlOiB0eXBlLCBpbmRleDogaW5kZXh9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUodjEsIHYyKSB7XG4gICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgdmFyIHR5cGUxID0gdjEudHlwZTtcbiAgICB2YXIgdHlwZTIgPSB2Mi50eXBlO1xuXG4gICAgaWYgKHR5cGUxID09PSB0eXBlMikge1xuICAgICAgdmFyIHZhbHVlMSA9IHYxLnZhbHVlO1xuICAgICAgdmFyIHZhbHVlMiA9IHYyLnZhbHVlO1xuXG4gICAgICBpZiAodHlwZTEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIENvbXBhcmUgc3RyaW5ncyBjYXNlLWluc2Vuc2l0aXZlbHlcbiAgICAgICAgdmFsdWUxID0gdmFsdWUxLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhbHVlMiA9IHZhbHVlMi50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlMSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gRm9yIGJhc2ljIG9iamVjdHMsIHVzZSB0aGUgcG9zaXRpb24gb2YgdGhlIG9iamVjdFxuICAgICAgICAvLyBpbiB0aGUgY29sbGVjdGlvbiBpbnN0ZWFkIG9mIHRoZSB2YWx1ZVxuICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUxKSkgdmFsdWUxID0gdjEuaW5kZXg7XG4gICAgICAgIGlmIChpc09iamVjdCh2YWx1ZTIpKSB2YWx1ZTIgPSB2Mi5pbmRleDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlMSAhPT0gdmFsdWUyKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdHlwZTEgPCB0eXBlMiA/IC0xIDogMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG5nRGlyZWN0aXZlKGRpcmVjdGl2ZSkge1xuICBpZiAoaXNGdW5jdGlvbihkaXJlY3RpdmUpKSB7XG4gICAgZGlyZWN0aXZlID0ge1xuICAgICAgbGluazogZGlyZWN0aXZlXG4gICAgfTtcbiAgfVxuICBkaXJlY3RpdmUucmVzdHJpY3QgPSBkaXJlY3RpdmUucmVzdHJpY3QgfHwgJ0FDJztcbiAgcmV0dXJuIHZhbHVlRm4oZGlyZWN0aXZlKTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBhXG4gKiBAcmVzdHJpY3QgRVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogTW9kaWZpZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGh0bWwgYSB0YWcgc28gdGhhdCB0aGUgZGVmYXVsdCBhY3Rpb24gaXMgcHJldmVudGVkIHdoZW5cbiAqIHRoZSBocmVmIGF0dHJpYnV0ZSBpcyBlbXB0eS5cbiAqXG4gKiBGb3IgZHluYW1pY2FsbHkgY3JlYXRpbmcgYGhyZWZgIGF0dHJpYnV0ZXMgZm9yIGEgdGFncywgc2VlIHRoZSB7QGxpbmsgbmcubmdIcmVmIGBuZ0hyZWZgfSBkaXJlY3RpdmUuXG4gKi9cbnZhciBodG1sQW5jaG9yRGlyZWN0aXZlID0gdmFsdWVGbih7XG4gIHJlc3RyaWN0OiAnRScsXG4gIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHtcbiAgICBpZiAoIWF0dHIuaHJlZiAmJiAhYXR0ci54bGlua0hyZWYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBJZiB0aGUgbGlua2VkIGVsZW1lbnQgaXMgbm90IGFuIGFuY2hvciB0YWcgYW55bW9yZSwgZG8gbm90aGluZ1xuICAgICAgICBpZiAoZWxlbWVudFswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnYScpIHJldHVybjtcblxuICAgICAgICAvLyBTVkdBRWxlbWVudCBkb2VzIG5vdCB1c2UgdGhlIGhyZWYgYXR0cmlidXRlLCBidXQgcmF0aGVyIHRoZSAneGxpbmtIcmVmJyBhdHRyaWJ1dGUuXG4gICAgICAgIHZhciBocmVmID0gdG9TdHJpbmcuY2FsbChlbGVtZW50LnByb3AoJ2hyZWYnKSkgPT09ICdbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXScgP1xuICAgICAgICAgICAgICAgICAgICd4bGluazpocmVmJyA6ICdocmVmJztcbiAgICAgICAgZWxlbWVudC5vbignY2xpY2snLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIC8vIGlmIHdlIGhhdmUgbm8gaHJlZiB1cmwsIHRoZW4gZG9uJ3QgbmF2aWdhdGUgYW55d2hlcmUuXG4gICAgICAgICAgaWYgKCFlbGVtZW50LmF0dHIoaHJlZikpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0hyZWZcbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgOTlcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzaW5nIEFuZ3VsYXIgbWFya3VwIGxpa2UgYHt7aGFzaH19YCBpbiBhbiBocmVmIGF0dHJpYnV0ZSB3aWxsXG4gKiBtYWtlIHRoZSBsaW5rIGdvIHRvIHRoZSB3cm9uZyBVUkwgaWYgdGhlIHVzZXIgY2xpY2tzIGl0IGJlZm9yZVxuICogQW5ndWxhciBoYXMgYSBjaGFuY2UgdG8gcmVwbGFjZSB0aGUgYHt7aGFzaH19YCBtYXJrdXAgd2l0aCBpdHNcbiAqIHZhbHVlLiBVbnRpbCBBbmd1bGFyIHJlcGxhY2VzIHRoZSBtYXJrdXAgdGhlIGxpbmsgd2lsbCBiZSBicm9rZW5cbiAqIGFuZCB3aWxsIG1vc3QgbGlrZWx5IHJldHVybiBhIDQwNCBlcnJvci4gVGhlIGBuZ0hyZWZgIGRpcmVjdGl2ZVxuICogc29sdmVzIHRoaXMgcHJvYmxlbS5cbiAqXG4gKiBUaGUgd3Jvbmcgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGEgaHJlZj1cImh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fVwiPmxpbmsxPC9hPlxuICogYGBgXG4gKlxuICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGEgbmctaHJlZj1cImh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fVwiPmxpbmsxPC9hPlxuICogYGBgXG4gKlxuICogQGVsZW1lbnQgQVxuICogQHBhcmFtIHt0ZW1wbGF0ZX0gbmdIcmVmIGFueSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW4gYHt7fX1gIG1hcmt1cC5cbiAqXG4gKiBAZXhhbXBsZVxuICogVGhpcyBleGFtcGxlIHNob3dzIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGBocmVmYCwgYG5nLWhyZWZgIGFuZCBgbmctY2xpY2tgIGF0dHJpYnV0ZXNcbiAqIGluIGxpbmtzIGFuZCB0aGVpciBkaWZmZXJlbnQgYmVoYXZpb3JzOlxuICAgIDxleGFtcGxlIG5hbWU9XCJuZy1ocmVmXCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8aW5wdXQgbmctbW9kZWw9XCJ2YWx1ZVwiIC8+PGJyIC8+XG4gICAgICAgIDxhIGlkPVwibGluay0xXCIgaHJlZiBuZy1jbGljaz1cInZhbHVlID0gMVwiPmxpbmsgMTwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz5cbiAgICAgICAgPGEgaWQ9XCJsaW5rLTJcIiBocmVmPVwiXCIgbmctY2xpY2s9XCJ2YWx1ZSA9IDJcIj5saW5rIDI8L2E+IChsaW5rLCBkb24ndCByZWxvYWQpPGJyIC8+XG4gICAgICAgIDxhIGlkPVwibGluay0zXCIgbmctaHJlZj1cIi97eycxMjMnfX1cIj5saW5rIDM8L2E+IChsaW5rLCByZWxvYWQhKTxiciAvPlxuICAgICAgICA8YSBpZD1cImxpbmstNFwiIGhyZWY9XCJcIiBuYW1lPVwieHhcIiBuZy1jbGljaz1cInZhbHVlID0gNFwiPmFuY2hvcjwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz5cbiAgICAgICAgPGEgaWQ9XCJsaW5rLTVcIiBuYW1lPVwieHh4XCIgbmctY2xpY2s9XCJ2YWx1ZSA9IDVcIj5hbmNob3I8L2E+IChubyBsaW5rKTxiciAvPlxuICAgICAgICA8YSBpZD1cImxpbmstNlwiIG5nLWhyZWY9XCJ7e3ZhbHVlfX1cIj5saW5rPC9hPiAobGluaywgY2hhbmdlIGxvY2F0aW9uKVxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIHdpdGhvdXQgdmFsdWUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTEnKSkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCcxJyk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstMScpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9CZSgnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBidXQgbm90IHJlbG9hZCB3aGVuIGhyZWYgZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay0yJykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnMicpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTInKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUoJycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYW5kIGNoYW5nZSB1cmwgd2hlbiBuZy1ocmVmIHNwZWNpZmllZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTMnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvTWF0Y2goL1xcLzEyMyQvKTtcblxuICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstMycpKS5jbGljaygpO1xuXG4gICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbmF2aWdhdGUgYXdheSBmcm9tIGFuIEFuZ3VsYXIgcGFnZSwgc28gd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHVzZSBicm93c2VyLmRyaXZlciB0byBnZXQgdGhlIGJhc2Ugd2ViZHJpdmVyLlxuXG4gICAgICAgICAgYnJvd3Nlci53YWl0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuZHJpdmVyLmdldEN1cnJlbnRVcmwoKS50aGVuKGZ1bmN0aW9uKHVybCkge1xuICAgICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9cXC8xMjMkLyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCA1MDAwLCAncGFnZSBzaG91bGQgbmF2aWdhdGUgdG8gLzEyMycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIGVtcHR5IHN0cmluZyBhbmQgbmFtZSBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTQnKSkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCc0Jyk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstNCcpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9CZSgnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBidXQgbm90IHJlbG9hZCB3aGVuIG5vIGhyZWYgYnV0IG5hbWUgc3BlY2lmaWVkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay01JykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnNScpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTUnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUobnVsbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgb25seSBjaGFuZ2UgdXJsIHdoZW4gb25seSBuZy1ocmVmJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuY2xlYXIoKTtcbiAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKS5zZW5kS2V5cygnNicpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTYnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvTWF0Y2goL1xcLzYkLyk7XG5cbiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTYnKSkuY2xpY2soKTtcblxuICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG5hdmlnYXRlIGF3YXkgZnJvbSBhbiBBbmd1bGFyIHBhZ2UsIHNvIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byB1c2UgYnJvd3Nlci5kcml2ZXIgdG8gZ2V0IHRoZSBiYXNlIHdlYmRyaXZlci5cbiAgICAgICAgICBicm93c2VyLndhaXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5kcml2ZXIuZ2V0Q3VycmVudFVybCgpLnRoZW4oZnVuY3Rpb24odXJsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cmwubWF0Y2goL1xcLzYkLyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCA1MDAwLCAncGFnZSBzaG91bGQgbmF2aWdhdGUgdG8gLzYnKTtcbiAgICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdTcmNcbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgOTlcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzaW5nIEFuZ3VsYXIgbWFya3VwIGxpa2UgYHt7aGFzaH19YCBpbiBhIGBzcmNgIGF0dHJpYnV0ZSBkb2Vzbid0XG4gKiB3b3JrIHJpZ2h0OiBUaGUgYnJvd3NlciB3aWxsIGZldGNoIGZyb20gdGhlIFVSTCB3aXRoIHRoZSBsaXRlcmFsXG4gKiB0ZXh0IGB7e2hhc2h9fWAgdW50aWwgQW5ndWxhciByZXBsYWNlcyB0aGUgZXhwcmVzc2lvbiBpbnNpZGVcbiAqIGB7e2hhc2h9fWAuIFRoZSBgbmdTcmNgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtLlxuICpcbiAqIFRoZSBidWdneSB3YXkgdG8gd3JpdGUgaXQ6XG4gKiBgYGBodG1sXG4gKiA8aW1nIHNyYz1cImh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fVwiIGFsdD1cIkRlc2NyaXB0aW9uXCIvPlxuICogYGBgXG4gKlxuICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGltZyBuZy1zcmM9XCJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX1cIiBhbHQ9XCJEZXNjcmlwdGlvblwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAZWxlbWVudCBJTUdcbiAqIEBwYXJhbSB7dGVtcGxhdGV9IG5nU3JjIGFueSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW4gYHt7fX1gIG1hcmt1cC5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nU3Jjc2V0XG4gKiBAcmVzdHJpY3QgQVxuICogQHByaW9yaXR5IDk5XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2luZyBBbmd1bGFyIG1hcmt1cCBsaWtlIGB7e2hhc2h9fWAgaW4gYSBgc3Jjc2V0YCBhdHRyaWJ1dGUgZG9lc24ndFxuICogd29yayByaWdodDogVGhlIGJyb3dzZXIgd2lsbCBmZXRjaCBmcm9tIHRoZSBVUkwgd2l0aCB0aGUgbGl0ZXJhbFxuICogdGV4dCBge3toYXNofX1gIHVudGlsIEFuZ3VsYXIgcmVwbGFjZXMgdGhlIGV4cHJlc3Npb24gaW5zaWRlXG4gKiBge3toYXNofX1gLiBUaGUgYG5nU3Jjc2V0YCBkaXJlY3RpdmUgc29sdmVzIHRoaXMgcHJvYmxlbS5cbiAqXG4gKiBUaGUgYnVnZ3kgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGltZyBzcmNzZXQ9XCJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX0gMnhcIiBhbHQ9XCJEZXNjcmlwdGlvblwiLz5cbiAqIGBgYFxuICpcbiAqIFRoZSBjb3JyZWN0IHdheSB0byB3cml0ZSBpdDpcbiAqIGBgYGh0bWxcbiAqIDxpbWcgbmctc3Jjc2V0PVwiaHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyL3t7aGFzaH19IDJ4XCIgYWx0PVwiRGVzY3JpcHRpb25cIiAvPlxuICogYGBgXG4gKlxuICogQGVsZW1lbnQgSU1HXG4gKiBAcGFyYW0ge3RlbXBsYXRlfSBuZ1NyY3NldCBhbnkgc3RyaW5nIHdoaWNoIGNhbiBjb250YWluIGB7e319YCBtYXJrdXAuXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0Rpc2FibGVkXG4gKiBAcmVzdHJpY3QgQVxuICogQHByaW9yaXR5IDEwMFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGBkaXNhYmxlZGAgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGlmIHRoZVxuICoge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaW5zaWRlIGBuZ0Rpc2FibGVkYCBldmFsdWF0ZXMgdG8gdHJ1dGh5LlxuICpcbiAqIEEgc3BlY2lhbCBkaXJlY3RpdmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2Fubm90IHVzZSBpbnRlcnBvbGF0aW9uIGluc2lkZSB0aGUgYGRpc2FibGVkYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctZGlzYWJsZWRcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxsYWJlbD5DbGljayBtZSB0byB0b2dnbGU6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImNoZWNrZWRcIj48L2xhYmVsPjxici8+XG4gICAgICAgIDxidXR0b24gbmctbW9kZWw9XCJidXR0b25cIiBuZy1kaXNhYmxlZD1cImNoZWNrZWRcIj5CdXR0b248L2J1dHRvbj5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgaXQoJ3Nob3VsZCB0b2dnbGUgYnV0dG9uJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCdidXR0b24nKSkuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpKS50b0JlRmFsc3koKTtcbiAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCdidXR0b24nKSkuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqXG4gKiBAZWxlbWVudCBJTlBVVFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0Rpc2FibGVkIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHksXG4gKiAgICAgdGhlbiB0aGUgYGRpc2FibGVkYCBhdHRyaWJ1dGUgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnRcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDaGVja2VkXG4gKiBAcmVzdHJpY3QgQVxuICogQHByaW9yaXR5IDEwMFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0cyB0aGUgYGNoZWNrZWRgIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCwgaWYgdGhlIGV4cHJlc3Npb24gaW5zaWRlIGBuZ0NoZWNrZWRgIGlzIHRydXRoeS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBkaXJlY3RpdmUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgge0BsaW5rIG5nTW9kZWwgYG5nTW9kZWxgfSxcbiAqIGFzIHRoaXMgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvci5cbiAqXG4gKiBBIHNwZWNpYWwgZGlyZWN0aXZlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhlIGBjaGVja2VkYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctY2hlY2tlZFwiPlxuICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgPGxhYmVsPkNoZWNrIG1lIHRvIGNoZWNrIGJvdGg6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cIm1hc3RlclwiPjwvbGFiZWw+PGJyLz5cbiAgICAgICAgPGlucHV0IGlkPVwiY2hlY2tTbGF2ZVwiIHR5cGU9XCJjaGVja2JveFwiIG5nLWNoZWNrZWQ9XCJtYXN0ZXJcIiBhcmlhLWxhYmVsPVwiU2xhdmUgaW5wdXRcIj5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgaXQoJ3Nob3VsZCBjaGVjayBib3RoIGNoZWNrQm94ZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY2hlY2tTbGF2ZScpKS5nZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnbWFzdGVyJykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2NoZWNrU2xhdmUnKSkuZ2V0QXR0cmlidXRlKCdjaGVja2VkJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICpcbiAqIEBlbGVtZW50IElOUFVUXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2hlY2tlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LFxuICogICAgIHRoZW4gdGhlIGBjaGVja2VkYCBhdHRyaWJ1dGUgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnRcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdSZWFkb25seVxuICogQHJlc3RyaWN0IEFcbiAqIEBwcmlvcml0eSAxMDBcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBTZXRzIHRoZSBgcmVhZG9ubHlgIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCwgaWYgdGhlIGV4cHJlc3Npb24gaW5zaWRlIGBuZ1JlYWRvbmx5YCBpcyB0cnV0aHkuXG4gKiBOb3RlIHRoYXQgYHJlYWRvbmx5YCBhcHBsaWVzIG9ubHkgdG8gYGlucHV0YCBlbGVtZW50cyB3aXRoIHNwZWNpZmljIHR5cGVzLiBbU2VlIHRoZSBpbnB1dCBkb2NzIG9uXG4gKiBNRE5dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dCNhdHRyLXJlYWRvbmx5KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBBIHNwZWNpYWwgZGlyZWN0aXZlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhlIGByZWFkb25seWBcbiAqIGF0dHJpYnV0ZS4gU2VlIHRoZSB7QGxpbmsgZ3VpZGUvaW50ZXJwb2xhdGlvbiBpbnRlcnBvbGF0aW9uIGd1aWRlfSBmb3IgbW9yZSBpbmZvLlxuICpcbiAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbmFtZT1cIm5nLXJlYWRvbmx5XCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8bGFiZWw+Q2hlY2sgbWUgdG8gbWFrZSB0ZXh0IHJlYWRvbmx5OiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjaGVja2VkXCI+PC9sYWJlbD48YnIvPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1yZWFkb25seT1cImNoZWNrZWRcIiB2YWx1ZT1cIkknbSBBbmd1bGFyXCIgYXJpYS1sYWJlbD1cIlJlYWRvbmx5IGZpZWxkXCIgLz5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgaXQoJ3Nob3VsZCB0b2dnbGUgcmVhZG9ubHkgYXR0cicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnW3R5cGU9XCJ0ZXh0XCJdJykpLmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tlZCcpKS5jbGljaygpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnW3R5cGU9XCJ0ZXh0XCJdJykpLmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgIDwvZmlsZT5cbiAgICA8L2V4YW1wbGU+XG4gKlxuICogQGVsZW1lbnQgSU5QVVRcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdSZWFkb25seSBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LFxuICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgXCJyZWFkb25seVwiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nU2VsZWN0ZWRcbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgMTAwXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogU2V0cyB0aGUgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQsIGlmIHRoZSBleHByZXNzaW9uIGluc2lkZSBgbmdTZWxlY3RlZGAgaXMgdHJ1dGh5LlxuICpcbiAqIEEgc3BlY2lhbCBkaXJlY3RpdmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2Fubm90IHVzZSBpbnRlcnBvbGF0aW9uIGluc2lkZSB0aGUgYHNlbGVjdGVkYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICAgKipOb3RlOioqIGBuZ1NlbGVjdGVkYCBkb2VzIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBgc2VsZWN0YCBhbmQgYG5nTW9kZWxgIGRpcmVjdGl2ZXMsIGl0IG9ubHlcbiAqICAgc2V0cyB0aGUgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQuIElmIHlvdSBhcmUgdXNpbmcgYG5nTW9kZWxgIG9uIHRoZSBzZWxlY3QsIHlvdVxuICogICBzaG91bGQgbm90IHVzZSBgbmdTZWxlY3RlZGAgb24gdGhlIG9wdGlvbnMsIGFzIGBuZ01vZGVsYCB3aWxsIHNldCB0aGUgc2VsZWN0IHZhbHVlIGFuZFxuICogICBzZWxlY3RlZCBvcHRpb25zLlxuICogPC9kaXY+XG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctc2VsZWN0ZWRcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxsYWJlbD5DaGVjayBtZSB0byBzZWxlY3Q6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cInNlbGVjdGVkXCI+PC9sYWJlbD48YnIvPlxuICAgICAgICA8c2VsZWN0IGFyaWEtbGFiZWw9XCJuZ1NlbGVjdGVkIGRlbW9cIj5cbiAgICAgICAgICA8b3B0aW9uPkhlbGxvITwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gaWQ9XCJncmVldFwiIG5nLXNlbGVjdGVkPVwic2VsZWN0ZWRcIj5HcmVldGluZ3MhPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICBpdCgnc2hvdWxkIHNlbGVjdCBHcmVldGluZ3MhJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2dyZWV0JykpLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc2VsZWN0ZWQnKSkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZ3JlZXQnKSkuZ2V0QXR0cmlidXRlKCdzZWxlY3RlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqXG4gKiBAZWxlbWVudCBPUFRJT05cbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTZWxlY3RlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LFxuICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgXCJzZWxlY3RlZFwiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50XG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ09wZW5cbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgMTAwXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogU2V0cyB0aGUgYG9wZW5gIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCwgaWYgdGhlIGV4cHJlc3Npb24gaW5zaWRlIGBuZ09wZW5gIGlzIHRydXRoeS5cbiAqXG4gKiBBIHNwZWNpYWwgZGlyZWN0aXZlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhlIGBvcGVuYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogIyMgQSBub3RlIGFib3V0IGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICpcbiAqIEVkZ2UsIEZpcmVmb3gsIGFuZCBJbnRlcm5ldCBFeHBsb3JlciBkbyBub3Qgc3VwcG9ydCB0aGUgYGRldGFpbHNgIGVsZW1lbnQsIGl0IGlzXG4gKiByZWNvbW1lbmRlZCB0byB1c2Uge0BsaW5rIG5nLm5nU2hvd30gYW5kIHtAbGluayBuZy5uZ0hpZGV9IGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGVcbiAgICAgPGV4YW1wbGUgbmFtZT1cIm5nLW9wZW5cIj5cbiAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPGxhYmVsPkNoZWNrIG1lIGNoZWNrIG11bHRpcGxlOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJvcGVuXCI+PC9sYWJlbD48YnIvPlxuICAgICAgICAgPGRldGFpbHMgaWQ9XCJkZXRhaWxzXCIgbmctb3Blbj1cIm9wZW5cIj5cbiAgICAgICAgICAgIDxzdW1tYXJ5PlNob3cvSGlkZSBtZTwvc3VtbWFyeT5cbiAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICA8L2ZpbGU+XG4gICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICAgaXQoJ3Nob3VsZCB0b2dnbGUgb3BlbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZGV0YWlscycpKS5nZXRBdHRyaWJ1dGUoJ29wZW4nKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ29wZW4nKSkuY2xpY2soKTtcbiAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2RldGFpbHMnKSkuZ2V0QXR0cmlidXRlKCdvcGVuJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgIH0pO1xuICAgICAgIDwvZmlsZT5cbiAgICAgPC9leGFtcGxlPlxuICpcbiAqIEBlbGVtZW50IERFVEFJTFNcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdPcGVuIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHksXG4gKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSBcIm9wZW5cIiB3aWxsIGJlIHNldCBvbiB0aGUgZWxlbWVudFxuICovXG5cbnZhciBuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlcyA9IHt9O1xuXG4vLyBib29sZWFuIGF0dHJzIGFyZSBldmFsdWF0ZWRcbmZvckVhY2goQk9PTEVBTl9BVFRSLCBmdW5jdGlvbihwcm9wTmFtZSwgYXR0ck5hbWUpIHtcbiAgLy8gYmluZGluZyB0byBtdWx0aXBsZSBpcyBub3Qgc3VwcG9ydGVkXG4gIGlmIChwcm9wTmFtZSA9PT0gJ211bHRpcGxlJykgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIGRlZmF1bHRMaW5rRm4oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICBzY29wZS4kd2F0Y2goYXR0cltub3JtYWxpemVkXSwgZnVuY3Rpb24gbmdCb29sZWFuQXR0cldhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICBhdHRyLiRzZXQoYXR0ck5hbWUsICEhdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIG5vcm1hbGl6ZWQgPSBkaXJlY3RpdmVOb3JtYWxpemUoJ25nLScgKyBhdHRyTmFtZSk7XG4gIHZhciBsaW5rRm4gPSBkZWZhdWx0TGlua0ZuO1xuXG4gIGlmIChwcm9wTmFtZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgbGlua0ZuID0gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgIC8vIGVuc3VyaW5nIG5nQ2hlY2tlZCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIG5nTW9kZWwgd2hlbiBib3RoIGFyZSBzZXQgb24gdGhlIHNhbWUgaW5wdXRcbiAgICAgIGlmIChhdHRyLm5nTW9kZWwgIT09IGF0dHJbbm9ybWFsaXplZF0pIHtcbiAgICAgICAgZGVmYXVsdExpbmtGbihzY29wZSwgZWxlbWVudCwgYXR0cik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25vcm1hbGl6ZWRdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICBwcmlvcml0eTogMTAwLFxuICAgICAgbGluazogbGlua0ZuXG4gICAgfTtcbiAgfTtcbn0pO1xuXG4vLyBhbGlhc2VkIGlucHV0IGF0dHJzIGFyZSBldmFsdWF0ZWRcbmZvckVhY2goQUxJQVNFRF9BVFRSLCBmdW5jdGlvbihodG1sQXR0ciwgbmdBdHRyKSB7XG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25nQXR0cl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJpb3JpdHk6IDEwMCxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIC8vc3BlY2lhbCBjYXNlIG5nUGF0dGVybiB3aGVuIGEgbGl0ZXJhbCByZWd1bGFyIGV4cHJlc3Npb24gdmFsdWVcbiAgICAgICAgLy9pcyB1c2VkIGFzIHRoZSBleHByZXNzaW9uICh0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHdhdGNoIGFueXRoaW5nKS5cbiAgICAgICAgaWYgKG5nQXR0ciA9PT0gJ25nUGF0dGVybicgJiYgYXR0ci5uZ1BhdHRlcm4uY2hhckF0KDApID09PSAnLycpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSBhdHRyLm5nUGF0dGVybi5tYXRjaChSRUdFWF9TVFJJTkdfUkVHRVhQKTtcbiAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGF0dHIuJHNldCgnbmdQYXR0ZXJuJywgbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY29wZS4kd2F0Y2goYXR0cltuZ0F0dHJdLCBmdW5jdGlvbiBuZ0F0dHJBbGlhc1dhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgYXR0ci4kc2V0KG5nQXR0ciwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufSk7XG5cbi8vIG5nLXNyYywgbmctc3Jjc2V0LCBuZy1ocmVmIGFyZSBpbnRlcnBvbGF0ZWRcbmZvckVhY2goWydzcmMnLCAnc3Jjc2V0JywgJ2hyZWYnXSwgZnVuY3Rpb24oYXR0ck5hbWUpIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBkaXJlY3RpdmVOb3JtYWxpemUoJ25nLScgKyBhdHRyTmFtZSk7XG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25vcm1hbGl6ZWRdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByaW9yaXR5OiA5OSwgLy8gaXQgbmVlZHMgdG8gcnVuIGFmdGVyIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnRlcnBvbGF0ZWRcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IGF0dHJOYW1lLFxuICAgICAgICAgICAgbmFtZSA9IGF0dHJOYW1lO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZSA9PT0gJ2hyZWYnICYmXG4gICAgICAgICAgICB0b1N0cmluZy5jYWxsKGVsZW1lbnQucHJvcCgnaHJlZicpKSA9PT0gJ1tvYmplY3QgU1ZHQW5pbWF0ZWRTdHJpbmddJykge1xuICAgICAgICAgIG5hbWUgPSAneGxpbmtIcmVmJztcbiAgICAgICAgICBhdHRyLiRhdHRyW25hbWVdID0gJ3hsaW5rOmhyZWYnO1xuICAgICAgICAgIHByb3BOYW1lID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHIuJG9ic2VydmUobm9ybWFsaXplZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoYXR0ck5hbWUgPT09ICdocmVmJykge1xuICAgICAgICAgICAgICBhdHRyLiRzZXQobmFtZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0ci4kc2V0KG5hbWUsIHZhbHVlKTtcblxuICAgICAgICAgIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seVxuICAgICAgICAgIC8vIE9uIElFLCBpZiBcIm5nOnNyY1wiIGRpcmVjdGl2ZSBkZWNsYXJhdGlvbiBpcyB1c2VkIGFuZCBcInNyY1wiIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgLy8gdGhlbiBjYWxsaW5nIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcmMnLCAnZm9vJykgZG9lc24ndCBkbyBhbnl0aGluZywgc28gd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHNldCB0aGUgcHJvcGVydHkgYXMgd2VsbCB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIGVmZmVjdC5cbiAgICAgICAgICAvLyBXZSB1c2UgYXR0clthdHRyTmFtZV0gdmFsdWUgc2luY2UgJHNldCBjYW4gc2FuaXRpemUgdGhlIHVybC5cbiAgICAgICAgICBpZiAobXNpZSAmJiBwcm9wTmFtZSkgZWxlbWVudC5wcm9wKHByb3BOYW1lLCBhdHRyW25hbWVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn0pO1xuXG4vKiBnbG9iYWwgLW51bGxGb3JtQ3RybCwgLVBFTkRJTkdfQ0xBU1MsIC1TVUJNSVRURURfQ0xBU1NcbiAqL1xudmFyIG51bGxGb3JtQ3RybCA9IHtcbiAgJGFkZENvbnRyb2w6IG5vb3AsXG4gICQkcmVuYW1lQ29udHJvbDogbnVsbEZvcm1SZW5hbWVDb250cm9sLFxuICAkcmVtb3ZlQ29udHJvbDogbm9vcCxcbiAgJHNldFZhbGlkaXR5OiBub29wLFxuICAkc2V0RGlydHk6IG5vb3AsXG4gICRzZXRQcmlzdGluZTogbm9vcCxcbiAgJHNldFN1Ym1pdHRlZDogbm9vcFxufSxcblBFTkRJTkdfQ0xBU1MgPSAnbmctcGVuZGluZycsXG5TVUJNSVRURURfQ0xBU1MgPSAnbmctc3VibWl0dGVkJztcblxuZnVuY3Rpb24gbnVsbEZvcm1SZW5hbWVDb250cm9sKGNvbnRyb2wsIG5hbWUpIHtcbiAgY29udHJvbC4kbmFtZSA9IG5hbWU7XG59XG5cbi8qKlxuICogQG5nZG9jIHR5cGVcbiAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXJcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRwcmlzdGluZSBUcnVlIGlmIHVzZXIgaGFzIG5vdCBpbnRlcmFjdGVkIHdpdGggdGhlIGZvcm0geWV0LlxuICogQHByb3BlcnR5IHtib29sZWFufSAkZGlydHkgVHJ1ZSBpZiB1c2VyIGhhcyBhbHJlYWR5IGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHZhbGlkIFRydWUgaWYgYWxsIG9mIHRoZSBjb250YWluaW5nIGZvcm1zIGFuZCBjb250cm9scyBhcmUgdmFsaWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRpbnZhbGlkIFRydWUgaWYgYXQgbGVhc3Qgb25lIGNvbnRhaW5pbmcgY29udHJvbCBvciBmb3JtIGlzIGludmFsaWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRwZW5kaW5nIFRydWUgaWYgYXQgbGVhc3Qgb25lIGNvbnRhaW5pbmcgY29udHJvbCBvciBmb3JtIGlzIHBlbmRpbmcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRzdWJtaXR0ZWQgVHJ1ZSBpZiB1c2VyIGhhcyBzdWJtaXR0ZWQgdGhlIGZvcm0gZXZlbiBpZiBpdHMgaW52YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkge09iamVjdH0gJGVycm9yIElzIGFuIG9iamVjdCBoYXNoLCBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gY29udHJvbHMgb3JcbiAqICBmb3JtcyB3aXRoIGZhaWxpbmcgdmFsaWRhdG9ycywgd2hlcmU6XG4gKlxuICogIC0ga2V5cyBhcmUgdmFsaWRhdGlvbiB0b2tlbnMgKGVycm9yIG5hbWVzKSxcbiAqICAtIHZhbHVlcyBhcmUgYXJyYXlzIG9mIGNvbnRyb2xzIG9yIGZvcm1zIHRoYXQgaGF2ZSBhIGZhaWxpbmcgdmFsaWRhdG9yIGZvciBnaXZlbiBlcnJvciBuYW1lLlxuICpcbiAqICBCdWlsdC1pbiB2YWxpZGF0aW9uIHRva2VuczpcbiAqXG4gKiAgLSBgZW1haWxgXG4gKiAgLSBgbWF4YFxuICogIC0gYG1heGxlbmd0aGBcbiAqICAtIGBtaW5gXG4gKiAgLSBgbWlubGVuZ3RoYFxuICogIC0gYG51bWJlcmBcbiAqICAtIGBwYXR0ZXJuYFxuICogIC0gYHJlcXVpcmVkYFxuICogIC0gYHVybGBcbiAqICAtIGBkYXRlYFxuICogIC0gYGRhdGV0aW1lbG9jYWxgXG4gKiAgLSBgdGltZWBcbiAqICAtIGB3ZWVrYFxuICogIC0gYG1vbnRoYFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogYEZvcm1Db250cm9sbGVyYCBrZWVwcyB0cmFjayBvZiBhbGwgaXRzIGNvbnRyb2xzIGFuZCBuZXN0ZWQgZm9ybXMgYXMgd2VsbCBhcyB0aGUgc3RhdGUgb2YgdGhlbSxcbiAqIHN1Y2ggYXMgYmVpbmcgdmFsaWQvaW52YWxpZCBvciBkaXJ0eS9wcmlzdGluZS5cbiAqXG4gKiBFYWNoIHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBmb3JtfSBkaXJlY3RpdmUgY3JlYXRlcyBhbiBpbnN0YW5jZVxuICogb2YgYEZvcm1Db250cm9sbGVyYC5cbiAqXG4gKi9cbi8vYXNrcyBmb3IgJHNjb3BlIHRvIGZvb2wgdGhlIEJDIGNvbnRyb2xsZXIgbW9kdWxlXG5Gb3JtQ29udHJvbGxlci4kaW5qZWN0ID0gWyckZWxlbWVudCcsICckYXR0cnMnLCAnJHNjb3BlJywgJyRhbmltYXRlJywgJyRpbnRlcnBvbGF0ZSddO1xuZnVuY3Rpb24gRm9ybUNvbnRyb2xsZXIoJGVsZW1lbnQsICRhdHRycywgJHNjb3BlLCAkYW5pbWF0ZSwgJGludGVycG9sYXRlKSB7XG4gIHRoaXMuJCRjb250cm9scyA9IFtdO1xuXG4gIC8vIGluaXQgc3RhdGVcbiAgdGhpcy4kZXJyb3IgPSB7fTtcbiAgdGhpcy4kJHN1Y2Nlc3MgPSB7fTtcbiAgdGhpcy4kcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgdGhpcy4kbmFtZSA9ICRpbnRlcnBvbGF0ZSgkYXR0cnMubmFtZSB8fCAkYXR0cnMubmdGb3JtIHx8ICcnKSgkc2NvcGUpO1xuICB0aGlzLiRkaXJ0eSA9IGZhbHNlO1xuICB0aGlzLiRwcmlzdGluZSA9IHRydWU7XG4gIHRoaXMuJHZhbGlkID0gdHJ1ZTtcbiAgdGhpcy4kaW52YWxpZCA9IGZhbHNlO1xuICB0aGlzLiRzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy4kJHBhcmVudEZvcm0gPSBudWxsRm9ybUN0cmw7XG5cbiAgdGhpcy4kJGVsZW1lbnQgPSAkZWxlbWVudDtcbiAgdGhpcy4kJGFuaW1hdGUgPSAkYW5pbWF0ZTtcblxuICBzZXR1cFZhbGlkaXR5KHRoaXMpO1xufVxuXG5Gb3JtQ29udHJvbGxlci5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHJvbGxiYWNrVmlld1ZhbHVlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSb2xsYmFjayBhbGwgZm9ybSBjb250cm9scyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGAkbW9kZWxWYWx1ZWAuXG4gICAqXG4gICAqIFVwZGF0ZXMgbWF5IGJlIHBlbmRpbmcgYnkgYSBkZWJvdW5jZWQgZXZlbnQgb3IgYmVjYXVzZSB0aGUgaW5wdXQgaXMgd2FpdGluZyBmb3IgYSBzb21lIGZ1dHVyZVxuICAgKiBldmVudCBkZWZpbmVkIGluIGBuZy1tb2RlbC1vcHRpb25zYC4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IG5lZWRlZCBieSB0aGUgcmVzZXQgYnV0dG9uIG9mXG4gICAqIGEgZm9ybSB0aGF0IHVzZXMgYG5nLW1vZGVsLW9wdGlvbnNgIHRvIHBlbmQgdXBkYXRlcy5cbiAgICovXG4gICRyb2xsYmFja1ZpZXdWYWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgZm9yRWFjaCh0aGlzLiQkY29udHJvbHMsIGZ1bmN0aW9uKGNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2wuJHJvbGxiYWNrVmlld1ZhbHVlKCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkY29tbWl0Vmlld1ZhbHVlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb21taXQgYWxsIGZvcm0gY29udHJvbHMgcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBgJG1vZGVsVmFsdWVgLlxuICAgKlxuICAgKiBVcGRhdGVzIG1heSBiZSBwZW5kaW5nIGJ5IGEgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZSBmdXR1cmVcbiAgICogZXZlbnQgZGVmaW5lZCBpbiBgbmctbW9kZWwtb3B0aW9uc2AuIFRoaXMgbWV0aG9kIGlzIHJhcmVseSBuZWVkZWQgYXMgYE5nTW9kZWxDb250cm9sbGVyYFxuICAgKiB1c3VhbGx5IGhhbmRsZXMgY2FsbGluZyB0aGlzIGluIHJlc3BvbnNlIHRvIGlucHV0IGV2ZW50cy5cbiAgICovXG4gICRjb21taXRWaWV3VmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgIGZvckVhY2godGhpcy4kJGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7XG4gICAgICBjb250cm9sLiRjb21taXRWaWV3VmFsdWUoKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRhZGRDb250cm9sXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250cm9sIGNvbnRyb2wgb2JqZWN0LCBlaXRoZXIgYSB7QGxpbmsgZm9ybS5Gb3JtQ29udHJvbGxlcn0gb3IgYW5cbiAgICoge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXJ9XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlciBhIGNvbnRyb2wgd2l0aCB0aGUgZm9ybS4gSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5XG4gICAqIHdoZW4gdGhleSBhcmUgbGlua2VkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbnRyb2wgd2lsbCBub3QgYmUgcmVmbGVjdGVkIG9uIHRoZSBuZXcgcGFyZW50IGZvcm0uIFRoaXNcbiAgICogaXMgbm90IGFuIGlzc3VlIHdpdGggbm9ybWFsIHVzZSwgYXMgZnJlc2hseSBjb21waWxlZCBhbmQgbGlua2VkIGNvbnRyb2xzIGFyZSBpbiBhIGAkcHJpc3RpbmVgXG4gICAqIHN0YXRlLlxuICAgKlxuICAgKiBIb3dldmVyLCBpZiB0aGUgbWV0aG9kIGlzIHVzZWQgcHJvZ3JhbW1hdGljYWxseSwgZm9yIGV4YW1wbGUgYnkgYWRkaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29udHJvbHMsXG4gICAqIG9yIGNvbnRyb2xzIHRoYXQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVtb3ZlZCB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlaXIgY29ycmVzcG9uZGluZyBET00gZWxlbWVudCxcbiAgICogaXQncyB0aGUgZGV2ZWxvcGVycyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgc3RhdGUgcHJvcGFnYXRlcyB0byB0aGUgcGFyZW50IGZvcm0uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiBhbiBpbnB1dCBjb250cm9sIGlzIGFkZGVkIHRoYXQgaXMgYWxyZWFkeSBgJGRpcnR5YCBhbmQgaGFzIGAkZXJyb3JgIHByb3BlcnRpZXMsXG4gICAqIGNhbGxpbmcgYCRzZXREaXJ0eSgpYCBhbmQgYCR2YWxpZGF0ZSgpYCBhZnRlcndhcmRzIHdpbGwgcHJvcGFnYXRlIHRoZSBzdGF0ZSB0byB0aGUgcGFyZW50IGZvcm0uXG4gICAqL1xuICAkYWRkQ29udHJvbDogZnVuY3Rpb24oY29udHJvbCkge1xuICAgIC8vIEJyZWFraW5nIGNoYW5nZSAtIGJlZm9yZSwgaW5wdXRzIHdob3NlIG5hbWUgd2FzIFwiaGFzT3duUHJvcGVydHlcIiB3ZXJlIHF1aWV0bHkgaWdub3JlZFxuICAgIC8vIGFuZCBub3QgYWRkZWQgdG8gdGhlIHNjb3BlLiAgTm93IHdlIHRocm93IGFuIGVycm9yLlxuICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KGNvbnRyb2wuJG5hbWUsICdpbnB1dCcpO1xuICAgIHRoaXMuJCRjb250cm9scy5wdXNoKGNvbnRyb2wpO1xuXG4gICAgaWYgKGNvbnRyb2wuJG5hbWUpIHtcbiAgICAgIHRoaXNbY29udHJvbC4kbmFtZV0gPSBjb250cm9sO1xuICAgIH1cblxuICAgIGNvbnRyb2wuJCRwYXJlbnRGb3JtID0gdGhpcztcbiAgfSxcblxuICAvLyBQcml2YXRlIEFQSTogcmVuYW1lIGEgZm9ybSBjb250cm9sXG4gICQkcmVuYW1lQ29udHJvbDogZnVuY3Rpb24oY29udHJvbCwgbmV3TmFtZSkge1xuICAgIHZhciBvbGROYW1lID0gY29udHJvbC4kbmFtZTtcblxuICAgIGlmICh0aGlzW29sZE5hbWVdID09PSBjb250cm9sKSB7XG4gICAgICBkZWxldGUgdGhpc1tvbGROYW1lXTtcbiAgICB9XG4gICAgdGhpc1tuZXdOYW1lXSA9IGNvbnRyb2w7XG4gICAgY29udHJvbC4kbmFtZSA9IG5ld05hbWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkcmVtb3ZlQ29udHJvbFxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udHJvbCBjb250cm9sIG9iamVjdCwgZWl0aGVyIGEge0BsaW5rIGZvcm0uRm9ybUNvbnRyb2xsZXJ9IG9yIGFuXG4gICAqIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyfVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGVyZWdpc3RlciBhIGNvbnRyb2wgZnJvbSB0aGUgZm9ybS5cbiAgICpcbiAgICogSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhcmUgZGVzdHJveWVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgb25seSB0aGUgcmVtb3ZlZCBjb250cm9sJ3MgdmFsaWRhdGlvbiBzdGF0ZSAoYCRlcnJvcnNgZXRjLikgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlXG4gICAqIGZvcm0uIGAkZGlydHlgLCBgJHN1Ym1pdHRlZGAgc3RhdGVzIHdpbGwgbm90IGJlIGNoYW5nZWQsIGJlY2F1c2UgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGNhbiBiZVxuICAgKiBkaWZmZXJlbnQgZnJvbSBjYXNlIHRvIGNhc2UuIEZvciBleGFtcGxlLCByZW1vdmluZyB0aGUgb25seSBgJGRpcnR5YCBjb250cm9sIGZyb20gYSBmb3JtIG1heSBvclxuICAgKiBtYXkgbm90IG1lYW4gdGhhdCB0aGUgZm9ybSBpcyBzdGlsbCBgJGRpcnR5YC5cbiAgICovXG4gICRyZW1vdmVDb250cm9sOiBmdW5jdGlvbihjb250cm9sKSB7XG4gICAgaWYgKGNvbnRyb2wuJG5hbWUgJiYgdGhpc1tjb250cm9sLiRuYW1lXSA9PT0gY29udHJvbCkge1xuICAgICAgZGVsZXRlIHRoaXNbY29udHJvbC4kbmFtZV07XG4gICAgfVxuICAgIGZvckVhY2godGhpcy4kcGVuZGluZywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcbiAgICAgIHRoaXMuJHNldFZhbGlkaXR5KG5hbWUsIG51bGwsIGNvbnRyb2wpO1xuICAgIH0sIHRoaXMpO1xuICAgIGZvckVhY2godGhpcy4kZXJyb3IsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW52YWxpZC10aGlzXG4gICAgICB0aGlzLiRzZXRWYWxpZGl0eShuYW1lLCBudWxsLCBjb250cm9sKTtcbiAgICB9LCB0aGlzKTtcbiAgICBmb3JFYWNoKHRoaXMuJCRzdWNjZXNzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWludmFsaWQtdGhpc1xuICAgICAgdGhpcy4kc2V0VmFsaWRpdHkobmFtZSwgbnVsbCwgY29udHJvbCk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICBhcnJheVJlbW92ZSh0aGlzLiQkY29udHJvbHMsIGNvbnRyb2wpO1xuICAgIGNvbnRyb2wuJCRwYXJlbnRGb3JtID0gbnVsbEZvcm1DdHJsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldERpcnR5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBmb3JtIHRvIGEgZGlydHkgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gYWRkIHRoZSAnbmctZGlydHknIGNsYXNzIGFuZCBzZXQgdGhlIGZvcm0gdG8gYSBkaXJ0eVxuICAgKiBzdGF0ZSAobmctZGlydHkgY2xhc3MpLiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIHBhcmVudCBmb3Jtcy5cbiAgICovXG4gICRzZXREaXJ0eTogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy4kJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIFBSSVNUSU5FX0NMQVNTKTtcbiAgICB0aGlzLiQkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwgRElSVFlfQ0xBU1MpO1xuICAgIHRoaXMuJGRpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLiRwcmlzdGluZSA9IGZhbHNlO1xuICAgIHRoaXMuJCRwYXJlbnRGb3JtLiRzZXREaXJ0eSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFByaXN0aW5lXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBmb3JtIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSdzIGAkcHJpc3RpbmVgIHN0YXRlIHRvIHRydWUsIHRoZSBgJGRpcnR5YCBzdGF0ZSB0byBmYWxzZSwgcmVtb3Zlc1xuICAgKiB0aGUgYG5nLWRpcnR5YCBjbGFzcyBhbmQgYWRkcyB0aGUgYG5nLXByaXN0aW5lYCBjbGFzcy4gQWRkaXRpb25hbGx5LCBpdCBzZXRzIHRoZSBgJHN1Ym1pdHRlZGBcbiAgICogc3RhdGUgdG8gZmFsc2UuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBwcm9wYWdhdGUgdG8gYWxsIHRoZSBjb250cm9scyBjb250YWluZWQgaW4gdGhpcyBmb3JtLlxuICAgKlxuICAgKiBTZXR0aW5nIGEgZm9ybSBiYWNrIHRvIGEgcHJpc3RpbmUgc3RhdGUgaXMgb2Z0ZW4gdXNlZnVsIHdoZW4gd2Ugd2FudCB0byAncmV1c2UnIGEgZm9ybSBhZnRlclxuICAgKiBzYXZpbmcgb3IgcmVzZXR0aW5nIGl0LlxuICAgKi9cbiAgJHNldFByaXN0aW5lOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiQkYW5pbWF0ZS5zZXRDbGFzcyh0aGlzLiQkZWxlbWVudCwgUFJJU1RJTkVfQ0xBU1MsIERJUlRZX0NMQVNTICsgJyAnICsgU1VCTUlUVEVEX0NMQVNTKTtcbiAgICB0aGlzLiRkaXJ0eSA9IGZhbHNlO1xuICAgIHRoaXMuJHByaXN0aW5lID0gdHJ1ZTtcbiAgICB0aGlzLiRzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBmb3JFYWNoKHRoaXMuJCRjb250cm9scywgZnVuY3Rpb24oY29udHJvbCkge1xuICAgICAgY29udHJvbC4kc2V0UHJpc3RpbmUoKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRVbnRvdWNoZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlICduZy10b3VjaGVkJyBjbGFzcyBhbmQgc2V0IHRoZSBmb3JtIGNvbnRyb2xzIHRvIHRoZWlyXG4gICAqIHVudG91Y2hlZCBzdGF0ZSAobmctdW50b3VjaGVkIGNsYXNzKS5cbiAgICpcbiAgICogU2V0dGluZyBhIGZvcm0gY29udHJvbHMgYmFjayB0byB0aGVpciB1bnRvdWNoZWQgc3RhdGUgaXMgb2Z0ZW4gdXNlZnVsIHdoZW4gc2V0dGluZyB0aGUgZm9ybVxuICAgKiBiYWNrIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS5cbiAgICovXG4gICRzZXRVbnRvdWNoZWQ6IGZ1bmN0aW9uKCkge1xuICAgIGZvckVhY2godGhpcy4kJGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7XG4gICAgICBjb250cm9sLiRzZXRVbnRvdWNoZWQoKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRTdWJtaXR0ZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHN1Ym1pdHRlZCBzdGF0ZS5cbiAgICovXG4gICRzZXRTdWJtaXR0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJCRhbmltYXRlLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LCBTVUJNSVRURURfQ0xBU1MpO1xuICAgIHRoaXMuJHN1Ym1pdHRlZCA9IHRydWU7XG4gICAgdGhpcy4kJHBhcmVudEZvcm0uJHNldFN1Ym1pdHRlZCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFZhbGlkaXR5XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXRzIHRoZSB2YWxpZGl0eSBvZiBhIGZvcm0gY29udHJvbC5cbiAqXG4gKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIHBhcmVudCBmb3Jtcy5cbiAqL1xuYWRkU2V0VmFsaWRpdHlNZXRob2Qoe1xuICBjbGF6ejogRm9ybUNvbnRyb2xsZXIsXG4gIHNldDogZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgY29udHJvbGxlcikge1xuICAgIHZhciBsaXN0ID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICBpZiAoIWxpc3QpIHtcbiAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBbY29udHJvbGxlcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihjb250cm9sbGVyKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgbGlzdC5wdXNoKGNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgdW5zZXQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIGNvbnRyb2xsZXIpIHtcbiAgICB2YXIgbGlzdCA9IG9iamVjdFtwcm9wZXJ0eV07XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFycmF5UmVtb3ZlKGxpc3QsIGNvbnRyb2xsZXIpO1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0Zvcm1cbiAqIEByZXN0cmljdCBFQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE5lc3RhYmxlIGFsaWFzIG9mIHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBgZm9ybWB9IGRpcmVjdGl2ZS4gSFRNTFxuICogZG9lcyBub3QgYWxsb3cgbmVzdGluZyBvZiBmb3JtIGVsZW1lbnRzLiBJdCBpcyB1c2VmdWwgdG8gbmVzdCBmb3JtcywgZm9yIGV4YW1wbGUgaWYgdGhlIHZhbGlkaXR5IG9mIGFcbiAqIHN1Yi1ncm91cCBvZiBjb250cm9scyBuZWVkcyB0byBiZSBkZXRlcm1pbmVkLlxuICpcbiAqIE5vdGU6IHRoZSBwdXJwb3NlIG9mIGBuZ0Zvcm1gIGlzIHRvIGdyb3VwIGNvbnRyb2xzLFxuICogYnV0IG5vdCB0byBiZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgYDxmb3JtPmAgdGFnIHdpdGggYWxsIG9mIGl0cyBjYXBhYmlsaXRpZXNcbiAqIChlLmcuIHBvc3RpbmcgdG8gdGhlIHNlcnZlciwgLi4uKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nRm9ybXxuYW1lIE5hbWUgb2YgdGhlIGZvcm0uIElmIHNwZWNpZmllZCwgdGhlIGZvcm0gY29udHJvbGxlciB3aWxsIGJlIHB1Ymxpc2hlZCBpbnRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBzY29wZSwgdW5kZXIgdGhpcyBuYW1lLlxuICpcbiAqL1xuXG4gLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBmb3JtXG4gKiBAcmVzdHJpY3QgRVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGlyZWN0aXZlIHRoYXQgaW5zdGFudGlhdGVzXG4gKiB7QGxpbmsgZm9ybS5Gb3JtQ29udHJvbGxlciBGb3JtQ29udHJvbGxlcn0uXG4gKlxuICogSWYgdGhlIGBuYW1lYCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZm9ybSBjb250cm9sbGVyIGlzIHB1Ymxpc2hlZCBvbnRvIHRoZSBjdXJyZW50IHNjb3BlIHVuZGVyXG4gKiB0aGlzIG5hbWUuXG4gKlxuICogIyBBbGlhczoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Zvcm0gYG5nRm9ybWB9XG4gKlxuICogSW4gQW5ndWxhciwgZm9ybXMgY2FuIGJlIG5lc3RlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBvdXRlciBmb3JtIGlzIHZhbGlkIHdoZW4gYWxsIG9mIHRoZSBjaGlsZFxuICogZm9ybXMgYXJlIHZhbGlkIGFzIHdlbGwuIEhvd2V2ZXIsIGJyb3dzZXJzIGRvIG5vdCBhbGxvdyBuZXN0aW5nIG9mIGA8Zm9ybT5gIGVsZW1lbnRzLCBzb1xuICogQW5ndWxhciBwcm92aWRlcyB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Zvcm0gYG5nRm9ybWB9IGRpcmVjdGl2ZSwgd2hpY2ggYmVoYXZlcyBpZGVudGljYWxseSB0b1xuICogYGZvcm1gIGJ1dCBjYW4gYmUgbmVzdGVkLiBOZXN0ZWQgZm9ybXMgY2FuIGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIGlmIHRoZSB2YWxpZGl0eSBvZiBhIHN1Yi1ncm91cFxuICogb2YgY29udHJvbHMgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZC5cbiAqXG4gKiAjIENTUyBjbGFzc2VzXG4gKiAgLSBgbmctdmFsaWRgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyB2YWxpZC5cbiAqICAtIGBuZy1pbnZhbGlkYCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgaW52YWxpZC5cbiAqICAtIGBuZy1wZW5kaW5nYCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgcGVuZGluZy5cbiAqICAtIGBuZy1wcmlzdGluZWAgaXMgc2V0IGlmIHRoZSBmb3JtIGlzIHByaXN0aW5lLlxuICogIC0gYG5nLWRpcnR5YCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgZGlydHkuXG4gKiAgLSBgbmctc3VibWl0dGVkYCBpcyBzZXQgaWYgdGhlIGZvcm0gd2FzIHN1Ym1pdHRlZC5cbiAqXG4gKiBLZWVwIGluIG1pbmQgdGhhdCBuZ0FuaW1hdGUgY2FuIGRldGVjdCBlYWNoIG9mIHRoZXNlIGNsYXNzZXMgd2hlbiBhZGRlZCBhbmQgcmVtb3ZlZC5cbiAqXG4gKlxuICogIyBTdWJtaXR0aW5nIGEgZm9ybSBhbmQgcHJldmVudGluZyB0aGUgZGVmYXVsdCBhY3Rpb25cbiAqXG4gKiBTaW5jZSB0aGUgcm9sZSBvZiBmb3JtcyBpbiBjbGllbnQtc2lkZSBBbmd1bGFyIGFwcGxpY2F0aW9ucyBpcyBkaWZmZXJlbnQgdGhhbiBpbiBjbGFzc2ljYWxcbiAqIHJvdW5kdHJpcCBhcHBzLCBpdCBpcyBkZXNpcmFibGUgZm9yIHRoZSBicm93c2VyIG5vdCB0byB0cmFuc2xhdGUgdGhlIGZvcm0gc3VibWlzc2lvbiBpbnRvIGEgZnVsbFxuICogcGFnZSByZWxvYWQgdGhhdCBzZW5kcyB0aGUgZGF0YSB0byB0aGUgc2VydmVyLiBJbnN0ZWFkIHNvbWUgamF2YXNjcmlwdCBsb2dpYyBzaG91bGQgYmUgdHJpZ2dlcmVkXG4gKiB0byBoYW5kbGUgdGhlIGZvcm0gc3VibWlzc2lvbiBpbiBhbiBhcHBsaWNhdGlvbi1zcGVjaWZpYyB3YXkuXG4gKlxuICogRm9yIHRoaXMgcmVhc29uLCBBbmd1bGFyIHByZXZlbnRzIHRoZSBkZWZhdWx0IGFjdGlvbiAoZm9ybSBzdWJtaXNzaW9uIHRvIHRoZSBzZXJ2ZXIpIHVubGVzcyB0aGVcbiAqIGA8Zm9ybT5gIGVsZW1lbnQgaGFzIGFuIGBhY3Rpb25gIGF0dHJpYnV0ZSBzcGVjaWZpZWQuXG4gKlxuICogWW91IGNhbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHdheXMgdG8gc3BlY2lmeSB3aGF0IGphdmFzY3JpcHQgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlblxuICogYSBmb3JtIGlzIHN1Ym1pdHRlZDpcbiAqXG4gKiAtIHtAbGluayBuZy5kaXJlY3RpdmU6bmdTdWJtaXQgbmdTdWJtaXR9IGRpcmVjdGl2ZSBvbiB0aGUgZm9ybSBlbGVtZW50XG4gKiAtIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGljayBuZ0NsaWNrfSBkaXJlY3RpdmUgb24gdGhlIGZpcnN0XG4gICogIGJ1dHRvbiBvciBpbnB1dCBmaWVsZCBvZiB0eXBlIHN1Ym1pdCAoaW5wdXRbdHlwZT1zdWJtaXRdKVxuICpcbiAqIFRvIHByZXZlbnQgZG91YmxlIGV4ZWN1dGlvbiBvZiB0aGUgaGFuZGxlciwgdXNlIG9ubHkgb25lIG9mIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nU3VibWl0IG5nU3VibWl0fVxuICogb3Ige0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9IGRpcmVjdGl2ZXMuXG4gKiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtIHN1Ym1pc3Npb24gcnVsZXMgaW4gdGhlIEhUTUwgc3BlY2lmaWNhdGlvbjpcbiAqXG4gKiAtIElmIGEgZm9ybSBoYXMgb25seSBvbmUgaW5wdXQgZmllbGQgdGhlbiBoaXR0aW5nIGVudGVyIGluIHRoaXMgZmllbGQgdHJpZ2dlcnMgZm9ybSBzdWJtaXRcbiAqIChgbmdTdWJtaXRgKVxuICogLSBpZiBhIGZvcm0gaGFzIDIrIGlucHV0IGZpZWxkcyBhbmQgbm8gYnV0dG9ucyBvciBpbnB1dFt0eXBlPXN1Ym1pdF0gdGhlbiBoaXR0aW5nIGVudGVyXG4gKiBkb2Vzbid0IHRyaWdnZXIgc3VibWl0XG4gKiAtIGlmIGEgZm9ybSBoYXMgb25lIG9yIG1vcmUgaW5wdXQgZmllbGRzIGFuZCBvbmUgb3IgbW9yZSBidXR0b25zIG9yIGlucHV0W3R5cGU9c3VibWl0XSB0aGVuXG4gKiBoaXR0aW5nIGVudGVyIGluIGFueSBvZiB0aGUgaW5wdXQgZmllbGRzIHdpbGwgdHJpZ2dlciB0aGUgY2xpY2sgaGFuZGxlciBvbiB0aGUgKmZpcnN0KiBidXR0b24gb3JcbiAqIGlucHV0W3R5cGU9c3VibWl0XSAoYG5nQ2xpY2tgKSAqYW5kKiBhIHN1Ym1pdCBoYW5kbGVyIG9uIHRoZSBlbmNsb3NpbmcgZm9ybSAoYG5nU3VibWl0YClcbiAqXG4gKiBBbnkgcGVuZGluZyBgbmdNb2RlbE9wdGlvbnNgIGNoYW5nZXMgd2lsbCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5IHdoZW4gYW4gZW5jbG9zaW5nIGZvcm0gaXNcbiAqIHN1Ym1pdHRlZC4gTm90ZSB0aGF0IGBuZ0NsaWNrYCBldmVudHMgd2lsbCBvY2N1ciBiZWZvcmUgdGhlIG1vZGVsIGlzIHVwZGF0ZWQuIFVzZSBgbmdTdWJtaXRgXG4gKiB0byBoYXZlIGFjY2VzcyB0byB0aGUgdXBkYXRlZCBtb2RlbC5cbiAqXG4gKiAjIyBBbmltYXRpb24gSG9va3NcbiAqXG4gKiBBbmltYXRpb25zIGluIG5nRm9ybSBhcmUgdHJpZ2dlcmVkIHdoZW4gYW55IG9mIHRoZSBhc3NvY2lhdGVkIENTUyBjbGFzc2VzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZC5cbiAqIFRoZXNlIGNsYXNzZXMgYXJlOiBgLm5nLXByaXN0aW5lYCwgYC5uZy1kaXJ0eWAsIGAubmctaW52YWxpZGAgYW5kIGAubmctdmFsaWRgIGFzIHdlbGwgYXMgYW55XG4gKiBvdGhlciB2YWxpZGF0aW9ucyB0aGF0IGFyZSBwZXJmb3JtZWQgd2l0aGluIHRoZSBmb3JtLiBBbmltYXRpb25zIGluIG5nRm9ybSBhcmUgc2ltaWxhciB0byBob3dcbiAqIHRoZXkgd29yayBpbiBuZ0NsYXNzIGFuZCBhbmltYXRpb25zIGNhbiBiZSBob29rZWQgaW50byB1c2luZyBDU1MgdHJhbnNpdGlvbnMsIGtleWZyYW1lcyBhcyB3ZWxsXG4gKiBhcyBKUyBhbmltYXRpb25zLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSB3YXkgdG8gdXRpbGl6ZSBDU1MgdHJhbnNpdGlvbnMgdG8gc3R5bGUgYSBmb3JtIGVsZW1lbnRcbiAqIHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQgYXMgaW52YWxpZCBhZnRlciBpdCBoYXMgYmVlbiB2YWxpZGF0ZWQ6XG4gKlxuICogPHByZT5cbiAqIC8vYmUgc3VyZSB0byBpbmNsdWRlIG5nQW5pbWF0ZSBhcyBhIG1vZHVsZSB0byBob29rIGludG8gbW9yZVxuICogLy9hZHZhbmNlZCBhbmltYXRpb25zXG4gKiAubXktZm9ybSB7XG4gKiAgIHRyYW5zaXRpb246MC41cyBsaW5lYXIgYWxsO1xuICogICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAqIH1cbiAqIC5teS1mb3JtLm5nLWludmFsaWQge1xuICogICBiYWNrZ3JvdW5kOiByZWQ7XG4gKiAgIGNvbG9yOndoaXRlO1xuICogfVxuICogPC9wcmU+XG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctZm9ybVwiIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIGZpeEJhc2U9XCJ0cnVlXCIgbW9kdWxlPVwiZm9ybUV4YW1wbGVcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdmb3JtRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRm9ybUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS51c2VyVHlwZSA9ICdndWVzdCc7XG4gICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8c3R5bGU+XG4gICAgICAgIC5teS1mb3JtIHtcbiAgICAgICAgICB0cmFuc2l0aW9uOmFsbCBsaW5lYXIgMC41cztcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgfVxuICAgICAgICAubXktZm9ybS5uZy1pbnZhbGlkIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICAgIH1cbiAgICAgICA8L3N0eWxlPlxuICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRm9ybUNvbnRyb2xsZXJcIiBjbGFzcz1cIm15LWZvcm1cIj5cbiAgICAgICAgIHVzZXJUeXBlOiA8aW5wdXQgbmFtZT1cImlucHV0XCIgbmctbW9kZWw9XCJ1c2VyVHlwZVwiIHJlcXVpcmVkPlxuICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+UmVxdWlyZWQhPC9zcGFuPjxicj5cbiAgICAgICAgIDxjb2RlPnVzZXJUeXBlID0ge3t1c2VyVHlwZX19PC9jb2RlPjxicj5cbiAgICAgICAgIDxjb2RlPm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvY29kZT48YnI+XG4gICAgICAgICA8Y29kZT5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L2NvZGU+PGJyPlxuICAgICAgICAgPGNvZGU+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC9jb2RlPjxicj5cbiAgICAgICAgIDxjb2RlPm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC9jb2RlPjxicj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdXNlclR5cGUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3VzZXJUeXBlJykpO1xuICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcblxuICAgICAgICAgIGV4cGVjdCh1c2VyVHlwZS5nZXRUZXh0KCkpLnRvQ29udGFpbignZ3Vlc3QnKTtcbiAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHVzZXJUeXBlID0gZWxlbWVudChieS5iaW5kaW5nKCd1c2VyVHlwZScpKTtcbiAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG4gICAgICAgICAgdmFyIHVzZXJJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXJUeXBlJykpO1xuXG4gICAgICAgICAgdXNlcklucHV0LmNsZWFyKCk7XG4gICAgICAgICAgdXNlcklucHV0LnNlbmRLZXlzKCcnKTtcblxuICAgICAgICAgIGV4cGVjdCh1c2VyVHlwZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3VzZXJUeXBlID0nKTtcbiAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgTmFtZSBvZiB0aGUgZm9ybS4gSWYgc3BlY2lmaWVkLCB0aGUgZm9ybSBjb250cm9sbGVyIHdpbGwgYmUgcHVibGlzaGVkIGludG9cbiAqICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkIHNjb3BlLCB1bmRlciB0aGlzIG5hbWUuXG4gKi9cbnZhciBmb3JtRGlyZWN0aXZlRmFjdG9yeSA9IGZ1bmN0aW9uKGlzTmdGb3JtKSB7XG4gIHJldHVybiBbJyR0aW1lb3V0JywgJyRwYXJzZScsIGZ1bmN0aW9uKCR0aW1lb3V0LCAkcGFyc2UpIHtcbiAgICB2YXIgZm9ybURpcmVjdGl2ZSA9IHtcbiAgICAgIG5hbWU6ICdmb3JtJyxcbiAgICAgIHJlc3RyaWN0OiBpc05nRm9ybSA/ICdFQUMnIDogJ0UnLFxuICAgICAgcmVxdWlyZTogWydmb3JtJywgJ15eP2Zvcm0nXSwgLy9maXJzdCBpcyB0aGUgZm9ybSdzIG93biBjdHJsLCBzZWNvbmQgaXMgYW4gb3B0aW9uYWwgcGFyZW50IGZvcm1cbiAgICAgIGNvbnRyb2xsZXI6IEZvcm1Db250cm9sbGVyLFxuICAgICAgY29tcGlsZTogZnVuY3Rpb24gbmdGb3JtQ29tcGlsZShmb3JtRWxlbWVudCwgYXR0cikge1xuICAgICAgICAvLyBTZXR1cCBpbml0aWFsIHN0YXRlIG9mIHRoZSBjb250cm9sXG4gICAgICAgIGZvcm1FbGVtZW50LmFkZENsYXNzKFBSSVNUSU5FX0NMQVNTKS5hZGRDbGFzcyhWQUxJRF9DTEFTUyk7XG5cbiAgICAgICAgdmFyIG5hbWVBdHRyID0gYXR0ci5uYW1lID8gJ25hbWUnIDogKGlzTmdGb3JtICYmIGF0dHIubmdGb3JtID8gJ25nRm9ybScgOiBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmU6IGZ1bmN0aW9uIG5nRm9ybVByZUxpbmsoc2NvcGUsIGZvcm1FbGVtZW50LCBhdHRyLCBjdHJscykge1xuICAgICAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBjdHJsc1swXTtcblxuICAgICAgICAgICAgLy8gaWYgYGFjdGlvbmAgYXR0ciBpcyBub3QgcHJlc2VudCBvbiB0aGUgZm9ybSwgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gKHN1Ym1pc3Npb24pXG4gICAgICAgICAgICBpZiAoISgnYWN0aW9uJyBpbiBhdHRyKSkge1xuICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UganEgZXZlbnRzIGJlY2F1c2UgaWYgYSBmb3JtIGlzIGRlc3Ryb3llZCBkdXJpbmcgc3VibWlzc2lvbiB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgICAvLyBhY3Rpb24gaXMgbm90IHByZXZlbnRlZC4gc2VlICMxMjM4XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIElFIDkgaXMgbm90IGFmZmVjdGVkIGJlY2F1c2UgaXQgZG9lc24ndCBmaXJlIGEgc3VibWl0IGV2ZW50IGFuZCB0cnkgdG8gZG8gYSBmdWxsXG4gICAgICAgICAgICAgIC8vIHBhZ2UgcmVsb2FkIGlmIHRoZSBmb3JtIHdhcyBkZXN0cm95ZWQgYnkgc3VibWlzc2lvbiBvZiB0aGUgZm9ybSB2aWEgYSBjbGljayBoYW5kbGVyXG4gICAgICAgICAgICAgIC8vIG9uIGEgYnV0dG9uIGluIHRoZSBmb3JtLiBMb29rcyBsaWtlIGFuIElFOSBzcGVjaWZpYyBidWcuXG4gICAgICAgICAgICAgIHZhciBoYW5kbGVGb3JtU3VibWlzc2lvbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kY29tbWl0Vmlld1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRzZXRTdWJtaXR0ZWQoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgZm9ybUVsZW1lbnRbMF0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pO1xuXG4gICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIHByZXZlbnREZWZhdWx0IGxpc3RlbmVyIHNvIHRoYXQgd2UgZG9uJ3Qgbm90IGxlYWsgbWVtb3J5IGJ1dCBpbiBhXG4gICAgICAgICAgICAgIC8vIHdheSB0aGF0IHdpbGwgYWNoaWV2ZSB0aGUgcHJldmVudGlvbiBvZiB0aGUgZGVmYXVsdCBhY3Rpb24uXG4gICAgICAgICAgICAgIGZvcm1FbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgZm9ybUVsZW1lbnRbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pO1xuICAgICAgICAgICAgICAgIH0sIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRGb3JtQ3RybCA9IGN0cmxzWzFdIHx8IGNvbnRyb2xsZXIuJCRwYXJlbnRGb3JtO1xuICAgICAgICAgICAgcGFyZW50Rm9ybUN0cmwuJGFkZENvbnRyb2woY29udHJvbGxlcik7XG5cbiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBuYW1lQXR0ciA/IGdldFNldHRlcihjb250cm9sbGVyLiRuYW1lKSA6IG5vb3A7XG5cbiAgICAgICAgICAgIGlmIChuYW1lQXR0cikge1xuICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICBhdHRyLiRvYnNlcnZlKG5hbWVBdHRyLCBmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLiRuYW1lID09PSBuZXdWYWx1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNldHRlcihzY29wZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLiQkcGFyZW50Rm9ybS4kJHJlbmFtZUNvbnRyb2woY29udHJvbGxlciwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHNldHRlciA9IGdldFNldHRlcihjb250cm9sbGVyLiRuYW1lKTtcbiAgICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1FbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLiQkcGFyZW50Rm9ybS4kcmVtb3ZlQ29udHJvbChjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgc2V0dGVyKHNjb3BlLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICBleHRlbmQoY29udHJvbGxlciwgbnVsbEZvcm1DdHJsKTsgLy9zdG9wIHByb3BhZ2F0aW5nIGNoaWxkIGRlc3RydWN0aW9uIGhhbmRsZXJzIHVwd2FyZHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1EaXJlY3RpdmU7XG5cbiAgICBmdW5jdGlvbiBnZXRTZXR0ZXIoZXhwcmVzc2lvbikge1xuICAgICAgaWYgKGV4cHJlc3Npb24gPT09ICcnKSB7XG4gICAgICAgIC8vY3JlYXRlIGFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiwgc28gZm9ybXMgd2l0aCBhbiBlbXB0eSBuYW1lIGNhbiBiZSByZW5hbWVkIGxhdGVyXG4gICAgICAgIHJldHVybiAkcGFyc2UoJ3RoaXNbXCJcIl0nKS5hc3NpZ247XG4gICAgICB9XG4gICAgICByZXR1cm4gJHBhcnNlKGV4cHJlc3Npb24pLmFzc2lnbiB8fCBub29wO1xuICAgIH1cbiAgfV07XG59O1xuXG52YXIgZm9ybURpcmVjdGl2ZSA9IGZvcm1EaXJlY3RpdmVGYWN0b3J5KCk7XG52YXIgbmdGb3JtRGlyZWN0aXZlID0gZm9ybURpcmVjdGl2ZUZhY3RvcnkodHJ1ZSk7XG5cblxuXG4vLyBoZWxwZXIgbWV0aG9kc1xuZnVuY3Rpb24gc2V0dXBWYWxpZGl0eShpbnN0YW5jZSkge1xuICBpbnN0YW5jZS4kJGNsYXNzQ2FjaGUgPSB7fTtcbiAgaW5zdGFuY2UuJCRjbGFzc0NhY2hlW0lOVkFMSURfQ0xBU1NdID0gIShpbnN0YW5jZS4kJGNsYXNzQ2FjaGVbVkFMSURfQ0xBU1NdID0gaW5zdGFuY2UuJCRlbGVtZW50Lmhhc0NsYXNzKFZBTElEX0NMQVNTKSk7XG59XG5mdW5jdGlvbiBhZGRTZXRWYWxpZGl0eU1ldGhvZChjb250ZXh0KSB7XG4gIHZhciBjbGF6eiA9IGNvbnRleHQuY2xhenosXG4gICAgICBzZXQgPSBjb250ZXh0LnNldCxcbiAgICAgIHVuc2V0ID0gY29udGV4dC51bnNldDtcblxuICBjbGF6ei5wcm90b3R5cGUuJHNldFZhbGlkaXR5ID0gZnVuY3Rpb24odmFsaWRhdGlvbkVycm9yS2V5LCBzdGF0ZSwgY29udHJvbGxlcikge1xuICAgIGlmIChpc1VuZGVmaW5lZChzdGF0ZSkpIHtcbiAgICAgIGNyZWF0ZUFuZFNldCh0aGlzLCAnJHBlbmRpbmcnLCB2YWxpZGF0aW9uRXJyb3JLZXksIGNvbnRyb2xsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnNldEFuZENsZWFudXAodGhpcywgJyRwZW5kaW5nJywgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4oc3RhdGUpKSB7XG4gICAgICB1bnNldCh0aGlzLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICAgIHVuc2V0KHRoaXMuJCRzdWNjZXNzLCB2YWxpZGF0aW9uRXJyb3JLZXksIGNvbnRyb2xsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgdW5zZXQodGhpcy4kZXJyb3IsIHZhbGlkYXRpb25FcnJvcktleSwgY29udHJvbGxlcik7XG4gICAgICAgIHNldCh0aGlzLiQkc3VjY2VzcywgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldCh0aGlzLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICAgICAgdW5zZXQodGhpcy4kJHN1Y2Nlc3MsIHZhbGlkYXRpb25FcnJvcktleSwgY29udHJvbGxlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLiRwZW5kaW5nKSB7XG4gICAgICBjYWNoZWRUb2dnbGVDbGFzcyh0aGlzLCBQRU5ESU5HX0NMQVNTLCB0cnVlKTtcbiAgICAgIHRoaXMuJHZhbGlkID0gdGhpcy4kaW52YWxpZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3ModGhpcywgJycsIG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZWRUb2dnbGVDbGFzcyh0aGlzLCBQRU5ESU5HX0NMQVNTLCBmYWxzZSk7XG4gICAgICB0aGlzLiR2YWxpZCA9IGlzT2JqZWN0RW1wdHkodGhpcy4kZXJyb3IpO1xuICAgICAgdGhpcy4kaW52YWxpZCA9ICF0aGlzLiR2YWxpZDtcbiAgICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3ModGhpcywgJycsIHRoaXMuJHZhbGlkKTtcbiAgICB9XG5cbiAgICAvLyByZS1yZWFkIHRoZSBzdGF0ZSBhcyB0aGUgc2V0L3Vuc2V0IG1ldGhvZHMgY291bGQgaGF2ZVxuICAgIC8vIGNvbWJpbmVkIHN0YXRlIGluIHRoaXMuJGVycm9yW3ZhbGlkYXRpb25FcnJvcl0gKHVzZWQgZm9yIGZvcm1zKSxcbiAgICAvLyB3aGVyZSBzZXR0aW5nL3Vuc2V0dGluZyBvbmx5IGluY3JlbWVudHMvZGVjcmVtZW50cyB0aGUgdmFsdWUsXG4gICAgLy8gYW5kIGRvZXMgbm90IHJlcGxhY2UgaXQuXG4gICAgdmFyIGNvbWJpbmVkU3RhdGU7XG4gICAgaWYgKHRoaXMuJHBlbmRpbmcgJiYgdGhpcy4kcGVuZGluZ1t2YWxpZGF0aW9uRXJyb3JLZXldKSB7XG4gICAgICBjb21iaW5lZFN0YXRlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy4kZXJyb3JbdmFsaWRhdGlvbkVycm9yS2V5XSkge1xuICAgICAgY29tYmluZWRTdGF0ZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy4kJHN1Y2Nlc3NbdmFsaWRhdGlvbkVycm9yS2V5XSkge1xuICAgICAgY29tYmluZWRTdGF0ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJpbmVkU3RhdGUgPSBudWxsO1xuICAgIH1cblxuICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3ModGhpcywgdmFsaWRhdGlvbkVycm9yS2V5LCBjb21iaW5lZFN0YXRlKTtcbiAgICB0aGlzLiQkcGFyZW50Rm9ybS4kc2V0VmFsaWRpdHkodmFsaWRhdGlvbkVycm9yS2V5LCBjb21iaW5lZFN0YXRlLCB0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVBbmRTZXQoY3RybCwgbmFtZSwgdmFsdWUsIGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoIWN0cmxbbmFtZV0pIHtcbiAgICAgIGN0cmxbbmFtZV0gPSB7fTtcbiAgICB9XG4gICAgc2V0KGN0cmxbbmFtZV0sIHZhbHVlLCBjb250cm9sbGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuc2V0QW5kQ2xlYW51cChjdHJsLCBuYW1lLCB2YWx1ZSwgY29udHJvbGxlcikge1xuICAgIGlmIChjdHJsW25hbWVdKSB7XG4gICAgICB1bnNldChjdHJsW25hbWVdLCB2YWx1ZSwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmIChpc09iamVjdEVtcHR5KGN0cmxbbmFtZV0pKSB7XG4gICAgICBjdHJsW25hbWVdID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNhY2hlZFRvZ2dsZUNsYXNzKGN0cmwsIGNsYXNzTmFtZSwgc3dpdGNoVmFsdWUpIHtcbiAgICBpZiAoc3dpdGNoVmFsdWUgJiYgIWN0cmwuJCRjbGFzc0NhY2hlW2NsYXNzTmFtZV0pIHtcbiAgICAgIGN0cmwuJCRhbmltYXRlLmFkZENsYXNzKGN0cmwuJCRlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgY3RybC4kJGNsYXNzQ2FjaGVbY2xhc3NOYW1lXSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghc3dpdGNoVmFsdWUgJiYgY3RybC4kJGNsYXNzQ2FjaGVbY2xhc3NOYW1lXSkge1xuICAgICAgY3RybC4kJGFuaW1hdGUucmVtb3ZlQ2xhc3MoY3RybC4kJGVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gICAgICBjdHJsLiQkY2xhc3NDYWNoZVtjbGFzc05hbWVdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlVmFsaWRhdGlvbkNzcyhjdHJsLCB2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQpIHtcbiAgICB2YWxpZGF0aW9uRXJyb3JLZXkgPSB2YWxpZGF0aW9uRXJyb3JLZXkgPyAnLScgKyBzbmFrZV9jYXNlKHZhbGlkYXRpb25FcnJvcktleSwgJy0nKSA6ICcnO1xuXG4gICAgY2FjaGVkVG9nZ2xlQ2xhc3MoY3RybCwgVkFMSURfQ0xBU1MgKyB2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQgPT09IHRydWUpO1xuICAgIGNhY2hlZFRvZ2dsZUNsYXNzKGN0cmwsIElOVkFMSURfQ0xBU1MgKyB2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQgPT09IGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICBpZiAob2JqKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyogZ2xvYmFsXG4gIFZBTElEX0NMQVNTOiBmYWxzZSxcbiAgSU5WQUxJRF9DTEFTUzogZmFsc2UsXG4gIFBSSVNUSU5FX0NMQVNTOiBmYWxzZSxcbiAgRElSVFlfQ0xBU1M6IGZhbHNlLFxuICBuZ01vZGVsTWluRXJyOiBmYWxzZVxuKi9cblxuLy8gUmVnZXggY29kZSB3YXMgaW5pdGlhbGx5IG9idGFpbmVkIGZyb20gU08gcHJpb3IgdG8gbW9kaWZpY2F0aW9uOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTQzMDcwL2phdmFzY3JpcHQtcmVnZXgtaXNvLWRhdGV0aW1lI2Fuc3dlci0zMTQzMjMxXG52YXIgSVNPX0RBVEVfUkVHRVhQID0gL15cXGR7NCx9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGRcXC5cXGQrKD86WystXVswLTJdXFxkOlswLTVdXFxkfFopJC87XG4vLyBTZWUgdmFsaWQgVVJMcyBpbiBSRkMzOTg3IChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg3KVxuLy8gTm90ZTogV2UgYXJlIGJlaW5nIG1vcmUgbGVuaWVudCwgYmVjYXVzZSBicm93c2VycyBhcmUgdG9vLlxuLy8gICAxLiBTY2hlbWVcbi8vICAgMi4gU2xhc2hlc1xuLy8gICAzLiBVc2VybmFtZVxuLy8gICA0LiBQYXNzd29yZFxuLy8gICA1LiBIb3N0bmFtZVxuLy8gICA2LiBQb3J0XG4vLyAgIDcuIFBhdGhcbi8vICAgOC4gUXVlcnlcbi8vICAgOS4gRnJhZ21lbnRcbi8vICAgICAgICAgICAgICAgICAxMTExMTExMTExMTExMTExIDIyMiAgIDMzMzMzMyAgICA0NDQ0NCAgICAgICAgNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUgICAgIDY2NiAgICAgNzc3Nzc3NzcgICAgIDg4ODg4ODggICAgIDk5OVxudmFyIFVSTF9SRUdFWFAgPSAvXlthLXpdW2EtelxcZC4rLV0qOlxcLyooPzpbXjpAXSsoPzo6W15AXSspP0ApPyg/OlteXFxzOi8/I10rfFxcW1thLWZcXGQ6XStdKSg/OjpcXGQrKT8oPzpcXC9bXj8jXSopPyg/OlxcP1teI10qKT8oPzojLiopPyQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG52YXIgRU1BSUxfUkVHRVhQID0gL14oPz0uezEsMjU0fSQpKD89LnsxLDY0fUApWy0hIyQlJicqKy8wLTk9P0EtWl5fYGEtent8fX5dKyhcXC5bLSEjJCUmJyorLzAtOT0/QS1aXl9gYS16e3x9fl0rKSpAW0EtWmEtejAtOV0oW0EtWmEtejAtOS1dezAsNjF9W0EtWmEtejAtOV0pPyhcXC5bQS1aYS16MC05XShbQS1aYS16MC05LV17MCw2MX1bQS1aYS16MC05XSk/KSokLztcbnZhciBOVU1CRVJfUkVHRVhQID0gL15cXHMqKC18XFwrKT8oXFxkK3woXFxkKihcXC5cXGQqKSkpKFtlRV1bKy1dP1xcZCspP1xccyokLztcbnZhciBEQVRFX1JFR0VYUCA9IC9eKFxcZHs0LH0pLShcXGR7Mn0pLShcXGR7Mn0pJC87XG52YXIgREFURVRJTUVMT0NBTF9SRUdFWFAgPSAvXihcXGR7NCx9KS0oXFxkXFxkKS0oXFxkXFxkKVQoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKShcXC5cXGR7MSwzfSk/KT8kLztcbnZhciBXRUVLX1JFR0VYUCA9IC9eKFxcZHs0LH0pLVcoXFxkXFxkKSQvO1xudmFyIE1PTlRIX1JFR0VYUCA9IC9eKFxcZHs0LH0pLShcXGRcXGQpJC87XG52YXIgVElNRV9SRUdFWFAgPSAvXihcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKFxcLlxcZHsxLDN9KT8pPyQvO1xuXG52YXIgUEFSVElBTF9WQUxJREFUSU9OX0VWRU5UUyA9ICdrZXlkb3duIHdoZWVsIG1vdXNlZG93bic7XG52YXIgUEFSVElBTF9WQUxJREFUSU9OX1RZUEVTID0gY3JlYXRlTWFwKCk7XG5mb3JFYWNoKCdkYXRlLGRhdGV0aW1lLWxvY2FsLG1vbnRoLHRpbWUsd2Vlaycuc3BsaXQoJywnKSwgZnVuY3Rpb24odHlwZSkge1xuICBQQVJUSUFMX1ZBTElEQVRJT05fVFlQRVNbdHlwZV0gPSB0cnVlO1xufSk7XG5cbnZhciBpbnB1dFR5cGUgPSB7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFt0ZXh0XVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhbmRhcmQgSFRNTCB0ZXh0IGlucHV0IHdpdGggYW5ndWxhciBkYXRhIGJpbmRpbmcsIGluaGVyaXRlZCBieSBtb3N0IG9mIHRoZSBgaW5wdXRgIGVsZW1lbnRzLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG9cbiAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2ZcbiAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuXG4gICAqICAgIG1pbmxlbmd0aC5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01heGxlbmd0aCBTZXRzIGBtYXhsZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBsb25nZXIgdGhhblxuICAgKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2ZcbiAgICogICAgYW55IGxlbmd0aC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBwYXR0ZXJuIFNpbWlsYXIgdG8gYG5nUGF0dGVybmAgZXhjZXB0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZ1xuICAgKiAgICB0aGF0IGNvbnRhaW5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYm9keSB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgcmVndWxhciBleHByZXNzaW9uXG4gICAqICAgIGFzIGluIHRoZSBuZ1BhdHRlcm4gZGlyZWN0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgbmdNb2RlbCB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlICR2aWV3VmFsdWV9XG4gICAqICAgIGRvZXMgbm90IG1hdGNoIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLlxuICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBSZWdFeHAgb2JqZWN0LCB0aGVuIHRoaXMgaXMgdXNlZCBkaXJlY3RseS5cbiAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgc3RyaW5nLCB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwXG4gICAqICAgIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYFwiYWJjXCJgIHdpbGwgYmUgY29udmVydGVkIHRvXG4gICAqICAgIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC48YnIgLz5cbiAgICogICAgKipOb3RlOioqIEF2b2lkIHVzaW5nIHRoZSBgZ2AgZmxhZyBvbiB0aGUgUmVnRXhwLCBhcyBpdCB3aWxsIGNhdXNlIGVhY2ggc3VjY2Vzc2l2ZSBzZWFyY2ggdG9cbiAgICogICAgc3RhcnQgYXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNlYXJjaCdzIG1hdGNoLCB0aHVzIG5vdCB0YWtpbmcgdGhlIHdob2xlIGlucHV0IHZhbHVlIGludG9cbiAgICogICAgYWNjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtuZ1RyaW09dHJ1ZV0gSWYgc2V0IHRvIGZhbHNlIEFuZ3VsYXIgd2lsbCBub3QgYXV0b21hdGljYWxseSB0cmltIHRoZSBpbnB1dC5cbiAgICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgaW5wdXRbdHlwZT1wYXNzd29yZF0gY29udHJvbHMsIHdoaWNoIHdpbGwgbmV2ZXIgdHJpbSB0aGVcbiAgICogICAgaW5wdXQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgICA8ZXhhbXBsZSBuYW1lPVwidGV4dC1pbnB1dC1kaXJlY3RpdmVcIiBtb2R1bGU9XCJ0ZXh0SW5wdXRFeGFtcGxlXCI+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgndGV4dElucHV0RXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAgICAkc2NvcGUuZXhhbXBsZSA9IHtcbiAgICAgICAgICAgICAgICAgdGV4dDogJ2d1ZXN0JyxcbiAgICAgICAgICAgICAgICAgd29yZDogL15cXHMqXFx3KlxccyokL1xuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPlNpbmdsZSB3b3JkOlxuICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS50ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgbmctcGF0dGVybj1cImV4YW1wbGUud29yZFwiIHJlcXVpcmVkIG5nLXRyaW09XCJmYWxzZVwiPlxuICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5wYXR0ZXJuXCI+XG4gICAgICAgICAgICAgICBTaW5nbGUgd29yZCBvbmx5ITwvc3Bhbj5cbiAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgIDxjb2RlPnRleHQgPSB7e2V4YW1wbGUudGV4dH19PC9jb2RlPjxici8+XG4gICAgICAgICAgIDxjb2RlPm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvY29kZT48YnIvPlxuICAgICAgICAgICA8Y29kZT5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L2NvZGU+PGJyLz5cbiAgICAgICAgICAgPGNvZGU+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC9jb2RlPjxici8+XG4gICAgICAgICAgIDxjb2RlPm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC9jb2RlPjxici8+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2ZpbGU+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgICB2YXIgdGV4dCA9IGVsZW1lbnQoYnkuYmluZGluZygnZXhhbXBsZS50ZXh0JykpO1xuICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcbiAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdleGFtcGxlLnRleHQnKSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdndWVzdCcpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7XG4gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7XG5cbiAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9FcXVhbCgndGV4dCA9Jyk7XG4gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgbXVsdGkgd29yZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCdoZWxsbyB3b3JsZCcpO1xuXG4gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIDwvZmlsZT5cbiAgICAgIDwvZXhhbXBsZT5cbiAgICovXG4gICd0ZXh0JzogdGV4dElucHV0VHlwZSxcblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBpbnB1dFxuICAgICAqIEBuYW1lIGlucHV0W2RhdGVdXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBJbnB1dCB3aXRoIGRhdGUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0XG4gICAgICogdGhlIEhUTUw1IGRhdGUgaW5wdXQsIGEgdGV4dCBlbGVtZW50IHdpbGwgYmUgdXNlZC4gSW4gdGhhdCBjYXNlLCB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAgICogZGF0ZSBmb3JtYXQgKHl5eXktTU0tZGQpLCBmb3IgZXhhbXBsZTogYDIwMDktMDEtMDZgLiBTaW5jZSBtYW55XG4gICAgICogbW9kZXJuIGJyb3dzZXJzIGRvIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGlucHV0IHR5cGUsIGl0IGlzIGltcG9ydGFudCB0byBwcm92aWRlIGN1ZXMgdG8gdXNlcnMgb24gdGhlXG4gICAgICogZXhwZWN0ZWQgaW5wdXQgZm9ybWF0IHZpYSBhIHBsYWNlaG9sZGVyIG9yIGxhYmVsLlxuICAgICAqXG4gICAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZ1xuICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLiBUaGlzIG11c3QgYmUgYVxuICAgICAqICAgdmFsaWQgSVNPIGRhdGUgc3RyaW5nICh5eXl5LU1NLWRkKS4gWW91IGNhbiBhbHNvIHVzZSBpbnRlcnBvbGF0aW9uIGluc2lkZSB0aGlzIGF0dHJpYnV0ZVxuICAgICAqICAgKGUuZy4gYG1pbj1cInt7bWluRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQnfX1cImApLiBOb3RlIHRoYXQgYG1pbmAgd2lsbCBhbHNvIGFkZCBuYXRpdmUgSFRNTDVcbiAgICAgKiAgIGNvbnN0cmFpbnQgdmFsaWRhdGlvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdCBiZVxuICAgICAqICAgYSB2YWxpZCBJU08gZGF0ZSBzdHJpbmcgKHl5eXktTU0tZGQpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXMgYXR0cmlidXRlXG4gICAgICogICAoZS5nLiBgbWF4PVwie3ttYXhEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiYCkuIE5vdGUgdGhhdCBgbWF4YCB3aWxsIGFsc28gYWRkIG5hdGl2ZSBIVE1MNVxuICAgICAqICAgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyBkYXRlIHN0cmluZ1xuICAgICAqICAgdGhlIGBuZ01pbmAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8uIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBzZXQgdGhlIGBtaW5gIGF0dHJpYnV0ZS5cbiAgICAgKiBAcGFyYW0geyhkYXRlfHN0cmluZyk9fSBuZ01heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8gdGhlIERhdGUgLyBJU08gZGF0ZSBzdHJpbmdcbiAgICAgKiAgIHRoZSBgbmdNYXhgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWF4YCBhdHRyaWJ1dGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gICAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgIDxleGFtcGxlIG5hbWU9XCJkYXRlLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cImRhdGVJbnB1dEV4YW1wbGVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8c2NyaXB0PlxuICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdkYXRlSW5wdXRFeGFtcGxlJywgW10pXG4gICAgICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAkc2NvcGUuZXhhbXBsZSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMjAxMywgOSwgMjIpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG4gICAgICAgPC9zY3JpcHQ+XG4gICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiIG5nLWNvbnRyb2xsZXI9XCJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJleGFtcGxlSW5wdXRcIj5QaWNrIGEgZGF0ZSBpbiAyMDEzOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgaWQ9XCJleGFtcGxlSW5wdXRcIiBuYW1lPVwiaW5wdXRcIiBuZy1tb2RlbD1cImV4YW1wbGUudmFsdWVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInl5eXktTU0tZGRcIiBtaW49XCIyMDEzLTAxLTAxXCIgbWF4PVwiMjAxMy0xMi0zMVwiIHJlcXVpcmVkIC8+XG4gICAgICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5kYXRlXCI+XG4gICAgICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcInl5eXktTU0tZGRcIn19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+XG4gICAgICAgPC9mb3JtPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LU1NLWRkXCInKSk7XG4gICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcblxuICAgICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydFxuICAgICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAgIC8vIGZvciB2YXJpb3VzIGJyb3dzZXJzIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgICAgZnVuY3Rpb24gc2V0SW5wdXQodmFsKSB7XG4gICAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi5cbiAgICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgICAgXCJpcHQudmFsdWUgPSAnXCIgKyB2YWwgKyBcIic7XCIgK1xuICAgICAgICAgIFwiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnXCIgKyB2YWwgKyBcIicpOyB9KTtcIjtcbiAgICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy0xMC0yMicpO1xuICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2V0SW5wdXQoJycpO1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMScpO1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7XG4gICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTtcbiAgICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgICAgPC9leGFtcGxlPlxuICAgICAqL1xuICAnZGF0ZSc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ2RhdGUnLCBEQVRFX1JFR0VYUCxcbiAgICAgICAgIGNyZWF0ZURhdGVQYXJzZXIoREFURV9SRUdFWFAsIFsneXl5eScsICdNTScsICdkZCddKSxcbiAgICAgICAgICd5eXl5LU1NLWRkJyksXG5cbiAgIC8qKlxuICAgICogQG5nZG9jIGlucHV0XG4gICAgKiBAbmFtZSBpbnB1dFtkYXRldGltZS1sb2NhbF1cbiAgICAqXG4gICAgKiBAZGVzY3JpcHRpb25cbiAgICAqIElucHV0IHdpdGggZGF0ZXRpbWUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0XG4gICAgKiB0aGUgSFRNTDUgZGF0ZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAgKiBsb2NhbCBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLCBmb3IgZXhhbXBsZTogYDIwMTAtMTItMjhUMTQ6NTc6MDBgLlxuICAgICpcbiAgICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICpcbiAgICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuXG4gICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb25cbiAgICAqICAgaW5zaWRlIHRoaXMgYXR0cmlidXRlIChlLmcuIGBtaW49XCJ7e21pbkRhdGV0aW1lTG9jYWwgfCBkYXRlOid5eXl5LU1NLWRkVEhIOm1tOnNzJ319XCJgKS5cbiAgICAqICAgTm90ZSB0aGF0IGBtaW5gIHdpbGwgYWxzbyBhZGQgbmF0aXZlIEhUTUw1IGNvbnN0cmFpbnQgdmFsaWRhdGlvbi5cbiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YC5cbiAgICAqICAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgSVNPIGRhdGV0aW1lIGZvcm1hdCAoeXl5eS1NTS1kZFRISDptbTpzcykuIFlvdSBjYW4gYWxzbyB1c2UgaW50ZXJwb2xhdGlvblxuICAgICogICBpbnNpZGUgdGhpcyBhdHRyaWJ1dGUgKGUuZy4gYG1heD1cInt7bWF4RGF0ZXRpbWVMb2NhbCB8IGRhdGU6J3l5eXktTU0tZGRUSEg6bW06c3MnfX1cImApLlxuICAgICogICBOb3RlIHRoYXQgYG1heGAgd2lsbCBhbHNvIGFkZCBuYXRpdmUgSFRNTDUgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgICogQHBhcmFtIHsoZGF0ZXxzdHJpbmcpPX0gbmdNaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgdG8gdGhlIERhdGUgLyBJU08gZGF0ZXRpbWUgc3RyaW5nXG4gICAgKiAgIHRoZSBgbmdNaW5gIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWluYCBhdHRyaWJ1dGUuXG4gICAgKiBAcGFyYW0geyhkYXRlfHN0cmluZyk9fSBuZ01heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSB0byB0aGUgRGF0ZSAvIElTTyBkYXRldGltZSBzdHJpbmdcbiAgICAqICAgdGhlIGBuZ01heGAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8uIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBzZXQgdGhlIGBtYXhgIGF0dHJpYnV0ZS5cbiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2ZcbiAgICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLlxuICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICpcbiAgICAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbmFtZT1cImRhdGV0aW1lbG9jYWwtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwiZGF0ZUV4YW1wbGVcIj5cbiAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPHNjcmlwdD5cbiAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2RhdGVFeGFtcGxlJywgW10pXG4gICAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICRzY29wZS5leGFtcGxlID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMjAxMCwgMTEsIDI4LCAxNCwgNTcpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1dKTtcbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiIG5nLWNvbnRyb2xsZXI9XCJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybFwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0XCI+UGljayBhIGRhdGUgYmV0d2VlbiBpbiAyMDEzOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBpZD1cImV4YW1wbGVJbnB1dFwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS52YWx1ZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInl5eXktTU0tZGRUSEg6bW06c3NcIiBtaW49XCIyMDAxLTAxLTAxVDAwOjAwOjAwXCIgbWF4PVwiMjAxMy0xMi0zMVQwMDowMDowMFwiIHJlcXVpcmVkIC8+XG4gICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5pbnB1dC4kZXJyb3IuZGF0ZXRpbWVsb2NhbFwiPlxuICAgICAgICAgICAgICBOb3QgYSB2YWxpZCBkYXRlITwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0dD52YWx1ZSA9IHt7ZXhhbXBsZS52YWx1ZSB8IGRhdGU6IFwieXl5eS1NTS1kZFRISDptbTpzc1wifX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LU1NLWRkVEhIOm1tOnNzXCInKSk7XG4gICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG5cbiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkge1xuICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLlxuICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgIFwiaXB0LnZhbHVlID0gJ1wiICsgdmFsICsgXCInO1wiICtcbiAgICAgICAgXCJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCdcIiArIHZhbCArIFwiJyk7IH0pO1wiO1xuICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgIH1cblxuICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMC0xMi0yOFQxNDo1NzowMCcpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldElucHV0KCcnKTtcbiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMVQyMzo1OTowMCcpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG4gICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAgICAqL1xuICAnZGF0ZXRpbWUtbG9jYWwnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCdkYXRldGltZWxvY2FsJywgREFURVRJTUVMT0NBTF9SRUdFWFAsXG4gICAgICBjcmVhdGVEYXRlUGFyc2VyKERBVEVUSU1FTE9DQUxfUkVHRVhQLCBbJ3l5eXknLCAnTU0nLCAnZGQnLCAnSEgnLCAnbW0nLCAnc3MnLCAnc3NzJ10pLFxuICAgICAgJ3l5eXktTU0tZGRUSEg6bW06c3Muc3NzJyksXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFt0aW1lXVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5wdXQgd2l0aCB0aW1lIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydFxuICAgKiB0aGUgSFRNTDUgdGltZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAqIGxvY2FsIHRpbWUgZm9ybWF0IChISDptbTpzcyksIGZvciBleGFtcGxlOiBgMTQ6NTc6MDBgLiBNb2RlbCBtdXN0IGJlIGEgRGF0ZSBvYmplY3QuIFRoaXMgYmluZGluZyB3aWxsIGFsd2F5cyBvdXRwdXQgYVxuICAgKiBEYXRlIG9iamVjdCB0byB0aGUgbW9kZWwgb2YgSmFudWFyeSAxLCAxOTcwLCBvciBsb2NhbCBkYXRlIGBuZXcgRGF0ZSgxOTcwLCAwLCAxLCBISCwgbW0sIHNzKWAuXG4gICAqXG4gICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLlxuICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyB0aW1lIGZvcm1hdCAoSEg6bW06c3MpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICogICBhdHRyaWJ1dGUgKGUuZy4gYG1pbj1cInt7bWluVGltZSB8IGRhdGU6J0hIOm1tOnNzJ319XCJgKS4gTm90ZSB0aGF0IGBtaW5gIHdpbGwgYWxzbyBhZGRcbiAgICogICBuYXRpdmUgSFRNTDUgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gICAqICAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgSVNPIHRpbWUgZm9ybWF0IChISDptbTpzcykuIFlvdSBjYW4gYWxzbyB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhpc1xuICAgKiAgIGF0dHJpYnV0ZSAoZS5nLiBgbWF4PVwie3ttYXhUaW1lIHwgZGF0ZTonSEg6bW06c3MnfX1cImApLiBOb3RlIHRoYXQgYG1heGAgd2lsbCBhbHNvIGFkZFxuICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB0aW1lIHN0cmluZyB0aGVcbiAgICogICBgbmdNaW5gIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWluYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB0aW1lIHN0cmluZyB0aGVcbiAgICogICBgbmdNYXhgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWF4YCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJ0aW1lLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cInRpbWVFeGFtcGxlXCI+XG4gICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICA8c2NyaXB0PlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ3RpbWVFeGFtcGxlJywgW10pXG4gICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLmV4YW1wbGUgPSB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMTk3MCwgMCwgMSwgMTQsIDU3LCAwKVxuICAgICAgICAgIH07XG4gICAgICAgIH1dKTtcbiAgICAgPC9zY3JpcHQ+XG4gICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmxcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dFwiPlBpY2sgYSB0aW1lIGJldHdlZW4gOGFtIGFuZCA1cG06PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgaWQ9XCJleGFtcGxlSW5wdXRcIiBuYW1lPVwiaW5wdXRcIiBuZy1tb2RlbD1cImV4YW1wbGUudmFsdWVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJISDptbTpzc1wiIG1pbj1cIjA4OjAwOjAwXCIgbWF4PVwiMTc6MDA6MDBcIiByZXF1aXJlZCAvPlxuICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnRpbWVcIj5cbiAgICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcIkhIOm1tOnNzXCJ9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICA8L2Zvcm0+XG4gICA8L2ZpbGU+XG4gICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICB2YXIgdmFsdWUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcIkhIOm1tOnNzXCInKSk7XG4gICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG5cbiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkge1xuICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLlxuICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgIFwiaXB0LnZhbHVlID0gJ1wiICsgdmFsICsgXCInO1wiICtcbiAgICAgICAgXCJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCdcIiArIHZhbCArIFwiJyk7IH0pO1wiO1xuICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgIH1cblxuICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMTQ6NTc6MDAnKTtcbiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRJbnB1dCgnJyk7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0SW5wdXQoJzIzOjU5OjAwJyk7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7XG4gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7XG4gICAgICB9KTtcbiAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAgICovXG4gICd0aW1lJzogY3JlYXRlRGF0ZUlucHV0VHlwZSgndGltZScsIFRJTUVfUkVHRVhQLFxuICAgICAgY3JlYXRlRGF0ZVBhcnNlcihUSU1FX1JFR0VYUCwgWydISCcsICdtbScsICdzcycsICdzc3MnXSksXG4gICAgICdISDptbTpzcy5zc3MnKSxcblxuICAgLyoqXG4gICAgKiBAbmdkb2MgaW5wdXRcbiAgICAqIEBuYW1lIGlucHV0W3dlZWtdXG4gICAgKlxuICAgICogQGRlc2NyaXB0aW9uXG4gICAgKiBJbnB1dCB3aXRoIHdlZWstb2YtdGhlLXllYXIgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gdG8gRGF0ZS4gSW4gYnJvd3NlcnMgdGhhdCBkbyBub3QgeWV0IHN1cHBvcnRcbiAgICAqIHRoZSBIVE1MNSB3ZWVrIGlucHV0LCBhIHRleHQgZWxlbWVudCB3aWxsIGJlIHVzZWQuIEluIHRoYXQgY2FzZSwgdGhlIHRleHQgbXVzdCBiZSBlbnRlcmVkIGluIGEgdmFsaWQgSVNPLTg2MDFcbiAgICAqIHdlZWsgZm9ybWF0ICh5eXl5LVcjIyksIGZvciBleGFtcGxlOiBgMjAxMy1XMDJgLlxuICAgICpcbiAgICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICpcbiAgICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuXG4gICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyB3ZWVrIGZvcm1hdCAoeXl5eS1XIyMpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICAqICAgYXR0cmlidXRlIChlLmcuIGBtaW49XCJ7e21pbldlZWsgfCBkYXRlOid5eXl5LVd3dyd9fVwiYCkuIE5vdGUgdGhhdCBgbWluYCB3aWxsIGFsc28gYWRkXG4gICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyB3ZWVrIGZvcm1hdCAoeXl5eS1XIyMpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICAqICAgYXR0cmlidXRlIChlLmcuIGBtYXg9XCJ7e21heFdlZWsgfCBkYXRlOid5eXl5LVd3dyd9fVwiYCkuIE5vdGUgdGhhdCBgbWF4YCB3aWxsIGFsc28gYWRkXG4gICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAgKiBAcGFyYW0geyhkYXRlfHN0cmluZyk9fSBuZ01pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8gdGhlIERhdGUgLyBJU08gd2VlayBzdHJpbmdcbiAgICAqICAgdGhlIGBuZ01pbmAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8uIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBzZXQgdGhlIGBtaW5gIGF0dHJpYnV0ZS5cbiAgICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB3ZWVrIHN0cmluZ1xuICAgICogICB0aGUgYG5nTWF4YCBleHByZXNzaW9uIGV2YWx1YXRlcyB0by4gTm90ZSB0aGF0IGl0IGRvZXMgbm90IHNldCB0aGUgYG1heGAgYXR0cmlidXRlLlxuICAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZlxuICAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwid2Vlay1pbnB1dC1kaXJlY3RpdmVcIiBtb2R1bGU9XCJ3ZWVrRXhhbXBsZVwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8c2NyaXB0PlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ3dlZWtFeGFtcGxlJywgW10pXG4gICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLmV4YW1wbGUgPSB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMjAxMywgMCwgMylcbiAgICAgICAgICB9O1xuICAgICAgICB9XSk7XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmxcIj5cbiAgICAgICAgPGxhYmVsPlBpY2sgYSBkYXRlIGJldHdlZW4gaW4gMjAxMzpcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJleGFtcGxlSW5wdXRcIiB0eXBlPVwid2Vla1wiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiWVlZWS1XIyNcIiBtaW49XCIyMDEyLVczMlwiXG4gICAgICAgICAgICAgICAgIG1heD1cIjIwMTMtVzUyXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci53ZWVrXCI+XG4gICAgICAgICAgICAgIE5vdCBhIHZhbGlkIGRhdGUhPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHR0PnZhbHVlID0ge3tleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LVd3d1wifX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LVd3d1wiJykpO1xuICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpO1xuXG4gICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydFxuICAgICAgLy8gc2VuZGluZyBrZXlzIHRvIGFsbCBrbm93biBIVE1MNSBpbnB1dCBjb250cm9sc1xuICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuXG4gICAgICBmdW5jdGlvbiBzZXRJbnB1dCh2YWwpIHtcbiAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi5cbiAgICAgICAgdmFyIHNjciA9IFwidmFyIGlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlSW5wdXQnKTsgXCIgK1xuICAgICAgICBcImlwdC52YWx1ZSA9ICdcIiArIHZhbCArIFwiJztcIiArXG4gICAgICAgIFwiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnXCIgKyB2YWwgKyBcIicpOyB9KTtcIjtcbiAgICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcik7XG4gICAgICB9XG5cbiAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzIwMTMtVzAxJyk7XG4gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0SW5wdXQoJycpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0VxdWFsKCd2YWx1ZSA9Jyk7XG4gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldElucHV0KCcyMDE1LVcwMScpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG4gICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAgICAqL1xuICAnd2Vlayc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ3dlZWsnLCBXRUVLX1JFR0VYUCwgd2Vla1BhcnNlciwgJ3l5eXktV3d3JyksXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFttb250aF1cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIElucHV0IHdpdGggbW9udGggdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0XG4gICAqIHRoZSBIVE1MNSBtb250aCBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAqIG1vbnRoIGZvcm1hdCAoeXl5eS1NTSksIGZvciBleGFtcGxlOiBgMjAwOS0wMWAuXG4gICAqXG4gICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuXG4gICAqIElmIHRoZSBtb2RlbCBpcyBub3Qgc2V0IHRvIHRoZSBmaXJzdCBvZiB0aGUgbW9udGgsIHRoZSBuZXh0IHZpZXcgdG8gbW9kZWwgdXBkYXRlIHdpbGwgc2V0IGl0XG4gICAqIHRvIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguXG4gICAqXG4gICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLlxuICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyBtb250aCBmb3JtYXQgKHl5eXktTU0pLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICogICBhdHRyaWJ1dGUgKGUuZy4gYG1pbj1cInt7bWluTW9udGggfCBkYXRlOid5eXl5LU1NJ319XCJgKS4gTm90ZSB0aGF0IGBtaW5gIHdpbGwgYWxzbyBhZGRcbiAgICogICBuYXRpdmUgSFRNTDUgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gICAqICAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgSVNPIG1vbnRoIGZvcm1hdCAoeXl5eS1NTSkuIFlvdSBjYW4gYWxzbyB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhpc1xuICAgKiAgIGF0dHJpYnV0ZSAoZS5nLiBgbWF4PVwie3ttYXhNb250aCB8IGRhdGU6J3l5eXktTU0nfX1cImApLiBOb3RlIHRoYXQgYG1heGAgd2lsbCBhbHNvIGFkZFxuICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB3ZWVrIHN0cmluZ1xuICAgKiAgIHRoZSBgbmdNaW5gIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWluYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB3ZWVrIHN0cmluZ1xuICAgKiAgIHRoZSBgbmdNYXhgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWF4YCBhdHRyaWJ1dGUuXG5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG9cbiAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2ZcbiAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlclxuICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm1vbnRoLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cIm1vbnRoRXhhbXBsZVwiPlxuICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgPHNjcmlwdD5cbiAgICAgIGFuZ3VsYXIubW9kdWxlKCdtb250aEV4YW1wbGUnLCBbXSlcbiAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAkc2NvcGUuZXhhbXBsZSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZSgyMDEzLCA5LCAxKVxuICAgICAgICAgIH07XG4gICAgICAgIH1dKTtcbiAgICAgPC9zY3JpcHQ+XG4gICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmxcIj5cbiAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0XCI+UGljayBhIG1vbnRoIGluIDIwMTM6PC9sYWJlbD5cbiAgICAgICA8aW5wdXQgaWQ9XCJleGFtcGxlSW5wdXRcIiB0eXBlPVwibW9udGhcIiBuYW1lPVwiaW5wdXRcIiBuZy1tb2RlbD1cImV4YW1wbGUudmFsdWVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwieXl5eS1NTVwiIG1pbj1cIjIwMTMtMDFcIiBtYXg9XCIyMDEzLTEyXCIgcmVxdWlyZWQgLz5cbiAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+XG4gICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5pbnB1dC4kZXJyb3IubW9udGhcIj5cbiAgICAgICAgICAgIE5vdCBhIHZhbGlkIG1vbnRoITwvc3Bhbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcInl5eXktTU1cIn19PC90dD48YnIvPlxuICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz5cbiAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgPC9mb3JtPlxuICAgPC9maWxlPlxuICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LU1NXCInKSk7XG4gICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG5cbiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkge1xuICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLlxuICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgIFwiaXB0LnZhbHVlID0gJ1wiICsgdmFsICsgXCInO1wiICtcbiAgICAgICAgXCJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCdcIiArIHZhbCArIFwiJyk7IH0pO1wiO1xuICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgIH1cblxuICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy0xMCcpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldElucHV0KCcnKTtcbiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMScpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG4gICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gICAqL1xuICAnbW9udGgnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCdtb250aCcsIE1PTlRIX1JFR0VYUCxcbiAgICAgY3JlYXRlRGF0ZVBhcnNlcihNT05USF9SRUdFWFAsIFsneXl5eScsICdNTSddKSxcbiAgICAgJ3l5eXktTU0nKSxcblxuICAvKipcbiAgICogQG5nZG9jIGlucHV0XG4gICAqIEBuYW1lIGlucHV0W251bWJlcl1cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRleHQgaW5wdXQgd2l0aCBudW1iZXIgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIFNldHMgdGhlIGBudW1iZXJgIHZhbGlkYXRpb25cbiAgICogZXJyb3IgaWYgbm90IGEgdmFsaWQgbnVtYmVyLlxuICAgKlxuICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICAgKiBUaGUgbW9kZWwgbXVzdCBhbHdheXMgYmUgb2YgdHlwZSBgbnVtYmVyYCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiBCZSBhd2FyZSB0aGF0IGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBudW1iZXIgaXMgbm90IGVub3VnaC4gU2VlIHRoZSB7QGxpbmsgbmdNb2RlbDpudW1mbXR9XG4gICAqIGVycm9yIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGFuIGV4YW1wbGUgb2YgaG93IHRvIGNvbnZlcnQgeW91ciBtb2RlbCBpZiBuZWNlc3NhcnkuXG4gICAqIDwvZGl2PlxuICAgKlxuICAgKiAjIyBJc3N1ZXMgd2l0aCBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb25cbiAgICpcbiAgICogSW4gYnJvd3NlcnMgdGhhdCBmb2xsb3cgdGhlXG4gICAqIFtIVE1MNSBzcGVjaWZpY2F0aW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI251bWJlci1zdGF0ZS0lMjh0eXBlPW51bWJlciUyOSksXG4gICAqIGBpbnB1dFtudW1iZXJdYCBkb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkIHdpdGgge0BsaW5rIG5nTW9kZWxPcHRpb25zIGBuZ01vZGVsT3B0aW9ucy5hbGxvd0ludmFsaWRgfS5cbiAgICogSWYgYSBub24tbnVtYmVyIGlzIGVudGVyZWQgaW4gdGhlIGlucHV0LCB0aGUgYnJvd3NlciB3aWxsIHJlcG9ydCB0aGUgdmFsdWUgYXMgYW4gZW1wdHkgc3RyaW5nLFxuICAgKiB3aGljaCBtZWFucyB0aGUgdmlldyAvIG1vZGVsIHZhbHVlcyBpbiBgbmdNb2RlbGAgYW5kIHN1YnNlcXVlbnRseSB0aGUgc2NvcGUgdmFsdWVcbiAgICogd2lsbCBhbHNvIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC5cbiAgICogICAgQ2FuIGJlIGludGVycG9sYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLlxuICAgKiAgICBDYW4gYmUgaW50ZXJwb2xhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nTWluIExpa2UgYG1pbmAsIHNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbmdNaW5gLFxuICAgKiAgICBidXQgZG9lcyBub3QgdHJpZ2dlciBIVE1MNSBuYXRpdmUgdmFsaWRhdGlvbi4gVGFrZXMgYW4gZXhwcmVzc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ01heCBMaWtlIGBtYXhgLCBzZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG5nTWF4YCxcbiAgICogICAgYnV0IGRvZXMgbm90IHRyaWdnZXIgSFRNTDUgbmF0aXZlIHZhbGlkYXRpb24uIFRha2VzIGFuIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc3RlcCBTZXRzIHRoZSBgc3RlcGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgZG9lcyBub3QgZml0IHRoZSBgc3RlcGAgY29uc3RyYWludC5cbiAgICogICAgQ2FuIGJlIGludGVycG9sYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1N0ZXAgTGlrZSBgc3RlcGAsIHNldHMgdGhlIGBzdGVwYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBkb2VzIG5vdCBmaXQgdGhlIGBuZ1N0ZXBgIGNvbnN0cmFpbnQsXG4gICAqICAgIGJ1dCBkb2VzIG5vdCB0cmlnZ2VyIEhUTUw1IG5hdGl2ZSB2YWxpZGF0aW9uLiBUYWtlcyBhbiBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZlxuICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW5cbiAgICogICAgbWlubGVuZ3RoLlxuICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuXG4gICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZlxuICAgKiAgICBhbnkgbGVuZ3RoLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nXG4gICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb25cbiAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgJHZpZXdWYWx1ZX1cbiAgICogICAgZG9lcyBub3QgbWF0Y2ggYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QsIHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LlxuICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHBcbiAgICogICAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgXCJhYmNcImAgd2lsbCBiZSBjb252ZXJ0ZWQgdG9cbiAgICogICAgYG5ldyBSZWdFeHAoJ15hYmMkJylgLjxiciAvPlxuICAgKiAgICAqKk5vdGU6KiogQXZvaWQgdXNpbmcgdGhlIGBnYCBmbGFnIG9uIHRoZSBSZWdFeHAsIGFzIGl0IHdpbGwgY2F1c2UgZWFjaCBzdWNjZXNzaXZlIHNlYXJjaCB0b1xuICAgKiAgICBzdGFydCBhdCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc2VhcmNoJ3MgbWF0Y2gsIHRodXMgbm90IHRha2luZyB0aGUgd2hvbGUgaW5wdXQgdmFsdWUgaW50b1xuICAgKiAgICBhY2NvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJudW1iZXItaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwibnVtYmVyRXhhbXBsZVwiPlxuICAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ251bWJlckV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLmV4YW1wbGUgPSB7XG4gICAgICAgICAgICAgICAgIHZhbHVlOiAxMlxuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPk51bWJlcjpcbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIiBtYXg9XCI5OVwiIHJlcXVpcmVkPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+XG4gICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLm51bWJlclwiPlxuICAgICAgICAgICAgICAgTm90IHZhbGlkIG51bWJlciE8L3NwYW4+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWV9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlJykpO1xuICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcbiAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdleGFtcGxlLnZhbHVlJykpO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzEyJyk7XG4gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcnKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcxMjMnKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuICAgKi9cbiAgJ251bWJlcic6IG51bWJlcklucHV0VHlwZSxcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgaW5wdXRcbiAgICogQG5hbWUgaW5wdXRbdXJsXVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGV4dCBpbnB1dCB3aXRoIFVSTCB2YWxpZGF0aW9uLiBTZXRzIHRoZSBgdXJsYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgY29udGVudCBpcyBub3QgYVxuICAgKiB2YWxpZCBVUkwuXG4gICAqXG4gICAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gICAqICoqTm90ZToqKiBgaW5wdXRbdXJsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIHVybHMgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlZ2V4XG4gICAqIHVzZWQgaW4gQ2hyb21pdW0uIElmIHlvdSBuZWVkIHN0cmljdGVyIHZhbGlkYXRpb24sIHlvdSBjYW4gdXNlIGBuZy1wYXR0ZXJuYCBvciBtb2RpZnlcbiAgICogdGhlIGJ1aWx0LWluIHZhbGlkYXRvcnMgKHNlZSB0aGUge0BsaW5rIGd1aWRlL2Zvcm1zIEZvcm1zIGd1aWRlfSlcbiAgICogPC9kaXY+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZlxuICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW5cbiAgICogICAgbWlubGVuZ3RoLlxuICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuXG4gICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZlxuICAgKiAgICBhbnkgbGVuZ3RoLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nXG4gICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb25cbiAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgJHZpZXdWYWx1ZX1cbiAgICogICAgZG9lcyBub3QgbWF0Y2ggYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QsIHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LlxuICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHBcbiAgICogICAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgXCJhYmNcImAgd2lsbCBiZSBjb252ZXJ0ZWQgdG9cbiAgICogICAgYG5ldyBSZWdFeHAoJ15hYmMkJylgLjxiciAvPlxuICAgKiAgICAqKk5vdGU6KiogQXZvaWQgdXNpbmcgdGhlIGBnYCBmbGFnIG9uIHRoZSBSZWdFeHAsIGFzIGl0IHdpbGwgY2F1c2UgZWFjaCBzdWNjZXNzaXZlIHNlYXJjaCB0b1xuICAgKiAgICBzdGFydCBhdCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc2VhcmNoJ3MgbWF0Y2gsIHRodXMgbm90IHRha2luZyB0aGUgd2hvbGUgaW5wdXQgdmFsdWUgaW50b1xuICAgKiAgICBhY2NvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJ1cmwtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwidXJsRXhhbXBsZVwiPlxuICAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3VybEV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLnVybCA9IHtcbiAgICAgICAgICAgICAgICAgdGV4dDogJ2h0dHA6Ly9nb29nbGUuY29tJ1xuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPlVSTDpcbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInVybFwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwidXJsLnRleHRcIiByZXF1aXJlZD5cbiAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci51cmxcIj5cbiAgICAgICAgICAgICAgIE5vdCB2YWxpZCB1cmwhPC9zcGFuPlxuICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgPHR0PnRleHQgPSB7e3VybC50ZXh0fX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IudXJsID0ge3shIW15Rm9ybS4kZXJyb3IudXJsfX08L3R0Pjxici8+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2ZpbGU+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgICB2YXIgdGV4dCA9IGVsZW1lbnQoYnkuYmluZGluZygndXJsLnRleHQnKSk7XG4gICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpO1xuICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VybC50ZXh0JykpO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvQ29udGFpbignaHR0cDovL2dvb2dsZS5jb20nKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbnB1dC5jbGVhcigpO1xuICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJycpO1xuXG4gICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3RleHQgPScpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCB1cmwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7XG4gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnYm94Jyk7XG5cbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuICAgKi9cbiAgJ3VybCc6IHVybElucHV0VHlwZSxcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgaW5wdXRcbiAgICogQG5hbWUgaW5wdXRbZW1haWxdXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUZXh0IGlucHV0IHdpdGggZW1haWwgdmFsaWRhdGlvbi4gU2V0cyB0aGUgYGVtYWlsYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiBub3QgYSB2YWxpZCBlbWFpbFxuICAgKiBhZGRyZXNzLlxuICAgKlxuICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICAgKiAqKk5vdGU6KiogYGlucHV0W2VtYWlsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3NlcyB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgcmVnZXhcbiAgICogdXNlZCBpbiBDaHJvbWl1bS4gSWYgeW91IG5lZWQgc3RyaWN0ZXIgdmFsaWRhdGlvbiAoZS5nLiByZXF1aXJpbmcgYSB0b3AtbGV2ZWwgZG9tYWluKSwgeW91IGNhblxuICAgKiB1c2UgYG5nLXBhdHRlcm5gIG9yIG1vZGlmeSB0aGUgYnVpbHQtaW4gdmFsaWRhdG9ycyAoc2VlIHRoZSB7QGxpbmsgZ3VpZGUvZm9ybXMgRm9ybXMgZ3VpZGV9KVxuICAgKiA8L2Rpdj5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhblxuICAgKiAgICBtaW5sZW5ndGguXG4gICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW5cbiAgICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mXG4gICAqICAgIGFueSBsZW5ndGguXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gcGF0dGVybiBTaW1pbGFyIHRvIGBuZ1BhdHRlcm5gIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmdcbiAgICogICAgdGhhdCBjb250YWlucyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJvZHkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgKiAgICBhcyBpbiB0aGUgbmdQYXR0ZXJuIGRpcmVjdGl2ZS5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIG5nTW9kZWwge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZpZXdWYWx1ZSAkdmlld1ZhbHVlfVxuICAgKiAgICBkb2VzIG5vdCBtYXRjaCBhIFJlZ0V4cCBmb3VuZCBieSBldmFsdWF0aW5nIHRoZSBBbmd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCwgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuXG4gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHN0cmluZywgdGhlbiBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFJlZ0V4cFxuICAgKiAgICBhZnRlciB3cmFwcGluZyBpdCBpbiBgXmAgYW5kIGAkYCBjaGFyYWN0ZXJzLiBGb3IgaW5zdGFuY2UsIGBcImFiY1wiYCB3aWxsIGJlIGNvbnZlcnRlZCB0b1xuICAgKiAgICBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuPGJyIC8+XG4gICAqICAgICoqTm90ZToqKiBBdm9pZCB1c2luZyB0aGUgYGdgIGZsYWcgb24gdGhlIFJlZ0V4cCwgYXMgaXQgd2lsbCBjYXVzZSBlYWNoIHN1Y2Nlc3NpdmUgc2VhcmNoIHRvXG4gICAqICAgIHN0YXJ0IGF0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZWFyY2gncyBtYXRjaCwgdGh1cyBub3QgdGFraW5nIHRoZSB3aG9sZSBpbnB1dCB2YWx1ZSBpbnRvXG4gICAqICAgIGFjY291bnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlclxuICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgICAgPGV4YW1wbGUgbmFtZT1cImVtYWlsLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cImVtYWlsRXhhbXBsZVwiPlxuICAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2VtYWlsRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAgICAkc2NvcGUuZW1haWwgPSB7XG4gICAgICAgICAgICAgICAgIHRleHQ6ICdtZUBleGFtcGxlLmNvbSdcbiAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgfV0pO1xuICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgICA8bGFiZWw+RW1haWw6XG4gICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgbmFtZT1cImlucHV0XCIgbmctbW9kZWw9XCJlbWFpbC50ZXh0XCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5lbWFpbFwiPlxuICAgICAgICAgICAgICAgICBOb3QgdmFsaWQgZW1haWwhPC9zcGFuPlxuICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDx0dD50ZXh0ID0ge3tlbWFpbC50ZXh0fX08L3R0Pjxici8+XG4gICAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPlxuICAgICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLmVtYWlsID0ge3shIW15Rm9ybS4kZXJyb3IuZW1haWx9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICAgdmFyIHRleHQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2VtYWlsLnRleHQnKSk7XG4gICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpO1xuICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ2VtYWlsLnRleHQnKSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdtZUBleGFtcGxlLmNvbScpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7XG4gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7XG4gICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3RleHQgPScpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCBlbWFpbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCd4eHgnKTtcblxuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICA8L2ZpbGU+XG4gICAgICA8L2V4YW1wbGU+XG4gICAqL1xuICAnZW1haWwnOiBlbWFpbElucHV0VHlwZSxcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgaW5wdXRcbiAgICogQG5hbWUgaW5wdXRbcmFkaW9dXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBIVE1MIHJhZGlvIGJ1dHRvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBgbmdNb2RlbGAgZXhwcmVzc2lvbiBzaG91bGQgYmUgc2V0IHdoZW4gc2VsZWN0ZWQuXG4gICAqICAgIE5vdGUgdGhhdCBgdmFsdWVgIG9ubHkgc3VwcG9ydHMgYHN0cmluZ2AgdmFsdWVzLCBpLmUuIHRoZSBzY29wZSBtb2RlbCBuZWVkcyB0byBiZSBhIHN0cmluZyxcbiAgICogICAgdG9vLiBVc2UgYG5nVmFsdWVgIGlmIHlvdSBuZWVkIGNvbXBsZXggbW9kZWxzIChgbnVtYmVyYCwgYG9iamVjdGAsIC4uLikuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ1ZhbHVlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byB3aGljaCBgbmdNb2RlbGAgd2lsbCBiZSBiZSBzZXQgd2hlbiB0aGUgcmFkaW9cbiAgICogICAgaXMgc2VsZWN0ZWQuIFNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIGlmIHlvdSBuZWVkXG4gICAqICAgIGEgbm9uLXN0cmluZyBgbmdNb2RlbGAgKGBib29sZWFuYCwgYGFycmF5YCwgLi4uKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJyYWRpby1pbnB1dC1kaXJlY3RpdmVcIiBtb2R1bGU9XCJyYWRpb0V4YW1wbGVcIj5cbiAgICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdyYWRpb0V4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLmNvbG9yID0ge1xuICAgICAgICAgICAgICAgICBuYW1lOiAnYmx1ZSdcbiAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAkc2NvcGUuc3BlY2lhbFZhbHVlID0ge1xuICAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTIzNDVcIixcbiAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBcImdyZWVuXCJcbiAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgfV0pO1xuICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICA8Zm9ybSBuYW1lPVwibXlGb3JtXCIgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmctbW9kZWw9XCJjb2xvci5uYW1lXCIgdmFsdWU9XCJyZWRcIj5cbiAgICAgICAgICAgICBSZWRcbiAgICAgICAgICAgPC9sYWJlbD48YnIvPlxuICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5nLW1vZGVsPVwiY29sb3IubmFtZVwiIG5nLXZhbHVlPVwic3BlY2lhbFZhbHVlXCI+XG4gICAgICAgICAgICAgR3JlZW5cbiAgICAgICAgICAgPC9sYWJlbD48YnIvPlxuICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5nLW1vZGVsPVwiY29sb3IubmFtZVwiIHZhbHVlPVwiYmx1ZVwiPlxuICAgICAgICAgICAgIEJsdWVcbiAgICAgICAgICAgPC9sYWJlbD48YnIvPlxuICAgICAgICAgICA8dHQ+Y29sb3IgPSB7e2NvbG9yLm5hbWUgfCBqc29ufX08L3R0Pjxici8+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIE5vdGUgdGhhdCBgbmctdmFsdWU9XCJzcGVjaWFsVmFsdWVcImAgc2V0cyByYWRpbyBpdGVtJ3MgdmFsdWUgdG8gYmUgdGhlIHZhbHVlIG9mIGAkc2NvcGUuc3BlY2lhbFZhbHVlYC5cbiAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2Ugc3RhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBpbnB1dHMgPSBlbGVtZW50LmFsbChieS5tb2RlbCgnY29sb3IubmFtZScpKTtcbiAgICAgICAgICAgIHZhciBjb2xvciA9IGVsZW1lbnQoYnkuYmluZGluZygnY29sb3IubmFtZScpKTtcblxuICAgICAgICAgICAgZXhwZWN0KGNvbG9yLmdldFRleHQoKSkudG9Db250YWluKCdibHVlJyk7XG5cbiAgICAgICAgICAgIGlucHV0cy5nZXQoMCkuY2xpY2soKTtcbiAgICAgICAgICAgIGV4cGVjdChjb2xvci5nZXRUZXh0KCkpLnRvQ29udGFpbigncmVkJyk7XG5cbiAgICAgICAgICAgIGlucHV0cy5nZXQoMSkuY2xpY2soKTtcbiAgICAgICAgICAgIGV4cGVjdChjb2xvci5nZXRUZXh0KCkpLnRvQ29udGFpbignZ3JlZW4nKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuICAgKi9cbiAgJ3JhZGlvJzogcmFkaW9JbnB1dFR5cGUsXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFtyYW5nZV1cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE5hdGl2ZSByYW5nZSBpbnB1dCB3aXRoIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBUaGUgbW9kZWwgZm9yIHRoZSByYW5nZSBpbnB1dCBtdXN0IGFsd2F5cyBiZSBhIGBOdW1iZXJgLlxuICAgKlxuICAgKiBJRTkgYW5kIG90aGVyIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIGByYW5nZWAgdHlwZSBmYWxsIGJhY2tcbiAgICogdG8gYSB0ZXh0IGlucHV0IHdpdGhvdXQgYW55IGRlZmF1bHQgdmFsdWVzIGZvciBgbWluYCwgYG1heGAgYW5kIGBzdGVwYC4gTW9kZWwgYmluZGluZyxcbiAgICogdmFsaWRhdGlvbiBhbmQgbnVtYmVyIHBhcnNpbmcgYXJlIG5ldmVydGhlbGVzcyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCByYW5nZSAobGF0ZXN0IENocm9tZSwgU2FmYXJpLCBGaXJlZm94LCBFZGdlKSB0cmVhdCBgaW5wdXRbcmFuZ2VdYFxuICAgKiBpbiBhIHdheSB0aGF0IG5ldmVyIGFsbG93cyB0aGUgaW5wdXQgdG8gaG9sZCBhbiBpbnZhbGlkIHZhbHVlLiBUaGF0IG1lYW5zOlxuICAgKiAtIGFueSBub24tbnVtZXJpY2FsIHZhbHVlIGlzIHNldCB0byBgKG1heCArIG1pbikgLyAyYC5cbiAgICogLSBhbnkgbnVtZXJpY2FsIHZhbHVlIHRoYXQgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG1pbiB2YWwsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBtYXggdmFsXG4gICAqIGlzIHNldCB0byB0aGUgbWluIC8gbWF4IHZhbCByZXNwZWN0aXZlbHkuXG4gICAqIC0gYWRkaXRpb25hbGx5LCB0aGUgY3VycmVudCBgc3RlcGAgaXMgcmVzcGVjdGVkLCBzbyB0aGUgbmVhcmVzdCB2YWx1ZSB0aGF0IHNhdGlzZmllcyBhIHN0ZXBcbiAgICogaXMgdXNlZC5cbiAgICpcbiAgICogU2VlIHRoZSBbSFRNTCBTcGVjIG9uIGlucHV0W3R5cGU9cmFuZ2VdXShodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZm9ybXMuaHRtbCNyYW5nZS1zdGF0ZS0odHlwZT1yYW5nZSkpXG4gICAqIGZvciBtb3JlIGluZm8uXG4gICAqXG4gICAqIFRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgY29uc2VxdWVuY2VzIGZvciBBbmd1bGFyOlxuICAgKlxuICAgKiBTaW5jZSB0aGUgZWxlbWVudCB2YWx1ZSBzaG91bGQgYWx3YXlzIHJlZmxlY3QgdGhlIGN1cnJlbnQgbW9kZWwgdmFsdWUsIGEgcmFuZ2UgaW5wdXRcbiAgICogd2lsbCBzZXQgdGhlIGJvdW5kIG5nTW9kZWwgZXhwcmVzc2lvbiB0byB0aGUgdmFsdWUgdGhhdCB0aGUgYnJvd3NlciBoYXMgc2V0IGZvciB0aGVcbiAgICogaW5wdXQgZWxlbWVudC4gRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcgaW5wdXQgYDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBuZy1tb2RlbD1cIm1vZGVsLnZhbHVlXCI+YCxcbiAgICogaWYgdGhlIGFwcGxpY2F0aW9uIHNldHMgYG1vZGVsLnZhbHVlID0gbnVsbGAsIHRoZSBicm93c2VyIHdpbGwgc2V0IHRoZSBpbnB1dCB0byBgJzUwJ2AuXG4gICAqIEFuZ3VsYXIgd2lsbCB0aGVuIHNldCB0aGUgbW9kZWwgdG8gYDUwYCwgdG8gcHJldmVudCBpbnB1dCBhbmQgbW9kZWwgdmFsdWUgYmVpbmcgb3V0IG9mIHN5bmMuXG4gICAqXG4gICAqIFRoYXQgbWVhbnMgdGhlIG1vZGVsIGZvciByYW5nZSB3aWxsIGltbWVkaWF0ZWx5IGJlIHNldCB0byBgNTBgIGFmdGVyIGBuZ01vZGVsYCBoYXMgYmVlblxuICAgKiBpbml0aWFsaXplZC4gSXQgYWxzbyBtZWFucyBhIHJhbmdlIGlucHV0IGNhbiBuZXZlciBoYXZlIHRoZSByZXF1aXJlZCBlcnJvci5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBvbmx5IGFmZmVjdCBjaGFuZ2VzIHRvIHRoZSBtb2RlbCB2YWx1ZSwgYnV0IGFsc28gdG8gdGhlIHZhbHVlcyBvZiB0aGUgYG1pbmAsXG4gICAqIGBtYXhgLCBhbmQgYHN0ZXBgIGF0dHJpYnV0ZXMuIFdoZW4gdGhlc2UgY2hhbmdlIGluIGEgd2F5IHRoYXQgd2lsbCBjYXVzZSB0aGUgYnJvd3NlciB0byBtb2RpZnlcbiAgICogdGhlIGlucHV0IHZhbHVlLCBBbmd1bGFyIHdpbGwgYWxzbyB1cGRhdGUgdGhlIG1vZGVsIHZhbHVlLlxuICAgKlxuICAgKiBBdXRvbWF0aWMgdmFsdWUgYWRqdXN0bWVudCBhbHNvIG1lYW5zIHRoYXQgYSByYW5nZSBpbnB1dCBlbGVtZW50IGNhbiBuZXZlciBoYXZlIHRoZSBgcmVxdWlyZWRgLFxuICAgKiBgbWluYCwgb3IgYG1heGAgZXJyb3JzLlxuICAgKlxuICAgKiBIb3dldmVyLCBgc3RlcGAgaXMgY3VycmVudGx5IG9ubHkgZnVsbHkgaW1wbGVtZW50ZWQgYnkgRmlyZWZveC4gT3RoZXIgYnJvd3NlcnMgaGF2ZSBwcm9ibGVtc1xuICAgKiB3aGVuIHRoZSBzdGVwIHZhbHVlIGNoYW5nZXMgZHluYW1pY2FsbHkgLSB0aGV5IGRvIG5vdCBhZGp1c3QgdGhlIGVsZW1lbnQgdmFsdWUgY29ycmVjdGx5LCBidXRcbiAgICogaW5zdGVhZCBtYXkgc2V0IHRoZSBgc3RlcE1pc21hdGNoYCBlcnJvci4gSWYgdGhhdCdzIHRoZSBjYXNlLCB0aGUgQW5ndWxhciB3aWxsIHNldCB0aGUgYHN0ZXBgXG4gICAqIGVycm9yIG9uIHRoZSBpbnB1dCwgYW5kIHNldCB0aGUgbW9kZWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBgaW5wdXRbcmFuZ2VdYCBpcyBub3QgY29tcGF0aWJsZSB3aXRoYG5nTWF4YCwgYG5nTWluYCwgYW5kIGBuZ1N0ZXBgLCBiZWNhdXNlIHRoZXkgZG9cbiAgICogbm90IHNldCB0aGUgYG1pbmAgYW5kIGBtYXhgIGF0dHJpYnV0ZXMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGJyb3dzZXIgd29uJ3QgYXV0b21hdGljYWxseSBhZGp1c3RcbiAgICogdGhlIGlucHV0IHZhbHVlIGJhc2VkIG9uIHRoZWlyIHZhbHVlcywgYW5kIHdpbGwgYWx3YXlzIGFzc3VtZSBtaW4gPSAwLCBtYXggPSAxMDAsIGFuZCBzdGVwID0gMS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9ICBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXJcbiAgICogICAgICAgICAgICAgICAgICB0aGFuIGBtaW5gLiBDYW4gYmUgaW50ZXJwb2xhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWF4YC5cbiAgICogICAgICAgICAgICAgICAgICBDYW4gYmUgaW50ZXJwb2xhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHN0ZXAgU2V0cyB0aGUgYHN0ZXBgIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHZhbHVlIGVudGVyZWQgbWF0Y2hlcyB0aGUgYHN0ZXBgXG4gICAqICAgICAgICAgICAgICAgICAgQ2FuIGJlIGludGVycG9sYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgbmdNb2RlbCB2YWx1ZSBjaGFuZ2VzIGR1ZVxuICAgKiAgICAgICAgICAgICAgICAgIHRvIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICogQHBhcmFtIHtleHByZXNzaW9uPX0gbmdDaGVja2VkIElmIHRoZSBleHByZXNzaW9uIGlzIHRydXRoeSwgdGhlbiB0aGUgYGNoZWNrZWRgIGF0dHJpYnV0ZSB3aWxsIGJlIHNldCBvbiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gKipOb3RlKiogOiBgbmdDaGVja2VkYCBzaG91bGQgbm90IGJlIHVzZWQgYWxvbmdzaWRlIGBuZ01vZGVsYC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgQ2hlY2tvdXQge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NoZWNrZWQgbmdDaGVja2VkfSBmb3IgdXNhZ2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgICA8ZXhhbXBsZSBuYW1lPVwicmFuZ2UtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwicmFuZ2VFeGFtcGxlXCI+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdyYW5nZUV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUudmFsdWUgPSA3NTtcbiAgICAgICAgICAgICAgICAkc2NvcGUubWluID0gMTA7XG4gICAgICAgICAgICAgICAgJHNjb3BlLm1heCA9IDkwO1xuICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiIG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuXG4gICAgICAgICAgICBNb2RlbCBhcyByYW5nZTogPGlucHV0IHR5cGU9XCJyYW5nZVwiIG5hbWU9XCJyYW5nZVwiIG5nLW1vZGVsPVwidmFsdWVcIiBtaW49XCJ7e21pbn19XCIgIG1heD1cInt7bWF4fX1cIj5cbiAgICAgICAgICAgIDxocj5cbiAgICAgICAgICAgIE1vZGVsIGFzIG51bWJlcjogPGlucHV0IHR5cGU9XCJudW1iZXJcIiBuZy1tb2RlbD1cInZhbHVlXCI+PGJyPlxuICAgICAgICAgICAgTWluOiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWluXCI+PGJyPlxuICAgICAgICAgICAgTWF4OiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWF4XCI+PGJyPlxuICAgICAgICAgICAgdmFsdWUgPSA8Y29kZT57e3ZhbHVlfX08L2NvZGU+PGJyLz5cbiAgICAgICAgICAgIG15Rm9ybS5yYW5nZS4kdmFsaWQgPSA8Y29kZT57e215Rm9ybS5yYW5nZS4kdmFsaWR9fTwvY29kZT48YnIvPlxuICAgICAgICAgICAgbXlGb3JtLnJhbmdlLiRlcnJvciA9IDxjb2RlPnt7bXlGb3JtLnJhbmdlLiRlcnJvcn19PC9jb2RlPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuXG4gICAqICMjIFJhbmdlIElucHV0IHdpdGggbmdNaW4gJiBuZ01heCBhdHRyaWJ1dGVzXG5cbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJyYW5nZS1pbnB1dC1kaXJlY3RpdmUtbmdcIiBtb2R1bGU9XCJyYW5nZUV4YW1wbGVcIj5cbiAgICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3JhbmdlRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgICRzY29wZS52YWx1ZSA9IDc1O1xuICAgICAgICAgICAgICAgICRzY29wZS5taW4gPSAxMDtcbiAgICAgICAgICAgICAgICAkc2NvcGUubWF4ID0gOTA7XG4gICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgICA8Zm9ybSBuYW1lPVwibXlGb3JtXCIgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICAgICBNb2RlbCBhcyByYW5nZTogPGlucHV0IHR5cGU9XCJyYW5nZVwiIG5hbWU9XCJyYW5nZVwiIG5nLW1vZGVsPVwidmFsdWVcIiBuZy1taW49XCJtaW5cIiBuZy1tYXg9XCJtYXhcIj5cbiAgICAgICAgICAgIDxocj5cbiAgICAgICAgICAgIE1vZGVsIGFzIG51bWJlcjogPGlucHV0IHR5cGU9XCJudW1iZXJcIiBuZy1tb2RlbD1cInZhbHVlXCI+PGJyPlxuICAgICAgICAgICAgTWluOiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWluXCI+PGJyPlxuICAgICAgICAgICAgTWF4OiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWF4XCI+PGJyPlxuICAgICAgICAgICAgdmFsdWUgPSA8Y29kZT57e3ZhbHVlfX08L2NvZGU+PGJyLz5cbiAgICAgICAgICAgIG15Rm9ybS5yYW5nZS4kdmFsaWQgPSA8Y29kZT57e215Rm9ybS5yYW5nZS4kdmFsaWR9fTwvY29kZT48YnIvPlxuICAgICAgICAgICAgbXlGb3JtLnJhbmdlLiRlcnJvciA9IDxjb2RlPnt7bXlGb3JtLnJhbmdlLiRlcnJvcn19PC9jb2RlPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuXG4gICAqL1xuICAncmFuZ2UnOiByYW5nZUlucHV0VHlwZSxcblxuICAvKipcbiAgICogQG5nZG9jIGlucHV0XG4gICAqIEBuYW1lIGlucHV0W2NoZWNrYm94XVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSFRNTCBjaGVja2JveC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAqIEBwYXJhbSB7ZXhwcmVzc2lvbj19IG5nVHJ1ZVZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgc2V0IHdoZW4gc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSB7ZXhwcmVzc2lvbj19IG5nRmFsc2VWYWx1ZSBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHNldCB3aGVuIG5vdCBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgICA8ZXhhbXBsZSBuYW1lPVwiY2hlY2tib3gtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwiY2hlY2tib3hFeGFtcGxlXCI+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnY2hlY2tib3hFeGFtcGxlJywgW10pXG4gICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgICRzY29wZS5jaGVja2JveE1vZGVsID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlMSA6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWUyIDogJ1lFUydcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPlZhbHVlMTpcbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjaGVja2JveE1vZGVsLnZhbHVlMVwiPlxuICAgICAgICAgICA8L2xhYmVsPjxici8+XG4gICAgICAgICAgIDxsYWJlbD5WYWx1ZTI6XG4gICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwiY2hlY2tib3hNb2RlbC52YWx1ZTJcIlxuICAgICAgICAgICAgICAgICAgICBuZy10cnVlLXZhbHVlPVwiJ1lFUydcIiBuZy1mYWxzZS12YWx1ZT1cIidOTydcIj5cbiAgICAgICAgICAgIDwvbGFiZWw+PGJyLz5cbiAgICAgICAgICAgPHR0PnZhbHVlMSA9IHt7Y2hlY2tib3hNb2RlbC52YWx1ZTF9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0PnZhbHVlMiA9IHt7Y2hlY2tib3hNb2RlbC52YWx1ZTJ9fTwvdHQ+PGJyLz5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZmlsZT5cbiAgICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHN0YXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUxID0gZWxlbWVudChieS5iaW5kaW5nKCdjaGVja2JveE1vZGVsLnZhbHVlMScpKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZTIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2NoZWNrYm94TW9kZWwudmFsdWUyJykpO1xuXG4gICAgICAgICAgICBleHBlY3QodmFsdWUxLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgICBleHBlY3QodmFsdWUyLmdldFRleHQoKSkudG9Db250YWluKCdZRVMnKTtcblxuICAgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tib3hNb2RlbC52YWx1ZTEnKSkuY2xpY2soKTtcbiAgICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2NoZWNrYm94TW9kZWwudmFsdWUyJykpLmNsaWNrKCk7XG5cbiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZTEuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgICBleHBlY3QodmFsdWUyLmdldFRleHQoKSkudG9Db250YWluKCdOTycpO1xuICAgICAgICAgIH0pO1xuICAgICAgICA8L2ZpbGU+XG4gICAgICA8L2V4YW1wbGU+XG4gICAqL1xuICAnY2hlY2tib3gnOiBjaGVja2JveElucHV0VHlwZSxcblxuICAnaGlkZGVuJzogbm9vcCxcbiAgJ2J1dHRvbic6IG5vb3AsXG4gICdzdWJtaXQnOiBub29wLFxuICAncmVzZXQnOiBub29wLFxuICAnZmlsZSc6IG5vb3Bcbn07XG5cbmZ1bmN0aW9uIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpIHtcbiAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdGV4dElucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKSB7XG4gIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7XG4gIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpO1xufVxuXG5mdW5jdGlvbiBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgdmFyIHR5cGUgPSBsb3dlcmNhc2UoZWxlbWVudFswXS50eXBlKTtcblxuICAvLyBJbiBjb21wb3NpdGlvbiBtb2RlLCB1c2VycyBhcmUgc3RpbGwgaW5wdXR0aW5nIGludGVybWVkaWF0ZSB0ZXh0IGJ1ZmZlcixcbiAgLy8gaG9sZCB0aGUgbGlzdGVuZXIgdW50aWwgY29tcG9zaXRpb24gaXMgZG9uZS5cbiAgLy8gTW9yZSBhYm91dCBjb21wb3NpdGlvbiBldmVudHM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Db21wb3NpdGlvbkV2ZW50XG4gIGlmICghJHNuaWZmZXIuYW5kcm9pZCkge1xuICAgIHZhciBjb21wb3NpbmcgPSBmYWxzZTtcblxuICAgIGVsZW1lbnQub24oJ2NvbXBvc2l0aW9uc3RhcnQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbXBvc2luZyA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBlbGVtZW50Lm9uKCdjb21wb3NpdGlvbmVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQ7XG5cbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgJGJyb3dzZXIuZGVmZXIuY2FuY2VsKHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIGlmIChjb21wb3NpbmcpIHJldHVybjtcbiAgICB2YXIgdmFsdWUgPSBlbGVtZW50LnZhbCgpLFxuICAgICAgICBldmVudCA9IGV2ICYmIGV2LnR5cGU7XG5cbiAgICAvLyBCeSBkZWZhdWx0IHdlIHdpbGwgdHJpbSB0aGUgdmFsdWVcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlIG5nLXRyaW0gZXhpc3RzIHdlIHdpbGwgYXZvaWQgdHJpbW1pbmdcbiAgICAvLyBJZiBpbnB1dCB0eXBlIGlzICdwYXNzd29yZCcsIHRoZSB2YWx1ZSBpcyBuZXZlciB0cmltbWVkXG4gICAgaWYgKHR5cGUgIT09ICdwYXNzd29yZCcgJiYgKCFhdHRyLm5nVHJpbSB8fCBhdHRyLm5nVHJpbSAhPT0gJ2ZhbHNlJykpIHtcbiAgICAgIHZhbHVlID0gdHJpbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBjb250cm9sIGlzIHN1ZmZlcmluZyBmcm9tIGJhZCBpbnB1dCAoZHVlIHRvIG5hdGl2ZSB2YWxpZGF0b3JzKSwgYnJvd3NlcnMgZGlzY2FyZCBpdHNcbiAgICAvLyB2YWx1ZSwgc28gaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZXZhbGlkYXRlIChieSBjYWxsaW5nICRzZXRWaWV3VmFsdWUgYWdhaW4pIGV2ZW4gaWYgdGhlXG4gICAgLy8gY29udHJvbCdzIHZhbHVlIGlzIHRoZSBzYW1lIGVtcHR5IHZhbHVlIHR3aWNlIGluIGEgcm93LlxuICAgIGlmIChjdHJsLiR2aWV3VmFsdWUgIT09IHZhbHVlIHx8ICh2YWx1ZSA9PT0gJycgJiYgY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpKSB7XG4gICAgICBjdHJsLiRzZXRWaWV3VmFsdWUodmFsdWUsIGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaWYgdGhlIGJyb3dzZXIgZG9lcyBzdXBwb3J0IFwiaW5wdXRcIiBldmVudCwgd2UgYXJlIGZpbmUgLSBleGNlcHQgb24gSUU5IHdoaWNoIGRvZXNuJ3QgZmlyZSB0aGVcbiAgLy8gaW5wdXQgZXZlbnQgb24gYmFja3NwYWNlLCBkZWxldGUgb3IgY3V0XG4gIGlmICgkc25pZmZlci5oYXNFdmVudCgnaW5wdXQnKSkge1xuICAgIGVsZW1lbnQub24oJ2lucHV0JywgbGlzdGVuZXIpO1xuICB9IGVsc2Uge1xuICAgIHZhciBkZWZlckxpc3RlbmVyID0gZnVuY3Rpb24oZXYsIGlucHV0LCBvcmlnVmFsdWUpIHtcbiAgICAgIGlmICghdGltZW91dCkge1xuICAgICAgICB0aW1lb3V0ID0gJGJyb3dzZXIuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC52YWx1ZSAhPT0gb3JpZ1ZhbHVlKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihldik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZWxlbWVudC5vbigna2V5ZG93bicsIC8qKiBAdGhpcyAqLyBmdW5jdGlvbihldmVudCkge1xuICAgICAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGU7XG5cbiAgICAgIC8vIGlnbm9yZVxuICAgICAgLy8gICAgY29tbWFuZCAgICAgICAgICAgIG1vZGlmaWVycyAgICAgICAgICAgICAgICAgICBhcnJvd3NcbiAgICAgIGlmIChrZXkgPT09IDkxIHx8ICgxNSA8IGtleSAmJiBrZXkgPCAxOSkgfHwgKDM3IDw9IGtleSAmJiBrZXkgPD0gNDApKSByZXR1cm47XG5cbiAgICAgIGRlZmVyTGlzdGVuZXIoZXZlbnQsIHRoaXMsIHRoaXMudmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gaWYgdXNlciBtb2RpZmllcyBpbnB1dCB2YWx1ZSB1c2luZyBjb250ZXh0IG1lbnUgaW4gSUUsIHdlIG5lZWQgXCJwYXN0ZVwiIGFuZCBcImN1dFwiIGV2ZW50cyB0byBjYXRjaCBpdFxuICAgIGlmICgkc25pZmZlci5oYXNFdmVudCgncGFzdGUnKSkge1xuICAgICAgZWxlbWVudC5vbigncGFzdGUgY3V0JywgZGVmZXJMaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdXNlciBwYXN0ZSBpbnRvIGlucHV0IHVzaW5nIG1vdXNlIG9uIG9sZGVyIGJyb3dzZXJcbiAgLy8gb3IgZm9ybSBhdXRvY29tcGxldGUgb24gbmV3ZXIgYnJvd3Nlciwgd2UgbmVlZCBcImNoYW5nZVwiIGV2ZW50IHRvIGNhdGNoIGl0XG4gIGVsZW1lbnQub24oJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAvLyBTb21lIG5hdGl2ZSBpbnB1dCB0eXBlcyAoZGF0ZS1mYW1pbHkpIGhhdmUgdGhlIGFiaWxpdHkgdG8gY2hhbmdlIHZhbGlkaXR5IHdpdGhvdXRcbiAgLy8gZmlyaW5nIGFueSBpbnB1dC9jaGFuZ2UgZXZlbnRzLlxuICAvLyBGb3IgdGhlc2UgZXZlbnQgdHlwZXMsIHdoZW4gbmF0aXZlIHZhbGlkYXRvcnMgYXJlIHByZXNlbnQgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSB0eXBlLFxuICAvLyBjaGVjayBmb3IgdmFsaWRpdHkgY2hhbmdlcyBvbiB2YXJpb3VzIERPTSBldmVudHMuXG4gIGlmIChQQVJUSUFMX1ZBTElEQVRJT05fVFlQRVNbdHlwZV0gJiYgY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMgJiYgdHlwZSA9PT0gYXR0ci50eXBlKSB7XG4gICAgZWxlbWVudC5vbihQQVJUSUFMX1ZBTElEQVRJT05fRVZFTlRTLCAvKiogQHRoaXMgKi8gZnVuY3Rpb24oZXYpIHtcbiAgICAgIGlmICghdGltZW91dCkge1xuICAgICAgICB2YXIgdmFsaWRpdHkgPSB0aGlzW1ZBTElESVRZX1NUQVRFX1BST1BFUlRZXTtcbiAgICAgICAgdmFyIG9yaWdCYWRJbnB1dCA9IHZhbGlkaXR5LmJhZElucHV0O1xuICAgICAgICB2YXIgb3JpZ1R5cGVNaXNtYXRjaCA9IHZhbGlkaXR5LnR5cGVNaXNtYXRjaDtcbiAgICAgICAgdGltZW91dCA9ICRicm93c2VyLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIGlmICh2YWxpZGl0eS5iYWRJbnB1dCAhPT0gb3JpZ0JhZElucHV0IHx8IHZhbGlkaXR5LnR5cGVNaXNtYXRjaCAhPT0gb3JpZ1R5cGVNaXNtYXRjaCkge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBGaXJlZm94IHZhbGlkYXRpb24gIzEyMTAyLlxuICAgIHZhciB2YWx1ZSA9IGN0cmwuJGlzRW1wdHkoY3RybC4kdmlld1ZhbHVlKSA/ICcnIDogY3RybC4kdmlld1ZhbHVlO1xuICAgIGlmIChlbGVtZW50LnZhbCgpICE9PSB2YWx1ZSkge1xuICAgICAgZWxlbWVudC52YWwodmFsdWUpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gd2Vla1BhcnNlcihpc29XZWVrLCBleGlzdGluZ0RhdGUpIHtcbiAgaWYgKGlzRGF0ZShpc29XZWVrKSkge1xuICAgIHJldHVybiBpc29XZWVrO1xuICB9XG5cbiAgaWYgKGlzU3RyaW5nKGlzb1dlZWspKSB7XG4gICAgV0VFS19SRUdFWFAubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgcGFydHMgPSBXRUVLX1JFR0VYUC5leGVjKGlzb1dlZWspO1xuICAgIGlmIChwYXJ0cykge1xuICAgICAgdmFyIHllYXIgPSArcGFydHNbMV0sXG4gICAgICAgICAgd2VlayA9ICtwYXJ0c1syXSxcbiAgICAgICAgICBob3VycyA9IDAsXG4gICAgICAgICAgbWludXRlcyA9IDAsXG4gICAgICAgICAgc2Vjb25kcyA9IDAsXG4gICAgICAgICAgbWlsbGlzZWNvbmRzID0gMCxcbiAgICAgICAgICBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSxcbiAgICAgICAgICBhZGREYXlzID0gKHdlZWsgLSAxKSAqIDc7XG5cbiAgICAgIGlmIChleGlzdGluZ0RhdGUpIHtcbiAgICAgICAgaG91cnMgPSBleGlzdGluZ0RhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgbWludXRlcyA9IGV4aXN0aW5nRGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICBtaWxsaXNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCBmaXJzdFRodXJzLmdldERhdGUoKSArIGFkZERheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBOYU47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGVQYXJzZXIocmVnZXhwLCBtYXBwaW5nKSB7XG4gIHJldHVybiBmdW5jdGlvbihpc28sIGRhdGUpIHtcbiAgICB2YXIgcGFydHMsIG1hcDtcblxuICAgIGlmIChpc0RhdGUoaXNvKSkge1xuICAgICAgcmV0dXJuIGlzbztcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoaXNvKSkge1xuICAgICAgLy8gV2hlbiBhIGRhdGUgaXMgSlNPTidpZmllZCB0byB3cmFwcyBpdHNlbGYgaW5zaWRlIG9mIGFuIGV4dHJhXG4gICAgICAvLyBzZXQgb2YgZG91YmxlIHF1b3Rlcy4gVGhpcyBtYWtlcyB0aGUgZGF0ZSBwYXJzaW5nIGNvZGUgdW5hYmxlXG4gICAgICAvLyB0byBtYXRjaCB0aGUgZGF0ZSBzdHJpbmcgYW5kIHBhcnNlIGl0IGFzIGEgZGF0ZS5cbiAgICAgIGlmIChpc28uY2hhckF0KDApID09PSAnXCInICYmIGlzby5jaGFyQXQoaXNvLmxlbmd0aCAtIDEpID09PSAnXCInKSB7XG4gICAgICAgIGlzbyA9IGlzby5zdWJzdHJpbmcoMSwgaXNvLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKElTT19EQVRFX1JFR0VYUC50ZXN0KGlzbykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGlzbyk7XG4gICAgICB9XG4gICAgICByZWdleHAubGFzdEluZGV4ID0gMDtcbiAgICAgIHBhcnRzID0gcmVnZXhwLmV4ZWMoaXNvKTtcblxuICAgICAgaWYgKHBhcnRzKSB7XG4gICAgICAgIHBhcnRzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgbWFwID0ge1xuICAgICAgICAgICAgeXl5eTogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgTU06IGRhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgICAgICBkZDogZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICBISDogZGF0ZS5nZXRIb3VycygpLFxuICAgICAgICAgICAgbW06IGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgc3M6IGRhdGUuZ2V0U2Vjb25kcygpLFxuICAgICAgICAgICAgc3NzOiBkYXRlLmdldE1pbGxpc2Vjb25kcygpIC8gMTAwMFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFwID0geyB5eXl5OiAxOTcwLCBNTTogMSwgZGQ6IDEsIEhIOiAwLCBtbTogMCwgc3M6IDAsIHNzczogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaChwYXJ0cywgZnVuY3Rpb24ocGFydCwgaW5kZXgpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPCBtYXBwaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgbWFwW21hcHBpbmdbaW5kZXhdXSA9ICtwYXJ0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXAueXl5eSwgbWFwLk1NIC0gMSwgbWFwLmRkLCBtYXAuSEgsIG1hcC5tbSwgbWFwLnNzIHx8IDAsIG1hcC5zc3MgKiAxMDAwIHx8IDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBOYU47XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGVJbnB1dFR5cGUodHlwZSwgcmVnZXhwLCBwYXJzZURhdGUsIGZvcm1hdCkge1xuICByZXR1cm4gZnVuY3Rpb24gZHluYW1pY0RhdGVJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3NlciwgJGZpbHRlcikge1xuICAgIGJhZElucHV0Q2hlY2tlcihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCk7XG4gICAgYmFzZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKTtcbiAgICB2YXIgdGltZXpvbmUgPSBjdHJsICYmIGN0cmwuJG9wdGlvbnMuZ2V0T3B0aW9uKCd0aW1lem9uZScpO1xuICAgIHZhciBwcmV2aW91c0RhdGU7XG5cbiAgICBjdHJsLiQkcGFyc2VyTmFtZSA9IHR5cGU7XG4gICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAoY3RybC4kaXNFbXB0eSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHJlZ2V4cC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAvLyBOb3RlOiBXZSBjYW5ub3QgcmVhZCBjdHJsLiRtb2RlbFZhbHVlLCBhcyB0aGVyZSBtaWdodCBiZSBhIGRpZmZlcmVudFxuICAgICAgICAvLyBwYXJzZXIvZm9ybWF0dGVyIGluIHRoZSBwcm9jZXNzaW5nIGNoYWluIHNvIHRoYXQgdGhlIG1vZGVsXG4gICAgICAgIC8vIGNvbnRhaW5zIHNvbWUgZGlmZmVyZW50IGRhdGEgZm9ybWF0IVxuICAgICAgICB2YXIgcGFyc2VkRGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgcHJldmlvdXNEYXRlKTtcbiAgICAgICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAgICAgcGFyc2VkRGF0ZSA9IGNvbnZlcnRUaW1lem9uZVRvTG9jYWwocGFyc2VkRGF0ZSwgdGltZXpvbmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWREYXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIGN0cmwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlICYmICFpc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5nTW9kZWxNaW5FcnIoJ2RhdGVmbXQnLCAnRXhwZWN0ZWQgYHswfWAgdG8gYmUgYSBkYXRlJywgdmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHByZXZpb3VzRGF0ZSAmJiB0aW1lem9uZSkge1xuICAgICAgICAgIHByZXZpb3VzRGF0ZSA9IGNvbnZlcnRUaW1lem9uZVRvTG9jYWwocHJldmlvdXNEYXRlLCB0aW1lem9uZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICRmaWx0ZXIoJ2RhdGUnKSh2YWx1ZSwgZm9ybWF0LCB0aW1lem9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaXNEZWZpbmVkKGF0dHIubWluKSB8fCBhdHRyLm5nTWluKSB7XG4gICAgICB2YXIgbWluVmFsO1xuICAgICAgY3RybC4kdmFsaWRhdG9ycy5taW4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gIWlzVmFsaWREYXRlKHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHBhcnNlRGF0ZSh2YWx1ZSkgPj0gbWluVmFsO1xuICAgICAgfTtcbiAgICAgIGF0dHIuJG9ic2VydmUoJ21pbicsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICBtaW5WYWwgPSBwYXJzZU9ic2VydmVkRGF0ZVZhbHVlKHZhbCk7XG4gICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNEZWZpbmVkKGF0dHIubWF4KSB8fCBhdHRyLm5nTWF4KSB7XG4gICAgICB2YXIgbWF4VmFsO1xuICAgICAgY3RybC4kdmFsaWRhdG9ycy5tYXggPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gIWlzVmFsaWREYXRlKHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtYXhWYWwpIHx8IHBhcnNlRGF0ZSh2YWx1ZSkgPD0gbWF4VmFsO1xuICAgICAgfTtcbiAgICAgIGF0dHIuJG9ic2VydmUoJ21heCcsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICBtYXhWYWwgPSBwYXJzZU9ic2VydmVkRGF0ZVZhbHVlKHZhbCk7XG4gICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkge1xuICAgICAgLy8gSW52YWxpZCBEYXRlOiBnZXRUaW1lKCkgcmV0dXJucyBOYU5cbiAgICAgIHJldHVybiB2YWx1ZSAmJiAhKHZhbHVlLmdldFRpbWUgJiYgdmFsdWUuZ2V0VGltZSgpICE9PSB2YWx1ZS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlT2JzZXJ2ZWREYXRlVmFsdWUodmFsKSB7XG4gICAgICByZXR1cm4gaXNEZWZpbmVkKHZhbCkgJiYgIWlzRGF0ZSh2YWwpID8gcGFyc2VEYXRlKHZhbCkgfHwgdW5kZWZpbmVkIDogdmFsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7XG4gIHZhciBub2RlID0gZWxlbWVudFswXTtcbiAgdmFyIG5hdGl2ZVZhbGlkYXRpb24gPSBjdHJsLiQkaGFzTmF0aXZlVmFsaWRhdG9ycyA9IGlzT2JqZWN0KG5vZGUudmFsaWRpdHkpO1xuICBpZiAobmF0aXZlVmFsaWRhdGlvbikge1xuICAgIGN0cmwuJHBhcnNlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIHZhbGlkaXR5ID0gZWxlbWVudC5wcm9wKFZBTElESVRZX1NUQVRFX1BST1BFUlRZKSB8fCB7fTtcbiAgICAgIHJldHVybiB2YWxpZGl0eS5iYWRJbnB1dCB8fCB2YWxpZGl0eS50eXBlTWlzbWF0Y2ggPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBudW1iZXJGb3JtYXR0ZXJQYXJzZXIoY3RybCkge1xuICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdudW1iZXInO1xuICBjdHJsLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoY3RybC4kaXNFbXB0eSh2YWx1ZSkpICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKE5VTUJFUl9SRUdFWFAudGVzdCh2YWx1ZSkpIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9KTtcblxuICBjdHJsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoIWN0cmwuJGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZ01vZGVsTWluRXJyKCdudW1mbXQnLCAnRXhwZWN0ZWQgYHswfWAgdG8gYmUgYSBudW1iZXInLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyQXR0clZhbCh2YWwpIHtcbiAgaWYgKGlzRGVmaW5lZCh2YWwpICYmICFpc051bWJlcih2YWwpKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpO1xuICB9XG4gIHJldHVybiAhaXNOdW1iZXJOYU4odmFsKSA/IHZhbCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXJJbnRlZ2VyKG51bSkge1xuICAvLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDYzNjUzNi9ob3ctdG8tY2hlY2staWYtYS12YXJpYWJsZS1pcy1hbi1pbnRlZ2VyLWluLWphdmFzY3JpcHQjMTQ3OTQwNjZcbiAgLy8gKG1pbnVzIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG51bWAgaXMgYSBudW1iZXIpXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuIChudW0gfCAwKSA9PT0gbnVtO1xufVxuXG5mdW5jdGlvbiBjb3VudERlY2ltYWxzKG51bSkge1xuICB2YXIgbnVtU3RyaW5nID0gbnVtLnRvU3RyaW5nKCk7XG4gIHZhciBkZWNpbWFsU3ltYm9sSW5kZXggPSBudW1TdHJpbmcuaW5kZXhPZignLicpO1xuXG4gIGlmIChkZWNpbWFsU3ltYm9sSW5kZXggPT09IC0xKSB7XG4gICAgaWYgKC0xIDwgbnVtICYmIG51bSA8IDEpIHtcbiAgICAgIC8vIEl0IG1heSBiZSBpbiB0aGUgZXhwb25lbnRpYWwgbm90YXRpb24gZm9ybWF0IChgMWUtWGApXG4gICAgICB2YXIgbWF0Y2ggPSAvZS0oXFxkKykkLy5leGVjKG51bVN0cmluZyk7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBudW1TdHJpbmcubGVuZ3RoIC0gZGVjaW1hbFN5bWJvbEluZGV4IC0gMTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEZvclN0ZXAodmlld1ZhbHVlLCBzdGVwQmFzZSwgc3RlcCkge1xuICAvLyBBdCB0aGlzIHBvaW50IGBzdGVwQmFzZWAgYW5kIGBzdGVwYCBhcmUgZXhwZWN0ZWQgdG8gYmUgbm9uLU5hTiB2YWx1ZXNcbiAgLy8gYW5kIGB2aWV3VmFsdWVgIGlzIGV4cGVjdGVkIHRvIGJlIGEgdmFsaWQgc3RyaW5naWZpZWQgbnVtYmVyLlxuICB2YXIgdmFsdWUgPSBOdW1iZXIodmlld1ZhbHVlKTtcblxuICAvLyBEdWUgdG8gbGltaXRhdGlvbnMgaW4gRmxvYXRpbmcgUG9pbnQgQXJpdGhtZXRpYyAoZS5nLiBgMC4zIC0gMC4yICE9PSAwLjFgIG9yXG4gIC8vIGAwLjUgJSAwLjEgIT09IDBgKSwgd2UgbmVlZCB0byBjb252ZXJ0IGFsbCBudW1iZXJzIHRvIGludGVnZXJzLlxuICBpZiAoIWlzTnVtYmVySW50ZWdlcih2YWx1ZSkgfHwgIWlzTnVtYmVySW50ZWdlcihzdGVwQmFzZSkgfHwgIWlzTnVtYmVySW50ZWdlcihzdGVwKSkge1xuICAgIHZhciBkZWNpbWFsQ291bnQgPSBNYXRoLm1heChjb3VudERlY2ltYWxzKHZhbHVlKSwgY291bnREZWNpbWFscyhzdGVwQmFzZSksIGNvdW50RGVjaW1hbHMoc3RlcCkpO1xuICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIGRlY2ltYWxDb3VudCk7XG5cbiAgICB2YWx1ZSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICBzdGVwQmFzZSA9IHN0ZXBCYXNlICogbXVsdGlwbGllcjtcbiAgICBzdGVwID0gc3RlcCAqIG11bHRpcGxpZXI7XG4gIH1cblxuICByZXR1cm4gKHZhbHVlIC0gc3RlcEJhc2UpICUgc3RlcCA9PT0gMDtcbn1cblxuZnVuY3Rpb24gbnVtYmVySW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTtcbiAgbnVtYmVyRm9ybWF0dGVyUGFyc2VyKGN0cmwpO1xuICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpO1xuXG4gIHZhciBtaW5WYWw7XG4gIHZhciBtYXhWYWw7XG5cbiAgaWYgKGlzRGVmaW5lZChhdHRyLm1pbikgfHwgYXR0ci5uZ01pbikge1xuICAgIGN0cmwuJHZhbGlkYXRvcnMubWluID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHZhbHVlID49IG1pblZhbDtcbiAgICB9O1xuXG4gICAgYXR0ci4kb2JzZXJ2ZSgnbWluJywgZnVuY3Rpb24odmFsKSB7XG4gICAgICBtaW5WYWwgPSBwYXJzZU51bWJlckF0dHJWYWwodmFsKTtcbiAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9uc1xuICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpc0RlZmluZWQoYXR0ci5tYXgpIHx8IGF0dHIubmdNYXgpIHtcbiAgICBjdHJsLiR2YWxpZGF0b3JzLm1heCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2YWx1ZSkgfHwgaXNVbmRlZmluZWQobWF4VmFsKSB8fCB2YWx1ZSA8PSBtYXhWYWw7XG4gICAgfTtcblxuICAgIGF0dHIuJG9ic2VydmUoJ21heCcsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgbWF4VmFsID0gcGFyc2VOdW1iZXJBdHRyVmFsKHZhbCk7XG4gICAgICAvLyBUT0RPKG1hdHNrbyk6IGltcGxlbWVudCB2YWxpZGF0ZUxhdGVyIHRvIHJlZHVjZSBudW1iZXIgb2YgdmFsaWRhdGlvbnNcbiAgICAgIGN0cmwuJHZhbGlkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNEZWZpbmVkKGF0dHIuc3RlcCkgfHwgYXR0ci5uZ1N0ZXApIHtcbiAgICB2YXIgc3RlcFZhbDtcbiAgICBjdHJsLiR2YWxpZGF0b3JzLnN0ZXAgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSkgfHwgaXNVbmRlZmluZWQoc3RlcFZhbCkgfHxcbiAgICAgICAgICAgICBpc1ZhbGlkRm9yU3RlcCh2aWV3VmFsdWUsIG1pblZhbCB8fCAwLCBzdGVwVmFsKTtcbiAgICB9O1xuXG4gICAgYXR0ci4kb2JzZXJ2ZSgnc3RlcCcsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgc3RlcFZhbCA9IHBhcnNlTnVtYmVyQXR0clZhbCh2YWwpO1xuICAgICAgLy8gVE9ETyhtYXRza28pOiBpbXBsZW1lbnQgdmFsaWRhdGVMYXRlciB0byByZWR1Y2UgbnVtYmVyIG9mIHZhbGlkYXRpb25zXG4gICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJhbmdlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTtcbiAgbnVtYmVyRm9ybWF0dGVyUGFyc2VyKGN0cmwpO1xuICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpO1xuXG4gIHZhciBzdXBwb3J0c1JhbmdlID0gY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMgJiYgZWxlbWVudFswXS50eXBlID09PSAncmFuZ2UnLFxuICAgICAgbWluVmFsID0gc3VwcG9ydHNSYW5nZSA/IDAgOiB1bmRlZmluZWQsXG4gICAgICBtYXhWYWwgPSBzdXBwb3J0c1JhbmdlID8gMTAwIDogdW5kZWZpbmVkLFxuICAgICAgc3RlcFZhbCA9IHN1cHBvcnRzUmFuZ2UgPyAxIDogdW5kZWZpbmVkLFxuICAgICAgdmFsaWRpdHkgPSBlbGVtZW50WzBdLnZhbGlkaXR5LFxuICAgICAgaGFzTWluQXR0ciA9IGlzRGVmaW5lZChhdHRyLm1pbiksXG4gICAgICBoYXNNYXhBdHRyID0gaXNEZWZpbmVkKGF0dHIubWF4KSxcbiAgICAgIGhhc1N0ZXBBdHRyID0gaXNEZWZpbmVkKGF0dHIuc3RlcCk7XG5cbiAgdmFyIG9yaWdpbmFsUmVuZGVyID0gY3RybC4kcmVuZGVyO1xuXG4gIGN0cmwuJHJlbmRlciA9IHN1cHBvcnRzUmFuZ2UgJiYgaXNEZWZpbmVkKHZhbGlkaXR5LnJhbmdlVW5kZXJmbG93KSAmJiBpc0RlZmluZWQodmFsaWRpdHkucmFuZ2VPdmVyZmxvdykgP1xuICAgIC8vQnJvd3NlcnMgdGhhdCBpbXBsZW1lbnQgcmFuZ2Ugd2lsbCBzZXQgdGhlc2UgdmFsdWVzIGF1dG9tYXRpY2FsbHksIGJ1dCByZWFkaW5nIHRoZSBhZGp1c3RlZCB2YWx1ZXMgYWZ0ZXJcbiAgICAvLyRyZW5kZXIgd291bGQgY2F1c2UgdGhlIG1pbiAvIG1heCB2YWxpZGF0b3JzIHRvIGJlIGFwcGxpZWQgd2l0aCB0aGUgd3JvbmcgdmFsdWVcbiAgICBmdW5jdGlvbiByYW5nZVJlbmRlcigpIHtcbiAgICAgIG9yaWdpbmFsUmVuZGVyKCk7XG4gICAgICBjdHJsLiRzZXRWaWV3VmFsdWUoZWxlbWVudC52YWwoKSk7XG4gICAgfSA6XG4gICAgb3JpZ2luYWxSZW5kZXI7XG5cbiAgaWYgKGhhc01pbkF0dHIpIHtcbiAgICBjdHJsLiR2YWxpZGF0b3JzLm1pbiA9IHN1cHBvcnRzUmFuZ2UgP1xuICAgICAgLy8gU2luY2UgYWxsIGJyb3dzZXJzIHNldCB0aGUgaW5wdXQgdG8gYSB2YWxpZCB2YWx1ZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB2YWxpZGl0eVxuICAgICAgZnVuY3Rpb24gbm9vcE1pblZhbGlkYXRvcigpIHsgcmV0dXJuIHRydWU7IH0gOlxuICAgICAgLy8gbm9uLXN1cHBvcnQgYnJvd3NlcnMgdmFsaWRhdGUgdGhlIG1pbiB2YWxcbiAgICAgIGZ1bmN0aW9uIG1pblZhbGlkYXRvcihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmlld1ZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHZpZXdWYWx1ZSA+PSBtaW5WYWw7XG4gICAgICB9O1xuXG4gICAgc2V0SW5pdGlhbFZhbHVlQW5kT2JzZXJ2ZXIoJ21pbicsIG1pbkNoYW5nZSk7XG4gIH1cblxuICBpZiAoaGFzTWF4QXR0cikge1xuICAgIGN0cmwuJHZhbGlkYXRvcnMubWF4ID0gc3VwcG9ydHNSYW5nZSA/XG4gICAgICAvLyBTaW5jZSBhbGwgYnJvd3NlcnMgc2V0IHRoZSBpbnB1dCB0byBhIHZhbGlkIHZhbHVlLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHZhbGlkaXR5XG4gICAgICBmdW5jdGlvbiBub29wTWF4VmFsaWRhdG9yKCkgeyByZXR1cm4gdHJ1ZTsgfSA6XG4gICAgICAvLyBub24tc3VwcG9ydCBicm93c2VycyB2YWxpZGF0ZSB0aGUgbWF4IHZhbFxuICAgICAgZnVuY3Rpb24gbWF4VmFsaWRhdG9yKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2aWV3VmFsdWUpIHx8IGlzVW5kZWZpbmVkKG1heFZhbCkgfHwgdmlld1ZhbHVlIDw9IG1heFZhbDtcbiAgICAgIH07XG5cbiAgICBzZXRJbml0aWFsVmFsdWVBbmRPYnNlcnZlcignbWF4JywgbWF4Q2hhbmdlKTtcbiAgfVxuXG4gIGlmIChoYXNTdGVwQXR0cikge1xuICAgIGN0cmwuJHZhbGlkYXRvcnMuc3RlcCA9IHN1cHBvcnRzUmFuZ2UgP1xuICAgICAgZnVuY3Rpb24gbmF0aXZlU3RlcFZhbGlkYXRvcigpIHtcbiAgICAgICAgLy8gQ3VycmVudGx5LCBvbmx5IEZGIGltcGxlbWVudHMgdGhlIHNwZWMgb24gc3RlcCBjaGFuZ2UgY29ycmVjdGx5IChpLmUuIGFkanVzdGluZyB0aGVcbiAgICAgICAgLy8gaW5wdXQgZWxlbWVudCB2YWx1ZSB0byBhIHZhbGlkIHZhbHVlKS4gSXQncyBwb3NzaWJsZSB0aGF0IG90aGVyIGJyb3dzZXJzIHNldCB0aGUgc3RlcE1pc21hdGNoXG4gICAgICAgIC8vIHZhbGlkaXR5IGVycm9yIGluc3RlYWQsIHNvIHdlIGNhbiBhdCBsZWFzdCByZXBvcnQgYW4gZXJyb3IgaW4gdGhhdCBjYXNlLlxuICAgICAgICByZXR1cm4gIXZhbGlkaXR5LnN0ZXBNaXNtYXRjaDtcbiAgICAgIH0gOlxuICAgICAgLy8gbmdTdGVwIGRvZXNuJ3Qgc2V0IHRoZSBzZXRwIGF0dHIsIHNvIHRoZSBicm93c2VyIGRvZXNuJ3QgYWRqdXN0IHRoZSBpbnB1dCB2YWx1ZSBhcyBzZXR0aW5nIHN0ZXAgd291bGRcbiAgICAgIGZ1bmN0aW9uIHN0ZXBWYWxpZGF0b3IobW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSkgfHwgaXNVbmRlZmluZWQoc3RlcFZhbCkgfHxcbiAgICAgICAgICAgICAgIGlzVmFsaWRGb3JTdGVwKHZpZXdWYWx1ZSwgbWluVmFsIHx8IDAsIHN0ZXBWYWwpO1xuICAgICAgfTtcblxuICAgIHNldEluaXRpYWxWYWx1ZUFuZE9ic2VydmVyKCdzdGVwJywgc3RlcENoYW5nZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRJbml0aWFsVmFsdWVBbmRPYnNlcnZlcihodG1sQXR0ck5hbWUsIGNoYW5nZUZuKSB7XG4gICAgLy8gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZXMgc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgb25seSBhZnRlciBhIGRpZ2VzdCwgYnV0IHdlIG5lZWQgdGhlXG4gICAgLy8gYXR0cmlidXRlIHZhbHVlIHdoZW4gdGhlIGlucHV0IGlzIGZpcnN0IHJlbmRlcmVkLCBzbyB0aGF0IHRoZSBicm93c2VyIGNhbiBhZGp1c3QgdGhlXG4gICAgLy8gaW5wdXQgdmFsdWUgYmFzZWQgb24gdGhlIG1pbi9tYXggdmFsdWVcbiAgICBlbGVtZW50LmF0dHIoaHRtbEF0dHJOYW1lLCBhdHRyW2h0bWxBdHRyTmFtZV0pO1xuICAgIGF0dHIuJG9ic2VydmUoaHRtbEF0dHJOYW1lLCBjaGFuZ2VGbik7XG4gIH1cblxuICBmdW5jdGlvbiBtaW5DaGFuZ2UodmFsKSB7XG4gICAgbWluVmFsID0gcGFyc2VOdW1iZXJBdHRyVmFsKHZhbCk7XG4gICAgLy8gaWdub3JlIGNoYW5nZXMgYmVmb3JlIG1vZGVsIGlzIGluaXRpYWxpemVkXG4gICAgaWYgKGlzTnVtYmVyTmFOKGN0cmwuJG1vZGVsVmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN1cHBvcnRzUmFuZ2UpIHtcbiAgICAgIHZhciBlbFZhbCA9IGVsZW1lbnQudmFsKCk7XG4gICAgICAvLyBJRTExIGRvZXNuJ3Qgc2V0IHRoZSBlbCB2YWwgY29ycmVjdGx5IGlmIHRoZSBtaW5WYWwgaXMgZ3JlYXRlciB0aGFuIHRoZSBlbGVtZW50IHZhbHVlXG4gICAgICBpZiAobWluVmFsID4gZWxWYWwpIHtcbiAgICAgICAgZWxWYWwgPSBtaW5WYWw7XG4gICAgICAgIGVsZW1lbnQudmFsKGVsVmFsKTtcbiAgICAgIH1cbiAgICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbFZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9uc1xuICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYXhDaGFuZ2UodmFsKSB7XG4gICAgbWF4VmFsID0gcGFyc2VOdW1iZXJBdHRyVmFsKHZhbCk7XG4gICAgLy8gaWdub3JlIGNoYW5nZXMgYmVmb3JlIG1vZGVsIGlzIGluaXRpYWxpemVkXG4gICAgaWYgKGlzTnVtYmVyTmFOKGN0cmwuJG1vZGVsVmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN1cHBvcnRzUmFuZ2UpIHtcbiAgICAgIHZhciBlbFZhbCA9IGVsZW1lbnQudmFsKCk7XG4gICAgICAvLyBJRTExIGRvZXNuJ3Qgc2V0IHRoZSBlbCB2YWwgY29ycmVjdGx5IGlmIHRoZSBtYXhWYWwgaXMgbGVzcyB0aGFuIHRoZSBlbGVtZW50IHZhbHVlXG4gICAgICBpZiAobWF4VmFsIDwgZWxWYWwpIHtcbiAgICAgICAgZWxlbWVudC52YWwobWF4VmFsKTtcbiAgICAgICAgLy8gSUUxMSBhbmQgQ2hyb21lIGRvbid0IHNldCB0aGUgdmFsdWUgdG8gdGhlIG1pblZhbCB3aGVuIG1heCA8IG1pblxuICAgICAgICBlbFZhbCA9IG1heFZhbCA8IG1pblZhbCA/IG1pblZhbCA6IG1heFZhbDtcbiAgICAgIH1cbiAgICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbFZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9uc1xuICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwQ2hhbmdlKHZhbCkge1xuICAgIHN0ZXBWYWwgPSBwYXJzZU51bWJlckF0dHJWYWwodmFsKTtcbiAgICAvLyBpZ25vcmUgY2hhbmdlcyBiZWZvcmUgbW9kZWwgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAoaXNOdW1iZXJOYU4oY3RybC4kbW9kZWxWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTb21lIGJyb3dzZXJzIGRvbid0IGFkanVzdCB0aGUgaW5wdXQgdmFsdWUgY29ycmVjdGx5LCBidXQgc2V0IHRoZSBzdGVwTWlzbWF0Y2ggZXJyb3JcbiAgICBpZiAoc3VwcG9ydHNSYW5nZSAmJiBjdHJsLiR2aWV3VmFsdWUgIT09IGVsZW1lbnQudmFsKCkpIHtcbiAgICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbGVtZW50LnZhbCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhtYXRza28pOiBpbXBsZW1lbnQgdmFsaWRhdGVMYXRlciB0byByZWR1Y2UgbnVtYmVyIG9mIHZhbGlkYXRpb25zXG4gICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cmxJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcikge1xuICAvLyBOb3RlOiBubyBiYWRJbnB1dENoZWNrZXIgaGVyZSBieSBwdXJwb3NlIGFzIGB1cmxgIGlzIG9ubHkgYSB2YWxpZGF0aW9uXG4gIC8vIGluIGJyb3dzZXJzLCBpLmUuIHdlIGNhbiBhbHdheXMgcmVhZCBvdXQgaW5wdXQudmFsdWUgZXZlbiBpZiBpdCBpcyBub3QgdmFsaWQhXG4gIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7XG4gIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpO1xuXG4gIGN0cmwuJCRwYXJzZXJOYW1lID0gJ3VybCc7XG4gIGN0cmwuJHZhbGlkYXRvcnMudXJsID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7XG4gICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7XG4gICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IFVSTF9SRUdFWFAudGVzdCh2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtYWlsSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgLy8gTm90ZTogbm8gYmFkSW5wdXRDaGVja2VyIGhlcmUgYnkgcHVycG9zZSBhcyBgdXJsYCBpcyBvbmx5IGEgdmFsaWRhdGlvblxuICAvLyBpbiBicm93c2VycywgaS5lLiB3ZSBjYW4gYWx3YXlzIHJlYWQgb3V0IGlucHV0LnZhbHVlIGV2ZW4gaWYgaXQgaXMgbm90IHZhbGlkIVxuICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpO1xuICBzdHJpbmdCYXNlZElucHV0VHlwZShjdHJsKTtcblxuICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdlbWFpbCc7XG4gIGN0cmwuJHZhbGlkYXRvcnMuZW1haWwgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBtb2RlbFZhbHVlIHx8IHZpZXdWYWx1ZTtcbiAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2YWx1ZSkgfHwgRU1BSUxfUkVHRVhQLnRlc3QodmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiByYWRpb0lucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCkge1xuICB2YXIgZG9UcmltID0gIWF0dHIubmdUcmltIHx8IHRyaW0oYXR0ci5uZ1RyaW0pICE9PSAnZmFsc2UnO1xuICAvLyBtYWtlIHRoZSBuYW1lIHVuaXF1ZSwgaWYgbm90IGRlZmluZWRcbiAgaWYgKGlzVW5kZWZpbmVkKGF0dHIubmFtZSkpIHtcbiAgICBlbGVtZW50LmF0dHIoJ25hbWUnLCBuZXh0VWlkKCkpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHtcbiAgICB2YXIgdmFsdWU7XG4gICAgaWYgKGVsZW1lbnRbMF0uY2hlY2tlZCkge1xuICAgICAgdmFsdWUgPSBhdHRyLnZhbHVlO1xuICAgICAgaWYgKGRvVHJpbSkge1xuICAgICAgICB2YWx1ZSA9IHRyaW0odmFsdWUpO1xuICAgICAgfVxuICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKHZhbHVlLCBldiAmJiBldi50eXBlKTtcbiAgICB9XG4gIH07XG5cbiAgZWxlbWVudC5vbignY2xpY2snLCBsaXN0ZW5lcik7XG5cbiAgY3RybC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICBpZiAoZG9UcmltKSB7XG4gICAgICB2YWx1ZSA9IHRyaW0odmFsdWUpO1xuICAgIH1cbiAgICBlbGVtZW50WzBdLmNoZWNrZWQgPSAodmFsdWUgPT09IGN0cmwuJHZpZXdWYWx1ZSk7XG4gIH07XG5cbiAgYXR0ci4kb2JzZXJ2ZSgndmFsdWUnLCBjdHJsLiRyZW5kZXIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvbnN0YW50RXhwcigkcGFyc2UsIGNvbnRleHQsIG5hbWUsIGV4cHJlc3Npb24sIGZhbGxiYWNrKSB7XG4gIHZhciBwYXJzZUZuO1xuICBpZiAoaXNEZWZpbmVkKGV4cHJlc3Npb24pKSB7XG4gICAgcGFyc2VGbiA9ICRwYXJzZShleHByZXNzaW9uKTtcbiAgICBpZiAoIXBhcnNlRm4uY29uc3RhbnQpIHtcbiAgICAgIHRocm93IG5nTW9kZWxNaW5FcnIoJ2NvbnN0ZXhwcicsICdFeHBlY3RlZCBjb25zdGFudCBleHByZXNzaW9uIGZvciBgezB9YCwgYnV0IHNhdyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2B7MX1gLicsIG5hbWUsIGV4cHJlc3Npb24pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbihjb250ZXh0KTtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGNoZWNrYm94SW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIsICRmaWx0ZXIsICRwYXJzZSkge1xuICB2YXIgdHJ1ZVZhbHVlID0gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBzY29wZSwgJ25nVHJ1ZVZhbHVlJywgYXR0ci5uZ1RydWVWYWx1ZSwgdHJ1ZSk7XG4gIHZhciBmYWxzZVZhbHVlID0gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBzY29wZSwgJ25nRmFsc2VWYWx1ZScsIGF0dHIubmdGYWxzZVZhbHVlLCBmYWxzZSk7XG5cbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHtcbiAgICBjdHJsLiRzZXRWaWV3VmFsdWUoZWxlbWVudFswXS5jaGVja2VkLCBldiAmJiBldi50eXBlKTtcbiAgfTtcblxuICBlbGVtZW50Lm9uKCdjbGljaycsIGxpc3RlbmVyKTtcblxuICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICBlbGVtZW50WzBdLmNoZWNrZWQgPSBjdHJsLiR2aWV3VmFsdWU7XG4gIH07XG5cbiAgLy8gT3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGAkaXNFbXB0eWAgYmVjYXVzZSB0aGUgJHZpZXdWYWx1ZSBvZiBhbiBlbXB0eSBjaGVja2JveCBpcyBhbHdheXMgc2V0IHRvIGBmYWxzZWBcbiAgLy8gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBwYXJzZXIgYmVsb3csIHdoaWNoIGNvbXBhcmVzIHRoZSBgJG1vZGVsVmFsdWVgIHdpdGggYHRydWVWYWx1ZWAgdG8gY29udmVydFxuICAvLyBpdCB0byBhIGJvb2xlYW4uXG4gIGN0cmwuJGlzRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gZmFsc2U7XG4gIH07XG5cbiAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVxdWFscyh2YWx1ZSwgdHJ1ZVZhbHVlKTtcbiAgfSk7XG5cbiAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gdHJ1ZVZhbHVlIDogZmFsc2VWYWx1ZTtcbiAgfSk7XG59XG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSB0ZXh0YXJlYVxuICogQHJlc3RyaWN0IEVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUTUwgdGV4dGFyZWEgZWxlbWVudCBjb250cm9sIHdpdGggYW5ndWxhciBkYXRhLWJpbmRpbmcuIFRoZSBkYXRhLWJpbmRpbmcgYW5kIHZhbGlkYXRpb25cbiAqIHByb3BlcnRpZXMgb2YgdGhpcyBlbGVtZW50IGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRob3NlIG9mIHRoZVxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTppbnB1dCBpbnB1dCBlbGVtZW50fS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG9cbiAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuXG4gKiAgICBtaW5sZW5ndGguXG4gKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuXG4gKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2YgYW55XG4gKiAgICBsZW5ndGguXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgbmdNb2RlbCB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlICR2aWV3VmFsdWV9XG4gKiAgICBkb2VzIG5vdCBtYXRjaCBhIFJlZ0V4cCBmb3VuZCBieSBldmFsdWF0aW5nIHRoZSBBbmd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QsIHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LlxuICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgc3RyaW5nLCB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwXG4gKiAgICBhZnRlciB3cmFwcGluZyBpdCBpbiBgXmAgYW5kIGAkYCBjaGFyYWN0ZXJzLiBGb3IgaW5zdGFuY2UsIGBcImFiY1wiYCB3aWxsIGJlIGNvbnZlcnRlZCB0b1xuICogICAgYG5ldyBSZWdFeHAoJ15hYmMkJylgLjxiciAvPlxuICogICAgKipOb3RlOioqIEF2b2lkIHVzaW5nIHRoZSBgZ2AgZmxhZyBvbiB0aGUgUmVnRXhwLCBhcyBpdCB3aWxsIGNhdXNlIGVhY2ggc3VjY2Vzc2l2ZSBzZWFyY2ggdG9cbiAqICAgIHN0YXJ0IGF0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZWFyY2gncyBtYXRjaCwgdGh1cyBub3QgdGFraW5nIHRoZSB3aG9sZSBpbnB1dCB2YWx1ZSBpbnRvXG4gKiAgICBhY2NvdW50LlxuICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICogQHBhcmFtIHtib29sZWFuPX0gW25nVHJpbT10cnVlXSBJZiBzZXQgdG8gZmFsc2UgQW5ndWxhciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IHRyaW0gdGhlIGlucHV0LlxuICpcbiAqIEBrbm93bklzc3VlXG4gKlxuICogV2hlbiBzcGVjaWZ5aW5nIHRoZSBgcGxhY2Vob2xkZXJgIGF0dHJpYnV0ZSBvZiBgPHRleHRhcmVhPmAsIEludGVybmV0IEV4cGxvcmVyIHdpbGwgdGVtcG9yYXJpbHlcbiAqIGluc2VydCB0aGUgcGxhY2Vob2xkZXIgdmFsdWUgYXMgdGhlIHRleHRhcmVhJ3MgY29udGVudC4gSWYgdGhlIHBsYWNlaG9sZGVyIHZhbHVlIGNvbnRhaW5zXG4gKiBpbnRlcnBvbGF0aW9uIChge3sgLi4uIH19YCksIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkIGluIHRoZSBjb25zb2xlIHdoZW4gQW5ndWxhciB0cmllcyB0byB1cGRhdGVcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYnktdGhlbi1yZW1vdmVkIHRleHQgbm9kZS4gVGhpcyBkb2Vzbid0IGFmZmVjdCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGVcbiAqIHRleHRhcmVhLCBidXQgY2FuIGJlIHVuZGVzaXJhYmxlLlxuICpcbiAqIFlvdSBjYW4gd29yayBhcm91bmQgdGhpcyBJbnRlcm5ldCBFeHBsb3JlciBpc3N1ZSBieSB1c2luZyBgbmctYXR0ci1wbGFjZWhvbGRlcmAgaW5zdGVhZCBvZlxuICogYHBsYWNlaG9sZGVyYCBvbiB0ZXh0YXJlYXMsIHdoZW5ldmVyIHlvdSBuZWVkIGludGVycG9sYXRpb24gaW4gdGhlIHBsYWNlaG9sZGVyIHZhbHVlLiBZb3UgY2FuXG4gKiBmaW5kIG1vcmUgZGV0YWlscyBvbiBgbmdBdHRyYCBpbiB0aGVcbiAqIFtJbnRlcnBvbGF0aW9uXShndWlkZS9pbnRlcnBvbGF0aW9uIy1uZ2F0dHItZm9yLWJpbmRpbmctdG8tYXJiaXRyYXJ5LWF0dHJpYnV0ZXMpIHNlY3Rpb24gb2YgdGhlXG4gKiBEZXZlbG9wZXIgR3VpZGUuXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIGlucHV0XG4gKiBAcmVzdHJpY3QgRVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSFRNTCBpbnB1dCBlbGVtZW50IGNvbnRyb2wuIFdoZW4gdXNlZCB0b2dldGhlciB3aXRoIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0sIGl0IHByb3ZpZGVzIGRhdGEtYmluZGluZyxcbiAqIGlucHV0IHN0YXRlIGNvbnRyb2wsIGFuZCB2YWxpZGF0aW9uLlxuICogSW5wdXQgY29udHJvbCBmb2xsb3dzIEhUTUw1IGlucHV0IHR5cGVzIGFuZCBwb2x5ZmlsbHMgdGhlIEhUTUw1IHZhbGlkYXRpb24gYmVoYXZpb3IgZm9yIG9sZGVyIGJyb3dzZXJzLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAqKk5vdGU6KiogTm90IGV2ZXJ5IGZlYXR1cmUgb2ZmZXJlZCBpcyBhdmFpbGFibGUgZm9yIGFsbCBpbnB1dCB0eXBlcy5cbiAqIFNwZWNpZmljYWxseSwgZGF0YSBiaW5kaW5nIGFuZCBldmVudCBoYW5kbGluZyB2aWEgYG5nLW1vZGVsYCBpcyB1bnN1cHBvcnRlZCBmb3IgYGlucHV0W2ZpbGVdYC5cbiAqIDwvZGl2PlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG5nUmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBpZiBzZXQgdG8gdHJ1ZVxuICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW5cbiAqICAgIG1pbmxlbmd0aC5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW5cbiAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZiBhbnlcbiAqICAgIGxlbmd0aC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgJHZpZXdWYWx1ZX1cbiAqICAgIHZhbHVlIGRvZXMgbm90IG1hdGNoIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLlxuICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCwgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuXG4gKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHBcbiAqICAgIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYFwiYWJjXCJgIHdpbGwgYmUgY29udmVydGVkIHRvXG4gKiAgICBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuPGJyIC8+XG4gKiAgICAqKk5vdGU6KiogQXZvaWQgdXNpbmcgdGhlIGBnYCBmbGFnIG9uIHRoZSBSZWdFeHAsIGFzIGl0IHdpbGwgY2F1c2UgZWFjaCBzdWNjZXNzaXZlIHNlYXJjaCB0b1xuICogICAgc3RhcnQgYXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNlYXJjaCdzIG1hdGNoLCB0aHVzIG5vdCB0YWtpbmcgdGhlIHdob2xlIGlucHV0IHZhbHVlIGludG9cbiAqICAgIGFjY291bnQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbbmdUcmltPXRydWVdIElmIHNldCB0byBmYWxzZSBBbmd1bGFyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJpbSB0aGUgaW5wdXQuXG4gKiAgICBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciBpbnB1dFt0eXBlPXBhc3N3b3JkXSBjb250cm9scywgd2hpY2ggd2lsbCBuZXZlciB0cmltIHRoZVxuICogICAgaW5wdXQuXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwiaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwiaW5wdXRFeGFtcGxlXCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2lucHV0RXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgJHNjb3BlLnVzZXIgPSB7bmFtZTogJ2d1ZXN0JywgbGFzdDogJ3Zpc2l0b3InfTtcbiAgICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiPlxuICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgIFVzZXIgbmFtZTpcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJOYW1lXCIgbmctbW9kZWw9XCJ1c2VyLm5hbWVcIiByZXF1aXJlZD5cbiAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS51c2VyTmFtZS4kZXJyb3IucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICBMYXN0IG5hbWU6XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJsYXN0TmFtZVwiIG5nLW1vZGVsPVwidXNlci5sYXN0XCJcbiAgICAgICAgICAgICAgbmctbWlubGVuZ3RoPVwiM1wiIG5nLW1heGxlbmd0aD1cIjEwXCI+XG4gICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0ubGFzdE5hbWUuJGVycm9yLm1pbmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgVG9vIHNob3J0ITwvc3Bhbj5cbiAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5sYXN0TmFtZS4kZXJyb3IubWF4bGVuZ3RoXCI+XG4gICAgICAgICAgICAgICBUb28gbG9uZyE8L3NwYW4+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgPGhyPlxuICAgICAgICAgPHR0PnVzZXIgPSB7e3VzZXJ9fTwvdHQ+PGJyLz5cbiAgICAgICAgIDx0dD5teUZvcm0udXNlck5hbWUuJHZhbGlkID0ge3tteUZvcm0udXNlck5hbWUuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICA8dHQ+bXlGb3JtLnVzZXJOYW1lLiRlcnJvciA9IHt7bXlGb3JtLnVzZXJOYW1lLiRlcnJvcn19PC90dD48YnIvPlxuICAgICAgICAgPHR0Pm15Rm9ybS5sYXN0TmFtZS4kdmFsaWQgPSB7e215Rm9ybS5sYXN0TmFtZS4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgIDx0dD5teUZvcm0ubGFzdE5hbWUuJGVycm9yID0ge3tteUZvcm0ubGFzdE5hbWUuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IubWlubGVuZ3RoID0ge3shIW15Rm9ybS4kZXJyb3IubWlubGVuZ3RofX08L3R0Pjxici8+XG4gICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5tYXhsZW5ndGggPSB7eyEhbXlGb3JtLiRlcnJvci5tYXhsZW5ndGh9fTwvdHQ+PGJyLz5cbiAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgdmFyIHVzZXIgPSBlbGVtZW50KGJ5LmV4YWN0QmluZGluZygndXNlcicpKTtcbiAgICAgICAgdmFyIHVzZXJOYW1lVmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS51c2VyTmFtZS4kdmFsaWQnKSk7XG4gICAgICAgIHZhciBsYXN0TmFtZVZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0ubGFzdE5hbWUuJHZhbGlkJykpO1xuICAgICAgICB2YXIgbGFzdE5hbWVFcnJvciA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmxhc3ROYW1lLiRlcnJvcicpKTtcbiAgICAgICAgdmFyIGZvcm1WYWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLiR2YWxpZCcpKTtcbiAgICAgICAgdmFyIHVzZXJOYW1lSW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyLm5hbWUnKSk7XG4gICAgICAgIHZhciB1c2VyTGFzdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgndXNlci5sYXN0JykpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7XCJuYW1lXCI6XCJndWVzdFwiLFwibGFzdFwiOlwidmlzaXRvclwifScpO1xuICAgICAgICAgIGV4cGVjdCh1c2VyTmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHkgd2hlbiByZXF1aXJlZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHVzZXJOYW1lSW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICB1c2VyTmFtZUlucHV0LnNlbmRLZXlzKCcnKTtcblxuICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7XCJsYXN0XCI6XCJ2aXNpdG9yXCJ9Jyk7XG4gICAgICAgICAgZXhwZWN0KHVzZXJOYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSB2YWxpZCBpZiBlbXB0eSB3aGVuIG1pbiBsZW5ndGggaXMgc2V0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpO1xuICAgICAgICAgIHVzZXJMYXN0SW5wdXQuc2VuZEtleXMoJycpO1xuXG4gICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3tcIm5hbWVcIjpcImd1ZXN0XCIsXCJsYXN0XCI6XCJcIn0nKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVWYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpO1xuICAgICAgICAgIGV4cGVjdChmb3JtVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGxlc3MgdGhhbiByZXF1aXJlZCBtaW4gbGVuZ3RoJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpO1xuICAgICAgICAgIHVzZXJMYXN0SW5wdXQuc2VuZEtleXMoJ3h4Jyk7XG5cbiAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigne1wibmFtZVwiOlwiZ3Vlc3RcIn0nKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVWYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVFcnJvci5nZXRUZXh0KCkpLnRvQ29udGFpbignbWlubGVuZ3RoJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGxvbmdlciB0aGFuIG1heCBsZW5ndGgnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB1c2VyTGFzdElucHV0LmNsZWFyKCk7XG4gICAgICAgICAgdXNlckxhc3RJbnB1dC5zZW5kS2V5cygnc29tZSByaWRpY3Vsb3VzbHkgbG9uZyBuYW1lJyk7XG5cbiAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigne1wibmFtZVwiOlwiZ3Vlc3RcIn0nKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVWYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVFcnJvci5nZXRUZXh0KCkpLnRvQ29udGFpbignbWF4bGVuZ3RoJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICovXG52YXIgaW5wdXREaXJlY3RpdmUgPSBbJyRicm93c2VyJywgJyRzbmlmZmVyJywgJyRmaWx0ZXInLCAnJHBhcnNlJyxcbiAgICBmdW5jdGlvbigkYnJvd3NlciwgJHNuaWZmZXIsICRmaWx0ZXIsICRwYXJzZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnRScsXG4gICAgcmVxdWlyZTogWyc/bmdNb2RlbCddLFxuICAgIGxpbms6IHtcbiAgICAgIHByZTogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7XG4gICAgICAgIGlmIChjdHJsc1swXSkge1xuICAgICAgICAgIChpbnB1dFR5cGVbbG93ZXJjYXNlKGF0dHIudHlwZSldIHx8IGlucHV0VHlwZS50ZXh0KShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHNbMF0sICRzbmlmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnJvd3NlciwgJGZpbHRlciwgJHBhcnNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1dO1xuXG5cblxudmFyIENPTlNUQU5UX1ZBTFVFX1JFR0VYUCA9IC9eKHRydWV8ZmFsc2V8XFxkKykkLztcbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdWYWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQmluZHMgdGhlIGdpdmVuIGV4cHJlc3Npb24gdG8gdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIEl0IGlzIG1haW5seSB1c2VkIG9uIHtAbGluayBpbnB1dFtyYWRpb10gYGlucHV0W3JhZGlvXWB9IGFuZCBvcHRpb24gZWxlbWVudHMsXG4gKiBzbyB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHRoZSB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9IG9mIHRoYXQgZWxlbWVudCAob3IgaXRzXG4gKiB7QGxpbmsgc2VsZWN0IGBzZWxlY3RgfSBwYXJlbnQgZWxlbWVudCkgaXMgc2V0IHRvIHRoZSBib3VuZCB2YWx1ZS4gSXQgaXMgZXNwZWNpYWxseSB1c2VmdWxcbiAqIGZvciBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbGlzdHMgdXNpbmcge0BsaW5rIG5nUmVwZWF0IGBuZ1JlcGVhdGB9LCBhcyBzaG93biBiZWxvdy5cbiAqXG4gKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFjaGlldmUgb25lLXdheSBiaW5kaW5nIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbiB0byBhbiBpbnB1dCBlbGVtZW50XG4gKiBzdWNoIGFzIGFuIGBpbnB1dFt0ZXh0XWAgb3IgYSBgdGV4dGFyZWFgLCB3aGVuIHRoYXQgZWxlbWVudCBkb2VzIG5vdCB1c2UgbmdNb2RlbC5cbiAqXG4gKiBAZWxlbWVudCBpbnB1dFxuICogQHBhcmFtIHtzdHJpbmc9fSBuZ1ZhbHVlIGFuZ3VsYXIgZXhwcmVzc2lvbiwgd2hvc2UgdmFsdWUgd2lsbCBiZSBib3VuZCB0byB0aGUgYHZhbHVlYCBhdHRyaWJ1dGVcbiAqIGFuZCBgdmFsdWVgIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbmFtZT1cIm5nVmFsdWUtZGlyZWN0aXZlXCIgbW9kdWxlPVwidmFsdWVFeGFtcGxlXCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3ZhbHVlRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydwaXp6YScsICd1bmljb3JucycsICdyb2JvdHMnXTtcbiAgICAgICAgICAgICAgJHNjb3BlLm15ID0geyBmYXZvcml0ZTogJ3VuaWNvcm5zJyB9O1xuICAgICAgICAgICAgfV0pO1xuICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8Zm9ybSBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICA8aDI+V2hpY2ggaXMgeW91ciBmYXZvcml0ZT88L2gyPlxuICAgICAgICAgICAgPGxhYmVsIG5nLXJlcGVhdD1cIm5hbWUgaW4gbmFtZXNcIiBmb3I9XCJ7e25hbWV9fVwiPlxuICAgICAgICAgICAgICB7e25hbWV9fVxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPVwibXkuZmF2b3JpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgbmctdmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tuYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZhdm9yaXRlXCI+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXY+WW91IGNob3NlIHt7bXkuZmF2b3JpdGV9fTwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2ZpbGU+XG4gICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgIHZhciBmYXZvcml0ZSA9IGVsZW1lbnQoYnkuYmluZGluZygnbXkuZmF2b3JpdGUnKSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZXhwZWN0KGZhdm9yaXRlLmdldFRleHQoKSkudG9Db250YWluKCd1bmljb3JucycpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBiaW5kIHRoZSB2YWx1ZXMgdG8gdGhlIGlucHV0cycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW1lbnQuYWxsKGJ5Lm1vZGVsKCdteS5mYXZvcml0ZScpKS5nZXQoMCkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZmF2b3JpdGUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3BpenphJyk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nVmFsdWVEaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgLyoqXG4gICAqICBpbnB1dHMgdXNlIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgYXMgdGhlaXIgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgcHJvcGVydHkgaXMgbm90IHNldC5cbiAgICogIE9uY2UgdGhlIHZhbHVlIHByb3BlcnR5IGhhcyBiZWVuIHNldCAoYnkgYWRkaW5nIGlucHV0KSwgaXQgd2lsbCBub3QgcmVhY3QgdG8gY2hhbmdlcyB0b1xuICAgKiAgdGhlIHZhbHVlIGF0dHJpYnV0ZSBhbnltb3JlLiBTZXR0aW5nIGJvdGggYXR0cmlidXRlIGFuZCBwcm9wZXJ0eSBmaXhlcyB0aGlzIGJlaGF2aW9yLCBhbmRcbiAgICogIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBuZ1ZhbHVlIGFzIGEgc29ydCBvZiBvbmUtd2F5IGJpbmQuXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50VmFsdWUoZWxlbWVudCwgYXR0ciwgdmFsdWUpIHtcbiAgICBlbGVtZW50LnByb3AoJ3ZhbHVlJywgdmFsdWUpO1xuICAgIGF0dHIuJHNldCgndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgcHJpb3JpdHk6IDEwMCxcbiAgICBjb21waWxlOiBmdW5jdGlvbih0cGwsIHRwbEF0dHIpIHtcbiAgICAgIGlmIChDT05TVEFOVF9WQUxVRV9SRUdFWFAudGVzdCh0cGxBdHRyLm5nVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1ZhbHVlQ29uc3RhbnRMaW5rKHNjb3BlLCBlbG0sIGF0dHIpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBzY29wZS4kZXZhbChhdHRyLm5nVmFsdWUpO1xuICAgICAgICAgIHVwZGF0ZUVsZW1lbnRWYWx1ZShlbG0sIGF0dHIsIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1ZhbHVlTGluayhzY29wZSwgZWxtLCBhdHRyKSB7XG4gICAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdWYWx1ZSwgZnVuY3Rpb24gdmFsdWVXYXRjaEFjdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdXBkYXRlRWxlbWVudFZhbHVlKGVsbSwgYXR0ciwgdmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdCaW5kXG4gKiBAcmVzdHJpY3QgQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdCaW5kYCBhdHRyaWJ1dGUgdGVsbHMgQW5ndWxhciB0byByZXBsYWNlIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBIVE1MIGVsZW1lbnRcbiAqIHdpdGggdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbiwgYW5kIHRvIHVwZGF0ZSB0aGUgdGV4dCBjb250ZW50IHdoZW4gdGhlIHZhbHVlIG9mIHRoYXRcbiAqIGV4cHJlc3Npb24gY2hhbmdlcy5cbiAqXG4gKiBUeXBpY2FsbHksIHlvdSBkb24ndCB1c2UgYG5nQmluZGAgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIHlvdSB1c2UgdGhlIGRvdWJsZSBjdXJseSBtYXJrdXAgbGlrZVxuICogYHt7IGV4cHJlc3Npb24gfX1gIHdoaWNoIGlzIHNpbWlsYXIgYnV0IGxlc3MgdmVyYm9zZS5cbiAqXG4gKiBJdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSBgbmdCaW5kYCBpbnN0ZWFkIG9mIGB7eyBleHByZXNzaW9uIH19YCBpZiBhIHRlbXBsYXRlIGlzIG1vbWVudGFyaWx5XG4gKiBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgaW4gaXRzIHJhdyBzdGF0ZSBiZWZvcmUgQW5ndWxhciBjb21waWxlcyBpdC4gU2luY2UgYG5nQmluZGAgaXMgYW5cbiAqIGVsZW1lbnQgYXR0cmlidXRlLCBpdCBtYWtlcyB0aGUgYmluZGluZ3MgaW52aXNpYmxlIHRvIHRoZSB1c2VyIHdoaWxlIHRoZSBwYWdlIGlzIGxvYWRpbmcuXG4gKlxuICogQW4gYWx0ZXJuYXRpdmUgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIHdvdWxkIGJlIHVzaW5nIHRoZVxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Nsb2FrIG5nQ2xvYWt9IGRpcmVjdGl2ZS5cbiAqXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQmluZCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRW50ZXIgYSBuYW1lIGluIHRoZSBMaXZlIFByZXZpZXcgdGV4dCBib3g7IHRoZSBncmVldGluZyBiZWxvdyB0aGUgdGV4dCBib3ggY2hhbmdlcyBpbnN0YW50bHkuXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJiaW5kRXhhbXBsZVwiIG5hbWU9XCJuZy1iaW5kXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdiaW5kRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS5uYW1lID0gJ1doaXJsZWQnO1xuICAgICAgICAgICB9XSk7XG4gICAgICAgPC9zY3JpcHQ+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxsYWJlbD5FbnRlciBuYW1lOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm5hbWVcIj48L2xhYmVsPjxicj5cbiAgICAgICAgIEhlbGxvIDxzcGFuIG5nLWJpbmQ9XCJuYW1lXCI+PC9zcGFuPiFcbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1iaW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICB2YXIgbmFtZUlucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbmFtZScpKTtcblxuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbmFtZScpKS5nZXRUZXh0KCkpLnRvQmUoJ1doaXJsZWQnKTtcbiAgICAgICAgIG5hbWVJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbmFtZUlucHV0LnNlbmRLZXlzKCd3b3JsZCcpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbmFtZScpKS5nZXRUZXh0KCkpLnRvQmUoJ3dvcmxkJyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nQmluZERpcmVjdGl2ZSA9IFsnJGNvbXBpbGUnLCBmdW5jdGlvbigkY29tcGlsZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQUMnLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZENvbXBpbGUodGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyh0ZW1wbGF0ZUVsZW1lbnQpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nQmluZExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZCk7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdO1xuICAgICAgICBzY29wZS4kd2F0Y2goYXR0ci5uZ0JpbmQsIGZ1bmN0aW9uIG5nQmluZFdhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQmluZFRlbXBsYXRlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nQmluZFRlbXBsYXRlYCBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoYXQgdGhlIGVsZW1lbnRcbiAqIHRleHQgY29udGVudCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgaW50ZXJwb2xhdGlvbiBvZiB0aGUgdGVtcGxhdGVcbiAqIGluIHRoZSBgbmdCaW5kVGVtcGxhdGVgIGF0dHJpYnV0ZS5cbiAqIFVubGlrZSBgbmdCaW5kYCwgdGhlIGBuZ0JpbmRUZW1wbGF0ZWAgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYHt7YCBgfX1gXG4gKiBleHByZXNzaW9ucy4gVGhpcyBkaXJlY3RpdmUgaXMgbmVlZGVkIHNpbmNlIHNvbWUgSFRNTCBlbGVtZW50c1xuICogKHN1Y2ggYXMgVElUTEUgYW5kIE9QVElPTikgY2Fubm90IGNvbnRhaW4gU1BBTiBlbGVtZW50cy5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZ0JpbmRUZW1wbGF0ZSB0ZW1wbGF0ZSBvZiBmb3JtXG4gKiAgIDx0dD57ezwvdHQ+IDx0dD5leHByZXNzaW9uPC90dD4gPHR0Pn19PC90dD4gdG8gZXZhbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogVHJ5IGl0IGhlcmU6IGVudGVyIHRleHQgaW4gdGV4dCBib3ggYW5kIHdhdGNoIHRoZSBncmVldGluZyBjaGFuZ2UuXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJiaW5kRXhhbXBsZVwiIG5hbWU9XCJuZy1iaW5kLXRlbXBsYXRlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdiaW5kRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS5zYWx1dGF0aW9uID0gJ0hlbGxvJztcbiAgICAgICAgICAgICAkc2NvcGUubmFtZSA9ICdXb3JsZCc7XG4gICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8bGFiZWw+U2FsdXRhdGlvbjogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJzYWx1dGF0aW9uXCI+PC9sYWJlbD48YnI+XG4gICAgICAgIDxsYWJlbD5OYW1lOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm5hbWVcIj48L2xhYmVsPjxicj5cbiAgICAgICAgPHByZSBuZy1iaW5kLXRlbXBsYXRlPVwie3tzYWx1dGF0aW9ufX0ge3tuYW1lfX0hXCI+PC9wcmU+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctYmluZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgdmFyIHNhbHV0YXRpb25FbGVtID0gZWxlbWVudChieS5iaW5kaW5nKCdzYWx1dGF0aW9uJykpO1xuICAgICAgICAgdmFyIHNhbHV0YXRpb25JbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3NhbHV0YXRpb24nKSk7XG4gICAgICAgICB2YXIgbmFtZUlucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbmFtZScpKTtcblxuICAgICAgICAgZXhwZWN0KHNhbHV0YXRpb25FbGVtLmdldFRleHQoKSkudG9CZSgnSGVsbG8gV29ybGQhJyk7XG5cbiAgICAgICAgIHNhbHV0YXRpb25JbnB1dC5jbGVhcigpO1xuICAgICAgICAgc2FsdXRhdGlvbklucHV0LnNlbmRLZXlzKCdHcmVldGluZ3MnKTtcbiAgICAgICAgIG5hbWVJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbmFtZUlucHV0LnNlbmRLZXlzKCd1c2VyJyk7XG5cbiAgICAgICAgIGV4cGVjdChzYWx1dGF0aW9uRWxlbS5nZXRUZXh0KCkpLnRvQmUoJ0dyZWV0aW5ncyB1c2VyIScpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ0JpbmRUZW1wbGF0ZURpcmVjdGl2ZSA9IFsnJGludGVycG9sYXRlJywgJyRjb21waWxlJywgZnVuY3Rpb24oJGludGVycG9sYXRlLCAkY29tcGlsZSkge1xuICByZXR1cm4ge1xuICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZFRlbXBsYXRlQ29tcGlsZSh0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICRjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzKHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gbmdCaW5kVGVtcGxhdGVMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyLm5nQmluZFRlbXBsYXRlKSk7XG4gICAgICAgICRjb21waWxlLiQkYWRkQmluZGluZ0luZm8oZWxlbWVudCwgaW50ZXJwb2xhdGVGbi5leHByZXNzaW9ucyk7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdO1xuICAgICAgICBhdHRyLiRvYnNlcnZlKCduZ0JpbmRUZW1wbGF0ZScsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGlzVW5kZWZpbmVkKHZhbHVlKSA/ICcnIDogdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQmluZEh0bWxcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaW5zZXJ0cyB0aGUgcmVzdWx0aW5nIEhUTUwgaW50byB0aGUgZWxlbWVudCBpbiBhIHNlY3VyZSB3YXkuIEJ5IGRlZmF1bHQsXG4gKiB0aGUgcmVzdWx0aW5nIEhUTUwgY29udGVudCB3aWxsIGJlIHNhbml0aXplZCB1c2luZyB0aGUge0BsaW5rIG5nU2FuaXRpemUuJHNhbml0aXplICRzYW5pdGl6ZX0gc2VydmljZS5cbiAqIFRvIHV0aWxpemUgdGhpcyBmdW5jdGlvbmFsaXR5LCBlbnN1cmUgdGhhdCBgJHNhbml0aXplYCBpcyBhdmFpbGFibGUsIGZvciBleGFtcGxlLCBieSBpbmNsdWRpbmcge0BsaW5rXG4gKiBuZ1Nhbml0aXplfSBpbiB5b3VyIG1vZHVsZSdzIGRlcGVuZGVuY2llcyAobm90IGluIGNvcmUgQW5ndWxhcikuIEluIG9yZGVyIHRvIHVzZSB7QGxpbmsgbmdTYW5pdGl6ZX1cbiAqIGluIHlvdXIgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzLCB5b3UgbmVlZCB0byBpbmNsdWRlIFwiYW5ndWxhci1zYW5pdGl6ZS5qc1wiIGluIHlvdXIgYXBwbGljYXRpb24uXG4gKlxuICogWW91IG1heSBhbHNvIGJ5cGFzcyBzYW5pdGl6YXRpb24gZm9yIHZhbHVlcyB5b3Uga25vdyBhcmUgc2FmZS4gVG8gZG8gc28sIGJpbmQgdG9cbiAqIGFuIGV4cGxpY2l0bHkgdHJ1c3RlZCB2YWx1ZSB2aWEge0BsaW5rIG5nLiRzY2UjdHJ1c3RBc0h0bWwgJHNjZS50cnVzdEFzSHRtbH0uICBTZWUgdGhlIGV4YW1wbGVcbiAqIHVuZGVyIHtAbGluayBuZy4kc2NlI3Nob3ctbWUtYW4tZXhhbXBsZS11c2luZy1zY2UtIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIChTQ0UpfS5cbiAqXG4gKiBOb3RlOiBJZiBhIGAkc2FuaXRpemVgIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUgYW5kIHRoZSBib3VuZCB2YWx1ZSBpc24ndCBleHBsaWNpdGx5IHRydXN0ZWQsIHlvdVxuICogd2lsbCBoYXZlIGFuIGV4Y2VwdGlvbiAoaW5zdGVhZCBvZiBhbiBleHBsb2l0LilcbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCaW5kSHRtbCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJiaW5kSHRtbEV4YW1wbGVcIiBkZXBzPVwiYW5ndWxhci1zYW5pdGl6ZS5qc1wiIG5hbWU9XCJuZy1iaW5kLWh0bWxcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8cCBuZy1iaW5kLWh0bWw9XCJteUhUTUxcIj48L3A+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cblxuICAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICAgYW5ndWxhci5tb2R1bGUoJ2JpbmRIdG1sRXhhbXBsZScsIFsnbmdTYW5pdGl6ZSddKVxuICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgJHNjb3BlLm15SFRNTCA9XG4gICAgICAgICAgICAgICdJIGFtIGFuIDxjb2RlPkhUTUw8L2NvZGU+c3RyaW5nIHdpdGggJyArXG4gICAgICAgICAgICAgICc8YSBocmVmPVwiI1wiPmxpbmtzITwvYT4gYW5kIG90aGVyIDxlbT5zdHVmZjwvZW0+JztcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuXG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWJpbmQtaHRtbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbXlIVE1MJykpLmdldFRleHQoKSkudG9CZShcbiAgICAgICAgICAgICAnSSBhbSBhbiBIVE1Mc3RyaW5nIHdpdGggbGlua3MhIGFuZCBvdGhlciBzdHVmZicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ0JpbmRIdG1sRGlyZWN0aXZlID0gWyckc2NlJywgJyRwYXJzZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRzY2UsICRwYXJzZSwgJGNvbXBpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZEh0bWxDb21waWxlKHRFbGVtZW50LCB0QXR0cnMpIHtcbiAgICAgIHZhciBuZ0JpbmRIdG1sR2V0dGVyID0gJHBhcnNlKHRBdHRycy5uZ0JpbmRIdG1sKTtcbiAgICAgIHZhciBuZ0JpbmRIdG1sV2F0Y2ggPSAkcGFyc2UodEF0dHJzLm5nQmluZEh0bWwsIGZ1bmN0aW9uIHNjZVZhbHVlT2YodmFsKSB7XG4gICAgICAgIC8vIFVud3JhcCB0aGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYWN0dWFsIGlubmVyIHNhZmUgdmFsdWUsIG5vdCB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICAgIHJldHVybiAkc2NlLnZhbHVlT2YodmFsKTtcbiAgICAgIH0pO1xuICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModEVsZW1lbnQpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gbmdCaW5kSHRtbExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZEh0bWwpO1xuXG4gICAgICAgIHNjb3BlLiR3YXRjaChuZ0JpbmRIdG1sV2F0Y2gsIGZ1bmN0aW9uIG5nQmluZEh0bWxXYXRjaEFjdGlvbigpIHtcbiAgICAgICAgICAvLyBUaGUgd2F0Y2hlZCB2YWx1ZSBpcyB0aGUgdW53cmFwcGVkIHZhbHVlLiBUbyBhdm9pZCByZS1lc2NhcGluZywgdXNlIHRoZSBkaXJlY3QgZ2V0dGVyLlxuICAgICAgICAgIHZhciB2YWx1ZSA9IG5nQmluZEh0bWxHZXR0ZXIoc2NvcGUpO1xuICAgICAgICAgIGVsZW1lbnQuaHRtbCgkc2NlLmdldFRydXN0ZWRIdG1sKHZhbHVlKSB8fCAnJyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0NoYW5nZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRXZhbHVhdGUgdGhlIGdpdmVuIGV4cHJlc3Npb24gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBpbnB1dC5cbiAqIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBpbW1lZGlhdGVseSwgdW5saWtlIHRoZSBKYXZhU2NyaXB0IG9uY2hhbmdlIGV2ZW50XG4gKiB3aGljaCBvbmx5IHRyaWdnZXJzIGF0IHRoZSBlbmQgb2YgYSBjaGFuZ2UgKHVzdWFsbHksIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZVxuICogZm9ybSBlbGVtZW50IG9yIHByZXNzZXMgdGhlIHJldHVybiBrZXkpLlxuICpcbiAqIFRoZSBgbmdDaGFuZ2VgIGV4cHJlc3Npb24gaXMgb25seSBldmFsdWF0ZWQgd2hlbiBhIGNoYW5nZSBpbiB0aGUgaW5wdXQgdmFsdWUgY2F1c2VzXG4gKiBhIG5ldyB2YWx1ZSB0byBiZSBjb21taXR0ZWQgdG8gdGhlIG1vZGVsLlxuICpcbiAqIEl0IHdpbGwgbm90IGJlIGV2YWx1YXRlZDpcbiAqICogaWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGAkcGFyc2Vyc2AgdHJhbnNmb3JtYXRpb24gcGlwZWxpbmUgaGFzIG5vdCBjaGFuZ2VkXG4gKiAqIGlmIHRoZSBpbnB1dCBoYXMgY29udGludWVkIHRvIGJlIGludmFsaWQgc2luY2UgdGhlIG1vZGVsIHdpbGwgc3RheSBgbnVsbGBcbiAqICogaWYgdGhlIG1vZGVsIGlzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseSBhbmQgbm90IGJ5IGEgY2hhbmdlIHRvIHRoZSBpbnB1dCB2YWx1ZVxuICpcbiAqXG4gKiBOb3RlLCB0aGlzIGRpcmVjdGl2ZSByZXF1aXJlcyBgbmdNb2RlbGAgdG8gYmUgcHJlc2VudC5cbiAqXG4gKiBAZWxlbWVudCBpbnB1dFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NoYW5nZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uIGNoYW5nZVxuICogaW4gaW5wdXQgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ0NoYW5nZS1kaXJlY3RpdmVcIiBtb2R1bGU9XCJjaGFuZ2VFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPHNjcmlwdD5cbiAqICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjaGFuZ2VFeGFtcGxlJywgW10pXG4gKiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICAgICAgJHNjb3BlLmNvdW50ZXIgPSAwO1xuICogICAgICAgICAgICRzY29wZS5jaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgICAgICRzY29wZS5jb3VudGVyKys7XG4gKiAgICAgICAgICAgfTtcbiAqICAgICAgICAgfV0pO1xuICogICAgIDwvc2NyaXB0PlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjb25maXJtZWRcIiBuZy1jaGFuZ2U9XCJjaGFuZ2UoKVwiIGlkPVwibmctY2hhbmdlLWV4YW1wbGUxXCIgLz5cbiAqICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImNvbmZpcm1lZFwiIGlkPVwibmctY2hhbmdlLWV4YW1wbGUyXCIgLz5cbiAqICAgICAgIDxsYWJlbCBmb3I9XCJuZy1jaGFuZ2UtZXhhbXBsZTJcIj5Db25maXJtZWQ8L2xhYmVsPjxiciAvPlxuICogICAgICAgPHR0PmRlYnVnID0ge3tjb25maXJtZWR9fTwvdHQ+PGJyLz5cbiAqICAgICAgIDx0dD5jb3VudGVyID0ge3tjb3VudGVyfX08L3R0Pjxici8+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICAgIHZhciBjb3VudGVyID0gZWxlbWVudChieS5iaW5kaW5nKCdjb3VudGVyJykpO1xuICogICAgIHZhciBkZWJ1ZyA9IGVsZW1lbnQoYnkuYmluZGluZygnY29uZmlybWVkJykpO1xuICpcbiAqICAgICBpdCgnc2hvdWxkIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGlmIGNoYW5naW5nIGZyb20gdmlldycsIGZ1bmN0aW9uKCkge1xuICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzAnKTtcbiAqXG4gKiAgICAgICBlbGVtZW50KGJ5LmlkKCduZy1jaGFuZ2UtZXhhbXBsZTEnKSkuY2xpY2soKTtcbiAqXG4gKiAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvQ29udGFpbignMScpO1xuICogICAgICAgZXhwZWN0KGRlYnVnLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gKiAgICAgfSk7XG4gKlxuICogICAgIGl0KCdzaG91bGQgbm90IGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGlmIGNoYW5naW5nIGZyb20gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIGVsZW1lbnQoYnkuaWQoJ25nLWNoYW5nZS1leGFtcGxlMicpKS5jbGljaygpO1xuXG4gKiAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvQ29udGFpbignMCcpO1xuICogICAgICAgZXhwZWN0KGRlYnVnLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gKiAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nQ2hhbmdlRGlyZWN0aXZlID0gdmFsdWVGbih7XG4gIHJlc3RyaWN0OiAnQScsXG4gIHJlcXVpcmU6ICduZ01vZGVsJyxcbiAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwpIHtcbiAgICBjdHJsLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICBzY29wZS4kZXZhbChhdHRyLm5nQ2hhbmdlKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8qIGV4cG9ydGVkXG4gIG5nQ2xhc3NEaXJlY3RpdmUsXG4gIG5nQ2xhc3NFdmVuRGlyZWN0aXZlLFxuICBuZ0NsYXNzT2RkRGlyZWN0aXZlXG4qL1xuXG5mdW5jdGlvbiBjbGFzc0RpcmVjdGl2ZShuYW1lLCBzZWxlY3Rvcikge1xuICBuYW1lID0gJ25nQ2xhc3MnICsgbmFtZTtcbiAgdmFyIGluZGV4V2F0Y2hFeHByZXNzaW9uO1xuXG4gIHJldHVybiBbJyRwYXJzZScsIGZ1bmN0aW9uKCRwYXJzZSkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0FDJyxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIHZhciBleHByZXNzaW9uID0gYXR0cltuYW1lXS50cmltKCk7XG4gICAgICAgIHZhciBpc09uZVRpbWUgPSAoZXhwcmVzc2lvbi5jaGFyQXQoMCkgPT09ICc6JykgJiYgKGV4cHJlc3Npb24uY2hhckF0KDEpID09PSAnOicpO1xuXG4gICAgICAgIHZhciB3YXRjaEludGVyY2VwdG9yID0gaXNPbmVUaW1lID8gdG9GbGF0VmFsdWUgOiB0b0NsYXNzU3RyaW5nO1xuICAgICAgICB2YXIgd2F0Y2hFeHByZXNzaW9uID0gJHBhcnNlKGV4cHJlc3Npb24sIHdhdGNoSW50ZXJjZXB0b3IpO1xuICAgICAgICB2YXIgd2F0Y2hBY3Rpb24gPSBpc09uZVRpbWUgPyBuZ0NsYXNzT25lVGltZVdhdGNoQWN0aW9uIDogbmdDbGFzc1dhdGNoQWN0aW9uO1xuXG4gICAgICAgIHZhciBjbGFzc0NvdW50cyA9IGVsZW1lbnQuZGF0YSgnJGNsYXNzQ291bnRzJyk7XG4gICAgICAgIHZhciBvbGRNb2R1bG8gPSB0cnVlO1xuICAgICAgICB2YXIgb2xkQ2xhc3NTdHJpbmc7XG5cbiAgICAgICAgaWYgKCFjbGFzc0NvdW50cykge1xuICAgICAgICAgIC8vIFVzZSBjcmVhdGVNYXAoKSB0byBwcmV2ZW50IGNsYXNzIGFzc3VtcHRpb25zIGludm9sdmluZyBwcm9wZXJ0eVxuICAgICAgICAgIC8vIG5hbWVzIGluIE9iamVjdC5wcm90b3R5cGVcbiAgICAgICAgICBjbGFzc0NvdW50cyA9IGNyZWF0ZU1hcCgpO1xuICAgICAgICAgIGVsZW1lbnQuZGF0YSgnJGNsYXNzQ291bnRzJywgY2xhc3NDb3VudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5hbWUgIT09ICduZ0NsYXNzJykge1xuICAgICAgICAgIGlmICghaW5kZXhXYXRjaEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGluZGV4V2F0Y2hFeHByZXNzaW9uID0gJHBhcnNlKCckaW5kZXgnLCBmdW5jdGlvbiBtb2R1bG9Ud28oJGluZGV4KSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgICAgIHJldHVybiAkaW5kZXggJiAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NvcGUuJHdhdGNoKGluZGV4V2F0Y2hFeHByZXNzaW9uLCBuZ0NsYXNzSW5kZXhXYXRjaEFjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBzY29wZS4kd2F0Y2god2F0Y2hFeHByZXNzaW9uLCB3YXRjaEFjdGlvbiwgaXNPbmVUaW1lKTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRDbGFzc2VzKGNsYXNzU3RyaW5nKSB7XG4gICAgICAgICAgY2xhc3NTdHJpbmcgPSBkaWdlc3RDbGFzc0NvdW50cyhzcGxpdChjbGFzc1N0cmluZyksIDEpO1xuICAgICAgICAgIGF0dHIuJGFkZENsYXNzKGNsYXNzU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZUNsYXNzZXMoY2xhc3NTdHJpbmcpIHtcbiAgICAgICAgICBjbGFzc1N0cmluZyA9IGRpZ2VzdENsYXNzQ291bnRzKHNwbGl0KGNsYXNzU3RyaW5nKSwgLTEpO1xuICAgICAgICAgIGF0dHIuJHJlbW92ZUNsYXNzKGNsYXNzU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNsYXNzZXMob2xkQ2xhc3NTdHJpbmcsIG5ld0NsYXNzU3RyaW5nKSB7XG4gICAgICAgICAgdmFyIG9sZENsYXNzQXJyYXkgPSBzcGxpdChvbGRDbGFzc1N0cmluZyk7XG4gICAgICAgICAgdmFyIG5ld0NsYXNzQXJyYXkgPSBzcGxpdChuZXdDbGFzc1N0cmluZyk7XG5cbiAgICAgICAgICB2YXIgdG9SZW1vdmVBcnJheSA9IGFycmF5RGlmZmVyZW5jZShvbGRDbGFzc0FycmF5LCBuZXdDbGFzc0FycmF5KTtcbiAgICAgICAgICB2YXIgdG9BZGRBcnJheSA9IGFycmF5RGlmZmVyZW5jZShuZXdDbGFzc0FycmF5LCBvbGRDbGFzc0FycmF5KTtcblxuICAgICAgICAgIHZhciB0b1JlbW92ZVN0cmluZyA9IGRpZ2VzdENsYXNzQ291bnRzKHRvUmVtb3ZlQXJyYXksIC0xKTtcbiAgICAgICAgICB2YXIgdG9BZGRTdHJpbmcgPSBkaWdlc3RDbGFzc0NvdW50cyh0b0FkZEFycmF5LCAxKTtcblxuICAgICAgICAgIGF0dHIuJGFkZENsYXNzKHRvQWRkU3RyaW5nKTtcbiAgICAgICAgICBhdHRyLiRyZW1vdmVDbGFzcyh0b1JlbW92ZVN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkaWdlc3RDbGFzc0NvdW50cyhjbGFzc0FycmF5LCBjb3VudCkge1xuICAgICAgICAgIHZhciBjbGFzc2VzVG9VcGRhdGUgPSBbXTtcblxuICAgICAgICAgIGZvckVhY2goY2xhc3NBcnJheSwgZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBpZiAoY291bnQgPiAwIHx8IGNsYXNzQ291bnRzW2NsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgY2xhc3NDb3VudHNbY2xhc3NOYW1lXSA9IChjbGFzc0NvdW50c1tjbGFzc05hbWVdIHx8IDApICsgY291bnQ7XG4gICAgICAgICAgICAgIGlmIChjbGFzc0NvdW50c1tjbGFzc05hbWVdID09PSArKGNvdW50ID4gMCkpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzVG9VcGRhdGUucHVzaChjbGFzc05hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gY2xhc3Nlc1RvVXBkYXRlLmpvaW4oJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG5nQ2xhc3NJbmRleFdhdGNoQWN0aW9uKG5ld01vZHVsbykge1xuICAgICAgICAgIC8vIFRoaXMgd2F0Y2gtYWN0aW9uIHNob3VsZCBydW4gYmVmb3JlIHRoZSBgbmdDbGFzc1tPbmVUaW1lXVdhdGNoQWN0aW9uKClgLCB0aHVzIGl0XG4gICAgICAgICAgLy8gYWRkcy9yZW1vdmVzIGBvbGRDbGFzc1N0cmluZ2AuIElmIHRoZSBgbmdDbGFzc2AgZXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhcyB3ZWxsLCB0aGVcbiAgICAgICAgICAvLyBgbmdDbGFzc1tPbmVUaW1lXVdhdGNoQWN0aW9uKClgIHdpbGwgdXBkYXRlIHRoZSBjbGFzc2VzLlxuICAgICAgICAgIGlmIChuZXdNb2R1bG8gPT09IHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBhZGRDbGFzc2VzKG9sZENsYXNzU3RyaW5nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3NlcyhvbGRDbGFzc1N0cmluZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2xkTW9kdWxvID0gbmV3TW9kdWxvO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbmdDbGFzc09uZVRpbWVXYXRjaEFjdGlvbihuZXdDbGFzc1ZhbHVlKSB7XG4gICAgICAgICAgdmFyIG5ld0NsYXNzU3RyaW5nID0gdG9DbGFzc1N0cmluZyhuZXdDbGFzc1ZhbHVlKTtcblxuICAgICAgICAgIGlmIChuZXdDbGFzc1N0cmluZyAhPT0gb2xkQ2xhc3NTdHJpbmcpIHtcbiAgICAgICAgICAgIG5nQ2xhc3NXYXRjaEFjdGlvbihuZXdDbGFzc1N0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbmdDbGFzc1dhdGNoQWN0aW9uKG5ld0NsYXNzU3RyaW5nKSB7XG4gICAgICAgICAgaWYgKG9sZE1vZHVsbyA9PT0gc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHVwZGF0ZUNsYXNzZXMob2xkQ2xhc3NTdHJpbmcsIG5ld0NsYXNzU3RyaW5nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvbGRDbGFzc1N0cmluZyA9IG5ld0NsYXNzU3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfV07XG5cbiAgLy8gSGVscGVyc1xuICBmdW5jdGlvbiBhcnJheURpZmZlcmVuY2UodG9rZW5zMSwgdG9rZW5zMikge1xuICAgIGlmICghdG9rZW5zMSB8fCAhdG9rZW5zMS5sZW5ndGgpIHJldHVybiBbXTtcbiAgICBpZiAoIXRva2VuczIgfHwgIXRva2VuczIubGVuZ3RoKSByZXR1cm4gdG9rZW5zMTtcblxuICAgIHZhciB2YWx1ZXMgPSBbXTtcblxuICAgIG91dGVyOlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zMS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRva2VuID0gdG9rZW5zMVtpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG9rZW5zMi5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodG9rZW4gPT09IHRva2VuczJbal0pIGNvbnRpbnVlIG91dGVyO1xuICAgICAgfVxuICAgICAgdmFsdWVzLnB1c2godG9rZW4pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBmdW5jdGlvbiBzcGxpdChjbGFzc1N0cmluZykge1xuICAgIHJldHVybiBjbGFzc1N0cmluZyAmJiBjbGFzc1N0cmluZy5zcGxpdCgnICcpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9DbGFzc1N0cmluZyhjbGFzc1ZhbHVlKSB7XG4gICAgdmFyIGNsYXNzU3RyaW5nID0gY2xhc3NWYWx1ZTtcblxuICAgIGlmIChpc0FycmF5KGNsYXNzVmFsdWUpKSB7XG4gICAgICBjbGFzc1N0cmluZyA9IGNsYXNzVmFsdWUubWFwKHRvQ2xhc3NTdHJpbmcpLmpvaW4oJyAnKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGNsYXNzVmFsdWUpKSB7XG4gICAgICBjbGFzc1N0cmluZyA9IE9iamVjdC5rZXlzKGNsYXNzVmFsdWUpLlxuICAgICAgICBmaWx0ZXIoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBjbGFzc1ZhbHVlW2tleV07IH0pLlxuICAgICAgICBqb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzU3RyaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9GbGF0VmFsdWUoY2xhc3NWYWx1ZSkge1xuICAgIHZhciBmbGF0VmFsdWUgPSBjbGFzc1ZhbHVlO1xuXG4gICAgaWYgKGlzQXJyYXkoY2xhc3NWYWx1ZSkpIHtcbiAgICAgIGZsYXRWYWx1ZSA9IGNsYXNzVmFsdWUubWFwKHRvRmxhdFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGNsYXNzVmFsdWUpKSB7XG4gICAgICB2YXIgaGFzVW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgICAgIGZsYXRWYWx1ZSA9IE9iamVjdC5rZXlzKGNsYXNzVmFsdWUpLmZpbHRlcihmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gY2xhc3NWYWx1ZVtrZXldO1xuXG4gICAgICAgIGlmICghaGFzVW5kZWZpbmVkICYmIGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgIGhhc1VuZGVmaW5lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGhhc1VuZGVmaW5lZCkge1xuICAgICAgICAvLyBQcmV2ZW50IHRoZSBgb25lVGltZUxpdGVyYWxXYXRjaEludGVyY2VwdG9yYCBmcm9tIHVucmVnaXN0ZXJpbmdcbiAgICAgICAgLy8gdGhlIHdhdGNoZXIsIGJ5IGluY2x1ZGluZyBhdCBsZWFzdCBvbmUgYHVuZGVmaW5lZGAgdmFsdWUuXG4gICAgICAgIGZsYXRWYWx1ZS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXRWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ2xhc3NcbiAqIEByZXN0cmljdCBBQ1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ0NsYXNzYCBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseSBzZXQgQ1NTIGNsYXNzZXMgb24gYW4gSFRNTCBlbGVtZW50IGJ5IGRhdGFiaW5kaW5nXG4gKiBhbiBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyBhbGwgY2xhc3NlcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBUaGUgZGlyZWN0aXZlIG9wZXJhdGVzIGluIHRocmVlIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24gd2hpY2ggb2YgdGhyZWUgdHlwZXMgdGhlIGV4cHJlc3Npb25cbiAqIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiAxLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZSBzdHJpbmcgc2hvdWxkIGJlIG9uZSBvciBtb3JlIHNwYWNlLWRlbGltaXRlZCBjbGFzc1xuICogbmFtZXMuXG4gKlxuICogMi4gSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGFuIG9iamVjdCwgdGhlbiBmb3IgZWFjaCBrZXktdmFsdWUgcGFpciBvZiB0aGVcbiAqIG9iamVjdCB3aXRoIGEgdHJ1dGh5IHZhbHVlIHRoZSBjb3JyZXNwb25kaW5nIGtleSBpcyB1c2VkIGFzIGEgY2xhc3MgbmFtZS5cbiAqXG4gKiAzLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYW4gYXJyYXksIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgc2hvdWxkIGVpdGhlciBiZSBhIHN0cmluZyBhcyBpblxuICogdHlwZSAxIG9yIGFuIG9iamVjdCBhcyBpbiB0eXBlIDIuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIG1peCBzdHJpbmdzIGFuZCBvYmplY3RzIHRvZ2V0aGVyIGluIGFuIGFycmF5XG4gKiB0byBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciB3aGF0IENTUyBjbGFzc2VzIGFwcGVhci4gU2VlIHRoZSBjb2RlIGJlbG93IGZvciBhbiBleGFtcGxlIG9mIHRoaXMuXG4gKlxuICpcbiAqIFRoZSBkaXJlY3RpdmUgd29uJ3QgYWRkIGR1cGxpY2F0ZSBjbGFzc2VzIGlmIGEgcGFydGljdWxhciBjbGFzcyB3YXMgYWxyZWFkeSBzZXQuXG4gKlxuICogV2hlbiB0aGUgZXhwcmVzc2lvbiBjaGFuZ2VzLCB0aGUgcHJldmlvdXNseSBhZGRlZCBjbGFzc2VzIGFyZSByZW1vdmVkIGFuZCBvbmx5IHRoZW4gYXJlIHRoZVxuICogbmV3IGNsYXNzZXMgYWRkZWQuXG4gKlxuICogQGtub3duSXNzdWVcbiAqIFlvdSBzaG91bGQgbm90IHVzZSB7QGxpbmsgZ3VpZGUvaW50ZXJwb2xhdGlvbiBpbnRlcnBvbGF0aW9ufSBpbiB0aGUgdmFsdWUgb2YgdGhlIGBjbGFzc2BcbiAqIGF0dHJpYnV0ZSwgd2hlbiB1c2luZyB0aGUgYG5nQ2xhc3NgIGRpcmVjdGl2ZSBvbiB0aGUgc2FtZSBlbGVtZW50LlxuICogU2VlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uI2tub3duLWlzc3VlcyBoZXJlfSBmb3IgbW9yZSBpbmZvLlxuICpcbiAqIEBhbmltYXRpb25zXG4gKiB8IEFuaW1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHwgT2NjdXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2FkZENsYXNzIGFkZENsYXNzfSAgICAgICB8IGp1c3QgYmVmb3JlIHRoZSBjbGFzcyBpcyBhcHBsaWVkIHRvIHRoZSBlbGVtZW50ICAgfFxuICogfCB7QGxpbmsgbmcuJGFuaW1hdGUjcmVtb3ZlQ2xhc3MgcmVtb3ZlQ2xhc3N9IHwganVzdCBiZWZvcmUgdGhlIGNsYXNzIGlzIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudCB8XG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2xhc3Mge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4gVGhlIHJlc3VsdFxuICogICBvZiB0aGUgZXZhbHVhdGlvbiBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHNwYWNlIGRlbGltaXRlZCBjbGFzc1xuICogICBuYW1lcywgYW4gYXJyYXksIG9yIGEgbWFwIG9mIGNsYXNzIG5hbWVzIHRvIGJvb2xlYW4gdmFsdWVzLiBJbiB0aGUgY2FzZSBvZiBhIG1hcCwgdGhlXG4gKiAgIG5hbWVzIG9mIHRoZSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgdHJ1dGh5IHdpbGwgYmUgYWRkZWQgYXMgY3NzIGNsYXNzZXMgdG8gdGhlXG4gKiAgIGVsZW1lbnQuXG4gKlxuICogQGV4YW1wbGUgRXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBiYXNpYyBiaW5kaW5ncyB2aWEgbmdDbGFzcyBkaXJlY3RpdmUuXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctY2xhc3NcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8cCBuZy1jbGFzcz1cIntzdHJpa2U6IGRlbGV0ZWQsIGJvbGQ6IGltcG9ydGFudCwgJ2hhcy1lcnJvcic6IGVycm9yfVwiPk1hcCBTeW50YXggRXhhbXBsZTwvcD5cbiAgICAgICA8bGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwiZGVsZXRlZFwiPlxuICAgICAgICAgIGRlbGV0ZWQgKGFwcGx5IFwic3RyaWtlXCIgY2xhc3MpXG4gICAgICAgPC9sYWJlbD48YnI+XG4gICAgICAgPGxhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImltcG9ydGFudFwiPlxuICAgICAgICAgIGltcG9ydGFudCAoYXBwbHkgXCJib2xkXCIgY2xhc3MpXG4gICAgICAgPC9sYWJlbD48YnI+XG4gICAgICAgPGxhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImVycm9yXCI+XG4gICAgICAgICAgZXJyb3IgKGFwcGx5IFwiaGFzLWVycm9yXCIgY2xhc3MpXG4gICAgICAgPC9sYWJlbD5cbiAgICAgICA8aHI+XG4gICAgICAgPHAgbmctY2xhc3M9XCJzdHlsZVwiPlVzaW5nIFN0cmluZyBTeW50YXg8L3A+XG4gICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJzdHlsZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZTogYm9sZCBzdHJpa2UgcmVkXCIgYXJpYS1sYWJlbD1cIlR5cGU6IGJvbGQgc3RyaWtlIHJlZFwiPlxuICAgICAgIDxocj5cbiAgICAgICA8cCBuZy1jbGFzcz1cIltzdHlsZTEsIHN0eWxlMiwgc3R5bGUzXVwiPlVzaW5nIEFycmF5IFN5bnRheDwvcD5cbiAgICAgICA8aW5wdXQgbmctbW9kZWw9XCJzdHlsZTFcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGU6IGJvbGQsIHN0cmlrZSBvciByZWRcIiBhcmlhLWxhYmVsPVwiVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZFwiPjxicj5cbiAgICAgICA8aW5wdXQgbmctbW9kZWw9XCJzdHlsZTJcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGU6IGJvbGQsIHN0cmlrZSBvciByZWRcIiBhcmlhLWxhYmVsPVwiVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZCAyXCI+PGJyPlxuICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cInN0eWxlM1wiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZFwiIGFyaWEtbGFiZWw9XCJUeXBlOiBib2xkLCBzdHJpa2Ugb3IgcmVkIDNcIj48YnI+XG4gICAgICAgPGhyPlxuICAgICAgIDxwIG5nLWNsYXNzPVwiW3N0eWxlNCwge29yYW5nZTogd2FybmluZ31dXCI+VXNpbmcgQXJyYXkgYW5kIE1hcCBTeW50YXg8L3A+XG4gICAgICAgPGlucHV0IG5nLW1vZGVsPVwic3R5bGU0XCIgcGxhY2Vob2xkZXI9XCJUeXBlOiBib2xkLCBzdHJpa2VcIiBhcmlhLWxhYmVsPVwiVHlwZTogYm9sZCwgc3RyaWtlXCI+PGJyPlxuICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJ3YXJuaW5nXCI+IHdhcm5pbmcgKGFwcGx5IFwib3JhbmdlXCIgY2xhc3MpPC9sYWJlbD5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgLnN0cmlrZSB7XG4gICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xuICAgICAgIH1cbiAgICAgICAuYm9sZCB7XG4gICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgIH1cbiAgICAgICAucmVkIHtcbiAgICAgICAgICAgY29sb3I6IHJlZDtcbiAgICAgICB9XG4gICAgICAgLmhhcy1lcnJvciB7XG4gICAgICAgICAgIGNvbG9yOiByZWQ7XG4gICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHllbGxvdztcbiAgICAgICB9XG4gICAgICAgLm9yYW5nZSB7XG4gICAgICAgICAgIGNvbG9yOiBvcmFuZ2U7XG4gICAgICAgfVxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICB2YXIgcHMgPSBlbGVtZW50LmFsbChieS5jc3MoJ3AnKSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIGxldCB5b3UgdG9nZ2xlIHRoZSBjbGFzcycsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICBleHBlY3QocHMuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLm5vdC50b01hdGNoKC9ib2xkLyk7XG4gICAgICAgICBleHBlY3QocHMuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLm5vdC50b01hdGNoKC9oYXMtZXJyb3IvKTtcblxuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnaW1wb3J0YW50JykpLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QocHMuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvTWF0Y2goL2JvbGQvKTtcblxuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnZXJyb3InKSkuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChwcy5maXJzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9NYXRjaCgvaGFzLWVycm9yLyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIGxldCB5b3UgdG9nZ2xlIHN0cmluZyBleGFtcGxlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QocHMuZ2V0KDEpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9CZSgnJyk7XG4gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZScpKS5jbGVhcigpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGUnKSkuc2VuZEtleXMoJ3JlZCcpO1xuICAgICAgICAgZXhwZWN0KHBzLmdldCgxKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJ3JlZCcpO1xuICAgICAgIH0pO1xuXG4gICAgICAgaXQoJ2FycmF5IGV4YW1wbGUgc2hvdWxkIGhhdmUgMyBjbGFzc2VzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QocHMuZ2V0KDIpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9CZSgnJyk7XG4gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZTEnKSkuc2VuZEtleXMoJ2JvbGQnKTtcbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlMicpKS5zZW5kS2V5cygnc3RyaWtlJyk7XG4gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZTMnKSkuc2VuZEtleXMoJ3JlZCcpO1xuICAgICAgICAgZXhwZWN0KHBzLmdldCgyKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJ2JvbGQgc3RyaWtlIHJlZCcpO1xuICAgICAgIH0pO1xuXG4gICAgICAgaXQoJ2FycmF5IHdpdGggbWFwIGV4YW1wbGUgc2hvdWxkIGhhdmUgMiBjbGFzc2VzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QocHMubGFzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9CZSgnJyk7XG4gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZTQnKSkuc2VuZEtleXMoJ2JvbGQnKTtcbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3dhcm5pbmcnKSkuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChwcy5sYXN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCdib2xkIG9yYW5nZScpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG5cbiAgICMjIEFuaW1hdGlvbnNcblxuICAgVGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIGhvdyB0byBwZXJmb3JtIGFuaW1hdGlvbnMgdXNpbmcgbmdDbGFzcy5cblxuICAgPGV4YW1wbGUgbW9kdWxlPVwibmdBbmltYXRlXCIgZGVwcz1cImFuZ3VsYXItYW5pbWF0ZS5qc1wiIGFuaW1hdGlvbnM9XCJ0cnVlXCIgbmFtZT1cIm5nLWNsYXNzXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8aW5wdXQgaWQ9XCJzZXRidG5cIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJzZXRcIiBuZy1jbGljaz1cIm15VmFyPSdteS1jbGFzcydcIj5cbiAgICAgIDxpbnB1dCBpZD1cImNsZWFyYnRuXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiY2xlYXJcIiBuZy1jbGljaz1cIm15VmFyPScnXCI+XG4gICAgICA8YnI+XG4gICAgICA8c3BhbiBjbGFzcz1cImJhc2UtY2xhc3NcIiBuZy1jbGFzcz1cIm15VmFyXCI+U2FtcGxlIFRleHQ8L3NwYW4+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIC5iYXNlLWNsYXNzIHtcbiAgICAgICAgIHRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMC41cztcbiAgICAgICB9XG5cbiAgICAgICAuYmFzZS1jbGFzcy5teS1jbGFzcyB7XG4gICAgICAgICBjb2xvcjogcmVkO1xuICAgICAgICAgZm9udC1zaXplOjNlbTtcbiAgICAgICB9XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3MnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmJhc2UtY2xhc3MnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QuXG4gICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7XG5cbiAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ3NldGJ0bicpKS5jbGljaygpO1xuXG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJy5iYXNlLWNsYXNzJykpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkuXG4gICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7XG5cbiAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2NsZWFyYnRuJykpLmNsaWNrKCk7XG5cbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmJhc2UtY2xhc3MnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QuXG4gICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cblxuXG4gICAjIyBuZ0NsYXNzIGFuZCBwcmUtZXhpc3RpbmcgQ1NTMyBUcmFuc2l0aW9ucy9BbmltYXRpb25zXG4gICBUaGUgbmdDbGFzcyBkaXJlY3RpdmUgc3RpbGwgc3VwcG9ydHMgQ1NTMyBUcmFuc2l0aW9ucy9BbmltYXRpb25zIGV2ZW4gaWYgdGhleSBkbyBub3QgZm9sbG93IHRoZSBuZ0FuaW1hdGUgQ1NTIG5hbWluZyBzdHJ1Y3R1cmUuXG4gICBVcG9uIGFuaW1hdGlvbiBuZ0FuaW1hdGUgd2lsbCBhcHBseSBzdXBwbGVtZW50YXJ5IENTUyBjbGFzc2VzIHRvIHRyYWNrIHRoZSBzdGFydCBhbmQgZW5kIG9mIGFuIGFuaW1hdGlvbiwgYnV0IHRoaXMgd2lsbCBub3QgaGluZGVyXG4gICBhbnkgcHJlLWV4aXN0aW5nIENTUyB0cmFuc2l0aW9ucyBhbHJlYWR5IG9uIHRoZSBlbGVtZW50LiBUbyBnZXQgYW4gaWRlYSBvZiB3aGF0IGhhcHBlbnMgZHVyaW5nIGEgY2xhc3MtYmFzZWQgYW5pbWF0aW9uLCBiZSBzdXJlXG4gICB0byB2aWV3IHRoZSBzdGVwIGJ5IHN0ZXAgZGV0YWlscyBvZiB7QGxpbmsgJGFuaW1hdGUjYWRkQ2xhc3MgJGFuaW1hdGUuYWRkQ2xhc3N9IGFuZFxuICAge0BsaW5rICRhbmltYXRlI3JlbW92ZUNsYXNzICRhbmltYXRlLnJlbW92ZUNsYXNzfS5cbiAqL1xudmFyIG5nQ2xhc3NEaXJlY3RpdmUgPSBjbGFzc0RpcmVjdGl2ZSgnJywgdHJ1ZSk7XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDbGFzc09kZFxuICogQHJlc3RyaWN0IEFDXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nQ2xhc3NPZGRgIGFuZCBgbmdDbGFzc0V2ZW5gIGRpcmVjdGl2ZXMgd29yayBleGFjdGx5IGFzXG4gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xhc3MgbmdDbGFzc30sIGV4Y2VwdCB0aGV5IHdvcmsgaW5cbiAqIGNvbmp1bmN0aW9uIHdpdGggYG5nUmVwZWF0YCBhbmQgdGFrZSBlZmZlY3Qgb25seSBvbiBvZGQgKGV2ZW4pIHJvd3MuXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgY2FuIGJlIGFwcGxpZWQgb25seSB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuXG4gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IG5nUmVwZWF0fS5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDbGFzc09kZCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLiBUaGUgcmVzdWx0XG4gKiAgIG9mIHRoZSBldmFsdWF0aW9uIGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgc3BhY2UgZGVsaW1pdGVkIGNsYXNzIG5hbWVzIG9yIGFuIGFycmF5LlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctY2xhc3Mtb2RkXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxvbCBuZy1pbml0PVwibmFtZXM9WydKb2huJywgJ01hcnknLCAnQ2F0ZScsICdTdXonXVwiPlxuICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9XCJuYW1lIGluIG5hbWVzXCI+XG4gICAgICAgICAgIDxzcGFuIG5nLWNsYXNzLW9kZD1cIidvZGQnXCIgbmctY2xhc3MtZXZlbj1cIidldmVuJ1wiPlxuICAgICAgICAgICAgIHt7bmFtZX19XG4gICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L29sPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICAub2RkIHtcbiAgICAgICAgIGNvbG9yOiByZWQ7XG4gICAgICAgfVxuICAgICAgIC5ldmVuIHtcbiAgICAgICAgIGNvbG9yOiBibHVlO1xuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1jbGFzcy1vZGQgYW5kIG5nLWNsYXNzLWV2ZW4nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LnJlcGVhdGVyKCduYW1lIGluIG5hbWVzJykucm93KDApLmNvbHVtbignbmFtZScpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLlxuICAgICAgICAgICB0b01hdGNoKC9vZGQvKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LnJlcGVhdGVyKCduYW1lIGluIG5hbWVzJykucm93KDEpLmNvbHVtbignbmFtZScpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLlxuICAgICAgICAgICB0b01hdGNoKC9ldmVuLyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nQ2xhc3NPZGREaXJlY3RpdmUgPSBjbGFzc0RpcmVjdGl2ZSgnT2RkJywgMCk7XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDbGFzc0V2ZW5cbiAqIEByZXN0cmljdCBBQ1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ0NsYXNzT2RkYCBhbmQgYG5nQ2xhc3NFdmVuYCBkaXJlY3RpdmVzIHdvcmsgZXhhY3RseSBhc1xuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsYXNzIG5nQ2xhc3N9LCBleGNlcHQgdGhleSB3b3JrIGluXG4gKiBjb25qdW5jdGlvbiB3aXRoIGBuZ1JlcGVhdGAgYW5kIHRha2UgZWZmZWN0IG9ubHkgb24gb2RkIChldmVuKSByb3dzLlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSBhcHBsaWVkIG9ubHkgd2l0aGluIHRoZSBzY29wZSBvZiBhblxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBuZ1JlcGVhdH0uXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2xhc3NFdmVuIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuIFRoZVxuICogICByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24gY2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBzcGFjZSBkZWxpbWl0ZWQgY2xhc3MgbmFtZXMgb3IgYW4gYXJyYXkuXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1jbGFzcy1ldmVuXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxvbCBuZy1pbml0PVwibmFtZXM9WydKb2huJywgJ01hcnknLCAnQ2F0ZScsICdTdXonXVwiPlxuICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9XCJuYW1lIGluIG5hbWVzXCI+XG4gICAgICAgICAgIDxzcGFuIG5nLWNsYXNzLW9kZD1cIidvZGQnXCIgbmctY2xhc3MtZXZlbj1cIidldmVuJ1wiPlxuICAgICAgICAgICAgIHt7bmFtZX19ICZuYnNwOyAmbmJzcDsgJm5ic3A7XG4gICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L29sPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICAub2RkIHtcbiAgICAgICAgIGNvbG9yOiByZWQ7XG4gICAgICAgfVxuICAgICAgIC5ldmVuIHtcbiAgICAgICAgIGNvbG9yOiBibHVlO1xuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1jbGFzcy1vZGQgYW5kIG5nLWNsYXNzLWV2ZW4nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LnJlcGVhdGVyKCduYW1lIGluIG5hbWVzJykucm93KDApLmNvbHVtbignbmFtZScpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLlxuICAgICAgICAgICB0b01hdGNoKC9vZGQvKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LnJlcGVhdGVyKCduYW1lIGluIG5hbWVzJykucm93KDEpLmNvbHVtbignbmFtZScpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLlxuICAgICAgICAgICB0b01hdGNoKC9ldmVuLyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nQ2xhc3NFdmVuRGlyZWN0aXZlID0gY2xhc3NEaXJlY3RpdmUoJ0V2ZW4nLCAxKTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0Nsb2FrXG4gKiBAcmVzdHJpY3QgQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdDbG9ha2AgZGlyZWN0aXZlIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgQW5ndWxhciBodG1sIHRlbXBsYXRlIGZyb20gYmVpbmcgYnJpZWZseVxuICogZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIGluIGl0cyByYXcgKHVuY29tcGlsZWQpIGZvcm0gd2hpbGUgeW91ciBhcHBsaWNhdGlvbiBpcyBsb2FkaW5nLiBVc2UgdGhpc1xuICogZGlyZWN0aXZlIHRvIGF2b2lkIHRoZSB1bmRlc2lyYWJsZSBmbGlja2VyIGVmZmVjdCBjYXVzZWQgYnkgdGhlIGh0bWwgdGVtcGxhdGUgZGlzcGxheS5cbiAqXG4gKiBUaGUgZGlyZWN0aXZlIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBgPGJvZHk+YCBlbGVtZW50LCBidXQgdGhlIHByZWZlcnJlZCB1c2FnZSBpcyB0byBhcHBseVxuICogbXVsdGlwbGUgYG5nQ2xvYWtgIGRpcmVjdGl2ZXMgdG8gc21hbGwgcG9ydGlvbnMgb2YgdGhlIHBhZ2UgdG8gcGVybWl0IHByb2dyZXNzaXZlIHJlbmRlcmluZ1xuICogb2YgdGhlIGJyb3dzZXIgdmlldy5cbiAqXG4gKiBgbmdDbG9ha2Agd29ya3MgaW4gY29vcGVyYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGNzcyBydWxlIGVtYmVkZGVkIHdpdGhpbiBgYW5ndWxhci5qc2AgYW5kXG4gKiBgYW5ndWxhci5taW4uanNgLlxuICogRm9yIENTUCBtb2RlIHBsZWFzZSBhZGQgYGFuZ3VsYXItY3NwLmNzc2AgdG8geW91ciBodG1sIGZpbGUgKHNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ3NwIG5nQ3NwfSkuXG4gKlxuICogYGBgY3NzXG4gKiBbbmdcXDpjbG9ha10sIFtuZy1jbG9ha10sIFtkYXRhLW5nLWNsb2FrXSwgW3gtbmctY2xvYWtdLCAubmctY2xvYWssIC54LW5nLWNsb2FrIHtcbiAqICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICogfVxuICogYGBgXG4gKlxuICogV2hlbiB0aGlzIGNzcyBydWxlIGlzIGxvYWRlZCBieSB0aGUgYnJvd3NlciwgYWxsIGh0bWwgZWxlbWVudHMgKGluY2x1ZGluZyB0aGVpciBjaGlsZHJlbikgdGhhdFxuICogYXJlIHRhZ2dlZCB3aXRoIHRoZSBgbmdDbG9ha2AgZGlyZWN0aXZlIGFyZSBoaWRkZW4uIFdoZW4gQW5ndWxhciBlbmNvdW50ZXJzIHRoaXMgZGlyZWN0aXZlXG4gKiBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBpdCBkZWxldGVzIHRoZSBgbmdDbG9ha2AgZWxlbWVudCBhdHRyaWJ1dGUsIG1ha2luZ1xuICogdGhlIGNvbXBpbGVkIGVsZW1lbnQgdmlzaWJsZS5cbiAqXG4gKiBGb3IgdGhlIGJlc3QgcmVzdWx0LCB0aGUgYGFuZ3VsYXIuanNgIHNjcmlwdCBtdXN0IGJlIGxvYWRlZCBpbiB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBodG1sXG4gKiBkb2N1bWVudDsgYWx0ZXJuYXRpdmVseSwgdGhlIGNzcyBydWxlIGFib3ZlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGV4dGVybmFsIHN0eWxlc2hlZXQgb2YgdGhlXG4gKiBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWNsb2FrXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJ0ZW1wbGF0ZTFcIiBuZy1jbG9haz57eyAnaGVsbG8nIH19PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJ0ZW1wbGF0ZTJcIiBjbGFzcz1cIm5nLWNsb2FrXCI+e3sgJ3dvcmxkJyB9fTwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIHJlbW92ZSB0aGUgdGVtcGxhdGUgZGlyZWN0aXZlIGFuZCBjc3MgY2xhc3MnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdCgkKCcjdGVtcGxhdGUxJykuZ2V0QXR0cmlidXRlKCduZy1jbG9haycpKS5cbiAgICAgICAgICAgdG9CZU51bGwoKTtcbiAgICAgICAgIGV4cGVjdCgkKCcjdGVtcGxhdGUyJykuZ2V0QXR0cmlidXRlKCduZy1jbG9haycpKS5cbiAgICAgICAgICAgdG9CZU51bGwoKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICpcbiAqL1xudmFyIG5nQ2xvYWtEaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7XG4gIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHtcbiAgICBhdHRyLiRzZXQoJ25nQ2xvYWsnLCB1bmRlZmluZWQpO1xuICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ25nLWNsb2FrJyk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ29udHJvbGxlclxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZSBhdHRhY2hlcyBhIGNvbnRyb2xsZXIgY2xhc3MgdG8gdGhlIHZpZXcuIFRoaXMgaXMgYSBrZXkgYXNwZWN0IG9mIGhvdyBhbmd1bGFyXG4gKiBzdXBwb3J0cyB0aGUgcHJpbmNpcGxlcyBiZWhpbmQgdGhlIE1vZGVsLVZpZXctQ29udHJvbGxlciBkZXNpZ24gcGF0dGVybi5cbiAqXG4gKiBNVkMgY29tcG9uZW50cyBpbiBhbmd1bGFyOlxuICpcbiAqICogTW9kZWwg4oCUIE1vZGVscyBhcmUgdGhlIHByb3BlcnRpZXMgb2YgYSBzY29wZTsgc2NvcGVzIGFyZSBhdHRhY2hlZCB0byB0aGUgRE9NIHdoZXJlIHNjb3BlIHByb3BlcnRpZXNcbiAqICAgYXJlIGFjY2Vzc2VkIHRocm91Z2ggYmluZGluZ3MuXG4gKiAqIFZpZXcg4oCUIFRoZSB0ZW1wbGF0ZSAoSFRNTCB3aXRoIGRhdGEgYmluZGluZ3MpIHRoYXQgaXMgcmVuZGVyZWQgaW50byB0aGUgVmlldy5cbiAqICogQ29udHJvbGxlciDigJQgVGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBDb250cm9sbGVyIGNsYXNzOyB0aGUgY2xhc3MgY29udGFpbnMgYnVzaW5lc3NcbiAqICAgbG9naWMgYmVoaW5kIHRoZSBhcHBsaWNhdGlvbiB0byBkZWNvcmF0ZSB0aGUgc2NvcGUgd2l0aCBmdW5jdGlvbnMgYW5kIHZhbHVlc1xuICpcbiAqIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gYXR0YWNoIGNvbnRyb2xsZXJzIHRvIHRoZSBET00gYnkgZGVjbGFyaW5nIGl0IGluIGEgcm91dGUgZGVmaW5pdGlvblxuICogdmlhIHRoZSB7QGxpbmsgbmdSb3V0ZS4kcm91dGUgJHJvdXRlfSBzZXJ2aWNlLiBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIGRlY2xhcmUgdGhlIGNvbnRyb2xsZXJcbiAqIGFnYWluIHVzaW5nIGBuZy1jb250cm9sbGVyYCBpbiB0aGUgdGVtcGxhdGUgaXRzZWxmLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBjb250cm9sbGVyIHRvIGJlIGF0dGFjaGVkXG4gKiBhbmQgZXhlY3V0ZWQgdHdpY2UuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAc2NvcGVcbiAqIEBwcmlvcml0eSA1MDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDb250cm9sbGVyIE5hbWUgb2YgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIGN1cnJlbnRcbiAqIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyICRjb250cm9sbGVyUHJvdmlkZXJ9IG9yIGFuIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259XG4gKiB0aGF0IG9uIHRoZSBjdXJyZW50IHNjb3BlIGV2YWx1YXRlcyB0byBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICpcbiAqIFRoZSBjb250cm9sbGVyIGluc3RhbmNlIGNhbiBiZSBwdWJsaXNoZWQgaW50byBhIHNjb3BlIHByb3BlcnR5IGJ5IHNwZWNpZnlpbmdcbiAqIGBuZy1jb250cm9sbGVyPVwiYXMgcHJvcGVydHlOYW1lXCJgLlxuICpcbiAqIElmIHRoZSBjdXJyZW50IGAkY29udHJvbGxlclByb3ZpZGVyYCBpcyBjb25maWd1cmVkIHRvIHVzZSBnbG9iYWxzICh2aWFcbiAqIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyI2FsbG93R2xvYmFscyBgJGNvbnRyb2xsZXJQcm92aWRlci5hbGxvd0dsb2JhbHMoKWAgfSksIHRoaXMgbWF5XG4gKiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgZ2xvYmFsbHkgYWNjZXNzaWJsZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiAoZGVwcmVjYXRlZCwgbm90IHJlY29tbWVuZGVkKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogSGVyZSBpcyBhIHNpbXBsZSBmb3JtIGZvciBlZGl0aW5nIHVzZXIgY29udGFjdCBpbmZvcm1hdGlvbi4gQWRkaW5nLCByZW1vdmluZywgY2xlYXJpbmcsIGFuZFxuICogZ3JlZXRpbmcgYXJlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlIGNvbnRyb2xsZXIgKHNlZSBzb3VyY2UgdGFiKS4gVGhlc2UgbWV0aG9kcyBjYW5cbiAqIGVhc2lseSBiZSBjYWxsZWQgZnJvbSB0aGUgYW5ndWxhciBtYXJrdXAuIEFueSBjaGFuZ2VzIHRvIHRoZSBkYXRhIGFyZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZFxuICogaW4gdGhlIFZpZXcgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBtYW51YWwgdXBkYXRlLlxuICpcbiAqIFR3byBkaWZmZXJlbnQgZGVjbGFyYXRpb24gc3R5bGVzIGFyZSBpbmNsdWRlZCBiZWxvdzpcbiAqXG4gKiAqIG9uZSBiaW5kcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGRpcmVjdGx5IG9udG8gdGhlIGNvbnRyb2xsZXIgdXNpbmcgYHRoaXNgOlxuICogYG5nLWNvbnRyb2xsZXI9XCJTZXR0aW5nc0NvbnRyb2xsZXIxIGFzIHNldHRpbmdzXCJgXG4gKiAqIG9uZSBpbmplY3RzIGAkc2NvcGVgIGludG8gdGhlIGNvbnRyb2xsZXI6XG4gKiBgbmctY29udHJvbGxlcj1cIlNldHRpbmdzQ29udHJvbGxlcjJcImBcbiAqXG4gKiBUaGUgc2Vjb25kIG9wdGlvbiBpcyBtb3JlIGNvbW1vbiBpbiB0aGUgQW5ndWxhciBjb21tdW5pdHksIGFuZCBpcyBnZW5lcmFsbHkgdXNlZCBpbiBib2lsZXJwbGF0ZXNcbiAqIGFuZCBpbiB0aGlzIGd1aWRlLiBIb3dldmVyLCB0aGVyZSBhcmUgYWR2YW50YWdlcyB0byBiaW5kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHkgdG8gdGhlIGNvbnRyb2xsZXJcbiAqIGFuZCBhdm9pZGluZyBzY29wZS5cbiAqXG4gKiAqIFVzaW5nIGBjb250cm9sbGVyIGFzYCBtYWtlcyBpdCBvYnZpb3VzIHdoaWNoIGNvbnRyb2xsZXIgeW91IGFyZSBhY2Nlc3NpbmcgaW4gdGhlIHRlbXBsYXRlIHdoZW5cbiAqIG11bHRpcGxlIGNvbnRyb2xsZXJzIGFwcGx5IHRvIGFuIGVsZW1lbnQuXG4gKiAqIElmIHlvdSBhcmUgd3JpdGluZyB5b3VyIGNvbnRyb2xsZXJzIGFzIGNsYXNzZXMgeW91IGhhdmUgZWFzaWVyIGFjY2VzcyB0byB0aGUgcHJvcGVydGllcyBhbmRcbiAqIG1ldGhvZHMsIHdoaWNoIHdpbGwgYXBwZWFyIG9uIHRoZSBzY29wZSwgZnJvbSBpbnNpZGUgdGhlIGNvbnRyb2xsZXIgY29kZS5cbiAqICogU2luY2UgdGhlcmUgaXMgYWx3YXlzIGEgYC5gIGluIHRoZSBiaW5kaW5ncywgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgcHJvdG90eXBhbFxuICogaW5oZXJpdGFuY2UgbWFza2luZyBwcmltaXRpdmVzLlxuICpcbiAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGBjb250cm9sbGVyIGFzYCBzeW50YXguXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cIm5nQ29udHJvbGxlckFzXCIgbW9kdWxlPVwiY29udHJvbGxlckFzRXhhbXBsZVwiPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgPGRpdiBpZD1cImN0cmwtYXMtZXhtcGxcIiBuZy1jb250cm9sbGVyPVwiU2V0dGluZ3NDb250cm9sbGVyMSBhcyBzZXR0aW5nc1wiPlxuICogICAgICA8bGFiZWw+TmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJzZXR0aW5ncy5uYW1lXCIvPjwvbGFiZWw+XG4gKiAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzZXR0aW5ncy5ncmVldCgpXCI+Z3JlZXQ8L2J1dHRvbj48YnIvPlxuICogICAgICBDb250YWN0OlxuICogICAgICA8dWw+XG4gKiAgICAgICAgPGxpIG5nLXJlcGVhdD1cImNvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHNcIj5cbiAqICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9XCJjb250YWN0LnR5cGVcIiBhcmlhLWxhYmVsPVwiQ29udGFjdCBtZXRob2RcIiBpZD1cInNlbGVjdF97eyRpbmRleH19XCI+XG4gKiAgICAgICAgICAgICA8b3B0aW9uPnBob25lPC9vcHRpb24+XG4gKiAgICAgICAgICAgICA8b3B0aW9uPmVtYWlsPC9vcHRpb24+XG4gKiAgICAgICAgICA8L3NlbGVjdD5cbiAqICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwiY29udGFjdC52YWx1ZVwiIGFyaWEtbGFiZWxsZWRieT1cInNlbGVjdF97eyRpbmRleH19XCIgLz5cbiAqICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzZXR0aW5ncy5jbGVhckNvbnRhY3QoY29udGFjdClcIj5jbGVhcjwvYnV0dG9uPlxuICogICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInNldHRpbmdzLnJlbW92ZUNvbnRhY3QoY29udGFjdClcIiBhcmlhLWxhYmVsPVwiUmVtb3ZlXCI+WDwvYnV0dG9uPlxuICogICAgICAgIDwvbGk+XG4gKiAgICAgICAgPGxpPjxidXR0b24gbmctY2xpY2s9XCJzZXR0aW5ncy5hZGRDb250YWN0KClcIj5hZGQ8L2J1dHRvbj48L2xpPlxuICogICAgIDwvdWw+XG4gKiAgICA8L2Rpdj5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgICBhbmd1bGFyLm1vZHVsZSgnY29udHJvbGxlckFzRXhhbXBsZScsIFtdKVxuICogICAgICAuY29udHJvbGxlcignU2V0dGluZ3NDb250cm9sbGVyMScsIFNldHRpbmdzQ29udHJvbGxlcjEpO1xuICpcbiAqICAgIGZ1bmN0aW9uIFNldHRpbmdzQ29udHJvbGxlcjEoKSB7XG4gKiAgICAgIHRoaXMubmFtZSA9ICdKb2huIFNtaXRoJztcbiAqICAgICAgdGhpcy5jb250YWN0cyA9IFtcbiAqICAgICAgICB7dHlwZTogJ3Bob25lJywgdmFsdWU6ICc0MDggNTU1IDEyMTInfSxcbiAqICAgICAgICB7dHlwZTogJ2VtYWlsJywgdmFsdWU6ICdqb2huLnNtaXRoQGV4YW1wbGUub3JnJ31cbiAqICAgICAgXTtcbiAqICAgIH1cbiAqXG4gKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5ncmVldCA9IGZ1bmN0aW9uKCkge1xuICogICAgICBhbGVydCh0aGlzLm5hbWUpO1xuICogICAgfTtcbiAqXG4gKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5hZGRDb250YWN0ID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgIHRoaXMuY29udGFjdHMucHVzaCh7dHlwZTogJ2VtYWlsJywgdmFsdWU6ICd5b3VybmFtZUBleGFtcGxlLm9yZyd9KTtcbiAqICAgIH07XG4gKlxuICogICAgU2V0dGluZ3NDb250cm9sbGVyMS5wcm90b3R5cGUucmVtb3ZlQ29udGFjdCA9IGZ1bmN0aW9uKGNvbnRhY3RUb1JlbW92ZSkge1xuICogICAgIHZhciBpbmRleCA9IHRoaXMuY29udGFjdHMuaW5kZXhPZihjb250YWN0VG9SZW1vdmUpO1xuICogICAgICB0aGlzLmNvbnRhY3RzLnNwbGljZShpbmRleCwgMSk7XG4gKiAgICB9O1xuICpcbiAqICAgIFNldHRpbmdzQ29udHJvbGxlcjEucHJvdG90eXBlLmNsZWFyQ29udGFjdCA9IGZ1bmN0aW9uKGNvbnRhY3QpIHtcbiAqICAgICAgY29udGFjdC50eXBlID0gJ3Bob25lJztcbiAqICAgICAgY29udGFjdC52YWx1ZSA9ICcnO1xuICogICAgfTtcbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiAgICAgaXQoJ3Nob3VsZCBjaGVjayBjb250cm9sbGVyIGFzJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICB2YXIgY29udGFpbmVyID0gZWxlbWVudChieS5pZCgnY3RybC1hcy1leG1wbCcpKTtcbiAqICAgICAgICAgZXhwZWN0KGNvbnRhaW5lci5lbGVtZW50KGJ5Lm1vZGVsKCdzZXR0aW5ncy5uYW1lJykpXG4gKiAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnSm9obiBTbWl0aCcpO1xuICpcbiAqICAgICAgIHZhciBmaXJzdFJlcGVhdCA9XG4gKiAgICAgICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHMnKS5yb3coMCkpO1xuICogICAgICAgdmFyIHNlY29uZFJlcGVhdCA9XG4gKiAgICAgICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHMnKS5yb3coMSkpO1xuICpcbiAqICAgICAgIGV4cGVjdChmaXJzdFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSlcbiAqICAgICAgICAgICAudG9CZSgnNDA4IDU1NSAxMjEyJyk7XG4gKlxuICogICAgICAgZXhwZWN0KHNlY29uZFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSlcbiAqICAgICAgICAgICAudG9CZSgnam9obi5zbWl0aEBleGFtcGxlLm9yZycpO1xuICpcbiAqICAgICAgIGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkuYnV0dG9uVGV4dCgnY2xlYXInKSkuY2xpY2soKTtcbiAqXG4gKiAgICAgICBleHBlY3QoZmlyc3RSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpXG4gKiAgICAgICAgICAgLnRvQmUoJycpO1xuICpcbiAqICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LmJ1dHRvblRleHQoJ2FkZCcpKS5jbGljaygpO1xuICpcbiAqICAgICAgIGV4cGVjdChjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBzZXR0aW5ncy5jb250YWN0cycpLnJvdygyKSlcbiAqICAgICAgICAgICAuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKVxuICogICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpXG4gKiAgICAgICAgICAgLnRvQmUoJ3lvdXJuYW1lQGV4YW1wbGUub3JnJyk7XG4gKiAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBcImF0dGFjaCB0byBgJHNjb3BlYFwiIHN0eWxlIG9mIGNvbnRyb2xsZXIuXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cIm5nQ29udHJvbGxlclwiIG1vZHVsZT1cImNvbnRyb2xsZXJFeGFtcGxlXCI+XG4gKiAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgPGRpdiBpZD1cImN0cmwtZXhtcGxcIiBuZy1jb250cm9sbGVyPVwiU2V0dGluZ3NDb250cm9sbGVyMlwiPlxuICogICAgIDxsYWJlbD5OYW1lOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm5hbWVcIi8+PC9sYWJlbD5cbiAqICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiZ3JlZXQoKVwiPmdyZWV0PC9idXR0b24+PGJyLz5cbiAqICAgICBDb250YWN0OlxuICogICAgIDx1bD5cbiAqICAgICAgIDxsaSBuZy1yZXBlYXQ9XCJjb250YWN0IGluIGNvbnRhY3RzXCI+XG4gKiAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9XCJjb250YWN0LnR5cGVcIiBpZD1cInNlbGVjdF97eyRpbmRleH19XCI+XG4gKiAgICAgICAgICAgIDxvcHRpb24+cGhvbmU8L29wdGlvbj5cbiAqICAgICAgICAgICAgPG9wdGlvbj5lbWFpbDwvb3B0aW9uPlxuICogICAgICAgICA8L3NlbGVjdD5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJjb250YWN0LnZhbHVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwic2VsZWN0X3t7JGluZGV4fX1cIiAvPlxuICogICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiY2xlYXJDb250YWN0KGNvbnRhY3QpXCI+Y2xlYXI8L2J1dHRvbj5cbiAqICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInJlbW92ZUNvbnRhY3QoY29udGFjdClcIj5YPC9idXR0b24+XG4gKiAgICAgICA8L2xpPlxuICogICAgICAgPGxpPlsgPGJ1dHRvbiBuZy1jbGljaz1cImFkZENvbnRhY3QoKVwiPmFkZDwvYnV0dG9uPiBdPC9saT5cbiAqICAgIDwvdWw+XG4gKiAgIDwvZGl2PlxuICogIDwvZmlsZT5cbiAqICA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgIGFuZ3VsYXIubW9kdWxlKCdjb250cm9sbGVyRXhhbXBsZScsIFtdKVxuICogICAgIC5jb250cm9sbGVyKCdTZXR0aW5nc0NvbnRyb2xsZXIyJywgWyckc2NvcGUnLCBTZXR0aW5nc0NvbnRyb2xsZXIyXSk7XG4gKlxuICogICBmdW5jdGlvbiBTZXR0aW5nc0NvbnRyb2xsZXIyKCRzY29wZSkge1xuICogICAgICRzY29wZS5uYW1lID0gJ0pvaG4gU21pdGgnO1xuICogICAgICRzY29wZS5jb250YWN0cyA9IFtcbiAqICAgICAgIHt0eXBlOidwaG9uZScsIHZhbHVlOic0MDggNTU1IDEyMTInfSxcbiAqICAgICAgIHt0eXBlOidlbWFpbCcsIHZhbHVlOidqb2huLnNtaXRoQGV4YW1wbGUub3JnJ31cbiAqICAgICBdO1xuICpcbiAqICAgICAkc2NvcGUuZ3JlZXQgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgIGFsZXJ0KCRzY29wZS5uYW1lKTtcbiAqICAgICB9O1xuICpcbiAqICAgICAkc2NvcGUuYWRkQ29udGFjdCA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgJHNjb3BlLmNvbnRhY3RzLnB1c2goe3R5cGU6J2VtYWlsJywgdmFsdWU6J3lvdXJuYW1lQGV4YW1wbGUub3JnJ30pO1xuICogICAgIH07XG4gKlxuICogICAgICRzY29wZS5yZW1vdmVDb250YWN0ID0gZnVuY3Rpb24oY29udGFjdFRvUmVtb3ZlKSB7XG4gKiAgICAgICB2YXIgaW5kZXggPSAkc2NvcGUuY29udGFjdHMuaW5kZXhPZihjb250YWN0VG9SZW1vdmUpO1xuICogICAgICAgJHNjb3BlLmNvbnRhY3RzLnNwbGljZShpbmRleCwgMSk7XG4gKiAgICAgfTtcbiAqXG4gKiAgICAgJHNjb3BlLmNsZWFyQ29udGFjdCA9IGZ1bmN0aW9uKGNvbnRhY3QpIHtcbiAqICAgICAgIGNvbnRhY3QudHlwZSA9ICdwaG9uZSc7XG4gKiAgICAgICBjb250YWN0LnZhbHVlID0gJyc7XG4gKiAgICAgfTtcbiAqICAgfVxuICogIDwvZmlsZT5cbiAqICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiAgICBpdCgnc2hvdWxkIGNoZWNrIGNvbnRyb2xsZXInLCBmdW5jdGlvbigpIHtcbiAqICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuaWQoJ2N0cmwtZXhtcGwnKSk7XG4gKlxuICogICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkubW9kZWwoJ25hbWUnKSlcbiAqICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJ0pvaG4gU21pdGgnKTtcbiAqXG4gKiAgICAgIHZhciBmaXJzdFJlcGVhdCA9XG4gKiAgICAgICAgICBjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBjb250YWN0cycpLnJvdygwKSk7XG4gKiAgICAgIHZhciBzZWNvbmRSZXBlYXQgPVxuICogICAgICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gY29udGFjdHMnKS5yb3coMSkpO1xuICpcbiAqICAgICAgZXhwZWN0KGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKVxuICogICAgICAgICAgLnRvQmUoJzQwOCA1NTUgMTIxMicpO1xuICogICAgICBleHBlY3Qoc2Vjb25kUmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKVxuICogICAgICAgICAgLnRvQmUoJ2pvaG4uc21pdGhAZXhhbXBsZS5vcmcnKTtcbiAqXG4gKiAgICAgIGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkuYnV0dG9uVGV4dCgnY2xlYXInKSkuY2xpY2soKTtcbiAqXG4gKiAgICAgIGV4cGVjdChmaXJzdFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSlcbiAqICAgICAgICAgIC50b0JlKCcnKTtcbiAqXG4gKiAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LmJ1dHRvblRleHQoJ2FkZCcpKS5jbGljaygpO1xuICpcbiAqICAgICAgZXhwZWN0KGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIGNvbnRhY3RzJykucm93KDIpKVxuICogICAgICAgICAgLmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSlcbiAqICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpXG4gKiAgICAgICAgICAudG9CZSgneW91cm5hbWVAZXhhbXBsZS5vcmcnKTtcbiAqICAgIH0pO1xuICogIDwvZmlsZT5cbiAqPC9leGFtcGxlPlxuXG4gKi9cbnZhciBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUgPSBbZnVuY3Rpb24oKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICBzY29wZTogdHJ1ZSxcbiAgICBjb250cm9sbGVyOiAnQCcsXG4gICAgcHJpb3JpdHk6IDUwMFxuICB9O1xufV07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDc3BcbiAqXG4gKiBAcmVzdHJpY3QgQVxuICogQGVsZW1lbnQgQU5ZXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBBbmd1bGFyIGhhcyBzb21lIGZlYXR1cmVzIHRoYXQgY2FuIGNvbmZsaWN0IHdpdGggY2VydGFpbiByZXN0cmljdGlvbnMgdGhhdCBhcmUgYXBwbGllZCB3aGVuIHVzaW5nXG4gKiBbQ1NQIChDb250ZW50IFNlY3VyaXR5IFBvbGljeSldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NlY3VyaXR5L0NTUCkgcnVsZXMuXG4gKlxuICogSWYgeW91IGludGVuZCB0byBpbXBsZW1lbnQgQ1NQIHdpdGggdGhlc2UgcnVsZXMgdGhlbiB5b3UgbXVzdCB0ZWxsIEFuZ3VsYXIgbm90IHRvIHVzZSB0aGVzZVxuICogZmVhdHVyZXMuXG4gKlxuICogVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBkZXZlbG9waW5nIHRoaW5ncyBsaWtlIEdvb2dsZSBDaHJvbWUgRXh0ZW5zaW9ucyBvciBVbml2ZXJzYWwgV2luZG93cyBBcHBzLlxuICpcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGRlZmF1bHQgcnVsZXMgaW4gQ1NQIGFmZmVjdCBBbmd1bGFyOlxuICpcbiAqICogVGhlIHVzZSBvZiBgZXZhbCgpYCwgYEZ1bmN0aW9uKHN0cmluZylgIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyB0byBkeW5hbWljYWxseSBjcmVhdGUgYW5kIGV4ZWN1dGVcbiAqIGNvZGUgZnJvbSBzdHJpbmdzIGlzIGZvcmJpZGRlbi4gQW5ndWxhciBtYWtlcyB1c2Ugb2YgdGhpcyBpbiB0aGUge0BsaW5rICRwYXJzZX0gc2VydmljZSB0b1xuICogcHJvdmlkZSBhIDMwJSBpbmNyZWFzZSBpbiB0aGUgc3BlZWQgb2YgZXZhbHVhdGluZyBBbmd1bGFyIGV4cHJlc3Npb25zLiAoVGhpcyBDU1AgcnVsZSBjYW4gYmVcbiAqIGRpc2FibGVkIHdpdGggdGhlIENTUCBrZXl3b3JkIGB1bnNhZmUtZXZhbGAsIGJ1dCBpdCBpcyBnZW5lcmFsbHkgbm90IHJlY29tbWVuZGVkIGFzIGl0IHdvdWxkXG4gKiB3ZWFrZW4gdGhlIHByb3RlY3Rpb25zIG9mZmVyZWQgYnkgQ1NQLilcbiAqXG4gKiAqIFRoZSB1c2Ugb2YgaW5saW5lIHJlc291cmNlcywgc3VjaCBhcyBpbmxpbmUgYDxzY3JpcHQ+YCBhbmQgYDxzdHlsZT5gIGVsZW1lbnRzLCBhcmUgZm9yYmlkZGVuLlxuICogVGhpcyBwcmV2ZW50cyBhcHBzIGZyb20gaW5qZWN0aW5nIGN1c3RvbSBzdHlsZXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnQuIEFuZ3VsYXIgbWFrZXMgdXNlIG9mXG4gKiB0aGlzIHRvIGluY2x1ZGUgc29tZSBDU1MgcnVsZXMgKGUuZy4ge0BsaW5rIG5nQ2xvYWt9IGFuZCB7QGxpbmsgbmdIaWRlfSkuIFRvIG1ha2UgdGhlc2VcbiAqIGRpcmVjdGl2ZXMgd29yayB3aGVuIGEgQ1NQIHJ1bGUgaXMgYmxvY2tpbmcgaW5saW5lIHN0eWxlcywgeW91IG11c3QgbGluayB0byB0aGUgYGFuZ3VsYXItY3NwLmNzc2BcbiAqIGluIHlvdXIgSFRNTCBtYW51YWxseS4gKFRoaXMgQ1NQIHJ1bGUgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIENTUCBrZXl3b3JkIGB1bnNhZmUtaW5saW5lYCwgYnV0XG4gKiBpdCBpcyBnZW5lcmFsbHkgbm90IHJlY29tbWVuZGVkIGFzIGl0IHdvdWxkIHdlYWtlbiB0aGUgcHJvdGVjdGlvbnMgb2ZmZXJlZCBieSBDU1AuKVxuICpcbiAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSBgbmdDc3BgIHRoZW4gQW5ndWxhciB0cmllcyB0byBhdXRvZGV0ZWN0IGlmIENTUCBpcyBibG9ja2luZyBkeW5hbWljIGNvZGVcbiAqIGNyZWF0aW9uIGZyb20gc3RyaW5ncyAoZS5nLiwgYHVuc2FmZS1ldmFsYCBub3Qgc3BlY2lmaWVkIGluIENTUCBoZWFkZXIpIGFuZCBhdXRvbWF0aWNhbGx5XG4gKiBkZWFjdGl2YXRlcyB0aGlzIGZlYXR1cmUgaW4gdGhlIHtAbGluayAkcGFyc2V9IHNlcnZpY2UuIFRoaXMgYXV0b2RldGVjdGlvbiwgaG93ZXZlciwgdHJpZ2dlcnMgYVxuICogQ1NQIGVycm9yIHRvIGJlIGxvZ2dlZCBpbiB0aGUgY29uc29sZTpcbiAqXG4gKiBgYGBcbiAqIFJlZnVzZWQgdG8gZXZhbHVhdGUgYSBzdHJpbmcgYXMgSmF2YVNjcmlwdCBiZWNhdXNlICd1bnNhZmUtZXZhbCcgaXMgbm90IGFuIGFsbG93ZWQgc291cmNlIG9mXG4gKiBzY3JpcHQgaW4gdGhlIGZvbGxvd2luZyBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBkaXJlY3RpdmU6IFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIuIE5vdGUgdGhhdFxuICogJ3NjcmlwdC1zcmMnIHdhcyBub3QgZXhwbGljaXRseSBzZXQsIHNvICdkZWZhdWx0LXNyYycgaXMgdXNlZCBhcyBhIGZhbGxiYWNrLlxuICogYGBgXG4gKlxuICogVGhpcyBlcnJvciBpcyBoYXJtbGVzcyBidXQgYW5ub3lpbmcuIFRvIHByZXZlbnQgdGhlIGVycm9yIGZyb20gc2hvd2luZyB1cCwgcHV0IHRoZSBgbmdDc3BgXG4gKiBkaXJlY3RpdmUgb24gYW4gZWxlbWVudCBvZiB0aGUgSFRNTCBkb2N1bWVudCB0aGF0IGFwcGVhcnMgYmVmb3JlIHRoZSBgPHNjcmlwdD5gIHRhZyB0aGF0IGxvYWRzXG4gKiB0aGUgYGFuZ3VsYXIuanNgIGZpbGUuXG4gKlxuICogKk5vdGU6IFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBgbmctY3NwYCBhbmQgYGRhdGEtbmctY3NwYCBhdHRyaWJ1dGUgZm9ybS4qXG4gKlxuICogWW91IGNhbiBzcGVjaWZ5IHdoaWNoIG9mIHRoZSBDU1AgcmVsYXRlZCBBbmd1bGFyIGZlYXR1cmVzIHNob3VsZCBiZSBkZWFjdGl2YXRlZCBieSBwcm92aWRpbmdcbiAqIGEgdmFsdWUgZm9yIHRoZSBgbmctY3NwYCBhdHRyaWJ1dGUuIFRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOlxuICpcbiAqICogbm8taW5saW5lLXN0eWxlOiB0aGlzIHN0b3BzIEFuZ3VsYXIgZnJvbSBpbmplY3RpbmcgQ1NTIHN0eWxlcyBpbnRvIHRoZSBET01cbiAqXG4gKiAqIG5vLXVuc2FmZS1ldmFsOiB0aGlzIHN0b3BzIEFuZ3VsYXIgZnJvbSBvcHRpbWl6aW5nICRwYXJzZSB3aXRoIHVuc2FmZSBldmFsIG9mIHN0cmluZ3NcbiAqXG4gKiBZb3UgY2FuIHVzZSB0aGVzZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnM6XG4gKlxuICpcbiAqICogTm8gZGVjbGFyYXRpb24gbWVhbnMgdGhhdCBBbmd1bGFyIHdpbGwgYXNzdW1lIHRoYXQgeW91IGNhbiBkbyBpbmxpbmUgc3R5bGVzLCBidXQgaXQgd2lsbCBkb1xuICogYSBydW50aW1lIGNoZWNrIGZvciB1bnNhZmUtZXZhbC4gRS5nLiBgPGJvZHk+YC4gVGhpcyBpcyBiYWNrd2FyZGx5IGNvbXBhdGlibGUgd2l0aCBwcmV2aW91c1xuICogdmVyc2lvbnMgb2YgQW5ndWxhci5cbiAqXG4gKiAqIEEgc2ltcGxlIGBuZy1jc3BgIChvciBgZGF0YS1uZy1jc3BgKSBhdHRyaWJ1dGUgd2lsbCB0ZWxsIEFuZ3VsYXIgdG8gZGVhY3RpdmF0ZSBib3RoIGlubGluZVxuICogc3R5bGVzIGFuZCB1bnNhZmUgZXZhbC4gRS5nLiBgPGJvZHkgbmctY3NwPmAuIFRoaXMgaXMgYmFja3dhcmRseSBjb21wYXRpYmxlIHdpdGggcHJldmlvdXNcbiAqIHZlcnNpb25zIG9mIEFuZ3VsYXIuXG4gKlxuICogKiBTcGVjaWZ5aW5nIG9ubHkgYG5vLXVuc2FmZS1ldmFsYCB0ZWxscyBBbmd1bGFyIHRoYXQgd2UgbXVzdCBub3QgdXNlIGV2YWwsIGJ1dCB0aGF0IHdlIGNhblxuICogaW5qZWN0IGlubGluZSBzdHlsZXMuIEUuZy4gYDxib2R5IG5nLWNzcD1cIm5vLXVuc2FmZS1ldmFsXCI+YC5cbiAqXG4gKiAqIFNwZWNpZnlpbmcgb25seSBgbm8taW5saW5lLXN0eWxlYCB0ZWxscyBBbmd1bGFyIHRoYXQgd2UgbXVzdCBub3QgaW5qZWN0IHN0eWxlcywgYnV0IHRoYXQgd2UgY2FuXG4gKiBydW4gZXZhbCAtIG5vIGF1dG9tYXRpYyBjaGVjayBmb3IgdW5zYWZlIGV2YWwgd2lsbCBvY2N1ci4gRS5nLiBgPGJvZHkgbmctY3NwPVwibm8taW5saW5lLXN0eWxlXCI+YFxuICpcbiAqICogU3BlY2lmeWluZyBib3RoIGBuby11bnNhZmUtZXZhbGAgYW5kIGBuby1pbmxpbmUtc3R5bGVgIHRlbGxzIEFuZ3VsYXIgdGhhdCB3ZSBtdXN0IG5vdCBpbmplY3RcbiAqIHN0eWxlcyBub3IgdXNlIGV2YWwsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGFuIGVtcHR5OiBuZy1jc3AuXG4gKiBFLmcuYDxib2R5IG5nLWNzcD1cIm5vLWlubGluZS1zdHlsZTtuby11bnNhZmUtZXZhbFwiPmBcbiAqXG4gKiBAZXhhbXBsZVxuICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBhcHBseSB0aGUgYG5nQ3NwYCBkaXJlY3RpdmUgdG8gdGhlIGBodG1sYCB0YWcuXG4gICBgYGBodG1sXG4gICAgIDwhZG9jdHlwZSBodG1sPlxuICAgICA8aHRtbCBuZy1hcHAgbmctY3NwPlxuICAgICAuLi5cbiAgICAgLi4uXG4gICAgIDwvaHRtbD5cbiAgIGBgYFxuICAqIEBleGFtcGxlXG4gICAgICA8IS0tIE5vdGU6IHRoZSBgLmNzcGAgc3VmZml4IGluIHRoZSBleGFtcGxlIG5hbWUgdHJpZ2dlcnMgQ1NQIG1vZGUgaW4gb3VyIGh0dHAgc2VydmVyISAtLT5cbiAgICAgIDxleGFtcGxlIG5hbWU9XCJleGFtcGxlLmNzcFwiIG1vZHVsZT1cImNzcEV4YW1wbGVcIiBuZy1jc3A9XCJ0cnVlXCI+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiTWFpbkNvbnRyb2xsZXIgYXMgY3RybFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImN0cmwuaW5jKClcIiBpZD1cImluY1wiPkluY3JlbWVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImNvdW50ZXJcIj5cbiAgICAgICAgICAgICAgICB7e2N0cmwuY291bnRlcn19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiY3RybC5ldmlsKClcIiBpZD1cImV2aWxcIj5FdmlsPC9idXR0b24+XG4gICAgICAgICAgICAgIDxzcGFuIGlkPVwiZXZpbEVycm9yXCI+XG4gICAgICAgICAgICAgICAge3tjdHJsLmV2aWxFcnJvcn19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2ZpbGU+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2NzcEV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAuY29udHJvbGxlcignTWFpbkNvbnRyb2xsZXInLCBmdW5jdGlvbiBNYWluQ29udHJvbGxlcigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZXZpbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXZhbCgnMSsyJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2aWxFcnJvciA9IGUubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICAgdmFyIHV0aWwsIHdlYmRyaXZlcjtcblxuICAgICAgICAgIHZhciBpbmNCdG4gPSBlbGVtZW50KGJ5LmlkKCdpbmMnKSk7XG4gICAgICAgICAgdmFyIGNvdW50ZXIgPSBlbGVtZW50KGJ5LmlkKCdjb3VudGVyJykpO1xuICAgICAgICAgIHZhciBldmlsQnRuID0gZWxlbWVudChieS5pZCgnZXZpbCcpKTtcbiAgICAgICAgICB2YXIgZXZpbEVycm9yID0gZWxlbWVudChieS5pZCgnZXZpbEVycm9yJykpO1xuXG4gICAgICAgICAgZnVuY3Rpb24gZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5tYW5hZ2UoKS5sb2dzKCkuZ2V0KCdicm93c2VyJykudGhlbihmdW5jdGlvbihicm93c2VyTG9nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBicm93c2VyTG9nLmZpbHRlcihmdW5jdGlvbihsb2dFbnRyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2dFbnRyeS5sZXZlbC52YWx1ZSA+IHdlYmRyaXZlci5sb2dnaW5nLkxldmVsLldBUk5JTkcudmFsdWU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gY2xlYXJFcnJvcnMoKSB7XG4gICAgICAgICAgICBnZXRBbmRDbGVhclNldmVyZUVycm9ycygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIGV4cGVjdE5vRXJyb3JzKCkge1xuICAgICAgICAgICAgZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKS50aGVuKGZ1bmN0aW9uKGZpbHRlcmVkTG9nKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChmaWx0ZXJlZExvZy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJlZExvZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYnJvd3NlciBjb25zb2xlIGVycm9yczogJyArIHV0aWwuaW5zcGVjdChmaWx0ZXJlZExvZykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBleHBlY3RFcnJvcihyZWdleCkge1xuICAgICAgICAgICAgZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKS50aGVuKGZ1bmN0aW9uKGZpbHRlcmVkTG9nKSB7XG4gICAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBmaWx0ZXJlZExvZy5mb3JFYWNoKGZ1bmN0aW9uKGxvZykge1xuICAgICAgICAgICAgICAgIGlmIChsb2cubWVzc2FnZS5tYXRjaChyZWdleCkpIHtcbiAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBhbiBlcnJvciB0aGF0IG1hdGNoZXMgJyArIHJlZ2V4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG4gICAgICAgICAgICB3ZWJkcml2ZXIgPSByZXF1aXJlKCdzZWxlbml1bS13ZWJkcml2ZXInKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEZvciBub3csIHdlIG9ubHkgdGVzdCBvbiBDaHJvbWUsXG4gICAgICAgICAgLy8gYXMgU2FmYXJpIGRvZXMgbm90IGxvYWQgdGhlIHBhZ2Ugd2l0aCBQcm90cmFjdG9yJ3MgaW5qZWN0ZWQgc2NyaXB0cyxcbiAgICAgICAgICAvLyBhbmQgRmlyZWZveCB3ZWJkcml2ZXIgYWx3YXlzIGRpc2FibGVzIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5ICgjNjM1OClcbiAgICAgICAgICBpZiAoYnJvd3Nlci5wYXJhbXMuYnJvd3NlciAhPT0gJ2Nocm9tZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIG5vdCByZXBvcnQgZXJyb3JzIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBjbGVhciBlcnJvcnMgc28gd2UgYXJlIG5vdCBkZXBlbmRlbnQgb24gcHJldmlvdXMgdGVzdHNcbiAgICAgICAgICAgIGNsZWFyRXJyb3JzKCk7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIHJlbG9hZCB0aGUgcGFnZSBhcyB0aGUgcGFnZSBpcyBhbHJlYWR5IGxvYWRlZCB3aGVuXG4gICAgICAgICAgICAvLyB3ZSBjb21lIGhlcmVcbiAgICAgICAgICAgIGJyb3dzZXIuZHJpdmVyLmdldEN1cnJlbnRVcmwoKS50aGVuKGZ1bmN0aW9uKHVybCkge1xuICAgICAgICAgICAgICBicm93c2VyLmdldCh1cmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBleHBlY3ROb0Vycm9ycygpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBldmFsdWF0ZSBleHByZXNzaW9ucycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0VxdWFsKCcwJyk7XG4gICAgICAgICAgICBpbmNCdG4uY2xpY2soKTtcbiAgICAgICAgICAgIGV4cGVjdChjb3VudGVyLmdldFRleHQoKSkudG9FcXVhbCgnMScpO1xuICAgICAgICAgICAgZXhwZWN0Tm9FcnJvcnMoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgYW5kIHJlcG9ydCBhbiBlcnJvciB3aGVuIHVzaW5nIFwiZXZhbFwiJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBldmlsQnRuLmNsaWNrKCk7XG4gICAgICAgICAgICBleHBlY3QoZXZpbEVycm9yLmdldFRleHQoKSkudG9NYXRjaCgvQ29udGVudCBTZWN1cml0eSBQb2xpY3kvKTtcbiAgICAgICAgICAgIGV4cGVjdEVycm9yKC9Db250ZW50IFNlY3VyaXR5IFBvbGljeS8pO1xuICAgICAgICAgIH0pO1xuICAgICAgICA8L2ZpbGU+XG4gICAgICA8L2V4YW1wbGU+XG4gICovXG5cbi8vIGBuZ0NzcGAgaXMgbm90IGltcGxlbWVudGVkIGFzIGEgcHJvcGVyIGRpcmVjdGl2ZSBhbnkgbW9yZSwgYmVjYXVzZSB3ZSBuZWVkIGl0IGJlIHByb2Nlc3NlZCB3aGlsZVxuLy8gd2UgYm9vdHN0cmFwIHRoZSBhcHAgKGJlZm9yZSBgJHBhcnNlYCBpcyBpbnN0YW50aWF0ZWQpLiBGb3IgdGhpcyByZWFzb24sIHdlIGp1c3QgaGF2ZSB0aGUgYGNzcCgpYFxuLy8gZm4gdGhhdCBsb29rcyBmb3IgdGhlIGBuZy1jc3BgIGF0dHJpYnV0ZSBhbnl3aGVyZSBpbiB0aGUgY3VycmVudCBkb2MuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDbGlja1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIG5nQ2xpY2sgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlblxuICogYW4gZWxlbWVudCBpcyBjbGlja2VkLlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDbGljayB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBjbGljay4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1jbGlja1wiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgICAgSW5jcmVtZW50XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuPlxuICAgICAgICBjb3VudDoge3tjb3VudH19XG4gICAgICA8L3NwYW4+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2NvdW50JykpLmdldFRleHQoKSkudG9NYXRjaCgnMCcpO1xuICAgICAgICAgZWxlbWVudChieS5jc3MoJ2J1dHRvbicpKS5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnY291bnQnKSkuZ2V0VGV4dCgpKS50b01hdGNoKCcxJyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuLypcbiAqIEEgY29sbGVjdGlvbiBvZiBkaXJlY3RpdmVzIHRoYXQgYWxsb3dzIGNyZWF0aW9uIG9mIGN1c3RvbSBldmVudCBoYW5kbGVycyB0aGF0IGFyZSBkZWZpbmVkIGFzXG4gKiBhbmd1bGFyIGV4cHJlc3Npb25zIGFuZCBhcmUgY29tcGlsZWQgYW5kIGV4ZWN1dGVkIHdpdGhpbiB0aGUgY3VycmVudCBzY29wZS5cbiAqL1xudmFyIG5nRXZlbnREaXJlY3RpdmVzID0ge307XG5cbi8vIEZvciBldmVudHMgdGhhdCBtaWdodCBmaXJlIHN5bmNocm9ub3VzbHkgZHVyaW5nIERPTSBtYW5pcHVsYXRpb25cbi8vIHdlIG5lZWQgdG8gZXhlY3V0ZSB0aGVpciBldmVudCBoYW5kbGVycyBhc3luY2hyb25vdXNseSB1c2luZyAkZXZhbEFzeW5jLFxuLy8gc28gdGhhdCB0aGV5IGFyZSBub3QgZXhlY3V0ZWQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxudmFyIGZvcmNlQXN5bmNFdmVudHMgPSB7XG4gICdibHVyJzogdHJ1ZSxcbiAgJ2ZvY3VzJzogdHJ1ZVxufTtcbmZvckVhY2goXG4gICdjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vtb3ZlIG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBrZXlkb3duIGtleXVwIGtleXByZXNzIHN1Ym1pdCBmb2N1cyBibHVyIGNvcHkgY3V0IHBhc3RlJy5zcGxpdCgnICcpLFxuICBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICB2YXIgZGlyZWN0aXZlTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZSgnbmctJyArIGV2ZW50TmFtZSk7XG4gICAgbmdFdmVudERpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBbJyRwYXJzZScsICckcm9vdFNjb3BlJywgZnVuY3Rpb24oJHBhcnNlLCAkcm9vdFNjb3BlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICBjb21waWxlOiBmdW5jdGlvbigkZWxlbWVudCwgYXR0cikge1xuICAgICAgICAgIC8vIFdlIGV4cG9zZSB0aGUgcG93ZXJmdWwgJGV2ZW50IG9iamVjdCBvbiB0aGUgc2NvcGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFdpbmRvdyxcbiAgICAgICAgICAvLyBldGMuIHRoYXQgaXNuJ3QgcHJvdGVjdGVkIGJ5IHRoZSBmYXN0IHBhdGhzIGluICRwYXJzZS4gIFdlIGV4cGxpY2l0bHkgcmVxdWVzdCBiZXR0ZXJcbiAgICAgICAgICAvLyBjaGVja3MgYXQgdGhlIGNvc3Qgb2Ygc3BlZWQgc2luY2UgZXZlbnQgaGFuZGxlciBleHByZXNzaW9ucyBhcmUgbm90IGV4ZWN1dGVkIGFzXG4gICAgICAgICAgLy8gZnJlcXVlbnRseSBhcyByZWd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICAgdmFyIGZuID0gJHBhcnNlKGF0dHJbZGlyZWN0aXZlTmFtZV0sIC8qIGludGVyY2VwdG9yRm4gKi8gbnVsbCwgLyogZXhwZW5zaXZlQ2hlY2tzICovIHRydWUpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ0V2ZW50SGFuZGxlcihzY29wZSwgZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5vbihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGZuKHNjb3BlLCB7JGV2ZW50OmV2ZW50fSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChmb3JjZUFzeW5jRXZlbnRzW2V2ZW50TmFtZV0gJiYgJHJvb3RTY29wZS4kJHBoYXNlKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGV2YWxBc3luYyhjYWxsYmFjayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0RibGNsaWNrXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nRGJsY2xpY2tgIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGEgZGJsY2xpY2sgZXZlbnQuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0RibGNsaWNrIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIGEgZGJsY2xpY2suIChUaGUgRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YClcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWRibGNsaWNrXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8YnV0dG9uIG5nLWRibGNsaWNrPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAgICBJbmNyZW1lbnQgKG9uIGRvdWJsZSBjbGljaylcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgY291bnQ6IHt7Y291bnR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTW91c2Vkb3duXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgbmdNb3VzZWRvd24gZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2Vkb3duIGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdNb3VzZWRvd24ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogbW91c2Vkb3duLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLW1vdXNlZG93blwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGJ1dHRvbiBuZy1tb3VzZWRvd249XCJjb3VudCA9IGNvdW50ICsgMVwiIG5nLWluaXQ9XCJjb3VudD0wXCI+XG4gICAgICAgIEluY3JlbWVudCAob24gbW91c2UgZG93bilcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgY291bnQ6IHt7Y291bnR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTW91c2V1cFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2V1cCBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2V1cCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBtb3VzZXVwLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLW1vdXNldXBcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxidXR0b24gbmctbW91c2V1cD1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgICAgSW5jcmVtZW50IChvbiBtb3VzZSB1cClcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgY291bnQ6IHt7Y291bnR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ01vdXNlb3ZlclxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2VvdmVyIGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdNb3VzZW92ZXIge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogbW91c2VvdmVyLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLW1vdXNlb3ZlclwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGJ1dHRvbiBuZy1tb3VzZW92ZXI9XCJjb3VudCA9IGNvdW50ICsgMVwiIG5nLWluaXQ9XCJjb3VudD0wXCI+XG4gICAgICAgIEluY3JlbWVudCAod2hlbiBtb3VzZSBpcyBvdmVyKVxuICAgICAgPC9idXR0b24+XG4gICAgICBjb3VudDoge3tjb3VudH19XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdNb3VzZWVudGVyXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZWVudGVyIGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdNb3VzZWVudGVyIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIG1vdXNlZW50ZXIuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KVxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctbW91c2VlbnRlclwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGJ1dHRvbiBuZy1tb3VzZWVudGVyPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgZW50ZXJzKVxuICAgICAgPC9idXR0b24+XG4gICAgICBjb3VudDoge3tjb3VudH19XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdNb3VzZWxlYXZlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZWxlYXZlIGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdNb3VzZWxlYXZlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIG1vdXNlbGVhdmUuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KVxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctbW91c2VsZWF2ZVwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGJ1dHRvbiBuZy1tb3VzZWxlYXZlPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgbGVhdmVzKVxuICAgICAgPC9idXR0b24+XG4gICAgICBjb3VudDoge3tjb3VudH19XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdNb3VzZW1vdmVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlbW92ZSBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2Vtb3ZlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIG1vdXNlbW92ZS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1tb3VzZW1vdmVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxidXR0b24gbmctbW91c2Vtb3ZlPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgbW92ZXMpXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIGNvdW50OiB7e2NvdW50fX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0tleWRvd25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGtleWRvd24gZXZlbnQuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0tleWRvd24ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICoga2V5ZG93bi4gKEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGAgYW5kIGNhbiBiZSBpbnRlcnJvZ2F0ZWQgZm9yIGtleUNvZGUsIGFsdEtleSwgZXRjLilcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWtleWRvd25cIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxpbnB1dCBuZy1rZXlkb3duPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAga2V5IGRvd24gY291bnQ6IHt7Y291bnR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nS2V5dXBcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGtleXVwIGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdLZXl1cCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBrZXl1cC4gKEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGAgYW5kIGNhbiBiZSBpbnRlcnJvZ2F0ZWQgZm9yIGtleUNvZGUsIGFsdEtleSwgZXRjLilcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWtleXVwXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHA+VHlwaW5nIGluIHRoZSBpbnB1dCBib3ggYmVsb3cgdXBkYXRlcyB0aGUga2V5IGNvdW50PC9wPlxuICAgICAgIDxpbnB1dCBuZy1rZXl1cD1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj4ga2V5IHVwIGNvdW50OiB7e2NvdW50fX1cblxuICAgICAgIDxwPlR5cGluZyBpbiB0aGUgaW5wdXQgYm94IGJlbG93IHVwZGF0ZXMgdGhlIGtleWNvZGU8L3A+XG4gICAgICAgPGlucHV0IG5nLWtleXVwPVwiZXZlbnQ9JGV2ZW50XCI+XG4gICAgICAgPHA+ZXZlbnQga2V5Q29kZToge3sgZXZlbnQua2V5Q29kZSB9fTwvcD5cbiAgICAgICA8cD5ldmVudCBhbHRLZXk6IHt7IGV2ZW50LmFsdEtleSB9fTwvcD5cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0tleXByZXNzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBrZXlwcmVzcyBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdLZXlwcmVzcyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBrZXlwcmVzcy4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH1cbiAqIGFuZCBjYW4gYmUgaW50ZXJyb2dhdGVkIGZvciBrZXlDb2RlLCBhbHRLZXksIGV0Yy4pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1rZXlwcmVzc1wiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGlucHV0IG5nLWtleXByZXNzPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAga2V5IHByZXNzIGNvdW50OiB7e2NvdW50fX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1N1Ym1pdFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRW5hYmxlcyBiaW5kaW5nIGFuZ3VsYXIgZXhwcmVzc2lvbnMgdG8gb25zdWJtaXQgZXZlbnRzLlxuICpcbiAqIEFkZGl0aW9uYWxseSBpdCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBhY3Rpb24gKHdoaWNoIGZvciBmb3JtIG1lYW5zIHNlbmRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlXG4gKiBzZXJ2ZXIgYW5kIHJlbG9hZGluZyB0aGUgY3VycmVudCBwYWdlKSwgYnV0IG9ubHkgaWYgdGhlIGZvcm0gZG9lcyBub3QgY29udGFpbiBgYWN0aW9uYCxcbiAqIGBkYXRhLWFjdGlvbmAsIG9yIGB4LWFjdGlvbmAgYXR0cmlidXRlcy5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipXYXJuaW5nOioqIEJlIGNhcmVmdWwgbm90IHRvIGNhdXNlIFwiZG91YmxlLXN1Ym1pc3Npb25cIiBieSB1c2luZyBib3RoIHRoZSBgbmdDbGlja2AgYW5kXG4gKiBgbmdTdWJtaXRgIGhhbmRsZXJzIHRvZ2V0aGVyLiBTZWUgdGhlXG4gKiB7QGxpbmsgZm9ybSNzdWJtaXR0aW5nLWEtZm9ybS1hbmQtcHJldmVudGluZy10aGUtZGVmYXVsdC1hY3Rpb24gYGZvcm1gIGRpcmVjdGl2ZSBkb2N1bWVudGF0aW9ufVxuICogZm9yIGEgZGV0YWlsZWQgZGlzY3Vzc2lvbiBvZiB3aGVuIGBuZ1N1Ym1pdGAgbWF5IGJlIHRyaWdnZXJlZC5cbiAqIDwvZGl2PlxuICpcbiAqIEBlbGVtZW50IGZvcm1cbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nU3VibWl0IHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuXG4gKiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwic3VibWl0RXhhbXBsZVwiIG5hbWU9XCJuZy1zdWJtaXRcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxzY3JpcHQ+XG4gICAgICAgIGFuZ3VsYXIubW9kdWxlKCdzdWJtaXRFeGFtcGxlJywgW10pXG4gICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICRzY29wZS5saXN0ID0gW107XG4gICAgICAgICAgICAkc2NvcGUudGV4dCA9ICdoZWxsbyc7XG4gICAgICAgICAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmICgkc2NvcGUudGV4dCkge1xuICAgICAgICAgICAgICAgICRzY29wZS5saXN0LnB1c2godGhpcy50ZXh0KTtcbiAgICAgICAgICAgICAgICAkc2NvcGUudGV4dCA9ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1dKTtcbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPGZvcm0gbmctc3VibWl0PVwic3VibWl0KClcIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgRW50ZXIgdGV4dCBhbmQgaGl0IGVudGVyOlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cInRleHRcIiBuYW1lPVwidGV4dFwiIC8+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgaWQ9XCJzdWJtaXRcIiB2YWx1ZT1cIlN1Ym1pdFwiIC8+XG4gICAgICAgIDxwcmU+bGlzdD17e2xpc3R9fTwvcHJlPlxuICAgICAgPC9mb3JtPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLXN1Ym1pdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCcpKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3Q9W10nKTtcbiAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCcjc3VibWl0JykpLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9Db250YWluKCdoZWxsbycpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCcnKTtcbiAgICAgICB9KTtcbiAgICAgICBpdCgnc2hvdWxkIGlnbm9yZSBlbXB0eSBzdHJpbmdzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9CZSgnbGlzdD1bXScpO1xuICAgICAgICAgZWxlbWVudChieS5jc3MoJyNzdWJtaXQnKSkuY2xpY2soKTtcbiAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCcjc3VibWl0JykpLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9Db250YWluKCdoZWxsbycpO1xuICAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdGb2N1c1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gZm9jdXMgZXZlbnQuXG4gKlxuICogTm90ZTogQXMgdGhlIGBmb2N1c2AgZXZlbnQgaXMgZXhlY3V0ZWQgc3luY2hyb25vdXNseSB3aGVuIGNhbGxpbmcgYGlucHV0LmZvY3VzKClgXG4gKiBBbmd1bGFySlMgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24gdXNpbmcgYHNjb3BlLiRldmFsQXN5bmNgIGlmIHRoZSBldmVudCBpcyBmaXJlZFxuICogZHVyaW5nIGFuIGAkYXBwbHlgIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQgc3RhdGUuXG4gKlxuICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdGb2N1cyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBmb2N1cy4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAqIFNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xpY2sgbmdDbGlja31cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQmx1clxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gYmx1ciBldmVudC5cbiAqXG4gKiBBIFtibHVyIGV2ZW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvYmx1cikgZmlyZXMgd2hlblxuICogYW4gZWxlbWVudCBoYXMgbG9zdCBmb2N1cy5cbiAqXG4gKiBOb3RlOiBBcyB0aGUgYGJsdXJgIGV2ZW50IGlzIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgYWxzbyBkdXJpbmcgRE9NIG1hbmlwdWxhdGlvbnNcbiAqIChlLmcuIHJlbW92aW5nIGEgZm9jdXNzZWQgaW5wdXQpLFxuICogQW5ndWxhckpTIGV4ZWN1dGVzIHRoZSBleHByZXNzaW9uIHVzaW5nIGBzY29wZS4kZXZhbEFzeW5jYCBpZiB0aGUgZXZlbnQgaXMgZmlyZWRcbiAqIGR1cmluZyBhbiBgJGFwcGx5YCB0byBlbnN1cmUgYSBjb25zaXN0ZW50IHN0YXRlLlxuICpcbiAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGFcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQmx1ciB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBibHVyLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICogU2VlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGljayBuZ0NsaWNrfVxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDb3B5XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBjb3B5IGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGFcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ29weSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBjb3B5LiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWNvcHlcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxpbnB1dCBuZy1jb3B5PVwiY29waWVkPXRydWVcIiBuZy1pbml0PVwiY29waWVkPWZhbHNlOyB2YWx1ZT0nY29weSBtZSdcIiBuZy1tb2RlbD1cInZhbHVlXCI+XG4gICAgICBjb3BpZWQ6IHt7Y29waWVkfX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDdXRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGN1dCBldmVudC5cbiAqXG4gKiBAZWxlbWVudCB3aW5kb3csIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0N1dCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBjdXQuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KVxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctY3V0XCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8aW5wdXQgbmctY3V0PVwiY3V0PXRydWVcIiBuZy1pbml0PVwiY3V0PWZhbHNlOyB2YWx1ZT0nY3V0IG1lJ1wiIG5nLW1vZGVsPVwidmFsdWVcIj5cbiAgICAgIGN1dDoge3tjdXR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1Bhc3RlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBwYXN0ZSBldmVudC5cbiAqXG4gKiBAZWxlbWVudCB3aW5kb3csIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ1Bhc3RlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIHBhc3RlLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLXBhc3RlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8aW5wdXQgbmctcGFzdGU9XCJwYXN0ZT10cnVlXCIgbmctaW5pdD1cInBhc3RlPWZhbHNlXCIgcGxhY2Vob2xkZXI9J3Bhc3RlIGhlcmUnPlxuICAgICAgcGFzdGVkOiB7e3Bhc3RlfX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdJZlxuICogQHJlc3RyaWN0IEFcbiAqIEBtdWx0aUVsZW1lbnRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdJZmAgZGlyZWN0aXZlIHJlbW92ZXMgb3IgcmVjcmVhdGVzIGEgcG9ydGlvbiBvZiB0aGUgRE9NIHRyZWUgYmFzZWQgb24gYW5cbiAqIHtleHByZXNzaW9ufS4gSWYgdGhlIGV4cHJlc3Npb24gYXNzaWduZWQgdG8gYG5nSWZgIGV2YWx1YXRlcyB0byBhIGZhbHNlXG4gKiB2YWx1ZSB0aGVuIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBvdGhlcndpc2UgYSBjbG9uZSBvZiB0aGVcbiAqIGVsZW1lbnQgaXMgcmVpbnNlcnRlZCBpbnRvIHRoZSBET00uXG4gKlxuICogYG5nSWZgIGRpZmZlcnMgZnJvbSBgbmdTaG93YCBhbmQgYG5nSGlkZWAgaW4gdGhhdCBgbmdJZmAgY29tcGxldGVseSByZW1vdmVzIGFuZCByZWNyZWF0ZXMgdGhlXG4gKiBlbGVtZW50IGluIHRoZSBET00gcmF0aGVyIHRoYW4gY2hhbmdpbmcgaXRzIHZpc2liaWxpdHkgdmlhIHRoZSBgZGlzcGxheWAgY3NzIHByb3BlcnR5LiAgQSBjb21tb25cbiAqIGNhc2Ugd2hlbiB0aGlzIGRpZmZlcmVuY2UgaXMgc2lnbmlmaWNhbnQgaXMgd2hlbiB1c2luZyBjc3Mgc2VsZWN0b3JzIHRoYXQgcmVseSBvbiBhbiBlbGVtZW50J3NcbiAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgRE9NLCBzdWNoIGFzIHRoZSBgOmZpcnN0LWNoaWxkYCBvciBgOmxhc3QtY2hpbGRgIHBzZXVkby1jbGFzc2VzLlxuICpcbiAqIE5vdGUgdGhhdCB3aGVuIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZCB1c2luZyBgbmdJZmAgaXRzIHNjb3BlIGlzIGRlc3Ryb3llZCBhbmQgYSBuZXcgc2NvcGVcbiAqIGlzIGNyZWF0ZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZXN0b3JlZC4gIFRoZSBzY29wZSBjcmVhdGVkIHdpdGhpbiBgbmdJZmAgaW5oZXJpdHMgZnJvbVxuICogaXRzIHBhcmVudCBzY29wZSB1c2luZ1xuICogW3Byb3RvdHlwYWwgaW5oZXJpdGFuY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvd2lraS9VbmRlcnN0YW5kaW5nLVNjb3BlcyNqYXZhc2NyaXB0LXByb3RvdHlwYWwtaW5oZXJpdGFuY2UpLlxuICogQW4gaW1wb3J0YW50IGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgaWYgYG5nTW9kZWxgIGlzIHVzZWQgd2l0aGluIGBuZ0lmYCB0byBiaW5kIHRvXG4gKiBhIGphdmFzY3JpcHQgcHJpbWl0aXZlIGRlZmluZWQgaW4gdGhlIHBhcmVudCBzY29wZS4gSW4gdGhpcyBjYXNlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gdGhlXG4gKiB2YXJpYWJsZSB3aXRoaW4gdGhlIGNoaWxkIHNjb3BlIHdpbGwgb3ZlcnJpZGUgKGhpZGUpIHRoZSB2YWx1ZSBpbiB0aGUgcGFyZW50IHNjb3BlLlxuICpcbiAqIEFsc28sIGBuZ0lmYCByZWNyZWF0ZXMgZWxlbWVudHMgdXNpbmcgdGhlaXIgY29tcGlsZWQgc3RhdGUuIEFuIGV4YW1wbGUgb2YgdGhpcyBiZWhhdmlvclxuICogaXMgaWYgYW4gZWxlbWVudCdzIGNsYXNzIGF0dHJpYnV0ZSBpcyBkaXJlY3RseSBtb2RpZmllZCBhZnRlciBpdCdzIGNvbXBpbGVkLCB1c2luZyBzb21ldGhpbmcgbGlrZVxuICogalF1ZXJ5J3MgYC5hZGRDbGFzcygpYCBtZXRob2QsIGFuZCB0aGUgZWxlbWVudCBpcyBsYXRlciByZW1vdmVkLiBXaGVuIGBuZ0lmYCByZWNyZWF0ZXMgdGhlIGVsZW1lbnRcbiAqIHRoZSBhZGRlZCBjbGFzcyB3aWxsIGJlIGxvc3QgYmVjYXVzZSB0aGUgb3JpZ2luYWwgY29tcGlsZWQgc3RhdGUgaXMgdXNlZCB0byByZWdlbmVyYXRlIHRoZSBlbGVtZW50LlxuICpcbiAqIEFkZGl0aW9uYWxseSwgeW91IGNhbiBwcm92aWRlIGFuaW1hdGlvbnMgdmlhIHRoZSBgbmdBbmltYXRlYCBtb2R1bGUgdG8gYW5pbWF0ZSB0aGUgYGVudGVyYFxuICogYW5kIGBsZWF2ZWAgZWZmZWN0cy5cbiAqXG4gKiBAYW5pbWF0aW9uc1xuICogfCBBbmltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IE9jY3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCB7QGxpbmsgbmcuJGFuaW1hdGUjZW50ZXIgZW50ZXJ9ICB8IGp1c3QgYWZ0ZXIgdGhlIGBuZ0lmYCBjb250ZW50cyBjaGFuZ2UgYW5kIGEgbmV3IERPTSBlbGVtZW50IGlzIGNyZWF0ZWQgYW5kIGluamVjdGVkIGludG8gdGhlIGBuZ0lmYCBjb250YWluZXIgfFxuICogfCB7QGxpbmsgbmcuJGFuaW1hdGUjbGVhdmUgbGVhdmV9ICB8IGp1c3QgYmVmb3JlIHRoZSBgbmdJZmAgY29udGVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIHxcbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBzY29wZVxuICogQHByaW9yaXR5IDYwMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0lmIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyBmYWxzeSB0aGVuXG4gKiAgICAgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gdHJlZS4gSWYgaXQgaXMgdHJ1dGh5IGEgY29weSBvZiB0aGUgY29tcGlsZWRcbiAqICAgICBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBET00gdHJlZS5cbiAqXG4gKiBAZXhhbXBsZVxuICA8ZXhhbXBsZSBtb2R1bGU9XCJuZ0FuaW1hdGVcIiBkZXBzPVwiYW5ndWxhci1hbmltYXRlLmpzXCIgYW5pbWF0aW9ucz1cInRydWVcIiBuYW1lPVwibmctaWZcIj5cbiAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGxhYmVsPkNsaWNrIG1lOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjaGVja2VkXCIgbmctaW5pdD1cImNoZWNrZWQ9dHJ1ZVwiIC8+PC9sYWJlbD48YnIvPlxuICAgICAgU2hvdyB3aGVuIGNoZWNrZWQ6XG4gICAgICA8c3BhbiBuZy1pZj1cImNoZWNrZWRcIiBjbGFzcz1cImFuaW1hdGUtaWZcIj5cbiAgICAgICAgVGhpcyBpcyByZW1vdmVkIHdoZW4gdGhlIGNoZWNrYm94IGlzIHVuY2hlY2tlZC5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cImFuaW1hdGlvbnMuY3NzXCI+XG4gICAgICAuYW5pbWF0ZS1pZiB7XG4gICAgICAgIGJhY2tncm91bmQ6d2hpdGU7XG4gICAgICAgIGJvcmRlcjoxcHggc29saWQgYmxhY2s7XG4gICAgICAgIHBhZGRpbmc6MTBweDtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtaWYubmctZW50ZXIsIC5hbmltYXRlLWlmLm5nLWxlYXZlIHtcbiAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzO1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1pZi5uZy1lbnRlcixcbiAgICAgIC5hbmltYXRlLWlmLm5nLWxlYXZlLm5nLWxlYXZlLWFjdGl2ZSB7XG4gICAgICAgIG9wYWNpdHk6MDtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtaWYubmctbGVhdmUsXG4gICAgICAuYW5pbWF0ZS1pZi5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUge1xuICAgICAgICBvcGFjaXR5OjE7XG4gICAgICB9XG4gICAgPC9maWxlPlxuICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ0lmRGlyZWN0aXZlID0gWyckYW5pbWF0ZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRhbmltYXRlLCAkY29tcGlsZSkge1xuICByZXR1cm4ge1xuICAgIG11bHRpRWxlbWVudDogdHJ1ZSxcbiAgICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsXG4gICAgcHJpb3JpdHk6IDYwMCxcbiAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICByZXN0cmljdDogJ0EnLFxuICAgICQkdGxiOiB0cnVlLFxuICAgIGxpbms6IGZ1bmN0aW9uKCRzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkge1xuICAgICAgICB2YXIgYmxvY2ssIGNoaWxkU2NvcGUsIHByZXZpb3VzRWxlbWVudHM7XG4gICAgICAgICRzY29wZS4kd2F0Y2goJGF0dHIubmdJZiwgZnVuY3Rpb24gbmdJZldhdGNoQWN0aW9uKHZhbHVlKSB7XG5cbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY2hpbGRTY29wZSkge1xuICAgICAgICAgICAgICAkdHJhbnNjbHVkZShmdW5jdGlvbihjbG9uZSwgbmV3U2NvcGUpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFNjb3BlID0gbmV3U2NvcGU7XG4gICAgICAgICAgICAgICAgY2xvbmVbY2xvbmUubGVuZ3RoKytdID0gJGNvbXBpbGUuJCRjcmVhdGVDb21tZW50KCdlbmQgbmdJZicsICRhdHRyLm5nSWYpO1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9ubHkgbmVlZCB0aGUgZmlyc3QvbGFzdCBub2RlIG9mIHRoZSBjbG9uZWQgbm9kZXMuXG4gICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIHRoZSByZWZlcmVuY2UgdG8gdGhlIGpxbGl0ZSB3cmFwcGVyIGFzIGl0IG1pZ2h0IGJlIGNoYW5nZWQgbGF0ZXJcbiAgICAgICAgICAgICAgICAvLyBieSBhIGRpcmVjdGl2ZSB3aXRoIHRlbXBsYXRlVXJsIHdoZW4gaXRzIHRlbXBsYXRlIGFycml2ZXMuXG4gICAgICAgICAgICAgICAgYmxvY2sgPSB7XG4gICAgICAgICAgICAgICAgICBjbG9uZTogY2xvbmVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNsb25lLCAkZWxlbWVudC5wYXJlbnQoKSwgJGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50cy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50cyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hpbGRTY29wZSkge1xuICAgICAgICAgICAgICBjaGlsZFNjb3BlLiRkZXN0cm95KCk7XG4gICAgICAgICAgICAgIGNoaWxkU2NvcGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudHMgPSBnZXRCbG9ja05vZGVzKGJsb2NrLmNsb25lKTtcbiAgICAgICAgICAgICAgJGFuaW1hdGUubGVhdmUocHJldmlvdXNFbGVtZW50cykuZG9uZShmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPT0gZmFsc2UpIHByZXZpb3VzRWxlbWVudHMgPSBudWxsO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYmxvY2sgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9O1xufV07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdJbmNsdWRlXG4gKiBAcmVzdHJpY3QgRUNBXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGZXRjaGVzLCBjb21waWxlcyBhbmQgaW5jbHVkZXMgYW4gZXh0ZXJuYWwgSFRNTCBmcmFnbWVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgVVJMIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHNhbWUgZG9tYWluIGFuZCBwcm90b2NvbCBhcyB0aGVcbiAqIGFwcGxpY2F0aW9uIGRvY3VtZW50LiBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyB7QGxpbmsgJHNjZSNnZXRUcnVzdGVkUmVzb3VyY2VVcmxcbiAqICRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsfSBvbiBpdC4gVG8gbG9hZCB0ZW1wbGF0ZXMgZnJvbSBvdGhlciBkb21haW5zIG9yIHByb3RvY29sc1xuICogeW91IG1heSBlaXRoZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0IHdoaXRlbGlzdCB0aGVtfSBvclxuICoge0BsaW5rICRzY2UjdHJ1c3RBc1Jlc291cmNlVXJsIHdyYXAgdGhlbX0gYXMgdHJ1c3RlZCB2YWx1ZXMuIFJlZmVyIHRvIEFuZ3VsYXIncyB7QGxpbmtcbiAqIG5nLiRzY2UgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmd9LlxuICpcbiAqIEluIGFkZGl0aW9uLCB0aGUgYnJvd3NlcidzXG4gKiBbU2FtZSBPcmlnaW4gUG9saWN5XShodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Jyb3dzZXJzZWMvd2lraS9QYXJ0MiNTYW1lLW9yaWdpbl9wb2xpY3lfZm9yX1hNTEh0dHBSZXF1ZXN0KVxuICogYW5kIFtDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUyldKGh0dHA6Ly93d3cudzMub3JnL1RSL2NvcnMvKVxuICogcG9saWN5IG1heSBmdXJ0aGVyIHJlc3RyaWN0IHdoZXRoZXIgdGhlIHRlbXBsYXRlIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXG4gKiBGb3IgZXhhbXBsZSwgYG5nSW5jbHVkZWAgd29uJ3Qgd29yayBmb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzIG9uIGFsbCBicm93c2VycyBhbmQgZm9yIGBmaWxlOi8vYFxuICogYWNjZXNzIG9uIHNvbWUgYnJvd3NlcnMuXG4gKlxuICogQGFuaW1hdGlvbnNcbiAqIHwgQW5pbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgfCBPY2N1cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCB7QGxpbmsgbmcuJGFuaW1hdGUjZW50ZXIgZW50ZXJ9ICB8IHdoZW4gdGhlIGV4cHJlc3Npb24gY2hhbmdlcywgb24gdGhlIG5ldyBpbmNsdWRlIHxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2xlYXZlIGxlYXZlfSAgfCB3aGVuIHRoZSBleHByZXNzaW9uIGNoYW5nZXMsIG9uIHRoZSBvbGQgaW5jbHVkZSB8XG4gKlxuICogVGhlIGVudGVyIGFuZCBsZWF2ZSBhbmltYXRpb24gb2NjdXIgY29uY3VycmVudGx5LlxuICpcbiAqIEBzY29wZVxuICogQHByaW9yaXR5IDQwMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZ0luY2x1ZGV8c3JjIGFuZ3VsYXIgZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIFVSTC4gSWYgdGhlIHNvdXJjZSBpcyBhIHN0cmluZyBjb25zdGFudCxcbiAqICAgICAgICAgICAgICAgICBtYWtlIHN1cmUgeW91IHdyYXAgaXQgaW4gKipzaW5nbGUqKiBxdW90ZXMsIGUuZy4gYHNyYz1cIidteVBhcnRpYWxUZW1wbGF0ZS5odG1sJ1wiYC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gb25sb2FkIEV4cHJlc3Npb24gdG8gZXZhbHVhdGUgd2hlbiBhIG5ldyBwYXJ0aWFsIGlzIGxvYWRlZC5cbiAqICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICAgICAgICAgICAgICAgICAgKipOb3RlOioqIFdoZW4gdXNpbmcgb25sb2FkIG9uIFNWRyBlbGVtZW50cyBpbiBJRTExLCB0aGUgYnJvd3NlciB3aWxsIHRyeSB0byBjYWxsXG4gKiAgICAgICAgICAgICAgICAgIGEgZnVuY3Rpb24gd2l0aCB0aGUgbmFtZSBvbiB0aGUgd2luZG93IGVsZW1lbnQsIHdoaWNoIHdpbGwgdXN1YWxseSB0aHJvdyBhXG4gKiAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb24gaXMgdW5kZWZpbmVkXCIgZXJyb3IuIFRvIGZpeCB0aGlzLCB5b3UgY2FuIGluc3RlYWQgdXNlIGBkYXRhLW9ubG9hZGAgb3IgYVxuICogICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgZm9ybSB0aGF0IHtAbGluayBndWlkZS9kaXJlY3RpdmUjbm9ybWFsaXphdGlvbiBtYXRjaGVzfSBgb25sb2FkYC5cbiAqICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAqXG4gKiBAcGFyYW0ge3N0cmluZz19IGF1dG9zY3JvbGwgV2hldGhlciBgbmdJbmNsdWRlYCBzaG91bGQgY2FsbCB7QGxpbmsgbmcuJGFuY2hvclNjcm9sbFxuICogICAgICAgICAgICAgICAgICAkYW5jaG9yU2Nyb2xsfSB0byBzY3JvbGwgdGhlIHZpZXdwb3J0IGFmdGVyIHRoZSBjb250ZW50IGlzIGxvYWRlZC5cbiAqXG4gKiAgICAgICAgICAgICAgICAgIC0gSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCBkaXNhYmxlIHNjcm9sbGluZy5cbiAqICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgYXR0cmlidXRlIGlzIHNldCB3aXRob3V0IHZhbHVlLCBlbmFibGUgc2Nyb2xsaW5nLlxuICogICAgICAgICAgICAgICAgICAtIE90aGVyd2lzZSBlbmFibGUgc2Nyb2xsaW5nIG9ubHkgaWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydXRoeSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICA8ZXhhbXBsZSBtb2R1bGU9XCJpbmNsdWRlRXhhbXBsZVwiIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIG5hbWU9XCJuZy1pbmNsdWRlXCI+XG4gICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICA8c2VsZWN0IG5nLW1vZGVsPVwidGVtcGxhdGVcIiBuZy1vcHRpb25zPVwidC5uYW1lIGZvciB0IGluIHRlbXBsYXRlc1wiPlxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+KGJsYW5rKTwvb3B0aW9uPlxuICAgICAgIDwvc2VsZWN0PlxuICAgICAgIHVybCBvZiB0aGUgdGVtcGxhdGU6IDxjb2RlPnt7dGVtcGxhdGUudXJsfX08L2NvZGU+XG4gICAgICAgPGhyLz5cbiAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGUtYW5pbWF0ZS1jb250YWluZXJcIj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZS1hbmltYXRlXCIgbmctaW5jbHVkZT1cInRlbXBsYXRlLnVybFwiPjwvZGl2PlxuICAgICAgIDwvZGl2PlxuICAgICA8L2Rpdj5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ2luY2x1ZGVFeGFtcGxlJywgWyduZ0FuaW1hdGUnXSlcbiAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAkc2NvcGUudGVtcGxhdGVzID1cbiAgICAgICAgICAgIFt7IG5hbWU6ICd0ZW1wbGF0ZTEuaHRtbCcsIHVybDogJ3RlbXBsYXRlMS5odG1sJ30sXG4gICAgICAgICAgICAgeyBuYW1lOiAndGVtcGxhdGUyLmh0bWwnLCB1cmw6ICd0ZW1wbGF0ZTIuaHRtbCd9XTtcbiAgICAgICAgICAkc2NvcGUudGVtcGxhdGUgPSAkc2NvcGUudGVtcGxhdGVzWzBdO1xuICAgICAgICB9XSk7XG4gICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwidGVtcGxhdGUxLmh0bWxcIj5cbiAgICAgIENvbnRlbnQgb2YgdGVtcGxhdGUxLmh0bWxcbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInRlbXBsYXRlMi5odG1sXCI+XG4gICAgICBDb250ZW50IG9mIHRlbXBsYXRlMi5odG1sXG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJhbmltYXRpb25zLmNzc1wiPlxuICAgICAgLnNsaWRlLWFuaW1hdGUtY29udGFpbmVyIHtcbiAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgICAgIGJhY2tncm91bmQ6d2hpdGU7XG4gICAgICAgIGJvcmRlcjoxcHggc29saWQgYmxhY2s7XG4gICAgICAgIGhlaWdodDo0MHB4O1xuICAgICAgICBvdmVyZmxvdzpoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5zbGlkZS1hbmltYXRlIHtcbiAgICAgICAgcGFkZGluZzoxMHB4O1xuICAgICAgfVxuXG4gICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1lbnRlciwgLnNsaWRlLWFuaW1hdGUubmctbGVhdmUge1xuICAgICAgICB0cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7XG5cbiAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XG4gICAgICAgIHRvcDowO1xuICAgICAgICBsZWZ0OjA7XG4gICAgICAgIHJpZ2h0OjA7XG4gICAgICAgIGJvdHRvbTowO1xuICAgICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgICBwYWRkaW5nOjEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWVudGVyIHtcbiAgICAgICAgdG9wOi01MHB4O1xuICAgICAgfVxuICAgICAgLnNsaWRlLWFuaW1hdGUubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHtcbiAgICAgICAgdG9wOjA7XG4gICAgICB9XG5cbiAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWxlYXZlIHtcbiAgICAgICAgdG9wOjA7XG4gICAgICB9XG4gICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUge1xuICAgICAgICB0b3A6NTBweDtcbiAgICAgIH1cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHRlbXBsYXRlU2VsZWN0ID0gZWxlbWVudChieS5tb2RlbCgndGVtcGxhdGUnKSk7XG4gICAgICB2YXIgaW5jbHVkZUVsZW0gPSBlbGVtZW50KGJ5LmNzcygnW25nLWluY2x1ZGVdJykpO1xuXG4gICAgICBpdCgnc2hvdWxkIGxvYWQgdGVtcGxhdGUxLmh0bWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZXhwZWN0KGluY2x1ZGVFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvQ29udGVudCBvZiB0ZW1wbGF0ZTEuaHRtbC8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbG9hZCB0ZW1wbGF0ZTIuaHRtbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoYnJvd3Nlci5wYXJhbXMuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICAgICAgLy8gRmlyZWZveCBjYW4ndCBoYW5kbGUgdXNpbmcgc2VsZWN0c1xuICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy80ODBcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGVTZWxlY3QuY2xpY2soKTtcbiAgICAgICAgdGVtcGxhdGVTZWxlY3QuYWxsKGJ5LmNzcygnb3B0aW9uJykpLmdldCgyKS5jbGljaygpO1xuICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IG9mIHRlbXBsYXRlMi5odG1sLyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgdG8gYmxhbmsnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgICAgIC8vIEZpcmVmb3ggY2FuJ3QgaGFuZGxlIHVzaW5nIHNlbGVjdHNcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGVTZWxlY3QuY2xpY2soKTtcbiAgICAgICAgdGVtcGxhdGVTZWxlY3QuYWxsKGJ5LmNzcygnb3B0aW9uJykpLmdldCgwKS5jbGljaygpO1xuICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uaXNQcmVzZW50KCkpLnRvQmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgPC9maWxlPlxuICA8L2V4YW1wbGU+XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBldmVudFxuICogQG5hbWUgbmdJbmNsdWRlIyRpbmNsdWRlQ29udGVudFJlcXVlc3RlZFxuICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBzY29wZSBuZ0luY2x1ZGUgd2FzIGRlY2xhcmVkIGluXG4gKiBAZGVzY3JpcHRpb25cbiAqIEVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbmdJbmNsdWRlIGNvbnRlbnQgaXMgcmVxdWVzdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVVJMIG9mIGNvbnRlbnQgdG8gbG9hZC5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGV2ZW50XG4gKiBAbmFtZSBuZ0luY2x1ZGUjJGluY2x1ZGVDb250ZW50TG9hZGVkXG4gKiBAZXZlbnRUeXBlIGVtaXQgb24gdGhlIGN1cnJlbnQgbmdJbmNsdWRlIHNjb3BlXG4gKiBAZGVzY3JpcHRpb25cbiAqIEVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbmdJbmNsdWRlIGNvbnRlbnQgaXMgcmVsb2FkZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0LlxuICogQHBhcmFtIHtTdHJpbmd9IHNyYyBVUkwgb2YgY29udGVudCB0byBsb2FkLlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZXZlbnRcbiAqIEBuYW1lIG5nSW5jbHVkZSMkaW5jbHVkZUNvbnRlbnRFcnJvclxuICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBzY29wZSBuZ0luY2x1ZGUgd2FzIGRlY2xhcmVkIGluXG4gKiBAZGVzY3JpcHRpb25cbiAqIEVtaXR0ZWQgd2hlbiBhIHRlbXBsYXRlIEhUVFAgcmVxdWVzdCB5aWVsZHMgYW4gZXJyb25lb3VzIHJlc3BvbnNlIChzdGF0dXMgPCAyMDAgfHwgc3RhdHVzID4gMjk5KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVVJMIG9mIGNvbnRlbnQgdG8gbG9hZC5cbiAqL1xudmFyIG5nSW5jbHVkZURpcmVjdGl2ZSA9IFsnJHRlbXBsYXRlUmVxdWVzdCcsICckYW5jaG9yU2Nyb2xsJywgJyRhbmltYXRlJyxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCR0ZW1wbGF0ZVJlcXVlc3QsICAgJGFuY2hvclNjcm9sbCwgICAkYW5pbWF0ZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnRUNBJyxcbiAgICBwcmlvcml0eTogNDAwLFxuICAgIHRlcm1pbmFsOiB0cnVlLFxuICAgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JyxcbiAgICBjb250cm9sbGVyOiBhbmd1bGFyLm5vb3AsXG4gICAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cikge1xuICAgICAgdmFyIHNyY0V4cCA9IGF0dHIubmdJbmNsdWRlIHx8IGF0dHIuc3JjLFxuICAgICAgICAgIG9ubG9hZEV4cCA9IGF0dHIub25sb2FkIHx8ICcnLFxuICAgICAgICAgIGF1dG9TY3JvbGxFeHAgPSBhdHRyLmF1dG9zY3JvbGw7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkge1xuICAgICAgICB2YXIgY2hhbmdlQ291bnRlciA9IDAsXG4gICAgICAgICAgICBjdXJyZW50U2NvcGUsXG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQsXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudDtcblxuICAgICAgICB2YXIgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50U2NvcGUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZGVzdHJveSgpO1xuICAgICAgICAgICAgY3VycmVudFNjb3BlID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAkYW5pbWF0ZS5sZWF2ZShjdXJyZW50RWxlbWVudCkuZG9uZShmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IGZhbHNlKSBwcmV2aW91c0VsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSBjdXJyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuJHdhdGNoKHNyY0V4cCwgZnVuY3Rpb24gbmdJbmNsdWRlV2F0Y2hBY3Rpb24oc3JjKSB7XG4gICAgICAgICAgdmFyIGFmdGVyQW5pbWF0aW9uID0gZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPT0gZmFsc2UgJiYgaXNEZWZpbmVkKGF1dG9TY3JvbGxFeHApICYmXG4gICAgICAgICAgICAgICghYXV0b1Njcm9sbEV4cCB8fCBzY29wZS4kZXZhbChhdXRvU2Nyb2xsRXhwKSkpIHtcbiAgICAgICAgICAgICAgICAkYW5jaG9yU2Nyb2xsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgdGhpc0NoYW5nZUlkID0gKytjaGFuZ2VDb3VudGVyO1xuXG4gICAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgICAgLy9zZXQgdGhlIDJuZCBwYXJhbSB0byB0cnVlIHRvIGlnbm9yZSB0aGUgdGVtcGxhdGUgcmVxdWVzdCBlcnJvciBzbyB0aGF0IHRoZSBpbm5lclxuICAgICAgICAgICAgLy9jb250ZW50cyBhbmQgc2NvcGUgY2FuIGJlIGNsZWFuZWQgdXAuXG4gICAgICAgICAgICAkdGVtcGxhdGVSZXF1ZXN0KHNyYywgdHJ1ZSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICBpZiAoc2NvcGUuJCRkZXN0cm95ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICBpZiAodGhpc0NoYW5nZUlkICE9PSBjaGFuZ2VDb3VudGVyKSByZXR1cm47XG4gICAgICAgICAgICAgIHZhciBuZXdTY29wZSA9IHNjb3BlLiRuZXcoKTtcbiAgICAgICAgICAgICAgY3RybC50ZW1wbGF0ZSA9IHJlc3BvbnNlO1xuXG4gICAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGxpbmsgYWxsIGNoaWxkcmVuIG9mIG5nLWluY2x1ZGUgdGhhdCB3ZXJlIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgLy8gaHRtbC4gSWYgdGhhdCBjb250ZW50IGNvbnRhaW5zIGNvbnRyb2xsZXJzLCAuLi4gdGhleSBjb3VsZCBwb2xsdXRlL2NoYW5nZSB0aGUgc2NvcGUuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHVzaW5nIG5nLWluY2x1ZGUgb24gYW4gZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgY29udGVudCBkb2VzIG5vdCBtYWtlIHNlbnNlLi4uXG4gICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbid0IHJlbW92ZSB0aGVtIGluIHRoZSBjbG9uZUF0dGNoRm4gb2YgJHRyYW5zY2x1ZGUgYXMgdGhhdFxuICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGxpbmtpbmcgdGhlIGNvbnRlbnQsIHdoaWNoIHdvdWxkIGFwcGx5IGNoaWxkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMgdG8gbm9uIGV4aXN0aW5nIGVsZW1lbnRzLlxuICAgICAgICAgICAgICB2YXIgY2xvbmUgPSAkdHJhbnNjbHVkZShuZXdTY29wZSwgZnVuY3Rpb24oY2xvbmUpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwTGFzdEluY2x1ZGVDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2xvbmUsIG51bGwsICRlbGVtZW50KS5kb25lKGFmdGVyQW5pbWF0aW9uKTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY3VycmVudFNjb3BlID0gbmV3U2NvcGU7XG4gICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY2xvbmU7XG5cbiAgICAgICAgICAgICAgY3VycmVudFNjb3BlLiRlbWl0KCckaW5jbHVkZUNvbnRlbnRMb2FkZWQnLCBzcmMpO1xuICAgICAgICAgICAgICBzY29wZS4kZXZhbChvbmxvYWRFeHApO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChzY29wZS4kJGRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzQ2hhbmdlSWQgPT09IGNoYW5nZUNvdW50ZXIpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwTGFzdEluY2x1ZGVDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGVtaXQoJyRpbmNsdWRlQ29udGVudEVycm9yJywgc3JjKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzY29wZS4kZW1pdCgnJGluY2x1ZGVDb250ZW50UmVxdWVzdGVkJywgc3JjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCgpO1xuICAgICAgICAgICAgY3RybC50ZW1wbGF0ZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufV07XG5cbi8vIFRoaXMgZGlyZWN0aXZlIGlzIGNhbGxlZCBkdXJpbmcgdGhlICR0cmFuc2NsdWRlIGNhbGwgb2YgdGhlIGZpcnN0IGBuZ0luY2x1ZGVgIGRpcmVjdGl2ZS5cbi8vIEl0IHdpbGwgcmVwbGFjZSBhbmQgY29tcGlsZSB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBsb2FkZWQgdGVtcGxhdGUuXG4vLyBXZSBuZWVkIHRoaXMgZGlyZWN0aXZlIHNvIHRoYXQgdGhlIGVsZW1lbnQgY29udGVudCBpcyBhbHJlYWR5IGZpbGxlZCB3aGVuXG4vLyB0aGUgbGluayBmdW5jdGlvbiBvZiBhbm90aGVyIGRpcmVjdGl2ZSBvbiB0aGUgc2FtZSBlbGVtZW50IGFzIG5nSW5jbHVkZVxuLy8gaXMgY2FsbGVkLlxudmFyIG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlID0gWyckY29tcGlsZScsXG4gIGZ1bmN0aW9uKCRjb21waWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRUNBJyxcbiAgICAgIHByaW9yaXR5OiAtNDAwLFxuICAgICAgcmVxdWlyZTogJ25nSW5jbHVkZScsXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsKSB7XG4gICAgICAgIGlmICh0b1N0cmluZy5jYWxsKCRlbGVtZW50WzBdKS5tYXRjaCgvU1ZHLykpIHtcbiAgICAgICAgICAvLyBXZWJLaXQ6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzU2OTggLS0tIFNWRyBlbGVtZW50cyBkbyBub3RcbiAgICAgICAgICAvLyBzdXBwb3J0IGlubmVySFRNTCwgc28gZGV0ZWN0IHRoaXMgaGVyZSBhbmQgdHJ5IHRvIGdlbmVyYXRlIHRoZSBjb250ZW50c1xuICAgICAgICAgIC8vIHNwZWNpYWxseS5cbiAgICAgICAgICAkZWxlbWVudC5lbXB0eSgpO1xuICAgICAgICAgICRjb21waWxlKGpxTGl0ZUJ1aWxkRnJhZ21lbnQoY3RybC50ZW1wbGF0ZSwgd2luZG93LmRvY3VtZW50KS5jaGlsZE5vZGVzKShzY29wZSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gbmFtZXNwYWNlQWRhcHRlZENsb25lKGNsb25lKSB7XG4gICAgICAgICAgICAkZWxlbWVudC5hcHBlbmQoY2xvbmUpO1xuICAgICAgICAgIH0sIHtmdXR1cmVQYXJlbnRFbGVtZW50OiAkZWxlbWVudH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgICRlbGVtZW50Lmh0bWwoY3RybC50ZW1wbGF0ZSk7XG4gICAgICAgICRjb21waWxlKCRlbGVtZW50LmNvbnRlbnRzKCkpKHNjb3BlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0luaXRcbiAqIEByZXN0cmljdCBBQ1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ0luaXRgIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGV2YWx1YXRlIGFuIGV4cHJlc3Npb24gaW4gdGhlXG4gKiBjdXJyZW50IHNjb3BlLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSBhYnVzZWQgdG8gYWRkIHVubmVjZXNzYXJ5IGFtb3VudHMgb2YgbG9naWMgaW50byB5b3VyIHRlbXBsYXRlcy5cbiAqIFRoZXJlIGFyZSBvbmx5IGEgZmV3IGFwcHJvcHJpYXRlIHVzZXMgb2YgYG5nSW5pdGAsIHN1Y2ggYXMgZm9yIGFsaWFzaW5nIHNwZWNpYWwgcHJvcGVydGllcyBvZlxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBgbmdSZXBlYXRgfSwgYXMgc2VlbiBpbiB0aGUgZGVtbyBiZWxvdzsgYW5kIGZvciBpbmplY3RpbmcgZGF0YSB2aWFcbiAqIHNlcnZlciBzaWRlIHNjcmlwdGluZy4gQmVzaWRlcyB0aGVzZSBmZXcgY2FzZXMsIHlvdSBzaG91bGQgdXNlIHtAbGluayBndWlkZS9jb250cm9sbGVyIGNvbnRyb2xsZXJzfVxuICogcmF0aGVyIHRoYW4gYG5nSW5pdGAgdG8gaW5pdGlhbGl6ZSB2YWx1ZXMgb24gYSBzY29wZS5cbiAqIDwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAqKk5vdGUqKjogSWYgeW91IGhhdmUgYXNzaWdubWVudCBpbiBgbmdJbml0YCBhbG9uZyB3aXRoIGEge0BsaW5rIG5nLiRmaWx0ZXIgYGZpbHRlcmB9LCBtYWtlXG4gKiBzdXJlIHlvdSBoYXZlIHBhcmVudGhlc2VzIHRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdG9yIHByZWNlZGVuY2U6XG4gKiA8cHJlIGNsYXNzPVwicHJldHR5cHJpbnRcIj5cbiAqIGA8ZGl2IG5nLWluaXQ9XCJ0ZXN0MSA9ICgkaW5kZXggfCB0b1N0cmluZylcIj48L2Rpdj5gXG4gKiA8L3ByZT5cbiAqIDwvZGl2PlxuICpcbiAqIEBwcmlvcml0eSA0NTBcbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdJbml0IHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG1vZHVsZT1cImluaXRFeGFtcGxlXCIgbmFtZT1cIm5nLWluaXRcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgIDxzY3JpcHQ+XG4gICAgIGFuZ3VsYXIubW9kdWxlKCdpbml0RXhhbXBsZScsIFtdKVxuICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAkc2NvcGUubGlzdCA9IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXTtcbiAgICAgICB9XSk7XG4gICA8L3NjcmlwdD5cbiAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgIDxkaXYgbmctcmVwZWF0PVwiaW5uZXJMaXN0IGluIGxpc3RcIiBuZy1pbml0PVwib3V0ZXJJbmRleCA9ICRpbmRleFwiPlxuICAgICAgIDxkaXYgbmctcmVwZWF0PVwidmFsdWUgaW4gaW5uZXJMaXN0XCIgbmctaW5pdD1cImlubmVySW5kZXggPSAkaW5kZXhcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4YW1wbGUtaW5pdFwiPmxpc3RbIHt7b3V0ZXJJbmRleH19IF1bIHt7aW5uZXJJbmRleH19IF0gPSB7e3ZhbHVlfX07PC9zcGFuPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2Rpdj5cbiAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGFsaWFzIGluZGV4IHBvc2l0aW9ucycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgdmFyIGVsZW1lbnRzID0gZWxlbWVudC5hbGwoYnkuY3NzKCcuZXhhbXBsZS1pbml0JykpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnRzLmdldCgwKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3RbIDAgXVsgMCBdID0gYTsnKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50cy5nZXQoMSkuZ2V0VGV4dCgpKS50b0JlKCdsaXN0WyAwIF1bIDEgXSA9IGI7Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDIpLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMSBdWyAwIF0gPSBjOycpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnRzLmdldCgzKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3RbIDEgXVsgMSBdID0gZDsnKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG52YXIgbmdJbml0RGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoe1xuICBwcmlvcml0eTogNDUwLFxuICBjb21waWxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgc2NvcGUuJGV2YWwoYXR0cnMubmdJbml0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0xpc3RcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRleHQgaW5wdXQgdGhhdCBjb252ZXJ0cyBiZXR3ZWVuIGEgZGVsaW1pdGVkIHN0cmluZyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gVGhlIGRlZmF1bHRcbiAqIGRlbGltaXRlciBpcyBhIGNvbW1hIGZvbGxvd2VkIGJ5IGEgc3BhY2UgLSBlcXVpdmFsZW50IHRvIGBuZy1saXN0PVwiLCBcImAuIFlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbVxuICogZGVsaW1pdGVyIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYG5nTGlzdGAgYXR0cmlidXRlIC0gZm9yIGV4YW1wbGUsIGBuZy1saXN0PVwiIHwgXCJgLlxuICpcbiAqIFRoZSBiZWhhdmlvdXIgb2YgdGhlIGRpcmVjdGl2ZSBpcyBhZmZlY3RlZCBieSB0aGUgdXNlIG9mIHRoZSBgbmdUcmltYCBhdHRyaWJ1dGUuXG4gKiAqIElmIGBuZ1RyaW1gIGlzIHNldCB0byBgXCJmYWxzZVwiYCB0aGVuIHdoaXRlc3BhY2UgYXJvdW5kIGJvdGggdGhlIHNlcGFyYXRvciBhbmQgZWFjaFxuICogICBsaXN0IGl0ZW0gaXMgcmVzcGVjdGVkLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgdXNlciBvZiB0aGUgZGlyZWN0aXZlIGlzIHJlc3BvbnNpYmxlIGZvclxuICogICBkZWFsaW5nIHdpdGggd2hpdGVzcGFjZSBidXQgYWxzbyBhbGxvd3MgeW91IHRvIHVzZSB3aGl0ZXNwYWNlIGFzIGEgZGVsaW1pdGVyLCBzdWNoIGFzIGFcbiAqICAgdGFiIG9yIG5ld2xpbmUgY2hhcmFjdGVyLlxuICogKiBPdGhlcndpc2Ugd2hpdGVzcGFjZSBhcm91bmQgdGhlIGRlbGltaXRlciBpcyBpZ25vcmVkIHdoZW4gc3BsaXR0aW5nIChhbHRob3VnaCBpdCBpcyByZXNwZWN0ZWRcbiAqICAgd2hlbiBqb2luaW5nIHRoZSBsaXN0IGl0ZW1zIGJhY2sgdG9nZXRoZXIpIGFuZCB3aGl0ZXNwYWNlIGFyb3VuZCBlYWNoIGxpc3QgaXRlbSBpcyBzdHJpcHBlZFxuICogICBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLlxuICpcbiAqICMjIyBFeGFtcGxlIHdpdGggVmFsaWRhdGlvblxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ0xpc3QtZGlyZWN0aXZlXCIgbW9kdWxlPVwibGlzdEV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgICBhbmd1bGFyLm1vZHVsZSgnbGlzdEV4YW1wbGUnLCBbXSlcbiAqICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICogICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydtb3JwaGV1cycsICduZW8nLCAndHJpbml0eSddO1xuICogICAgICAgIH1dKTtcbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiIG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICAgICA8bGFiZWw+TGlzdDogPGlucHV0IG5hbWU9XCJuYW1lc0lucHV0XCIgbmctbW9kZWw9XCJuYW1lc1wiIG5nLWxpc3QgcmVxdWlyZWQ+PC9sYWJlbD5cbiAqICAgICAgPHNwYW4gcm9sZT1cImFsZXJ0XCI+XG4gKiAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0ubmFtZXNJbnB1dC4kZXJyb3IucmVxdWlyZWRcIj5cbiAqICAgICAgICBSZXF1aXJlZCE8L3NwYW4+XG4gKiAgICAgIDwvc3Bhbj5cbiAqICAgICAgPGJyPlxuICogICAgICA8dHQ+bmFtZXMgPSB7e25hbWVzfX08L3R0Pjxici8+XG4gKiAgICAgIDx0dD5teUZvcm0ubmFtZXNJbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5uYW1lc0lucHV0LiR2YWxpZH19PC90dD48YnIvPlxuICogICAgICA8dHQ+bXlGb3JtLm5hbWVzSW5wdXQuJGVycm9yID0ge3tteUZvcm0ubmFtZXNJbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz5cbiAqICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAqICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICogICAgIDwvZm9ybT5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiAgICAgdmFyIGxpc3RJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ25hbWVzJykpO1xuICogICAgIHZhciBuYW1lcyA9IGVsZW1lbnQoYnkuZXhhY3RCaW5kaW5nKCduYW1lcycpKTtcbiAqICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5uYW1lc0lucHV0LiR2YWxpZCcpKTtcbiAqICAgICB2YXIgZXJyb3IgPSBlbGVtZW50KGJ5LmNzcygnc3Bhbi5lcnJvcicpKTtcbiAqXG4gKiAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICBleHBlY3QobmFtZXMuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ1tcIm1vcnBoZXVzXCIsXCJuZW9cIixcInRyaW5pdHlcIl0nKTtcbiAqICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpO1xuICogICAgICAgZXhwZWN0KGVycm9yLmdldENzc1ZhbHVlKCdkaXNwbGF5JykpLnRvQmUoJ25vbmUnKTtcbiAqICAgICB9KTtcbiAqXG4gKiAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICBsaXN0SW5wdXQuY2xlYXIoKTtcbiAqICAgICAgIGxpc3RJbnB1dC5zZW5kS2V5cygnJyk7XG4gKlxuICogICAgICAgZXhwZWN0KG5hbWVzLmdldFRleHQoKSkudG9Db250YWluKCcnKTtcbiAqICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAqICAgICAgIGV4cGVjdChlcnJvci5nZXRDc3NWYWx1ZSgnZGlzcGxheScpKS5ub3QudG9CZSgnbm9uZScpO1xuICogICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogIyMjIEV4YW1wbGUgLSBzcGxpdHRpbmcgb24gbmV3bGluZVxuICogPGV4YW1wbGUgbmFtZT1cIm5nTGlzdC1kaXJlY3RpdmUtbmV3bGluZXNcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD1cImxpc3RcIiBuZy1saXN0PVwiJiMxMDtcIiBuZy10cmltPVwiZmFsc2VcIj48L3RleHRhcmVhPlxuICogICAgPHByZT57eyBsaXN0IHwganNvbiB9fTwvcHJlPlxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAqICAgICBpdChcInNob3VsZCBzcGxpdCB0aGUgdGV4dCBieSBuZXdsaW5lc1wiLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIHZhciBsaXN0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsaXN0JykpO1xuICogICAgICAgdmFyIG91dHB1dCA9IGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCB8IGpzb24nKSk7XG4gKiAgICAgICBsaXN0SW5wdXQuc2VuZEtleXMoJ2FiY1xcbmRlZlxcbmdoaScpO1xuICogICAgICAgZXhwZWN0KG91dHB1dC5nZXRUZXh0KCkpLnRvQ29udGFpbignW1xcbiAgXCJhYmNcIixcXG4gIFwiZGVmXCIsXFxuICBcImdoaVwiXFxuXScpO1xuICogICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogQGVsZW1lbnQgaW5wdXRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdMaXN0IG9wdGlvbmFsIGRlbGltaXRlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHNwbGl0IHRoZSB2YWx1ZS5cbiAqL1xudmFyIG5nTGlzdERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgcHJpb3JpdHk6IDEwMCxcbiAgICByZXF1aXJlOiAnbmdNb2RlbCcsXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwpIHtcbiAgICAgIHZhciBuZ0xpc3QgPSBhdHRyLm5nTGlzdCB8fCAnLCAnO1xuICAgICAgdmFyIHRyaW1WYWx1ZXMgPSBhdHRyLm5nVHJpbSAhPT0gJ2ZhbHNlJztcbiAgICAgIHZhciBzZXBhcmF0b3IgPSB0cmltVmFsdWVzID8gdHJpbShuZ0xpc3QpIDogbmdMaXN0O1xuXG4gICAgICB2YXIgcGFyc2UgPSBmdW5jdGlvbih2aWV3VmFsdWUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHZpZXdWYWx1ZSBpcyBpbnZhbGlkIChzYXkgcmVxdWlyZWQgYnV0IGVtcHR5KSBpdCB3aWxsIGJlIGB1bmRlZmluZWRgXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh2aWV3VmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcblxuICAgICAgICBpZiAodmlld1ZhbHVlKSB7XG4gICAgICAgICAgZm9yRWFjaCh2aWV3VmFsdWUuc3BsaXQoc2VwYXJhdG9yKSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgbGlzdC5wdXNoKHRyaW1WYWx1ZXMgPyB0cmltKHZhbHVlKSA6IHZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgfTtcblxuICAgICAgY3RybC4kcGFyc2Vycy5wdXNoKHBhcnNlKTtcbiAgICAgIGN0cmwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUuam9pbihuZ0xpc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBPdmVycmlkZSB0aGUgc3RhbmRhcmQgJGlzRW1wdHkgYmVjYXVzZSBhbiBlbXB0eSBhcnJheSBtZWFucyB0aGUgaW5wdXQgaXMgZW1wdHkuXG4gICAgICBjdHJsLiRpc0VtcHR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZSB8fCAhdmFsdWUubGVuZ3RoO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKiBnbG9iYWwgVkFMSURfQ0xBU1M6IHRydWUsXG4gIElOVkFMSURfQ0xBU1M6IHRydWUsXG4gIFBSSVNUSU5FX0NMQVNTOiB0cnVlLFxuICBESVJUWV9DTEFTUzogdHJ1ZSxcbiAgVU5UT1VDSEVEX0NMQVNTOiB0cnVlLFxuICBUT1VDSEVEX0NMQVNTOiB0cnVlLFxuICBQRU5ESU5HX0NMQVNTOiB0cnVlLFxuICBhZGRTZXRWYWxpZGl0eU1ldGhvZDogdHJ1ZSxcbiAgc2V0dXBWYWxpZGl0eTogdHJ1ZSxcbiAgZGVmYXVsdE1vZGVsT3B0aW9uczogZmFsc2VcbiovXG5cblxudmFyIFZBTElEX0NMQVNTID0gJ25nLXZhbGlkJyxcbiAgICBJTlZBTElEX0NMQVNTID0gJ25nLWludmFsaWQnLFxuICAgIFBSSVNUSU5FX0NMQVNTID0gJ25nLXByaXN0aW5lJyxcbiAgICBESVJUWV9DTEFTUyA9ICduZy1kaXJ0eScsXG4gICAgVU5UT1VDSEVEX0NMQVNTID0gJ25nLXVudG91Y2hlZCcsXG4gICAgVE9VQ0hFRF9DTEFTUyA9ICduZy10b3VjaGVkJyxcbiAgICBFTVBUWV9DTEFTUyA9ICduZy1lbXB0eScsXG4gICAgTk9UX0VNUFRZX0NMQVNTID0gJ25nLW5vdC1lbXB0eSc7XG5cbnZhciBuZ01vZGVsTWluRXJyID0gbWluRXJyKCduZ01vZGVsJyk7XG5cbi8qKlxuICogQG5nZG9jIHR5cGVcbiAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXJcbiAqXG4gKiBAcHJvcGVydHkgeyp9ICR2aWV3VmFsdWUgVGhlIGFjdHVhbCB2YWx1ZSBmcm9tIHRoZSBjb250cm9sJ3Mgdmlldy4gRm9yIGBpbnB1dGAgZWxlbWVudHMsIHRoaXMgaXMgYVxuICogU3RyaW5nLiBTZWUge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFZpZXdWYWx1ZX0gZm9yIGluZm9ybWF0aW9uIGFib3V0IHdoZW4gdGhlICR2aWV3VmFsdWVcbiAqIGlzIHNldC5cbiAqIEBwcm9wZXJ0eSB7Kn0gJG1vZGVsVmFsdWUgVGhlIHZhbHVlIGluIHRoZSBtb2RlbCB0aGF0IHRoZSBjb250cm9sIGlzIGJvdW5kIHRvLlxuICogQHByb3BlcnR5IHtBcnJheS48RnVuY3Rpb24+fSAkcGFyc2VycyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gZXhlY3V0ZSwgYXMgYSBwaXBlbGluZSwgd2hlbmV2ZXJcbiAgICAgICB0aGUgY29udHJvbCByZWFkcyB2YWx1ZSBmcm9tIHRoZSBET00uIFRoZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbiBhcnJheSBvcmRlciwgZWFjaCBwYXNzaW5nXG4gICAgICAgaXRzIHJldHVybiB2YWx1ZSB0aHJvdWdoIHRvIHRoZSBuZXh0LiBUaGUgbGFzdCByZXR1cm4gdmFsdWUgaXMgZm9yd2FyZGVkIHRvIHRoZVxuICAgICAgIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2YWxpZGF0b3JzIGAkdmFsaWRhdG9yc2B9IGNvbGxlY3Rpb24uXG5cblBhcnNlcnMgYXJlIHVzZWQgdG8gc2FuaXRpemUgLyBjb252ZXJ0IHRoZSB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlXG5gJHZpZXdWYWx1ZWB9LlxuXG5SZXR1cm5pbmcgYHVuZGVmaW5lZGAgZnJvbSBhIHBhcnNlciBtZWFucyBhIHBhcnNlIGVycm9yIG9jY3VycmVkLiBJbiB0aGF0IGNhc2UsXG5ubyB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdG9ycyBgJHZhbGlkYXRvcnNgfSB3aWxsIHJ1biBhbmQgdGhlIGBuZ01vZGVsYFxud2lsbCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAgdW5sZXNzIHtAbGluayBuZ01vZGVsT3B0aW9ucyBgbmdNb2RlbE9wdGlvbnMuYWxsb3dJbnZhbGlkYH1cbmlzIHNldCB0byBgdHJ1ZWAuIFRoZSBwYXJzZSBlcnJvciBpcyBzdG9yZWQgaW4gYG5nTW9kZWwuJGVycm9yLnBhcnNlYC5cblxuICpcbiAqIEBwcm9wZXJ0eSB7QXJyYXkuPEZ1bmN0aW9uPn0gJGZvcm1hdHRlcnMgQXJyYXkgb2YgZnVuY3Rpb25zIHRvIGV4ZWN1dGUsIGFzIGEgcGlwZWxpbmUsIHdoZW5ldmVyXG4gICAgICAgdGhlIG1vZGVsIHZhbHVlIGNoYW5nZXMuIFRoZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbiByZXZlcnNlIGFycmF5IG9yZGVyLCBlYWNoIHBhc3NpbmcgdGhlIHZhbHVlIHRocm91Z2ggdG8gdGhlXG4gICAgICAgbmV4dC4gVGhlIGxhc3QgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGFjdHVhbCBET00gdmFsdWUuXG4gICAgICAgVXNlZCB0byBmb3JtYXQgLyBjb252ZXJ0IHZhbHVlcyBmb3IgZGlzcGxheSBpbiB0aGUgY29udHJvbC5cbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUpIHtcbiAqICAgaWYgKHZhbHVlKSB7XG4gKiAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gKiAgIH1cbiAqIH1cbiAqIG5nTW9kZWwuJGZvcm1hdHRlcnMucHVzaChmb3JtYXR0ZXIpO1xuICogYGBgXG4gKlxuICogQHByb3BlcnR5IHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24+fSAkdmFsaWRhdG9ycyBBIGNvbGxlY3Rpb24gb2YgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWVkXG4gKiAgICAgIHdoZW5ldmVyIHRoZSBtb2RlbCB2YWx1ZSBjaGFuZ2VzLiBUaGUga2V5IHZhbHVlIHdpdGhpbiB0aGUgb2JqZWN0IHJlZmVycyB0byB0aGUgbmFtZSBvZiB0aGVcbiAqICAgICAgdmFsaWRhdG9yIHdoaWxlIHRoZSBmdW5jdGlvbiByZWZlcnMgdG8gdGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uLiBUaGUgdmFsaWRhdGlvbiBvcGVyYXRpb24gaXNcbiAqICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgbW9kZWwgdmFsdWUgYXMgYW4gYXJndW1lbnQgYW5kIG11c3QgcmV0dXJuIGEgdHJ1ZSBvciBmYWxzZSB2YWx1ZSBkZXBlbmRpbmdcbiAqICAgICAgb24gdGhlIHJlc3BvbnNlIG9mIHRoYXQgdmFsaWRhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogbmdNb2RlbC4kdmFsaWRhdG9ycy52YWxpZENoYXJhY3RlcnMgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAqICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7XG4gKiAgIHJldHVybiAvWzAtOV0rLy50ZXN0KHZhbHVlKSAmJlxuICogICAgICAgICAgL1thLXpdKy8udGVzdCh2YWx1ZSkgJiZcbiAqICAgICAgICAgIC9bQS1aXSsvLnRlc3QodmFsdWUpICYmXG4gKiAgICAgICAgICAvXFxXKy8udGVzdCh2YWx1ZSk7XG4gKiB9O1xuICogYGBgXG4gKlxuICogQHByb3BlcnR5IHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24+fSAkYXN5bmNWYWxpZGF0b3JzIEEgY29sbGVjdGlvbiBvZiB2YWxpZGF0aW9ucyB0aGF0IGFyZSBleHBlY3RlZCB0b1xuICogICAgICBwZXJmb3JtIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIChlLmcuIGEgSFRUUCByZXF1ZXN0KS4gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gdGhhdCBpcyBwcm92aWRlZFxuICogICAgICBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBwcm9taXNlIHdoZW4gaXQgaXMgcnVuIGR1cmluZyB0aGUgbW9kZWwgdmFsaWRhdGlvbiBwcm9jZXNzLiBPbmNlIHRoZSBwcm9taXNlXG4gKiAgICAgIGlzIGRlbGl2ZXJlZCB0aGVuIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyB3aWxsIGJlIHNldCB0byB0cnVlIHdoZW4gZnVsZmlsbGVkIGFuZCBmYWxzZSB3aGVuIHJlamVjdGVkLlxuICogICAgICBXaGVuIHRoZSBhc3luY2hyb25vdXMgdmFsaWRhdG9ycyBhcmUgdHJpZ2dlcmVkLCBlYWNoIG9mIHRoZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHBhcmFsbGVsIGFuZCB0aGUgbW9kZWxcbiAqICAgICAgdmFsdWUgd2lsbCBvbmx5IGJlIHVwZGF0ZWQgb25jZSBhbGwgdmFsaWRhdG9ycyBoYXZlIGJlZW4gZnVsZmlsbGVkLiBBcyBsb25nIGFzIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0b3JcbiAqICAgICAgaXMgdW5mdWxmaWxsZWQsIGl0cyBrZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29udHJvbGxlcnMgYCRwZW5kaW5nYCBwcm9wZXJ0eS4gQWxzbywgYWxsIGFzeW5jaHJvbm91cyB2YWxpZGF0b3JzXG4gKiAgICAgIHdpbGwgb25seSBydW4gb25jZSBhbGwgc3luY2hyb25vdXMgdmFsaWRhdG9ycyBoYXZlIHBhc3NlZC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGlmICRodHRwIGlzIHVzZWQgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgc2VydmVyIHJldHVybnMgYSBzdWNjZXNzIEhUVFAgcmVzcG9uc2UgY29kZVxuICogaW4gb3JkZXIgdG8gZnVsZmlsbCB0aGUgdmFsaWRhdGlvbiBhbmQgYSBzdGF0dXMgbGV2ZWwgb2YgYDR4eGAgaW4gb3JkZXIgdG8gcmVqZWN0IHRoZSB2YWxpZGF0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBuZ01vZGVsLiRhc3luY1ZhbGlkYXRvcnMudW5pcXVlVXNlcm5hbWUgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAqICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7XG4gKlxuICogICAvLyBMb29rdXAgdXNlciBieSB1c2VybmFtZVxuICogICByZXR1cm4gJGh0dHAuZ2V0KCcvYXBpL3VzZXJzLycgKyB2YWx1ZSkuXG4gKiAgICAgIHRoZW4oZnVuY3Rpb24gcmVzb2x2ZWQoKSB7XG4gKiAgICAgICAgLy91c2VybmFtZSBleGlzdHMsIHRoaXMgbWVhbnMgdmFsaWRhdGlvbiBmYWlsc1xuICogICAgICAgIHJldHVybiAkcS5yZWplY3QoJ2V4aXN0cycpO1xuICogICAgICB9LCBmdW5jdGlvbiByZWplY3RlZCgpIHtcbiAqICAgICAgICAvL3VzZXJuYW1lIGRvZXMgbm90IGV4aXN0LCB0aGVyZWZvcmUgdGhpcyB2YWxpZGF0aW9uIHBhc3Nlc1xuICogICAgICAgIHJldHVybiB0cnVlO1xuICogICAgICB9KTtcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBAcHJvcGVydHkge0FycmF5LjxGdW5jdGlvbj59ICR2aWV3Q2hhbmdlTGlzdGVuZXJzIEFycmF5IG9mIGZ1bmN0aW9ucyB0byBleGVjdXRlIHdoZW5ldmVyIHRoZVxuICogICAgIHZpZXcgdmFsdWUgaGFzIGNoYW5nZWQuIEl0IGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC5cbiAqICAgICBUaGlzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFkZGl0aW9uYWwgJHdhdGNoZXMgYWdhaW5zdCB0aGUgbW9kZWwgdmFsdWUuXG4gKlxuICogQHByb3BlcnR5IHtPYmplY3R9ICRlcnJvciBBbiBvYmplY3QgaGFzaCB3aXRoIGFsbCBmYWlsaW5nIHZhbGlkYXRvciBpZHMgYXMga2V5cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSAkcGVuZGluZyBBbiBvYmplY3QgaGFzaCB3aXRoIGFsbCBwZW5kaW5nIHZhbGlkYXRvciBpZHMgYXMga2V5cy5cbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICR1bnRvdWNoZWQgVHJ1ZSBpZiBjb250cm9sIGhhcyBub3QgbG9zdCBmb2N1cyB5ZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICR0b3VjaGVkIFRydWUgaWYgY29udHJvbCBoYXMgbG9zdCBmb2N1cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHByaXN0aW5lIFRydWUgaWYgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB0aGUgY29udHJvbCB5ZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRkaXJ0eSBUcnVlIGlmIHVzZXIgaGFzIGFscmVhZHkgaW50ZXJhY3RlZCB3aXRoIHRoZSBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSAkdmFsaWQgVHJ1ZSBpZiB0aGVyZSBpcyBubyBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJGludmFsaWQgVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZXJyb3Igb24gdGhlIGNvbnRyb2wuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gJG5hbWUgVGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSBjb250cm9sLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIGBOZ01vZGVsQ29udHJvbGxlcmAgcHJvdmlkZXMgQVBJIGZvciB0aGUge0BsaW5rIG5nTW9kZWwgYG5nTW9kZWxgfSBkaXJlY3RpdmUuXG4gKiBUaGUgY29udHJvbGxlciBjb250YWlucyBzZXJ2aWNlcyBmb3IgZGF0YS1iaW5kaW5nLCB2YWxpZGF0aW9uLCBDU1MgdXBkYXRlcywgYW5kIHZhbHVlIGZvcm1hdHRpbmdcbiAqIGFuZCBwYXJzaW5nLiBJdCBwdXJwb3NlZnVsbHkgZG9lcyBub3QgY29udGFpbiBhbnkgbG9naWMgd2hpY2ggZGVhbHMgd2l0aCBET00gcmVuZGVyaW5nIG9yXG4gKiBsaXN0ZW5pbmcgdG8gRE9NIGV2ZW50cy5cbiAqIFN1Y2ggRE9NIHJlbGF0ZWQgbG9naWMgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IG90aGVyIGRpcmVjdGl2ZXMgd2hpY2ggbWFrZSB1c2Ugb2ZcbiAqIGBOZ01vZGVsQ29udHJvbGxlcmAgZm9yIGRhdGEtYmluZGluZyB0byBjb250cm9sIGVsZW1lbnRzLlxuICogQW5ndWxhciBwcm92aWRlcyB0aGlzIERPTSBsb2dpYyBmb3IgbW9zdCB7QGxpbmsgaW5wdXQgYGlucHV0YH0gZWxlbWVudHMuXG4gKiBBdCB0aGUgZW5kIG9mIHRoaXMgcGFnZSB5b3UgY2FuIGZpbmQgYSB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciNjdXN0b20tY29udHJvbC1leGFtcGxlXG4gKiBjdXN0b20gY29udHJvbCBleGFtcGxlfSB0aGF0IHVzZXMgYG5nTW9kZWxDb250cm9sbGVyYCB0byBiaW5kIHRvIGBjb250ZW50ZWRpdGFibGVgIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgQ3VzdG9tIENvbnRyb2wgRXhhbXBsZVxuICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYE5nTW9kZWxDb250cm9sbGVyYCB3aXRoIGEgY3VzdG9tIGNvbnRyb2wgdG8gYWNoaWV2ZVxuICogZGF0YS1iaW5kaW5nLiBOb3RpY2UgaG93IGRpZmZlcmVudCBkaXJlY3RpdmVzIChgY29udGVudGVkaXRhYmxlYCwgYG5nLW1vZGVsYCwgYW5kIGByZXF1aXJlZGApXG4gKiBjb2xsYWJvcmF0ZSB0b2dldGhlciB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdC5cbiAqXG4gKiBgY29udGVudGVkaXRhYmxlYCBpcyBhbiBIVE1MNSBhdHRyaWJ1dGUsIHdoaWNoIHRlbGxzIHRoZSBicm93c2VyIHRvIGxldCB0aGUgZWxlbWVudFxuICogY29udGVudHMgYmUgZWRpdGVkIGluIHBsYWNlIGJ5IHRoZSB1c2VyLlxuICpcbiAqIFdlIGFyZSB1c2luZyB0aGUge0BsaW5rIG5nLnNlcnZpY2U6JHNjZSAkc2NlfSBzZXJ2aWNlIGhlcmUgYW5kIGluY2x1ZGUgdGhlIHtAbGluayBuZ1Nhbml0aXplICRzYW5pdGl6ZX1cbiAqIG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IHJlbW92ZSBcImJhZFwiIGNvbnRlbnQgbGlrZSBpbmxpbmUgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYDxzcGFuIG9uY2xpY2s9XCIuLi5cIj5gKS5cbiAqIEhvd2V2ZXIsIGFzIHdlIGFyZSB1c2luZyBgJHNjZWAgdGhlIG1vZGVsIGNhbiBzdGlsbCBkZWNpZGUgdG8gcHJvdmlkZSB1bnNhZmUgY29udGVudCBpZiBpdCBtYXJrc1xuICogdGhhdCBjb250ZW50IHVzaW5nIHRoZSBgJHNjZWAgc2VydmljZS5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwiTmdNb2RlbENvbnRyb2xsZXJcIiBtb2R1bGU9XCJjdXN0b21Db250cm9sXCIgZGVwcz1cImFuZ3VsYXItc2FuaXRpemUuanNcIj5cbiAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICBbY29udGVudGVkaXRhYmxlXSB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgICAgbWluLWhlaWdodDogMjBweDtcbiAgICAgIH1cblxuICAgICAgLm5nLWludmFsaWQge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAgICB9XG5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ2N1c3RvbUNvbnRyb2wnLCBbJ25nU2FuaXRpemUnXSkuXG4gICAgICAgIGRpcmVjdGl2ZSgnY29udGVudGVkaXRhYmxlJywgWyckc2NlJywgZnVuY3Rpb24oJHNjZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXN0cmljdDogJ0EnLCAvLyBvbmx5IGFjdGl2YXRlIG9uIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgICAgICByZXF1aXJlOiAnP25nTW9kZWwnLCAvLyBnZXQgYSBob2xkIG9mIE5nTW9kZWxDb250cm9sbGVyXG4gICAgICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIG5nTW9kZWwpIHtcbiAgICAgICAgICAgICAgaWYgKCFuZ01vZGVsKSByZXR1cm47IC8vIGRvIG5vdGhpbmcgaWYgbm8gbmctbW9kZWxcblxuICAgICAgICAgICAgICAvLyBTcGVjaWZ5IGhvdyBVSSBzaG91bGQgYmUgdXBkYXRlZFxuICAgICAgICAgICAgICBuZ01vZGVsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lmh0bWwoJHNjZS5nZXRUcnVzdGVkSHRtbChuZ01vZGVsLiR2aWV3VmFsdWUgfHwgJycpKTtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZSBldmVudHMgdG8gZW5hYmxlIGJpbmRpbmdcbiAgICAgICAgICAgICAgZWxlbWVudC5vbignYmx1ciBrZXl1cCBjaGFuZ2UnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKHJlYWQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVhZCgpOyAvLyBpbml0aWFsaXplXG5cbiAgICAgICAgICAgICAgLy8gV3JpdGUgZGF0YSB0byB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gcmVhZCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGVsZW1lbnQuaHRtbCgpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgY2xlYXIgdGhlIGNvbnRlbnQgZWRpdGFibGUgdGhlIGJyb3dzZXIgbGVhdmVzIGEgPGJyPiBiZWhpbmRcbiAgICAgICAgICAgICAgICAvLyBJZiBzdHJpcC1iciBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgdGhlbiB3ZSBzdHJpcCB0aGlzIG91dFxuICAgICAgICAgICAgICAgIGlmIChhdHRycy5zdHJpcEJyICYmIGh0bWwgPT09ICc8YnI+Jykge1xuICAgICAgICAgICAgICAgICAgaHRtbCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWaWV3VmFsdWUoaHRtbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XSk7XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8Zm9ybSBuYW1lPVwibXlGb3JtXCI+XG4gICAgICAgPGRpdiBjb250ZW50ZWRpdGFibGVcbiAgICAgICAgICAgIG5hbWU9XCJteVdpZGdldFwiIG5nLW1vZGVsPVwidXNlckNvbnRlbnRcIlxuICAgICAgICAgICAgc3RyaXAtYnI9XCJ0cnVlXCJcbiAgICAgICAgICAgIHJlcXVpcmVkPkNoYW5nZSBtZSE8L2Rpdj5cbiAgICAgICAgPHNwYW4gbmctc2hvdz1cIm15Rm9ybS5teVdpZGdldC4kZXJyb3IucmVxdWlyZWRcIj5SZXF1aXJlZCE8L3NwYW4+XG4gICAgICAgPGhyPlxuICAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD1cInVzZXJDb250ZW50XCIgYXJpYS1sYWJlbD1cIkR5bmFtaWMgdGV4dGFyZWFcIj48L3RleHRhcmVhPlxuICAgICAgPC9mb3JtPlxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgaXQoJ3Nob3VsZCBkYXRhLWJpbmQgYW5kIGJlY29tZSBpbnZhbGlkJywgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYnJvd3Nlci5wYXJhbXMuYnJvd3NlciA9PT0gJ3NhZmFyaScgfHwgYnJvd3Nlci5wYXJhbXMuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICAgIC8vIFNhZmFyaURyaXZlciBjYW4ndCBoYW5kbGUgY29udGVudGVkaXRhYmxlXG4gICAgICAgIC8vIGFuZCBGaXJlZm94IGRyaXZlciBjYW4ndCBjbGVhciBjb250ZW50ZWRpdGFibGVzIHZlcnkgd2VsbFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgY29udGVudEVkaXRhYmxlID0gZWxlbWVudChieS5jc3MoJ1tjb250ZW50ZWRpdGFibGVdJykpO1xuICAgICAgdmFyIGNvbnRlbnQgPSAnQ2hhbmdlIG1lISc7XG5cbiAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0VGV4dCgpKS50b0VxdWFsKGNvbnRlbnQpO1xuXG4gICAgICBjb250ZW50RWRpdGFibGUuY2xlYXIoKTtcbiAgICAgIGNvbnRlbnRFZGl0YWJsZS5zZW5kS2V5cyhwcm90cmFjdG9yLktleS5CQUNLX1NQQUNFKTtcbiAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0VGV4dCgpKS50b0VxdWFsKCcnKTtcbiAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b01hdGNoKC9uZy1pbnZhbGlkLXJlcXVpcmVkLyk7XG4gICAgfSk7XG4gICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqXG4gKi9cbk5nTW9kZWxDb250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckZXhjZXB0aW9uSGFuZGxlcicsICckYXR0cnMnLCAnJGVsZW1lbnQnLCAnJHBhcnNlJywgJyRhbmltYXRlJywgJyR0aW1lb3V0JywgJyRxJywgJyRpbnRlcnBvbGF0ZSddO1xuZnVuY3Rpb24gTmdNb2RlbENvbnRyb2xsZXIoJHNjb3BlLCAkZXhjZXB0aW9uSGFuZGxlciwgJGF0dHIsICRlbGVtZW50LCAkcGFyc2UsICRhbmltYXRlLCAkdGltZW91dCwgJHEsICRpbnRlcnBvbGF0ZSkge1xuICB0aGlzLiR2aWV3VmFsdWUgPSBOdW1iZXIuTmFOO1xuICB0aGlzLiRtb2RlbFZhbHVlID0gTnVtYmVyLk5hTjtcbiAgdGhpcy4kJHJhd01vZGVsVmFsdWUgPSB1bmRlZmluZWQ7IC8vIHN0b3JlcyB0aGUgcGFyc2VkIG1vZGVsVmFsdWUgLyBtb2RlbCBzZXQgZnJvbSBzY29wZSByZWdhcmRsZXNzIG9mIHZhbGlkaXR5LlxuICB0aGlzLiR2YWxpZGF0b3JzID0ge307XG4gIHRoaXMuJGFzeW5jVmFsaWRhdG9ycyA9IHt9O1xuICB0aGlzLiRwYXJzZXJzID0gW107XG4gIHRoaXMuJGZvcm1hdHRlcnMgPSBbXTtcbiAgdGhpcy4kdmlld0NoYW5nZUxpc3RlbmVycyA9IFtdO1xuICB0aGlzLiR1bnRvdWNoZWQgPSB0cnVlO1xuICB0aGlzLiR0b3VjaGVkID0gZmFsc2U7XG4gIHRoaXMuJHByaXN0aW5lID0gdHJ1ZTtcbiAgdGhpcy4kZGlydHkgPSBmYWxzZTtcbiAgdGhpcy4kdmFsaWQgPSB0cnVlO1xuICB0aGlzLiRpbnZhbGlkID0gZmFsc2U7XG4gIHRoaXMuJGVycm9yID0ge307IC8vIGtlZXAgaW52YWxpZCBrZXlzIGhlcmVcbiAgdGhpcy4kJHN1Y2Nlc3MgPSB7fTsgLy8ga2VlcCB2YWxpZCBrZXlzIGhlcmVcbiAgdGhpcy4kcGVuZGluZyA9IHVuZGVmaW5lZDsgLy8ga2VlcCBwZW5kaW5nIGtleXMgaGVyZVxuICB0aGlzLiRuYW1lID0gJGludGVycG9sYXRlKCRhdHRyLm5hbWUgfHwgJycsIGZhbHNlKSgkc2NvcGUpO1xuICB0aGlzLiQkcGFyZW50Rm9ybSA9IG51bGxGb3JtQ3RybDtcbiAgdGhpcy4kb3B0aW9ucyA9IGRlZmF1bHRNb2RlbE9wdGlvbnM7XG5cbiAgdGhpcy4kJHBhcnNlZE5nTW9kZWwgPSAkcGFyc2UoJGF0dHIubmdNb2RlbCk7XG4gIHRoaXMuJCRwYXJzZWROZ01vZGVsQXNzaWduID0gdGhpcy4kJHBhcnNlZE5nTW9kZWwuYXNzaWduO1xuICB0aGlzLiQkbmdNb2RlbEdldCA9IHRoaXMuJCRwYXJzZWROZ01vZGVsO1xuICB0aGlzLiQkbmdNb2RlbFNldCA9IHRoaXMuJCRwYXJzZWROZ01vZGVsQXNzaWduO1xuICB0aGlzLiQkcGVuZGluZ0RlYm91bmNlID0gbnVsbDtcbiAgdGhpcy4kJHBhcnNlclZhbGlkID0gdW5kZWZpbmVkO1xuXG4gIHRoaXMuJCRjdXJyZW50VmFsaWRhdGlvblJ1bklkID0gMDtcblxuICB0aGlzLiQkc2NvcGUgPSAkc2NvcGU7XG4gIHRoaXMuJCRhdHRyID0gJGF0dHI7XG4gIHRoaXMuJCRlbGVtZW50ID0gJGVsZW1lbnQ7XG4gIHRoaXMuJCRhbmltYXRlID0gJGFuaW1hdGU7XG4gIHRoaXMuJCR0aW1lb3V0ID0gJHRpbWVvdXQ7XG4gIHRoaXMuJCRwYXJzZSA9ICRwYXJzZTtcbiAgdGhpcy4kJHEgPSAkcTtcbiAgdGhpcy4kJGV4Y2VwdGlvbkhhbmRsZXIgPSAkZXhjZXB0aW9uSGFuZGxlcjtcblxuICBzZXR1cFZhbGlkaXR5KHRoaXMpO1xuICBzZXR1cE1vZGVsV2F0Y2hlcih0aGlzKTtcbn1cblxuTmdNb2RlbENvbnRyb2xsZXIucHJvdG90eXBlID0ge1xuICAkJGluaXRHZXR0ZXJTZXR0ZXJzOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5nZXRPcHRpb24oJ2dldHRlclNldHRlcicpKSB7XG4gICAgICB2YXIgaW52b2tlTW9kZWxHZXR0ZXIgPSB0aGlzLiQkcGFyc2UodGhpcy4kJGF0dHIubmdNb2RlbCArICcoKScpLFxuICAgICAgICAgIGludm9rZU1vZGVsU2V0dGVyID0gdGhpcy4kJHBhcnNlKHRoaXMuJCRhdHRyLm5nTW9kZWwgKyAnKCQkJHApJyk7XG5cbiAgICAgIHRoaXMuJCRuZ01vZGVsR2V0ID0gZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgIHZhciBtb2RlbFZhbHVlID0gdGhpcy4kJHBhcnNlZE5nTW9kZWwoJHNjb3BlKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24obW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICBtb2RlbFZhbHVlID0gaW52b2tlTW9kZWxHZXR0ZXIoJHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kZWxWYWx1ZTtcbiAgICAgIH07XG4gICAgICB0aGlzLiQkbmdNb2RlbFNldCA9IGZ1bmN0aW9uKCRzY29wZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy4kJHBhcnNlZE5nTW9kZWwoJHNjb3BlKSkpIHtcbiAgICAgICAgICBpbnZva2VNb2RlbFNldHRlcigkc2NvcGUsIHskJCRwOiBuZXdWYWx1ZX0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuJCRwYXJzZWROZ01vZGVsQXNzaWduKCRzY29wZSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuJCRwYXJzZWROZ01vZGVsLmFzc2lnbikge1xuICAgICAgdGhyb3cgbmdNb2RlbE1pbkVycignbm9uYXNzaWduJywgJ0V4cHJlc3Npb24gXFwnezB9XFwnIGlzIG5vbi1hc3NpZ25hYmxlLiBFbGVtZW50OiB7MX0nLFxuICAgICAgICAgIHRoaXMuJCRhdHRyLm5nTW9kZWwsIHN0YXJ0aW5nVGFnKHRoaXMuJCRlbGVtZW50KSk7XG4gICAgfVxuICB9LFxuXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkcmVuZGVyXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdmlldyBuZWVkcyB0byBiZSB1cGRhdGVkLiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB1c2VyIG9mIHRoZSBuZy1tb2RlbFxuICAgKiBkaXJlY3RpdmUgd2lsbCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIFRoZSBgJHJlbmRlcigpYCBtZXRob2QgaXMgaW52b2tlZCBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6XG4gICAqXG4gICAqICogYCRyb2xsYmFja1ZpZXdWYWx1ZSgpYCBpcyBjYWxsZWQuICBJZiB3ZSBhcmUgcm9sbGluZyBiYWNrIHRoZSB2aWV3IHZhbHVlIHRvIHRoZSBsYXN0XG4gICAqICAgY29tbWl0dGVkIHZhbHVlIHRoZW4gYCRyZW5kZXIoKWAgaXMgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgaW5wdXQgY29udHJvbC5cbiAgICogKiBUaGUgdmFsdWUgcmVmZXJlbmNlZCBieSBgbmctbW9kZWxgIGlzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseSBhbmQgYm90aCB0aGUgYCRtb2RlbFZhbHVlYCBhbmRcbiAgICogICB0aGUgYCR2aWV3VmFsdWVgIGFyZSBkaWZmZXJlbnQgZnJvbSBsYXN0IHRpbWUuXG4gICAqXG4gICAqIFNpbmNlIGBuZy1tb2RlbGAgZG9lcyBub3QgZG8gYSBkZWVwIHdhdGNoLCBgJHJlbmRlcigpYCBpcyBvbmx5IGludm9rZWQgaWYgdGhlIHZhbHVlcyBvZlxuICAgKiBgJG1vZGVsVmFsdWVgIGFuZCBgJHZpZXdWYWx1ZWAgYXJlIGFjdHVhbGx5IGRpZmZlcmVudCBmcm9tIHRoZWlyIHByZXZpb3VzIHZhbHVlcy4gSWYgYCRtb2RlbFZhbHVlYFxuICAgKiBvciBgJHZpZXdWYWx1ZWAgYXJlIG9iamVjdHMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9yIG51bWJlcikgdGhlbiBgJHJlbmRlcigpYCB3aWxsIG5vdCBiZVxuICAgKiBpbnZva2VkIGlmIHlvdSBvbmx5IGNoYW5nZSBhIHByb3BlcnR5IG9uIHRoZSBvYmplY3RzLlxuICAgKi9cbiAgJHJlbmRlcjogbm9vcCxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRpc0VtcHR5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBpcyBlbXB0eS5cbiAgICpcbiAgICogRm9yIGluc3RhbmNlLCB0aGUgcmVxdWlyZWQgZGlyZWN0aXZlIGRvZXMgdGhpcyB0byB3b3JrIG91dCBpZiB0aGUgaW5wdXQgaGFzIGRhdGEgb3Igbm90LlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBgJGlzRW1wdHlgIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgYCcnYCwgYG51bGxgIG9yIGBOYU5gLlxuICAgKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIGlucHV0IGRpcmVjdGl2ZXMgd2hvc2UgY29uY2VwdCBvZiBiZWluZyBlbXB0eSBpcyBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICogZGVmYXVsdC4gVGhlIGBjaGVja2JveElucHV0VHlwZWAgZGlyZWN0aXZlIGRvZXMgdGhpcyBiZWNhdXNlIGluIGl0cyBjYXNlIGEgdmFsdWUgb2YgYGZhbHNlYFxuICAgKiBpbXBsaWVzIGVtcHR5LlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgdG8gY2hlY2sgZm9yIGVtcHRpbmVzcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBcImVtcHR5XCIuXG4gICAqL1xuICAkaXNFbXB0eTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlO1xuICB9LFxuXG4gICQkdXBkYXRlRW1wdHlDbGFzc2VzOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICh0aGlzLiRpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgdGhpcy4kJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIE5PVF9FTVBUWV9DTEFTUyk7XG4gICAgICB0aGlzLiQkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwgRU1QVFlfQ0xBU1MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiQkYW5pbWF0ZS5yZW1vdmVDbGFzcyh0aGlzLiQkZWxlbWVudCwgRU1QVFlfQ0xBU1MpO1xuICAgICAgdGhpcy4kJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIE5PVF9FTVBUWV9DTEFTUyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFByaXN0aW5lXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGBuZy1kaXJ0eWAgY2xhc3MgYW5kIHNldCB0aGUgY29udHJvbCB0byBpdHMgcHJpc3RpbmVcbiAgICogc3RhdGUgKGBuZy1wcmlzdGluZWAgY2xhc3MpLiBBIG1vZGVsIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJpc3RpbmUgd2hlbiB0aGUgY29udHJvbFxuICAgKiBoYXMgbm90IGJlZW4gY2hhbmdlZCBmcm9tIHdoZW4gZmlyc3QgY29tcGlsZWQuXG4gICAqL1xuICAkc2V0UHJpc3RpbmU6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJGRpcnR5ID0gZmFsc2U7XG4gICAgdGhpcy4kcHJpc3RpbmUgPSB0cnVlO1xuICAgIHRoaXMuJCRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCBESVJUWV9DTEFTUyk7XG4gICAgdGhpcy4kJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIFBSSVNUSU5FX0NMQVNTKTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXREaXJ0eVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyB0aGUgY29udHJvbCB0byBpdHMgZGlydHkgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBgbmctcHJpc3RpbmVgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzIGRpcnR5XG4gICAqIHN0YXRlIChgbmctZGlydHlgIGNsYXNzKS4gQSBtb2RlbCBpcyBjb25zaWRlcmVkIHRvIGJlIGRpcnR5IHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiBmcm9tIHdoZW4gZmlyc3QgY29tcGlsZWQuXG4gICAqL1xuICAkc2V0RGlydHk6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJGRpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLiRwcmlzdGluZSA9IGZhbHNlO1xuICAgIHRoaXMuJCRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCBQUklTVElORV9DTEFTUyk7XG4gICAgdGhpcy4kJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIERJUlRZX0NMQVNTKTtcbiAgICB0aGlzLiQkcGFyZW50Rm9ybS4kc2V0RGlydHkoKTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRVbnRvdWNoZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGNvbnRyb2wgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGBuZy10b3VjaGVkYCBjbGFzcyBhbmQgc2V0IHRoZSBjb250cm9sIHRvIGl0c1xuICAgKiB1bnRvdWNoZWQgc3RhdGUgKGBuZy11bnRvdWNoZWRgIGNsYXNzKS4gVXBvbiBjb21waWxhdGlvbiwgYSBtb2RlbCBpcyBzZXQgYXMgdW50b3VjaGVkXG4gICAqIGJ5IGRlZmF1bHQsIGhvd2V2ZXIgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoYXQgc3RhdGUgaWYgdGhlIG1vZGVsIGhhc1xuICAgKiBhbHJlYWR5IGJlZW4gdG91Y2hlZCBieSB0aGUgdXNlci5cbiAgICovXG4gICRzZXRVbnRvdWNoZWQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJHRvdWNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLiR1bnRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuJCRhbmltYXRlLnNldENsYXNzKHRoaXMuJCRlbGVtZW50LCBVTlRPVUNIRURfQ0xBU1MsIFRPVUNIRURfQ0xBU1MpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFRvdWNoZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGNvbnRyb2wgdG8gaXRzIHRvdWNoZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBgbmctdW50b3VjaGVkYCBjbGFzcyBhbmQgc2V0IHRoZSBjb250cm9sIHRvIGl0c1xuICAgKiB0b3VjaGVkIHN0YXRlIChgbmctdG91Y2hlZGAgY2xhc3MpLiBBIG1vZGVsIGlzIGNvbnNpZGVyZWQgdG8gYmUgdG91Y2hlZCB3aGVuIHRoZSB1c2VyIGhhc1xuICAgKiBmaXJzdCBmb2N1c2VkIHRoZSBjb250cm9sIGVsZW1lbnQgYW5kIHRoZW4gc2hpZnRlZCBmb2N1cyBhd2F5IGZyb20gdGhlIGNvbnRyb2wgKGJsdXIgZXZlbnQpLlxuICAgKi9cbiAgJHNldFRvdWNoZWQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJHRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuJHVudG91Y2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuJCRhbmltYXRlLnNldENsYXNzKHRoaXMuJCRlbGVtZW50LCBUT1VDSEVEX0NMQVNTLCBVTlRPVUNIRURfQ0xBU1MpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHJvbGxiYWNrVmlld1ZhbHVlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDYW5jZWwgYW4gdXBkYXRlIGFuZCByZXNldCB0aGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlIHRvIHByZXZlbnQgYW4gdXBkYXRlIHRvIHRoZSBgJG1vZGVsVmFsdWVgLFxuICAgKiB3aGljaCBtYXkgYmUgY2F1c2VkIGJ5IGEgcGVuZGluZyBkZWJvdW5jZWQgZXZlbnQgb3IgYmVjYXVzZSB0aGUgaW5wdXQgaXMgd2FpdGluZyBmb3Igc29tZVxuICAgKiBmdXR1cmUgZXZlbnQuXG4gICAqXG4gICAqIElmIHlvdSBoYXZlIGFuIGlucHV0IHRoYXQgdXNlcyBgbmctbW9kZWwtb3B0aW9uc2AgdG8gc2V0IHVwIGRlYm91bmNlZCB1cGRhdGVzIG9yIHVwZGF0ZXMgdGhhdFxuICAgKiBkZXBlbmQgb24gc3BlY2lhbCBldmVudHMgc3VjaCBhcyBgYmx1cmAsIHRoZXJlIGNhbiBiZSBhIHBlcmlvZCB3aGVuIHRoZSBgJHZpZXdWYWx1ZWAgaXMgb3V0IG9mXG4gICAqIHN5bmMgd2l0aCB0aGUgbmdNb2RlbCdzIGAkbW9kZWxWYWx1ZWAuXG4gICAqXG4gICAqIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgYCRyb2xsYmFja1ZpZXdWYWx1ZSgpYCB0byBtYW51YWxseSBjYW5jZWwgdGhlIGRlYm91bmNlZCAvIGZ1dHVyZSB1cGRhdGVcbiAgICogYW5kIHJlc2V0IHRoZSBpbnB1dCB0byB0aGUgbGFzdCBjb21taXR0ZWQgdmlldyB2YWx1ZS5cbiAgICpcbiAgICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IHlvdSBydW4gaW50byBkaWZmaWN1bHRpZXMgaWYgeW91IHRyeSB0byB1cGRhdGUgdGhlIG5nTW9kZWwncyBgJG1vZGVsVmFsdWVgXG4gICAqIHByb2dyYW1tYXRpY2FsbHkgYmVmb3JlIHRoZXNlIGRlYm91bmNlZC9mdXR1cmUgZXZlbnRzIGhhdmUgcmVzb2x2ZWQvb2NjdXJyZWQsIGJlY2F1c2UgQW5ndWxhcidzXG4gICAqIGRpcnR5IGNoZWNraW5nIG1lY2hhbmlzbSBpcyBub3QgYWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhY3R1YWxseSBjaGFuZ2VkIG9yIG5vdC5cbiAgICpcbiAgICogVGhlIGAkcm9sbGJhY2tWaWV3VmFsdWUoKWAgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHByb2dyYW1tYXRpY2FsbHkgY2hhbmdpbmcgdGhlIG1vZGVsIG9mIGFuXG4gICAqIGlucHV0IHdoaWNoIG1heSBoYXZlIHN1Y2ggZXZlbnRzIHBlbmRpbmcuIFRoaXMgaXMgaW1wb3J0YW50IGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZVxuICAgKiBpbnB1dCBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IG1vZGVsIHZhbHVlIGFuZCBhbnkgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBjYW5jZWxsZWQuXG4gICAqXG4gICAqIDxleGFtcGxlIG5hbWU9XCJuZy1tb2RlbC1jYW5jZWwtdXBkYXRlXCIgbW9kdWxlPVwiY2FuY2VsLXVwZGF0ZS1leGFtcGxlXCI+XG4gICAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICAgKiAgICAgYW5ndWxhci5tb2R1bGUoJ2NhbmNlbC11cGRhdGUtZXhhbXBsZScsIFtdKVxuICAgKlxuICAgKiAgICAgLmNvbnRyb2xsZXIoJ0NhbmNlbFVwZGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgKiAgICAgICAkc2NvcGUubW9kZWwgPSB7dmFsdWUxOiAnJywgdmFsdWUyOiAnJ307XG4gICAqXG4gICAqICAgICAgICRzY29wZS5zZXRFbXB0eSA9IGZ1bmN0aW9uKGUsIHZhbHVlLCByb2xsYmFjaykge1xuICAgKiAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDI3KSB7XG4gICAqICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAqICAgICAgICAgICBpZiAocm9sbGJhY2spIHtcbiAgICogICAgICAgICAgICAgJHNjb3BlLm15Rm9ybVt2YWx1ZV0uJHJvbGxiYWNrVmlld1ZhbHVlKCk7XG4gICAqICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAkc2NvcGUubW9kZWxbdmFsdWVdID0gJyc7XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9O1xuICAgKiAgICAgfV0pO1xuICAgKiAgIDwvZmlsZT5cbiAgICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiQ2FuY2VsVXBkYXRlQ29udHJvbGxlclwiPlxuICAgKiAgICAgICA8cD5Cb3RoIG9mIHRoZXNlIGlucHV0cyBhcmUgb25seSB1cGRhdGVkIGlmIHRoZXkgYXJlIGJsdXJyZWQuIEhpdHRpbmcgZXNjYXBlIHNob3VsZFxuICAgKiAgICAgICBlbXB0eSB0aGVtLiBGb2xsb3cgdGhlc2Ugc3RlcHMgYW5kIG9ic2VydmUgdGhlIGRpZmZlcmVuY2U6PC9wPlxuICAgKiAgICAgICA8b2w+XG4gICAqICAgICAgICAgPGxpPlR5cGUgc29tZXRoaW5nIGluIHRoZSBpbnB1dC4gWW91IHdpbGwgc2VlIHRoYXQgdGhlIG1vZGVsIGlzIG5vdCB5ZXQgdXBkYXRlZDwvbGk+XG4gICAqICAgICAgICAgPGxpPlByZXNzIHRoZSBFc2NhcGUga2V5LlxuICAgKiAgICAgICAgICAgPG9sPlxuICAgKiAgICAgICAgICAgICA8bGk+IEluIHRoZSBmaXJzdCBleGFtcGxlLCBub3RoaW5nIGhhcHBlbnMsIGJlY2F1c2UgdGhlIG1vZGVsIGlzIGFscmVhZHkgJycsIGFuZCBub1xuICAgKiAgICAgICAgICAgICB1cGRhdGUgaXMgZGV0ZWN0ZWQuIElmIHlvdSBibHVyIHRoZSBpbnB1dCwgdGhlIG1vZGVsIHdpbGwgYmUgc2V0IHRvIHRoZSBjdXJyZW50IHZpZXcuXG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT4gSW4gdGhlIHNlY29uZCBleGFtcGxlLCB0aGUgcGVuZGluZyB1cGRhdGUgaXMgY2FuY2VsbGVkLCBhbmQgdGhlIGlucHV0IGlzIHNldCBiYWNrXG4gICAqICAgICAgICAgICAgIHRvIHRoZSBsYXN0IGNvbW1pdHRlZCB2aWV3IHZhbHVlICgnJykuIEJsdXJyaW5nIHRoZSBpbnB1dCBkb2VzIG5vdGhpbmcuXG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICA8L29sPlxuICAgKiAgICAgICAgIDwvbGk+XG4gICAqICAgICAgIDwvb2w+XG4gICAqXG4gICAqICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1tb2RlbC1vcHRpb25zPVwieyB1cGRhdGVPbjogJ2JsdXInIH1cIj5cbiAgICogICAgICAgICA8ZGl2PlxuICAgKiAgICAgICAgICAgPHAgaWQ9XCJpbnB1dERlc2NyaXB0aW9uMVwiPldpdGhvdXQgJHJvbGxiYWNrVmlld1ZhbHVlKCk6PC9wPlxuICAgKiAgICAgICAgICAgPGlucHV0IG5hbWU9XCJ2YWx1ZTFcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5wdXREZXNjcmlwdGlvbjFcIiBuZy1tb2RlbD1cIm1vZGVsLnZhbHVlMVwiXG4gICAqICAgICAgICAgICAgICAgICAgbmcta2V5ZG93bj1cInNldEVtcHR5KCRldmVudCwgJ3ZhbHVlMScpXCI+XG4gICAqICAgICAgICAgICB2YWx1ZTE6IFwie3sgbW9kZWwudmFsdWUxIH19XCJcbiAgICogICAgICAgICA8L2Rpdj5cbiAgICpcbiAgICogICAgICAgICA8ZGl2PlxuICAgKiAgICAgICAgICAgPHAgaWQ9XCJpbnB1dERlc2NyaXB0aW9uMlwiPldpdGggJHJvbGxiYWNrVmlld1ZhbHVlKCk6PC9wPlxuICAgKiAgICAgICAgICAgPGlucHV0IG5hbWU9XCJ2YWx1ZTJcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiaW5wdXREZXNjcmlwdGlvbjJcIiBuZy1tb2RlbD1cIm1vZGVsLnZhbHVlMlwiXG4gICAqICAgICAgICAgICAgICAgICAgbmcta2V5ZG93bj1cInNldEVtcHR5KCRldmVudCwgJ3ZhbHVlMicsIHRydWUpXCI+XG4gICAqICAgICAgICAgICB2YWx1ZTI6IFwie3sgbW9kZWwudmFsdWUyIH19XCJcbiAgICogICAgICAgICA8L2Rpdj5cbiAgICogICAgICAgPC9mb3JtPlxuICAgKiAgICAgPC9kaXY+XG4gICAqICAgPC9maWxlPlxuICAgICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICAgICBkaXYge1xuICAgICAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGl2Om50aC1jaGlsZCgxKSB7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzMHB4O1xuICAgICAgICAgIH1cblxuICAgICAgICA8L2ZpbGU+XG4gICAqIDwvZXhhbXBsZT5cbiAgICovXG4gICRyb2xsYmFja1ZpZXdWYWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy4kJHRpbWVvdXQuY2FuY2VsKHRoaXMuJCRwZW5kaW5nRGVib3VuY2UpO1xuICAgIHRoaXMuJHZpZXdWYWx1ZSA9IHRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlO1xuICAgIHRoaXMuJHJlbmRlcigpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSdW5zIGVhY2ggb2YgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycyAoZmlyc3Qgc3luY2hyb25vdXMgdmFsaWRhdG9ycyBhbmQgdGhlblxuICAgKiBhc3luY2hyb25vdXMgdmFsaWRhdG9ycykuXG4gICAqIElmIHRoZSB2YWxpZGl0eSBjaGFuZ2VzIHRvIGludmFsaWQsIHRoZSBtb2RlbCB3aWxsIGJlIHNldCB0byBgdW5kZWZpbmVkYCxcbiAgICogdW5sZXNzIHtAbGluayBuZ01vZGVsT3B0aW9ucyBgbmdNb2RlbE9wdGlvbnMuYWxsb3dJbnZhbGlkYH0gaXMgYHRydWVgLlxuICAgKiBJZiB0aGUgdmFsaWRpdHkgY2hhbmdlcyB0byB2YWxpZCwgaXQgd2lsbCBzZXQgdGhlIG1vZGVsIHRvIHRoZSBsYXN0IGF2YWlsYWJsZSB2YWxpZFxuICAgKiBgJG1vZGVsVmFsdWVgLCBpLmUuIGVpdGhlciB0aGUgbGFzdCBwYXJzZWQgdmFsdWUgb3IgdGhlIGxhc3QgdmFsdWUgc2V0IGZyb20gdGhlIHNjb3BlLlxuICAgKi9cbiAgJHZhbGlkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAvLyBpZ25vcmUgJHZhbGlkYXRlIGJlZm9yZSBtb2RlbCBpcyBpbml0aWFsaXplZFxuICAgIGlmIChpc051bWJlck5hTih0aGlzLiRtb2RlbFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2aWV3VmFsdWUgPSB0aGlzLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTtcbiAgICAvLyBOb3RlOiB3ZSB1c2UgdGhlICQkcmF3TW9kZWxWYWx1ZSBhcyAkbW9kZWxWYWx1ZSBtaWdodCBoYXZlIGJlZW5cbiAgICAvLyBzZXQgdG8gdW5kZWZpbmVkIGR1cmluZyBhIHZpZXcgLT4gbW9kZWwgdXBkYXRlIHRoYXQgZm91bmQgdmFsaWRhdGlvblxuICAgIC8vIGVycm9ycy4gV2UgY2FuJ3QgcGFyc2UgdGhlIHZpZXcgaGVyZSwgc2luY2UgdGhhdCBjb3VsZCBjaGFuZ2VcbiAgICAvLyB0aGUgbW9kZWwgYWx0aG91Z2ggbmVpdGhlciB2aWV3VmFsdWUgbm9yIHRoZSBtb2RlbCBvbiB0aGUgc2NvcGUgY2hhbmdlZFxuICAgIHZhciBtb2RlbFZhbHVlID0gdGhpcy4kJHJhd01vZGVsVmFsdWU7XG5cbiAgICB2YXIgcHJldlZhbGlkID0gdGhpcy4kdmFsaWQ7XG4gICAgdmFyIHByZXZNb2RlbFZhbHVlID0gdGhpcy4kbW9kZWxWYWx1ZTtcblxuICAgIHZhciBhbGxvd0ludmFsaWQgPSB0aGlzLiRvcHRpb25zLmdldE9wdGlvbignYWxsb3dJbnZhbGlkJyk7XG5cbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgdGhpcy4kJHJ1blZhbGlkYXRvcnMobW9kZWxWYWx1ZSwgdmlld1ZhbHVlLCBmdW5jdGlvbihhbGxWYWxpZCkge1xuICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIGNoYW5nZSBpbiB2YWxpZGl0eSwgZG9uJ3QgdXBkYXRlIHRoZSBtb2RlbFxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBjaGFuZ2luZyBhbiBpbnZhbGlkIG1vZGVsVmFsdWUgdG8gdW5kZWZpbmVkXG4gICAgICBpZiAoIWFsbG93SW52YWxpZCAmJiBwcmV2VmFsaWQgIT09IGFsbFZhbGlkKSB7XG4gICAgICAgIC8vIE5vdGU6IERvbid0IGNoZWNrIHRoaXMuJHZhbGlkIGhlcmUsIGFzIHdlIGNvdWxkIGhhdmVcbiAgICAgICAgLy8gZXh0ZXJuYWwgdmFsaWRhdG9ycyAoZS5nLiBjYWxjdWxhdGVkIG9uIHRoZSBzZXJ2ZXIpLFxuICAgICAgICAvLyB0aGF0IGp1c3QgY2FsbCAkc2V0VmFsaWRpdHkgYW5kIG5lZWQgdGhlIG1vZGVsIHZhbHVlXG4gICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGVpciB2YWxpZGl0eS5cbiAgICAgICAgdGhhdC4kbW9kZWxWYWx1ZSA9IGFsbFZhbGlkID8gbW9kZWxWYWx1ZSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodGhhdC4kbW9kZWxWYWx1ZSAhPT0gcHJldk1vZGVsVmFsdWUpIHtcbiAgICAgICAgICB0aGF0LiQkd3JpdGVNb2RlbFRvU2NvcGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gICQkcnVuVmFsaWRhdG9yczogZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlLCBkb25lQ2FsbGJhY2spIHtcbiAgICB0aGlzLiQkY3VycmVudFZhbGlkYXRpb25SdW5JZCsrO1xuICAgIHZhciBsb2NhbFZhbGlkYXRpb25SdW5JZCA9IHRoaXMuJCRjdXJyZW50VmFsaWRhdGlvblJ1bklkO1xuICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgIC8vIGNoZWNrIHBhcnNlciBlcnJvclxuICAgIGlmICghcHJvY2Vzc1BhcnNlRXJyb3JzKCkpIHtcbiAgICAgIHZhbGlkYXRpb25Eb25lKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFwcm9jZXNzU3luY1ZhbGlkYXRvcnMoKSkge1xuICAgICAgdmFsaWRhdGlvbkRvbmUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzQXN5bmNWYWxpZGF0b3JzKCk7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUGFyc2VFcnJvcnMoKSB7XG4gICAgICB2YXIgZXJyb3JLZXkgPSB0aGF0LiQkcGFyc2VyTmFtZSB8fCAncGFyc2UnO1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKHRoYXQuJCRwYXJzZXJWYWxpZCkpIHtcbiAgICAgICAgc2V0VmFsaWRpdHkoZXJyb3JLZXksIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGF0LiQkcGFyc2VyVmFsaWQpIHtcbiAgICAgICAgICBmb3JFYWNoKHRoYXQuJHZhbGlkYXRvcnMsIGZ1bmN0aW9uKHYsIG5hbWUpIHtcbiAgICAgICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvckVhY2godGhhdC4kYXN5bmNWYWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7XG4gICAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCBudWxsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdGhlIHBhcnNlIGVycm9yIGxhc3QsIHRvIHByZXZlbnQgdW5zZXR0aW5nIGl0LCBzaG91bGQgYSAkdmFsaWRhdG9ycyBrZXkgPT0gcGFyc2VyTmFtZVxuICAgICAgICBzZXRWYWxpZGl0eShlcnJvcktleSwgdGhhdC4kJHBhcnNlclZhbGlkKTtcbiAgICAgICAgcmV0dXJuIHRoYXQuJCRwYXJzZXJWYWxpZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NTeW5jVmFsaWRhdG9ycygpIHtcbiAgICAgIHZhciBzeW5jVmFsaWRhdG9yc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIGZvckVhY2godGhhdC4kdmFsaWRhdG9ycywgZnVuY3Rpb24odmFsaWRhdG9yLCBuYW1lKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBCb29sZWFuKHZhbGlkYXRvcihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpKTtcbiAgICAgICAgc3luY1ZhbGlkYXRvcnNWYWxpZCA9IHN5bmNWYWxpZGF0b3JzVmFsaWQgJiYgcmVzdWx0O1xuICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIXN5bmNWYWxpZGF0b3JzVmFsaWQpIHtcbiAgICAgICAgZm9yRWFjaCh0aGF0LiRhc3luY1ZhbGlkYXRvcnMsIGZ1bmN0aW9uKHYsIG5hbWUpIHtcbiAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NBc3luY1ZhbGlkYXRvcnMoKSB7XG4gICAgICB2YXIgdmFsaWRhdG9yUHJvbWlzZXMgPSBbXTtcbiAgICAgIHZhciBhbGxWYWxpZCA9IHRydWU7XG4gICAgICBmb3JFYWNoKHRoYXQuJGFzeW5jVmFsaWRhdG9ycywgZnVuY3Rpb24odmFsaWRhdG9yLCBuYW1lKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gdmFsaWRhdG9yKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSk7XG4gICAgICAgIGlmICghaXNQcm9taXNlTGlrZShwcm9taXNlKSkge1xuICAgICAgICAgIHRocm93IG5nTW9kZWxNaW5FcnIoJ25vcHJvbWlzZScsXG4gICAgICAgICAgICAnRXhwZWN0ZWQgYXN5bmNocm9ub3VzIHZhbGlkYXRvciB0byByZXR1cm4gYSBwcm9taXNlIGJ1dCBnb3QgXFwnezB9XFwnIGluc3RlYWQuJywgcHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgdmFsaWRhdG9yUHJvbWlzZXMucHVzaChwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgdHJ1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGFsbFZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgZmFsc2UpO1xuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICAgIGlmICghdmFsaWRhdG9yUHJvbWlzZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhbGlkYXRpb25Eb25lKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC4kJHEuYWxsKHZhbGlkYXRvclByb21pc2VzKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhbGlkYXRpb25Eb25lKGFsbFZhbGlkKTtcbiAgICAgICAgfSwgbm9vcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0VmFsaWRpdHkobmFtZSwgaXNWYWxpZCkge1xuICAgICAgaWYgKGxvY2FsVmFsaWRhdGlvblJ1bklkID09PSB0aGF0LiQkY3VycmVudFZhbGlkYXRpb25SdW5JZCkge1xuICAgICAgICB0aGF0LiRzZXRWYWxpZGl0eShuYW1lLCBpc1ZhbGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0aW9uRG9uZShhbGxWYWxpZCkge1xuICAgICAgaWYgKGxvY2FsVmFsaWRhdGlvblJ1bklkID09PSB0aGF0LiQkY3VycmVudFZhbGlkYXRpb25SdW5JZCkge1xuXG4gICAgICAgIGRvbmVDYWxsYmFjayhhbGxWYWxpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJGNvbW1pdFZpZXdWYWx1ZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ29tbWl0IGEgcGVuZGluZyB1cGRhdGUgdG8gdGhlIGAkbW9kZWxWYWx1ZWAuXG4gICAqXG4gICAqIFVwZGF0ZXMgbWF5IGJlIHBlbmRpbmcgYnkgYSBkZWJvdW5jZWQgZXZlbnQgb3IgYmVjYXVzZSB0aGUgaW5wdXQgaXMgd2FpdGluZyBmb3IgYSBzb21lIGZ1dHVyZVxuICAgKiBldmVudCBkZWZpbmVkIGluIGBuZy1tb2RlbC1vcHRpb25zYC4gdGhpcyBtZXRob2QgaXMgcmFyZWx5IG5lZWRlZCBhcyBgTmdNb2RlbENvbnRyb2xsZXJgXG4gICAqIHVzdWFsbHkgaGFuZGxlcyBjYWxsaW5nIHRoaXMgaW4gcmVzcG9uc2UgdG8gaW5wdXQgZXZlbnRzLlxuICAgKi9cbiAgJGNvbW1pdFZpZXdWYWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZpZXdWYWx1ZSA9IHRoaXMuJHZpZXdWYWx1ZTtcblxuICAgIHRoaXMuJCR0aW1lb3V0LmNhbmNlbCh0aGlzLiQkcGVuZGluZ0RlYm91bmNlKTtcblxuICAgIC8vIElmIHRoZSB2aWV3IHZhbHVlIGhhcyBub3QgY2hhbmdlZCB0aGVuIHdlIHNob3VsZCBqdXN0IGV4aXQsIGV4Y2VwdCBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpc1xuICAgIC8vIGEgbmF0aXZlIHZhbGlkYXRvciBvbiB0aGUgZWxlbWVudC4gSW4gdGhpcyBjYXNlIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQgZXZlbiB0aG91Z2hcbiAgICAvLyB0aGUgdmlld1ZhbHVlIGhhcyBzdGF5ZWQgZW1wdHkuXG4gICAgaWYgKHRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlID09PSB2aWV3VmFsdWUgJiYgKHZpZXdWYWx1ZSAhPT0gJycgfHwgIXRoaXMuJCRoYXNOYXRpdmVWYWxpZGF0b3JzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiQkdXBkYXRlRW1wdHlDbGFzc2VzKHZpZXdWYWx1ZSk7XG4gICAgdGhpcy4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUgPSB2aWV3VmFsdWU7XG5cbiAgICAvLyBjaGFuZ2UgdG8gZGlydHlcbiAgICBpZiAodGhpcy4kcHJpc3RpbmUpIHtcbiAgICAgIHRoaXMuJHNldERpcnR5KCk7XG4gICAgfVxuICAgIHRoaXMuJCRwYXJzZUFuZFZhbGlkYXRlKCk7XG4gIH0sXG5cbiAgJCRwYXJzZUFuZFZhbGlkYXRlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmlld1ZhbHVlID0gdGhpcy4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU7XG4gICAgdmFyIG1vZGVsVmFsdWUgPSB2aWV3VmFsdWU7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgdGhpcy4kJHBhcnNlclZhbGlkID0gaXNVbmRlZmluZWQobW9kZWxWYWx1ZSkgPyB1bmRlZmluZWQgOiB0cnVlO1xuXG4gICAgaWYgKHRoaXMuJCRwYXJzZXJWYWxpZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLiRwYXJzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vZGVsVmFsdWUgPSB0aGlzLiRwYXJzZXJzW2ldKG1vZGVsVmFsdWUpO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLiQkcGFyc2VyVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNOdW1iZXJOYU4odGhpcy4kbW9kZWxWYWx1ZSkpIHtcbiAgICAgIC8vIHRoaXMuJG1vZGVsVmFsdWUgaGFzIG5vdCBiZWVuIHRvdWNoZWQgeWV0Li4uXG4gICAgICB0aGlzLiRtb2RlbFZhbHVlID0gdGhpcy4kJG5nTW9kZWxHZXQodGhpcy4kJHNjb3BlKTtcbiAgICB9XG4gICAgdmFyIHByZXZNb2RlbFZhbHVlID0gdGhpcy4kbW9kZWxWYWx1ZTtcbiAgICB2YXIgYWxsb3dJbnZhbGlkID0gdGhpcy4kb3B0aW9ucy5nZXRPcHRpb24oJ2FsbG93SW52YWxpZCcpO1xuICAgIHRoaXMuJCRyYXdNb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTtcblxuICAgIGlmIChhbGxvd0ludmFsaWQpIHtcbiAgICAgIHRoaXMuJG1vZGVsVmFsdWUgPSBtb2RlbFZhbHVlO1xuICAgICAgd3JpdGVUb01vZGVsSWZOZWVkZWQoKTtcbiAgICB9XG5cbiAgICAvLyBQYXNzIHRoZSAkJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUgaGVyZSwgYmVjYXVzZSB0aGUgY2FjaGVkIHZpZXdWYWx1ZSBtaWdodCBiZSBvdXQgb2YgZGF0ZS5cbiAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgZS5nLiAkc2V0Vmlld1ZhbHVlIGlzIGNhbGxlZCBmcm9tIGluc2lkZSBhIHBhcnNlclxuICAgIHRoaXMuJCRydW5WYWxpZGF0b3JzKG1vZGVsVmFsdWUsIHRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLCBmdW5jdGlvbihhbGxWYWxpZCkge1xuICAgICAgaWYgKCFhbGxvd0ludmFsaWQpIHtcbiAgICAgICAgLy8gTm90ZTogRG9uJ3QgY2hlY2sgdGhpcy4kdmFsaWQgaGVyZSwgYXMgd2UgY291bGQgaGF2ZVxuICAgICAgICAvLyBleHRlcm5hbCB2YWxpZGF0b3JzIChlLmcuIGNhbGN1bGF0ZWQgb24gdGhlIHNlcnZlciksXG4gICAgICAgIC8vIHRoYXQganVzdCBjYWxsICRzZXRWYWxpZGl0eSBhbmQgbmVlZCB0aGUgbW9kZWwgdmFsdWVcbiAgICAgICAgLy8gdG8gY2FsY3VsYXRlIHRoZWlyIHZhbGlkaXR5LlxuICAgICAgICB0aGF0LiRtb2RlbFZhbHVlID0gYWxsVmFsaWQgPyBtb2RlbFZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICB3cml0ZVRvTW9kZWxJZk5lZWRlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gd3JpdGVUb01vZGVsSWZOZWVkZWQoKSB7XG4gICAgICBpZiAodGhhdC4kbW9kZWxWYWx1ZSAhPT0gcHJldk1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhhdC4kJHdyaXRlTW9kZWxUb1Njb3BlKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gICQkd3JpdGVNb2RlbFRvU2NvcGU6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJCRuZ01vZGVsU2V0KHRoaXMuJCRzY29wZSwgdGhpcy4kbW9kZWxWYWx1ZSk7XG4gICAgZm9yRWFjaCh0aGlzLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLCBmdW5jdGlvbihsaXN0ZW5lcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWludmFsaWQtdGhpc1xuICAgICAgICB0aGlzLiQkZXhjZXB0aW9uSGFuZGxlcihlKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRWaWV3VmFsdWVcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFVwZGF0ZSB0aGUgdmlldyB2YWx1ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgY29udHJvbCB3YW50cyB0byBjaGFuZ2UgdGhlIHZpZXcgdmFsdWU7IHR5cGljYWxseSxcbiAgICogdGhpcyBpcyBkb25lIGZyb20gd2l0aGluIGEgRE9NIGV2ZW50IGhhbmRsZXIuIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTppbnB1dCBpbnB1dH1cbiAgICogZGlyZWN0aXZlIGNhbGxzIGl0IHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBjaGFuZ2VzIGFuZCB7QGxpbmsgbmcuZGlyZWN0aXZlOnNlbGVjdCBzZWxlY3R9XG4gICAqIGNhbGxzIGl0IHdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgKlxuICAgKiBXaGVuIGAkc2V0Vmlld1ZhbHVlYCBpcyBjYWxsZWQsIHRoZSBuZXcgYHZhbHVlYCB3aWxsIGJlIHN0YWdlZCBmb3IgY29tbWl0dGluZyB0aHJvdWdoIHRoZSBgJHBhcnNlcnNgXG4gICAqIGFuZCBgJHZhbGlkYXRvcnNgIHBpcGVsaW5lcy4gSWYgdGhlcmUgYXJlIG5vIHNwZWNpYWwge0BsaW5rIG5nTW9kZWxPcHRpb25zfSBzcGVjaWZpZWQgdGhlbiB0aGUgc3RhZ2VkXG4gICAqIHZhbHVlIHNlbnQgZGlyZWN0bHkgZm9yIHByb2Nlc3NpbmcsIGZpbmFsbHkgdG8gYmUgYXBwbGllZCB0byBgJG1vZGVsVmFsdWVgIGFuZCB0aGVuIHRoZVxuICAgKiAqKmV4cHJlc3Npb24qKiBzcGVjaWZpZWQgaW4gdGhlIGBuZy1tb2RlbGAgYXR0cmlidXRlLiBMYXN0bHksIGFsbCB0aGUgcmVnaXN0ZXJlZCBjaGFuZ2UgbGlzdGVuZXJzLFxuICAgKiBpbiB0aGUgYCR2aWV3Q2hhbmdlTGlzdGVuZXJzYCBsaXN0LCBhcmUgY2FsbGVkLlxuICAgKlxuICAgKiBJbiBjYXNlIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfSBkaXJlY3RpdmUgaXMgdXNlZCB3aXRoIGB1cGRhdGVPbmBcbiAgICogYW5kIHRoZSBgZGVmYXVsdGAgdHJpZ2dlciBpcyBub3QgbGlzdGVkLCBhbGwgdGhvc2UgYWN0aW9ucyB3aWxsIHJlbWFpbiBwZW5kaW5nIHVudGlsIG9uZSBvZiB0aGVcbiAgICogYHVwZGF0ZU9uYCBldmVudHMgaXMgdHJpZ2dlcmVkIG9uIHRoZSBET00gZWxlbWVudC5cbiAgICogQWxsIHRoZXNlIGFjdGlvbnMgd2lsbCBiZSBkZWJvdW5jZWQgaWYgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9XG4gICAqIGRpcmVjdGl2ZSBpcyB1c2VkIHdpdGggYSBjdXN0b20gZGVib3VuY2UgZm9yIHRoaXMgcGFydGljdWxhciBldmVudC5cbiAgICogTm90ZSB0aGF0IGEgYCRkaWdlc3RgIGlzIG9ubHkgdHJpZ2dlcmVkIG9uY2UgdGhlIGB1cGRhdGVPbmAgZXZlbnRzIGFyZSBmaXJlZCwgb3IgaWYgYGRlYm91bmNlYFxuICAgKiBpcyBzcGVjaWZpZWQsIG9uY2UgdGhlIHRpbWVyIHJ1bnMgb3V0LlxuICAgKlxuICAgKiBXaGVuIHVzZWQgd2l0aCBzdGFuZGFyZCBpbnB1dHMsIHRoZSB2aWV3IHZhbHVlIHdpbGwgYWx3YXlzIGJlIGEgc3RyaW5nICh3aGljaCBpcyBpbiBzb21lIGNhc2VzXG4gICAqIHBhcnNlZCBpbnRvIGFub3RoZXIgdHlwZSwgc3VjaCBhcyBhIGBEYXRlYCBvYmplY3QgZm9yIGBpbnB1dFtkYXRlXWAuKVxuICAgKiBIb3dldmVyLCBjdXN0b20gY29udHJvbHMgbWlnaHQgYWxzbyBwYXNzIG9iamVjdHMgdG8gdGhpcyBtZXRob2QuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG1ha2VcbiAgICogYSBjb3B5IG9mIHRoZSBvYmplY3QgYmVmb3JlIHBhc3NpbmcgaXQgdG8gYCRzZXRWaWV3VmFsdWVgLiBUaGlzIGlzIGJlY2F1c2UgYG5nTW9kZWxgIGRvZXMgbm90XG4gICAqIHBlcmZvcm0gYSBkZWVwIHdhdGNoIG9mIG9iamVjdHMsIGl0IG9ubHkgbG9va3MgZm9yIGEgY2hhbmdlIG9mIGlkZW50aXR5LiBJZiB5b3Ugb25seSBjaGFuZ2VcbiAgICogdGhlIHByb3BlcnR5IG9mIHRoZSBvYmplY3QgdGhlbiBuZ01vZGVsIHdpbGwgbm90IHJlYWxpemUgdGhhdCB0aGUgb2JqZWN0IGhhcyBjaGFuZ2VkIGFuZFxuICAgKiB3aWxsIG5vdCBpbnZva2UgdGhlIGAkcGFyc2Vyc2AgYW5kIGAkdmFsaWRhdG9yc2AgcGlwZWxpbmVzLiBGb3IgdGhpcyByZWFzb24sIHlvdSBzaG91bGRcbiAgICogbm90IGNoYW5nZSBwcm9wZXJ0aWVzIG9mIHRoZSBjb3B5IG9uY2UgaXQgaGFzIGJlZW4gcGFzc2VkIHRvIGAkc2V0Vmlld1ZhbHVlYC5cbiAgICogT3RoZXJ3aXNlIHlvdSBtYXkgY2F1c2UgdGhlIG1vZGVsIHZhbHVlIG9uIHRoZSBzY29wZSB0byBjaGFuZ2UgaW5jb3JyZWN0bHkuXG4gICAqXG4gICAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gICAqIEluIGFueSBjYXNlLCB0aGUgdmFsdWUgcGFzc2VkIHRvIHRoZSBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZWZsZWN0IHRoZSBjdXJyZW50IHZhbHVlXG4gICAqIG9mIHRoZSBjb250cm9sLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBjYWxsaW5nIGAkc2V0Vmlld1ZhbHVlYCBmb3IgYW4gaW5wdXQgZWxlbWVudCxcbiAgICogeW91IHNob3VsZCBwYXNzIHRoZSBpbnB1dCBET00gdmFsdWUuIE90aGVyd2lzZSwgdGhlIGNvbnRyb2wgYW5kIHRoZSBzY29wZSBtb2RlbCBiZWNvbWVcbiAgICogb3V0IG9mIHN5bmMuIEl0J3MgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGAkc2V0Vmlld1ZhbHVlYCBkb2VzIG5vdCBjYWxsIGAkcmVuZGVyYCBvciBjaGFuZ2VcbiAgICogdGhlIGNvbnRyb2wncyBET00gdmFsdWUgaW4gYW55IHdheS4gSWYgd2Ugd2FudCB0byBjaGFuZ2UgdGhlIGNvbnRyb2wncyBET00gdmFsdWVcbiAgICogcHJvZ3JhbW1hdGljYWxseSwgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgYG5nTW9kZWxgIHNjb3BlIGV4cHJlc3Npb24uIEl0cyBuZXcgdmFsdWUgd2lsbCBiZVxuICAgKiBwaWNrZWQgdXAgYnkgdGhlIG1vZGVsIGNvbnRyb2xsZXIsIHdoaWNoIHdpbGwgcnVuIGl0IHRocm91Z2ggdGhlIGAkZm9ybWF0dGVyc2AsIGAkcmVuZGVyYCBpdFxuICAgKiB0byB1cGRhdGUgdGhlIERPTSwgYW5kIGZpbmFsbHkgY2FsbCBgJHZhbGlkYXRlYCBvbiBpdC5cbiAgICogPC9kaXY+XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgdmFsdWUgZnJvbSB0aGUgdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXIgRXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHVwZGF0ZS5cbiAgICovXG4gICRzZXRWaWV3VmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCB0cmlnZ2VyKSB7XG4gICAgdGhpcy4kdmlld1ZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuZ2V0T3B0aW9uKCd1cGRhdGVPbkRlZmF1bHQnKSkge1xuICAgICAgdGhpcy4kJGRlYm91bmNlVmlld1ZhbHVlQ29tbWl0KHRyaWdnZXIpO1xuICAgIH1cbiAgfSxcblxuICAkJGRlYm91bmNlVmlld1ZhbHVlQ29tbWl0OiBmdW5jdGlvbih0cmlnZ2VyKSB7XG4gICAgdmFyIGRlYm91bmNlRGVsYXkgPSB0aGlzLiRvcHRpb25zLmdldE9wdGlvbignZGVib3VuY2UnKTtcblxuICAgIGlmIChpc051bWJlcihkZWJvdW5jZURlbGF5W3RyaWdnZXJdKSkge1xuICAgICAgZGVib3VuY2VEZWxheSA9IGRlYm91bmNlRGVsYXlbdHJpZ2dlcl07XG4gICAgfSBlbHNlIGlmIChpc051bWJlcihkZWJvdW5jZURlbGF5WydkZWZhdWx0J10pKSB7XG4gICAgICBkZWJvdW5jZURlbGF5ID0gZGVib3VuY2VEZWxheVsnZGVmYXVsdCddO1xuICAgIH1cblxuICAgIHRoaXMuJCR0aW1lb3V0LmNhbmNlbCh0aGlzLiQkcGVuZGluZ0RlYm91bmNlKTtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgaWYgKGRlYm91bmNlRGVsYXkgPiAwKSB7IC8vIHRoaXMgZmFpbHMgaWYgZGVib3VuY2VEZWxheSBpcyBhbiBvYmplY3RcbiAgICAgIHRoaXMuJCRwZW5kaW5nRGVib3VuY2UgPSB0aGlzLiQkdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgdGhhdC4kY29tbWl0Vmlld1ZhbHVlKCk7XG4gICAgICB9LCBkZWJvdW5jZURlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJCRzY29wZS4kcm9vdC4kJHBoYXNlKSB7XG4gICAgICB0aGlzLiRjb21taXRWaWV3VmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4kJHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHtcbiAgICAgICAgdGhhdC4kY29tbWl0Vmlld1ZhbHVlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldHVwTW9kZWxXYXRjaGVyKGN0cmwpIHtcbiAgLy8gbW9kZWwgLT4gdmFsdWVcbiAgLy8gTm90ZTogd2UgY2Fubm90IHVzZSBhIG5vcm1hbCBzY29wZS4kd2F0Y2ggYXMgd2Ugd2FudCB0byBkZXRlY3QgdGhlIGZvbGxvd2luZzpcbiAgLy8gMS4gc2NvcGUgdmFsdWUgaXMgJ2EnXG4gIC8vIDIuIHVzZXIgZW50ZXJzICdiJ1xuICAvLyAzLiBuZy1jaGFuZ2Uga2lja3MgaW4gYW5kIHJldmVydHMgc2NvcGUgdmFsdWUgdG8gJ2EnXG4gIC8vICAgIC0+IHNjb3BlIHZhbHVlIGRpZCBub3QgY2hhbmdlIHNpbmNlIHRoZSBsYXN0IGRpZ2VzdCBhc1xuICAvLyAgICAgICBuZy1jaGFuZ2UgZXhlY3V0ZXMgaW4gYXBwbHkgcGhhc2VcbiAgLy8gNC4gdmlldyBzaG91bGQgYmUgY2hhbmdlZCBiYWNrIHRvICdhJ1xuICBjdHJsLiQkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIG5nTW9kZWxXYXRjaCgpIHtcbiAgICB2YXIgbW9kZWxWYWx1ZSA9IGN0cmwuJCRuZ01vZGVsR2V0KGN0cmwuJCRzY29wZSk7XG5cbiAgICAvLyBpZiBzY29wZSBtb2RlbCB2YWx1ZSBhbmQgbmdNb2RlbCB2YWx1ZSBhcmUgb3V0IG9mIHN5bmNcbiAgICAvLyBUT0RPKHBlcmYpOiB3aHkgbm90IG1vdmUgdGhpcyB0byB0aGUgYWN0aW9uIGZuP1xuICAgIGlmIChtb2RlbFZhbHVlICE9PSBjdHJsLiRtb2RlbFZhbHVlICYmXG4gICAgICAgLy8gY2hlY2tzIGZvciBOYU4gaXMgbmVlZGVkIHRvIGFsbG93IHNldHRpbmcgdGhlIG1vZGVsIHRvIE5hTiB3aGVuIHRoZXJlJ3MgYW4gYXN5bmNWYWxpZGF0b3JcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgIChjdHJsLiRtb2RlbFZhbHVlID09PSBjdHJsLiRtb2RlbFZhbHVlIHx8IG1vZGVsVmFsdWUgPT09IG1vZGVsVmFsdWUpXG4gICAgKSB7XG4gICAgICBjdHJsLiRtb2RlbFZhbHVlID0gY3RybC4kJHJhd01vZGVsVmFsdWUgPSBtb2RlbFZhbHVlO1xuICAgICAgY3RybC4kJHBhcnNlclZhbGlkID0gdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgZm9ybWF0dGVycyA9IGN0cmwuJGZvcm1hdHRlcnMsXG4gICAgICAgICAgaWR4ID0gZm9ybWF0dGVycy5sZW5ndGg7XG5cbiAgICAgIHZhciB2aWV3VmFsdWUgPSBtb2RlbFZhbHVlO1xuICAgICAgd2hpbGUgKGlkeC0tKSB7XG4gICAgICAgIHZpZXdWYWx1ZSA9IGZvcm1hdHRlcnNbaWR4XSh2aWV3VmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGN0cmwuJHZpZXdWYWx1ZSAhPT0gdmlld1ZhbHVlKSB7XG4gICAgICAgIGN0cmwuJCR1cGRhdGVFbXB0eUNsYXNzZXModmlld1ZhbHVlKTtcbiAgICAgICAgY3RybC4kdmlld1ZhbHVlID0gY3RybC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUgPSB2aWV3VmFsdWU7XG4gICAgICAgIGN0cmwuJHJlbmRlcigpO1xuXG4gICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgbW9kZWwgYW5kIHZpZXcgdmFsdWUgaGF2ZSBiZWVuIHVwZGF0ZWQgZHVyaW5nIHJlbmRlclxuICAgICAgICBjdHJsLiQkcnVuVmFsaWRhdG9ycyhjdHJsLiRtb2RlbFZhbHVlLCBjdHJsLiR2aWV3VmFsdWUsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2RlbFZhbHVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRWYWxpZGl0eVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ2hhbmdlIHRoZSB2YWxpZGl0eSBzdGF0ZSwgYW5kIG5vdGlmeSB0aGUgZm9ybS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGhpbiAkcGFyc2Vycy8kZm9ybWF0dGVycyBvciBhIGN1c3RvbSB2YWxpZGF0aW9uIGltcGxlbWVudGF0aW9uLlxuICogSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBpdCBzaG91bGQgYmUgc3VmZmljaWVudCB0byB1c2UgdGhlIGBuZ01vZGVsLiR2YWxpZGF0b3JzYCBhbmRcbiAqIGBuZ01vZGVsLiRhc3luY1ZhbGlkYXRvcnNgIGNvbGxlY3Rpb25zIHdoaWNoIHdpbGwgY2FsbCBgJHNldFZhbGlkaXR5YCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxpZGF0aW9uRXJyb3JLZXkgTmFtZSBvZiB0aGUgdmFsaWRhdG9yLiBUaGUgYHZhbGlkYXRpb25FcnJvcktleWAgd2lsbCBiZSBhc3NpZ25lZFxuICogICAgICAgIHRvIGVpdGhlciBgJGVycm9yW3ZhbGlkYXRpb25FcnJvcktleV1gIG9yIGAkcGVuZGluZ1t2YWxpZGF0aW9uRXJyb3JLZXldYFxuICogICAgICAgIChmb3IgdW5mdWxmaWxsZWQgYCRhc3luY1ZhbGlkYXRvcnNgKSwgc28gdGhhdCBpdCBpcyBhdmFpbGFibGUgZm9yIGRhdGEtYmluZGluZy5cbiAqICAgICAgICBUaGUgYHZhbGlkYXRpb25FcnJvcktleWAgc2hvdWxkIGJlIGluIGNhbWVsQ2FzZSBhbmQgd2lsbCBnZXQgY29udmVydGVkIGludG8gZGFzaC1jYXNlXG4gKiAgICAgICAgZm9yIGNsYXNzIG5hbWUuIEV4YW1wbGU6IGBteUVycm9yYCB3aWxsIHJlc3VsdCBpbiBgbmctdmFsaWQtbXktZXJyb3JgIGFuZCBgbmctaW52YWxpZC1teS1lcnJvcmBcbiAqICAgICAgICBjbGFzcyBhbmQgY2FuIGJlIGJvdW5kIHRvIGFzICBge3tzb21lRm9ybS5zb21lQ29udHJvbC4kZXJyb3IubXlFcnJvcn19YCAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzVmFsaWQgV2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBpcyB2YWxpZCAodHJ1ZSksIGludmFsaWQgKGZhbHNlKSwgcGVuZGluZyAodW5kZWZpbmVkKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBza2lwcGVkIChudWxsKS4gUGVuZGluZyBpcyB1c2VkIGZvciB1bmZ1bGZpbGxlZCBgJGFzeW5jVmFsaWRhdG9yc2AuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcHBlZCBpcyB1c2VkIGJ5IEFuZ3VsYXIgd2hlbiB2YWxpZGF0b3JzIGRvIG5vdCBydW4gYmVjYXVzZSBvZiBwYXJzZSBlcnJvcnMgYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBgJGFzeW5jVmFsaWRhdG9yc2AgZG8gbm90IHJ1biBiZWNhdXNlIGFueSBvZiB0aGUgYCR2YWxpZGF0b3JzYCBmYWlsZWQuXG4gKi9cbmFkZFNldFZhbGlkaXR5TWV0aG9kKHtcbiAgY2xheno6IE5nTW9kZWxDb250cm9sbGVyLFxuICBzZXQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBvYmplY3RbcHJvcGVydHldID0gdHJ1ZTtcbiAgfSxcbiAgdW5zZXQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTtcbiAgfVxufSk7XG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ01vZGVsXG4gKlxuICogQGVsZW1lbnQgaW5wdXRcbiAqIEBwcmlvcml0eSAxXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nTW9kZWxgIGRpcmVjdGl2ZSBiaW5kcyBhbiBgaW5wdXRgLGBzZWxlY3RgLCBgdGV4dGFyZWFgIChvciBjdXN0b20gZm9ybSBjb250cm9sKSB0byBhXG4gKiBwcm9wZXJ0eSBvbiB0aGUgc2NvcGUgdXNpbmcge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIgTmdNb2RlbENvbnRyb2xsZXJ9LFxuICogd2hpY2ggaXMgY3JlYXRlZCBhbmQgZXhwb3NlZCBieSB0aGlzIGRpcmVjdGl2ZS5cbiAqXG4gKiBgbmdNb2RlbGAgaXMgcmVzcG9uc2libGUgZm9yOlxuICpcbiAqIC0gQmluZGluZyB0aGUgdmlldyBpbnRvIHRoZSBtb2RlbCwgd2hpY2ggb3RoZXIgZGlyZWN0aXZlcyBzdWNoIGFzIGBpbnB1dGAsIGB0ZXh0YXJlYWAgb3IgYHNlbGVjdGBcbiAqICAgcmVxdWlyZS5cbiAqIC0gUHJvdmlkaW5nIHZhbGlkYXRpb24gYmVoYXZpb3IgKGkuZS4gcmVxdWlyZWQsIG51bWJlciwgZW1haWwsIHVybCkuXG4gKiAtIEtlZXBpbmcgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sICh2YWxpZC9pbnZhbGlkLCBkaXJ0eS9wcmlzdGluZSwgdG91Y2hlZC91bnRvdWNoZWQsIHZhbGlkYXRpb24gZXJyb3JzKS5cbiAqIC0gU2V0dGluZyByZWxhdGVkIGNzcyBjbGFzc2VzIG9uIHRoZSBlbGVtZW50IChgbmctdmFsaWRgLCBgbmctaW52YWxpZGAsIGBuZy1kaXJ0eWAsIGBuZy1wcmlzdGluZWAsIGBuZy10b3VjaGVkYCxcbiAqICAgYG5nLXVudG91Y2hlZGAsIGBuZy1lbXB0eWAsIGBuZy1ub3QtZW1wdHlgKSBpbmNsdWRpbmcgYW5pbWF0aW9ucy5cbiAqIC0gUmVnaXN0ZXJpbmcgdGhlIGNvbnRyb2wgd2l0aCBpdHMgcGFyZW50IHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBmb3JtfS5cbiAqXG4gKiBOb3RlOiBgbmdNb2RlbGAgd2lsbCB0cnkgdG8gYmluZCB0byB0aGUgcHJvcGVydHkgZ2l2ZW4gYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiBvbiB0aGVcbiAqIGN1cnJlbnQgc2NvcGUuIElmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgb24gdGhpcyBzY29wZSwgaXQgd2lsbCBiZSBjcmVhdGVkXG4gKiBpbXBsaWNpdGx5IGFuZCBhZGRlZCB0byB0aGUgc2NvcGUuXG4gKlxuICogRm9yIGJlc3QgcHJhY3RpY2VzIG9uIHVzaW5nIGBuZ01vZGVsYCwgc2VlOlxuICpcbiAqICAtIFtVbmRlcnN0YW5kaW5nIFNjb3Blc10oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy93aWtpL1VuZGVyc3RhbmRpbmctU2NvcGVzKVxuICpcbiAqIEZvciBiYXNpYyBleGFtcGxlcywgaG93IHRvIHVzZSBgbmdNb2RlbGAsIHNlZTpcbiAqXG4gKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOmlucHV0IGlucHV0fVxuICogICAgLSB7QGxpbmsgaW5wdXRbdGV4dF0gdGV4dH1cbiAqICAgIC0ge0BsaW5rIGlucHV0W2NoZWNrYm94XSBjaGVja2JveH1cbiAqICAgIC0ge0BsaW5rIGlucHV0W3JhZGlvXSByYWRpb31cbiAqICAgIC0ge0BsaW5rIGlucHV0W251bWJlcl0gbnVtYmVyfVxuICogICAgLSB7QGxpbmsgaW5wdXRbZW1haWxdIGVtYWlsfVxuICogICAgLSB7QGxpbmsgaW5wdXRbdXJsXSB1cmx9XG4gKiAgICAtIHtAbGluayBpbnB1dFtkYXRlXSBkYXRlfVxuICogICAgLSB7QGxpbmsgaW5wdXRbZGF0ZXRpbWUtbG9jYWxdIGRhdGV0aW1lLWxvY2FsfVxuICogICAgLSB7QGxpbmsgaW5wdXRbdGltZV0gdGltZX1cbiAqICAgIC0ge0BsaW5rIGlucHV0W21vbnRoXSBtb250aH1cbiAqICAgIC0ge0BsaW5rIGlucHV0W3dlZWtdIHdlZWt9XG4gKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOnNlbGVjdCBzZWxlY3R9XG4gKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOnRleHRhcmVhIHRleHRhcmVhfVxuICpcbiAqICMgQ29tcGxleCBNb2RlbHMgKG9iamVjdHMgb3IgY29sbGVjdGlvbnMpXG4gKlxuICogQnkgZGVmYXVsdCwgYG5nTW9kZWxgIHdhdGNoZXMgdGhlIG1vZGVsIGJ5IHJlZmVyZW5jZSwgbm90IHZhbHVlLiBUaGlzIGlzIGltcG9ydGFudCB0byBrbm93IHdoZW5cbiAqIGJpbmRpbmcgaW5wdXRzIHRvIG1vZGVscyB0aGF0IGFyZSBvYmplY3RzIChlLmcuIGBEYXRlYCkgb3IgY29sbGVjdGlvbnMgKGUuZy4gYXJyYXlzKS4gSWYgb25seSBwcm9wZXJ0aWVzIG9mIHRoZVxuICogb2JqZWN0IG9yIGNvbGxlY3Rpb24gY2hhbmdlLCBgbmdNb2RlbGAgd2lsbCBub3QgYmUgbm90aWZpZWQgYW5kIHNvIHRoZSBpbnB1dCB3aWxsIG5vdCBiZSAgcmUtcmVuZGVyZWQuXG4gKlxuICogVGhlIG1vZGVsIG11c3QgYmUgYXNzaWduZWQgYW4gZW50aXJlbHkgbmV3IG9iamVjdCBvciBjb2xsZWN0aW9uIGJlZm9yZSBhIHJlLXJlbmRlcmluZyB3aWxsIG9jY3VyLlxuICpcbiAqIFNvbWUgZGlyZWN0aXZlcyBoYXZlIG9wdGlvbnMgdGhhdCB3aWxsIGNhdXNlIHRoZW0gdG8gdXNlIGEgY3VzdG9tIGAkd2F0Y2hDb2xsZWN0aW9uYCBvbiB0aGUgbW9kZWwgZXhwcmVzc2lvblxuICogLSBmb3IgZXhhbXBsZSwgYG5nT3B0aW9uc2Agd2lsbCBkbyBzbyB3aGVuIGEgYHRyYWNrIGJ5YCBjbGF1c2UgaXMgaW5jbHVkZWQgaW4gdGhlIGNvbXByZWhlbnNpb24gZXhwcmVzc2lvbiBvclxuICogaWYgdGhlIHNlbGVjdCBpcyBnaXZlbiB0aGUgYG11bHRpcGxlYCBhdHRyaWJ1dGUuXG4gKlxuICogVGhlIGAkd2F0Y2hDb2xsZWN0aW9uKClgIG1ldGhvZCBvbmx5IGRvZXMgYSBzaGFsbG93IGNvbXBhcmlzb24sIG1lYW5pbmcgdGhhdCBjaGFuZ2luZyBwcm9wZXJ0aWVzIGRlZXBlciB0aGFuIHRoZVxuICogZmlyc3QgbGV2ZWwgb2YgdGhlIG9iamVjdCAob3Igb25seSBjaGFuZ2luZyB0aGUgcHJvcGVydGllcyBvZiBhbiBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlmIGl0J3MgYW4gYXJyYXkpIHdpbGwgc3RpbGxcbiAqIG5vdCB0cmlnZ2VyIGEgcmUtcmVuZGVyaW5nIG9mIHRoZSBtb2RlbC5cbiAqXG4gKiAjIENTUyBjbGFzc2VzXG4gKiBUaGUgZm9sbG93aW5nIENTUyBjbGFzc2VzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZCBvbiB0aGUgYXNzb2NpYXRlZCBpbnB1dC9zZWxlY3QvdGV4dGFyZWEgZWxlbWVudFxuICogZGVwZW5kaW5nIG9uIHRoZSB2YWxpZGl0eSBvZiB0aGUgbW9kZWwuXG4gKlxuICogIC0gYG5nLXZhbGlkYDogdGhlIG1vZGVsIGlzIHZhbGlkXG4gKiAgLSBgbmctaW52YWxpZGA6IHRoZSBtb2RlbCBpcyBpbnZhbGlkXG4gKiAgLSBgbmctdmFsaWQtW2tleV1gOiBmb3IgZWFjaCB2YWxpZCBrZXkgYWRkZWQgYnkgYCRzZXRWYWxpZGl0eWBcbiAqICAtIGBuZy1pbnZhbGlkLVtrZXldYDogZm9yIGVhY2ggaW52YWxpZCBrZXkgYWRkZWQgYnkgYCRzZXRWYWxpZGl0eWBcbiAqICAtIGBuZy1wcmlzdGluZWA6IHRoZSBjb250cm9sIGhhc24ndCBiZWVuIGludGVyYWN0ZWQgd2l0aCB5ZXRcbiAqICAtIGBuZy1kaXJ0eWA6IHRoZSBjb250cm9sIGhhcyBiZWVuIGludGVyYWN0ZWQgd2l0aFxuICogIC0gYG5nLXRvdWNoZWRgOiB0aGUgY29udHJvbCBoYXMgYmVlbiBibHVycmVkXG4gKiAgLSBgbmctdW50b3VjaGVkYDogdGhlIGNvbnRyb2wgaGFzbid0IGJlZW4gYmx1cnJlZFxuICogIC0gYG5nLXBlbmRpbmdgOiBhbnkgYCRhc3luY1ZhbGlkYXRvcnNgIGFyZSB1bmZ1bGZpbGxlZFxuICogIC0gYG5nLWVtcHR5YDogdGhlIHZpZXcgZG9lcyBub3QgY29udGFpbiBhIHZhbHVlIG9yIHRoZSB2YWx1ZSBpcyBkZWVtZWQgXCJlbXB0eVwiLCBhcyBkZWZpbmVkXG4gKiAgICAgYnkgdGhlIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRpc0VtcHR5fSBtZXRob2RcbiAqICAtIGBuZy1ub3QtZW1wdHlgOiB0aGUgdmlldyBjb250YWlucyBhIG5vbi1lbXB0eSB2YWx1ZVxuICpcbiAqIEtlZXAgaW4gbWluZCB0aGF0IG5nQW5pbWF0ZSBjYW4gZGV0ZWN0IGVhY2ggb2YgdGhlc2UgY2xhc3NlcyB3aGVuIGFkZGVkIGFuZCByZW1vdmVkLlxuICpcbiAqICMjIEFuaW1hdGlvbiBIb29rc1xuICpcbiAqIEFuaW1hdGlvbnMgd2l0aGluIG1vZGVscyBhcmUgdHJpZ2dlcmVkIHdoZW4gYW55IG9mIHRoZSBhc3NvY2lhdGVkIENTUyBjbGFzc2VzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZFxuICogb24gdGhlIGlucHV0IGVsZW1lbnQgd2hpY2ggaXMgYXR0YWNoZWQgdG8gdGhlIG1vZGVsLiBUaGVzZSBjbGFzc2VzIGluY2x1ZGU6IGAubmctcHJpc3RpbmVgLCBgLm5nLWRpcnR5YCxcbiAqIGAubmctaW52YWxpZGAgYW5kIGAubmctdmFsaWRgIGFzIHdlbGwgYXMgYW55IG90aGVyIHZhbGlkYXRpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCBvbiB0aGUgbW9kZWwgaXRzZWxmLlxuICogVGhlIGFuaW1hdGlvbnMgdGhhdCBhcmUgdHJpZ2dlcmVkIHdpdGhpbiBuZ01vZGVsIGFyZSBzaW1pbGFyIHRvIGhvdyB0aGV5IHdvcmsgaW4gbmdDbGFzcyBhbmRcbiAqIGFuaW1hdGlvbnMgY2FuIGJlIGhvb2tlZCBpbnRvIHVzaW5nIENTUyB0cmFuc2l0aW9ucywga2V5ZnJhbWVzIGFzIHdlbGwgYXMgSlMgYW5pbWF0aW9ucy5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBzaW1wbGUgd2F5IHRvIHV0aWxpemUgQ1NTIHRyYW5zaXRpb25zIHRvIHN0eWxlIGFuIGlucHV0IGVsZW1lbnRcbiAqIHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQgYXMgaW52YWxpZCBhZnRlciBpdCBoYXMgYmVlbiB2YWxpZGF0ZWQ6XG4gKlxuICogPHByZT5cbiAqIC8vYmUgc3VyZSB0byBpbmNsdWRlIG5nQW5pbWF0ZSBhcyBhIG1vZHVsZSB0byBob29rIGludG8gbW9yZVxuICogLy9hZHZhbmNlZCBhbmltYXRpb25zXG4gKiAubXktaW5wdXQge1xuICogICB0cmFuc2l0aW9uOjAuNXMgbGluZWFyIGFsbDtcbiAqICAgYmFja2dyb3VuZDogd2hpdGU7XG4gKiB9XG4gKiAubXktaW5wdXQubmctaW52YWxpZCB7XG4gKiAgIGJhY2tncm91bmQ6IHJlZDtcbiAqICAgY29sb3I6d2hpdGU7XG4gKiB9XG4gKiA8L3ByZT5cbiAqXG4gKiBAZXhhbXBsZVxuICogPGV4YW1wbGUgZGVwcz1cImFuZ3VsYXItYW5pbWF0ZS5qc1wiIGFuaW1hdGlvbnM9XCJ0cnVlXCIgZml4QmFzZT1cInRydWVcIiBtb2R1bGU9XCJpbnB1dEV4YW1wbGVcIiBuYW1lPVwibmctbW9kZWxcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8c2NyaXB0PlxuICAgICAgICBhbmd1bGFyLm1vZHVsZSgnaW5wdXRFeGFtcGxlJywgW10pXG4gICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICRzY29wZS52YWwgPSAnMSc7XG4gICAgICAgICAgfV0pO1xuICAgICAgIDwvc2NyaXB0PlxuICAgICAgIDxzdHlsZT5cbiAgICAgICAgIC5teS1pbnB1dCB7XG4gICAgICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzO1xuICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgIH1cbiAgICAgICAgIC5teS1pbnB1dC5uZy1pbnZhbGlkIHtcbiAgICAgICAgICAgY29sb3I6d2hpdGU7XG4gICAgICAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICAgICAgIH1cbiAgICAgICA8L3N0eWxlPlxuICAgICAgIDxwIGlkPVwiaW5wdXREZXNjcmlwdGlvblwiPlxuICAgICAgICBVcGRhdGUgaW5wdXQgdG8gc2VlIHRyYW5zaXRpb25zIHdoZW4gdmFsaWQvaW52YWxpZC5cbiAgICAgICAgSW50ZWdlciBpcyBhIHZhbGlkIHZhbHVlLlxuICAgICAgIDwvcD5cbiAgICAgICA8Zm9ybSBuYW1lPVwidGVzdEZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cInZhbFwiIG5nLXBhdHRlcm49XCIvXlxcZCskL1wiIG5hbWU9XCJhbmltXCIgY2xhc3M9XCJteS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImlucHV0RGVzY3JpcHRpb25cIiAvPlxuICAgICAgIDwvZm9ybT5cbiAgICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqICMjIEJpbmRpbmcgdG8gYSBnZXR0ZXIvc2V0dGVyXG4gKlxuICogU29tZXRpbWVzIGl0J3MgaGVscGZ1bCB0byBiaW5kIGBuZ01vZGVsYCB0byBhIGdldHRlci9zZXR0ZXIgZnVuY3Rpb24uICBBIGdldHRlci9zZXR0ZXIgaXMgYVxuICogZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIHdoZW4gY2FsbGVkIHdpdGggemVybyBhcmd1bWVudHMsIGFuZCBzZXRzXG4gKiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgYSBtb2RlbCB3aGVuIGNhbGxlZCB3aXRoIGFuIGFyZ3VtZW50LiBJdCdzIHNvbWV0aW1lcyB1c2VmdWwgdG8gdXNlIHRoaXNcbiAqIGZvciBtb2RlbHMgdGhhdCBoYXZlIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHRoYXQncyBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSBtb2RlbCBleHBvc2VzXG4gKiB0byB0aGUgdmlldy5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiPlxuICogKipCZXN0IFByYWN0aWNlOioqIEl0J3MgYmVzdCB0byBrZWVwIGdldHRlcnMgZmFzdCBiZWNhdXNlIEFuZ3VsYXIgaXMgbGlrZWx5IHRvIGNhbGwgdGhlbSBtb3JlXG4gKiBmcmVxdWVudGx5IHRoYW4gb3RoZXIgcGFydHMgb2YgeW91ciBjb2RlLlxuICogPC9kaXY+XG4gKlxuICogWW91IHVzZSB0aGlzIGJlaGF2aW9yIGJ5IGFkZGluZyBgbmctbW9kZWwtb3B0aW9ucz1cInsgZ2V0dGVyU2V0dGVyOiB0cnVlIH1cImAgdG8gYW4gZWxlbWVudCB0aGF0XG4gKiBoYXMgYG5nLW1vZGVsYCBhdHRhY2hlZCB0byBpdC4gWW91IGNhbiBhbHNvIGFkZCBgbmctbW9kZWwtb3B0aW9ucz1cInsgZ2V0dGVyU2V0dGVyOiB0cnVlIH1cImAgdG9cbiAqIGEgYDxmb3JtPmAsIHdoaWNoIHdpbGwgZW5hYmxlIHRoaXMgYmVoYXZpb3IgZm9yIGFsbCBgPGlucHV0PmBzIHdpdGhpbiBpdC4gU2VlXG4gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIGBuZ01vZGVsT3B0aW9uc2B9IGZvciBtb3JlLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBuZ01vZGVsYCB3aXRoIGEgZ2V0dGVyL3NldHRlcjpcbiAqXG4gKiBAZXhhbXBsZVxuICogPGV4YW1wbGUgbmFtZT1cIm5nTW9kZWwtZ2V0dGVyLXNldHRlclwiIG1vZHVsZT1cImdldHRlclNldHRlckV4YW1wbGVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgPGZvcm0gbmFtZT1cInVzZXJGb3JtXCI+XG4gICAgICAgICAgIDxsYWJlbD5OYW1lOlxuICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJ1c2VyTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPVwidXNlci5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz1cInsgZ2V0dGVyU2V0dGVyOiB0cnVlIH1cIiAvPlxuICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgPHByZT51c2VyLm5hbWUgPSA8c3BhbiBuZy1iaW5kPVwidXNlci5uYW1lKClcIj48L3NwYW4+PC9wcmU+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICAgICAgIGFuZ3VsYXIubW9kdWxlKCdnZXR0ZXJTZXR0ZXJFeGFtcGxlJywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICB2YXIgX25hbWUgPSAnQnJpYW4nO1xuICAgICAgICAgICAkc2NvcGUudXNlciA9IHtcbiAgICAgICAgICAgICBuYW1lOiBmdW5jdGlvbihuZXdOYW1lKSB7XG4gICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBuZXdOYW1lIGNhbiBiZSB1bmRlZmluZWQgZm9yIHR3byByZWFzb25zOlxuICAgICAgICAgICAgICAvLyAxLiBCZWNhdXNlIGl0IGlzIGNhbGxlZCBhcyBhIGdldHRlciBhbmQgdGh1cyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHNcbiAgICAgICAgICAgICAgLy8gMi4gQmVjYXVzZSB0aGUgcHJvcGVydHkgc2hvdWxkIGFjdHVhbGx5IGJlIHNldCB0byB1bmRlZmluZWQuIFRoaXMgaGFwcGVucyBlLmcuIGlmIHRoZVxuICAgICAgICAgICAgICAvLyAgICBpbnB1dCBpcyBpbnZhbGlkXG4gICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKF9uYW1lID0gbmV3TmFtZSkgOiBfbmFtZTtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIH07XG4gICAgICAgICB9XSk7XG4gICAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nTW9kZWxEaXJlY3RpdmUgPSBbJyRyb290U2NvcGUnLCBmdW5jdGlvbigkcm9vdFNjb3BlKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICByZXF1aXJlOiBbJ25nTW9kZWwnLCAnXj9mb3JtJywgJ14/bmdNb2RlbE9wdGlvbnMnXSxcbiAgICBjb250cm9sbGVyOiBOZ01vZGVsQ29udHJvbGxlcixcbiAgICAvLyBQcmVsaW5rIG5lZWRzIHRvIHJ1biBiZWZvcmUgYW55IGlucHV0IGRpcmVjdGl2ZVxuICAgIC8vIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgTmdNb2RlbE9wdGlvbnMgaW4gTmdNb2RlbENvbnRyb2xsZXJcbiAgICAvLyBiZWZvcmUgYW55b25lIGVsc2UgdXNlcyBpdC5cbiAgICBwcmlvcml0eTogMSxcbiAgICBjb21waWxlOiBmdW5jdGlvbiBuZ01vZGVsQ29tcGlsZShlbGVtZW50KSB7XG4gICAgICAvLyBTZXR1cCBpbml0aWFsIHN0YXRlIG9mIHRoZSBjb250cm9sXG4gICAgICBlbGVtZW50LmFkZENsYXNzKFBSSVNUSU5FX0NMQVNTKS5hZGRDbGFzcyhVTlRPVUNIRURfQ0xBU1MpLmFkZENsYXNzKFZBTElEX0NMQVNTKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJlOiBmdW5jdGlvbiBuZ01vZGVsUHJlTGluayhzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHMpIHtcbiAgICAgICAgICB2YXIgbW9kZWxDdHJsID0gY3RybHNbMF0sXG4gICAgICAgICAgICAgIGZvcm1DdHJsID0gY3RybHNbMV0gfHwgbW9kZWxDdHJsLiQkcGFyZW50Rm9ybSxcbiAgICAgICAgICAgICAgb3B0aW9uc0N0cmwgPSBjdHJsc1syXTtcblxuICAgICAgICAgIGlmIChvcHRpb25zQ3RybCkge1xuICAgICAgICAgICAgbW9kZWxDdHJsLiRvcHRpb25zID0gb3B0aW9uc0N0cmwuJG9wdGlvbnM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbW9kZWxDdHJsLiQkaW5pdEdldHRlclNldHRlcnMoKTtcblxuICAgICAgICAgIC8vIG5vdGlmeSBvdGhlcnMsIGVzcGVjaWFsbHkgcGFyZW50IGZvcm1zXG4gICAgICAgICAgZm9ybUN0cmwuJGFkZENvbnRyb2wobW9kZWxDdHJsKTtcblxuICAgICAgICAgIGF0dHIuJG9ic2VydmUoJ25hbWUnLCBmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKG1vZGVsQ3RybC4kbmFtZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgbW9kZWxDdHJsLiQkcGFyZW50Rm9ybS4kJHJlbmFtZUNvbnRyb2wobW9kZWxDdHJsLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBtb2RlbEN0cmwuJCRwYXJlbnRGb3JtLiRyZW1vdmVDb250cm9sKG1vZGVsQ3RybCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Q6IGZ1bmN0aW9uIG5nTW9kZWxQb3N0TGluayhzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHMpIHtcbiAgICAgICAgICB2YXIgbW9kZWxDdHJsID0gY3RybHNbMF07XG4gICAgICAgICAgaWYgKG1vZGVsQ3RybC4kb3B0aW9ucy5nZXRPcHRpb24oJ3VwZGF0ZU9uJykpIHtcbiAgICAgICAgICAgIGVsZW1lbnQub24obW9kZWxDdHJsLiRvcHRpb25zLmdldE9wdGlvbigndXBkYXRlT24nKSwgZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgICAgICAgbW9kZWxDdHJsLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoZXYgJiYgZXYudHlwZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBzZXRUb3VjaGVkKCkge1xuICAgICAgICAgICAgbW9kZWxDdHJsLiRzZXRUb3VjaGVkKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudC5vbignYmx1cicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKG1vZGVsQ3RybC4kdG91Y2hlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoJHJvb3RTY29wZS4kJHBoYXNlKSB7XG4gICAgICAgICAgICAgIHNjb3BlLiRldmFsQXN5bmMoc2V0VG91Y2hlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoc2V0VG91Y2hlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufV07XG5cbi8qIGV4cG9ydGVkIGRlZmF1bHRNb2RlbE9wdGlvbnMgKi9cbnZhciBkZWZhdWx0TW9kZWxPcHRpb25zO1xudmFyIERFRkFVTFRfUkVHRVhQID0gLyhcXHMrfF4pZGVmYXVsdChcXHMrfCQpLztcblxuLyoqXG4gKiBAbmdkb2MgdHlwZVxuICogQG5hbWUgTW9kZWxPcHRpb25zXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgY29udGFpbmVyIGZvciB0aGUgb3B0aW9ucyBzZXQgYnkgdGhlIHtAbGluayBuZ01vZGVsT3B0aW9uc30gZGlyZWN0aXZlXG4gKi9cbmZ1bmN0aW9uIE1vZGVsT3B0aW9ucyhvcHRpb25zKSB7XG4gIHRoaXMuJCRvcHRpb25zID0gb3B0aW9ucztcbn1cblxuTW9kZWxPcHRpb25zLnByb3RvdHlwZSA9IHtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBNb2RlbE9wdGlvbnMjZ2V0T3B0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMgeyp9IHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb3B0aW9uXG4gICAqL1xuICBnZXRPcHRpb246IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4kJG9wdGlvbnNbbmFtZV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgTW9kZWxPcHRpb25zI2NyZWF0ZUNoaWxkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRpb25zIGZvciB0aGUgbmV3IGNoaWxkIHRoYXQgd2lsbCBvdmVycmlkZSB0aGUgcGFyZW50J3Mgb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtNb2RlbE9wdGlvbnN9IGEgbmV3IGBNb2RlbE9wdGlvbnNgIG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgKi9cbiAgY3JlYXRlQ2hpbGQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgaW5oZXJpdEFsbCA9IGZhbHNlO1xuXG4gICAgLy8gbWFrZSBhIHNoYWxsb3cgY29weVxuICAgIG9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMpO1xuXG4gICAgLy8gSW5oZXJpdCBvcHRpb25zIGZyb20gdGhlIHBhcmVudCBpZiBzcGVjaWZpZWQgYnkgdGhlIHZhbHVlIGBcIiRpbmhlcml0XCJgXG4gICAgZm9yRWFjaChvcHRpb25zLCAvKiBAdGhpcyAqLyBmdW5jdGlvbihvcHRpb24sIGtleSkge1xuICAgICAgaWYgKG9wdGlvbiA9PT0gJyRpbmhlcml0Jykge1xuICAgICAgICBpZiAoa2V5ID09PSAnKicpIHtcbiAgICAgICAgICBpbmhlcml0QWxsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSB0aGlzLiQkb3B0aW9uc1trZXldO1xuICAgICAgICAgIC8vIGB1cGRhdGVPbmAgaXMgc3BlY2lhbCBzbyB3ZSBtdXN0IGFsc28gaW5oZXJpdCB0aGUgYHVwZGF0ZU9uRGVmYXVsdGAgb3B0aW9uXG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZU9uJykge1xuICAgICAgICAgICAgb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQgPSB0aGlzLiQkb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoa2V5ID09PSAndXBkYXRlT24nKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGB1cGRhdGVPbmAgcHJvcGVydHkgY29udGFpbnMgdGhlIGBkZWZhdWx0YCBldmVudCB0aGVuIHdlIGhhdmUgdG8gcmVtb3ZlXG4gICAgICAgICAgLy8gaXQgZnJvbSB0aGUgZXZlbnQgbGlzdCBhbmQgc2V0IHRoZSBgdXBkYXRlT25EZWZhdWx0YCBmbGFnLlxuICAgICAgICAgIG9wdGlvbnMudXBkYXRlT25EZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJpbShvcHRpb24ucmVwbGFjZShERUZBVUxUX1JFR0VYUCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgaWYgKGluaGVyaXRBbGwpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBwcm9wZXJ0eSBvZiB0aGUgZm9ybTogYFwiKlwiOiBcIiRpbmhlcml0XCJgXG4gICAgICBkZWxldGUgb3B0aW9uc1snKiddO1xuICAgICAgZGVmYXVsdHMob3B0aW9ucywgdGhpcy4kJG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIEZpbmFsbHkgYWRkIGluIGFueSBtaXNzaW5nIGRlZmF1bHRzXG4gICAgZGVmYXVsdHMob3B0aW9ucywgZGVmYXVsdE1vZGVsT3B0aW9ucy4kJG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIG5ldyBNb2RlbE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbn07XG5cblxuZGVmYXVsdE1vZGVsT3B0aW9ucyA9IG5ldyBNb2RlbE9wdGlvbnMoe1xuICB1cGRhdGVPbjogJycsXG4gIHVwZGF0ZU9uRGVmYXVsdDogdHJ1ZSxcbiAgZGVib3VuY2U6IDAsXG4gIGdldHRlclNldHRlcjogZmFsc2UsXG4gIGFsbG93SW52YWxpZDogZmFsc2UsXG4gIHRpbWV6b25lOiBudWxsXG59KTtcblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTW9kZWxPcHRpb25zXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHtAbGluayBuZ01vZGVsfSBkaXJlY3RpdmVzIHdpdGhpbiB5b3VyXG4gKiBhcHBsaWNhdGlvbi4gWW91IGNhbiBzcGVjaWZ5IGFuIGBuZ01vZGVsT3B0aW9uc2AgZGlyZWN0aXZlIG9uIGFueSBlbGVtZW50LiBBbGwge0BsaW5rIG5nTW9kZWx9XG4gKiBkaXJlY3RpdmVzIHdpbGwgdXNlIHRoZSBvcHRpb25zIG9mIHRoZWlyIG5lYXJlc3QgYG5nTW9kZWxPcHRpb25zYCBhbmNlc3Rvci5cbiAqXG4gKiBUaGUgYG5nTW9kZWxPcHRpb25zYCBzZXR0aW5ncyBhcmUgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBkaXJlY3RpdmUgYXNcbiAqIGFuIEFuZ3VsYXIgZXhwcmVzc2lvbi4gVGhpcyBleHByZXNzaW9uIHNob3VsZCBldmFsdWF0ZSB0byBhbiBvYmplY3QsIHdob3NlIHByb3BlcnRpZXMgY29udGFpblxuICogdGhlIHNldHRpbmdzLiBGb3IgZXhhbXBsZTogYDxkaXYgXCJuZy1tb2RlbC1vcHRpb25zXCI9XCJ7IGRlYm91bmNlOiAxMDAgfVwiYC5cbiAqXG4gKiAjIyBJbmhlcml0aW5nIE9wdGlvbnNcbiAqXG4gKiBZb3UgY2FuIHNwZWNpZnkgdGhhdCBhbiBgbmdNb2RlbE9wdGlvbnNgIHNldHRpbmcgc2hvdWxkIGJlIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IGBuZ01vZGVsT3B0aW9uc2BcbiAqIGRpcmVjdGl2ZSBieSBnaXZpbmcgaXQgdGhlIHZhbHVlIG9mIGBcIiRpbmhlcml0XCJgLlxuICogVGhlbiBpdCB3aWxsIGluaGVyaXQgdGhhdCBzZXR0aW5nIGZyb20gdGhlIGZpcnN0IGBuZ01vZGVsT3B0aW9uc2AgZGlyZWN0aXZlIGZvdW5kIGJ5IHRyYXZlcnNpbmcgdXAgdGhlXG4gKiBET00gdHJlZS4gSWYgdGhlcmUgaXMgbm8gYW5jZXN0b3IgZWxlbWVudCBjb250YWluaW5nIGFuIGBuZ01vZGVsT3B0aW9uc2AgZGlyZWN0aXZlIHRoZW4gZGVmYXVsdCBzZXR0aW5nc1xuICogd2lsbCBiZSB1c2VkLlxuICpcbiAqIEZvciBleGFtcGxlIGdpdmVuIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgb2YgSFRNTFxuICpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IG5nLW1vZGVsLW9wdGlvbnM9XCJ7IGFsbG93SW52YWxpZDogdHJ1ZSwgZGVib3VuY2U6IDIwMCB9XCI+XG4gKiAgIDxmb3JtIG5nLW1vZGVsLW9wdGlvbnM9XCJ7IHVwZGF0ZU9uOiAnYmx1cicsIGFsbG93SW52YWxpZDogJyRpbmhlcml0JyB9XCI+XG4gKiAgICAgPGlucHV0IG5nLW1vZGVsLW9wdGlvbnM9XCJ7IHVwZGF0ZU9uOiAnZGVmYXVsdCcsIGFsbG93SW52YWxpZDogJyRpbmhlcml0JyB9XCIgLz5cbiAqICAgPC9mb3JtPlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzXG4gKlxuICogYGBganNcbiAqIHsgYWxsb3dJbnZhbGlkOiB0cnVlLCB1cGRhdGVPbjogJ2RlZmF1bHQnLCBkZWJvdW5jZTogMCB9XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCB0aGUgYGRlYm91bmNlYCBzZXR0aW5nIHdhcyBub3QgaW5oZXJpdGVkIGFuZCB1c2VkIHRoZSBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXG4gKlxuICogWW91IGNhbiBzcGVjaWZ5IHRoYXQgYWxsIHVuZGVmaW5lZCBzZXR0aW5ncyBhcmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgZnJvbSBhbiBhbmNlc3RvciBieVxuICogaW5jbHVkaW5nIGEgcHJvcGVydHkgd2l0aCBrZXkgb2YgYFwiKlwiYCBhbmQgdmFsdWUgb2YgYFwiJGluaGVyaXRcImAuXG4gKlxuICogRm9yIGV4YW1wbGUgZ2l2ZW4gdGhlIGZvbGxvd2luZyBmcmFnbWVudCBvZiBIVE1MXG4gKlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgbmctbW9kZWwtb3B0aW9ucz1cInsgYWxsb3dJbnZhbGlkOiB0cnVlLCBkZWJvdW5jZTogMjAwIH1cIj5cbiAqICAgPGZvcm0gbmctbW9kZWwtb3B0aW9ucz1cInsgdXBkYXRlT246ICdibHVyJywgXCIqXCI6ICckaW5oZXJpdCcgfVwiPlxuICogICAgIDxpbnB1dCBuZy1tb2RlbC1vcHRpb25zPVwieyB1cGRhdGVPbjogJ2RlZmF1bHQnLCBcIipcIjogJyRpbmhlcml0JyB9XCIgLz5cbiAqICAgPC9mb3JtPlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzXG4gKlxuICogYGBganNcbiAqIHsgYWxsb3dJbnZhbGlkOiB0cnVlLCB1cGRhdGVPbjogJ2RlZmF1bHQnLCBkZWJvdW5jZTogMjAwIH1cbiAqIGBgYFxuICpcbiAqIE5vdGljZSB0aGF0IHRoZSBgZGVib3VuY2VgIHNldHRpbmcgbm93IGluaGVyaXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBvdXRlciBgPGRpdj5gIGVsZW1lbnQuXG4gKlxuICogSWYgeW91IGFyZSBjcmVhdGluZyBhIHJldXNhYmxlIGNvbXBvbmVudCB0aGVuIHlvdSBzaG91bGQgYmUgY2FyZWZ1bCB3aGVuIHVzaW5nIGBcIipcIjogXCIkaW5oZXJpdFwiYFxuICogc2luY2UgeW91IG1heSBpbmFkdmVydGVudGx5IGluaGVyaXQgYSBzZXR0aW5nIGluIHRoZSBmdXR1cmUgdGhhdCBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiB5b3VyIGNvbXBvbmVudC5cbiAqXG4gKlxuICogIyMgVHJpZ2dlcmluZyBhbmQgZGVib3VuY2luZyBtb2RlbCB1cGRhdGVzXG4gKlxuICogVGhlIGB1cGRhdGVPbmAgYW5kIGBkZWJvdW5jZWAgcHJvcGVydGllcyBhbGxvdyB5b3UgdG8gc3BlY2lmeSBhIGN1c3RvbSBsaXN0IG9mIGV2ZW50cyB0aGF0IHdpbGxcbiAqIHRyaWdnZXIgYSBtb2RlbCB1cGRhdGUgYW5kL29yIGEgZGVib3VuY2luZyBkZWxheSBzbyB0aGF0IHRoZSBhY3R1YWwgdXBkYXRlIG9ubHkgdGFrZXMgcGxhY2Ugd2hlblxuICogYSB0aW1lciBleHBpcmVzOyB0aGlzIHRpbWVyIHdpbGwgYmUgcmVzZXQgYWZ0ZXIgYW5vdGhlciBjaGFuZ2UgdGFrZXMgcGxhY2UuXG4gKlxuICogR2l2ZW4gdGhlIG5hdHVyZSBvZiBgbmdNb2RlbE9wdGlvbnNgLCB0aGUgdmFsdWUgZGlzcGxheWVkIGluc2lkZSBpbnB1dCBmaWVsZHMgaW4gdGhlIHZpZXcgbWlnaHRcbiAqIGJlIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBpbiB0aGUgYWN0dWFsIG1vZGVsLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IHVwZGF0ZSB0aGUgbW9kZWwgeW91XG4gKiBzaG91bGQgYWxzbyBpbnZva2Uge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHJvbGxiYWNrVmlld1ZhbHVlfSBvbiB0aGUgcmVsZXZhbnQgaW5wdXQgZmllbGQgaW5cbiAqIG9yZGVyIHRvIG1ha2Ugc3VyZSBpdCBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgYW5kIHRoYXQgYW55IGRlYm91bmNlZCBhY3Rpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogVGhlIGVhc2llc3Qgd2F5IHRvIHJlZmVyZW5jZSB0aGUgY29udHJvbCdzIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRyb2xsYmFja1ZpZXdWYWx1ZX1cbiAqIG1ldGhvZCBpcyBieSBtYWtpbmcgc3VyZSB0aGUgaW5wdXQgaXMgcGxhY2VkIGluc2lkZSBhIGZvcm0gdGhhdCBoYXMgYSBgbmFtZWAgYXR0cmlidXRlLiBUaGlzIGlzXG4gKiBpbXBvcnRhbnQgYmVjYXVzZSBgZm9ybWAgY29udHJvbGxlcnMgYXJlIHB1Ymxpc2hlZCB0byB0aGUgcmVsYXRlZCBzY29wZSB1bmRlciB0aGUgbmFtZSBpbiB0aGVpclxuICogYG5hbWVgIGF0dHJpYnV0ZS5cbiAqXG4gKiBBbnkgcGVuZGluZyBjaGFuZ2VzIHdpbGwgdGFrZSBwbGFjZSBpbW1lZGlhdGVseSB3aGVuIGFuIGVuY2xvc2luZyBmb3JtIGlzIHN1Ym1pdHRlZCB2aWEgdGhlXG4gKiBgc3VibWl0YCBldmVudC4gTm90ZSB0aGF0IGBuZ0NsaWNrYCBldmVudHMgd2lsbCBvY2N1ciBiZWZvcmUgdGhlIG1vZGVsIGlzIHVwZGF0ZWQuIFVzZSBgbmdTdWJtaXRgXG4gKiB0byBoYXZlIGFjY2VzcyB0byB0aGUgdXBkYXRlZCBtb2RlbC5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIG92ZXJyaWRlIGltbWVkaWF0ZSB1cGRhdGVzLiBDaGFuZ2VzIG9uIHRoZSBpbnB1dHMgd2l0aGluIHRoZVxuICogZm9ybSB3aWxsIHVwZGF0ZSB0aGUgbW9kZWwgb25seSB3aGVuIHRoZSBjb250cm9sIGxvc2VzIGZvY3VzIChibHVyIGV2ZW50KS4gSWYgYGVzY2FwZWAga2V5IGlzXG4gKiBwcmVzc2VkIHdoaWxlIHRoZSBpbnB1dCBmaWVsZCBpcyBmb2N1c2VkLCB0aGUgdmFsdWUgaXMgcmVzZXQgdG8gdGhlIHZhbHVlIGluIHRoZSBjdXJyZW50IG1vZGVsLlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ01vZGVsT3B0aW9ucy1kaXJlY3RpdmUtYmx1clwiIG1vZHVsZT1cIm9wdGlvbnNFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgICAgIDxmb3JtIG5hbWU9XCJ1c2VyRm9ybVwiPlxuICogICAgICAgICA8bGFiZWw+XG4gKiAgICAgICAgICAgTmFtZTpcbiAqICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlck5hbWVcIlxuICogICAgICAgICAgICAgICAgICBuZy1tb2RlbD1cInVzZXIubmFtZVwiXG4gKiAgICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9XCJ7IHVwZGF0ZU9uOiAnYmx1cicgfVwiXG4gKiAgICAgICAgICAgICAgICAgIG5nLWtleXVwPVwiY2FuY2VsKCRldmVudClcIiAvPlxuICogICAgICAgICA8L2xhYmVsPjxiciAvPlxuICogICAgICAgICA8bGFiZWw+XG4gKiAgICAgICAgICAgT3RoZXIgZGF0YTpcbiAqICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cInVzZXIuZGF0YVwiIC8+XG4gKiAgICAgICAgIDwvbGFiZWw+PGJyIC8+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgICA8cHJlPnVzZXIubmFtZSA9IDxzcGFuIG5nLWJpbmQ9XCJ1c2VyLm5hbWVcIj48L3NwYW4+PC9wcmU+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgIGFuZ3VsYXIubW9kdWxlKCdvcHRpb25zRXhhbXBsZScsIFtdKVxuICogICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICAgJHNjb3BlLnVzZXIgPSB7IG5hbWU6ICdzYXknLCBkYXRhOiAnJyB9O1xuICpcbiAqICAgICAgICAgJHNjb3BlLmNhbmNlbCA9IGZ1bmN0aW9uKGUpIHtcbiAqICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICogICAgICAgICAgICAgJHNjb3BlLnVzZXJGb3JtLnVzZXJOYW1lLiRyb2xsYmFja1ZpZXdWYWx1ZSgpO1xuICogICAgICAgICAgIH1cbiAqICAgICAgICAgfTtcbiAqICAgICAgIH1dKTtcbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiAgICAgdmFyIG1vZGVsID0gZWxlbWVudChieS5iaW5kaW5nKCd1c2VyLm5hbWUnKSk7XG4gKiAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndXNlci5uYW1lJykpO1xuICogICAgIHZhciBvdGhlciA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXIuZGF0YScpKTtcbiAqXG4gKiAgICAgaXQoJ3Nob3VsZCBhbGxvdyBjdXN0b20gZXZlbnRzJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICBpbnB1dC5zZW5kS2V5cygnIGhlbGxvJyk7XG4gKiAgICAgICBpbnB1dC5jbGljaygpO1xuICogICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9FcXVhbCgnc2F5Jyk7XG4gKiAgICAgICBvdGhlci5jbGljaygpO1xuICogICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9FcXVhbCgnc2F5IGhlbGxvJyk7XG4gKiAgICAgfSk7XG4gKlxuICogICAgIGl0KCdzaG91bGQgJHJvbGxiYWNrVmlld1ZhbHVlIHdoZW4gbW9kZWwgY2hhbmdlcycsIGZ1bmN0aW9uKCkge1xuICogICAgICAgaW5wdXQuc2VuZEtleXMoJyBoZWxsbycpO1xuICogICAgICAgZXhwZWN0KGlucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnc2F5IGhlbGxvJyk7XG4gKiAgICAgICBpbnB1dC5zZW5kS2V5cyhwcm90cmFjdG9yLktleS5FU0NBUEUpO1xuICogICAgICAgZXhwZWN0KGlucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnc2F5Jyk7XG4gKiAgICAgICBvdGhlci5jbGljaygpO1xuICogICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9FcXVhbCgnc2F5Jyk7XG4gKiAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiBUaGUgbmV4dCBleGFtcGxlIHNob3dzIGhvdyB0byBkZWJvdW5jZSBtb2RlbCBjaGFuZ2VzLiBNb2RlbCB3aWxsIGJlIHVwZGF0ZWQgb25seSAxIHNlYyBhZnRlciBsYXN0IGNoYW5nZS5cbiAqIElmIHRoZSBgQ2xlYXJgIGJ1dHRvbiBpcyBwcmVzc2VkLCBhbnkgZGVib3VuY2VkIGFjdGlvbiBpcyBjYW5jZWxlZCBhbmQgdGhlIHZhbHVlIGJlY29tZXMgZW1wdHkuXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cIm5nTW9kZWxPcHRpb25zLWRpcmVjdGl2ZS1kZWJvdW5jZVwiIG1vZHVsZT1cIm9wdGlvbnNFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgICAgIDxmb3JtIG5hbWU9XCJ1c2VyRm9ybVwiPlxuICogICAgICAgICBOYW1lOlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlck5hbWVcIlxuICogICAgICAgICAgICAgICAgbmctbW9kZWw9XCJ1c2VyLm5hbWVcIlxuICogICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz1cInsgZGVib3VuY2U6IDEwMDAgfVwiIC8+XG4gKiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJ1c2VyRm9ybS51c2VyTmFtZS4kcm9sbGJhY2tWaWV3VmFsdWUoKTsgdXNlci5uYW1lPScnXCI+Q2xlYXI8L2J1dHRvbj48YnIgLz5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICAgIDxwcmU+dXNlci5uYW1lID0gPHNwYW4gbmctYmluZD1cInVzZXIubmFtZVwiPjwvc3Bhbj48L3ByZT5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgICAgYW5ndWxhci5tb2R1bGUoJ29wdGlvbnNFeGFtcGxlJywgW10pXG4gKiAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICogICAgICAgICAkc2NvcGUudXNlciA9IHsgbmFtZTogJ3NheScgfTtcbiAqICAgICAgIH1dKTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqICMjIE1vZGVsIHVwZGF0ZXMgYW5kIHZhbGlkYXRpb25cbiAqXG4gKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaW4gYG5nTW9kZWxgIGlzIHRoYXQgdGhlIG1vZGVsIHZhbHVlIGlzIHNldCB0byBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICogdmFsaWRhdGlvbiBkZXRlcm1pbmVzIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQuIEJ5IHNldHRpbmcgdGhlIGBhbGxvd0ludmFsaWRgIHByb3BlcnR5IHRvIHRydWUsXG4gKiB0aGUgbW9kZWwgd2lsbCBzdGlsbCBiZSB1cGRhdGVkIGV2ZW4gaWYgdGhlIHZhbHVlIGlzIGludmFsaWQuXG4gKlxuICpcbiAqICMjIENvbm5lY3RpbmcgdG8gdGhlIHNjb3BlXG4gKlxuICogQnkgc2V0dGluZyB0aGUgYGdldHRlclNldHRlcmAgcHJvcGVydHkgdG8gdHJ1ZSB5b3UgYXJlIHRlbGxpbmcgbmdNb2RlbCB0aGF0IHRoZSBgbmdNb2RlbGAgZXhwcmVzc2lvblxuICogb24gdGhlIHNjb3BlIHJlZmVycyB0byBhIFwiZ2V0dGVyL3NldHRlclwiIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHRoZSB2YWx1ZSBpdHNlbGYuXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBiaW5kIHRvIGdldHRlci9zZXR0ZXJzOlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ01vZGVsT3B0aW9ucy1kaXJlY3RpdmUtZ2V0dGVyLXNldHRlclwiIG1vZHVsZT1cImdldHRlclNldHRlckV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICAgICAgPGZvcm0gbmFtZT1cInVzZXJGb3JtXCI+XG4gKiAgICAgICAgIDxsYWJlbD5cbiAqICAgICAgICAgICBOYW1lOlxuICogICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJ1c2VyTmFtZVwiXG4gKiAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPVwidXNlci5uYW1lXCJcbiAqICAgICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz1cInsgZ2V0dGVyU2V0dGVyOiB0cnVlIH1cIiAvPlxuICogICAgICAgICA8L2xhYmVsPlxuICogICAgICAgPC9mb3JtPlxuICogICAgICAgPHByZT51c2VyLm5hbWUgPSA8c3BhbiBuZy1iaW5kPVwidXNlci5uYW1lKClcIj48L3NwYW4+PC9wcmU+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgIGFuZ3VsYXIubW9kdWxlKCdnZXR0ZXJTZXR0ZXJFeGFtcGxlJywgW10pXG4gKiAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICogICAgICAgICB2YXIgX25hbWUgPSAnQnJpYW4nO1xuICogICAgICAgICAkc2NvcGUudXNlciA9IHtcbiAqICAgICAgICAgICBuYW1lOiBmdW5jdGlvbihuZXdOYW1lKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4gYW5ndWxhci5pc0RlZmluZWQobmV3TmFtZSkgPyAoX25hbWUgPSBuZXdOYW1lKSA6IF9uYW1lO1xuICogICAgICAgICAgIH1cbiAqICAgICAgICAgfTtcbiAqICAgICAgIH1dKTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqXG4gKiAjIyBTcGVjaWZ5aW5nIHRpbWV6b25lc1xuICpcbiAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgdGltZXpvbmUgdGhhdCBkYXRlL3RpbWUgaW5wdXQgZGlyZWN0aXZlcyBleHBlY3QgYnkgcHJvdmlkaW5nIGl0cyBuYW1lIGluIHRoZVxuICogYHRpbWV6b25lYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbmdNb2RlbE9wdGlvbnMgb3B0aW9ucyB0byBhcHBseSB0byB7QGxpbmsgbmdNb2RlbH0gZGlyZWN0aXZlcyBvbiB0aGlzIGVsZW1lbnQgYW5kXG4gKiAgIGFuZCBpdHMgZGVzY2VuZGVudHMuIFZhbGlkIGtleXMgYXJlOlxuICogICAtIGB1cGRhdGVPbmA6IHN0cmluZyBzcGVjaWZ5aW5nIHdoaWNoIGV2ZW50IHNob3VsZCB0aGUgaW5wdXQgYmUgYm91bmQgdG8uIFlvdSBjYW4gc2V0IHNldmVyYWxcbiAqICAgICBldmVudHMgdXNpbmcgYW4gc3BhY2UgZGVsaW1pdGVkIGxpc3QuIFRoZXJlIGlzIGEgc3BlY2lhbCBldmVudCBjYWxsZWQgYGRlZmF1bHRgIHRoYXRcbiAqICAgICBtYXRjaGVzIHRoZSBkZWZhdWx0IGV2ZW50cyBiZWxvbmdpbmcgdG8gdGhlIGNvbnRyb2wuXG4gKiAgIC0gYGRlYm91bmNlYDogaW50ZWdlciB2YWx1ZSB3aGljaCBjb250YWlucyB0aGUgZGVib3VuY2UgbW9kZWwgdXBkYXRlIHZhbHVlIGluIG1pbGxpc2Vjb25kcy4gQVxuICogICAgIHZhbHVlIG9mIDAgdHJpZ2dlcnMgYW4gaW1tZWRpYXRlIHVwZGF0ZS4gSWYgYW4gb2JqZWN0IGlzIHN1cHBsaWVkIGluc3RlYWQsIHlvdSBjYW4gc3BlY2lmeSBhXG4gKiAgICAgY3VzdG9tIHZhbHVlIGZvciBlYWNoIGV2ZW50LiBGb3IgZXhhbXBsZTpcbiAqICAgICBgYGBcbiAqICAgICBuZy1tb2RlbC1vcHRpb25zPVwie1xuICogICAgICAgdXBkYXRlT246ICdkZWZhdWx0IGJsdXInLFxuICogICAgICAgZGVib3VuY2U6IHsgJ2RlZmF1bHQnOiA1MDAsICdibHVyJzogMCB9XG4gKiAgICAgfVwiXG4gKiAgICAgYGBgXG4gKiAgIC0gYGFsbG93SW52YWxpZGA6IGJvb2xlYW4gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIG1vZGVsIGNhbiBiZSBzZXQgd2l0aCB2YWx1ZXMgdGhhdCBkaWRcbiAqICAgICBub3QgdmFsaWRhdGUgY29ycmVjdGx5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2Ygc2V0dGluZyB0aGUgbW9kZWwgdG8gdW5kZWZpbmVkLlxuICogICAtIGBnZXR0ZXJTZXR0ZXJgOiBib29sZWFuIHZhbHVlIHdoaWNoIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gdHJlYXQgZnVuY3Rpb25zIGJvdW5kIHRvXG4gKiAgICAgYG5nTW9kZWxgIGFzIGdldHRlcnMvc2V0dGVycy5cbiAqICAgLSBgdGltZXpvbmVgOiBEZWZpbmVzIHRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgZm9yXG4gKiAgICAgYDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+YCwgYDxpbnB1dCB0eXBlPVwidGltZVwiIC8+YCwgLi4uIC4gSXQgdW5kZXJzdGFuZHMgVVRDL0dNVCBhbmQgdGhlXG4gKiAgICAgY29udGluZW50YWwgVVMgdGltZSB6b25lIGFiYnJldmlhdGlvbnMsIGJ1dCBmb3IgZ2VuZXJhbCB1c2UsIHVzZSBhIHRpbWUgem9uZSBvZmZzZXQsIGZvclxuICogICAgIGV4YW1wbGUsIGAnKzA0MzAnYCAoNCBob3VycywgMzAgbWludXRlcyBlYXN0IG9mIHRoZSBHcmVlbndpY2ggbWVyaWRpYW4pXG4gKiAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyIHdpbGwgYmUgdXNlZC5cbiAqXG4gKi9cbnZhciBuZ01vZGVsT3B0aW9uc0RpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICBOZ01vZGVsT3B0aW9uc0NvbnRyb2xsZXIuJGluamVjdCA9IFsnJGF0dHJzJywgJyRzY29wZSddO1xuICBmdW5jdGlvbiBOZ01vZGVsT3B0aW9uc0NvbnRyb2xsZXIoJGF0dHJzLCAkc2NvcGUpIHtcbiAgICB0aGlzLiQkYXR0cnMgPSAkYXR0cnM7XG4gICAgdGhpcy4kJHNjb3BlID0gJHNjb3BlO1xuICB9XG4gIE5nTW9kZWxPcHRpb25zQ29udHJvbGxlci5wcm90b3R5cGUgPSB7XG4gICAgJG9uSW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcGFyZW50T3B0aW9ucyA9IHRoaXMucGFyZW50Q3RybCA/IHRoaXMucGFyZW50Q3RybC4kb3B0aW9ucyA6IGRlZmF1bHRNb2RlbE9wdGlvbnM7XG4gICAgICB2YXIgbW9kZWxPcHRpb25zRGVmaW5pdGlvbiA9IHRoaXMuJCRzY29wZS4kZXZhbCh0aGlzLiQkYXR0cnMubmdNb2RlbE9wdGlvbnMpO1xuXG4gICAgICB0aGlzLiRvcHRpb25zID0gcGFyZW50T3B0aW9ucy5jcmVhdGVDaGlsZChtb2RlbE9wdGlvbnNEZWZpbml0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIC8vIG5nTW9kZWxPcHRpb25zIG5lZWRzIHRvIHJ1biBiZWZvcmUgbmdNb2RlbCBhbmQgaW5wdXQgZGlyZWN0aXZlc1xuICAgIHByaW9yaXR5OiAxMCxcbiAgICByZXF1aXJlOiB7cGFyZW50Q3RybDogJz9eXm5nTW9kZWxPcHRpb25zJ30sXG4gICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcbiAgICBjb250cm9sbGVyOiBOZ01vZGVsT3B0aW9uc0NvbnRyb2xsZXJcbiAgfTtcbn07XG5cblxuLy8gc2hhbGxvdyBjb3B5IG92ZXIgdmFsdWVzIGZyb20gYHNyY2AgdGhhdCBhcmUgbm90IGFscmVhZHkgc3BlY2lmaWVkIG9uIGBkc3RgXG5mdW5jdGlvbiBkZWZhdWx0cyhkc3QsIHNyYykge1xuICBmb3JFYWNoKHNyYywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgIGlmICghaXNEZWZpbmVkKGRzdFtrZXldKSkge1xuICAgICAgZHN0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTm9uQmluZGFibGVcbiAqIEByZXN0cmljdCBBQ1xuICogQHByaW9yaXR5IDEwMDBcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdOb25CaW5kYWJsZWAgZGlyZWN0aXZlIHRlbGxzIEFuZ3VsYXIgbm90IHRvIGNvbXBpbGUgb3IgYmluZCB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRcbiAqIERPTSBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgZWxlbWVudCBjb250YWlucyB3aGF0IGFwcGVhcnMgdG8gYmUgQW5ndWxhciBkaXJlY3RpdmVzIGFuZFxuICogYmluZGluZ3MgYnV0IHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIGJ5IEFuZ3VsYXIuIFRoaXMgY291bGQgYmUgdGhlIGNhc2UgaWYgeW91IGhhdmUgYSBzaXRlIHRoYXRcbiAqIGRpc3BsYXlzIHNuaXBwZXRzIG9mIGNvZGUsIGZvciBpbnN0YW5jZS5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqXG4gKiBAZXhhbXBsZVxuICogSW4gdGhpcyBleGFtcGxlIHRoZXJlIGFyZSB0d28gbG9jYXRpb25zIHdoZXJlIGEgc2ltcGxlIGludGVycG9sYXRpb24gYmluZGluZyAoYHt7fX1gKSBpcyBwcmVzZW50LFxuICogYnV0IHRoZSBvbmUgd3JhcHBlZCBpbiBgbmdOb25CaW5kYWJsZWAgaXMgbGVmdCBhbG9uZS5cbiAqXG4gKiBAZXhhbXBsZVxuICAgIDxleGFtcGxlIG5hbWU9XCJuZy1ub24tYmluZGFibGVcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxkaXY+Tm9ybWFsOiB7ezEgKyAyfX08L2Rpdj5cbiAgICAgICAgPGRpdiBuZy1ub24tYmluZGFibGU+SWdub3JlZDoge3sxICsgMn19PC9kaXY+XG4gICAgICA8L2ZpbGU+XG4gICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1ub24tYmluZGFibGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJzEgKyAyJykpLmdldFRleHQoKSkudG9Db250YWluKCczJyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCdkaXYnKSkubGFzdCgpLmdldFRleHQoKSkudG9NYXRjaCgvMSBcXCsgMi8pO1xuICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nTm9uQmluZGFibGVEaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7IHRlcm1pbmFsOiB0cnVlLCBwcmlvcml0eTogMTAwMCB9KTtcblxuLyogZXhwb3J0ZWQgbmdPcHRpb25zRGlyZWN0aXZlICovXG5cbi8qIGdsb2JhbCBqcUxpdGVSZW1vdmUgKi9cblxudmFyIG5nT3B0aW9uc01pbkVyciA9IG1pbkVycignbmdPcHRpb25zJyk7XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdPcHRpb25zXG4gKiBAcmVzdHJpY3QgQVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoZSBgbmdPcHRpb25zYCBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgYSBsaXN0IG9mIGA8b3B0aW9uPmBcbiAqIGVsZW1lbnRzIGZvciB0aGUgYDxzZWxlY3Q+YCBlbGVtZW50IHVzaW5nIHRoZSBhcnJheSBvciBvYmplY3Qgb2J0YWluZWQgYnkgZXZhbHVhdGluZyB0aGVcbiAqIGBuZ09wdGlvbnNgIGNvbXByZWhlbnNpb24gZXhwcmVzc2lvbi5cbiAqXG4gKiBJbiBtYW55IGNhc2VzLCB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IG5nUmVwZWF0fSBjYW4gYmUgdXNlZCBvbiBgPG9wdGlvbj5gIGVsZW1lbnRzIGluc3RlYWQgb2ZcbiAqIGBuZ09wdGlvbnNgIHRvIGFjaGlldmUgYSBzaW1pbGFyIHJlc3VsdC4gSG93ZXZlciwgYG5nT3B0aW9uc2AgcHJvdmlkZXMgc29tZSBiZW5lZml0czpcbiAqIC0gbW9yZSBmbGV4aWJpbGl0eSBpbiBob3cgdGhlIGA8c2VsZWN0PmAncyBtb2RlbCBpcyBhc3NpZ25lZCB2aWEgdGhlIGBzZWxlY3RgICoqYGFzYCoqIHBhcnQgb2YgdGhlXG4gKiBjb21wcmVoZW5zaW9uIGV4cHJlc3Npb25cbiAqIC0gcmVkdWNlZCBtZW1vcnkgY29uc3VtcHRpb24gYnkgbm90IGNyZWF0aW5nIGEgbmV3IHNjb3BlIGZvciBlYWNoIHJlcGVhdGVkIGluc3RhbmNlXG4gKiAtIGluY3JlYXNlZCByZW5kZXIgc3BlZWQgYnkgY3JlYXRpbmcgdGhlIG9wdGlvbnMgaW4gYSBkb2N1bWVudEZyYWdtZW50IGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5XG4gKlxuICogV2hlbiBhbiBpdGVtIGluIHRoZSBgPHNlbGVjdD5gIG1lbnUgaXMgc2VsZWN0ZWQsIHRoZSBhcnJheSBlbGVtZW50IG9yIG9iamVjdCBwcm9wZXJ0eVxuICogcmVwcmVzZW50ZWQgYnkgdGhlIHNlbGVjdGVkIG9wdGlvbiB3aWxsIGJlIGJvdW5kIHRvIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IHRoZSBgbmdNb2RlbGBcbiAqIGRpcmVjdGl2ZS5cbiAqXG4gKiBPcHRpb25hbGx5LCBhIHNpbmdsZSBoYXJkLWNvZGVkIGA8b3B0aW9uPmAgZWxlbWVudCwgd2l0aCB0aGUgdmFsdWUgc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgY2FuXG4gKiBiZSBuZXN0ZWQgaW50byB0aGUgYDxzZWxlY3Q+YCBlbGVtZW50LiBUaGlzIGVsZW1lbnQgd2lsbCB0aGVuIHJlcHJlc2VudCB0aGUgYG51bGxgIG9yIFwibm90IHNlbGVjdGVkXCJcbiAqIG9wdGlvbi4gU2VlIGV4YW1wbGUgYmVsb3cgZm9yIGRlbW9uc3RyYXRpb24uXG4gKlxuICogIyMgQ29tcGxleCBNb2RlbHMgKG9iamVjdHMgb3IgY29sbGVjdGlvbnMpXG4gKlxuICogQnkgZGVmYXVsdCwgYG5nTW9kZWxgIHdhdGNoZXMgdGhlIG1vZGVsIGJ5IHJlZmVyZW5jZSwgbm90IHZhbHVlLiBUaGlzIGlzIGltcG9ydGFudCB0byBrbm93IHdoZW5cbiAqIGJpbmRpbmcgdGhlIHNlbGVjdCB0byBhIG1vZGVsIHRoYXQgaXMgYW4gb2JqZWN0IG9yIGEgY29sbGVjdGlvbi5cbiAqXG4gKiBPbmUgaXNzdWUgb2NjdXJzIGlmIHlvdSB3YW50IHRvIHByZXNlbGVjdCBhbiBvcHRpb24uIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0XG4gKiB0aGUgbW9kZWwgdG8gYW4gb2JqZWN0IHRoYXQgaXMgZXF1YWwgdG8gYW4gb2JqZWN0IGluIHlvdXIgY29sbGVjdGlvbiwgYG5nT3B0aW9uc2Agd29uJ3QgYmUgYWJsZSB0byBzZXQgdGhlIHNlbGVjdGlvbixcbiAqIGJlY2F1c2UgdGhlIG9iamVjdHMgYXJlIG5vdCBpZGVudGljYWwuIFNvIGJ5IGRlZmF1bHQsIHlvdSBzaG91bGQgYWx3YXlzIHJlZmVyZW5jZSB0aGUgaXRlbSBpbiB5b3VyIGNvbGxlY3Rpb25cbiAqIGZvciBwcmVzZWxlY3Rpb25zLCBlLmcuOiBgJHNjb3BlLnNlbGVjdGVkID0gJHNjb3BlLmNvbGxlY3Rpb25bM11gLlxuICpcbiAqIEFub3RoZXIgc29sdXRpb24gaXMgdG8gdXNlIGEgYHRyYWNrIGJ5YCBjbGF1c2UsIGJlY2F1c2UgdGhlbiBgbmdPcHRpb25zYCB3aWxsIHRyYWNrIHRoZSBpZGVudGl0eVxuICogb2YgdGhlIGl0ZW0gbm90IGJ5IHJlZmVyZW5jZSwgYnV0IGJ5IHRoZSByZXN1bHQgb2YgdGhlIGB0cmFjayBieWAgZXhwcmVzc2lvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdXJcbiAqIGNvbGxlY3Rpb24gaXRlbXMgaGF2ZSBhbiBpZCBwcm9wZXJ0eSwgeW91IHdvdWxkIGB0cmFjayBieSBpdGVtLmlkYC5cbiAqXG4gKiBBIGRpZmZlcmVudCBpc3N1ZSB3aXRoIG9iamVjdHMgb3IgY29sbGVjdGlvbnMgaXMgdGhhdCBuZ01vZGVsIHdvbid0IGRldGVjdCBpZiBhbiBvYmplY3QgcHJvcGVydHkgb3JcbiAqIGEgY29sbGVjdGlvbiBpdGVtIGNoYW5nZXMuIEZvciB0aGF0IHJlYXNvbiwgYG5nT3B0aW9uc2AgYWRkaXRpb25hbGx5IHdhdGNoZXMgdGhlIG1vZGVsIHVzaW5nXG4gKiBgJHdhdGNoQ29sbGVjdGlvbmAsIHdoZW4gdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYSBgdHJhY2sgYnlgIGNsYXVzZSBvciB0aGUgdGhlIHNlbGVjdCBoYXMgdGhlIGBtdWx0aXBsZWAgYXR0cmlidXRlLlxuICogVGhpcyBhbGxvd3MgbmdPcHRpb25zIHRvIHRyaWdnZXIgYSByZS1yZW5kZXJpbmcgb2YgdGhlIG9wdGlvbnMgZXZlbiBpZiB0aGUgYWN0dWFsIG9iamVjdC9jb2xsZWN0aW9uXG4gKiBoYXMgbm90IGNoYW5nZWQgaWRlbnRpdHksIGJ1dCBvbmx5IGEgcHJvcGVydHkgb24gdGhlIG9iamVjdCBvciBhbiBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGNoYW5nZXMuXG4gKlxuICogTm90ZSB0aGF0IGAkd2F0Y2hDb2xsZWN0aW9uYCBkb2VzIGEgc2hhbGxvdyBjb21wYXJpc29uIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgKG9yIHRoZSBpdGVtcyBpbiB0aGUgY29sbGVjdGlvblxuICogaWYgdGhlIG1vZGVsIGlzIGFuIGFycmF5KS4gVGhpcyBtZWFucyB0aGF0IGNoYW5naW5nIGEgcHJvcGVydHkgZGVlcGVyIHRoYW4gdGhlIGZpcnN0IGxldmVsIGluc2lkZSB0aGVcbiAqIG9iamVjdC9jb2xsZWN0aW9uIHdpbGwgbm90IHRyaWdnZXIgYSByZS1yZW5kZXJpbmcuXG4gKlxuICogIyMgYHNlbGVjdGAgKipgYXNgKipcbiAqXG4gKiBVc2luZyBgc2VsZWN0YCAqKmBhc2AqKiB3aWxsIGJpbmQgdGhlIHJlc3VsdCBvZiB0aGUgYHNlbGVjdGAgZXhwcmVzc2lvbiB0byB0aGUgbW9kZWwsIGJ1dFxuICogdGhlIHZhbHVlIG9mIHRoZSBgPHNlbGVjdD5gIGFuZCBgPG9wdGlvbj5gIGh0bWwgZWxlbWVudHMgd2lsbCBiZSBlaXRoZXIgdGhlIGluZGV4IChmb3IgYXJyYXkgZGF0YSBzb3VyY2VzKVxuICogb3IgcHJvcGVydHkgbmFtZSAoZm9yIG9iamVjdCBkYXRhIHNvdXJjZXMpIG9mIHRoZSB2YWx1ZSB3aXRoaW4gdGhlIGNvbGxlY3Rpb24uIElmIGEgKipgdHJhY2sgYnlgKiogZXhwcmVzc2lvblxuICogaXMgdXNlZCwgdGhlIHJlc3VsdCBvZiB0aGF0IGV4cHJlc3Npb24gd2lsbCBiZSBzZXQgYXMgdGhlIHZhbHVlIG9mIHRoZSBgb3B0aW9uYCBhbmQgYHNlbGVjdGAgZWxlbWVudHMuXG4gKlxuICpcbiAqICMjIyBgc2VsZWN0YCAqKmBhc2AqKiBhbmQgKipgdHJhY2sgYnlgKipcbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogQmUgY2FyZWZ1bCB3aGVuIHVzaW5nIGBzZWxlY3RgICoqYGFzYCoqIGFuZCAqKmB0cmFjayBieWAqKiBpbiB0aGUgc2FtZSBleHByZXNzaW9uLlxuICogPC9kaXY+XG4gKlxuICogR2l2ZW4gdGhpcyBhcnJheSBvZiBpdGVtcyBvbiB0aGUgJHNjb3BlOlxuICpcbiAqIGBgYGpzXG4gKiAkc2NvcGUuaXRlbXMgPSBbe1xuICogICBpZDogMSxcbiAqICAgbGFiZWw6ICdhTGFiZWwnLFxuICogICBzdWJJdGVtOiB7IG5hbWU6ICdhU3ViSXRlbScgfVxuICogfSwge1xuICogICBpZDogMixcbiAqICAgbGFiZWw6ICdiTGFiZWwnLFxuICogICBzdWJJdGVtOiB7IG5hbWU6ICdiU3ViSXRlbScgfVxuICogfV07XG4gKiBgYGBcbiAqXG4gKiBUaGlzIHdpbGwgd29yazpcbiAqXG4gKiBgYGBodG1sXG4gKiA8c2VsZWN0IG5nLW9wdGlvbnM9XCJpdGVtIGFzIGl0ZW0ubGFiZWwgZm9yIGl0ZW0gaW4gaXRlbXMgdHJhY2sgYnkgaXRlbS5pZFwiIG5nLW1vZGVsPVwic2VsZWN0ZWRcIj48L3NlbGVjdD5cbiAqIGBgYFxuICogYGBganNcbiAqICRzY29wZS5zZWxlY3RlZCA9ICRzY29wZS5pdGVtc1swXTtcbiAqIGBgYFxuICpcbiAqIGJ1dCB0aGlzIHdpbGwgbm90IHdvcms6XG4gKlxuICogYGBgaHRtbFxuICogPHNlbGVjdCBuZy1vcHRpb25zPVwiaXRlbS5zdWJJdGVtIGFzIGl0ZW0ubGFiZWwgZm9yIGl0ZW0gaW4gaXRlbXMgdHJhY2sgYnkgaXRlbS5pZFwiIG5nLW1vZGVsPVwic2VsZWN0ZWRcIj48L3NlbGVjdD5cbiAqIGBgYFxuICogYGBganNcbiAqICRzY29wZS5zZWxlY3RlZCA9ICRzY29wZS5pdGVtc1swXS5zdWJJdGVtO1xuICogYGBgXG4gKlxuICogSW4gYm90aCBleGFtcGxlcywgdGhlICoqYHRyYWNrIGJ5YCoqIGV4cHJlc3Npb24gaXMgYXBwbGllZCBzdWNjZXNzZnVsbHkgdG8gZWFjaCBgaXRlbWAgaW4gdGhlXG4gKiBgaXRlbXNgIGFycmF5LiBCZWNhdXNlIHRoZSBzZWxlY3RlZCBvcHRpb24gaGFzIGJlZW4gc2V0IHByb2dyYW1tYXRpY2FsbHkgaW4gdGhlIGNvbnRyb2xsZXIsIHRoZVxuICogKipgdHJhY2sgYnlgKiogZXhwcmVzc2lvbiBpcyBhbHNvIGFwcGxpZWQgdG8gdGhlIGBuZ01vZGVsYCB2YWx1ZS4gSW4gdGhlIGZpcnN0IGV4YW1wbGUsIHRoZVxuICogYG5nTW9kZWxgIHZhbHVlIGlzIGBpdGVtc1swXWAgYW5kIHRoZSAqKmB0cmFjayBieWAqKiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBgaXRlbXNbMF0uaWRgIHdpdGhcbiAqIG5vIGlzc3VlLiBJbiB0aGUgc2Vjb25kIGV4YW1wbGUsIHRoZSBgbmdNb2RlbGAgdmFsdWUgaXMgYGl0ZW1zWzBdLnN1Ykl0ZW1gIGFuZCB0aGUgKipgdHJhY2sgYnlgKipcbiAqIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGBpdGVtc1swXS5zdWJJdGVtLmlkYCAod2hpY2ggaXMgdW5kZWZpbmVkKS4gQXMgYSByZXN1bHQsIHRoZSBtb2RlbCB2YWx1ZVxuICogaXMgbm90IG1hdGNoZWQgYWdhaW5zdCBhbnkgYDxvcHRpb24+YCBhbmQgdGhlIGA8c2VsZWN0PmAgYXBwZWFycyBhcyBoYXZpbmcgbm8gc2VsZWN0ZWQgdmFsdWUuXG4gKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgVGhlIGNvbnRyb2wgaXMgY29uc2lkZXJlZCB2YWxpZCBvbmx5IGlmIHZhbHVlIGlzIGVudGVyZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG9cbiAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7Y29tcHJlaGVuc2lvbl9leHByZXNzaW9uPX0gbmdPcHRpb25zIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOlxuICpcbiAqICAgKiBmb3IgYXJyYXkgZGF0YSBzb3VyY2VzOlxuICogICAgICogYGxhYmVsYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgXG4gKiAgICAgKiBgc2VsZWN0YCAqKmBhc2AqKiBgbGFiZWxgICoqYGZvcmAqKiBgdmFsdWVgICoqYGluYCoqIGBhcnJheWBcbiAqICAgICAqIGBsYWJlbGAgKipgZ3JvdXAgYnlgKiogYGdyb3VwYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgXG4gKiAgICAgKiBgbGFiZWxgICoqYGRpc2FibGUgd2hlbmAqKiBgZGlzYWJsZWAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YFxuICogICAgICogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgICoqYGZvcmAqKiBgdmFsdWVgICoqYGluYCoqIGBhcnJheWAgKipgdHJhY2sgYnlgKiogYHRyYWNrZXhwcmBcbiAqICAgICAqIGBsYWJlbGAgKipgZGlzYWJsZSB3aGVuYCoqIGBkaXNhYmxlYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgICoqYHRyYWNrIGJ5YCoqIGB0cmFja2V4cHJgXG4gKiAgICAgKiBgbGFiZWxgICoqYGZvcmAqKiBgdmFsdWVgICoqYGluYCoqIGBhcnJheWAgfCBvcmRlckJ5OmBvcmRlcmV4cHJgICoqYHRyYWNrIGJ5YCoqIGB0cmFja2V4cHJgXG4gKiAgICAgICAgKGZvciBpbmNsdWRpbmcgYSBmaWx0ZXIgd2l0aCBgdHJhY2sgYnlgKVxuICogICAqIGZvciBvYmplY3QgZGF0YSBzb3VyY2VzOlxuICogICAgICogYGxhYmVsYCAqKmBmb3IgKGAqKmBrZXlgICoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGBcbiAqICAgICAqIGBzZWxlY3RgICoqYGFzYCoqIGBsYWJlbGAgKipgZm9yIChgKipga2V5YCAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgXG4gKiAgICAgKiBgbGFiZWxgICoqYGdyb3VwIGJ5YCoqIGBncm91cGAgKipgZm9yIChgKipga2V5YCoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGBcbiAqICAgICAqIGBsYWJlbGAgKipgZGlzYWJsZSB3aGVuYCoqIGBkaXNhYmxlYCAqKmBmb3IgKGAqKmBrZXlgKipgLGAqKiBgdmFsdWVgKipgKSBpbmAqKiBgb2JqZWN0YFxuICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgXG4gKiAgICAgICAgICoqYGZvcmAgYChgKipga2V5YCoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGBcbiAqICAgICAqIGBzZWxlY3RgICoqYGFzYCoqIGBsYWJlbGAgKipgZGlzYWJsZSB3aGVuYCoqIGBkaXNhYmxlYFxuICogICAgICAgICAqKmBmb3JgIGAoYCoqYGtleWAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgXG4gKlxuICogV2hlcmU6XG4gKlxuICogICAqIGBhcnJheWAgLyBgb2JqZWN0YDogYW4gZXhwcmVzc2lvbiB3aGljaCBldmFsdWF0ZXMgdG8gYW4gYXJyYXkgLyBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogICAqIGB2YWx1ZWA6IGxvY2FsIHZhcmlhYmxlIHdoaWNoIHdpbGwgcmVmZXIgdG8gZWFjaCBpdGVtIGluIHRoZSBgYXJyYXlgIG9yIGVhY2ggcHJvcGVydHkgdmFsdWVcbiAqICAgICAgb2YgYG9iamVjdGAgZHVyaW5nIGl0ZXJhdGlvbi5cbiAqICAgKiBga2V5YDogbG9jYWwgdmFyaWFibGUgd2hpY2ggd2lsbCByZWZlciB0byBhIHByb3BlcnR5IG5hbWUgaW4gYG9iamVjdGAgZHVyaW5nIGl0ZXJhdGlvbi5cbiAqICAgKiBgbGFiZWxgOiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIHRoZSBsYWJlbCBmb3IgYDxvcHRpb24+YCBlbGVtZW50LiBUaGVcbiAqICAgICBgZXhwcmVzc2lvbmAgd2lsbCBtb3N0IGxpa2VseSByZWZlciB0byB0aGUgYHZhbHVlYCB2YXJpYWJsZSAoZS5nLiBgdmFsdWUucHJvcGVydHlOYW1lYCkuXG4gKiAgICogYHNlbGVjdGA6IFRoZSByZXN1bHQgb2YgdGhpcyBleHByZXNzaW9uIHdpbGwgYmUgYm91bmQgdG8gdGhlIG1vZGVsIG9mIHRoZSBwYXJlbnQgYDxzZWxlY3Q+YFxuICogICAgICBlbGVtZW50LiBJZiBub3Qgc3BlY2lmaWVkLCBgc2VsZWN0YCBleHByZXNzaW9uIHdpbGwgZGVmYXVsdCB0byBgdmFsdWVgLlxuICogICAqIGBncm91cGA6IFRoZSByZXN1bHQgb2YgdGhpcyBleHByZXNzaW9uIHdpbGwgYmUgdXNlZCB0byBncm91cCBvcHRpb25zIHVzaW5nIHRoZSBgPG9wdGdyb3VwPmBcbiAqICAgICAgRE9NIGVsZW1lbnQuXG4gKiAgICogYGRpc2FibGVgOiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGUgcmVuZGVyZWQgYDxvcHRpb24+YFxuICogICAgICBlbGVtZW50LiBSZXR1cm4gYHRydWVgIHRvIGRpc2FibGUuXG4gKiAgICogYHRyYWNrZXhwcmA6IFVzZWQgd2hlbiB3b3JraW5nIHdpdGggYW4gYXJyYXkgb2Ygb2JqZWN0cy4gVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZVxuICogICAgICB1c2VkIHRvIGlkZW50aWZ5IHRoZSBvYmplY3RzIGluIHRoZSBhcnJheS4gVGhlIGB0cmFja2V4cHJgIHdpbGwgbW9zdCBsaWtlbHkgcmVmZXIgdG8gdGhlXG4gKiAgICAgYHZhbHVlYCB2YXJpYWJsZSAoZS5nLiBgdmFsdWUucHJvcGVydHlOYW1lYCkuIFdpdGggdGhpcyB0aGUgc2VsZWN0aW9uIGlzIHByZXNlcnZlZFxuICogICAgICBldmVuIHdoZW4gdGhlIG9wdGlvbnMgYXJlIHJlY3JlYXRlZCAoZS5nLiByZWxvYWRlZCBmcm9tIHRoZSBzZXJ2ZXIpLlxuICpcbiAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbW9kdWxlPVwic2VsZWN0RXhhbXBsZVwiIG5hbWU9XCJzZWxlY3RcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxzY3JpcHQ+XG4gICAgICAgIGFuZ3VsYXIubW9kdWxlKCdzZWxlY3RFeGFtcGxlJywgW10pXG4gICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICRzY29wZS5jb2xvcnMgPSBbXG4gICAgICAgICAgICAgIHtuYW1lOidibGFjaycsIHNoYWRlOidkYXJrJ30sXG4gICAgICAgICAgICAgIHtuYW1lOid3aGl0ZScsIHNoYWRlOidsaWdodCcsIG5vdEFuT3B0aW9uOiB0cnVlfSxcbiAgICAgICAgICAgICAge25hbWU6J3JlZCcsIHNoYWRlOidkYXJrJ30sXG4gICAgICAgICAgICAgIHtuYW1lOidibHVlJywgc2hhZGU6J2RhcmsnLCBub3RBbk9wdGlvbjogdHJ1ZX0sXG4gICAgICAgICAgICAgIHtuYW1lOid5ZWxsb3cnLCBzaGFkZTonbGlnaHQnLCBub3RBbk9wdGlvbjogZmFsc2V9XG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgJHNjb3BlLm15Q29sb3IgPSAkc2NvcGUuY29sb3JzWzJdOyAvLyByZWRcbiAgICAgICAgICB9XSk7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9XCJjb2xvciBpbiBjb2xvcnNcIj5cbiAgICAgICAgICAgICAgPGxhYmVsPk5hbWU6IDxpbnB1dCBuZy1tb2RlbD1cImNvbG9yLm5hbWVcIj48L2xhYmVsPlxuICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwiY29sb3Iubm90QW5PcHRpb25cIj4gRGlzYWJsZWQ/PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImNvbG9ycy5zcGxpY2UoJGluZGV4LCAxKVwiIGFyaWEtbGFiZWw9XCJSZW1vdmVcIj5YPC9idXR0b24+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiY29sb3JzLnB1c2goe30pXCI+YWRkPC9idXR0b24+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPGhyLz5cbiAgICAgICAgICA8bGFiZWw+Q29sb3IgKG51bGwgbm90IGFsbG93ZWQpOlxuICAgICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD1cIm15Q29sb3JcIiBuZy1vcHRpb25zPVwiY29sb3IubmFtZSBmb3IgY29sb3IgaW4gY29sb3JzXCI+PC9zZWxlY3Q+XG4gICAgICAgICAgPC9sYWJlbD48YnIvPlxuICAgICAgICAgIDxsYWJlbD5Db2xvciAobnVsbCBhbGxvd2VkKTpcbiAgICAgICAgICA8c3BhbiAgY2xhc3M9XCJudWxsYWJsZVwiPlxuICAgICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD1cIm15Q29sb3JcIiBuZy1vcHRpb25zPVwiY29sb3IubmFtZSBmb3IgY29sb3IgaW4gY29sb3JzXCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBjaG9vc2UgY29sb3IgLS08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvc3Bhbj48L2xhYmVsPjxici8+XG5cbiAgICAgICAgICA8bGFiZWw+Q29sb3IgZ3JvdXBlZCBieSBzaGFkZTpcbiAgICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9XCJteUNvbG9yXCIgbmctb3B0aW9ucz1cImNvbG9yLm5hbWUgZ3JvdXAgYnkgY29sb3Iuc2hhZGUgZm9yIGNvbG9yIGluIGNvbG9yc1wiPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9sYWJlbD48YnIvPlxuXG4gICAgICAgICAgPGxhYmVsPkNvbG9yIGdyb3VwZWQgYnkgc2hhZGUsIHdpdGggc29tZSBkaXNhYmxlZDpcbiAgICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9XCJteUNvbG9yXCJcbiAgICAgICAgICAgICAgICAgIG5nLW9wdGlvbnM9XCJjb2xvci5uYW1lIGdyb3VwIGJ5IGNvbG9yLnNoYWRlIGRpc2FibGUgd2hlbiBjb2xvci5ub3RBbk9wdGlvbiBmb3IgY29sb3IgaW4gY29sb3JzXCI+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2xhYmVsPjxici8+XG5cblxuXG4gICAgICAgICAgU2VsZWN0IDxidXR0b24gbmctY2xpY2s9XCJteUNvbG9yID0geyBuYW1lOidub3QgaW4gbGlzdCcsIHNoYWRlOiAnb3RoZXInIH1cIj5ib2d1czwvYnV0dG9uPi5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICAgIDxoci8+XG4gICAgICAgICAgQ3VycmVudGx5IHNlbGVjdGVkOiB7eyB7c2VsZWN0ZWRfY29sb3I6bXlDb2xvcn0gfX1cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiYm9yZGVyOnNvbGlkIDFweCBibGFjazsgaGVpZ2h0OjIwcHhcIlxuICAgICAgICAgICAgICAgbmctc3R5bGU9XCJ7J2JhY2tncm91bmQtY29sb3InOm15Q29sb3IubmFtZX1cIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2ZpbGU+XG4gICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLW9wdGlvbnMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygne3NlbGVjdGVkX2NvbG9yOm15Q29sb3J9JykpLmdldFRleHQoKSkudG9NYXRjaCgncmVkJyk7XG4gICAgICAgICAgIGVsZW1lbnQuYWxsKGJ5Lm1vZGVsKCdteUNvbG9yJykpLmZpcnN0KCkuY2xpY2soKTtcbiAgICAgICAgICAgZWxlbWVudC5hbGwoYnkuY3NzKCdzZWxlY3RbbmctbW9kZWw9XCJteUNvbG9yXCJdIG9wdGlvbicpKS5maXJzdCgpLmNsaWNrKCk7XG4gICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3tzZWxlY3RlZF9jb2xvcjpteUNvbG9yfScpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJ2JsYWNrJyk7XG4gICAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCcubnVsbGFibGUgc2VsZWN0W25nLW1vZGVsPVwibXlDb2xvclwiXScpKS5jbGljaygpO1xuICAgICAgICAgICBlbGVtZW50LmFsbChieS5jc3MoJy5udWxsYWJsZSBzZWxlY3RbbmctbW9kZWw9XCJteUNvbG9yXCJdIG9wdGlvbicpKS5maXJzdCgpLmNsaWNrKCk7XG4gICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3tzZWxlY3RlZF9jb2xvcjpteUNvbG9yfScpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJ251bGwnKTtcbiAgICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4vLyAgICAgICAgICAgICAgICAgICAgIC8vMDAwMDExMTExMTExMTEwMDAwMDAwMDAwMDIyMjIyMjIyMjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMzMzMzMzMzMzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ0NDQ0NDQ0NDQ0MDAwMDAwMDAwMDAwMDU1NTU1NTU1NTU1NTUwMDAwMDAwMDA2NjY2NjY2NjY2NjY2MDAwMDAwMDc3Nzc3Nzc3Nzc3NzcwMDAwMDAwMDAwMDAwMDA4ODg4ODg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDk5OTk5OTk5OTlcbnZhciBOR19PUFRJT05TX1JFR0VYUCA9IC9eXFxzKihbXFxzXFxTXSs/KSg/Olxccythc1xccysoW1xcc1xcU10rPykpPyg/Olxccytncm91cFxccytieVxccysoW1xcc1xcU10rPykpPyg/OlxccytkaXNhYmxlXFxzK3doZW5cXHMrKFtcXHNcXFNdKz8pKT9cXHMrZm9yXFxzKyg/OihbJFxcd11bJFxcd10qKXwoPzpcXChcXHMqKFskXFx3XVskXFx3XSopXFxzKixcXHMqKFskXFx3XVskXFx3XSopXFxzKlxcKSkpXFxzK2luXFxzKyhbXFxzXFxTXSs/KSg/Olxccyt0cmFja1xccytieVxccysoW1xcc1xcU10rPykpPyQvO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogdmFsdWUgZXhwcmVzc2lvbiAodmFsdWVGbilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI6IGxhYmVsIGV4cHJlc3Npb24gKGRpc3BsYXlGbilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDM6IGdyb3VwIGJ5IGV4cHJlc3Npb24gKGdyb3VwQnlGbilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQ6IGRpc2FibGUgd2hlbiBleHByZXNzaW9uIChkaXNhYmxlV2hlbkZuKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gNTogYXJyYXkgaXRlbSB2YXJpYWJsZSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA2OiBvYmplY3QgaXRlbSBrZXkgdmFyaWFibGUgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gNzogb2JqZWN0IGl0ZW0gdmFsdWUgdmFyaWFibGUgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gODogY29sbGVjdGlvbiBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA5OiB0cmFjayBieSBleHByZXNzaW9uXG4vKiBlc2xpbnQtZW5hYmxlICovXG5cblxudmFyIG5nT3B0aW9uc0RpcmVjdGl2ZSA9IFsnJGNvbXBpbGUnLCAnJGRvY3VtZW50JywgJyRwYXJzZScsIGZ1bmN0aW9uKCRjb21waWxlLCAkZG9jdW1lbnQsICRwYXJzZSkge1xuXG4gIGZ1bmN0aW9uIHBhcnNlT3B0aW9uc0V4cHJlc3Npb24ob3B0aW9uc0V4cCwgc2VsZWN0RWxlbWVudCwgc2NvcGUpIHtcblxuICAgIHZhciBtYXRjaCA9IG9wdGlvbnNFeHAubWF0Y2goTkdfT1BUSU9OU19SRUdFWFApO1xuICAgIGlmICghKG1hdGNoKSkge1xuICAgICAgdGhyb3cgbmdPcHRpb25zTWluRXJyKCdpZXhwJyxcbiAgICAgICAgJ0V4cGVjdGVkIGV4cHJlc3Npb24gaW4gZm9ybSBvZiAnICtcbiAgICAgICAgJ1xcJ19zZWxlY3RfIChhcyBfbGFiZWxfKT8gZm9yIChfa2V5XywpP192YWx1ZV8gaW4gX2NvbGxlY3Rpb25fXFwnJyArXG4gICAgICAgICcgYnV0IGdvdCBcXCd7MH1cXCcuIEVsZW1lbnQ6IHsxfScsXG4gICAgICAgIG9wdGlvbnNFeHAsIHN0YXJ0aW5nVGFnKHNlbGVjdEVsZW1lbnQpKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBwYXJ0cyBmcm9tIHRoZSBuZ09wdGlvbnMgZXhwcmVzc2lvblxuXG4gICAgLy8gVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvblxuICAgIHZhciB2YWx1ZU5hbWUgPSBtYXRjaFs1XSB8fCBtYXRjaFs3XTtcbiAgICAvLyBUaGUgdmFyaWFibGUgbmFtZSBmb3IgdGhlIGtleSBvZiB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvblxuICAgIHZhciBrZXlOYW1lID0gbWF0Y2hbNl07XG5cbiAgICAvLyBBbiBleHByZXNzaW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSB2aWV3VmFsdWUgZm9yIGFuIG9wdGlvbiBpZiB0aGVyZSBpcyBhIGxhYmVsIGV4cHJlc3Npb25cbiAgICB2YXIgc2VsZWN0QXMgPSAvIGFzIC8udGVzdChtYXRjaFswXSkgJiYgbWF0Y2hbMV07XG4gICAgLy8gQW4gZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgdGhlIGlkIG9mIGVhY2ggb2JqZWN0IGluIHRoZSBvcHRpb25zIGNvbGxlY3Rpb25cbiAgICB2YXIgdHJhY2tCeSA9IG1hdGNoWzldO1xuICAgIC8vIEFuIGV4cHJlc3Npb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHZpZXdWYWx1ZSBmb3IgYW4gb3B0aW9uIGlmIHRoZXJlIGlzIG5vIGxhYmVsIGV4cHJlc3Npb25cbiAgICB2YXIgdmFsdWVGbiA9ICRwYXJzZShtYXRjaFsyXSA/IG1hdGNoWzFdIDogdmFsdWVOYW1lKTtcbiAgICB2YXIgc2VsZWN0QXNGbiA9IHNlbGVjdEFzICYmICRwYXJzZShzZWxlY3RBcyk7XG4gICAgdmFyIHZpZXdWYWx1ZUZuID0gc2VsZWN0QXNGbiB8fCB2YWx1ZUZuO1xuICAgIHZhciB0cmFja0J5Rm4gPSB0cmFja0J5ICYmICRwYXJzZSh0cmFja0J5KTtcblxuICAgIC8vIEdldCB0aGUgdmFsdWUgYnkgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHRyYWNrIHRoZSBvcHRpb25cbiAgICAvLyBpZiB3ZSBoYXZlIGEgdHJhY2tGbiB0aGVuIHVzZSB0aGF0IChwYXNzaW5nIHNjb3BlIGFuZCBsb2NhbHMpXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgaGFzaCB0aGUgZ2l2ZW4gdmlld1ZhbHVlXG4gICAgdmFyIGdldFRyYWNrQnlWYWx1ZUZuID0gdHJhY2tCeSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2YWx1ZSwgbG9jYWxzKSB7IHJldHVybiB0cmFja0J5Rm4oc2NvcGUsIGxvY2Fscyk7IH0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0SGFzaE9mVmFsdWUodmFsdWUpIHsgcmV0dXJuIGhhc2hLZXkodmFsdWUpOyB9O1xuICAgIHZhciBnZXRUcmFja0J5VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm4gZ2V0VHJhY2tCeVZhbHVlRm4odmFsdWUsIGdldExvY2Fscyh2YWx1ZSwga2V5KSk7XG4gICAgfTtcblxuICAgIHZhciBkaXNwbGF5Rm4gPSAkcGFyc2UobWF0Y2hbMl0gfHwgbWF0Y2hbMV0pO1xuICAgIHZhciBncm91cEJ5Rm4gPSAkcGFyc2UobWF0Y2hbM10gfHwgJycpO1xuICAgIHZhciBkaXNhYmxlV2hlbkZuID0gJHBhcnNlKG1hdGNoWzRdIHx8ICcnKTtcbiAgICB2YXIgdmFsdWVzRm4gPSAkcGFyc2UobWF0Y2hbOF0pO1xuXG4gICAgdmFyIGxvY2FscyA9IHt9O1xuICAgIHZhciBnZXRMb2NhbHMgPSBrZXlOYW1lID8gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgbG9jYWxzW2tleU5hbWVdID0ga2V5O1xuICAgICAgbG9jYWxzW3ZhbHVlTmFtZV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBsb2NhbHM7XG4gICAgfSA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBsb2NhbHNbdmFsdWVOYW1lXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIGxvY2FscztcbiAgICB9O1xuXG5cbiAgICBmdW5jdGlvbiBPcHRpb24oc2VsZWN0VmFsdWUsIHZpZXdWYWx1ZSwgbGFiZWwsIGdyb3VwLCBkaXNhYmxlZCkge1xuICAgICAgdGhpcy5zZWxlY3RWYWx1ZSA9IHNlbGVjdFZhbHVlO1xuICAgICAgdGhpcy52aWV3VmFsdWUgPSB2aWV3VmFsdWU7XG4gICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWVzS2V5cyhvcHRpb25WYWx1ZXMpIHtcbiAgICAgIHZhciBvcHRpb25WYWx1ZXNLZXlzO1xuXG4gICAgICBpZiAoIWtleU5hbWUgJiYgaXNBcnJheUxpa2Uob3B0aW9uVmFsdWVzKSkge1xuICAgICAgICBvcHRpb25WYWx1ZXNLZXlzID0gb3B0aW9uVmFsdWVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgb2JqZWN0LCBleHRyYWN0IGtleXMsIGluIGVudW1lcmF0aW9uIG9yZGVyLCB1bnNvcnRlZFxuICAgICAgICBvcHRpb25WYWx1ZXNLZXlzID0gW107XG4gICAgICAgIGZvciAodmFyIGl0ZW1LZXkgaW4gb3B0aW9uVmFsdWVzKSB7XG4gICAgICAgICAgaWYgKG9wdGlvblZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpdGVtS2V5KSAmJiBpdGVtS2V5LmNoYXJBdCgwKSAhPT0gJyQnKSB7XG4gICAgICAgICAgICBvcHRpb25WYWx1ZXNLZXlzLnB1c2goaXRlbUtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uVmFsdWVzS2V5cztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2tCeTogdHJhY2tCeSxcbiAgICAgIGdldFRyYWNrQnlWYWx1ZTogZ2V0VHJhY2tCeVZhbHVlLFxuICAgICAgZ2V0V2F0Y2hhYmxlczogJHBhcnNlKHZhbHVlc0ZuLCBmdW5jdGlvbihvcHRpb25WYWx1ZXMpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgY29sbGVjdGlvbiBvZiB0aGluZ3MgdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIHdhdGNoICh3YXRjaGVkQXJyYXkpXG4gICAgICAgIC8vIHNvIHRoYXQgdGhleSBjYW4gYWxsIGJlIHdhdGNoZWQgdXNpbmcgYSBzaW5nbGUgJHdhdGNoQ29sbGVjdGlvblxuICAgICAgICAvLyB0aGF0IG9ubHkgcnVucyB0aGUgaGFuZGxlciBvbmNlIGlmIGFueXRoaW5nIGNoYW5nZXNcbiAgICAgICAgdmFyIHdhdGNoZWRBcnJheSA9IFtdO1xuICAgICAgICBvcHRpb25WYWx1ZXMgPSBvcHRpb25WYWx1ZXMgfHwgW107XG5cbiAgICAgICAgdmFyIG9wdGlvblZhbHVlc0tleXMgPSBnZXRPcHRpb25WYWx1ZXNLZXlzKG9wdGlvblZhbHVlcyk7XG4gICAgICAgIHZhciBvcHRpb25WYWx1ZXNMZW5ndGggPSBvcHRpb25WYWx1ZXNLZXlzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IG9wdGlvblZhbHVlc0xlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIHZhciBrZXkgPSAob3B0aW9uVmFsdWVzID09PSBvcHRpb25WYWx1ZXNLZXlzKSA/IGluZGV4IDogb3B0aW9uVmFsdWVzS2V5c1tpbmRleF07XG4gICAgICAgICAgdmFyIHZhbHVlID0gb3B0aW9uVmFsdWVzW2tleV07XG5cbiAgICAgICAgICB2YXIgbG9jYWxzID0gZ2V0TG9jYWxzKHZhbHVlLCBrZXkpO1xuICAgICAgICAgIHZhciBzZWxlY3RWYWx1ZSA9IGdldFRyYWNrQnlWYWx1ZUZuKHZhbHVlLCBsb2NhbHMpO1xuICAgICAgICAgIHdhdGNoZWRBcnJheS5wdXNoKHNlbGVjdFZhbHVlKTtcblxuICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byB3YXRjaCB0aGUgZGlzcGxheUZuIGlmIHRoZXJlIGlzIGEgc3BlY2lmaWMgbGFiZWwgZXhwcmVzc2lvblxuICAgICAgICAgIGlmIChtYXRjaFsyXSB8fCBtYXRjaFsxXSkge1xuICAgICAgICAgICAgdmFyIGxhYmVsID0gZGlzcGxheUZuKHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAgICAgd2F0Y2hlZEFycmF5LnB1c2gobGFiZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byB3YXRjaCB0aGUgZGlzYWJsZVdoZW5GbiBpZiB0aGVyZSBpcyBhIHNwZWNpZmljIGRpc2FibGUgZXhwcmVzc2lvblxuICAgICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgdmFyIGRpc2FibGVXaGVuID0gZGlzYWJsZVdoZW5GbihzY29wZSwgbG9jYWxzKTtcbiAgICAgICAgICAgIHdhdGNoZWRBcnJheS5wdXNoKGRpc2FibGVXaGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhdGNoZWRBcnJheTtcbiAgICAgIH0pLFxuXG4gICAgICBnZXRPcHRpb25zOiBmdW5jdGlvbigpIHtcblxuICAgICAgICB2YXIgb3B0aW9uSXRlbXMgPSBbXTtcbiAgICAgICAgdmFyIHNlbGVjdFZhbHVlTWFwID0ge307XG5cbiAgICAgICAgLy8gVGhlIG9wdGlvbiB2YWx1ZXMgd2VyZSBhbHJlYWR5IGNvbXB1dGVkIGluIHRoZSBgZ2V0V2F0Y2hhYmxlc2AgZm4sXG4gICAgICAgIC8vIHdoaWNoIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCB0byB0cmlnZ2VyIGBnZXRPcHRpb25zYFxuICAgICAgICB2YXIgb3B0aW9uVmFsdWVzID0gdmFsdWVzRm4oc2NvcGUpIHx8IFtdO1xuICAgICAgICB2YXIgb3B0aW9uVmFsdWVzS2V5cyA9IGdldE9wdGlvblZhbHVlc0tleXMob3B0aW9uVmFsdWVzKTtcbiAgICAgICAgdmFyIG9wdGlvblZhbHVlc0xlbmd0aCA9IG9wdGlvblZhbHVlc0tleXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBvcHRpb25WYWx1ZXNMZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICB2YXIga2V5ID0gKG9wdGlvblZhbHVlcyA9PT0gb3B0aW9uVmFsdWVzS2V5cykgPyBpbmRleCA6IG9wdGlvblZhbHVlc0tleXNbaW5kZXhdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9wdGlvblZhbHVlc1trZXldO1xuICAgICAgICAgIHZhciBsb2NhbHMgPSBnZXRMb2NhbHModmFsdWUsIGtleSk7XG4gICAgICAgICAgdmFyIHZpZXdWYWx1ZSA9IHZpZXdWYWx1ZUZuKHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAgIHZhciBzZWxlY3RWYWx1ZSA9IGdldFRyYWNrQnlWYWx1ZUZuKHZpZXdWYWx1ZSwgbG9jYWxzKTtcbiAgICAgICAgICB2YXIgbGFiZWwgPSBkaXNwbGF5Rm4oc2NvcGUsIGxvY2Fscyk7XG4gICAgICAgICAgdmFyIGdyb3VwID0gZ3JvdXBCeUZuKHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAgIHZhciBkaXNhYmxlZCA9IGRpc2FibGVXaGVuRm4oc2NvcGUsIGxvY2Fscyk7XG4gICAgICAgICAgdmFyIG9wdGlvbkl0ZW0gPSBuZXcgT3B0aW9uKHNlbGVjdFZhbHVlLCB2aWV3VmFsdWUsIGxhYmVsLCBncm91cCwgZGlzYWJsZWQpO1xuXG4gICAgICAgICAgb3B0aW9uSXRlbXMucHVzaChvcHRpb25JdGVtKTtcbiAgICAgICAgICBzZWxlY3RWYWx1ZU1hcFtzZWxlY3RWYWx1ZV0gPSBvcHRpb25JdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpdGVtczogb3B0aW9uSXRlbXMsXG4gICAgICAgICAgc2VsZWN0VmFsdWVNYXA6IHNlbGVjdFZhbHVlTWFwLFxuICAgICAgICAgIGdldE9wdGlvbkZyb21WaWV3VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0VmFsdWVNYXBbZ2V0VHJhY2tCeVZhbHVlKHZhbHVlKV07XG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXRWaWV3VmFsdWVGcm9tT3B0aW9uOiBmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2aWV3VmFsdWUgY291bGQgYmUgYW4gb2JqZWN0IHRoYXQgbWF5IGJlIG11dGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIGEgY29weSBhbmQgbm90IHJldHVybiB0aGUgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBvbiB0aGUgb3B0aW9uLlxuICAgICAgICAgICAgcmV0dXJuIHRyYWNrQnkgPyBjb3B5KG9wdGlvbi52aWV3VmFsdWUpIDogb3B0aW9uLnZpZXdWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cbiAgLy8gd2UgY2FuJ3QganVzdCBqcUxpdGUoJzxvcHRpb24+Jykgc2luY2UganFMaXRlIGlzIG5vdCBzbWFydCBlbm91Z2hcbiAgLy8gdG8gY3JlYXRlIGl0IGluIDxzZWxlY3Q+IGFuZCBJRSBiYXJmcyBvdGhlcndpc2UuXG4gIHZhciBvcHRpb25UZW1wbGF0ZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKSxcbiAgICAgIG9wdEdyb3VwVGVtcGxhdGUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0Z3JvdXAnKTtcblxuICAgIGZ1bmN0aW9uIG5nT3B0aW9uc1Bvc3RMaW5rKHNjb3BlLCBzZWxlY3RFbGVtZW50LCBhdHRyLCBjdHJscykge1xuXG4gICAgICB2YXIgc2VsZWN0Q3RybCA9IGN0cmxzWzBdO1xuICAgICAgdmFyIG5nTW9kZWxDdHJsID0gY3RybHNbMV07XG4gICAgICB2YXIgbXVsdGlwbGUgPSBhdHRyLm11bHRpcGxlO1xuXG4gICAgICAvLyBUaGUgZW1wdHlPcHRpb24gYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgdG8gcHJvdmlkZSB0aGVpciBvd24gY3VzdG9tIFwiZW1wdHlcIlxuICAgICAgLy8gb3B0aW9uIHdoZW4gdGhlIHZpZXdWYWx1ZSBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIG9wdGlvbiB2YWx1ZXMuXG4gICAgICBmb3IgKHZhciBpID0gMCwgY2hpbGRyZW4gPSBzZWxlY3RFbGVtZW50LmNoaWxkcmVuKCksIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBpZiAoY2hpbGRyZW5baV0udmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgc2VsZWN0Q3RybC5oYXNFbXB0eU9wdGlvbiA9IHRydWU7XG4gICAgICAgICAgc2VsZWN0Q3RybC5lbXB0eU9wdGlvbiA9IGNoaWxkcmVuLmVxKGkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm92aWRlZEVtcHR5T3B0aW9uID0gISFzZWxlY3RDdHJsLmVtcHR5T3B0aW9uO1xuXG4gICAgICB2YXIgdW5rbm93bk9wdGlvbiA9IGpxTGl0ZShvcHRpb25UZW1wbGF0ZS5jbG9uZU5vZGUoZmFsc2UpKTtcbiAgICAgIHVua25vd25PcHRpb24udmFsKCc/Jyk7XG5cbiAgICAgIHZhciBvcHRpb25zO1xuICAgICAgdmFyIG5nT3B0aW9ucyA9IHBhcnNlT3B0aW9uc0V4cHJlc3Npb24oYXR0ci5uZ09wdGlvbnMsIHNlbGVjdEVsZW1lbnQsIHNjb3BlKTtcbiAgICAgIC8vIFRoaXMgc3RvcmVzIHRoZSBuZXdseSBjcmVhdGVkIG9wdGlvbnMgYmVmb3JlIHRoZXkgYXJlIGFwcGVuZGVkIHRvIHRoZSBzZWxlY3QuXG4gICAgICAvLyBTaW5jZSB0aGUgY29udGVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcyBhcHBlbmRlZCxcbiAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byBjcmVhdGUgaXQgb25jZS5cbiAgICAgIHZhciBsaXN0RnJhZ21lbnQgPSAkZG9jdW1lbnRbMF0uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICAvLyBPdmVyd3JpdGUgdGhlIGltcGxlbWVudGF0aW9uLiBuZ09wdGlvbnMgZG9lc24ndCB1c2UgaGFzaGVzXG4gICAgICBzZWxlY3RDdHJsLmdlbmVyYXRlVW5rbm93bk9wdGlvblZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHJldHVybiAnPyc7XG4gICAgICB9O1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGNvbnRyb2xsZXIgbWV0aG9kcyBmb3IgbXVsdGlwbGUgc2VsZWN0YWJsZSBvcHRpb25zXG4gICAgICBpZiAoIW11bHRpcGxlKSB7XG5cbiAgICAgICAgc2VsZWN0Q3RybC53cml0ZVZhbHVlID0gZnVuY3Rpb24gd3JpdGVOZ09wdGlvbnNWYWx1ZSh2YWx1ZSkge1xuICAgICAgICAgIHZhciBzZWxlY3RlZE9wdGlvbiA9IG9wdGlvbnMuc2VsZWN0VmFsdWVNYXBbc2VsZWN0RWxlbWVudC52YWwoKV07XG4gICAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnMuZ2V0T3B0aW9uRnJvbVZpZXdWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgZnJvbSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICAvLyBPdGhlcndpc2UsIHNjcmVlbiByZWFkZXJzIG1pZ2h0IGdldCBjb25mdXNlZFxuICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikgc2VsZWN0ZWRPcHRpb24uZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG5cbiAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB1cGRhdGUgdGhlIG9wdGlvbiB3aGVuIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuXG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIGJyb3dzZXIgd2lsbCBzZWxlY3QgdGhlIGZpcnN0IG9wdGlvbiBieSBkZWZhdWx0LiBJbiB0aGF0IGNhc2UsXG4gICAgICAgICAgICAvLyBtb3N0IHByb3BlcnRpZXMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IC0gZXhjZXB0IHRoZSBgc2VsZWN0ZWRgIGF0dHJpYnV0ZSwgd2hpY2ggd2VcbiAgICAgICAgICAgIC8vIHNldCBhbHdheXNcblxuICAgICAgICAgICAgaWYgKHNlbGVjdEVsZW1lbnRbMF0udmFsdWUgIT09IG9wdGlvbi5zZWxlY3RWYWx1ZSkge1xuICAgICAgICAgICAgICBzZWxlY3RDdHJsLnJlbW92ZVVua25vd25PcHRpb24oKTtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC51bnNlbGVjdEVtcHR5T3B0aW9uKCk7XG5cbiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudFswXS52YWx1ZSA9IG9wdGlvbi5zZWxlY3RWYWx1ZTtcbiAgICAgICAgICAgICAgb3B0aW9uLmVsZW1lbnQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvcHRpb24uZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgaWYgKHByb3ZpZGVkRW1wdHlPcHRpb24pIHtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5zZWxlY3RFbXB0eU9wdGlvbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RDdHJsLnVua25vd25PcHRpb24ucGFyZW50KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHNlbGVjdEN0cmwudXBkYXRlVW5rbm93bk9wdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxlY3RDdHJsLnJlbmRlclVua25vd25PcHRpb24odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzZWxlY3RDdHJsLnJlYWRWYWx1ZSA9IGZ1bmN0aW9uIHJlYWROZ09wdGlvbnNWYWx1ZSgpIHtcblxuICAgICAgICAgIHZhciBzZWxlY3RlZE9wdGlvbiA9IG9wdGlvbnMuc2VsZWN0VmFsdWVNYXBbc2VsZWN0RWxlbWVudC52YWwoKV07XG5cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgIXNlbGVjdGVkT3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RDdHJsLnVuc2VsZWN0RW1wdHlPcHRpb24oKTtcbiAgICAgICAgICAgIHNlbGVjdEN0cmwucmVtb3ZlVW5rbm93bk9wdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbihzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBgdHJhY2sgYnlgIHRoZW4gd2UgbXVzdCB3YXRjaCB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbW9kZWxcbiAgICAgICAgLy8gc2luY2UgbmdNb2RlbCBvbmx5IHdhdGNoZXMgZm9yIG9iamVjdCBpZGVudGl0eSBjaGFuZ2VcbiAgICAgICAgLy8gRklYTUU6IFdoZW4gYSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uLCB0aGlzIHdhdGNoIHdpbGwgZmlyZSBuZWVkbGVzc2x5XG4gICAgICAgIGlmIChuZ09wdGlvbnMudHJhY2tCeSkge1xuICAgICAgICAgIHNjb3BlLiR3YXRjaChcbiAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gbmdPcHRpb25zLmdldFRyYWNrQnlWYWx1ZShuZ01vZGVsQ3RybC4kdmlld1ZhbHVlKTsgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBuZ01vZGVsQ3RybC4kcmVuZGVyKCk7IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgc2VsZWN0Q3RybC53cml0ZVZhbHVlID0gZnVuY3Rpb24gd3JpdGVOZ09wdGlvbnNNdWx0aXBsZSh2YWx1ZXMpIHtcbiAgICAgICAgICAvLyBPbmx5IHNldCBgPG9wdGlvbj4uc2VsZWN0ZWRgIGlmIG5lY2Vzc2FyeSwgaW4gb3JkZXIgdG8gcHJldmVudCBzb21lIGJyb3dzZXJzIGZyb21cbiAgICAgICAgICAvLyBzY3JvbGxpbmcgdG8gYDxvcHRpb24+YCBlbGVtZW50cyB0aGF0IGFyZSBvdXRzaWRlIHRoZSBgPHNlbGVjdD5gIGVsZW1lbnQncyB2aWV3cG9ydC5cblxuICAgICAgICAgIHZhciBzZWxlY3RlZE9wdGlvbnMgPSB2YWx1ZXMgJiYgdmFsdWVzLm1hcChnZXRBbmRVcGRhdGVTZWxlY3RlZE9wdGlvbikgfHwgW107XG5cbiAgICAgICAgICBvcHRpb25zLml0ZW1zLmZvckVhY2goZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmVsZW1lbnQuc2VsZWN0ZWQgJiYgIWluY2x1ZGVzKHNlbGVjdGVkT3B0aW9ucywgb3B0aW9uKSkge1xuICAgICAgICAgICAgICBvcHRpb24uZWxlbWVudC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG5cbiAgICAgICAgc2VsZWN0Q3RybC5yZWFkVmFsdWUgPSBmdW5jdGlvbiByZWFkTmdPcHRpb25zTXVsdGlwbGUoKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkVmFsdWVzID0gc2VsZWN0RWxlbWVudC52YWwoKSB8fCBbXSxcbiAgICAgICAgICAgICAgc2VsZWN0aW9ucyA9IFtdO1xuXG4gICAgICAgICAgZm9yRWFjaChzZWxlY3RlZFZhbHVlcywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zLnNlbGVjdFZhbHVlTWFwW3ZhbHVlXTtcbiAgICAgICAgICAgIGlmIChvcHRpb24gJiYgIW9wdGlvbi5kaXNhYmxlZCkgc2VsZWN0aW9ucy5wdXNoKG9wdGlvbnMuZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbihvcHRpb24pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBzZWxlY3Rpb25zO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBgdHJhY2sgYnlgIHRoZW4gd2UgbXVzdCB3YXRjaCB0aGVzZSB0cmFja2VkIHZhbHVlcyBvbiB0aGUgbW9kZWxcbiAgICAgICAgLy8gc2luY2UgbmdNb2RlbCBvbmx5IHdhdGNoZXMgZm9yIG9iamVjdCBpZGVudGl0eSBjaGFuZ2VcbiAgICAgICAgaWYgKG5nT3B0aW9ucy50cmFja0J5KSB7XG5cbiAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkobmdNb2RlbEN0cmwuJHZpZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5nTW9kZWxDdHJsLiR2aWV3VmFsdWUubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5nT3B0aW9ucy5nZXRUcmFja0J5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm92aWRlZEVtcHR5T3B0aW9uKSB7XG5cbiAgICAgICAgLy8gd2UgbmVlZCB0byByZW1vdmUgaXQgYmVmb3JlIGNhbGxpbmcgc2VsZWN0RWxlbWVudC5lbXB0eSgpIGJlY2F1c2Ugb3RoZXJ3aXNlIElFIHdpbGxcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50LiB3dGY/XG4gICAgICAgIHNlbGVjdEN0cmwuZW1wdHlPcHRpb24ucmVtb3ZlKCk7XG5cbiAgICAgICAgLy8gY29tcGlsZSB0aGUgZWxlbWVudCBzaW5jZSB0aGVyZSBtaWdodCBiZSBiaW5kaW5ncyBpbiBpdFxuICAgICAgICAkY29tcGlsZShzZWxlY3RDdHJsLmVtcHR5T3B0aW9uKShzY29wZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdEN0cmwuZW1wdHlPcHRpb25bMF0ubm9kZVR5cGUgPT09IE5PREVfVFlQRV9DT01NRU5UKSB7XG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGUgZW1wdHkgb3B0aW9uIGhhcyBjdXJyZW50bHkgbm8gYWN0dWFsIERPTSBub2RlLCBwcm9iYWJseSBiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgYSB0cmFuc2NsdXNpb24gZGlyZWN0aXZlLlxuICAgICAgICAgIHNlbGVjdEN0cmwuaGFzRW1wdHlPcHRpb24gPSBmYWxzZTtcblxuICAgICAgICAgIC8vIFJlZGVmaW5lIHRoZSByZWdpc3Rlck9wdGlvbiBmdW5jdGlvbiwgd2hpY2ggd2lsbCBjYXRjaFxuICAgICAgICAgIC8vIG9wdGlvbnMgdGhhdCBhcmUgYWRkZWQgYnkgbmdJZiBldGMuIChyZW5kZXJpbmcgb2YgdGhlIG5vZGUgaXMgYXN5bmMgYmVjYXVzZSBvZlxuICAgICAgICAgIC8vIGxhenkgdHJhbnNjbHVzaW9uKVxuICAgICAgICAgIHNlbGVjdEN0cmwucmVnaXN0ZXJPcHRpb24gPSBmdW5jdGlvbihvcHRpb25TY29wZSwgb3B0aW9uRWwpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25FbC52YWwoKSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5oYXNFbXB0eU9wdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIHNlbGVjdEN0cmwuZW1wdHlPcHRpb24gPSBvcHRpb25FbDtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5lbXB0eU9wdGlvbi5yZW1vdmVDbGFzcygnbmctc2NvcGUnKTtcbiAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBuZXcgZW1wdHkgb3B0aW9uIGlzIHNlbGVjdGVkIGlmIHByZXZpb3VzbHkgbm8gb3B0aW9uIHdhcyBzZWxlY3RlZFxuICAgICAgICAgICAgICBuZ01vZGVsQ3RybC4kcmVuZGVyKCk7XG5cbiAgICAgICAgICAgICAgb3B0aW9uRWwub24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0Q3RybC5oYXNFbXB0eU9wdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNlbGVjdEN0cmwuZW1wdHlPcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGNsYXNzLCB3aGljaCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2Ugd2UgcmVjb21waWxlIHRoZSBlbGVtZW50IGFuZCBpdFxuICAgICAgICAgIC8vIGJlY29tZXMgdGhlIGNvbXBpbGF0aW9uIHJvb3RcbiAgICAgICAgICBzZWxlY3RDdHJsLmVtcHR5T3B0aW9uLnJlbW92ZUNsYXNzKCduZy1zY29wZScpO1xuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgc2VsZWN0RWxlbWVudC5lbXB0eSgpO1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgb3B0aW9ucyBvYmplY3QgaXMgZGVmaW5lZFxuICAgICAgLy8gd2hlbiB3ZSBmaXJzdCBoaXQgaXQgaW4gd3JpdGVOZ09wdGlvbnNWYWx1ZVxuICAgICAgdXBkYXRlT3B0aW9ucygpO1xuXG4gICAgICAvLyBXZSB3aWxsIHJlLXJlbmRlciB0aGUgb3B0aW9uIGVsZW1lbnRzIGlmIHRoZSBvcHRpb24gdmFsdWVzIG9yIGxhYmVscyBjaGFuZ2VcbiAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24obmdPcHRpb25zLmdldFdhdGNoYWJsZXMsIHVwZGF0ZU9wdGlvbnMpO1xuXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAgICAgZnVuY3Rpb24gYWRkT3B0aW9uRWxlbWVudChvcHRpb24sIHBhcmVudCkge1xuICAgICAgICB2YXIgb3B0aW9uRWxlbWVudCA9IG9wdGlvblRlbXBsYXRlLmNsb25lTm9kZShmYWxzZSk7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTtcbiAgICAgICAgdXBkYXRlT3B0aW9uRWxlbWVudChvcHRpb24sIG9wdGlvbkVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBnZXRBbmRVcGRhdGVTZWxlY3RlZE9wdGlvbih2aWV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnMuZ2V0T3B0aW9uRnJvbVZpZXdWYWx1ZSh2aWV3VmFsdWUpO1xuICAgICAgICB2YXIgZWxlbWVudCA9IG9wdGlvbiAmJiBvcHRpb24uZWxlbWVudDtcblxuICAgICAgICBpZiAoZWxlbWVudCAmJiAhZWxlbWVudC5zZWxlY3RlZCkgZWxlbWVudC5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXBkYXRlT3B0aW9uRWxlbWVudChvcHRpb24sIGVsZW1lbnQpIHtcbiAgICAgICAgb3B0aW9uLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICBlbGVtZW50LmRpc2FibGVkID0gb3B0aW9uLmRpc2FibGVkO1xuICAgICAgICAvLyBOT1RFOiBUaGUgbGFiZWwgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIElFMTAvMTEvRURHRSBjcmVhdGUgdW5yZXNwb25zaXZlXG4gICAgICAgIC8vIHNlbGVjdHMgaW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzIHdoZW4gbXVsdGlwbGUgc2VsZWN0cyBhcmUgbmV4dCB0byBlYWNoIG90aGVyIGFuZCBkaXNwbGF5XG4gICAgICAgIC8vIHRoZSBvcHRpb24gbGlzdCBpbiBsaXN0Ym94IHN0eWxlLCBpLmUuIHRoZSBzZWxlY3QgaXMgW211bHRpcGxlXSwgb3Igc3BlY2lmaWVzIGEgW3NpemVdLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTEzMTQgZm9yIG1vcmUgaW5mby5cbiAgICAgICAgLy8gVGhpcyBpcyB1bmZvcnR1bmF0ZWx5IHVudGVzdGFibGUgd2l0aCB1bml0IC8gZTJlIHRlc3RzXG4gICAgICAgIGlmIChvcHRpb24ubGFiZWwgIT09IGVsZW1lbnQubGFiZWwpIHtcbiAgICAgICAgICBlbGVtZW50LmxhYmVsID0gb3B0aW9uLmxhYmVsO1xuICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb24ubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IG9wdGlvbi5zZWxlY3RWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXBkYXRlT3B0aW9ucygpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzVmFsdWUgPSBvcHRpb25zICYmIHNlbGVjdEN0cmwucmVhZFZhbHVlKCk7XG5cbiAgICAgICAgLy8gV2UgbXVzdCByZW1vdmUgYWxsIGN1cnJlbnQgb3B0aW9ucywgYnV0IGNhbm5vdCBzaW1wbHkgc2V0IGlubmVySFRNTCA9IG51bGxcbiAgICAgICAgLy8gc2luY2UgdGhlIHByb3ZpZGVkRW1wdHlPcHRpb24gbWlnaHQgaGF2ZSBhbiBuZ0lmIG9uIGl0IHRoYXQgaW5zZXJ0cyBjb21tZW50cyB3aGljaCB3ZVxuICAgICAgICAvLyBtdXN0IHByZXNlcnZlLlxuICAgICAgICAvLyBJbnN0ZWFkLCBpdGVyYXRlIG92ZXIgdGhlIGN1cnJlbnQgb3B0aW9uIGVsZW1lbnRzIGFuZCByZW1vdmUgdGhlbSBvciB0aGVpciBvcHRncm91cFxuICAgICAgICAvLyBwYXJlbnRzXG4gICAgICAgIGlmIChvcHRpb25zKSB7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gb3B0aW9ucy5pdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnMuaXRlbXNbaV07XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKG9wdGlvbi5ncm91cCkpIHtcbiAgICAgICAgICAgICAganFMaXRlUmVtb3ZlKG9wdGlvbi5lbGVtZW50LnBhcmVudE5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAganFMaXRlUmVtb3ZlKG9wdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zID0gbmdPcHRpb25zLmdldE9wdGlvbnMoKTtcblxuICAgICAgICB2YXIgZ3JvdXBFbGVtZW50TWFwID0ge307XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGVtcHR5IG9wdGlvbiBpcyBhbHdheXMgdGhlcmUgaWYgaXQgd2FzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICAgICAgaWYgKHByb3ZpZGVkRW1wdHlPcHRpb24pIHtcbiAgICAgICAgICBzZWxlY3RFbGVtZW50LnByZXBlbmQoc2VsZWN0Q3RybC5lbXB0eU9wdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gYWRkT3B0aW9uKG9wdGlvbikge1xuICAgICAgICAgIHZhciBncm91cEVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoaXNEZWZpbmVkKG9wdGlvbi5ncm91cCkpIHtcblxuICAgICAgICAgICAgLy8gVGhpcyBvcHRpb24gaXMgdG8gbGl2ZSBpbiBhIGdyb3VwXG4gICAgICAgICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgdGhpcyBncm91cFxuICAgICAgICAgICAgZ3JvdXBFbGVtZW50ID0gZ3JvdXBFbGVtZW50TWFwW29wdGlvbi5ncm91cF07XG5cbiAgICAgICAgICAgIGlmICghZ3JvdXBFbGVtZW50KSB7XG5cbiAgICAgICAgICAgICAgZ3JvdXBFbGVtZW50ID0gb3B0R3JvdXBUZW1wbGF0ZS5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICAgICAgICBsaXN0RnJhZ21lbnQuYXBwZW5kQ2hpbGQoZ3JvdXBFbGVtZW50KTtcblxuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGxhYmVsIG9uIHRoZSBncm91cCBlbGVtZW50XG4gICAgICAgICAgICAgIC8vIFwibnVsbFwiIGlzIHNwZWNpYWwgY2FzZWQgYmVjYXVzZSBvZiBTYWZhcmlcbiAgICAgICAgICAgICAgZ3JvdXBFbGVtZW50LmxhYmVsID0gb3B0aW9uLmdyb3VwID09PSBudWxsID8gJ251bGwnIDogb3B0aW9uLmdyb3VwO1xuXG4gICAgICAgICAgICAgIC8vIFN0b3JlIGl0IGZvciB1c2UgbGF0ZXJcbiAgICAgICAgICAgICAgZ3JvdXBFbGVtZW50TWFwW29wdGlvbi5ncm91cF0gPSBncm91cEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZE9wdGlvbkVsZW1lbnQob3B0aW9uLCBncm91cEVsZW1lbnQpO1xuXG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLy8gVGhpcyBvcHRpb24gaXMgbm90IGluIGEgZ3JvdXBcbiAgICAgICAgICAgIGFkZE9wdGlvbkVsZW1lbnQob3B0aW9uLCBsaXN0RnJhZ21lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VsZWN0RWxlbWVudFswXS5hcHBlbmRDaGlsZChsaXN0RnJhZ21lbnQpO1xuXG4gICAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcblxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIGR1ZSB0byB0aGUgdXBkYXRlIHRvIHRoZSBvcHRpb25zXG4gICAgICAgIGlmICghbmdNb2RlbEN0cmwuJGlzRW1wdHkocHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gc2VsZWN0Q3RybC5yZWFkVmFsdWUoKTtcbiAgICAgICAgICB2YXIgaXNOb3RQcmltaXRpdmUgPSBuZ09wdGlvbnMudHJhY2tCeSB8fCBtdWx0aXBsZTtcbiAgICAgICAgICBpZiAoaXNOb3RQcmltaXRpdmUgPyAhZXF1YWxzKHByZXZpb3VzVmFsdWUsIG5leHRWYWx1ZSkgOiBwcmV2aW91c1ZhbHVlICE9PSBuZXh0VmFsdWUpIHtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXRWaWV3VmFsdWUobmV4dFZhbHVlKTtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIHRlcm1pbmFsOiB0cnVlLFxuICAgIHJlcXVpcmU6IFsnc2VsZWN0JywgJ25nTW9kZWwnXSxcbiAgICBsaW5rOiB7XG4gICAgICBwcmU6IGZ1bmN0aW9uIG5nT3B0aW9uc1ByZUxpbmsoc2NvcGUsIHNlbGVjdEVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7XG4gICAgICAgIC8vIERlYWN0aXZhdGUgdGhlIFNlbGVjdENvbnRyb2xsZXIucmVnaXN0ZXIgbWV0aG9kIHRvIHByZXZlbnRcbiAgICAgICAgLy8gb3B0aW9uIGRpcmVjdGl2ZXMgZnJvbSBhY2NpZGVudGFsbHkgcmVnaXN0ZXJpbmcgdGhlbXNlbHZlc1xuICAgICAgICAvLyAoYW5kIHVud2FudGVkICRkZXN0cm95IGhhbmRsZXJzIGV0Yy4pXG4gICAgICAgIGN0cmxzWzBdLnJlZ2lzdGVyT3B0aW9uID0gbm9vcDtcbiAgICAgIH0sXG4gICAgICBwb3N0OiBuZ09wdGlvbnNQb3N0TGlua1xuICAgIH1cbiAgfTtcbn1dO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nUGx1cmFsaXplXG4gKiBAcmVzdHJpY3QgRUFcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIGBuZ1BsdXJhbGl6ZWAgaXMgYSBkaXJlY3RpdmUgdGhhdCBkaXNwbGF5cyBtZXNzYWdlcyBhY2NvcmRpbmcgdG8gZW4tVVMgbG9jYWxpemF0aW9uIHJ1bGVzLlxuICogVGhlc2UgcnVsZXMgYXJlIGJ1bmRsZWQgd2l0aCBhbmd1bGFyLmpzLCBidXQgY2FuIGJlIG92ZXJyaWRkZW5cbiAqIChzZWUge0BsaW5rIGd1aWRlL2kxOG4gQW5ndWxhciBpMThufSBkZXYgZ3VpZGUpLiBZb3UgY29uZmlndXJlIG5nUGx1cmFsaXplIGRpcmVjdGl2ZVxuICogYnkgc3BlY2lmeWluZyB0aGUgbWFwcGluZ3MgYmV0d2VlblxuICogW3BsdXJhbCBjYXRlZ29yaWVzXShodHRwOi8vdW5pY29kZS5vcmcvcmVwb3MvY2xkci10bXAvdHJ1bmsvZGlmZi9zdXBwbGVtZW50YWwvbGFuZ3VhZ2VfcGx1cmFsX3J1bGVzLmh0bWwpXG4gKiBhbmQgdGhlIHN0cmluZ3MgdG8gYmUgZGlzcGxheWVkLlxuICpcbiAqICMgUGx1cmFsIGNhdGVnb3JpZXMgYW5kIGV4cGxpY2l0IG51bWJlciBydWxlc1xuICogVGhlcmUgYXJlIHR3b1xuICogW3BsdXJhbCBjYXRlZ29yaWVzXShodHRwOi8vdW5pY29kZS5vcmcvcmVwb3MvY2xkci10bXAvdHJ1bmsvZGlmZi9zdXBwbGVtZW50YWwvbGFuZ3VhZ2VfcGx1cmFsX3J1bGVzLmh0bWwpXG4gKiBpbiBBbmd1bGFyJ3MgZGVmYXVsdCBlbi1VUyBsb2NhbGU6IFwib25lXCIgYW5kIFwib3RoZXJcIi5cbiAqXG4gKiBXaGlsZSBhIHBsdXJhbCBjYXRlZ29yeSBtYXkgbWF0Y2ggbWFueSBudW1iZXJzIChmb3IgZXhhbXBsZSwgaW4gZW4tVVMgbG9jYWxlLCBcIm90aGVyXCIgY2FuIG1hdGNoXG4gKiBhbnkgbnVtYmVyIHRoYXQgaXMgbm90IDEpLCBhbiBleHBsaWNpdCBudW1iZXIgcnVsZSBjYW4gb25seSBtYXRjaCBvbmUgbnVtYmVyLiBGb3IgZXhhbXBsZSwgdGhlXG4gKiBleHBsaWNpdCBudW1iZXIgcnVsZSBmb3IgXCIzXCIgbWF0Y2hlcyB0aGUgbnVtYmVyIDMuIFRoZXJlIGFyZSBleGFtcGxlcyBvZiBwbHVyYWwgY2F0ZWdvcmllc1xuICogYW5kIGV4cGxpY2l0IG51bWJlciBydWxlcyB0aHJvdWdob3V0IHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiAjIENvbmZpZ3VyaW5nIG5nUGx1cmFsaXplXG4gKiBZb3UgY29uZmlndXJlIG5nUGx1cmFsaXplIGJ5IHByb3ZpZGluZyAyIGF0dHJpYnV0ZXM6IGBjb3VudGAgYW5kIGB3aGVuYC5cbiAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSwgYG9mZnNldGAuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSBgY291bnRgIGF0dHJpYnV0ZSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIHtAbGluayBndWlkZS9leHByZXNzaW9uXG4gKiBBbmd1bGFyIGV4cHJlc3Npb259OyB0aGVzZSBhcmUgZXZhbHVhdGVkIG9uIHRoZSBjdXJyZW50IHNjb3BlIGZvciBpdHMgYm91bmQgdmFsdWUuXG4gKlxuICogVGhlIGB3aGVuYCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBsdXJhbCBjYXRlZ29yaWVzIGFuZCB0aGUgYWN0dWFsXG4gKiBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgYSBKU09OIG9iamVjdC5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNvbmZpZ3VyZSBuZ1BsdXJhbGl6ZTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8bmctcGx1cmFsaXplIGNvdW50PVwicGVyc29uQ291bnRcIlxuICAgICAgICAgICAgICAgICB3aGVuPVwieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsXG4gKiAgICAgICAgICAgICAgICAgICAgICAnb25lJzogJzEgcGVyc29uIGlzIHZpZXdpbmcuJyxcbiAqICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7fSBwZW9wbGUgYXJlIHZpZXdpbmcuJ31cIj5cbiAqIDwvbmctcGx1cmFsaXplPlxuICpgYGBcbiAqXG4gKiBJbiB0aGUgZXhhbXBsZSwgYFwiMDogTm9ib2R5IGlzIHZpZXdpbmcuXCJgIGlzIGFuIGV4cGxpY2l0IG51bWJlciBydWxlLiBJZiB5b3UgZGlkIG5vdFxuICogc3BlY2lmeSB0aGlzIHJ1bGUsIDAgd291bGQgYmUgbWF0Y2hlZCB0byB0aGUgXCJvdGhlclwiIGNhdGVnb3J5IGFuZCBcIjAgcGVvcGxlIGFyZSB2aWV3aW5nXCJcbiAqIHdvdWxkIGJlIHNob3duIGluc3RlYWQgb2YgXCJOb2JvZHkgaXMgdmlld2luZ1wiLiBZb3UgY2FuIHNwZWNpZnkgYW4gZXhwbGljaXQgbnVtYmVyIHJ1bGUgZm9yXG4gKiBvdGhlciBudW1iZXJzLCBmb3IgZXhhbXBsZSAxMiwgc28gdGhhdCBpbnN0ZWFkIG9mIHNob3dpbmcgXCIxMiBwZW9wbGUgYXJlIHZpZXdpbmdcIiwgeW91IGNhblxuICogc2hvdyBcImEgZG96ZW4gcGVvcGxlIGFyZSB2aWV3aW5nXCIuXG4gKlxuICogWW91IGNhbiB1c2UgYSBzZXQgb2YgY2xvc2VkIGJyYWNlcyAoYHt9YCkgYXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIG51bWJlciB0aGF0IHlvdSB3YW50IHN1YnN0aXR1dGVkXG4gKiBpbnRvIHBsdXJhbGl6ZWQgc3RyaW5ncy4gSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIEFuZ3VsYXIgd2lsbCByZXBsYWNlIGB7fWAgd2l0aFxuICogPHNwYW4gbmctbm9uLWJpbmRhYmxlPmB7e3BlcnNvbkNvdW50fX1gPC9zcGFuPi4gVGhlIGNsb3NlZCBicmFjZXMgYHt9YCBpcyBhIHBsYWNlaG9sZGVyXG4gKiBmb3IgPHNwYW4gbmctbm9uLWJpbmRhYmxlPnt7bnVtYmVyRXhwcmVzc2lvbn19PC9zcGFuPi5cbiAqXG4gKiBJZiBubyBydWxlIGlzIGRlZmluZWQgZm9yIGEgY2F0ZWdvcnksIHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIGRpc3BsYXllZCBhbmQgYSB3YXJuaW5nIGlzIGdlbmVyYXRlZC5cbiAqIE5vdGUgdGhhdCBzb21lIGxvY2FsZXMgZGVmaW5lIG1vcmUgY2F0ZWdvcmllcyB0aGFuIGBvbmVgIGFuZCBgb3RoZXJgLiBGb3IgZXhhbXBsZSwgZnItZnIgZGVmaW5lcyBgZmV3YCBhbmQgYG1hbnlgLlxuICpcbiAqICMgQ29uZmlndXJpbmcgbmdQbHVyYWxpemUgd2l0aCBvZmZzZXRcbiAqIFRoZSBgb2Zmc2V0YCBhdHRyaWJ1dGUgYWxsb3dzIGZ1cnRoZXIgY3VzdG9taXphdGlvbiBvZiBwbHVyYWxpemVkIHRleHQsIHdoaWNoIGNhbiByZXN1bHQgaW5cbiAqIGEgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZS4gRm9yIGV4YW1wbGUsIGluc3RlYWQgb2YgdGhlIG1lc3NhZ2UgXCI0IHBlb3BsZSBhcmUgdmlld2luZyB0aGlzIGRvY3VtZW50XCIsXG4gKiB5b3UgbWlnaHQgZGlzcGxheSBcIkpvaG4sIEthdGUgYW5kIDIgb3RoZXJzIGFyZSB2aWV3aW5nIHRoaXMgZG9jdW1lbnRcIi5cbiAqIFRoZSBvZmZzZXQgYXR0cmlidXRlIGFsbG93cyB5b3UgdG8gb2Zmc2V0IGEgbnVtYmVyIGJ5IGFueSBkZXNpcmVkIHZhbHVlLlxuICogTGV0J3MgdGFrZSBhIGxvb2sgYXQgYW4gZXhhbXBsZTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8bmctcGx1cmFsaXplIGNvdW50PVwicGVyc29uQ291bnRcIiBvZmZzZXQ9MlxuICogICAgICAgICAgICAgICB3aGVuPVwieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsXG4gKiAgICAgICAgICAgICAgICAgICAgICAnMSc6ICd7e3BlcnNvbjF9fSBpcyB2aWV3aW5nLicsXG4gKiAgICAgICAgICAgICAgICAgICAgICAnMic6ICd7e3BlcnNvbjF9fSBhbmQge3twZXJzb24yfX0gYXJlIHZpZXdpbmcuJyxcbiAqICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicsXG4gKiAgICAgICAgICAgICAgICAgICAgICAnb3RoZXInOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCB7fSBvdGhlciBwZW9wbGUgYXJlIHZpZXdpbmcuJ31cIj5cbiAqIDwvbmctcGx1cmFsaXplPlxuICogYGBgXG4gKlxuICogTm90aWNlIHRoYXQgd2UgYXJlIHN0aWxsIHVzaW5nIHR3byBwbHVyYWwgY2F0ZWdvcmllcyhvbmUsIG90aGVyKSwgYnV0IHdlIGFkZGVkXG4gKiB0aHJlZSBleHBsaWNpdCBudW1iZXIgcnVsZXMgMCwgMSBhbmQgMi5cbiAqIFdoZW4gb25lIHBlcnNvbiwgcGVyaGFwcyBKb2huLCB2aWV3cyB0aGUgZG9jdW1lbnQsIFwiSm9obiBpcyB2aWV3aW5nXCIgd2lsbCBiZSBzaG93bi5cbiAqIFdoZW4gdGhyZWUgcGVvcGxlIHZpZXcgdGhlIGRvY3VtZW50LCBubyBleHBsaWNpdCBudW1iZXIgcnVsZSBpcyBmb3VuZCwgc29cbiAqIGFuIG9mZnNldCBvZiAyIGlzIHRha2VuIG9mZiAzLCBhbmQgQW5ndWxhciB1c2VzIDEgdG8gZGVjaWRlIHRoZSBwbHVyYWwgY2F0ZWdvcnkuXG4gKiBJbiB0aGlzIGNhc2UsIHBsdXJhbCBjYXRlZ29yeSAnb25lJyBpcyBtYXRjaGVkIGFuZCBcIkpvaG4sIE1hcnkgYW5kIG9uZSBvdGhlciBwZXJzb24gYXJlIHZpZXdpbmdcIlxuICogaXMgc2hvd24uXG4gKlxuICogTm90ZSB0aGF0IHdoZW4geW91IHNwZWNpZnkgb2Zmc2V0cywgeW91IG11c3QgcHJvdmlkZSBleHBsaWNpdCBudW1iZXIgcnVsZXMgZm9yXG4gKiBudW1iZXJzIGZyb20gMCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBvZmZzZXQuIElmIHlvdSB1c2UgYW4gb2Zmc2V0IG9mIDMsIGZvciBleGFtcGxlLFxuICogeW91IG11c3QgcHJvdmlkZSBleHBsaWNpdCBudW1iZXIgcnVsZXMgZm9yIDAsIDEsIDIgYW5kIDMuIFlvdSBtdXN0IGFsc28gcHJvdmlkZSBwbHVyYWwgc3RyaW5ncyBmb3JcbiAqIHBsdXJhbCBjYXRlZ29yaWVzIFwib25lXCIgYW5kIFwib3RoZXJcIi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xleHByZXNzaW9ufSBjb3VudCBUaGUgdmFyaWFibGUgdG8gYmUgYm91bmQgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gd2hlbiBUaGUgbWFwcGluZyBiZXR3ZWVuIHBsdXJhbCBjYXRlZ29yeSB0byBpdHMgY29ycmVzcG9uZGluZyBzdHJpbmdzLlxuICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIGRlZHVjdCBmcm9tIHRoZSB0b3RhbCBudW1iZXIuXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBtb2R1bGU9XCJwbHVyYWxpemVFeGFtcGxlXCIgbmFtZT1cIm5nLXBsdXJhbGl6ZVwiPlxuICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgncGx1cmFsaXplRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgJHNjb3BlLnBlcnNvbjEgPSAnSWdvcic7XG4gICAgICAgICAgICAgICRzY29wZS5wZXJzb24yID0gJ01pc2tvJztcbiAgICAgICAgICAgICAgJHNjb3BlLnBlcnNvbkNvdW50ID0gMTtcbiAgICAgICAgICAgIH1dKTtcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICAgPGxhYmVsPlBlcnNvbiAxOjxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwicGVyc29uMVwiIHZhbHVlPVwiSWdvclwiIC8+PC9sYWJlbD48YnIvPlxuICAgICAgICAgIDxsYWJlbD5QZXJzb24gMjo8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cInBlcnNvbjJcIiB2YWx1ZT1cIk1pc2tvXCIgLz48L2xhYmVsPjxici8+XG4gICAgICAgICAgPGxhYmVsPk51bWJlciBvZiBQZW9wbGU6PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJwZXJzb25Db3VudFwiIHZhbHVlPVwiMVwiIC8+PC9sYWJlbD48YnIvPlxuXG4gICAgICAgICAgPCEtLS0gRXhhbXBsZSB3aXRoIHNpbXBsZSBwbHVyYWxpemF0aW9uIHJ1bGVzIGZvciBlbiBsb2NhbGUgLS0tPlxuICAgICAgICAgIFdpdGhvdXQgT2Zmc2V0OlxuICAgICAgICAgIDxuZy1wbHVyYWxpemUgY291bnQ9XCJwZXJzb25Db3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVuPVwieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uZSc6ICcxIHBlcnNvbiBpcyB2aWV3aW5nLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyJzogJ3t9IHBlb3BsZSBhcmUgdmlld2luZy4nfVwiPlxuICAgICAgICAgIDwvbmctcGx1cmFsaXplPjxicj5cblxuICAgICAgICAgIDwhLS0tIEV4YW1wbGUgd2l0aCBvZmZzZXQgLS0tPlxuICAgICAgICAgIFdpdGggT2Zmc2V0KDIpOlxuICAgICAgICAgIDxuZy1wbHVyYWxpemUgY291bnQ9XCJwZXJzb25Db3VudFwiIG9mZnNldD0yXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVuPVwieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnOiAne3twZXJzb24xfX0gaXMgdmlld2luZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJzogJ3t7cGVyc29uMX19IGFuZCB7e3BlcnNvbjJ9fSBhcmUgdmlld2luZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyJzogJ3t7cGVyc29uMX19LCB7e3BlcnNvbjJ9fSBhbmQge30gb3RoZXIgcGVvcGxlIGFyZSB2aWV3aW5nLid9XCI+XG4gICAgICAgICAgPC9uZy1wbHVyYWxpemU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICBpdCgnc2hvdWxkIHNob3cgY29ycmVjdCBwbHVyYWxpemVkIHN0cmluZycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB3aXRob3V0T2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDApO1xuICAgICAgICAgIHZhciB3aXRoT2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDEpO1xuICAgICAgICAgIHZhciBjb3VudElucHV0ID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uQ291bnQnKSk7XG5cbiAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzEgcGVyc29uIGlzIHZpZXdpbmcuJyk7XG4gICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdJZ29yIGlzIHZpZXdpbmcuJyk7XG5cbiAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7XG4gICAgICAgICAgY291bnRJbnB1dC5zZW5kS2V5cygnMCcpO1xuXG4gICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdOb2JvZHkgaXMgdmlld2luZy4nKTtcbiAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ05vYm9keSBpcyB2aWV3aW5nLicpO1xuXG4gICAgICAgICAgY291bnRJbnB1dC5jbGVhcigpO1xuICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzInKTtcblxuICAgICAgICAgIGV4cGVjdCh3aXRob3V0T2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnMiBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7XG4gICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdJZ29yIGFuZCBNaXNrbyBhcmUgdmlld2luZy4nKTtcblxuICAgICAgICAgIGNvdW50SW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICBjb3VudElucHV0LnNlbmRLZXlzKCczJyk7XG5cbiAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzMgcGVvcGxlIGFyZSB2aWV3aW5nLicpO1xuICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciwgTWlza28gYW5kIG9uZSBvdGhlciBwZXJzb24gYXJlIHZpZXdpbmcuJyk7XG5cbiAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7XG4gICAgICAgICAgY291bnRJbnB1dC5zZW5kS2V5cygnNCcpO1xuXG4gICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCc0IHBlb3BsZSBhcmUgdmlld2luZy4nKTtcbiAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ0lnb3IsIE1pc2tvIGFuZCAyIG90aGVyIHBlb3BsZSBhcmUgdmlld2luZy4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgc2hvdyBkYXRhLWJvdW5kIG5hbWVzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHdpdGhPZmZzZXQgPSBlbGVtZW50LmFsbChieS5jc3MoJ25nLXBsdXJhbGl6ZScpKS5nZXQoMSk7XG4gICAgICAgICAgdmFyIHBlcnNvbkNvdW50ID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uQ291bnQnKSk7XG4gICAgICAgICAgdmFyIHBlcnNvbjEgPSBlbGVtZW50KGJ5Lm1vZGVsKCdwZXJzb24xJykpO1xuICAgICAgICAgIHZhciBwZXJzb24yID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uMicpKTtcbiAgICAgICAgICBwZXJzb25Db3VudC5jbGVhcigpO1xuICAgICAgICAgIHBlcnNvbkNvdW50LnNlbmRLZXlzKCc0Jyk7XG4gICAgICAgICAgcGVyc29uMS5jbGVhcigpO1xuICAgICAgICAgIHBlcnNvbjEuc2VuZEtleXMoJ0RpJyk7XG4gICAgICAgICAgcGVyc29uMi5jbGVhcigpO1xuICAgICAgICAgIHBlcnNvbjIuc2VuZEtleXMoJ1ZvanRhJyk7XG4gICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdEaSwgVm9qdGEgYW5kIDIgb3RoZXIgcGVvcGxlIGFyZSB2aWV3aW5nLicpO1xuICAgICAgICB9KTtcbiAgICAgIDwvZmlsZT5cbiAgICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ1BsdXJhbGl6ZURpcmVjdGl2ZSA9IFsnJGxvY2FsZScsICckaW50ZXJwb2xhdGUnLCAnJGxvZycsIGZ1bmN0aW9uKCRsb2NhbGUsICRpbnRlcnBvbGF0ZSwgJGxvZykge1xuICB2YXIgQlJBQ0UgPSAve30vZyxcbiAgICAgIElTX1dIRU4gPSAvXndoZW4oTWludXMpPyguKykkLztcblxuICByZXR1cm4ge1xuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICB2YXIgbnVtYmVyRXhwID0gYXR0ci5jb3VudCxcbiAgICAgICAgICB3aGVuRXhwID0gYXR0ci4kYXR0ci53aGVuICYmIGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyLndoZW4pLCAvLyB3ZSBoYXZlIHt7fX0gaW4gYXR0cnNcbiAgICAgICAgICBvZmZzZXQgPSBhdHRyLm9mZnNldCB8fCAwLFxuICAgICAgICAgIHdoZW5zID0gc2NvcGUuJGV2YWwod2hlbkV4cCkgfHwge30sXG4gICAgICAgICAgd2hlbnNFeHBGbnMgPSB7fSxcbiAgICAgICAgICBzdGFydFN5bWJvbCA9ICRpbnRlcnBvbGF0ZS5zdGFydFN5bWJvbCgpLFxuICAgICAgICAgIGVuZFN5bWJvbCA9ICRpbnRlcnBvbGF0ZS5lbmRTeW1ib2woKSxcbiAgICAgICAgICBicmFjZVJlcGxhY2VtZW50ID0gc3RhcnRTeW1ib2wgKyBudW1iZXJFeHAgKyAnLScgKyBvZmZzZXQgKyBlbmRTeW1ib2wsXG4gICAgICAgICAgd2F0Y2hSZW1vdmVyID0gYW5ndWxhci5ub29wLFxuICAgICAgICAgIGxhc3RDb3VudDtcblxuICAgICAgZm9yRWFjaChhdHRyLCBmdW5jdGlvbihleHByZXNzaW9uLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIHZhciB0bXBNYXRjaCA9IElTX1dIRU4uZXhlYyhhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgaWYgKHRtcE1hdGNoKSB7XG4gICAgICAgICAgdmFyIHdoZW5LZXkgPSAodG1wTWF0Y2hbMV0gPyAnLScgOiAnJykgKyBsb3dlcmNhc2UodG1wTWF0Y2hbMl0pO1xuICAgICAgICAgIHdoZW5zW3doZW5LZXldID0gZWxlbWVudC5hdHRyKGF0dHIuJGF0dHJbYXR0cmlidXRlTmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvckVhY2god2hlbnMsIGZ1bmN0aW9uKGV4cHJlc3Npb24sIGtleSkge1xuICAgICAgICB3aGVuc0V4cEZuc1trZXldID0gJGludGVycG9sYXRlKGV4cHJlc3Npb24ucmVwbGFjZShCUkFDRSwgYnJhY2VSZXBsYWNlbWVudCkpO1xuXG4gICAgICB9KTtcblxuICAgICAgc2NvcGUuJHdhdGNoKG51bWJlckV4cCwgZnVuY3Rpb24gbmdQbHVyYWxpemVXYXRjaEFjdGlvbihuZXdWYWwpIHtcbiAgICAgICAgdmFyIGNvdW50ID0gcGFyc2VGbG9hdChuZXdWYWwpO1xuICAgICAgICB2YXIgY291bnRJc05hTiA9IGlzTnVtYmVyTmFOKGNvdW50KTtcblxuICAgICAgICBpZiAoIWNvdW50SXNOYU4gJiYgIShjb3VudCBpbiB3aGVucykpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleHBsaWNpdCBudW1iZXIgcnVsZSBzdWNoIGFzIDEsIDIsIDMuLi4gaXMgZGVmaW5lZCwganVzdCB1c2UgaXQuXG4gICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpdCBhZ2FpbnN0IHBsdXJhbGl6YXRpb24gcnVsZXMgaW4gJGxvY2FsZSBzZXJ2aWNlLlxuICAgICAgICAgIGNvdW50ID0gJGxvY2FsZS5wbHVyYWxDYXQoY291bnQgLSBvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYm90aCBgY291bnRgIGFuZCBgbGFzdENvdW50YCBhcmUgTmFOLCB3ZSBkb24ndCBuZWVkIHRvIHJlLXJlZ2lzdGVyIGEgd2F0Y2guXG4gICAgICAgIC8vIEluIEpTIGBOYU4gIT09IE5hTmAsIHNvIHdlIGhhdmUgdG8gZXhwbGljaXRseSBjaGVjay5cbiAgICAgICAgaWYgKChjb3VudCAhPT0gbGFzdENvdW50KSAmJiAhKGNvdW50SXNOYU4gJiYgaXNOdW1iZXJOYU4obGFzdENvdW50KSkpIHtcbiAgICAgICAgICB3YXRjaFJlbW92ZXIoKTtcbiAgICAgICAgICB2YXIgd2hlbkV4cEZuID0gd2hlbnNFeHBGbnNbY291bnRdO1xuICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh3aGVuRXhwRm4pKSB7XG4gICAgICAgICAgICBpZiAobmV3VmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgJGxvZy5kZWJ1ZygnbmdQbHVyYWxpemU6IG5vIHJ1bGUgZGVmaW5lZCBmb3IgXFwnJyArIGNvdW50ICsgJ1xcJyBpbiAnICsgd2hlbkV4cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YXRjaFJlbW92ZXIgPSBub29wO1xuICAgICAgICAgICAgdXBkYXRlRWxlbWVudFRleHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2F0Y2hSZW1vdmVyID0gc2NvcGUuJHdhdGNoKHdoZW5FeHBGbiwgdXBkYXRlRWxlbWVudFRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYXN0Q291bnQgPSBjb3VudDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnRUZXh0KG5ld1RleHQpIHtcbiAgICAgICAgZWxlbWVudC50ZXh0KG5ld1RleHQgfHwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1dO1xuXG4vKiBleHBvcnRlZCBuZ1JlcGVhdERpcmVjdGl2ZSAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nUmVwZWF0XG4gKiBAbXVsdGlFbGVtZW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nUmVwZWF0YCBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIGEgdGVtcGxhdGUgb25jZSBwZXIgaXRlbSBmcm9tIGEgY29sbGVjdGlvbi4gRWFjaCB0ZW1wbGF0ZVxuICogaW5zdGFuY2UgZ2V0cyBpdHMgb3duIHNjb3BlLCB3aGVyZSB0aGUgZ2l2ZW4gbG9vcCB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBpdGVtLFxuICogYW5kIGAkaW5kZXhgIGlzIHNldCB0byB0aGUgaXRlbSBpbmRleCBvciBrZXkuXG4gKlxuICogU3BlY2lhbCBwcm9wZXJ0aWVzIGFyZSBleHBvc2VkIG9uIHRoZSBsb2NhbCBzY29wZSBvZiBlYWNoIHRlbXBsYXRlIGluc3RhbmNlLCBpbmNsdWRpbmc6XG4gKlxuICogfCBWYXJpYWJsZSAgfCBUeXBlICAgICAgICAgICAgfCBEZXRhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBgJGluZGV4YCAgfCB7QHR5cGUgbnVtYmVyfSAgfCBpdGVyYXRvciBvZmZzZXQgb2YgdGhlIHJlcGVhdGVkIGVsZW1lbnQgKDAuLmxlbmd0aC0xKSAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgJGZpcnN0YCAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSByZXBlYXRlZCBlbGVtZW50IGlzIGZpcnN0IGluIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgJG1pZGRsZWAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSByZXBlYXRlZCBlbGVtZW50IGlzIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IGluIHRoZSBpdGVyYXRvci4gfFxuICogfCBgJGxhc3RgICAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSByZXBlYXRlZCBlbGVtZW50IGlzIGxhc3QgaW4gdGhlIGl0ZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBgJGV2ZW5gICAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSBpdGVyYXRvciBwb3NpdGlvbiBgJGluZGV4YCBpcyBldmVuIChvdGhlcndpc2UgZmFsc2UpLiAgICAgICAgICAgfFxuICogfCBgJG9kZGAgICAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSBpdGVyYXRvciBwb3NpdGlvbiBgJGluZGV4YCBpcyBvZGQgKG90aGVyd2lzZSBmYWxzZSkuICAgICAgICAgICAgfFxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gKiAgIENyZWF0aW5nIGFsaWFzZXMgZm9yIHRoZXNlIHByb3BlcnRpZXMgaXMgcG9zc2libGUgd2l0aCB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nSW5pdCBgbmdJbml0YH0uXG4gKiAgIFRoaXMgbWF5IGJlIHVzZWZ1bCB3aGVuLCBmb3IgaW5zdGFuY2UsIG5lc3RpbmcgbmdSZXBlYXRzLlxuICogPC9kaXY+XG4gKlxuICpcbiAqICMgSXRlcmF0aW5nIG92ZXIgb2JqZWN0IHByb3BlcnRpZXNcbiAqXG4gKiBJdCBpcyBwb3NzaWJsZSB0byBnZXQgYG5nUmVwZWF0YCB0byBpdGVyYXRlIG92ZXIgdGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IHVzaW5nIHRoZSBmb2xsb3dpbmdcbiAqIHN5bnRheDpcbiAqXG4gKiBgYGBqc1xuICogPGRpdiBuZy1yZXBlYXQ9XCIoa2V5LCB2YWx1ZSkgaW4gbXlPYmpcIj4gLi4uIDwvZGl2PlxuICogYGBgXG4gKlxuICogSG93ZXZlciwgdGhlcmUgYXJlIGEgZmV3IGxpbWl0YXRpb25zIGNvbXBhcmVkIHRvIGFycmF5IGl0ZXJhdGlvbjpcbiAqXG4gKiAtIFRoZSBKYXZhU2NyaXB0IHNwZWNpZmljYXRpb24gZG9lcyBub3QgZGVmaW5lIHRoZSBvcmRlciBvZiBrZXlzXG4gKiAgIHJldHVybmVkIGZvciBhbiBvYmplY3QsIHNvIEFuZ3VsYXIgcmVsaWVzIG9uIHRoZSBvcmRlciByZXR1cm5lZCBieSB0aGUgYnJvd3NlclxuICogICB3aGVuIHJ1bm5pbmcgYGZvciBrZXkgaW4gbXlPYmpgLiBCcm93c2VycyBnZW5lcmFsbHkgZm9sbG93IHRoZSBzdHJhdGVneSBvZiBwcm92aWRpbmdcbiAqICAga2V5cyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGRlZmluZWQsIGFsdGhvdWdoIHRoZXJlIGFyZSBleGNlcHRpb25zIHdoZW4ga2V5cyBhcmUgZGVsZXRlZFxuICogICBhbmQgcmVpbnN0YXRlZC4gU2VlIHRoZVxuICogICBbTUROIHBhZ2Ugb24gYGRlbGV0ZWAgZm9yIG1vcmUgaW5mb10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL2RlbGV0ZSNDcm9zcy1icm93c2VyX25vdGVzKS5cbiAqXG4gKiAtIGBuZ1JlcGVhdGAgd2lsbCBzaWxlbnRseSAqaWdub3JlKiBvYmplY3Qga2V5cyBzdGFydGluZyB3aXRoIGAkYCwgYmVjYXVzZVxuICogICBpdCdzIGEgcHJlZml4IHVzZWQgYnkgQW5ndWxhciBmb3IgcHVibGljIChgJGApIGFuZCBwcml2YXRlIChgJCRgKSBwcm9wZXJ0aWVzLlxuICpcbiAqIC0gVGhlIGJ1aWx0LWluIGZpbHRlcnMge0BsaW5rIG5nLm9yZGVyQnkgb3JkZXJCeX0gYW5kIHtAbGluayBuZy5maWx0ZXIgZmlsdGVyfSBkbyBub3Qgd29yayB3aXRoXG4gKiAgIG9iamVjdHMsIGFuZCB3aWxsIHRocm93IGFuIGVycm9yIGlmIHVzZWQgd2l0aCBvbmUuXG4gKlxuICogSWYgeW91IGFyZSBoaXR0aW5nIGFueSBvZiB0aGVzZSBsaW1pdGF0aW9ucywgdGhlIHJlY29tbWVuZGVkIHdvcmthcm91bmQgaXMgdG8gY29udmVydCB5b3VyIG9iamVjdCBpbnRvIGFuIGFycmF5XG4gKiB0aGF0IGlzIHNvcnRlZCBpbnRvIHRoZSBvcmRlciB0aGF0IHlvdSBwcmVmZXIgYmVmb3JlIHByb3ZpZGluZyBpdCB0byBgbmdSZXBlYXRgLiBZb3UgY291bGRcbiAqIGRvIHRoaXMgd2l0aCBhIGZpbHRlciBzdWNoIGFzIFt0b0FycmF5RmlsdGVyXShodHRwOi8vbmdtb2R1bGVzLm9yZy9tb2R1bGVzL2FuZ3VsYXItdG9BcnJheUZpbHRlcilcbiAqIG9yIGltcGxlbWVudCBhIGAkd2F0Y2hgIG9uIHRoZSBvYmplY3QgeW91cnNlbGYuXG4gKlxuICpcbiAqICMgVHJhY2tpbmcgYW5kIER1cGxpY2F0ZXNcbiAqXG4gKiBgbmdSZXBlYXRgIHVzZXMge0BsaW5rICRyb290U2NvcGUuU2NvcGUjJHdhdGNoQ29sbGVjdGlvbiAkd2F0Y2hDb2xsZWN0aW9ufSB0byBkZXRlY3QgY2hhbmdlcyBpblxuICogdGhlIGNvbGxlY3Rpb24uIFdoZW4gYSBjaGFuZ2UgaGFwcGVucywgYG5nUmVwZWF0YCB0aGVuIG1ha2VzIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gdGhlIERPTTpcbiAqXG4gKiAqIFdoZW4gYW4gaXRlbSBpcyBhZGRlZCwgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIGlzIGFkZGVkIHRvIHRoZSBET00uXG4gKiAqIFdoZW4gYW4gaXRlbSBpcyByZW1vdmVkLCBpdHMgdGVtcGxhdGUgaW5zdGFuY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uXG4gKiAqIFdoZW4gaXRlbXMgYXJlIHJlb3JkZXJlZCwgdGhlaXIgcmVzcGVjdGl2ZSB0ZW1wbGF0ZXMgYXJlIHJlb3JkZXJlZCBpbiB0aGUgRE9NLlxuICpcbiAqIFRvIG1pbmltaXplIGNyZWF0aW9uIG9mIERPTSBlbGVtZW50cywgYG5nUmVwZWF0YCB1c2VzIGEgZnVuY3Rpb25cbiAqIHRvIFwia2VlcCB0cmFja1wiIG9mIGFsbCBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBET00gZWxlbWVudHMuXG4gKiBGb3IgZXhhbXBsZSwgaWYgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbiwgYG5nUmVwZWF0YCB3aWxsIGtub3cgdGhhdCBhbGwgb3RoZXIgaXRlbXNcbiAqIGFscmVhZHkgaGF2ZSBET00gZWxlbWVudHMsIGFuZCB3aWxsIG5vdCByZS1yZW5kZXIgdGhlbS5cbiAqXG4gKiBUaGUgZGVmYXVsdCB0cmFja2luZyBmdW5jdGlvbiAod2hpY2ggdHJhY2tzIGl0ZW1zIGJ5IHRoZWlyIGlkZW50aXR5KSBkb2VzIG5vdCBhbGxvd1xuICogZHVwbGljYXRlIGl0ZW1zIGluIGFycmF5cy4gVGhpcyBpcyBiZWNhdXNlIHdoZW4gdGhlcmUgYXJlIGR1cGxpY2F0ZXMsIGl0IGlzIG5vdCBwb3NzaWJsZVxuICogdG8gbWFpbnRhaW4gYSBvbmUtdG8tb25lIG1hcHBpbmcgYmV0d2VlbiBjb2xsZWN0aW9uIGl0ZW1zIGFuZCBET00gZWxlbWVudHMuXG4gKlxuICogSWYgeW91IGRvIG5lZWQgdG8gcmVwZWF0IGR1cGxpY2F0ZSBpdGVtcywgeW91IGNhbiBzdWJzdGl0dXRlIHRoZSBkZWZhdWx0IHRyYWNraW5nIGJlaGF2aW9yXG4gKiB3aXRoIHlvdXIgb3duIHVzaW5nIHRoZSBgdHJhY2sgYnlgIGV4cHJlc3Npb24uXG4gKlxuICogRm9yIGV4YW1wbGUsIHlvdSBtYXkgdHJhY2sgaXRlbXMgYnkgdGhlIGluZGV4IG9mIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiwgdXNpbmcgdGhlXG4gKiBzcGVjaWFsIHNjb3BlIHByb3BlcnR5IGAkaW5kZXhgOlxuICogYGBgaHRtbFxuICogICAgPGRpdiBuZy1yZXBlYXQ9XCJuIGluIFs0MiwgNDIsIDQzLCA0M10gdHJhY2sgYnkgJGluZGV4XCI+XG4gKiAgICAgIHt7bn19XG4gKiAgICA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIFlvdSBtYXkgYWxzbyB1c2UgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGluIGB0cmFjayBieWAsIGluY2x1ZGluZyByZWZlcmVuY2VzIHRvIGN1c3RvbSBmdW5jdGlvbnNcbiAqIG9uIHRoZSBzY29wZTpcbiAqIGBgYGh0bWxcbiAqICAgIDxkaXYgbmctcmVwZWF0PVwibiBpbiBbNDIsIDQyLCA0MywgNDNdIHRyYWNrIGJ5IG15VHJhY2tpbmdGdW5jdGlvbihuKVwiPlxuICogICAgICB7e259fVxuICogICAgPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiPlxuICogSWYgeW91IGFyZSB3b3JraW5nIHdpdGggb2JqZWN0cyB0aGF0IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciBwcm9wZXJ0eSwgeW91IHNob3VsZCB0cmFja1xuICogYnkgdGhpcyBpZGVudGlmaWVyIGluc3RlYWQgb2YgdGhlIG9iamVjdCBpbnN0YW5jZS4gU2hvdWxkIHlvdSByZWxvYWQgeW91ciBkYXRhIGxhdGVyLCBgbmdSZXBlYXRgXG4gKiB3aWxsIG5vdCBoYXZlIHRvIHJlYnVpbGQgdGhlIERPTSBlbGVtZW50cyBmb3IgaXRlbXMgaXQgaGFzIGFscmVhZHkgcmVuZGVyZWQsIGV2ZW4gaWYgdGhlXG4gKiBKYXZhU2NyaXB0IG9iamVjdHMgaW4gdGhlIGNvbGxlY3Rpb24gaGF2ZSBiZWVuIHN1YnN0aXR1dGVkIGZvciBuZXcgb25lcy4gRm9yIGxhcmdlIGNvbGxlY3Rpb25zLFxuICogdGhpcyBzaWduaWZpY2FudGx5IGltcHJvdmVzIHJlbmRlcmluZyBwZXJmb3JtYW5jZS4gSWYgeW91IGRvbid0IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllcixcbiAqIGB0cmFjayBieSAkaW5kZXhgIGNhbiBhbHNvIHByb3ZpZGUgYSBwZXJmb3JtYW5jZSBib29zdC5cbiAqIDwvZGl2PlxuICpcbiAqIGBgYGh0bWxcbiAqICAgIDxkaXYgbmctcmVwZWF0PVwibW9kZWwgaW4gY29sbGVjdGlvbiB0cmFjayBieSBtb2RlbC5pZFwiPlxuICogICAgICB7e21vZGVsLm5hbWV9fVxuICogICAgPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiA8YnIgLz5cbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiBBdm9pZCB1c2luZyBgdHJhY2sgYnkgJGluZGV4YCB3aGVuIHRoZSByZXBlYXRlZCB0ZW1wbGF0ZSBjb250YWluc1xuICoge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jb25lLXRpbWUtYmluZGluZyBvbmUtdGltZSBiaW5kaW5nc30uIEluIHN1Y2ggY2FzZXMsIHRoZSBgbnRoYCBET01cbiAqIGVsZW1lbnQgd2lsbCBhbHdheXMgYmUgbWF0Y2hlZCB3aXRoIHRoZSBgbnRoYCBpdGVtIG9mIHRoZSBhcnJheSwgc28gdGhlIGJpbmRpbmdzIG9uIHRoYXQgZWxlbWVudFxuICogd2lsbCBub3QgYmUgdXBkYXRlZCBldmVuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBjaGFuZ2VzLCBlc3NlbnRpYWxseSBjYXVzaW5nIHRoZSB2aWV3IHRvIGdldFxuICogb3V0LW9mLXN5bmMgd2l0aCB0aGUgdW5kZXJseWluZyBkYXRhLlxuICogPC9kaXY+XG4gKlxuICogV2hlbiBubyBgdHJhY2sgYnlgIGV4cHJlc3Npb24gaXMgcHJvdmlkZWQsIGl0IGlzIGVxdWl2YWxlbnQgdG8gdHJhY2tpbmcgYnkgdGhlIGJ1aWx0LWluXG4gKiBgJGlkYCBmdW5jdGlvbiwgd2hpY2ggdHJhY2tzIGl0ZW1zIGJ5IHRoZWlyIGlkZW50aXR5OlxuICogYGBgaHRtbFxuICogICAgPGRpdiBuZy1yZXBlYXQ9XCJvYmogaW4gY29sbGVjdGlvbiB0cmFjayBieSAkaWQob2JqKVwiPlxuICogICAgICB7e29iai5wcm9wfX1cbiAqICAgIDwvZGl2PlxuICogYGBgXG4gKlxuICogPGJyIC8+XG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIGB0cmFjayBieWAgbXVzdCBhbHdheXMgYmUgdGhlIGxhc3QgZXhwcmVzc2lvbjpcbiAqIDwvZGl2PlxuICogYGBgXG4gKiAgICA8ZGl2IG5nLXJlcGVhdD1cIm1vZGVsIGluIGNvbGxlY3Rpb24gfCBvcmRlckJ5OiAnaWQnIGFzIGZpbHRlcmVkX3Jlc3VsdCB0cmFjayBieSBtb2RlbC5pZFwiPlxuICogICAgICB7e21vZGVsLm5hbWV9fVxuICogICAgPC9kaXY+XG4gKiBgYGBcbiAqXG4gKlxuICogIyBTcGVjaWFsIHJlcGVhdCBzdGFydCBhbmQgZW5kIHBvaW50c1xuICogVG8gcmVwZWF0IGEgc2VyaWVzIG9mIGVsZW1lbnRzIGluc3RlYWQgb2YganVzdCBvbmUgcGFyZW50IGVsZW1lbnQsIG5nUmVwZWF0IChhcyB3ZWxsIGFzIG90aGVyIG5nIGRpcmVjdGl2ZXMpIHN1cHBvcnRzIGV4dGVuZGluZ1xuICogdGhlIHJhbmdlIG9mIHRoZSByZXBlYXRlciBieSBkZWZpbmluZyBleHBsaWNpdCBzdGFydCBhbmQgZW5kIHBvaW50cyBieSB1c2luZyAqKm5nLXJlcGVhdC1zdGFydCoqIGFuZCAqKm5nLXJlcGVhdC1lbmQqKiByZXNwZWN0aXZlbHkuXG4gKiBUaGUgKipuZy1yZXBlYXQtc3RhcnQqKiBkaXJlY3RpdmUgd29ya3MgdGhlIHNhbWUgYXMgKipuZy1yZXBlYXQqKiwgYnV0IHdpbGwgcmVwZWF0IGFsbCB0aGUgSFRNTCBjb2RlIChpbmNsdWRpbmcgdGhlIHRhZyBpdCdzIGRlZmluZWQgb24pXG4gKiB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBlbmRpbmcgSFRNTCB0YWcgd2hlcmUgKipuZy1yZXBlYXQtZW5kKiogaXMgcGxhY2VkLlxuICpcbiAqIFRoZSBleGFtcGxlIGJlbG93IG1ha2VzIHVzZSBvZiB0aGlzIGZlYXR1cmU6XG4gKiBgYGBodG1sXG4gKiAgIDxoZWFkZXIgbmctcmVwZWF0LXN0YXJ0PVwiaXRlbSBpbiBpdGVtc1wiPlxuICogICAgIEhlYWRlciB7eyBpdGVtIH19XG4gKiAgIDwvaGVhZGVyPlxuICogICA8ZGl2IGNsYXNzPVwiYm9keVwiPlxuICogICAgIEJvZHkge3sgaXRlbSB9fVxuICogICA8L2Rpdj5cbiAqICAgPGZvb3RlciBuZy1yZXBlYXQtZW5kPlxuICogICAgIEZvb3RlciB7eyBpdGVtIH19XG4gKiAgIDwvZm9vdGVyPlxuICogYGBgXG4gKlxuICogQW5kIHdpdGggYW4gaW5wdXQgb2Yge0B0eXBlIFsnQScsJ0InXX0gZm9yIHRoZSBpdGVtcyB2YXJpYWJsZSBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIG91dHB1dCB3aWxsIGV2YWx1YXRlIHRvOlxuICogYGBgaHRtbFxuICogICA8aGVhZGVyPlxuICogICAgIEhlYWRlciBBXG4gKiAgIDwvaGVhZGVyPlxuICogICA8ZGl2IGNsYXNzPVwiYm9keVwiPlxuICogICAgIEJvZHkgQVxuICogICA8L2Rpdj5cbiAqICAgPGZvb3Rlcj5cbiAqICAgICBGb290ZXIgQVxuICogICA8L2Zvb3Rlcj5cbiAqICAgPGhlYWRlcj5cbiAqICAgICBIZWFkZXIgQlxuICogICA8L2hlYWRlcj5cbiAqICAgPGRpdiBjbGFzcz1cImJvZHlcIj5cbiAqICAgICBCb2R5IEJcbiAqICAgPC9kaXY+XG4gKiAgIDxmb290ZXI+XG4gKiAgICAgRm9vdGVyIEJcbiAqICAgPC9mb290ZXI+XG4gKiBgYGBcbiAqXG4gKiBUaGUgY3VzdG9tIHN0YXJ0IGFuZCBlbmQgcG9pbnRzIGZvciBuZ1JlcGVhdCBhbHNvIHN1cHBvcnQgYWxsIG90aGVyIEhUTUwgZGlyZWN0aXZlIHN5bnRheCBmbGF2b3JzIHByb3ZpZGVkIGluIEFuZ3VsYXJKUyAoc3VjaFxuICogYXMgKipkYXRhLW5nLXJlcGVhdC1zdGFydCoqLCAqKngtbmctcmVwZWF0LXN0YXJ0KiogYW5kICoqbmc6cmVwZWF0LXN0YXJ0KiopLlxuICpcbiAqIEBhbmltYXRpb25zXG4gKiB8IEFuaW1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHwgT2NjdXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2VudGVyIGVudGVyfSB8IHdoZW4gYSBuZXcgaXRlbSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvciB3aGVuIGFuIGl0ZW0gaXMgcmV2ZWFsZWQgYWZ0ZXIgYSBmaWx0ZXIgfFxuICogfCB7QGxpbmsgbmcuJGFuaW1hdGUjbGVhdmUgbGVhdmV9IHwgd2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvciB3aGVuIGFuIGl0ZW0gaXMgZmlsdGVyZWQgb3V0IHxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI21vdmUgbW92ZSB9IHwgd2hlbiBhbiBhZGphY2VudCBpdGVtIGlzIGZpbHRlcmVkIG91dCBjYXVzaW5nIGEgcmVvcmRlciBvciB3aGVuIHRoZSBpdGVtIGNvbnRlbnRzIGFyZSByZW9yZGVyZWQgfFxuICpcbiAqIFNlZSB0aGUgZXhhbXBsZSBiZWxvdyBmb3IgZGVmaW5pbmcgQ1NTIGFuaW1hdGlvbnMgd2l0aCBuZ1JlcGVhdC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBzY29wZVxuICogQHByaW9yaXR5IDEwMDBcbiAqIEBwYXJhbSB7cmVwZWF0X2V4cHJlc3Npb259IG5nUmVwZWF0IFRoZSBleHByZXNzaW9uIGluZGljYXRpbmcgaG93IHRvIGVudW1lcmF0ZSBhIGNvbGxlY3Rpb24uIFRoZXNlXG4gKiAgIGZvcm1hdHMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6XG4gKlxuICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uYCDigJMgd2hlcmUgdmFyaWFibGUgaXMgdGhlIHVzZXIgZGVmaW5lZCBsb29wIHZhcmlhYmxlIGFuZCBgZXhwcmVzc2lvbmBcbiAqICAgICBpcyBhIHNjb3BlIGV4cHJlc3Npb24gZ2l2aW5nIHRoZSBjb2xsZWN0aW9uIHRvIGVudW1lcmF0ZS5cbiAqXG4gKiAgICAgRm9yIGV4YW1wbGU6IGBhbGJ1bSBpbiBhcnRpc3QuYWxidW1zYC5cbiAqXG4gKiAgICogYChrZXksIHZhbHVlKSBpbiBleHByZXNzaW9uYCDigJMgd2hlcmUgYGtleWAgYW5kIGB2YWx1ZWAgY2FuIGJlIGFueSB1c2VyIGRlZmluZWQgaWRlbnRpZmllcnMsXG4gKiAgICAgYW5kIGBleHByZXNzaW9uYCBpcyB0aGUgc2NvcGUgZXhwcmVzc2lvbiBnaXZpbmcgdGhlIGNvbGxlY3Rpb24gdG8gZW51bWVyYXRlLlxuICpcbiAqICAgICBGb3IgZXhhbXBsZTogYChuYW1lLCBhZ2UpIGluIHsnYWRhbSc6MTAsICdhbWFsaWUnOjEyfWAuXG4gKlxuICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uIHRyYWNrIGJ5IHRyYWNraW5nX2V4cHJlc3Npb25gIOKAkyBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvcHRpb25hbCB0cmFja2luZyBleHByZXNzaW9uXG4gKiAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBvYmplY3RzIGluIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIERPTSBlbGVtZW50cy4gSWYgbm8gdHJhY2tpbmcgZXhwcmVzc2lvblxuICogICAgIGlzIHNwZWNpZmllZCwgbmctcmVwZWF0IGFzc29jaWF0ZXMgZWxlbWVudHMgYnkgaWRlbnRpdHkuIEl0IGlzIGFuIGVycm9yIHRvIGhhdmVcbiAqICAgICBtb3JlIHRoYW4gb25lIHRyYWNraW5nIGV4cHJlc3Npb24gdmFsdWUgcmVzb2x2ZSB0byB0aGUgc2FtZSBrZXkuIChUaGlzIHdvdWxkIG1lYW4gdGhhdCB0d28gZGlzdGluY3Qgb2JqZWN0cyBhcmVcbiAqICAgICBtYXBwZWQgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQsIHdoaWNoIGlzIG5vdCBwb3NzaWJsZS4pXG4gKlxuICogICAgIE5vdGUgdGhhdCB0aGUgdHJhY2tpbmcgZXhwcmVzc2lvbiBtdXN0IGNvbWUgbGFzdCwgYWZ0ZXIgYW55IGZpbHRlcnMsIGFuZCB0aGUgYWxpYXMgZXhwcmVzc2lvbi5cbiAqXG4gKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zYCBpcyBlcXVpdmFsZW50IHRvIGBpdGVtIGluIGl0ZW1zIHRyYWNrIGJ5ICRpZChpdGVtKWAuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBET00gZWxlbWVudHNcbiAqICAgICB3aWxsIGJlIGFzc29jaWF0ZWQgYnkgaXRlbSBpZGVudGl0eSBpbiB0aGUgYXJyYXkuXG4gKlxuICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSAkaWQoaXRlbSlgLiBBIGJ1aWx0IGluIGAkaWQoKWAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYXNzaWduIGEgdW5pcXVlXG4gKiAgICAgYCQkaGFzaEtleWAgcHJvcGVydHkgdG8gZWFjaCBpdGVtIGluIHRoZSBhcnJheS4gVGhpcyBwcm9wZXJ0eSBpcyB0aGVuIHVzZWQgYXMgYSBrZXkgdG8gYXNzb2NpYXRlZCBET00gZWxlbWVudHNcbiAqICAgICB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0gaW4gdGhlIGFycmF5IGJ5IGlkZW50aXR5LiBNb3ZpbmcgdGhlIHNhbWUgb2JqZWN0IGluIGFycmF5IHdvdWxkIG1vdmUgdGhlIERPTVxuICogICAgIGVsZW1lbnQgaW4gdGhlIHNhbWUgd2F5IGluIHRoZSBET00uXG4gKlxuICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSBpdGVtLmlkYCBpcyBhIHR5cGljYWwgcGF0dGVybiB3aGVuIHRoZSBpdGVtcyBjb21lIGZyb20gdGhlIGRhdGFiYXNlLiBJbiB0aGlzXG4gKiAgICAgY2FzZSB0aGUgb2JqZWN0IGlkZW50aXR5IGRvZXMgbm90IG1hdHRlci4gVHdvIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBhcyBsb25nIGFzIHRoZWlyIGBpZGBcbiAqICAgICBwcm9wZXJ0eSBpcyBzYW1lLlxuICpcbiAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgfCBmaWx0ZXI6c2VhcmNoVGV4dCB0cmFjayBieSBpdGVtLmlkYCBpcyBhIHBhdHRlcm4gdGhhdCBtaWdodCBiZSB1c2VkIHRvIGFwcGx5IGEgZmlsdGVyXG4gKiAgICAgdG8gaXRlbXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIHRyYWNraW5nIGV4cHJlc3Npb24uXG4gKlxuICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uIGFzIGFsaWFzX2V4cHJlc3Npb25gIOKAkyBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvcHRpb25hbCBhbGlhcyBleHByZXNzaW9uIHdoaWNoIHdpbGwgdGhlbiBzdG9yZSB0aGVcbiAqICAgICBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiB0aGUgcmVwZWF0ZXIgYWZ0ZXIgdGhlIGZpbHRlcnMgaGF2ZSBiZWVuIGFwcGxpZWQuIFR5cGljYWxseSB0aGlzIGlzIHVzZWQgdG8gcmVuZGVyIGEgc3BlY2lhbCBtZXNzYWdlXG4gKiAgICAgd2hlbiBhIGZpbHRlciBpcyBhY3RpdmUgb24gdGhlIHJlcGVhdGVyLCBidXQgdGhlIGZpbHRlcmVkIHJlc3VsdCBzZXQgaXMgZW1wdHkuXG4gKlxuICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB8IGZpbHRlcjp4IGFzIHJlc3VsdHNgIHdpbGwgc3RvcmUgdGhlIGZyYWdtZW50IG9mIHRoZSByZXBlYXRlZCBpdGVtcyBhcyBgcmVzdWx0c2AsIGJ1dCBvbmx5IGFmdGVyXG4gKiAgICAgdGhlIGl0ZW1zIGhhdmUgYmVlbiBwcm9jZXNzZWQgdGhyb3VnaCB0aGUgZmlsdGVyLlxuICpcbiAqICAgICBQbGVhc2Ugbm90ZSB0aGF0IGBhcyBbdmFyaWFibGUgbmFtZV0gaXMgbm90IGFuIG9wZXJhdG9yIGJ1dCByYXRoZXIgYSBwYXJ0IG9mIG5nUmVwZWF0IG1pY3JvLXN5bnRheCBzbyBpdCBjYW4gYmUgdXNlZCBvbmx5IGF0IHRoZSBlbmRcbiAqICAgICAoYW5kIG5vdCBhcyBvcGVyYXRvciwgaW5zaWRlIGFuIGV4cHJlc3Npb24pLlxuICpcbiAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgfCBmaWx0ZXIgOiB4IHwgb3JkZXJCeSA6IG9yZGVyIHwgbGltaXRUbyA6IGxpbWl0IGFzIHJlc3VsdHNgIC5cbiAqXG4gKiBAZXhhbXBsZVxuICogVGhpcyBleGFtcGxlIHVzZXMgYG5nUmVwZWF0YCB0byBkaXNwbGF5IGEgbGlzdCBvZiBwZW9wbGUuIEEgZmlsdGVyIGlzIHVzZWQgdG8gcmVzdHJpY3QgdGhlIGRpc3BsYXllZFxuICogcmVzdWx0cyBieSBuYW1lIG9yIGJ5IGFnZS4gTmV3IChlbnRlcmluZykgYW5kIHJlbW92ZWQgKGxlYXZpbmcpIGl0ZW1zIGFyZSBhbmltYXRlZC5cbiAgPGV4YW1wbGUgbW9kdWxlPVwibmdSZXBlYXRcIiBuYW1lPVwibmdSZXBlYXRcIiBkZXBzPVwiYW5ndWxhci1hbmltYXRlLmpzXCIgYW5pbWF0aW9ucz1cInRydWVcIiBuYW1lPVwibmctcmVwZWF0XCI+XG4gICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cInJlcGVhdENvbnRyb2xsZXJcIj5cbiAgICAgICAgSSBoYXZlIHt7ZnJpZW5kcy5sZW5ndGh9fSBmcmllbmRzLiBUaGV5IGFyZTpcbiAgICAgICAgPGlucHV0IHR5cGU9XCJzZWFyY2hcIiBuZy1tb2RlbD1cInFcIiBwbGFjZWhvbGRlcj1cImZpbHRlciBmcmllbmRzLi4uXCIgYXJpYS1sYWJlbD1cImZpbHRlciBmcmllbmRzXCIgLz5cbiAgICAgICAgPHVsIGNsYXNzPVwiZXhhbXBsZS1hbmltYXRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImFuaW1hdGUtcmVwZWF0XCIgbmctcmVwZWF0PVwiZnJpZW5kIGluIGZyaWVuZHMgfCBmaWx0ZXI6cSBhcyByZXN1bHRzXCI+XG4gICAgICAgICAgICBbe3skaW5kZXggKyAxfX1dIHt7ZnJpZW5kLm5hbWV9fSB3aG8gaXMge3tmcmllbmQuYWdlfX0geWVhcnMgb2xkLlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpIGNsYXNzPVwiYW5pbWF0ZS1yZXBlYXRcIiBuZy1pZj1cInJlc3VsdHMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICA8c3Ryb25nPk5vIHJlc3VsdHMgZm91bmQuLi48L3N0cm9uZz5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgIGFuZ3VsYXIubW9kdWxlKCduZ1JlcGVhdCcsIFsnbmdBbmltYXRlJ10pLmNvbnRyb2xsZXIoJ3JlcGVhdENvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgJHNjb3BlLmZyaWVuZHMgPSBbXG4gICAgICAgICAge25hbWU6J0pvaG4nLCBhZ2U6MjUsIGdlbmRlcjonYm95J30sXG4gICAgICAgICAge25hbWU6J0plc3NpZScsIGFnZTozMCwgZ2VuZGVyOidnaXJsJ30sXG4gICAgICAgICAge25hbWU6J0pvaGFubmEnLCBhZ2U6MjgsIGdlbmRlcjonZ2lybCd9LFxuICAgICAgICAgIHtuYW1lOidKb3knLCBhZ2U6MTUsIGdlbmRlcjonZ2lybCd9LFxuICAgICAgICAgIHtuYW1lOidNYXJ5JywgYWdlOjI4LCBnZW5kZXI6J2dpcmwnfSxcbiAgICAgICAgICB7bmFtZTonUGV0ZXInLCBhZ2U6OTUsIGdlbmRlcjonYm95J30sXG4gICAgICAgICAge25hbWU6J1NlYmFzdGlhbicsIGFnZTo1MCwgZ2VuZGVyOidib3knfSxcbiAgICAgICAgICB7bmFtZTonRXJpa2EnLCBhZ2U6MjcsIGdlbmRlcjonZ2lybCd9LFxuICAgICAgICAgIHtuYW1lOidQYXRyaWNrJywgYWdlOjQwLCBnZW5kZXI6J2JveSd9LFxuICAgICAgICAgIHtuYW1lOidTYW1hbnRoYScsIGFnZTo2MCwgZ2VuZGVyOidnaXJsJ31cbiAgICAgICAgXTtcbiAgICAgIH0pO1xuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwiYW5pbWF0aW9ucy5jc3NcIj5cbiAgICAgIC5leGFtcGxlLWFuaW1hdGUtY29udGFpbmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDp3aGl0ZTtcbiAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjaztcbiAgICAgICAgbGlzdC1zdHlsZTpub25lO1xuICAgICAgICBtYXJnaW46MDtcbiAgICAgICAgcGFkZGluZzowIDEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5hbmltYXRlLXJlcGVhdCB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OjMwcHg7XG4gICAgICAgIGxpc3Qtc3R5bGU6bm9uZTtcbiAgICAgICAgYm94LXNpemluZzpib3JkZXItYm94O1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbW92ZSxcbiAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1lbnRlcixcbiAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1sZWF2ZSB7XG4gICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzO1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbGVhdmUubmctbGVhdmUtYWN0aXZlLFxuICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUsXG4gICAgICAuYW5pbWF0ZS1yZXBlYXQubmctZW50ZXIge1xuICAgICAgICBvcGFjaXR5OjA7XG4gICAgICAgIG1heC1oZWlnaHQ6MDtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWxlYXZlLFxuICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUubmctbW92ZS1hY3RpdmUsXG4gICAgICAuYW5pbWF0ZS1yZXBlYXQubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgICAgICBtYXgtaGVpZ2h0OjMwcHg7XG4gICAgICB9XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgIHZhciBmcmllbmRzID0gZWxlbWVudC5hbGwoYnkucmVwZWF0ZXIoJ2ZyaWVuZCBpbiBmcmllbmRzJykpO1xuXG4gICAgICBpdCgnc2hvdWxkIHJlbmRlciBpbml0aWFsIGRhdGEgc2V0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMTApO1xuICAgICAgICBleHBlY3QoZnJpZW5kcy5nZXQoMCkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMV0gSm9obiB3aG8gaXMgMjUgeWVhcnMgb2xkLicpO1xuICAgICAgICBleHBlY3QoZnJpZW5kcy5nZXQoMSkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMl0gSmVzc2llIHdobyBpcyAzMCB5ZWFycyBvbGQuJyk7XG4gICAgICAgIGV4cGVjdChmcmllbmRzLmxhc3QoKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1sxMF0gU2FtYW50aGEgd2hvIGlzIDYwIHllYXJzIG9sZC4nKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnZnJpZW5kcy5sZW5ndGgnKSkuZ2V0VGV4dCgpKVxuICAgICAgICAgICAgLnRvTWF0Y2goXCJJIGhhdmUgMTAgZnJpZW5kcy4gVGhleSBhcmU6XCIpO1xuICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSByZXBlYXRlciB3aGVuIGZpbHRlciBwcmVkaWNhdGUgY2hhbmdlcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGZyaWVuZHMuY291bnQoKSkudG9CZSgxMCk7XG5cbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3EnKSkuc2VuZEtleXMoJ21hJyk7XG5cbiAgICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMik7XG4gICAgICAgICBleHBlY3QoZnJpZW5kcy5nZXQoMCkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMV0gTWFyeSB3aG8gaXMgMjggeWVhcnMgb2xkLicpO1xuICAgICAgICAgZXhwZWN0KGZyaWVuZHMubGFzdCgpLmdldFRleHQoKSkudG9FcXVhbCgnWzJdIFNhbWFudGhhIHdobyBpcyA2MCB5ZWFycyBvbGQuJyk7XG4gICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICovXG52YXIgbmdSZXBlYXREaXJlY3RpdmUgPSBbJyRwYXJzZScsICckYW5pbWF0ZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRwYXJzZSwgJGFuaW1hdGUsICRjb21waWxlKSB7XG4gIHZhciBOR19SRU1PVkVEID0gJyQkTkdfUkVNT1ZFRCc7XG4gIHZhciBuZ1JlcGVhdE1pbkVyciA9IG1pbkVycignbmdSZXBlYXQnKTtcblxuICB2YXIgdXBkYXRlU2NvcGUgPSBmdW5jdGlvbihzY29wZSwgaW5kZXgsIHZhbHVlSWRlbnRpZmllciwgdmFsdWUsIGtleUlkZW50aWZpZXIsIGtleSwgYXJyYXlMZW5ndGgpIHtcbiAgICAvLyBUT0RPKHBlcmYpOiBnZW5lcmF0ZSBzZXR0ZXJzIHRvIHNoYXZlIG9mZiB+NDBtcyBvciAxLTEuNSVcbiAgICBzY29wZVt2YWx1ZUlkZW50aWZpZXJdID0gdmFsdWU7XG4gICAgaWYgKGtleUlkZW50aWZpZXIpIHNjb3BlW2tleUlkZW50aWZpZXJdID0ga2V5O1xuICAgIHNjb3BlLiRpbmRleCA9IGluZGV4O1xuICAgIHNjb3BlLiRmaXJzdCA9IChpbmRleCA9PT0gMCk7XG4gICAgc2NvcGUuJGxhc3QgPSAoaW5kZXggPT09IChhcnJheUxlbmd0aCAtIDEpKTtcbiAgICBzY29wZS4kbWlkZGxlID0gIShzY29wZS4kZmlyc3QgfHwgc2NvcGUuJGxhc3QpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgc2NvcGUuJG9kZCA9ICEoc2NvcGUuJGV2ZW4gPSAoaW5kZXggJiAxKSA9PT0gMCk7XG4gIH07XG5cbiAgdmFyIGdldEJsb2NrU3RhcnQgPSBmdW5jdGlvbihibG9jaykge1xuICAgIHJldHVybiBibG9jay5jbG9uZVswXTtcbiAgfTtcblxuICB2YXIgZ2V0QmxvY2tFbmQgPSBmdW5jdGlvbihibG9jaykge1xuICAgIHJldHVybiBibG9jay5jbG9uZVtibG9jay5jbG9uZS5sZW5ndGggLSAxXTtcbiAgfTtcblxuXG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICBtdWx0aUVsZW1lbnQ6IHRydWUsXG4gICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLFxuICAgIHByaW9yaXR5OiAxMDAwLFxuICAgIHRlcm1pbmFsOiB0cnVlLFxuICAgICQkdGxiOiB0cnVlLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nUmVwZWF0Q29tcGlsZSgkZWxlbWVudCwgJGF0dHIpIHtcbiAgICAgIHZhciBleHByZXNzaW9uID0gJGF0dHIubmdSZXBlYXQ7XG4gICAgICB2YXIgbmdSZXBlYXRFbmRDb21tZW50ID0gJGNvbXBpbGUuJCRjcmVhdGVDb21tZW50KCdlbmQgbmdSZXBlYXQnLCBleHByZXNzaW9uKTtcblxuICAgICAgdmFyIG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaCgvXlxccyooW1xcc1xcU10rPylcXHMraW5cXHMrKFtcXHNcXFNdKz8pKD86XFxzK2FzXFxzKyhbXFxzXFxTXSs/KSk/KD86XFxzK3RyYWNrXFxzK2J5XFxzKyhbXFxzXFxTXSs/KSk/XFxzKiQvKTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZ1JlcGVhdE1pbkVycignaWV4cCcsICdFeHBlY3RlZCBleHByZXNzaW9uIGluIGZvcm0gb2YgXFwnX2l0ZW1fIGluIF9jb2xsZWN0aW9uX1sgdHJhY2sgYnkgX2lkX11cXCcgYnV0IGdvdCBcXCd7MH1cXCcuJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGhzID0gbWF0Y2hbMV07XG4gICAgICB2YXIgcmhzID0gbWF0Y2hbMl07XG4gICAgICB2YXIgYWxpYXNBcyA9IG1hdGNoWzNdO1xuICAgICAgdmFyIHRyYWNrQnlFeHAgPSBtYXRjaFs0XTtcblxuICAgICAgbWF0Y2ggPSBsaHMubWF0Y2goL14oPzooXFxzKlskXFx3XSspfFxcKFxccyooWyRcXHddKylcXHMqLFxccyooWyRcXHddKylcXHMqXFwpKSQvKTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZ1JlcGVhdE1pbkVycignaWlkZXhwJywgJ1xcJ19pdGVtX1xcJyBpbiBcXCdfaXRlbV8gaW4gX2NvbGxlY3Rpb25fXFwnIHNob3VsZCBiZSBhbiBpZGVudGlmaWVyIG9yIFxcJyhfa2V5XywgX3ZhbHVlXylcXCcgZXhwcmVzc2lvbiwgYnV0IGdvdCBcXCd7MH1cXCcuJyxcbiAgICAgICAgICAgIGxocyk7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWVJZGVudGlmaWVyID0gbWF0Y2hbM10gfHwgbWF0Y2hbMV07XG4gICAgICB2YXIga2V5SWRlbnRpZmllciA9IG1hdGNoWzJdO1xuXG4gICAgICBpZiAoYWxpYXNBcyAmJiAoIS9eWyRhLXpBLVpfXVskYS16QS1aMC05X10qJC8udGVzdChhbGlhc0FzKSB8fFxuICAgICAgICAgIC9eKG51bGx8dW5kZWZpbmVkfHRoaXN8XFwkaW5kZXh8XFwkZmlyc3R8XFwkbWlkZGxlfFxcJGxhc3R8XFwkZXZlbnxcXCRvZGR8XFwkcGFyZW50fFxcJHJvb3R8XFwkaWQpJC8udGVzdChhbGlhc0FzKSkpIHtcbiAgICAgICAgdGhyb3cgbmdSZXBlYXRNaW5FcnIoJ2JhZGlkZW50JywgJ2FsaWFzIFxcJ3swfVxcJyBpcyBpbnZhbGlkIC0tLSBtdXN0IGJlIGEgdmFsaWQgSlMgaWRlbnRpZmllciB3aGljaCBpcyBub3QgYSByZXNlcnZlZCBuYW1lLicsXG4gICAgICAgICAgYWxpYXNBcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0cmFja0J5RXhwR2V0dGVyLCB0cmFja0J5SWRFeHBGbiwgdHJhY2tCeUlkQXJyYXlGbiwgdHJhY2tCeUlkT2JqRm47XG4gICAgICB2YXIgaGFzaEZuTG9jYWxzID0geyRpZDogaGFzaEtleX07XG5cbiAgICAgIGlmICh0cmFja0J5RXhwKSB7XG4gICAgICAgIHRyYWNrQnlFeHBHZXR0ZXIgPSAkcGFyc2UodHJhY2tCeUV4cCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFja0J5SWRBcnJheUZuID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBoYXNoS2V5KHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJhY2tCeUlkT2JqRm4gPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gbmdSZXBlYXRMaW5rKCRzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkge1xuXG4gICAgICAgIGlmICh0cmFja0J5RXhwR2V0dGVyKSB7XG4gICAgICAgICAgdHJhY2tCeUlkRXhwRm4gPSBmdW5jdGlvbihrZXksIHZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgLy8gYXNzaWduIGtleSwgdmFsdWUsIGFuZCAkaW5kZXggdG8gdGhlIGxvY2FscyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gaGFzaCBmdW5jdGlvbnNcbiAgICAgICAgICAgIGlmIChrZXlJZGVudGlmaWVyKSBoYXNoRm5Mb2NhbHNba2V5SWRlbnRpZmllcl0gPSBrZXk7XG4gICAgICAgICAgICBoYXNoRm5Mb2NhbHNbdmFsdWVJZGVudGlmaWVyXSA9IHZhbHVlO1xuICAgICAgICAgICAgaGFzaEZuTG9jYWxzLiRpbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNrQnlFeHBHZXR0ZXIoJHNjb3BlLCBoYXNoRm5Mb2NhbHMpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSBhIGxpc3Qgb2YgZWxlbWVudHMgZnJvbSBwcmV2aW91cyBydW4uIFRoaXMgaXMgYSBoYXNoIHdoZXJlIGtleSBpcyB0aGUgaXRlbSBmcm9tIHRoZVxuICAgICAgICAvLyBpdGVyYXRvciwgYW5kIHRoZSB2YWx1ZSBpcyBvYmplY3RzIHdpdGggZm9sbG93aW5nIHByb3BlcnRpZXMuXG4gICAgICAgIC8vICAgLSBzY29wZTogYm91bmQgc2NvcGVcbiAgICAgICAgLy8gICAtIGVsZW1lbnQ6IHByZXZpb3VzIGVsZW1lbnQuXG4gICAgICAgIC8vICAgLSBpbmRleDogcG9zaXRpb25cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgYXJlIHVzaW5nIG5vLXByb3RvIG9iamVjdCBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCBpbmhlcml0ZWQgcHJvcHMgdmlhXG4gICAgICAgIC8vIGhhc093blByb3BlcnR5LlxuICAgICAgICB2YXIgbGFzdEJsb2NrTWFwID0gY3JlYXRlTWFwKCk7XG5cbiAgICAgICAgLy93YXRjaCBwcm9wc1xuICAgICAgICAkc2NvcGUuJHdhdGNoQ29sbGVjdGlvbihyaHMsIGZ1bmN0aW9uIG5nUmVwZWF0QWN0aW9uKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICB2YXIgaW5kZXgsIGxlbmd0aCxcbiAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gJGVsZW1lbnRbMF0sICAgICAvLyBub2RlIHRoYXQgY2xvbmVkIG5vZGVzIHNob3VsZCBiZSBpbnNlcnRlZCBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIHRvIHRoZSBjb21tZW50IG5vZGUgYW5jaG9yXG4gICAgICAgICAgICAgIG5leHROb2RlLFxuICAgICAgICAgICAgICAvLyBTYW1lIGFzIGxhc3RCbG9ja01hcCBidXQgaXQgaGFzIHRoZSBjdXJyZW50IHN0YXRlLiBJdCB3aWxsIGJlY29tZSB0aGVcbiAgICAgICAgICAgICAgLy8gbGFzdEJsb2NrTWFwIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwID0gY3JlYXRlTWFwKCksXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25MZW5ndGgsXG4gICAgICAgICAgICAgIGtleSwgdmFsdWUsIC8vIGtleS92YWx1ZSBvZiBpdGVyYXRpb25cbiAgICAgICAgICAgICAgdHJhY2tCeUlkLFxuICAgICAgICAgICAgICB0cmFja0J5SWRGbixcbiAgICAgICAgICAgICAgY29sbGVjdGlvbktleXMsXG4gICAgICAgICAgICAgIGJsb2NrLCAgICAgICAvLyBsYXN0IG9iamVjdCBpbmZvcm1hdGlvbiB7c2NvcGUsIGVsZW1lbnQsIGlkfVxuICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlcixcbiAgICAgICAgICAgICAgZWxlbWVudHNUb1JlbW92ZTtcblxuICAgICAgICAgIGlmIChhbGlhc0FzKSB7XG4gICAgICAgICAgICAkc2NvcGVbYWxpYXNBc10gPSBjb2xsZWN0aW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgY29sbGVjdGlvbktleXMgPSBjb2xsZWN0aW9uO1xuICAgICAgICAgICAgdHJhY2tCeUlkRm4gPSB0cmFja0J5SWRFeHBGbiB8fCB0cmFja0J5SWRBcnJheUZuO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmFja0J5SWRGbiA9IHRyYWNrQnlJZEV4cEZuIHx8IHRyYWNrQnlJZE9iakZuO1xuICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBleHRyYWN0IGtleXMsIGluIGVudW1lcmF0aW9uIG9yZGVyLCB1bnNvcnRlZFxuICAgICAgICAgICAgY29sbGVjdGlvbktleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGl0ZW1LZXkgaW4gY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb2xsZWN0aW9uLCBpdGVtS2V5KSAmJiBpdGVtS2V5LmNoYXJBdCgwKSAhPT0gJyQnKSB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbktleXMucHVzaChpdGVtS2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbGxlY3Rpb25MZW5ndGggPSBjb2xsZWN0aW9uS2V5cy5sZW5ndGg7XG4gICAgICAgICAgbmV4dEJsb2NrT3JkZXIgPSBuZXcgQXJyYXkoY29sbGVjdGlvbkxlbmd0aCk7XG5cbiAgICAgICAgICAvLyBsb2NhdGUgZXhpc3RpbmcgaXRlbXNcbiAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb2xsZWN0aW9uTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBrZXkgPSAoY29sbGVjdGlvbiA9PT0gY29sbGVjdGlvbktleXMpID8gaW5kZXggOiBjb2xsZWN0aW9uS2V5c1tpbmRleF07XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbGxlY3Rpb25ba2V5XTtcbiAgICAgICAgICAgIHRyYWNrQnlJZCA9IHRyYWNrQnlJZEZuKGtleSwgdmFsdWUsIGluZGV4KTtcbiAgICAgICAgICAgIGlmIChsYXN0QmxvY2tNYXBbdHJhY2tCeUlkXSkge1xuICAgICAgICAgICAgICAvLyBmb3VuZCBwcmV2aW91c2x5IHNlZW4gYmxvY2tcbiAgICAgICAgICAgICAgYmxvY2sgPSBsYXN0QmxvY2tNYXBbdHJhY2tCeUlkXTtcbiAgICAgICAgICAgICAgZGVsZXRlIGxhc3RCbG9ja01hcFt0cmFja0J5SWRdO1xuICAgICAgICAgICAgICBuZXh0QmxvY2tNYXBbdHJhY2tCeUlkXSA9IGJsb2NrO1xuICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlcltpbmRleF0gPSBibG9jaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dEJsb2NrTWFwW3RyYWNrQnlJZF0pIHtcbiAgICAgICAgICAgICAgLy8gaWYgY29sbGlzaW9uIGRldGVjdGVkLiByZXN0b3JlIGxhc3RCbG9ja01hcCBhbmQgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgICAgICAgZm9yRWFjaChuZXh0QmxvY2tPcmRlciwgZnVuY3Rpb24oYmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sgJiYgYmxvY2suc2NvcGUpIGxhc3RCbG9ja01hcFtibG9jay5pZF0gPSBibG9jaztcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IG5nUmVwZWF0TWluRXJyKCdkdXBlcycsXG4gICAgICAgICAgICAgICAgICAnRHVwbGljYXRlcyBpbiBhIHJlcGVhdGVyIGFyZSBub3QgYWxsb3dlZC4gVXNlIFxcJ3RyYWNrIGJ5XFwnIGV4cHJlc3Npb24gdG8gc3BlY2lmeSB1bmlxdWUga2V5cy4gUmVwZWF0ZXI6IHswfSwgRHVwbGljYXRlIGtleTogezF9LCBEdXBsaWNhdGUgdmFsdWU6IHsyfScsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCB0cmFja0J5SWQsIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG5ldyBuZXZlciBiZWZvcmUgc2VlbiBibG9ja1xuICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlcltpbmRleF0gPSB7aWQ6IHRyYWNrQnlJZCwgc2NvcGU6IHVuZGVmaW5lZCwgY2xvbmU6IHVuZGVmaW5lZH07XG4gICAgICAgICAgICAgIG5leHRCbG9ja01hcFt0cmFja0J5SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyByZW1vdmUgbGVmdG92ZXIgaXRlbXNcbiAgICAgICAgICBmb3IgKHZhciBibG9ja0tleSBpbiBsYXN0QmxvY2tNYXApIHtcbiAgICAgICAgICAgIGJsb2NrID0gbGFzdEJsb2NrTWFwW2Jsb2NrS2V5XTtcbiAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmUgPSBnZXRCbG9ja05vZGVzKGJsb2NrLmNsb25lKTtcbiAgICAgICAgICAgICRhbmltYXRlLmxlYXZlKGVsZW1lbnRzVG9SZW1vdmUpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRzVG9SZW1vdmVbMF0ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCB3YXMgbm90IHJlbW92ZWQgeWV0IGJlY2F1c2Ugb2YgcGVuZGluZyBhbmltYXRpb24sIG1hcmsgaXQgYXMgZGVsZXRlZFxuICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBpZ25vcmUgaXQgbGF0ZXJcbiAgICAgICAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzVG9SZW1vdmUubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmVbaW5kZXhdW05HX1JFTU9WRURdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2suc2NvcGUuJGRlc3Ryb3koKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB3ZSBhcmUgbm90IHVzaW5nIGZvckVhY2ggZm9yIHBlcmYgcmVhc29ucyAodHJ5aW5nIHRvIGF2b2lkICNjYWxsKVxuICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvbGxlY3Rpb25MZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGtleSA9IChjb2xsZWN0aW9uID09PSBjb2xsZWN0aW9uS2V5cykgPyBpbmRleCA6IGNvbGxlY3Rpb25LZXlzW2luZGV4XTtcbiAgICAgICAgICAgIHZhbHVlID0gY29sbGVjdGlvbltrZXldO1xuICAgICAgICAgICAgYmxvY2sgPSBuZXh0QmxvY2tPcmRlcltpbmRleF07XG5cbiAgICAgICAgICAgIGlmIChibG9jay5zY29wZSkge1xuICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIG9iamVjdCwgdGhlbiB3ZSBuZWVkIHRvIHJldXNlIHRoZVxuICAgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHNjb3BlL2VsZW1lbnRcblxuICAgICAgICAgICAgICBuZXh0Tm9kZSA9IHByZXZpb3VzTm9kZTtcblxuICAgICAgICAgICAgICAvLyBza2lwIG5vZGVzIHRoYXQgYXJlIGFscmVhZHkgcGVuZGluZyByZW1vdmFsIHZpYSBsZWF2ZSBhbmltYXRpb25cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKG5leHROb2RlICYmIG5leHROb2RlW05HX1JFTU9WRURdKTtcblxuICAgICAgICAgICAgICBpZiAoZ2V0QmxvY2tTdGFydChibG9jaykgIT09IG5leHROb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgaXRlbSB3aGljaCBnb3QgbW92ZWRcbiAgICAgICAgICAgICAgICAkYW5pbWF0ZS5tb3ZlKGdldEJsb2NrTm9kZXMoYmxvY2suY2xvbmUpLCBudWxsLCBwcmV2aW91c05vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IGdldEJsb2NrRW5kKGJsb2NrKTtcbiAgICAgICAgICAgICAgdXBkYXRlU2NvcGUoYmxvY2suc2NvcGUsIGluZGV4LCB2YWx1ZUlkZW50aWZpZXIsIHZhbHVlLCBrZXlJZGVudGlmaWVyLCBrZXksIGNvbGxlY3Rpb25MZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbmV3IGl0ZW0gd2hpY2ggd2UgZG9uJ3Qga25vdyBhYm91dFxuICAgICAgICAgICAgICAkdHJhbnNjbHVkZShmdW5jdGlvbiBuZ1JlcGVhdFRyYW5zY2x1ZGUoY2xvbmUsIHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgYmxvY2suc2NvcGUgPSBzY29wZTtcbiAgICAgICAgICAgICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jbG9uZS12cy1jcmVhdGVjb21tZW50XG4gICAgICAgICAgICAgICAgdmFyIGVuZE5vZGUgPSBuZ1JlcGVhdEVuZENvbW1lbnQuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjbG9uZVtjbG9uZS5sZW5ndGgrK10gPSBlbmROb2RlO1xuXG4gICAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2xvbmUsIG51bGwsIHByZXZpb3VzTm9kZSk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gZW5kTm9kZTtcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBvbmx5IG5lZWQgdGhlIGZpcnN0L2xhc3Qgbm9kZSBvZiB0aGUgY2xvbmVkIG5vZGVzLlxuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBqcWxpdGUgd3JhcHBlciBhcyBpdCBtaWdodCBiZSBjaGFuZ2VkIGxhdGVyXG4gICAgICAgICAgICAgICAgLy8gYnkgYSBkaXJlY3RpdmUgd2l0aCB0ZW1wbGF0ZVVybCB3aGVuIGl0cyB0ZW1wbGF0ZSBhcnJpdmVzLlxuICAgICAgICAgICAgICAgIGJsb2NrLmNsb25lID0gY2xvbmU7XG4gICAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwW2Jsb2NrLmlkXSA9IGJsb2NrO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNjb3BlKGJsb2NrLnNjb3BlLCBpbmRleCwgdmFsdWVJZGVudGlmaWVyLCB2YWx1ZSwga2V5SWRlbnRpZmllciwga2V5LCBjb2xsZWN0aW9uTGVuZ3RoKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxhc3RCbG9ja01hcCA9IG5leHRCbG9ja01hcDtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1dO1xuXG52YXIgTkdfSElERV9DTEFTUyA9ICduZy1oaWRlJztcbnZhciBOR19ISURFX0lOX1BST0dSRVNTX0NMQVNTID0gJ25nLWhpZGUtYW5pbWF0ZSc7XG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nU2hvd1xuICogQG11bHRpRWxlbWVudFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ1Nob3dgIGRpcmVjdGl2ZSBzaG93cyBvciBoaWRlcyB0aGUgZ2l2ZW4gSFRNTCBlbGVtZW50IGJhc2VkIG9uIHRoZSBleHByZXNzaW9uXG4gKiBwcm92aWRlZCB0byB0aGUgYG5nU2hvd2AgYXR0cmlidXRlLiBUaGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gYnkgcmVtb3Zpbmcgb3IgYWRkaW5nXG4gKiB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3Mgb250byB0aGUgZWxlbWVudC4gVGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIHByZWRlZmluZWRcbiAqIGluIEFuZ3VsYXJKUyBhbmQgc2V0cyB0aGUgZGlzcGxheSBzdHlsZSB0byBub25lICh1c2luZyBhbiAhaW1wb3J0YW50IGZsYWcpLlxuICogRm9yIENTUCBtb2RlIHBsZWFzZSBhZGQgYGFuZ3VsYXItY3NwLmNzc2AgdG8geW91ciBodG1sIGZpbGUgKHNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ3NwIG5nQ3NwfSkuXG4gKlxuICogYGBgaHRtbFxuICogPCEtLSB3aGVuICRzY29wZS5teVZhbHVlIGlzIHRydXRoeSAoZWxlbWVudCBpcyB2aXNpYmxlKSAtLT5cbiAqIDxkaXYgbmctc2hvdz1cIm15VmFsdWVcIj48L2Rpdj5cbiAqXG4gKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgZmFsc3kgKGVsZW1lbnQgaXMgaGlkZGVuKSAtLT5cbiAqIDxkaXYgbmctc2hvdz1cIm15VmFsdWVcIiBjbGFzcz1cIm5nLWhpZGVcIj48L2Rpdj5cbiAqIGBgYFxuICpcbiAqIFdoZW4gdGhlIGBuZ1Nob3dgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgZmFsc3kgdmFsdWUgdGhlbiB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIGNsYXNzXG4gKiBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgY2F1c2luZyBpdCB0byBiZWNvbWUgaGlkZGVuLiBXaGVuIHRydXRoeSwgdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIHJlbW92ZWRcbiAqIGZyb20gdGhlIGVsZW1lbnQgY2F1c2luZyB0aGUgZWxlbWVudCBub3QgdG8gYXBwZWFyIGhpZGRlbi5cbiAqXG4gKiAjIyBXaHkgaXMgIWltcG9ydGFudCB1c2VkP1xuICpcbiAqIFlvdSBtYXkgYmUgd29uZGVyaW5nIHdoeSAhaW1wb3J0YW50IGlzIHVzZWQgZm9yIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBgLm5nLWhpZGVgIHNlbGVjdG9yXG4gKiBjYW4gYmUgZWFzaWx5IG92ZXJyaWRkZW4gYnkgaGVhdmllciBzZWxlY3RvcnMuIEZvciBleGFtcGxlLCBzb21ldGhpbmcgYXMgc2ltcGxlXG4gKiBhcyBjaGFuZ2luZyB0aGUgZGlzcGxheSBzdHlsZSBvbiBhIEhUTUwgbGlzdCBpdGVtIHdvdWxkIG1ha2UgaGlkZGVuIGVsZW1lbnRzIGFwcGVhciB2aXNpYmxlLlxuICogVGhpcyBhbHNvIGJlY29tZXMgYSBiaWdnZXIgaXNzdWUgd2hlbiBkZWFsaW5nIHdpdGggQ1NTIGZyYW1ld29ya3MuXG4gKlxuICogQnkgdXNpbmcgIWltcG9ydGFudCwgdGhlIHNob3cgYW5kIGhpZGUgYmVoYXZpb3Igd2lsbCB3b3JrIGFzIGV4cGVjdGVkIGRlc3BpdGUgYW55IGNsYXNoIGJldHdlZW4gQ1NTIHNlbGVjdG9yXG4gKiBzcGVjaWZpY2l0eSAod2hlbiAhaW1wb3J0YW50IGlzbid0IHVzZWQgd2l0aCBhbnkgY29uZmxpY3Rpbmcgc3R5bGVzKS4gSWYgYSBkZXZlbG9wZXIgY2hvb3NlcyB0byBvdmVycmlkZSB0aGVcbiAqIHN0eWxpbmcgdG8gY2hhbmdlIGhvdyB0byBoaWRlIGFuIGVsZW1lbnQgdGhlbiBpdCBpcyBqdXN0IGEgbWF0dGVyIG9mIHVzaW5nICFpbXBvcnRhbnQgaW4gdGhlaXIgb3duIENTUyBjb2RlLlxuICpcbiAqICMjIyBPdmVycmlkaW5nIGAubmctaGlkZWBcbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGUgYC5uZy1oaWRlYCBjbGFzcyB3aWxsIHN0eWxlIHRoZSBlbGVtZW50IHdpdGggYGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50YC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlXG4gKiB0aGUgaGlkZSBiZWhhdmlvciB3aXRoIG5nU2hvdy9uZ0hpZGUgdGhlbiB0aGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXN0YXRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIGAubmctaGlkZWBcbiAqIGNsYXNzIENTUy4gTm90ZSB0aGF0IHRoZSBzZWxlY3RvciB0aGF0IG5lZWRzIHRvIGJlIHVzZWQgaXMgYWN0dWFsbHkgYC5uZy1oaWRlOm5vdCgubmctaGlkZS1hbmltYXRlKWAgdG8gY29wZVxuICogd2l0aCBleHRyYSBhbmltYXRpb24gY2xhc3NlcyB0aGF0IGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBgYGBjc3NcbiAqIC5uZy1oaWRlOm5vdCgubmctaGlkZS1hbmltYXRlKSB7XG4gKiAgIC8mIzQyOyB0aGlzIGlzIGp1c3QgYW5vdGhlciBmb3JtIG9mIGhpZGluZyBhbiBlbGVtZW50ICYjNDI7L1xuICogICBkaXNwbGF5OiBibG9jayFpbXBvcnRhbnQ7XG4gKiAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAqICAgdG9wOiAtOTk5OXB4O1xuICogICBsZWZ0OiAtOTk5OXB4O1xuICogfVxuICogYGBgXG4gKlxuICogQnkgZGVmYXVsdCB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBpbiBDU1MgYW55dGhpbmcgYW5kIHRoZSBhbmltYXRpb25zIHdpbGwgd29yayBhcm91bmQgdGhlIGRpc3BsYXkgc3R5bGUuXG4gKlxuICogIyMgQSBub3RlIGFib3V0IGFuaW1hdGlvbnMgd2l0aCBgbmdTaG93YFxuICpcbiAqIEFuaW1hdGlvbnMgaW4gbmdTaG93L25nSGlkZSB3b3JrIHdpdGggdGhlIHNob3cgYW5kIGhpZGUgZXZlbnRzIHRoYXQgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBkaXJlY3RpdmUgZXhwcmVzc2lvblxuICogaXMgdHJ1ZSBhbmQgZmFsc2UuIFRoaXMgc3lzdGVtIHdvcmtzIGxpa2UgdGhlIGFuaW1hdGlvbiBzeXN0ZW0gcHJlc2VudCB3aXRoIG5nQ2xhc3MgZXhjZXB0IHRoYXRcbiAqIHlvdSBtdXN0IGFsc28gaW5jbHVkZSB0aGUgIWltcG9ydGFudCBmbGFnIHRvIG92ZXJyaWRlIHRoZSBkaXNwbGF5IHByb3BlcnR5XG4gKiBzbyB0aGF0IHlvdSBjYW4gcGVyZm9ybSBhbiBhbmltYXRpb24gd2hlbiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gZHVyaW5nIHRoZSB0aW1lIG9mIHRoZSBhbmltYXRpb24uXG4gKlxuICogYGBgY3NzXG4gKiAvL1xuICogLy9hIHdvcmtpbmcgZXhhbXBsZSBjYW4gYmUgZm91bmQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHBhZ2VcbiAqIC8vXG4gKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZCwgLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUge1xuICogICAvJiM0MjsgdGhpcyBpcyByZXF1aXJlZCBhcyBvZiAxLjN4IHRvIHByb3Blcmx5XG4gKiAgICAgIGFwcGx5IGFsbCBzdHlsaW5nIGluIGEgc2hvdy9oaWRlIGFuaW1hdGlvbiAmIzQyOy9cbiAqICAgdHJhbnNpdGlvbjogMHMgbGluZWFyIGFsbDtcbiAqIH1cbiAqXG4gKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZC1hY3RpdmUsXG4gKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZS1hY3RpdmUge1xuICogICAvJiM0MjsgdGhlIHRyYW5zaXRpb24gaXMgZGVmaW5lZCBpbiB0aGUgYWN0aXZlIGNsYXNzICYjNDI7L1xuICogICB0cmFuc2l0aW9uOiAxcyBsaW5lYXIgYWxsO1xuICogfVxuICpcbiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkIHsgLi4uIH1cbiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLm5nLWhpZGUtYWRkLWFjdGl2ZSB7IC4uLiB9XG4gKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7IC4uLiB9XG4gKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZS5uZy1oaWRlLXJlbW92ZS1hY3RpdmUgeyAuLi4gfVxuICogYGBgXG4gKlxuICogS2VlcCBpbiBtaW5kIHRoYXQsIGFzIG9mIEFuZ3VsYXJKUyB2ZXJzaW9uIDEuMywgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXlcbiAqIHByb3BlcnR5IHRvIGJsb2NrIGR1cmluZyBhbmltYXRpb24gc3RhdGVzLS1uZ0FuaW1hdGUgd2lsbCBoYW5kbGUgdGhlIHN0eWxlIHRvZ2dsaW5nIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS5cbiAqXG4gKiBAYW5pbWF0aW9uc1xuICogfCBBbmltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IE9jY3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHtAbGluayAkYW5pbWF0ZSNhZGRDbGFzcyBhZGRDbGFzc30gYC5uZy1oaWRlYCAgfCBhZnRlciB0aGUgYG5nU2hvd2AgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBub24gdHJ1dGh5IHZhbHVlIGFuZCBqdXN0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCB0byBoaWRkZW4gfFxuICogfCB7QGxpbmsgJGFuaW1hdGUjcmVtb3ZlQ2xhc3MgcmVtb3ZlQ2xhc3N9ICBgLm5nLWhpZGVgICB8IGFmdGVyIHRoZSBgbmdTaG93YCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZSBhbmQganVzdCBiZWZvcmUgY29udGVudHMgYXJlIHNldCB0byB2aXNpYmxlIHxcbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTaG93IElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHlcbiAqICAgICB0aGVuIHRoZSBlbGVtZW50IGlzIHNob3duIG9yIGhpZGRlbiByZXNwZWN0aXZlbHkuXG4gKlxuICogQGV4YW1wbGVcbiAgPGV4YW1wbGUgbW9kdWxlPVwibmdBbmltYXRlXCIgZGVwcz1cImFuZ3VsYXItYW5pbWF0ZS5qc1wiIGFuaW1hdGlvbnM9XCJ0cnVlXCIgbmFtZT1cIm5nLXNob3dcIj5cbiAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgQ2xpY2sgbWU6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImNoZWNrZWRcIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIG5nSGlkZVwiPjxici8+XG4gICAgICA8ZGl2PlxuICAgICAgICBTaG93OlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2stZWxlbWVudCBhbmltYXRlLXNob3dcIiBuZy1zaG93PVwiY2hlY2tlZFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi10aHVtYnMtdXBcIj48L3NwYW4+IEkgc2hvdyB1cCB3aGVuIHlvdXIgY2hlY2tib3ggaXMgY2hlY2tlZC5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIEhpZGU6XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGVjay1lbGVtZW50IGFuaW1hdGUtc2hvd1wiIG5nLWhpZGU9XCJjaGVja2VkXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRodW1icy1kb3duXCI+PC9zcGFuPiBJIGhpZGUgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJnbHlwaGljb25zLmNzc1wiPlxuICAgICAgQGltcG9ydCB1cmwoLi4vLi4vY29tcG9uZW50cy9ib290c3RyYXAtMy4xLjEvY3NzL2Jvb3RzdHJhcC5jc3MpO1xuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwiYW5pbWF0aW9ucy5jc3NcIj5cbiAgICAgIC5hbmltYXRlLXNob3cge1xuICAgICAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUtYWRkLCAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUtcmVtb3ZlIHtcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIGxpbmVhciAwLjVzO1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUge1xuICAgICAgICBsaW5lLWhlaWdodDogMDtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgcGFkZGluZzogMCAxMHB4O1xuICAgICAgfVxuXG4gICAgICAuY2hlY2stZWxlbWVudCB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIH1cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHRodW1ic1VwID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZ2x5cGhpY29uLXRodW1icy11cCcpKTtcbiAgICAgIHZhciB0aHVtYnNEb3duID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZ2x5cGhpY29uLXRodW1icy1kb3duJykpO1xuXG4gICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLXNob3cgLyBuZy1oaWRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh0aHVtYnNVcC5pc0Rpc3BsYXllZCgpKS50b0JlRmFsc3koKTtcbiAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZVRydXRoeSgpO1xuXG4gICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2NoZWNrZWQnKSkuY2xpY2soKTtcblxuICAgICAgICBleHBlY3QodGh1bWJzVXAuaXNEaXNwbGF5ZWQoKSkudG9CZVRydXRoeSgpO1xuICAgICAgICBleHBlY3QodGh1bWJzRG93bi5pc0Rpc3BsYXllZCgpKS50b0JlRmFsc3koKTtcbiAgICAgIH0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG52YXIgbmdTaG93RGlyZWN0aXZlID0gWyckYW5pbWF0ZScsIGZ1bmN0aW9uKCRhbmltYXRlKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICBtdWx0aUVsZW1lbnQ6IHRydWUsXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgIHNjb3BlLiR3YXRjaChhdHRyLm5nU2hvdywgZnVuY3Rpb24gbmdTaG93V2F0Y2hBY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gd2UncmUgYWRkaW5nIGEgdGVtcG9yYXJ5LCBhbmltYXRpb24tc3BlY2lmaWMgY2xhc3MgZm9yIG5nLWhpZGUgc2luY2UgdGhpcyB3YXlcbiAgICAgICAgLy8gd2UgY2FuIGNvbnRyb2wgd2hlbiB0aGUgZWxlbWVudCBpcyBhY3R1YWxseSBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhvdXQgaGF2aW5nXG4gICAgICAgIC8vIHRvIGhhdmUgYSBnbG9iYWwvZ3JlZWR5IENTUyBzZWxlY3RvciB0aGF0IGJyZWFrcyB3aGVuIG90aGVyIGFuaW1hdGlvbnMgYXJlIHJ1bi5cbiAgICAgICAgLy8gUmVhZDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvOTEwMyNpc3N1ZWNvbW1lbnQtNTgzMzU4NDVcbiAgICAgICAgJGFuaW1hdGVbdmFsdWUgPyAncmVtb3ZlQ2xhc3MnIDogJ2FkZENsYXNzJ10oZWxlbWVudCwgTkdfSElERV9DTEFTUywge1xuICAgICAgICAgIHRlbXBDbGFzc2VzOiBOR19ISURFX0lOX1BST0dSRVNTX0NMQVNTXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufV07XG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0hpZGVcbiAqIEBtdWx0aUVsZW1lbnRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdIaWRlYCBkaXJlY3RpdmUgc2hvd3Mgb3IgaGlkZXMgdGhlIGdpdmVuIEhUTUwgZWxlbWVudCBiYXNlZCBvbiB0aGUgZXhwcmVzc2lvblxuICogcHJvdmlkZWQgdG8gdGhlIGBuZ0hpZGVgIGF0dHJpYnV0ZS4gVGhlIGVsZW1lbnQgaXMgc2hvd24gb3IgaGlkZGVuIGJ5IHJlbW92aW5nIG9yIGFkZGluZ1xuICogdGhlIGBuZy1oaWRlYCBDU1MgY2xhc3Mgb250byB0aGUgZWxlbWVudC4gVGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIHByZWRlZmluZWRcbiAqIGluIEFuZ3VsYXJKUyBhbmQgc2V0cyB0aGUgZGlzcGxheSBzdHlsZSB0byBub25lICh1c2luZyBhbiAhaW1wb3J0YW50IGZsYWcpLlxuICogRm9yIENTUCBtb2RlIHBsZWFzZSBhZGQgYGFuZ3VsYXItY3NwLmNzc2AgdG8geW91ciBodG1sIGZpbGUgKHNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ3NwIG5nQ3NwfSkuXG4gKlxuICogYGBgaHRtbFxuICogPCEtLSB3aGVuICRzY29wZS5teVZhbHVlIGlzIHRydXRoeSAoZWxlbWVudCBpcyBoaWRkZW4pIC0tPlxuICogPGRpdiBuZy1oaWRlPVwibXlWYWx1ZVwiIGNsYXNzPVwibmctaGlkZVwiPjwvZGl2PlxuICpcbiAqIDwhLS0gd2hlbiAkc2NvcGUubXlWYWx1ZSBpcyBmYWxzeSAoZWxlbWVudCBpcyB2aXNpYmxlKSAtLT5cbiAqIDxkaXYgbmctaGlkZT1cIm15VmFsdWVcIj48L2Rpdj5cbiAqIGBgYFxuICpcbiAqIFdoZW4gdGhlIGBuZ0hpZGVgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlIHRoZW4gdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBjbGFzc1xuICogYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGNhdXNpbmcgaXQgdG8gYmVjb21lIGhpZGRlbi4gV2hlbiBmYWxzeSwgdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIHJlbW92ZWRcbiAqIGZyb20gdGhlIGVsZW1lbnQgY2F1c2luZyB0aGUgZWxlbWVudCBub3QgdG8gYXBwZWFyIGhpZGRlbi5cbiAqXG4gKiAjIyBXaHkgaXMgIWltcG9ydGFudCB1c2VkP1xuICpcbiAqIFlvdSBtYXkgYmUgd29uZGVyaW5nIHdoeSAhaW1wb3J0YW50IGlzIHVzZWQgZm9yIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBgLm5nLWhpZGVgIHNlbGVjdG9yXG4gKiBjYW4gYmUgZWFzaWx5IG92ZXJyaWRkZW4gYnkgaGVhdmllciBzZWxlY3RvcnMuIEZvciBleGFtcGxlLCBzb21ldGhpbmcgYXMgc2ltcGxlXG4gKiBhcyBjaGFuZ2luZyB0aGUgZGlzcGxheSBzdHlsZSBvbiBhIEhUTUwgbGlzdCBpdGVtIHdvdWxkIG1ha2UgaGlkZGVuIGVsZW1lbnRzIGFwcGVhciB2aXNpYmxlLlxuICogVGhpcyBhbHNvIGJlY29tZXMgYSBiaWdnZXIgaXNzdWUgd2hlbiBkZWFsaW5nIHdpdGggQ1NTIGZyYW1ld29ya3MuXG4gKlxuICogQnkgdXNpbmcgIWltcG9ydGFudCwgdGhlIHNob3cgYW5kIGhpZGUgYmVoYXZpb3Igd2lsbCB3b3JrIGFzIGV4cGVjdGVkIGRlc3BpdGUgYW55IGNsYXNoIGJldHdlZW4gQ1NTIHNlbGVjdG9yXG4gKiBzcGVjaWZpY2l0eSAod2hlbiAhaW1wb3J0YW50IGlzbid0IHVzZWQgd2l0aCBhbnkgY29uZmxpY3Rpbmcgc3R5bGVzKS4gSWYgYSBkZXZlbG9wZXIgY2hvb3NlcyB0byBvdmVycmlkZSB0aGVcbiAqIHN0eWxpbmcgdG8gY2hhbmdlIGhvdyB0byBoaWRlIGFuIGVsZW1lbnQgdGhlbiBpdCBpcyBqdXN0IGEgbWF0dGVyIG9mIHVzaW5nICFpbXBvcnRhbnQgaW4gdGhlaXIgb3duIENTUyBjb2RlLlxuICpcbiAqICMjIyBPdmVycmlkaW5nIGAubmctaGlkZWBcbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGUgYC5uZy1oaWRlYCBjbGFzcyB3aWxsIHN0eWxlIHRoZSBlbGVtZW50IHdpdGggYGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50YC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlXG4gKiB0aGUgaGlkZSBiZWhhdmlvciB3aXRoIG5nU2hvdy9uZ0hpZGUgdGhlbiB0aGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXN0YXRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIGAubmctaGlkZWBcbiAqIGNsYXNzIGluIENTUzpcbiAqXG4gKiBgYGBjc3NcbiAqIC5uZy1oaWRlIHtcbiAqICAgLyYjNDI7IHRoaXMgaXMganVzdCBhbm90aGVyIGZvcm0gb2YgaGlkaW5nIGFuIGVsZW1lbnQgJiM0MjsvXG4gKiAgIGRpc3BsYXk6IGJsb2NrIWltcG9ydGFudDtcbiAqICAgcG9zaXRpb246IGFic29sdXRlO1xuICogICB0b3A6IC05OTk5cHg7XG4gKiAgIGxlZnQ6IC05OTk5cHg7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBCeSBkZWZhdWx0IHlvdSBkb24ndCBuZWVkIHRvIG92ZXJyaWRlIGluIENTUyBhbnl0aGluZyBhbmQgdGhlIGFuaW1hdGlvbnMgd2lsbCB3b3JrIGFyb3VuZCB0aGUgZGlzcGxheSBzdHlsZS5cbiAqXG4gKiAjIyBBIG5vdGUgYWJvdXQgYW5pbWF0aW9ucyB3aXRoIGBuZ0hpZGVgXG4gKlxuICogQW5pbWF0aW9ucyBpbiBuZ1Nob3cvbmdIaWRlIHdvcmsgd2l0aCB0aGUgc2hvdyBhbmQgaGlkZSBldmVudHMgdGhhdCBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRpcmVjdGl2ZSBleHByZXNzaW9uXG4gKiBpcyB0cnVlIGFuZCBmYWxzZS4gVGhpcyBzeXN0ZW0gd29ya3MgbGlrZSB0aGUgYW5pbWF0aW9uIHN5c3RlbSBwcmVzZW50IHdpdGggbmdDbGFzcywgZXhjZXB0IHRoYXQgdGhlIGAubmctaGlkZWBcbiAqIENTUyBjbGFzcyBpcyBhZGRlZCBhbmQgcmVtb3ZlZCBmb3IgeW91IGluc3RlYWQgb2YgeW91ciBvd24gQ1NTIGNsYXNzLlxuICpcbiAqIGBgYGNzc1xuICogLy9cbiAqIC8vYSB3b3JraW5nIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBwYWdlXG4gKiAvL1xuICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQsIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlIHtcbiAqICAgdHJhbnNpdGlvbjogMC41cyBsaW5lYXIgYWxsO1xuICogfVxuICpcbiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkIHsgLi4uIH1cbiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLm5nLWhpZGUtYWRkLWFjdGl2ZSB7IC4uLiB9XG4gKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7IC4uLiB9XG4gKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZS5uZy1oaWRlLXJlbW92ZS1hY3RpdmUgeyAuLi4gfVxuICogYGBgXG4gKlxuICogS2VlcCBpbiBtaW5kIHRoYXQsIGFzIG9mIEFuZ3VsYXJKUyB2ZXJzaW9uIDEuMywgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXlcbiAqIHByb3BlcnR5IHRvIGJsb2NrIGR1cmluZyBhbmltYXRpb24gc3RhdGVzLS1uZ0FuaW1hdGUgd2lsbCBoYW5kbGUgdGhlIHN0eWxlIHRvZ2dsaW5nIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS5cbiAqXG4gKiBAYW5pbWF0aW9uc1xuICogfCBBbmltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IE9jY3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHtAbGluayAkYW5pbWF0ZSNhZGRDbGFzcyBhZGRDbGFzc30gYC5uZy1oaWRlYCAgfCBhZnRlciB0aGUgYG5nSGlkZWAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSB0cnV0aHkgdmFsdWUgYW5kIGp1c3QgYmVmb3JlIHRoZSBjb250ZW50cyBhcmUgc2V0IHRvIGhpZGRlbiB8XG4gKiB8IHtAbGluayAkYW5pbWF0ZSNyZW1vdmVDbGFzcyByZW1vdmVDbGFzc30gIGAubmctaGlkZWAgIHwgYWZ0ZXIgdGhlIGBuZ0hpZGVgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgbm9uIHRydXRoeSB2YWx1ZSBhbmQganVzdCBiZWZvcmUgY29udGVudHMgYXJlIHNldCB0byB2aXNpYmxlIHxcbiAqXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nSGlkZSBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5IHRoZW5cbiAqICAgICB0aGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEBleGFtcGxlXG4gIDxleGFtcGxlIG1vZHVsZT1cIm5nQW5pbWF0ZVwiIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIG5hbWU9XCJuZy1oaWRlXCI+XG4gICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIENsaWNrIG1lOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjaGVja2VkXCIgYXJpYS1sYWJlbD1cIlRvZ2dsZSBuZ1Nob3dcIj48YnIvPlxuICAgICAgPGRpdj5cbiAgICAgICAgU2hvdzpcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1oaWRlXCIgbmctc2hvdz1cImNoZWNrZWRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLXVwXCI+PC9zcGFuPiBJIHNob3cgdXAgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICBIaWRlOlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2stZWxlbWVudCBhbmltYXRlLWhpZGVcIiBuZy1oaWRlPVwiY2hlY2tlZFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi10aHVtYnMtZG93blwiPjwvc3Bhbj4gSSBoaWRlIHdoZW4geW91ciBjaGVja2JveCBpcyBjaGVja2VkLlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwiZ2x5cGhpY29ucy5jc3NcIj5cbiAgICAgIEBpbXBvcnQgdXJsKC4uLy4uL2NvbXBvbmVudHMvYm9vdHN0cmFwLTMuMS4xL2Nzcy9ib290c3RyYXAuY3NzKTtcbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cImFuaW1hdGlvbnMuY3NzXCI+XG4gICAgICAuYW5pbWF0ZS1oaWRlIHtcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIGxpbmVhciAwLjVzO1xuICAgICAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1oaWRlLm5nLWhpZGUge1xuICAgICAgICBsaW5lLWhlaWdodDogMDtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgcGFkZGluZzogMCAxMHB4O1xuICAgICAgfVxuXG4gICAgICAuY2hlY2stZWxlbWVudCB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIH1cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHRodW1ic1VwID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZ2x5cGhpY29uLXRodW1icy11cCcpKTtcbiAgICAgIHZhciB0aHVtYnNEb3duID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZ2x5cGhpY29uLXRodW1icy1kb3duJykpO1xuXG4gICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLXNob3cgLyBuZy1oaWRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh0aHVtYnNVcC5pc0Rpc3BsYXllZCgpKS50b0JlRmFsc3koKTtcbiAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZVRydXRoeSgpO1xuXG4gICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2NoZWNrZWQnKSkuY2xpY2soKTtcblxuICAgICAgICBleHBlY3QodGh1bWJzVXAuaXNEaXNwbGF5ZWQoKSkudG9CZVRydXRoeSgpO1xuICAgICAgICBleHBlY3QodGh1bWJzRG93bi5pc0Rpc3BsYXllZCgpKS50b0JlRmFsc3koKTtcbiAgICAgIH0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG52YXIgbmdIaWRlRGlyZWN0aXZlID0gWyckYW5pbWF0ZScsIGZ1bmN0aW9uKCRhbmltYXRlKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICBtdWx0aUVsZW1lbnQ6IHRydWUsXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgIHNjb3BlLiR3YXRjaChhdHRyLm5nSGlkZSwgZnVuY3Rpb24gbmdIaWRlV2F0Y2hBY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gVGhlIGNvbW1lbnQgaW5zaWRlIG9mIHRoZSBuZ1Nob3dEaXJlY3RpdmUgZXhwbGFpbnMgd2h5IHdlIGFkZCBhbmRcbiAgICAgICAgLy8gcmVtb3ZlIGEgdGVtcG9yYXJ5IGNsYXNzIGZvciB0aGUgc2hvdy9oaWRlIGFuaW1hdGlvblxuICAgICAgICAkYW5pbWF0ZVt2YWx1ZSA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXShlbGVtZW50LE5HX0hJREVfQ0xBU1MsIHtcbiAgICAgICAgICB0ZW1wQ2xhc3NlczogTkdfSElERV9JTl9QUk9HUkVTU19DTEFTU1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1dO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nU3R5bGVcbiAqIEByZXN0cmljdCBBQ1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ1N0eWxlYCBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBzZXQgQ1NTIHN0eWxlIG9uIGFuIEhUTUwgZWxlbWVudCBjb25kaXRpb25hbGx5LlxuICpcbiAqIEBrbm93bklzc3VlXG4gKiBZb3Ugc2hvdWxkIG5vdCB1c2Uge0BsaW5rIGd1aWRlL2ludGVycG9sYXRpb24gaW50ZXJwb2xhdGlvbn0gaW4gdGhlIHZhbHVlIG9mIHRoZSBgc3R5bGVgXG4gKiBhdHRyaWJ1dGUsIHdoZW4gdXNpbmcgdGhlIGBuZ1N0eWxlYCBkaXJlY3RpdmUgb24gdGhlIHNhbWUgZWxlbWVudC5cbiAqIFNlZSB7QGxpbmsgZ3VpZGUvaW50ZXJwb2xhdGlvbiNrbm93bi1pc3N1ZXMgaGVyZX0gZm9yIG1vcmUgaW5mby5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTdHlsZVxuICpcbiAqIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHdoaWNoIGV2YWxzIHRvIGFuXG4gKiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgQ1NTIHN0eWxlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aG9zZSBDU1NcbiAqIGtleXMuXG4gKlxuICogU2luY2Ugc29tZSBDU1Mgc3R5bGUgbmFtZXMgYXJlIG5vdCB2YWxpZCBrZXlzIGZvciBhbiBvYmplY3QsIHRoZXkgbXVzdCBiZSBxdW90ZWQuXG4gKiBTZWUgdGhlICdiYWNrZ3JvdW5kLWNvbG9yJyBzdHlsZSBpbiB0aGUgZXhhbXBsZSBiZWxvdy5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLXN0eWxlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJzZXQgY29sb3JcIiBuZy1jbGljaz1cIm15U3R5bGU9e2NvbG9yOidyZWQnfVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwic2V0IGJhY2tncm91bmRcIiBuZy1jbGljaz1cIm15U3R5bGU9eydiYWNrZ3JvdW5kLWNvbG9yJzonYmx1ZSd9XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJjbGVhclwiIG5nLWNsaWNrPVwibXlTdHlsZT17fVwiPlxuICAgICAgICA8YnIvPlxuICAgICAgICA8c3BhbiBuZy1zdHlsZT1cIm15U3R5bGVcIj5TYW1wbGUgVGV4dDwvc3Bhbj5cbiAgICAgICAgPHByZT5teVN0eWxlPXt7bXlTdHlsZX19PC9wcmU+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIHNwYW4ge1xuICAgICAgICAgY29sb3I6IGJsYWNrO1xuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgdmFyIGNvbG9yU3BhbiA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuJykpO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zdHlsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGNvbG9yU3Bhbi5nZXRDc3NWYWx1ZSgnY29sb3InKSkudG9CZSgncmdiYSgwLCAwLCAwLCAxKScpO1xuICAgICAgICAgZWxlbWVudChieS5jc3MoJ2lucHV0W3ZhbHVlPVxcJ3NldCBjb2xvclxcJ10nKSkuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMjU1LCAwLCAwLCAxKScpO1xuICAgICAgICAgZWxlbWVudChieS5jc3MoJ2lucHV0W3ZhbHVlPWNsZWFyXScpKS5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGNvbG9yU3Bhbi5nZXRDc3NWYWx1ZSgnY29sb3InKSkudG9CZSgncmdiYSgwLCAwLCAwLCAxKScpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ1N0eWxlRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgc2NvcGUuJHdhdGNoKGF0dHIubmdTdHlsZSwgZnVuY3Rpb24gbmdTdHlsZVdhdGNoQWN0aW9uKG5ld1N0eWxlcywgb2xkU3R5bGVzKSB7XG4gICAgaWYgKG9sZFN0eWxlcyAmJiAobmV3U3R5bGVzICE9PSBvbGRTdHlsZXMpKSB7XG4gICAgICBmb3JFYWNoKG9sZFN0eWxlcywgZnVuY3Rpb24odmFsLCBzdHlsZSkgeyBlbGVtZW50LmNzcyhzdHlsZSwgJycpO30pO1xuICAgIH1cbiAgICBpZiAobmV3U3R5bGVzKSBlbGVtZW50LmNzcyhuZXdTdHlsZXMpO1xuICB9LCB0cnVlKTtcbn0pO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nU3dpdGNoXG4gKiBAcmVzdHJpY3QgRUFcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdTd2l0Y2hgIGRpcmVjdGl2ZSBpcyB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgc3dhcCBET00gc3RydWN0dXJlIG9uIHlvdXIgdGVtcGxhdGUgYmFzZWQgb24gYSBzY29wZSBleHByZXNzaW9uLlxuICogRWxlbWVudHMgd2l0aGluIGBuZ1N3aXRjaGAgYnV0IHdpdGhvdXQgYG5nU3dpdGNoV2hlbmAgb3IgYG5nU3dpdGNoRGVmYXVsdGAgZGlyZWN0aXZlcyB3aWxsIGJlIHByZXNlcnZlZCBhdCB0aGUgbG9jYXRpb25cbiAqIGFzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogVGhlIGRpcmVjdGl2ZSBpdHNlbGYgd29ya3Mgc2ltaWxhciB0byBuZ0luY2x1ZGUsIGhvd2V2ZXIsIGluc3RlYWQgb2YgZG93bmxvYWRpbmcgdGVtcGxhdGUgY29kZSAob3IgbG9hZGluZyBpdFxuICogZnJvbSB0aGUgdGVtcGxhdGUgY2FjaGUpLCBgbmdTd2l0Y2hgIHNpbXBseSBjaG9vc2VzIG9uZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIGFuZCBtYWtlcyBpdCB2aXNpYmxlIGJhc2VkIG9uIHdoaWNoIGVsZW1lbnRcbiAqIG1hdGNoZXMgdGhlIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGV2YWx1YXRlZCBleHByZXNzaW9uLiBJbiBvdGhlciB3b3JkcywgeW91IGRlZmluZSBhIGNvbnRhaW5lciBlbGVtZW50XG4gKiAod2hlcmUgeW91IHBsYWNlIHRoZSBkaXJlY3RpdmUpLCBwbGFjZSBhbiBleHByZXNzaW9uIG9uIHRoZSAqKmBvbj1cIi4uLlwiYCBhdHRyaWJ1dGUqKlxuICogKG9yIHRoZSAqKmBuZy1zd2l0Y2g9XCIuLi5cImAgYXR0cmlidXRlKiopLCBkZWZpbmUgYW55IGlubmVyIGVsZW1lbnRzIGluc2lkZSBvZiB0aGUgZGlyZWN0aXZlIGFuZCBwbGFjZVxuICogYSB3aGVuIGF0dHJpYnV0ZSBwZXIgZWxlbWVudC4gVGhlIHdoZW4gYXR0cmlidXRlIGlzIHVzZWQgdG8gaW5mb3JtIG5nU3dpdGNoIHdoaWNoIGVsZW1lbnQgdG8gZGlzcGxheSB3aGVuIHRoZSBvblxuICogZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIElmIGEgbWF0Y2hpbmcgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQgdmlhIGEgd2hlbiBhdHRyaWJ1dGUgdGhlbiBhbiBlbGVtZW50IHdpdGggdGhlIGRlZmF1bHRcbiAqIGF0dHJpYnV0ZSBpcyBkaXNwbGF5ZWQuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cbiAqIEJlIGF3YXJlIHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbWF0Y2ggYWdhaW5zdCBjYW5ub3QgYmUgZXhwcmVzc2lvbnMuIFRoZXkgYXJlIGludGVycHJldGVkXG4gKiBhcyBsaXRlcmFsIHN0cmluZyB2YWx1ZXMgdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEZvciBleGFtcGxlLCAqKmBuZy1zd2l0Y2gtd2hlbj1cInNvbWVWYWxcImAqKiB3aWxsIG1hdGNoIGFnYWluc3QgdGhlIHN0cmluZyBgXCJzb21lVmFsXCJgIG5vdCBhZ2FpbnN0IHRoZVxuICogdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gYCRzY29wZS5zb21lVmFsYC5cbiAqIDwvZGl2PlxuXG4gKiBAYW5pbWF0aW9uc1xuICogfCBBbmltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IE9jY3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHtAbGluayBuZy4kYW5pbWF0ZSNlbnRlciBlbnRlcn0gIHwgYWZ0ZXIgdGhlIG5nU3dpdGNoIGNvbnRlbnRzIGNoYW5nZSBhbmQgdGhlIG1hdGNoZWQgY2hpbGQgZWxlbWVudCBpcyBwbGFjZWQgaW5zaWRlIHRoZSBjb250YWluZXIgfFxuICogfCB7QGxpbmsgbmcuJGFuaW1hdGUjbGVhdmUgbGVhdmV9ICB8IGFmdGVyIHRoZSBuZ1N3aXRjaCBjb250ZW50cyBjaGFuZ2UgYW5kIGp1c3QgYmVmb3JlIHRoZSBmb3JtZXIgY29udGVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIHxcbiAqXG4gKiBAdXNhZ2VcbiAqXG4gKiBgYGBcbiAqIDxBTlkgbmctc3dpdGNoPVwiZXhwcmVzc2lvblwiPlxuICogICA8QU5ZIG5nLXN3aXRjaC13aGVuPVwibWF0Y2hWYWx1ZTFcIj4uLi48L0FOWT5cbiAqICAgPEFOWSBuZy1zd2l0Y2gtd2hlbj1cIm1hdGNoVmFsdWUyXCI+Li4uPC9BTlk+XG4gKiAgIDxBTlkgbmctc3dpdGNoLWRlZmF1bHQ+Li4uPC9BTlk+XG4gKiA8L0FOWT5cbiAqIGBgYFxuICpcbiAqXG4gKiBAc2NvcGVcbiAqIEBwcmlvcml0eSAxMjAwXG4gKiBAcGFyYW0geyp9IG5nU3dpdGNofG9uIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdCA8Y29kZT5uZy1zd2l0Y2gtd2hlbjwvY29kZT4uXG4gKiBPbiBjaGlsZCBlbGVtZW50cyBhZGQ6XG4gKlxuICogKiBgbmdTd2l0Y2hXaGVuYDogdGhlIGNhc2Ugc3RhdGVtZW50IHRvIG1hdGNoIGFnYWluc3QuIElmIG1hdGNoIHRoZW4gdGhpc1xuICogICBjYXNlIHdpbGwgYmUgZGlzcGxheWVkLiBJZiB0aGUgc2FtZSBtYXRjaCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzLCBhbGwgdGhlXG4gKiAgIGVsZW1lbnRzIHdpbGwgYmUgZGlzcGxheWVkLiBJdCBpcyBwb3NzaWJsZSB0byBhc3NvY2lhdGUgbXVsdGlwbGUgdmFsdWVzIHRvXG4gKiAgIHRoZSBzYW1lIGBuZ1N3aXRjaFdoZW5gIGJ5IGRlZmluaW5nIHRoZSBvcHRpb25hbCBhdHRyaWJ1dGVcbiAqICAgYG5nU3dpdGNoV2hlblNlcGFyYXRvcmAuIFRoZSBzZXBhcmF0b3Igd2lsbCBiZSB1c2VkIHRvIHNwbGl0IHRoZSB2YWx1ZSBvZlxuICogICB0aGUgYG5nU3dpdGNoV2hlbmAgYXR0cmlidXRlIGludG8gbXVsdGlwbGUgdG9rZW5zLCBhbmQgdGhlIGVsZW1lbnQgd2lsbCBzaG93XG4gKiAgIGlmIGFueSBvZiB0aGUgYG5nU3dpdGNoYCBldmFsdWF0ZXMgdG8gYW55IG9mIHRoZXNlIHRva2Vucy5cbiAqICogYG5nU3dpdGNoRGVmYXVsdGA6IHRoZSBkZWZhdWx0IGNhc2Ugd2hlbiBubyBvdGhlciBjYXNlIG1hdGNoLiBJZiB0aGVyZVxuICogICBhcmUgbXVsdGlwbGUgZGVmYXVsdCBjYXNlcywgYWxsIG9mIHRoZW0gd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBubyBvdGhlclxuICogICBjYXNlIG1hdGNoLlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICA8ZXhhbXBsZSBtb2R1bGU9XCJzd2l0Y2hFeGFtcGxlXCIgZGVwcz1cImFuZ3VsYXItYW5pbWF0ZS5qc1wiIGFuaW1hdGlvbnM9XCJ0cnVlXCIgbmFtZT1cIm5nLXN3aXRjaFwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPVwic2VsZWN0aW9uXCIgbmctb3B0aW9ucz1cIml0ZW0gZm9yIGl0ZW0gaW4gaXRlbXNcIj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxjb2RlPnNlbGVjdGlvbj17e3NlbGVjdGlvbn19PC9jb2RlPlxuICAgICAgICA8aHIvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW5pbWF0ZS1zd2l0Y2gtY29udGFpbmVyXCJcbiAgICAgICAgICBuZy1zd2l0Y2ggb249XCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmltYXRlLXN3aXRjaFwiIG5nLXN3aXRjaC13aGVuPVwic2V0dGluZ3N8b3B0aW9uc1wiIG5nLXN3aXRjaC13aGVuLXNlcGFyYXRvcj1cInxcIj5TZXR0aW5ncyBEaXY8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmltYXRlLXN3aXRjaFwiIG5nLXN3aXRjaC13aGVuPVwiaG9tZVwiPkhvbWUgU3BhbjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuaW1hdGUtc3dpdGNoXCIgbmctc3dpdGNoLWRlZmF1bHQ+ZGVmYXVsdDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICBhbmd1bGFyLm1vZHVsZSgnc3dpdGNoRXhhbXBsZScsIFsnbmdBbmltYXRlJ10pXG4gICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLml0ZW1zID0gWydzZXR0aW5ncycsICdob21lJywgJ29wdGlvbnMnLCAnb3RoZXInXTtcbiAgICAgICAgICAkc2NvcGUuc2VsZWN0aW9uID0gJHNjb3BlLml0ZW1zWzBdO1xuICAgICAgICB9XSk7XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJhbmltYXRpb25zLmNzc1wiPlxuICAgICAgLmFuaW1hdGUtc3dpdGNoLWNvbnRhaW5lciB7XG4gICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgICAgICBiYWNrZ3JvdW5kOndoaXRlO1xuICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBoZWlnaHQ6NDBweDtcbiAgICAgICAgb3ZlcmZsb3c6aGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1zd2l0Y2gge1xuICAgICAgICBwYWRkaW5nOjEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1hbmltYXRlIHtcbiAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzO1xuXG4gICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICB0b3A6MDtcbiAgICAgICAgbGVmdDowO1xuICAgICAgICByaWdodDowO1xuICAgICAgICBib3R0b206MDtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtc3dpdGNoLm5nLWxlYXZlLm5nLWxlYXZlLWFjdGl2ZSxcbiAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1lbnRlciB7XG4gICAgICAgIHRvcDotNTBweDtcbiAgICAgIH1cbiAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1sZWF2ZSxcbiAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUge1xuICAgICAgICB0b3A6MDtcbiAgICAgIH1cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHN3aXRjaEVsZW0gPSBlbGVtZW50KGJ5LmNzcygnW25nLXN3aXRjaF0nKSk7XG4gICAgICB2YXIgc2VsZWN0ID0gZWxlbWVudChieS5tb2RlbCgnc2VsZWN0aW9uJykpO1xuXG4gICAgICBpdCgnc2hvdWxkIHN0YXJ0IGluIHNldHRpbmdzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdChzd2l0Y2hFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvU2V0dGluZ3MgRGl2Lyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRvIGhvbWUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMSkuY2xpY2soKTtcbiAgICAgICAgZXhwZWN0KHN3aXRjaEVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9Ib21lIFNwYW4vKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgdG8gc2V0dGluZ3MgdmlhIFwib3B0aW9uc1wiJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDIpLmNsaWNrKCk7XG4gICAgICAgIGV4cGVjdChzd2l0Y2hFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvU2V0dGluZ3MgRGl2Lyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc2VsZWN0IGRlZmF1bHQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMykuY2xpY2soKTtcbiAgICAgICAgZXhwZWN0KHN3aXRjaEVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9kZWZhdWx0Lyk7XG4gICAgICB9KTtcbiAgICA8L2ZpbGU+XG4gIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nU3dpdGNoRGlyZWN0aXZlID0gWyckYW5pbWF0ZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRhbmltYXRlLCAkY29tcGlsZSkge1xuICByZXR1cm4ge1xuICAgIHJlcXVpcmU6ICduZ1N3aXRjaCcsXG5cbiAgICAvLyBhc2tzIGZvciAkc2NvcGUgdG8gZm9vbCB0aGUgQkMgY29udHJvbGxlciBtb2R1bGVcbiAgICBjb250cm9sbGVyOiBbJyRzY29wZScsIGZ1bmN0aW9uIE5nU3dpdGNoQ29udHJvbGxlcigpIHtcbiAgICAgdGhpcy5jYXNlcyA9IHt9O1xuICAgIH1dLFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBuZ1N3aXRjaENvbnRyb2xsZXIpIHtcbiAgICAgIHZhciB3YXRjaEV4cHIgPSBhdHRyLm5nU3dpdGNoIHx8IGF0dHIub24sXG4gICAgICAgICAgc2VsZWN0ZWRUcmFuc2NsdWRlcyA9IFtdLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMgPSBbXSxcbiAgICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9ucyA9IFtdLFxuICAgICAgICAgIHNlbGVjdGVkU2NvcGVzID0gW107XG5cbiAgICAgIHZhciBzcGxpY2VGYWN0b3J5ID0gZnVuY3Rpb24oYXJyYXksIGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IGZhbHNlKSBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICBzY29wZS4kd2F0Y2god2F0Y2hFeHByLCBmdW5jdGlvbiBuZ1N3aXRjaFdhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciBpLCBpaTtcblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBsYXN0LCBpbiBjYXNlIHRoZSBhcnJheSBpcyBtb2RpZmllZCBkdXJpbmcgdGhlIGxvb3BcbiAgICAgICAgd2hpbGUgKHByZXZpb3VzTGVhdmVBbmltYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICRhbmltYXRlLmNhbmNlbChwcmV2aW91c0xlYXZlQW5pbWF0aW9ucy5wb3AoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHNlbGVjdGVkU2NvcGVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBnZXRCbG9ja05vZGVzKHNlbGVjdGVkRWxlbWVudHNbaV0uY2xvbmUpO1xuICAgICAgICAgIHNlbGVjdGVkU2NvcGVzW2ldLiRkZXN0cm95KCk7XG4gICAgICAgICAgdmFyIHJ1bm5lciA9IHByZXZpb3VzTGVhdmVBbmltYXRpb25zW2ldID0gJGFuaW1hdGUubGVhdmUoc2VsZWN0ZWQpO1xuICAgICAgICAgIHJ1bm5lci5kb25lKHNwbGljZUZhY3RvcnkocHJldmlvdXNMZWF2ZUFuaW1hdGlvbnMsIGkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgc2VsZWN0ZWRTY29wZXMubGVuZ3RoID0gMDtcblxuICAgICAgICBpZiAoKHNlbGVjdGVkVHJhbnNjbHVkZXMgPSBuZ1N3aXRjaENvbnRyb2xsZXIuY2FzZXNbJyEnICsgdmFsdWVdIHx8IG5nU3dpdGNoQ29udHJvbGxlci5jYXNlc1snPyddKSkge1xuICAgICAgICAgIGZvckVhY2goc2VsZWN0ZWRUcmFuc2NsdWRlcywgZnVuY3Rpb24oc2VsZWN0ZWRUcmFuc2NsdWRlKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFRyYW5zY2x1ZGUudHJhbnNjbHVkZShmdW5jdGlvbihjYXNlRWxlbWVudCwgc2VsZWN0ZWRTY29wZSkge1xuICAgICAgICAgICAgICBzZWxlY3RlZFNjb3Blcy5wdXNoKHNlbGVjdGVkU2NvcGUpO1xuICAgICAgICAgICAgICB2YXIgYW5jaG9yID0gc2VsZWN0ZWRUcmFuc2NsdWRlLmVsZW1lbnQ7XG4gICAgICAgICAgICAgIGNhc2VFbGVtZW50W2Nhc2VFbGVtZW50Lmxlbmd0aCsrXSA9ICRjb21waWxlLiQkY3JlYXRlQ29tbWVudCgnZW5kIG5nU3dpdGNoV2hlbicpO1xuICAgICAgICAgICAgICB2YXIgYmxvY2sgPSB7IGNsb25lOiBjYXNlRWxlbWVudCB9O1xuXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMucHVzaChibG9jayk7XG4gICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNhc2VFbGVtZW50LCBhbmNob3IucGFyZW50KCksIGFuY2hvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufV07XG5cbnZhciBuZ1N3aXRjaFdoZW5EaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7XG4gIHRyYW5zY2x1ZGU6ICdlbGVtZW50JyxcbiAgcHJpb3JpdHk6IDEyMDAsXG4gIHJlcXVpcmU6ICdebmdTd2l0Y2gnLFxuICBtdWx0aUVsZW1lbnQ6IHRydWUsXG4gIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY3RybCwgJHRyYW5zY2x1ZGUpIHtcblxuICAgIHZhciBjYXNlcyA9IGF0dHJzLm5nU3dpdGNoV2hlbi5zcGxpdChhdHRycy5uZ1N3aXRjaFdoZW5TZXBhcmF0b3IpLnNvcnQoKS5maWx0ZXIoXG4gICAgICAvLyBGaWx0ZXIgZHVwbGljYXRlIGNhc2VzXG4gICAgICBmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsgcmV0dXJuIGFycmF5W2luZGV4IC0gMV0gIT09IGVsZW1lbnQ7IH1cbiAgICApO1xuXG4gICAgZm9yRWFjaChjYXNlcywgZnVuY3Rpb24od2hlbkNhc2UpIHtcbiAgICAgIGN0cmwuY2FzZXNbJyEnICsgd2hlbkNhc2VdID0gKGN0cmwuY2FzZXNbJyEnICsgd2hlbkNhc2VdIHx8IFtdKTtcbiAgICAgIGN0cmwuY2FzZXNbJyEnICsgd2hlbkNhc2VdLnB1c2goeyB0cmFuc2NsdWRlOiAkdHJhbnNjbHVkZSwgZWxlbWVudDogZWxlbWVudCB9KTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbnZhciBuZ1N3aXRjaERlZmF1bHREaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7XG4gIHRyYW5zY2x1ZGU6ICdlbGVtZW50JyxcbiAgcHJpb3JpdHk6IDEyMDAsXG4gIHJlcXVpcmU6ICdebmdTd2l0Y2gnLFxuICBtdWx0aUVsZW1lbnQ6IHRydWUsXG4gIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkge1xuICAgIGN0cmwuY2FzZXNbJz8nXSA9IChjdHJsLmNhc2VzWyc/J10gfHwgW10pO1xuICAgIGN0cmwuY2FzZXNbJz8nXS5wdXNoKHsgdHJhbnNjbHVkZTogJHRyYW5zY2x1ZGUsIGVsZW1lbnQ6IGVsZW1lbnQgfSk7XG4gICB9XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1RyYW5zY2x1ZGVcbiAqIEByZXN0cmljdCBFQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERpcmVjdGl2ZSB0aGF0IG1hcmtzIHRoZSBpbnNlcnRpb24gcG9pbnQgZm9yIHRoZSB0cmFuc2NsdWRlZCBET00gb2YgdGhlIG5lYXJlc3QgcGFyZW50IGRpcmVjdGl2ZSB0aGF0IHVzZXMgdHJhbnNjbHVzaW9uLlxuICpcbiAqIFlvdSBjYW4gc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGluc2VydCBhIG5hbWVkIHRyYW5zY2x1c2lvbiBzbG90LCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHNsb3QsIGJ5IHByb3ZpZGluZyB0aGUgc2xvdCBuYW1lXG4gKiBhcyB0aGUgdmFsdWUgb2YgdGhlIGBuZy10cmFuc2NsdWRlYCBvciBgbmctdHJhbnNjbHVkZS1zbG90YCBhdHRyaWJ1dGUuXG4gKlxuICogSWYgdGhlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgaXMgbm90IGVtcHR5IChpLmUuIGNvbnRhaW5zIG9uZSBvciBtb3JlIERPTSBub2RlcywgaW5jbHVkaW5nIHdoaXRlc3BhY2UgdGV4dCBub2RlcyksIGFueSBleGlzdGluZ1xuICogY29udGVudCBvZiB0aGlzIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBpcyBpbnNlcnRlZC5cbiAqIElmIHRoZSB0cmFuc2NsdWRlZCBjb250ZW50IGlzIGVtcHR5IChvciBvbmx5IHdoaXRlc3BhY2UpLCB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBsZWZ0IGludGFjdC4gVGhpcyBsZXRzIHlvdSBwcm92aWRlIGZhbGxiYWNrXG4gKiBjb250ZW50IGluIHRoZSBjYXNlIHRoYXQgbm8gdHJhbnNjbHVkZWQgY29udGVudCBpcyBwcm92aWRlZC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmdUcmFuc2NsdWRlfG5nVHJhbnNjbHVkZVNsb3QgdGhlIG5hbWUgb2YgdGhlIHNsb3QgdG8gaW5zZXJ0IGF0IHRoaXMgcG9pbnQuIElmIHRoaXMgaXMgbm90IHByb3ZpZGVkLCBpcyBlbXB0eVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGl0cyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoZW4gdGhlIGRlZmF1bHQgc2xvdCBpcyB1c2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgQmFzaWMgdHJhbnNjbHVzaW9uXG4gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGJhc2ljIHRyYW5zY2x1c2lvbiBvZiBjb250ZW50IGludG8gYSBjb21wb25lbnQgZGlyZWN0aXZlLlxuICogPGV4YW1wbGUgbmFtZT1cInNpbXBsZVRyYW5zY2x1ZGVFeGFtcGxlXCIgbW9kdWxlPVwidHJhbnNjbHVkZUV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8c2NyaXB0PlxuICogICAgICAgYW5ndWxhci5tb2R1bGUoJ3RyYW5zY2x1ZGVFeGFtcGxlJywgW10pXG4gKiAgICAgICAgLmRpcmVjdGl2ZSgncGFuZScsIGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gKiAgICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLFxuICogICAgICAgICAgICAgc2NvcGU6IHsgdGl0bGU6J0AnIH0sXG4gKiAgICAgICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogZ3JheVwiPnt7dGl0bGV9fTwvZGl2PicgK1xuICogICAgICAgICAgICAgICAgICAgICAgICAgJzxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+J1xuICogICAgICAgICAgIH07XG4gKiAgICAgICB9KVxuICogICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICAgJHNjb3BlLnRpdGxlID0gJ0xvcmVtIElwc3VtJztcbiAqICAgICAgICAgJHNjb3BlLnRleHQgPSAnTmVxdWUgcG9ycm8gcXVpc3F1YW0gZXN0IHF1aSBkb2xvcmVtIGlwc3VtIHF1aWEgZG9sb3IuLi4nO1xuICogICAgICAgfV0pO1xuICogICAgIDwvc2NyaXB0PlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8aW5wdXQgbmctbW9kZWw9XCJ0aXRsZVwiIGFyaWEtbGFiZWw9XCJ0aXRsZVwiPiA8YnIvPlxuICogICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPVwidGV4dFwiIGFyaWEtbGFiZWw9XCJ0ZXh0XCI+PC90ZXh0YXJlYT4gPGJyLz5cbiAqICAgICAgIDxwYW5lIHRpdGxlPVwie3t0aXRsZX19XCI+PHNwYW4+e3t0ZXh0fX08L3NwYW4+PC9wYW5lPlxuICogICAgIDwvZGl2PlxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAqICAgICAgaXQoJ3Nob3VsZCBoYXZlIHRyYW5zY2x1ZGVkJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RpdGxlJykpO1xuICogICAgICAgIHRpdGxlRWxlbWVudC5jbGVhcigpO1xuICogICAgICAgIHRpdGxlRWxlbWVudC5zZW5kS2V5cygnVElUTEUnKTtcbiAqICAgICAgICB2YXIgdGV4dEVsZW1lbnQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd0ZXh0JykpO1xuICogICAgICAgIHRleHRFbGVtZW50LmNsZWFyKCk7XG4gKiAgICAgICAgdGV4dEVsZW1lbnQuc2VuZEtleXMoJ1RFWFQnKTtcbiAqICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd0aXRsZScpKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1RJVExFJyk7XG4gKiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygndGV4dCcpKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1RFWFQnKTtcbiAqICAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIFRyYW5zY2x1ZGUgZmFsbGJhY2sgY29udGVudFxuICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYE5nVHJhbnNjbHVkZWAgd2l0aCBmYWxsYmFjayBjb250ZW50LCB0aGF0XG4gKiBpcyBkaXNwbGF5ZWQgaWYgbm8gdHJhbnNjbHVkZWQgY29udGVudCBpcyBwcm92aWRlZC5cbiAqXG4gKiA8ZXhhbXBsZSBtb2R1bGU9XCJ0cmFuc2NsdWRlRmFsbGJhY2tDb250ZW50RXhhbXBsZVwiIG5hbWU9XCJuZy10cmFuc2NsdWRlXCI+XG4gKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogPHNjcmlwdD5cbiAqIGFuZ3VsYXIubW9kdWxlKCd0cmFuc2NsdWRlRmFsbGJhY2tDb250ZW50RXhhbXBsZScsIFtdKVxuICogLmRpcmVjdGl2ZSgnbXlCdXR0b24nLCBmdW5jdGlvbigpe1xuICogICAgICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAqICAgICAgICAgICAgICAgdHJhbnNjbHVkZTogdHJ1ZSxcbiAqICAgICAgICAgICAgICAgc2NvcGU6IHRydWUsXG4gKiAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnPGJ1dHRvbiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxuZy10cmFuc2NsdWRlPicgK1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YiBzdHlsZT1cImNvbG9yOiByZWQ7XCI+QnV0dG9uMTwvYj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvbmctdHJhbnNjbHVkZT4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nXG4gKiAgICAgICAgICAgICB9O1xuICogICAgICAgICB9KTtcbiAqIDwvc2NyaXB0PlxuICogPCEtLSBmYWxsYmFjayBidXR0b24gY29udGVudCAtLT5cbiAqIDxteS1idXR0b24gaWQ9XCJmYWxsYmFja1wiPjwvbXktYnV0dG9uPlxuICogPCEtLSBtb2RpZmllZCBidXR0b24gY29udGVudCAtLT5cbiAqIDxteS1idXR0b24gaWQ9XCJtb2RpZmllZFwiPlxuICogICA8aSBzdHlsZT1cImNvbG9yOiBncmVlbjtcIj5CdXR0b24yPC9pPlxuICogPC9teS1idXR0b24+XG4gKiA8L2ZpbGU+XG4gKiA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiBpdCgnc2hvdWxkIGhhdmUgZGlmZmVyZW50IHRyYW5zY2x1ZGUgZWxlbWVudCBjb250ZW50JywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZmFsbGJhY2snKSkuZ2V0VGV4dCgpKS50b0JlKCdCdXR0b24xJyk7XG4gKiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbW9kaWZpZWQnKSkuZ2V0VGV4dCgpKS50b0JlKCdCdXR0b24yJyk7XG4gKiAgICAgICAgfSk7XG4gKiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogQGV4YW1wbGVcbiAqICMjIyBNdWx0aS1zbG90IHRyYW5zY2x1c2lvblxuICogVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB1c2luZyBtdWx0aS1zbG90IHRyYW5zY2x1c2lvbiBpbiBhIGNvbXBvbmVudCBkaXJlY3RpdmUuXG4gKiA8ZXhhbXBsZSBuYW1lPVwibXVsdGlTbG90VHJhbnNjbHVkZUV4YW1wbGVcIiBtb2R1bGU9XCJtdWx0aVNsb3RUcmFuc2NsdWRlRXhhbXBsZVwiPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgPHN0eWxlPlxuICogICAgICAudGl0bGUsIC5mb290ZXIge1xuICogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXlcbiAqICAgICAgfVxuICogICAgPC9zdHlsZT5cbiAqICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgIDxpbnB1dCBuZy1tb2RlbD1cInRpdGxlXCIgYXJpYS1sYWJlbD1cInRpdGxlXCI+IDxici8+XG4gKiAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD1cInRleHRcIiBhcmlhLWxhYmVsPVwidGV4dFwiPjwvdGV4dGFyZWE+IDxici8+XG4gKiAgICAgIDxwYW5lPlxuICogICAgICAgIDxwYW5lLXRpdGxlPjxhIG5nLWhyZWY9XCJ7e2xpbmt9fVwiPnt7dGl0bGV9fTwvYT48L3BhbmUtdGl0bGU+XG4gKiAgICAgICAgPHBhbmUtYm9keT48cD57e3RleHR9fTwvcD48L3BhbmUtYm9keT5cbiAqICAgICAgPC9wYW5lPlxuICogICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgYW5ndWxhci5tb2R1bGUoJ211bHRpU2xvdFRyYW5zY2x1ZGVFeGFtcGxlJywgW10pXG4gKiAgICAgLmRpcmVjdGl2ZSgncGFuZScsIGZ1bmN0aW9uKCkge1xuICogICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICogICAgICAgICAgdHJhbnNjbHVkZToge1xuICogICAgICAgICAgICAndGl0bGUnOiAnP3BhbmVUaXRsZScsXG4gKiAgICAgICAgICAgICdib2R5JzogJ3BhbmVCb2R5JyxcbiAqICAgICAgICAgICAgJ2Zvb3Rlcic6ICc/cGFuZUZvb3RlcidcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidGl0bGVcIiBuZy10cmFuc2NsdWRlPVwidGl0bGVcIj5GYWxsYmFjayBUaXRsZTwvZGl2PicgK1xuICogICAgICAgICAgICAgICAgICAgICAgJzxkaXYgbmctdHJhbnNjbHVkZT1cImJvZHlcIj48L2Rpdj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiZm9vdGVyXCIgbmctdHJhbnNjbHVkZT1cImZvb3RlclwiPkZhbGxiYWNrIEZvb3RlcjwvZGl2PicgK1xuICogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nXG4gKiAgICAgICAgfTtcbiAqICAgIH0pXG4gKiAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICogICAgICAkc2NvcGUudGl0bGUgPSAnTG9yZW0gSXBzdW0nO1xuICogICAgICAkc2NvcGUubGluayA9ICdodHRwczovL2dvb2dsZS5jb20nO1xuICogICAgICAkc2NvcGUudGV4dCA9ICdOZXF1ZSBwb3JybyBxdWlzcXVhbSBlc3QgcXVpIGRvbG9yZW0gaXBzdW0gcXVpYSBkb2xvci4uLic7XG4gKiAgICB9XSk7XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICAgICBpdCgnc2hvdWxkIGhhdmUgdHJhbnNjbHVkZWQgdGhlIHRpdGxlIGFuZCB0aGUgYm9keScsIGZ1bmN0aW9uKCkge1xuICogICAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd0aXRsZScpKTtcbiAqICAgICAgICB0aXRsZUVsZW1lbnQuY2xlYXIoKTtcbiAqICAgICAgICB0aXRsZUVsZW1lbnQuc2VuZEtleXMoJ1RJVExFJyk7XG4gKiAgICAgICAgdmFyIHRleHRFbGVtZW50ID0gZWxlbWVudChieS5tb2RlbCgndGV4dCcpKTtcbiAqICAgICAgICB0ZXh0RWxlbWVudC5jbGVhcigpO1xuICogICAgICAgIHRleHRFbGVtZW50LnNlbmRLZXlzKCdURVhUJyk7XG4gKiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcudGl0bGUnKSkuZ2V0VGV4dCgpKS50b0VxdWFsKCdUSVRMRScpO1xuICogICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3RleHQnKSkuZ2V0VGV4dCgpKS50b0VxdWFsKCdURVhUJyk7XG4gKiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcuZm9vdGVyJykpLmdldFRleHQoKSkudG9FcXVhbCgnRmFsbGJhY2sgRm9vdGVyJyk7XG4gKiAgICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ1RyYW5zY2x1ZGVNaW5FcnIgPSBtaW5FcnIoJ25nVHJhbnNjbHVkZScpO1xudmFyIG5nVHJhbnNjbHVkZURpcmVjdGl2ZSA9IFsnJGNvbXBpbGUnLCBmdW5jdGlvbigkY29tcGlsZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnRUFDJyxcbiAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICBjb21waWxlOiBmdW5jdGlvbiBuZ1RyYW5zY2x1ZGVDb21waWxlKHRFbGVtZW50KSB7XG5cbiAgICAgIC8vIFJlbW92ZSBhbmQgY2FjaGUgYW55IG9yaWdpbmFsIGNvbnRlbnQgdG8gYWN0IGFzIGEgZmFsbGJhY2tcbiAgICAgIHZhciBmYWxsYmFja0xpbmtGbiA9ICRjb21waWxlKHRFbGVtZW50LmNvbnRlbnRzKCkpO1xuICAgICAgdEVsZW1lbnQuZW1wdHkoKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nVHJhbnNjbHVkZVBvc3RMaW5rKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgY29udHJvbGxlciwgJHRyYW5zY2x1ZGUpIHtcblxuICAgICAgICBpZiAoISR0cmFuc2NsdWRlKSB7XG4gICAgICAgICAgdGhyb3cgbmdUcmFuc2NsdWRlTWluRXJyKCdvcnBoYW4nLFxuICAgICAgICAgICdJbGxlZ2FsIHVzZSBvZiBuZ1RyYW5zY2x1ZGUgZGlyZWN0aXZlIGluIHRoZSB0ZW1wbGF0ZSEgJyArXG4gICAgICAgICAgJ05vIHBhcmVudCBkaXJlY3RpdmUgdGhhdCByZXF1aXJlcyBhIHRyYW5zY2x1c2lvbiBmb3VuZC4gJyArXG4gICAgICAgICAgJ0VsZW1lbnQ6IHswfScsXG4gICAgICAgICAgc3RhcnRpbmdUYWcoJGVsZW1lbnQpKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBvZiB0aGUgZm9ybTogYG5nLXRyYW5zY2x1ZGU9XCJuZy10cmFuc2NsdWRlXCJgIHRoZW4gdHJlYXQgaXQgbGlrZSB0aGUgZGVmYXVsdFxuICAgICAgICBpZiAoJGF0dHJzLm5nVHJhbnNjbHVkZSA9PT0gJGF0dHJzLiRhdHRyLm5nVHJhbnNjbHVkZSkge1xuICAgICAgICAgICRhdHRycy5uZ1RyYW5zY2x1ZGUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2xvdE5hbWUgPSAkYXR0cnMubmdUcmFuc2NsdWRlIHx8ICRhdHRycy5uZ1RyYW5zY2x1ZGVTbG90O1xuXG4gICAgICAgIC8vIElmIHRoZSBzbG90IGlzIHJlcXVpcmVkIGFuZCBubyB0cmFuc2NsdXNpb24gY29udGVudCBpcyBwcm92aWRlZCB0aGVuIHRoaXMgY2FsbCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICAgICR0cmFuc2NsdWRlKG5nVHJhbnNjbHVkZUNsb25lQXR0YWNoRm4sIG51bGwsIHNsb3ROYW1lKTtcblxuICAgICAgICAvLyBJZiB0aGUgc2xvdCBpcyBvcHRpb25hbCBhbmQgbm8gdHJhbnNjbHVzaW9uIGNvbnRlbnQgaXMgcHJvdmlkZWQgdGhlbiB1c2UgdGhlIGZhbGxiYWNrIGNvbnRlbnRcbiAgICAgICAgaWYgKHNsb3ROYW1lICYmICEkdHJhbnNjbHVkZS5pc1Nsb3RGaWxsZWQoc2xvdE5hbWUpKSB7XG4gICAgICAgICAgdXNlRmFsbGJhY2tDb250ZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBuZ1RyYW5zY2x1ZGVDbG9uZUF0dGFjaEZuKGNsb25lLCB0cmFuc2NsdWRlZFNjb3BlKSB7XG4gICAgICAgICAgaWYgKGNsb25lLmxlbmd0aCAmJiBub3RXaGl0ZXNwYWNlKGNsb25lKSkge1xuICAgICAgICAgICAgJGVsZW1lbnQuYXBwZW5kKGNsb25lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNlRmFsbGJhY2tDb250ZW50KCk7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBub3RoaW5nIGxpbmtlZCBhZ2FpbnN0IHRoZSB0cmFuc2NsdWRlZCBzY29wZSBzaW5jZSBubyBjb250ZW50IHdhcyBhdmFpbGFibGUsXG4gICAgICAgICAgICAvLyBzbyBpdCBzaG91bGQgYmUgc2FmZSB0byBjbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIHNjb3BlLlxuICAgICAgICAgICAgdHJhbnNjbHVkZWRTY29wZS4kZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHVzZUZhbGxiYWNrQ29udGVudCgpIHtcbiAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHRoZSBmYWxsYmFjayBjb250ZW50IHJhdGhlciB0aGFuIHRoZSB0cmFuc2NsdWRlZCBjb250ZW50LFxuICAgICAgICAgIC8vIHdlIGxpbmsgYWdhaW5zdCB0aGUgc2NvcGUgb2YgdGhpcyBkaXJlY3RpdmUgcmF0aGVyIHRoYW4gdGhlIHRyYW5zY2x1ZGVkIHNjb3BlXG4gICAgICAgICAgZmFsbGJhY2tMaW5rRm4oJHNjb3BlLCBmdW5jdGlvbihjbG9uZSkge1xuICAgICAgICAgICAgJGVsZW1lbnQuYXBwZW5kKGNsb25lKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG5vdFdoaXRlc3BhY2Uobm9kZXMpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBub2Rlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5PREVfVFlQRV9URVhUIHx8IG5vZGUubm9kZVZhbHVlLnRyaW0oKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufV07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgc2NyaXB0XG4gKiBAcmVzdHJpY3QgRVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogTG9hZCB0aGUgY29udGVudCBvZiBhIGA8c2NyaXB0PmAgZWxlbWVudCBpbnRvIHtAbGluayBuZy4kdGVtcGxhdGVDYWNoZSBgJHRlbXBsYXRlQ2FjaGVgfSwgc28gdGhhdCB0aGVcbiAqIHRlbXBsYXRlIGNhbiBiZSB1c2VkIGJ5IHtAbGluayBuZy5kaXJlY3RpdmU6bmdJbmNsdWRlIGBuZ0luY2x1ZGVgfSxcbiAqIHtAbGluayBuZ1JvdXRlLmRpcmVjdGl2ZTpuZ1ZpZXcgYG5nVmlld2B9LCBvciB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlIGRpcmVjdGl2ZXN9LiBUaGUgdHlwZSBvZiB0aGVcbiAqIGA8c2NyaXB0PmAgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBhcyBgdGV4dC9uZy10ZW1wbGF0ZWAsIGFuZCBhIGNhY2hlIG5hbWUgZm9yIHRoZSB0ZW1wbGF0ZSBtdXN0IGJlXG4gKiBhc3NpZ25lZCB0aHJvdWdoIHRoZSBlbGVtZW50J3MgYGlkYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBhcyBhIGRpcmVjdGl2ZSdzIGB0ZW1wbGF0ZVVybGAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgTXVzdCBiZSBzZXQgdG8gYCd0ZXh0L25nLXRlbXBsYXRlJ2AuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgQ2FjaGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUuXG4gKlxuICogQGV4YW1wbGVcbiAgPGV4YW1wbGUgIG5hbWU9XCJzY3JpcHQtdGFnXCI+XG4gICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvbmctdGVtcGxhdGVcIiBpZD1cIi90cGwuaHRtbFwiPlxuICAgICAgICBDb250ZW50IG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgIDwvc2NyaXB0PlxuXG4gICAgICA8YSBuZy1jbGljaz1cImN1cnJlbnRUcGw9Jy90cGwuaHRtbCdcIiBpZD1cInRwbC1saW5rXCI+TG9hZCBpbmxpbmVkIHRlbXBsYXRlPC9hPlxuICAgICAgPGRpdiBpZD1cInRwbC1jb250ZW50XCIgbmctaW5jbHVkZSBzcmM9XCJjdXJyZW50VHBsXCI+PC9kaXY+XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgIGl0KCdzaG91bGQgbG9hZCB0ZW1wbGF0ZSBkZWZpbmVkIGluc2lkZSBzY3JpcHQgdGFnJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGVsZW1lbnQoYnkuY3NzKCcjdHBsLWxpbmsnKSkuY2xpY2soKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjdHBsLWNvbnRlbnQnKSkuZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IG9mIHRoZSB0ZW1wbGF0ZS8pO1xuICAgICAgfSk7XG4gICAgPC9maWxlPlxuICA8L2V4YW1wbGU+XG4gKi9cbnZhciBzY3JpcHREaXJlY3RpdmUgPSBbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0UnLFxuICAgIHRlcm1pbmFsOiB0cnVlLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgIGlmIChhdHRyLnR5cGUgPT09ICd0ZXh0L25nLXRlbXBsYXRlJykge1xuICAgICAgICB2YXIgdGVtcGxhdGVVcmwgPSBhdHRyLmlkLFxuICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRbMF0udGV4dDtcblxuICAgICAgICAkdGVtcGxhdGVDYWNoZS5wdXQodGVtcGxhdGVVcmwsIHRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1dO1xuXG4vKiBleHBvcnRlZCBzZWxlY3REaXJlY3RpdmUsIG9wdGlvbkRpcmVjdGl2ZSAqL1xuXG52YXIgbm9vcE5nTW9kZWxDb250cm9sbGVyID0geyAkc2V0Vmlld1ZhbHVlOiBub29wLCAkcmVuZGVyOiBub29wIH07XG5cbi8qKlxuICogQG5nZG9jIHR5cGVcbiAqIEBuYW1lICBzZWxlY3QuU2VsZWN0Q29udHJvbGxlclxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgY29udHJvbGxlciBmb3IgdGhlIGA8c2VsZWN0PmAgZGlyZWN0aXZlLiBUaGlzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHJlYWRpbmdcbiAqIGFuZCB3cml0aW5nIHRoZSBzZWxlY3RlZCB2YWx1ZShzKSBvZiB0aGUgY29udHJvbCBhbmQgYWxzbyBjb29yZGluYXRlcyBkeW5hbWljYWxseVxuICogYWRkZWQgYDxvcHRpb24+YCBlbGVtZW50cywgcGVyaGFwcyBieSBhbiBgbmdSZXBlYXRgIGRpcmVjdGl2ZS5cbiAqL1xudmFyIFNlbGVjdENvbnRyb2xsZXIgPVxuICAgICAgICBbJyRlbGVtZW50JywgJyRzY29wZScsIC8qKiBAdGhpcyAqLyBmdW5jdGlvbigkZWxlbWVudCwgJHNjb3BlKSB7XG5cbiAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgb3B0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7XG5cbiAgc2VsZi5zZWxlY3RWYWx1ZU1hcCA9IHt9OyAvLyBLZXlzIGFyZSB0aGUgaGFzaGVkIHZhbHVlcywgdmFsdWVzIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblxuICAvLyBJZiB0aGUgbmdNb2RlbCBkb2Vzbid0IGdldCBwcm92aWRlZCB0aGVuIHByb3ZpZGUgYSBkdW1teSBub29wIHZlcnNpb24gdG8gcHJldmVudCBlcnJvcnNcbiAgc2VsZi5uZ01vZGVsQ3RybCA9IG5vb3BOZ01vZGVsQ29udHJvbGxlcjtcbiAgc2VsZi5tdWx0aXBsZSA9IGZhbHNlO1xuXG4gIC8vIFRoZSBcInVua25vd25cIiBvcHRpb24gaXMgb25lIHRoYXQgaXMgcHJlcGVuZGVkIHRvIHRoZSBsaXN0IGlmIHRoZSB2aWV3VmFsdWVcbiAgLy8gZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBvcHRpb25zLiBXaGVuIGl0IGlzIHJlbmRlcmVkIHRoZSB2YWx1ZSBvZiB0aGUgdW5rbm93blxuICAvLyBvcHRpb24gaXMgJz8gWFhYID8nIHdoZXJlIFhYWCBpcyB0aGUgaGFzaEtleSBvZiB0aGUgdmFsdWUgdGhhdCBpcyBub3Qga25vd24uXG4gIC8vXG4gIC8vIFdlIGNhbid0IGp1c3QganFMaXRlKCc8b3B0aW9uPicpIHNpbmNlIGpxTGl0ZSBpcyBub3Qgc21hcnQgZW5vdWdoXG4gIC8vIHRvIGNyZWF0ZSBpdCBpbiA8c2VsZWN0PiBhbmQgSUUgYmFyZnMgb3RoZXJ3aXNlLlxuICBzZWxmLnVua25vd25PcHRpb24gPSBqcUxpdGUod2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpKTtcblxuICAvLyBUaGUgZW1wdHkgb3B0aW9uIGlzIGFuIG9wdGlvbiB3aXRoIHRoZSB2YWx1ZSAnJyB0aGF0IHRlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBjYW5cbiAgLy8gcHJvdmlkZSBpbnNpZGUgdGhlIHNlbGVjdC4gV2hlbiB0aGUgbW9kZWwgY2hhbmdlcyB0byBhIHZhbHVlIHRoYXQgZG9lc24ndCBtYXRjaCBhbiBvcHRpb24sXG4gIC8vIGl0IGlzIHNlbGVjdGVkIC0gc28gaWYgYW4gZW1wdHkgb3B0aW9uIGlzIHByb3ZpZGVkLCBubyB1bmtub3duIG9wdGlvbiBpcyBnZW5lcmF0ZWQuXG4gIC8vIEhvd2V2ZXIsIHRoZSBlbXB0eSBvcHRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgbW9kZWwgbWF0Y2hlcyBhbiBvcHRpb24uIEl0IGlzIGFsd2F5cyBzZWxlY3RhYmxlXG4gIC8vIGFuZCBpbmRpY2F0ZXMgdGhhdCBhIFwibnVsbFwiIHNlbGVjdGlvbiBoYXMgYmVlbiBtYWRlLlxuICBzZWxmLmhhc0VtcHR5T3B0aW9uID0gZmFsc2U7XG4gIHNlbGYuZW1wdHlPcHRpb24gPSB1bmRlZmluZWQ7XG5cbiAgc2VsZi5yZW5kZXJVbmtub3duT3B0aW9uID0gZnVuY3Rpb24odmFsKSB7XG4gICAgdmFyIHVua25vd25WYWwgPSBzZWxmLmdlbmVyYXRlVW5rbm93bk9wdGlvblZhbHVlKHZhbCk7XG4gICAgc2VsZi51bmtub3duT3B0aW9uLnZhbCh1bmtub3duVmFsKTtcbiAgICAkZWxlbWVudC5wcmVwZW5kKHNlbGYudW5rbm93bk9wdGlvbik7XG4gICAgc2V0T3B0aW9uQXNTZWxlY3RlZChzZWxmLnVua25vd25PcHRpb24pO1xuICAgICRlbGVtZW50LnZhbCh1bmtub3duVmFsKTtcbiAgfTtcblxuICBzZWxmLnVwZGF0ZVVua25vd25PcHRpb24gPSBmdW5jdGlvbih2YWwpIHtcbiAgICB2YXIgdW5rbm93blZhbCA9IHNlbGYuZ2VuZXJhdGVVbmtub3duT3B0aW9uVmFsdWUodmFsKTtcbiAgICBzZWxmLnVua25vd25PcHRpb24udmFsKHVua25vd25WYWwpO1xuICAgIHNldE9wdGlvbkFzU2VsZWN0ZWQoc2VsZi51bmtub3duT3B0aW9uKTtcbiAgICAkZWxlbWVudC52YWwodW5rbm93blZhbCk7XG4gIH07XG5cbiAgc2VsZi5nZW5lcmF0ZVVua25vd25PcHRpb25WYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHJldHVybiAnPyAnICsgaGFzaEtleSh2YWwpICsgJyA/JztcbiAgfTtcblxuICBzZWxmLnJlbW92ZVVua25vd25PcHRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoc2VsZi51bmtub3duT3B0aW9uLnBhcmVudCgpKSBzZWxmLnVua25vd25PcHRpb24ucmVtb3ZlKCk7XG4gIH07XG5cbiAgc2VsZi5zZWxlY3RFbXB0eU9wdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChzZWxmLmVtcHR5T3B0aW9uKSB7XG4gICAgICAkZWxlbWVudC52YWwoJycpO1xuICAgICAgc2V0T3B0aW9uQXNTZWxlY3RlZChzZWxmLmVtcHR5T3B0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgc2VsZi51bnNlbGVjdEVtcHR5T3B0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHNlbGYuaGFzRW1wdHlPcHRpb24pIHtcbiAgICAgIHNlbGYuZW1wdHlPcHRpb24ucmVtb3ZlQXR0cignc2VsZWN0ZWQnKTtcbiAgICB9XG4gIH07XG5cbiAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAvLyBkaXNhYmxlIHVua25vd24gb3B0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZG8gd29yayB3aGVuIHRoZSB3aG9sZSBzZWxlY3QgaXMgYmVpbmcgZGVzdHJveWVkXG4gICAgc2VsZi5yZW5kZXJVbmtub3duT3B0aW9uID0gbm9vcDtcbiAgfSk7XG5cbiAgLy8gUmVhZCB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdCBjb250cm9sLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjaGFuZ2VzIGRlcGVuZGluZ1xuICAvLyB1cG9uIHdoZXRoZXIgdGhlIHNlbGVjdCBjYW4gaGF2ZSBtdWx0aXBsZSB2YWx1ZXMgYW5kIHdoZXRoZXIgbmdPcHRpb25zIGlzIGF0IHdvcmsuXG4gIHNlbGYucmVhZFZhbHVlID0gZnVuY3Rpb24gcmVhZFNpbmdsZVZhbHVlKCkge1xuICAgIHZhciB2YWwgPSAkZWxlbWVudC52YWwoKTtcbiAgICAvLyBuZ1ZhbHVlIGFkZGVkIG9wdGlvbiB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgc2VsZWN0VmFsdWVNYXAsIG5vcm1hbCBpbnRlcnBvbGF0aW9ucyBhcmUgbm90XG4gICAgdmFyIHJlYWxWYWwgPSB2YWwgaW4gc2VsZi5zZWxlY3RWYWx1ZU1hcCA/IHNlbGYuc2VsZWN0VmFsdWVNYXBbdmFsXSA6IHZhbDtcblxuICAgIGlmIChzZWxmLmhhc09wdGlvbihyZWFsVmFsKSkge1xuICAgICAgcmV0dXJuIHJlYWxWYWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cblxuICAvLyBXcml0ZSB0aGUgdmFsdWUgdG8gdGhlIHNlbGVjdCBjb250cm9sLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjaGFuZ2VzIGRlcGVuZGluZ1xuICAvLyB1cG9uIHdoZXRoZXIgdGhlIHNlbGVjdCBjYW4gaGF2ZSBtdWx0aXBsZSB2YWx1ZXMgYW5kIHdoZXRoZXIgbmdPcHRpb25zIGlzIGF0IHdvcmsuXG4gIHNlbGYud3JpdGVWYWx1ZSA9IGZ1bmN0aW9uIHdyaXRlU2luZ2xlVmFsdWUodmFsdWUpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgZnJvbSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBvcHRpb25cbiAgICAvLyBPdGhlcndpc2UsIHNjcmVlbiByZWFkZXJzIG1pZ2h0IGdldCBjb25mdXNlZFxuICAgIHZhciBjdXJyZW50bHlTZWxlY3RlZE9wdGlvbiA9ICRlbGVtZW50WzBdLm9wdGlvbnNbJGVsZW1lbnRbMF0uc2VsZWN0ZWRJbmRleF07XG4gICAgaWYgKGN1cnJlbnRseVNlbGVjdGVkT3B0aW9uKSBjdXJyZW50bHlTZWxlY3RlZE9wdGlvbi5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG5cbiAgICBpZiAoc2VsZi5oYXNPcHRpb24odmFsdWUpKSB7XG4gICAgICBzZWxmLnJlbW92ZVVua25vd25PcHRpb24oKTtcblxuICAgICAgdmFyIGhhc2hlZFZhbCA9IGhhc2hLZXkodmFsdWUpO1xuICAgICAgJGVsZW1lbnQudmFsKGhhc2hlZFZhbCBpbiBzZWxmLnNlbGVjdFZhbHVlTWFwID8gaGFzaGVkVmFsIDogdmFsdWUpO1xuXG4gICAgICAvLyBTZXQgc2VsZWN0ZWQgYXR0cmlidXRlIGFuZCBwcm9wZXJ0eSBvbiBzZWxlY3RlZCBvcHRpb24gZm9yIHNjcmVlbiByZWFkZXJzXG4gICAgICB2YXIgc2VsZWN0ZWRPcHRpb24gPSAkZWxlbWVudFswXS5vcHRpb25zWyRlbGVtZW50WzBdLnNlbGVjdGVkSW5kZXhdO1xuICAgICAgc2V0T3B0aW9uQXNTZWxlY3RlZChqcUxpdGUoc2VsZWN0ZWRPcHRpb24pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgc2VsZi5lbXB0eU9wdGlvbikge1xuICAgICAgICBzZWxmLnJlbW92ZVVua25vd25PcHRpb24oKTtcbiAgICAgICAgc2VsZi5zZWxlY3RFbXB0eU9wdGlvbigpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLnVua25vd25PcHRpb24ucGFyZW50KCkubGVuZ3RoKSB7XG4gICAgICAgIHNlbGYudXBkYXRlVW5rbm93bk9wdGlvbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnJlbmRlclVua25vd25PcHRpb24odmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuXG4gIC8vIFRlbGwgdGhlIHNlbGVjdCBjb250cm9sIHRoYXQgYW4gb3B0aW9uLCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSwgaGFzIGJlZW4gYWRkZWRcbiAgc2VsZi5hZGRPcHRpb24gPSBmdW5jdGlvbih2YWx1ZSwgZWxlbWVudCkge1xuICAgIC8vIFNraXAgY29tbWVudCBub2RlcywgYXMgdGhleSBvbmx5IHBvbGx1dGUgdGhlIGBvcHRpb25zTWFwYFxuICAgIGlmIChlbGVtZW50WzBdLm5vZGVUeXBlID09PSBOT0RFX1RZUEVfQ09NTUVOVCkgcmV0dXJuO1xuXG4gICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkodmFsdWUsICdcIm9wdGlvbiB2YWx1ZVwiJyk7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgc2VsZi5oYXNFbXB0eU9wdGlvbiA9IHRydWU7XG4gICAgICBzZWxmLmVtcHR5T3B0aW9uID0gZWxlbWVudDtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gb3B0aW9uc01hcC5nZXQodmFsdWUpIHx8IDA7XG4gICAgb3B0aW9uc01hcC5wdXQodmFsdWUsIGNvdW50ICsgMSk7XG4gICAgLy8gT25seSByZW5kZXIgYXQgdGhlIGVuZCBvZiBhIGRpZ2VzdC4gVGhpcyBpbXByb3ZlcyByZW5kZXIgcGVyZm9ybWFuY2Ugd2hlbiBtYW55IG9wdGlvbnNcbiAgICAvLyBhcmUgYWRkZWQgZHVyaW5nIGEgZGlnZXN0IGFuZCBlbnN1cmVzIGFsbCByZWxldmFudCBvcHRpb25zIGFyZSBjb3JyZWN0bHkgbWFya2VkIGFzIHNlbGVjdGVkXG4gICAgc2NoZWR1bGVSZW5kZXIoKTtcbiAgfTtcblxuICAvLyBUZWxsIHRoZSBzZWxlY3QgY29udHJvbCB0aGF0IGFuIG9wdGlvbiwgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGhhcyBiZWVuIHJlbW92ZWRcbiAgc2VsZi5yZW1vdmVPcHRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBjb3VudCA9IG9wdGlvbnNNYXAuZ2V0KHZhbHVlKTtcbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICBvcHRpb25zTWFwLnJlbW92ZSh2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICBzZWxmLmhhc0VtcHR5T3B0aW9uID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5lbXB0eU9wdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uc01hcC5wdXQodmFsdWUsIGNvdW50IC0gMSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdCBjb250cm9sIGhhcyBhbiBvcHRpb24gbWF0Y2hpbmcgdGhlIGdpdmVuIHZhbHVlXG4gIHNlbGYuaGFzT3B0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gISFvcHRpb25zTWFwLmdldCh2YWx1ZSk7XG4gIH07XG5cblxuICB2YXIgcmVuZGVyU2NoZWR1bGVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHNjaGVkdWxlUmVuZGVyKCkge1xuICAgIGlmIChyZW5kZXJTY2hlZHVsZWQpIHJldHVybjtcbiAgICByZW5kZXJTY2hlZHVsZWQgPSB0cnVlO1xuICAgICRzY29wZS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKSB7XG4gICAgICByZW5kZXJTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYubmdNb2RlbEN0cmwuJHJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBzY2hlZHVsZVZpZXdWYWx1ZVVwZGF0ZShyZW5kZXJBZnRlcikge1xuICAgIGlmICh1cGRhdGVTY2hlZHVsZWQpIHJldHVybjtcblxuICAgIHVwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG5cbiAgICAkc2NvcGUuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCRzY29wZS4kJGRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgICB1cGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYubmdNb2RlbEN0cmwuJHNldFZpZXdWYWx1ZShzZWxmLnJlYWRWYWx1ZSgpKTtcbiAgICAgIGlmIChyZW5kZXJBZnRlcikgc2VsZi5uZ01vZGVsQ3RybC4kcmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cblxuXG4gIHNlbGYucmVnaXN0ZXJPcHRpb24gPSBmdW5jdGlvbihvcHRpb25TY29wZSwgb3B0aW9uRWxlbWVudCwgb3B0aW9uQXR0cnMsIGludGVycG9sYXRlVmFsdWVGbiwgaW50ZXJwb2xhdGVUZXh0Rm4pIHtcblxuICAgIGlmIChvcHRpb25BdHRycy4kYXR0ci5uZ1ZhbHVlKSB7XG4gICAgICAvLyBUaGUgdmFsdWUgYXR0cmlidXRlIGlzIHNldCBieSBuZ1ZhbHVlXG4gICAgICB2YXIgb2xkVmFsLCBoYXNoZWRWYWwgPSBOYU47XG4gICAgICBvcHRpb25BdHRycy4kb2JzZXJ2ZSgndmFsdWUnLCBmdW5jdGlvbiB2YWx1ZUF0dHJpYnV0ZU9ic2VydmVBY3Rpb24obmV3VmFsKSB7XG5cbiAgICAgICAgdmFyIHJlbW92YWw7XG4gICAgICAgIHZhciBwcmV2aW91c2x5U2VsZWN0ZWQgPSBvcHRpb25FbGVtZW50LnByb3AoJ3NlbGVjdGVkJyk7XG5cbiAgICAgICAgaWYgKGlzRGVmaW5lZChoYXNoZWRWYWwpKSB7XG4gICAgICAgICAgc2VsZi5yZW1vdmVPcHRpb24ob2xkVmFsKTtcbiAgICAgICAgICBkZWxldGUgc2VsZi5zZWxlY3RWYWx1ZU1hcFtoYXNoZWRWYWxdO1xuICAgICAgICAgIHJlbW92YWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzaGVkVmFsID0gaGFzaEtleShuZXdWYWwpO1xuICAgICAgICBvbGRWYWwgPSBuZXdWYWw7XG4gICAgICAgIHNlbGYuc2VsZWN0VmFsdWVNYXBbaGFzaGVkVmFsXSA9IG5ld1ZhbDtcbiAgICAgICAgc2VsZi5hZGRPcHRpb24obmV3VmFsLCBvcHRpb25FbGVtZW50KTtcbiAgICAgICAgLy8gU2V0IHRoZSBhdHRyaWJ1dGUgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyBvcHRpb25BdHRycy4kc2V0IC0gdGhpcyBzdG9wcyB0aGUgb2JzZXJ2ZXJcbiAgICAgICAgLy8gZnJvbSBmaXJpbmcgYSBzZWNvbmQgdGltZS4gT3RoZXIgJG9ic2VydmVycyBvbiB2YWx1ZSB3aWxsIGFsc28gZ2V0IHRoZSByZXN1bHQgb2YgdGhlXG4gICAgICAgIC8vIG5nVmFsdWUgZXhwcmVzc2lvbiwgbm90IHRoZSBoYXNoZWQgdmFsdWVcbiAgICAgICAgb3B0aW9uRWxlbWVudC5hdHRyKCd2YWx1ZScsIGhhc2hlZFZhbCk7XG5cbiAgICAgICAgaWYgKHJlbW92YWwgJiYgcHJldmlvdXNseVNlbGVjdGVkKSB7XG4gICAgICAgICAgc2NoZWR1bGVWaWV3VmFsdWVVcGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGludGVycG9sYXRlVmFsdWVGbikge1xuICAgICAgLy8gVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBpbnRlcnBvbGF0ZWRcbiAgICAgIG9wdGlvbkF0dHJzLiRvYnNlcnZlKCd2YWx1ZScsIGZ1bmN0aW9uIHZhbHVlQXR0cmlidXRlT2JzZXJ2ZUFjdGlvbihuZXdWYWwpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gaW4gbmdPcHRpb25zIGFuZCBoYXMgc2lkZS1lZmZlY3RzIVxuICAgICAgICBzZWxmLnJlYWRWYWx1ZSgpO1xuXG4gICAgICAgIHZhciByZW1vdmFsO1xuICAgICAgICB2YXIgcHJldmlvdXNseVNlbGVjdGVkID0gb3B0aW9uRWxlbWVudC5wcm9wKCdzZWxlY3RlZCcpO1xuXG4gICAgICAgIGlmIChpc0RlZmluZWQob2xkVmFsKSkge1xuICAgICAgICAgIHNlbGYucmVtb3ZlT3B0aW9uKG9sZFZhbCk7XG4gICAgICAgICAgcmVtb3ZhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkVmFsID0gbmV3VmFsO1xuICAgICAgICBzZWxmLmFkZE9wdGlvbihuZXdWYWwsIG9wdGlvbkVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChyZW1vdmFsICYmIHByZXZpb3VzbHlTZWxlY3RlZCkge1xuICAgICAgICAgIHNjaGVkdWxlVmlld1ZhbHVlVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGVUZXh0Rm4pIHtcbiAgICAgIC8vIFRoZSB0ZXh0IGNvbnRlbnQgaXMgaW50ZXJwb2xhdGVkXG4gICAgICBvcHRpb25TY29wZS4kd2F0Y2goaW50ZXJwb2xhdGVUZXh0Rm4sIGZ1bmN0aW9uIGludGVycG9sYXRlV2F0Y2hBY3Rpb24obmV3VmFsLCBvbGRWYWwpIHtcbiAgICAgICAgb3B0aW9uQXR0cnMuJHNldCgndmFsdWUnLCBuZXdWYWwpO1xuICAgICAgICB2YXIgcHJldmlvdXNseVNlbGVjdGVkID0gb3B0aW9uRWxlbWVudC5wcm9wKCdzZWxlY3RlZCcpO1xuICAgICAgICBpZiAob2xkVmFsICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICBzZWxmLnJlbW92ZU9wdGlvbihvbGRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuYWRkT3B0aW9uKG5ld1ZhbCwgb3B0aW9uRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKG9sZFZhbCAmJiBwcmV2aW91c2x5U2VsZWN0ZWQpIHtcbiAgICAgICAgICBzY2hlZHVsZVZpZXdWYWx1ZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBzdGF0aWNcbiAgICAgIHNlbGYuYWRkT3B0aW9uKG9wdGlvbkF0dHJzLnZhbHVlLCBvcHRpb25FbGVtZW50KTtcbiAgICB9XG5cblxuICAgIG9wdGlvbkF0dHJzLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uKG5ld1ZhbCkge1xuXG4gICAgICAvLyBTaW5jZSBtb2RlbCB1cGRhdGVzIHdpbGwgYWxzbyBzZWxlY3QgZGlzYWJsZWQgb3B0aW9ucyAobGlrZSBuZ09wdGlvbnMpLFxuICAgICAgLy8gd2Ugb25seSBoYXZlIHRvIGhhbmRsZSBvcHRpb25zIGJlY29taW5nIGRpc2FibGVkLCBub3QgZW5hYmxlZFxuXG4gICAgICBpZiAobmV3VmFsID09PSAndHJ1ZScgfHwgbmV3VmFsICYmIG9wdGlvbkVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnKSkge1xuICAgICAgICBpZiAoc2VsZi5tdWx0aXBsZSkge1xuICAgICAgICAgIHNjaGVkdWxlVmlld1ZhbHVlVXBkYXRlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYubmdNb2RlbEN0cmwuJHNldFZpZXdWYWx1ZShudWxsKTtcbiAgICAgICAgICBzZWxmLm5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgb3B0aW9uRWxlbWVudC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBzZWxmLnJlYWRWYWx1ZSgpO1xuICAgICAgdmFyIHJlbW92ZVZhbHVlID0gb3B0aW9uQXR0cnMudmFsdWU7XG5cbiAgICAgIHNlbGYucmVtb3ZlT3B0aW9uKHJlbW92ZVZhbHVlKTtcbiAgICAgIHNlbGYubmdNb2RlbEN0cmwuJHJlbmRlcigpO1xuXG4gICAgICBpZiAoc2VsZi5tdWx0aXBsZSAmJiBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmluZGV4T2YocmVtb3ZlVmFsdWUpICE9PSAtMSB8fFxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9PT0gcmVtb3ZlVmFsdWVcbiAgICAgICkge1xuICAgICAgICAvLyBXaGVuIG11bHRpcGxlIChzZWxlY3RlZCkgb3B0aW9ucyBhcmUgZGVzdHJveWVkIGF0IHRoZSBzYW1lIHRpbWUsIHdlIGRvbid0IHdhbnRcbiAgICAgICAgLy8gdG8gcnVuIGEgbW9kZWwgdXBkYXRlIGZvciBlYWNoIG9mIHRoZW0uIEluc3RlYWQsIHJ1biBhIHNpbmdsZSB1cGRhdGUgaW4gdGhlICQkcG9zdERpZ2VzdFxuICAgICAgICBzY2hlZHVsZVZpZXdWYWx1ZVVwZGF0ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzZXRPcHRpb25Bc1NlbGVjdGVkKG9wdGlvbkVsKSB7XG4gICAgb3B0aW9uRWwucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgLy8gbmVlZGVkIGZvciBJRVxuICAgIG9wdGlvbkVsLmF0dHIoJ3NlbGVjdGVkJywgdHJ1ZSk7XG4gIH1cbn1dO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIHNlbGVjdFxuICogQHJlc3RyaWN0IEVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUTUwgYHNlbGVjdGAgZWxlbWVudCB3aXRoIGFuZ3VsYXIgZGF0YS1iaW5kaW5nLlxuICpcbiAqIFRoZSBgc2VsZWN0YCBkaXJlY3RpdmUgaXMgdXNlZCB0b2dldGhlciB3aXRoIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0gdG8gcHJvdmlkZSBkYXRhLWJpbmRpbmdcbiAqIGJldHdlZW4gdGhlIHNjb3BlIGFuZCB0aGUgYDxzZWxlY3Q+YCBjb250cm9sIChpbmNsdWRpbmcgc2V0dGluZyBkZWZhdWx0IHZhbHVlcykuXG4gKiBJdCBhbHNvIGhhbmRsZXMgZHluYW1pYyBgPG9wdGlvbj5gIGVsZW1lbnRzLCB3aGljaCBjYW4gYmUgYWRkZWQgdXNpbmcgdGhlIHtAbGluayBuZ1JlcGVhdCBgbmdSZXBlYXR9YCBvclxuICoge0BsaW5rIG5nT3B0aW9ucyBgbmdPcHRpb25zYH0gZGlyZWN0aXZlcy5cbiAqXG4gKiBXaGVuIGFuIGl0ZW0gaW4gdGhlIGA8c2VsZWN0PmAgbWVudSBpcyBzZWxlY3RlZCwgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gd2lsbCBiZSBib3VuZFxuICogdG8gdGhlIG1vZGVsIGlkZW50aWZpZWQgYnkgdGhlIGBuZ01vZGVsYCBkaXJlY3RpdmUuIFdpdGggc3RhdGljIG9yIHJlcGVhdGVkIG9wdGlvbnMsIHRoaXMgaXNcbiAqIHRoZSBjb250ZW50IG9mIHRoZSBgdmFsdWVgIGF0dHJpYnV0ZSBvciB0aGUgdGV4dENvbnRlbnQgb2YgdGhlIGA8b3B0aW9uPmAsIGlmIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgbWlzc2luZy5cbiAqIFZhbHVlIGFuZCB0ZXh0Q29udGVudCBjYW4gYmUgaW50ZXJwb2xhdGVkLlxuICpcbiAqICMjIE1hdGNoaW5nIG1vZGVsIGFuZCBvcHRpb24gdmFsdWVzXG4gKlxuICogSW4gZ2VuZXJhbCwgdGhlIG1hdGNoIGJldHdlZW4gdGhlIG1vZGVsIGFuZCBhbiBvcHRpb24gaXMgZXZhbHVhdGVkIGJ5IHN0cmljdGx5IGNvbXBhcmluZyB0aGUgbW9kZWxcbiAqIHZhbHVlIGFnYWluc3QgdGhlIHZhbHVlIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAqXG4gKiBJZiB5b3UgYXJlIHNldHRpbmcgdGhlIG9wdGlvbiB2YWx1ZSB3aXRoIHRoZSBvcHRpb24ncyBgdmFsdWVgIGF0dHJpYnV0ZSwgb3IgdGV4dENvbnRlbnQsIHRoZVxuICogdmFsdWUgd2lsbCBhbHdheXMgYmUgYSBgc3RyaW5nYCB3aGljaCBtZWFucyB0aGF0IHRoZSBtb2RlbCB2YWx1ZSBtdXN0IGFsc28gYmUgYSBzdHJpbmcuXG4gKiBPdGhlcndpc2UgdGhlIGBzZWxlY3RgIGRpcmVjdGl2ZSBjYW5ub3QgbWF0Y2ggdGhlbSBjb3JyZWN0bHkuXG4gKlxuICogVG8gYmluZCB0aGUgbW9kZWwgdG8gYSBub24tc3RyaW5nIHZhbHVlLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzOlxuICogLSB0aGUge0BsaW5rIG5nLm5nT3B0aW9ucyBgbmdPcHRpb25zYH0gZGlyZWN0aXZlXG4gKiAgICh7QGxpbmsgbmcuc2VsZWN0I3VzaW5nLXNlbGVjdC13aXRoLW5nb3B0aW9ucy1hbmQtc2V0dGluZy1hLWRlZmF1bHQtdmFsdWV9KVxuICogLSB0aGUge0BsaW5rIG5nLm5nVmFsdWUgYG5nVmFsdWVgfSBkaXJlY3RpdmUsIHdoaWNoIGFsbG93cyBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgdG8gYmVcbiAqICAgb3B0aW9uIHZhbHVlcyAoe0BsaW5rIG5nLnNlbGVjdCN1c2luZy1uZ3ZhbHVlLXRvLWJpbmQtdGhlLW1vZGVsLXRvLWFuLWFycmF5LW9mLW9iamVjdHMgRXhhbXBsZX0pXG4gKiAtIG1vZGVsICRwYXJzZXJzIC8gJGZvcm1hdHRlcnMgdG8gY29udmVydCB0aGUgc3RyaW5nIHZhbHVlXG4gKiAgICh7QGxpbmsgbmcuc2VsZWN0I2JpbmRpbmctc2VsZWN0LXRvLWEtbm9uLXN0cmluZy12YWx1ZS12aWEtbmdtb2RlbC1wYXJzaW5nLWZvcm1hdHRpbmcgRXhhbXBsZX0pXG4gKlxuICogSWYgdGhlIHZpZXdWYWx1ZSBvZiBgbmdNb2RlbGAgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBvcHRpb25zLCB0aGVuIHRoZSBjb250cm9sXG4gKiB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIGFuIFwidW5rbm93blwiIG9wdGlvbiwgd2hpY2ggaXQgdGhlbiByZW1vdmVzIHdoZW4gdGhlIG1pc21hdGNoIGlzIHJlc29sdmVkLlxuICpcbiAqIE9wdGlvbmFsbHksIGEgc2luZ2xlIGhhcmQtY29kZWQgYDxvcHRpb24+YCBlbGVtZW50LCB3aXRoIHRoZSB2YWx1ZSBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLCBjYW5cbiAqIGJlIG5lc3RlZCBpbnRvIHRoZSBgPHNlbGVjdD5gIGVsZW1lbnQuIFRoaXMgZWxlbWVudCB3aWxsIHRoZW4gcmVwcmVzZW50IHRoZSBgbnVsbGAgb3IgXCJub3Qgc2VsZWN0ZWRcIlxuICogb3B0aW9uLiBTZWUgZXhhbXBsZSBiZWxvdyBmb3IgZGVtb25zdHJhdGlvbi5cbiAqXG4gKiAjIyBDaG9vc2luZyBiZXR3ZWVuIGBuZ1JlcGVhdGAgYW5kIGBuZ09wdGlvbnNgXG4gKlxuICogSW4gbWFueSBjYXNlcywgYG5nUmVwZWF0YCBjYW4gYmUgdXNlZCBvbiBgPG9wdGlvbj5gIGVsZW1lbnRzIGluc3RlYWQgb2Yge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ09wdGlvbnNcbiAqIG5nT3B0aW9uc30gdG8gYWNoaWV2ZSBhIHNpbWlsYXIgcmVzdWx0LiBIb3dldmVyLCBgbmdPcHRpb25zYCBwcm92aWRlcyBzb21lIGJlbmVmaXRzOlxuICogLSBtb3JlIGZsZXhpYmlsaXR5IGluIGhvdyB0aGUgYDxzZWxlY3Q+YCdzIG1vZGVsIGlzIGFzc2lnbmVkIHZpYSB0aGUgYHNlbGVjdGAgKipgYXNgKiogcGFydCBvZiB0aGVcbiAqIGNvbXByZWhlbnNpb24gZXhwcmVzc2lvblxuICogLSByZWR1Y2VkIG1lbW9yeSBjb25zdW1wdGlvbiBieSBub3QgY3JlYXRpbmcgYSBuZXcgc2NvcGUgZm9yIGVhY2ggcmVwZWF0ZWQgaW5zdGFuY2VcbiAqIC0gaW5jcmVhc2VkIHJlbmRlciBzcGVlZCBieSBjcmVhdGluZyB0aGUgb3B0aW9ucyBpbiBhIGRvY3VtZW50RnJhZ21lbnQgaW5zdGVhZCBvZiBpbmRpdmlkdWFsbHlcbiAqXG4gKiBTcGVjaWZpY2FsbHksIHNlbGVjdCB3aXRoIHJlcGVhdGVkIG9wdGlvbnMgc2xvd3MgZG93biBzaWduaWZpY2FudGx5IHN0YXJ0aW5nIGF0IDIwMDAgb3B0aW9ucyBpblxuICogQ2hyb21lIGFuZCBJbnRlcm5ldCBFeHBsb3JlciAvIEVkZ2UuXG4gKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbXVsdGlwbGUgQWxsb3dzIG11bHRpcGxlIG9wdGlvbnMgdG8gYmUgc2VsZWN0ZWQuIFRoZSBzZWxlY3RlZCB2YWx1ZXMgd2lsbCBiZVxuICogICAgIGJvdW5kIHRvIHRoZSBtb2RlbCBhcyBhbiBhcnJheS5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIHJlcXVpcmVkIGF0dHJpYnV0ZSBhbmQgcmVxdWlyZWQgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gKiB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBuZ1JlcXVpcmVkIGluc3RlYWQgb2YgcmVxdWlyZWRcbiAqIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIHNlbGVjdGVkIG9wdGlvbihzKSBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBzZWxlY3QgZWxlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdPcHRpb25zIHNldHMgdGhlIG9wdGlvbnMgdGhhdCB0aGUgc2VsZWN0IGlzIHBvcHVsYXRlZCB3aXRoIGFuZCBkZWZpbmVzIHdoYXQgaXNcbiAqIHNldCBvbiB0aGUgbW9kZWwgb24gc2VsZWN0aW9uLiBTZWUge0BsaW5rIG5nT3B0aW9ucyBgbmdPcHRpb25zYH0uXG4gKlxuICogQGV4YW1wbGVcbiAqICMjIyBTaW1wbGUgYHNlbGVjdGAgZWxlbWVudHMgd2l0aCBzdGF0aWMgb3B0aW9uc1xuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJzdGF0aWMtc2VsZWN0XCIgbW9kdWxlPVwic3RhdGljU2VsZWN0XCI+XG4gKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiPlxuICogICAgIDxsYWJlbCBmb3I9XCJzaW5nbGVTZWxlY3RcIj4gU2luZ2xlIHNlbGVjdDogPC9sYWJlbD48YnI+XG4gKiAgICAgPHNlbGVjdCBuYW1lPVwic2luZ2xlU2VsZWN0XCIgbmctbW9kZWw9XCJkYXRhLnNpbmdsZVNlbGVjdFwiPlxuICogICAgICAgPG9wdGlvbiB2YWx1ZT1cIm9wdGlvbi0xXCI+T3B0aW9uIDE8L29wdGlvbj5cbiAqICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcHRpb24tMlwiPk9wdGlvbiAyPC9vcHRpb24+XG4gKiAgICAgPC9zZWxlY3Q+PGJyPlxuICpcbiAqICAgICA8bGFiZWwgZm9yPVwic2luZ2xlU2VsZWN0XCI+IFNpbmdsZSBzZWxlY3Qgd2l0aCBcIm5vdCBzZWxlY3RlZFwiIG9wdGlvbiBhbmQgZHluYW1pYyBvcHRpb24gdmFsdWVzOiA8L2xhYmVsPjxicj5cbiAqICAgICA8c2VsZWN0IG5hbWU9XCJzaW5nbGVTZWxlY3RcIiBpZD1cInNpbmdsZVNlbGVjdFwiIG5nLW1vZGVsPVwiZGF0YS5zaW5nbGVTZWxlY3RcIj5cbiAqICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLS1QbGVhc2Ugc2VsZWN0LS0tPC9vcHRpb24+IDwhLS0gbm90IHNlbGVjdGVkIC8gYmxhbmsgb3B0aW9uIC0tPlxuICogICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7ZGF0YS5vcHRpb24xfX1cIj5PcHRpb24gMTwvb3B0aW9uPiA8IS0tIGludGVycG9sYXRpb24gLS0+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwib3B0aW9uLTJcIj5PcHRpb24gMjwvb3B0aW9uPlxuICogICAgIDwvc2VsZWN0Pjxicj5cbiAqICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiZm9yY2VVbmtub3duT3B0aW9uKClcIj5Gb3JjZSB1bmtub3duIG9wdGlvbjwvYnV0dG9uPjxicj5cbiAqICAgICA8dHQ+c2luZ2xlU2VsZWN0ID0ge3tkYXRhLnNpbmdsZVNlbGVjdH19PC90dD5cbiAqXG4gKiAgICAgPGhyPlxuICogICAgIDxsYWJlbCBmb3I9XCJtdWx0aXBsZVNlbGVjdFwiPiBNdWx0aXBsZSBzZWxlY3Q6IDwvbGFiZWw+PGJyPlxuICogICAgIDxzZWxlY3QgbmFtZT1cIm11bHRpcGxlU2VsZWN0XCIgaWQ9XCJtdWx0aXBsZVNlbGVjdFwiIG5nLW1vZGVsPVwiZGF0YS5tdWx0aXBsZVNlbGVjdFwiIG11bHRpcGxlPlxuICogICAgICAgPG9wdGlvbiB2YWx1ZT1cIm9wdGlvbi0xXCI+T3B0aW9uIDE8L29wdGlvbj5cbiAqICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcHRpb24tMlwiPk9wdGlvbiAyPC9vcHRpb24+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwib3B0aW9uLTNcIj5PcHRpb24gMzwvb3B0aW9uPlxuICogICAgIDwvc2VsZWN0Pjxicj5cbiAqICAgICA8dHQ+bXVsdGlwbGVTZWxlY3QgPSB7e2RhdGEubXVsdGlwbGVTZWxlY3R9fTwvdHQ+PGJyLz5cbiAqICAgPC9mb3JtPlxuICogPC9kaXY+XG4gKiA8L2ZpbGU+XG4gKiA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgYW5ndWxhci5tb2R1bGUoJ3N0YXRpY1NlbGVjdCcsIFtdKVxuICogICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgJHNjb3BlLmRhdGEgPSB7XG4gKiAgICAgICBzaW5nbGVTZWxlY3Q6IG51bGwsXG4gKiAgICAgICBtdWx0aXBsZVNlbGVjdDogW10sXG4gKiAgICAgICBvcHRpb24xOiAnb3B0aW9uLTEnXG4gKiAgICAgIH07XG4gKlxuICogICAgICAkc2NvcGUuZm9yY2VVbmtub3duT3B0aW9uID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgJHNjb3BlLmRhdGEuc2luZ2xlU2VsZWN0ID0gJ25vbnNlbnNlJztcbiAqICAgICAgfTtcbiAqICAgfV0pO1xuICogPC9maWxlPlxuICo8L2V4YW1wbGU+XG4gKlxuICogIyMjIFVzaW5nIGBuZ1JlcGVhdGAgdG8gZ2VuZXJhdGUgYHNlbGVjdGAgb3B0aW9uc1xuICogPGV4YW1wbGUgbmFtZT1cInNlbGVjdC1uZ3JlcGVhdFwiIG1vZHVsZT1cIm5ncmVwZWF0U2VsZWN0XCI+XG4gKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiPlxuICogICAgIDxsYWJlbCBmb3I9XCJyZXBlYXRTZWxlY3RcIj4gUmVwZWF0IHNlbGVjdDogPC9sYWJlbD5cbiAqICAgICA8c2VsZWN0IG5hbWU9XCJyZXBlYXRTZWxlY3RcIiBpZD1cInJlcGVhdFNlbGVjdFwiIG5nLW1vZGVsPVwiZGF0YS5tb2RlbFwiPlxuICogICAgICAgPG9wdGlvbiBuZy1yZXBlYXQ9XCJvcHRpb24gaW4gZGF0YS5hdmFpbGFibGVPcHRpb25zXCIgdmFsdWU9XCJ7e29wdGlvbi5pZH19XCI+e3tvcHRpb24ubmFtZX19PC9vcHRpb24+XG4gKiAgICAgPC9zZWxlY3Q+XG4gKiAgIDwvZm9ybT5cbiAqICAgPGhyPlxuICogICA8dHQ+bW9kZWwgPSB7e2RhdGEubW9kZWx9fTwvdHQ+PGJyLz5cbiAqIDwvZGl2PlxuICogPC9maWxlPlxuICogPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogIGFuZ3VsYXIubW9kdWxlKCduZ3JlcGVhdFNlbGVjdCcsIFtdKVxuICogICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgJHNjb3BlLmRhdGEgPSB7XG4gKiAgICAgICBtb2RlbDogbnVsbCxcbiAqICAgICAgIGF2YWlsYWJsZU9wdGlvbnM6IFtcbiAqICAgICAgICAge2lkOiAnMScsIG5hbWU6ICdPcHRpb24gQSd9LFxuICogICAgICAgICB7aWQ6ICcyJywgbmFtZTogJ09wdGlvbiBCJ30sXG4gKiAgICAgICAgIHtpZDogJzMnLCBuYW1lOiAnT3B0aW9uIEMnfVxuICogICAgICAgXVxuICogICAgICB9O1xuICogICB9XSk7XG4gKiA8L2ZpbGU+XG4gKjwvZXhhbXBsZT5cbiAqXG4gKiAjIyMgVXNpbmcgYG5nVmFsdWVgIHRvIGJpbmQgdGhlIG1vZGVsIHRvIGFuIGFycmF5IG9mIG9iamVjdHNcbiAqIDxleGFtcGxlIG5hbWU9XCJzZWxlY3Qtbmd2YWx1ZVwiIG1vZHVsZT1cIm5ndmFsdWVTZWxlY3RcIj5cbiAqIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICA8Zm9ybSBuYW1lPVwibXlGb3JtXCI+XG4gKiAgICAgPGxhYmVsIGZvcj1cIm5ndmFsdWVzZWxlY3RcIj4gbmd2YWx1ZSBzZWxlY3Q6IDwvbGFiZWw+XG4gKiAgICAgPHNlbGVjdCBzaXplPVwiNlwiIG5hbWU9XCJuZ3ZhbHVlc2VsZWN0XCIgbmctbW9kZWw9XCJkYXRhLm1vZGVsXCIgbXVsdGlwbGU+XG4gKiAgICAgICA8b3B0aW9uIG5nLXJlcGVhdD1cIm9wdGlvbiBpbiBkYXRhLmF2YWlsYWJsZU9wdGlvbnNcIiBuZy12YWx1ZT1cIm9wdGlvbi52YWx1ZVwiPnt7b3B0aW9uLm5hbWV9fTwvb3B0aW9uPlxuICogICAgIDwvc2VsZWN0PlxuICogICA8L2Zvcm0+XG4gKiAgIDxocj5cbiAqICAgPHByZT5tb2RlbCA9IHt7ZGF0YS5tb2RlbCB8IGpzb259fTwvcHJlPjxici8+XG4gKiA8L2Rpdj5cbiAqIDwvZmlsZT5cbiAqIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAqICBhbmd1bGFyLm1vZHVsZSgnbmd2YWx1ZVNlbGVjdCcsIFtdKVxuICogICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgJHNjb3BlLmRhdGEgPSB7XG4gKiAgICAgICBtb2RlbDogbnVsbCxcbiAqICAgICAgIGF2YWlsYWJsZU9wdGlvbnM6IFtcbiAgICAgICAgICAge3ZhbHVlOiAnbXlTdHJpbmcnLCBuYW1lOiAnc3RyaW5nJ30sXG4gICAgICAgICAgIHt2YWx1ZTogMSwgbmFtZTogJ2ludGVnZXInfSxcbiAgICAgICAgICAge3ZhbHVlOiB0cnVlLCBuYW1lOiAnYm9vbGVhbid9LFxuICAgICAgICAgICB7dmFsdWU6IG51bGwsIG5hbWU6ICdudWxsJ30sXG4gICAgICAgICAgIHt2YWx1ZToge3Byb3A6ICd2YWx1ZSd9LCBuYW1lOiAnb2JqZWN0J30sXG4gICAgICAgICAgIHt2YWx1ZTogWydhJ10sIG5hbWU6ICdhcnJheSd9XG4gKiAgICAgICBdXG4gKiAgICAgIH07XG4gKiAgIH1dKTtcbiAqIDwvZmlsZT5cbiAqPC9leGFtcGxlPlxuICpcbiAqICMjIyBVc2luZyBgc2VsZWN0YCB3aXRoIGBuZ09wdGlvbnNgIGFuZCBzZXR0aW5nIGEgZGVmYXVsdCB2YWx1ZVxuICogU2VlIHRoZSB7QGxpbmsgbmdPcHRpb25zIG5nT3B0aW9ucyBkb2N1bWVudGF0aW9ufSBmb3IgbW9yZSBgbmdPcHRpb25zYCB1c2FnZSBleGFtcGxlcy5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwic2VsZWN0LXdpdGgtZGVmYXVsdC12YWx1ZXNcIiBtb2R1bGU9XCJkZWZhdWx0VmFsdWVTZWxlY3RcIj5cbiAqIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICA8Zm9ybSBuYW1lPVwibXlGb3JtXCI+XG4gKiAgICAgPGxhYmVsIGZvcj1cIm15U2VsZWN0XCI+TWFrZSBhIGNob2ljZTo8L2xhYmVsPlxuICogICAgIDxzZWxlY3QgbmFtZT1cIm15U2VsZWN0XCIgaWQ9XCJteVNlbGVjdFwiXG4gKiAgICAgICBuZy1vcHRpb25zPVwib3B0aW9uLm5hbWUgZm9yIG9wdGlvbiBpbiBkYXRhLmF2YWlsYWJsZU9wdGlvbnMgdHJhY2sgYnkgb3B0aW9uLmlkXCJcbiAqICAgICAgIG5nLW1vZGVsPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiPjwvc2VsZWN0PlxuICogICA8L2Zvcm0+XG4gKiAgIDxocj5cbiAqICAgPHR0Pm9wdGlvbiA9IHt7ZGF0YS5zZWxlY3RlZE9wdGlvbn19PC90dD48YnIvPlxuICogPC9kaXY+XG4gKiA8L2ZpbGU+XG4gKiA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgYW5ndWxhci5tb2R1bGUoJ2RlZmF1bHRWYWx1ZVNlbGVjdCcsIFtdKVxuICogICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgJHNjb3BlLmRhdGEgPSB7XG4gKiAgICAgICBhdmFpbGFibGVPcHRpb25zOiBbXG4gKiAgICAgICAgIHtpZDogJzEnLCBuYW1lOiAnT3B0aW9uIEEnfSxcbiAqICAgICAgICAge2lkOiAnMicsIG5hbWU6ICdPcHRpb24gQid9LFxuICogICAgICAgICB7aWQ6ICczJywgbmFtZTogJ09wdGlvbiBDJ31cbiAqICAgICAgIF0sXG4gKiAgICAgICBzZWxlY3RlZE9wdGlvbjoge2lkOiAnMycsIG5hbWU6ICdPcHRpb24gQyd9IC8vVGhpcyBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzZWxlY3QgaW4gdGhlIHVpXG4gKiAgICAgICB9O1xuICogICB9XSk7XG4gKiA8L2ZpbGU+XG4gKjwvZXhhbXBsZT5cbiAqXG4gKlxuICogIyMjIEJpbmRpbmcgYHNlbGVjdGAgdG8gYSBub24tc3RyaW5nIHZhbHVlIHZpYSBgbmdNb2RlbGAgcGFyc2luZyAvIGZvcm1hdHRpbmdcbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwic2VsZWN0LXdpdGgtbm9uLXN0cmluZy1vcHRpb25zXCIgbW9kdWxlPVwibm9uU3RyaW5nU2VsZWN0XCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPHNlbGVjdCBuZy1tb2RlbD1cIm1vZGVsLmlkXCIgY29udmVydC10by1udW1iZXI+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwiMFwiPlplcm88L29wdGlvbj5cbiAqICAgICAgIDxvcHRpb24gdmFsdWU9XCIxXCI+T25lPC9vcHRpb24+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwiMlwiPlR3bzwvb3B0aW9uPlxuICogICAgIDwvc2VsZWN0PlxuICogICAgIHt7IG1vZGVsIH19XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgIGFuZ3VsYXIubW9kdWxlKCdub25TdHJpbmdTZWxlY3QnLCBbXSlcbiAqICAgICAgIC5ydW4oZnVuY3Rpb24oJHJvb3RTY29wZSkge1xuICogICAgICAgICAkcm9vdFNjb3BlLm1vZGVsID0geyBpZDogMiB9O1xuICogICAgICAgfSlcbiAqICAgICAgIC5kaXJlY3RpdmUoJ2NvbnZlcnRUb051bWJlcicsIGZ1bmN0aW9uKCkge1xuICogICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgIHJlcXVpcmU6ICduZ01vZGVsJyxcbiAqICAgICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIG5nTW9kZWwpIHtcbiAqICAgICAgICAgICAgIG5nTW9kZWwuJHBhcnNlcnMucHVzaChmdW5jdGlvbih2YWwpIHtcbiAqICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApO1xuICogICAgICAgICAgICAgfSk7XG4gKiAgICAgICAgICAgICBuZ01vZGVsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsKSB7XG4gKiAgICAgICAgICAgICAgIHJldHVybiAnJyArIHZhbDtcbiAqICAgICAgICAgICAgIH0pO1xuICogICAgICAgICAgIH1cbiAqICAgICAgICAgfTtcbiAqICAgICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAqICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIGV4cGVjdChlbGVtZW50KGJ5Lm1vZGVsKCdtb2RlbC5pZCcpKS4kKCdvcHRpb246Y2hlY2tlZCcpLmdldFRleHQoKSkudG9FcXVhbCgnVHdvJyk7XG4gKiAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKi9cbnZhciBzZWxlY3REaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcblxuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnRScsXG4gICAgcmVxdWlyZTogWydzZWxlY3QnLCAnP25nTW9kZWwnXSxcbiAgICBjb250cm9sbGVyOiBTZWxlY3RDb250cm9sbGVyLFxuICAgIHByaW9yaXR5OiAxLFxuICAgIGxpbms6IHtcbiAgICAgIHByZTogc2VsZWN0UHJlTGluayxcbiAgICAgIHBvc3Q6IHNlbGVjdFBvc3RMaW5rXG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHNlbGVjdFByZUxpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7XG5cbiAgICAgIHZhciBzZWxlY3RDdHJsID0gY3RybHNbMF07XG4gICAgICB2YXIgbmdNb2RlbEN0cmwgPSBjdHJsc1sxXTtcblxuICAgICAgLy8gaWYgbmdNb2RlbCBpcyBub3QgZGVmaW5lZCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBidXQgc2V0IHRoZSByZWdpc3Rlck9wdGlvblxuICAgICAgLy8gZnVuY3Rpb24gdG8gbm9vcCwgc28gb3B0aW9ucyBkb24ndCBnZXQgYWRkZWQgaW50ZXJuYWxseVxuICAgICAgaWYgKCFuZ01vZGVsQ3RybCkge1xuICAgICAgICBzZWxlY3RDdHJsLnJlZ2lzdGVyT3B0aW9uID0gbm9vcDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG5cbiAgICAgIHNlbGVjdEN0cmwubmdNb2RlbEN0cmwgPSBuZ01vZGVsQ3RybDtcblxuICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0ZWQgaXRlbShzKSBjaGFuZ2VzIHdlIGRlbGVnYXRlIGdldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3QgY29udHJvbFxuICAgICAgLy8gdG8gdGhlIGByZWFkVmFsdWVgIG1ldGhvZCwgd2hpY2ggY2FuIGJlIGNoYW5nZWQgaWYgdGhlIHNlbGVjdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICAgICAgLy8gc2VsZWN0ZWQgdmFsdWVzIG9yIGlmIHRoZSBvcHRpb25zIGFyZSBiZWluZyBnZW5lcmF0ZWQgYnkgYG5nT3B0aW9uc2BcbiAgICAgIGVsZW1lbnQub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxlY3RDdHJsLnJlbW92ZVVua25vd25PcHRpb24oKTtcbiAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXRWaWV3VmFsdWUoc2VsZWN0Q3RybC5yZWFkVmFsdWUoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHRoZSBzZWxlY3QgYWxsb3dzIG11bHRpcGxlIHZhbHVlcyB0aGVuIHdlIG5lZWQgdG8gbW9kaWZ5IGhvdyB3ZSByZWFkIGFuZCB3cml0ZVxuICAgICAgLy8gdmFsdWVzIGZyb20gYW5kIHRvIHRoZSBjb250cm9sOyBhbHNvIHdoYXQgaXQgbWVhbnMgZm9yIHRoZSB2YWx1ZSB0byBiZSBlbXB0eSBhbmRcbiAgICAgIC8vIHdlIGhhdmUgdG8gYWRkIGFuIGV4dHJhIHdhdGNoIHNpbmNlIG5nTW9kZWwgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBhcnJheXMgLSBpdFxuICAgICAgLy8gZG9lc24ndCB0cmlnZ2VyIHJlbmRlcmluZyBpZiBvbmx5IGFuIGl0ZW0gaW4gdGhlIGFycmF5IGNoYW5nZXMuXG4gICAgICBpZiAoYXR0ci5tdWx0aXBsZSkge1xuICAgICAgICBzZWxlY3RDdHJsLm11bHRpcGxlID0gdHJ1ZTtcblxuICAgICAgICAvLyBSZWFkIHZhbHVlIG5vdyBuZWVkcyB0byBjaGVjayBlYWNoIG9wdGlvbiB0byBzZWUgaWYgaXQgaXMgc2VsZWN0ZWRcbiAgICAgICAgc2VsZWN0Q3RybC5yZWFkVmFsdWUgPSBmdW5jdGlvbiByZWFkTXVsdGlwbGVWYWx1ZSgpIHtcbiAgICAgICAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICAgICAgICBmb3JFYWNoKGVsZW1lbnQuZmluZCgnb3B0aW9uJyksIGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAmJiAhb3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIHZhciB2YWwgPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgICAgIGFycmF5LnB1c2godmFsIGluIHNlbGVjdEN0cmwuc2VsZWN0VmFsdWVNYXAgPyBzZWxlY3RDdHJsLnNlbGVjdFZhbHVlTWFwW3ZhbF0gOiB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXcml0ZSB2YWx1ZSBub3cgbmVlZHMgdG8gc2V0IHRoZSBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBlYWNoIG1hdGNoaW5nIG9wdGlvblxuICAgICAgICBzZWxlY3RDdHJsLndyaXRlVmFsdWUgPSBmdW5jdGlvbiB3cml0ZU11bHRpcGxlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgICB2YXIgaXRlbXMgPSBuZXcgSGFzaE1hcCh2YWx1ZSk7XG4gICAgICAgICAgZm9yRWFjaChlbGVtZW50LmZpbmQoJ29wdGlvbicpLCBmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGlzRGVmaW5lZChpdGVtcy5nZXQob3B0aW9uLnZhbHVlKSkgfHwgaXNEZWZpbmVkKGl0ZW1zLmdldChzZWxlY3RDdHJsLnNlbGVjdFZhbHVlTWFwW29wdGlvbi52YWx1ZV0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyB3ZSBoYXZlIHRvIGRvIGl0IG9uIGVhY2ggd2F0Y2ggc2luY2UgbmdNb2RlbCB3YXRjaGVzIHJlZmVyZW5jZSwgYnV0XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gd29yayBvZiBhbiBhcnJheSwgc28gd2UgbmVlZCB0byBzZWUgaWYgYW55dGhpbmcgd2FzIGluc2VydGVkL3JlbW92ZWRcbiAgICAgICAgdmFyIGxhc3RWaWV3LCBsYXN0Vmlld1JlZiA9IE5hTjtcbiAgICAgICAgc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIHNlbGVjdE11bHRpcGxlV2F0Y2goKSB7XG4gICAgICAgICAgaWYgKGxhc3RWaWV3UmVmID09PSBuZ01vZGVsQ3RybC4kdmlld1ZhbHVlICYmICFlcXVhbHMobGFzdFZpZXcsIG5nTW9kZWxDdHJsLiR2aWV3VmFsdWUpKSB7XG4gICAgICAgICAgICBsYXN0VmlldyA9IHNoYWxsb3dDb3B5KG5nTW9kZWxDdHJsLiR2aWV3VmFsdWUpO1xuICAgICAgICAgICAgbmdNb2RlbEN0cmwuJHJlbmRlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYXN0Vmlld1JlZiA9IG5nTW9kZWxDdHJsLiR2aWV3VmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHdlIGFyZSBhIG11bHRpcGxlIHNlbGVjdCB0aGVuIHZhbHVlIGlzIG5vdyBhIGNvbGxlY3Rpb25cbiAgICAgICAgLy8gc28gdGhlIG1lYW5pbmcgb2YgJGlzRW1wdHkgY2hhbmdlc1xuICAgICAgICBuZ01vZGVsQ3RybC4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuICF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICAgIH07XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZWxlY3RQb3N0TGluayhzY29wZSwgZWxlbWVudCwgYXR0cnMsIGN0cmxzKSB7XG4gICAgICAvLyBpZiBuZ01vZGVsIGlzIG5vdCBkZWZpbmVkLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICB2YXIgbmdNb2RlbEN0cmwgPSBjdHJsc1sxXTtcbiAgICAgIGlmICghbmdNb2RlbEN0cmwpIHJldHVybjtcblxuICAgICAgdmFyIHNlbGVjdEN0cmwgPSBjdHJsc1swXTtcblxuICAgICAgLy8gV2UgZGVsZWdhdGUgcmVuZGVyaW5nIHRvIHRoZSBgd3JpdGVWYWx1ZWAgbWV0aG9kLCB3aGljaCBjYW4gYmUgY2hhbmdlZFxuICAgICAgLy8gaWYgdGhlIHNlbGVjdCBjYW4gaGF2ZSBtdWx0aXBsZSBzZWxlY3RlZCB2YWx1ZXMgb3IgaWYgdGhlIG9wdGlvbnMgYXJlIGJlaW5nXG4gICAgICAvLyBnZW5lcmF0ZWQgYnkgYG5nT3B0aW9uc2AuXG4gICAgICAvLyBUaGlzIG11c3QgYmUgZG9uZSBpbiB0aGUgcG9zdExpbmsgZm4gdG8gcHJldmVudCAkcmVuZGVyIHRvIGJlIGNhbGxlZCBiZWZvcmVcbiAgICAgIC8vIGFsbCBub2RlcyBoYXZlIGJlZW4gbGlua2VkIGNvcnJlY3RseS5cbiAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZWN0Q3RybC53cml0ZVZhbHVlKG5nTW9kZWxDdHJsLiR2aWV3VmFsdWUpO1xuICAgICAgfTtcbiAgICB9XG59O1xuXG5cbi8vIFRoZSBvcHRpb24gZGlyZWN0aXZlIGlzIHB1cmVseSBkZXNpZ25lZCB0byBjb21tdW5pY2F0ZSB0aGUgZXhpc3RlbmNlIChvciBsYWNrIG9mKVxuLy8gb2YgZHluYW1pY2FsbHkgY3JlYXRlZCAoYW5kIGRlc3Ryb3llZCkgb3B0aW9uIGVsZW1lbnRzIHRvIHRoZWlyIGNvbnRhaW5pbmcgc2VsZWN0XG4vLyBkaXJlY3RpdmUgdmlhIGl0cyBjb250cm9sbGVyLlxudmFyIG9wdGlvbkRpcmVjdGl2ZSA9IFsnJGludGVycG9sYXRlJywgZnVuY3Rpb24oJGludGVycG9sYXRlKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdFJyxcbiAgICBwcmlvcml0eTogMTAwLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgIHZhciBpbnRlcnBvbGF0ZVZhbHVlRm4sIGludGVycG9sYXRlVGV4dEZuO1xuXG4gICAgICBpZiAoaXNEZWZpbmVkKGF0dHIubmdWYWx1ZSkpIHtcbiAgICAgICAgLy8gV2lsbCBiZSBoYW5kbGVkIGJ5IHJlZ2lzdGVyT3B0aW9uXG4gICAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChhdHRyLnZhbHVlKSkge1xuICAgICAgICAvLyBJZiB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIGRlZmluZWQsIGNoZWNrIGlmIGl0IGNvbnRhaW5zIGFuIGludGVycG9sYXRpb25cbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZUZuID0gJGludGVycG9sYXRlKGF0dHIudmFsdWUsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCB0aGVuIHdlIGZhbGwgYmFjayB0byB0aGVcbiAgICAgICAgLy8gdGV4dCBjb250ZW50IG9mIHRoZSBvcHRpb24gZWxlbWVudCwgd2hpY2ggbWF5IGJlIGludGVycG9sYXRlZFxuICAgICAgICBpbnRlcnBvbGF0ZVRleHRGbiA9ICRpbnRlcnBvbGF0ZShlbGVtZW50LnRleHQoKSwgdHJ1ZSk7XG4gICAgICAgIGlmICghaW50ZXJwb2xhdGVUZXh0Rm4pIHtcbiAgICAgICAgICBhdHRyLiRzZXQoJ3ZhbHVlJywgZWxlbWVudC50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikge1xuICAgICAgICAvLyBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBvdmVyIHVzaW5nIF5eIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byBzZWFyY2hcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgb2YgdGhlIERPTSBmb3IgZXZlcnkgc2luZ2xlIG9wdGlvbiBlbGVtZW50XG4gICAgICAgIHZhciBzZWxlY3RDdHJsTmFtZSA9ICckc2VsZWN0Q29udHJvbGxlcicsXG4gICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50LnBhcmVudCgpLFxuICAgICAgICAgICAgc2VsZWN0Q3RybCA9IHBhcmVudC5kYXRhKHNlbGVjdEN0cmxOYW1lKSB8fFxuICAgICAgICAgICAgICBwYXJlbnQucGFyZW50KCkuZGF0YShzZWxlY3RDdHJsTmFtZSk7IC8vIGluIGNhc2Ugd2UgYXJlIGluIG9wdGdyb3VwXG5cbiAgICAgICAgaWYgKHNlbGVjdEN0cmwpIHtcbiAgICAgICAgICBzZWxlY3RDdHJsLnJlZ2lzdGVyT3B0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBpbnRlcnBvbGF0ZVZhbHVlRm4sIGludGVycG9sYXRlVGV4dEZuKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1JlcXVpcmVkXG4gKiBAcmVzdHJpY3QgQVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIG5nUmVxdWlyZWQgYWRkcyB0aGUgcmVxdWlyZWQge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRvcnMgYHZhbGlkYXRvcmB9IHRvIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0uXG4gKiBJdCBpcyBtb3N0IG9mdGVuIHVzZWQgZm9yIHtAbGluayBpbnB1dCBgaW5wdXRgfSBhbmQge0BsaW5rIHNlbGVjdCBgc2VsZWN0YH0gY29udHJvbHMsIGJ1dCBjYW4gYWxzbyBiZVxuICogYXBwbGllZCB0byBjdXN0b20gY29udHJvbHMuXG4gKlxuICogVGhlIGRpcmVjdGl2ZSBzZXRzIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpZiB0aGUgQW5ndWxhciBleHByZXNzaW9uIGluc2lkZVxuICogYG5nUmVxdWlyZWRgIGV2YWx1YXRlcyB0byB0cnVlLiBBIHNwZWNpYWwgZGlyZWN0aXZlIGZvciBzZXR0aW5nIGByZXF1aXJlZGAgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2VcbiAqIGNhbm5vdCB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgYHJlcXVpcmVkYC4gU2VlIHRoZSB7QGxpbmsgZ3VpZGUvaW50ZXJwb2xhdGlvbiBpbnRlcnBvbGF0aW9uIGd1aWRlfVxuICogZm9yIG1vcmUgaW5mby5cbiAqXG4gKiBUaGUgdmFsaWRhdG9yIHdpbGwgc2V0IHRoZSBgcmVxdWlyZWRgIGVycm9yIGtleSB0byB0cnVlIGlmIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBpcyBzZXQgYW5kXG4gKiBjYWxsaW5nIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRpc0VtcHR5IGBOZ01vZGVsQ29udHJvbGxlci4kaXNFbXB0eWB9IHdpdGggdGhlXG4gKiB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlIGBuZ01vZGVsLiR2aWV3VmFsdWVgfSByZXR1cm5zIGB0cnVlYC4gRm9yIGV4YW1wbGUsIHRoZVxuICogYCRpc0VtcHR5KClgIGltcGxlbWVudGF0aW9uIGZvciBgaW5wdXRbdGV4dF1gIGNoZWNrcyB0aGUgbGVuZ3RoIG9mIHRoZSBgJHZpZXdWYWx1ZWAuIFdoZW4gZGV2ZWxvcGluZ1xuICogY3VzdG9tIGNvbnRyb2xzLCBgJGlzRW1wdHkoKWAgY2FuIGJlIG92ZXJ3cml0dGVuIHRvIGFjY291bnQgZm9yIGEgJHZpZXdWYWx1ZSB0aGF0IGlzIG5vdCBzdHJpbmctYmFzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ1JlcXVpcmVkRGlyZWN0aXZlXCIgbW9kdWxlPVwibmdSZXF1aXJlZEV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8c2NyaXB0PlxuICogICAgICAgYW5ndWxhci5tb2R1bGUoJ25nUmVxdWlyZWRFeGFtcGxlJywgW10pXG4gKiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICAgICAgJHNjb3BlLnJlcXVpcmVkID0gdHJ1ZTtcbiAqICAgICAgICAgfV0pO1xuICogICAgIDwvc2NyaXB0PlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8Zm9ybSBuYW1lPVwiZm9ybVwiPlxuICogICAgICAgICA8bGFiZWwgZm9yPVwicmVxdWlyZWRcIj5Ub2dnbGUgcmVxdWlyZWQ6IDwvbGFiZWw+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cInJlcXVpcmVkXCIgaWQ9XCJyZXF1aXJlZFwiIC8+XG4gKiAgICAgICAgIDxicj5cbiAqICAgICAgICAgPGxhYmVsIGZvcj1cImlucHV0XCI+VGhpcyBpbnB1dCBtdXN0IGJlIGZpbGxlZCBpZiBgcmVxdWlyZWRgIGlzIHRydWU6IDwvbGFiZWw+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwibW9kZWxcIiBpZD1cImlucHV0XCIgbmFtZT1cImlucHV0XCIgbmctcmVxdWlyZWQ9XCJyZXF1aXJlZFwiIC8+PGJyPlxuICogICAgICAgICA8aHI+XG4gKiAgICAgICAgIHJlcXVpcmVkIGVycm9yIHNldD8gPSA8Y29kZT57e2Zvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkfX08L2NvZGU+PGJyPlxuICogICAgICAgICBtb2RlbCA9IDxjb2RlPnt7bW9kZWx9fTwvY29kZT5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgdmFyIHJlcXVpcmVkID0gZWxlbWVudChieS5iaW5kaW5nKCdmb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCcpKTtcbiAgICAgICB2YXIgbW9kZWwgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ21vZGVsJykpO1xuICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkuaWQoJ2lucHV0JykpO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHJlcXVpcmVkIGVycm9yJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QocmVxdWlyZWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcblxuICAgICAgICAgaW5wdXQuc2VuZEtleXMoJzEyMycpO1xuICAgICAgICAgZXhwZWN0KHJlcXVpcmVkLmdldFRleHQoKSkubm90LnRvQ29udGFpbigndHJ1ZScpO1xuICAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9Db250YWluKCcxMjMnKTtcbiAgICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICovXG52YXIgcmVxdWlyZWREaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsbSwgYXR0ciwgY3RybCkge1xuICAgICAgaWYgKCFjdHJsKSByZXR1cm47XG4gICAgICBhdHRyLnJlcXVpcmVkID0gdHJ1ZTsgLy8gZm9yY2UgdHJ1dGh5IGluIGNhc2Ugd2UgYXJlIG9uIG5vbiBpbnB1dCBlbGVtZW50XG5cbiAgICAgIGN0cmwuJHZhbGlkYXRvcnMucmVxdWlyZWQgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICFhdHRyLnJlcXVpcmVkIHx8ICFjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSk7XG4gICAgICB9O1xuXG4gICAgICBhdHRyLiRvYnNlcnZlKCdyZXF1aXJlZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1BhdHRlcm5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBuZ1BhdHRlcm4gYWRkcyB0aGUgcGF0dGVybiB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdG9ycyBgdmFsaWRhdG9yYH0gdG8ge0BsaW5rIG5nTW9kZWwgYG5nTW9kZWxgfS5cbiAqIEl0IGlzIG1vc3Qgb2Z0ZW4gdXNlZCBmb3IgdGV4dC1iYXNlZCB7QGxpbmsgaW5wdXQgYGlucHV0YH0gY29udHJvbHMsIGJ1dCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGN1c3RvbSB0ZXh0LWJhc2VkIGNvbnRyb2xzLlxuICpcbiAqIFRoZSB2YWxpZGF0b3Igc2V0cyB0aGUgYHBhdHRlcm5gIGVycm9yIGtleSBpZiB0aGUge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZpZXdWYWx1ZSBgbmdNb2RlbC4kdmlld1ZhbHVlYH1cbiAqIGRvZXMgbm90IG1hdGNoIGEgUmVnRXhwIHdoaWNoIGlzIG9idGFpbmVkIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGVcbiAqIGBuZ1BhdHRlcm5gIGF0dHJpYnV0ZSB2YWx1ZTpcbiAqICogSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCwgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuXG4gKiAqIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHN0cmluZywgdGhlbiBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFJlZ0V4cCBhZnRlciB3cmFwcGluZyBpdFxuICogaW4gYF5gIGFuZCBgJGAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgXCJhYmNcImAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYG5ldyBSZWdFeHAoJ15hYmMkJylgLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gKiAqKk5vdGU6KiogQXZvaWQgdXNpbmcgdGhlIGBnYCBmbGFnIG9uIHRoZSBSZWdFeHAsIGFzIGl0IHdpbGwgY2F1c2UgZWFjaCBzdWNjZXNzaXZlIHNlYXJjaCB0b1xuICogc3RhcnQgYXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNlYXJjaCdzIG1hdGNoLCB0aHVzIG5vdCB0YWtpbmcgdGhlIHdob2xlIGlucHV0IHZhbHVlIGludG9cbiAqIGFjY291bnQuXG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxuICogKipOb3RlOioqIFRoaXMgZGlyZWN0aXZlIGlzIGFsc28gYWRkZWQgd2hlbiB0aGUgcGxhaW4gYHBhdHRlcm5gIGF0dHJpYnV0ZSBpcyB1c2VkLCB3aXRoIHR3b1xuICogZGlmZmVyZW5jZXM6XG4gKiA8b2w+XG4gKiAgIDxsaT5cbiAqICAgICBgbmdQYXR0ZXJuYCBkb2VzIG5vdCBzZXQgdGhlIGBwYXR0ZXJuYCBhdHRyaWJ1dGUgYW5kIHRoZXJlZm9yZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24gaXNcbiAqICAgICBub3QgYXZhaWxhYmxlLlxuICogICA8L2xpPlxuICogICA8bGk+XG4gKiAgICAgVGhlIGBuZ1BhdHRlcm5gIGF0dHJpYnV0ZSBtdXN0IGJlIGFuIGV4cHJlc3Npb24sIHdoaWxlIHRoZSBgcGF0dGVybmAgdmFsdWUgbXVzdCBiZVxuICogICAgIGludGVycG9sYXRlZC5cbiAqICAgPC9saT5cbiAqIDwvb2w+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAZXhhbXBsZVxuICogPGV4YW1wbGUgbmFtZT1cIm5nUGF0dGVybkRpcmVjdGl2ZVwiIG1vZHVsZT1cIm5nUGF0dGVybkV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8c2NyaXB0PlxuICogICAgICAgYW5ndWxhci5tb2R1bGUoJ25nUGF0dGVybkV4YW1wbGUnLCBbXSlcbiAqICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICAgICAkc2NvcGUucmVnZXggPSAnXFxcXGQrJztcbiAqICAgICAgICAgfV0pO1xuICogICAgIDwvc2NyaXB0PlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8Zm9ybSBuYW1lPVwiZm9ybVwiPlxuICogICAgICAgICA8bGFiZWwgZm9yPVwicmVnZXhcIj5TZXQgYSBwYXR0ZXJuIChyZWdleCBzdHJpbmcpOiA8L2xhYmVsPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cInJlZ2V4XCIgaWQ9XCJyZWdleFwiIC8+XG4gKiAgICAgICAgIDxicj5cbiAqICAgICAgICAgPGxhYmVsIGZvcj1cImlucHV0XCI+VGhpcyBpbnB1dCBpcyByZXN0cmljdGVkIGJ5IHRoZSBjdXJyZW50IHBhdHRlcm46IDwvbGFiZWw+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwibW9kZWxcIiBpZD1cImlucHV0XCIgbmFtZT1cImlucHV0XCIgbmctcGF0dGVybj1cInJlZ2V4XCIgLz48YnI+XG4gKiAgICAgICAgIDxocj5cbiAqICAgICAgICAgaW5wdXQgdmFsaWQ/ID0gPGNvZGU+e3tmb3JtLmlucHV0LiR2YWxpZH19PC9jb2RlPjxicj5cbiAqICAgICAgICAgbW9kZWwgPSA8Y29kZT57e21vZGVsfX08L2NvZGU+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIHZhciBtb2RlbCA9IGVsZW1lbnQoYnkuYmluZGluZygnbW9kZWwnKSk7XG4gICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5pZCgnaW5wdXQnKSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRoZSBpbnB1dCB3aXRoIHRoZSBkZWZhdWx0IHBhdHRlcm4nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGlucHV0LnNlbmRLZXlzKCdhYWEnKTtcbiAgICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLm5vdC50b0NvbnRhaW4oJ2FhYScpO1xuXG4gICAgICAgICBpbnB1dC5jbGVhcigpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcxMjMnKTtcbiAgICAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9Db250YWluKCcxMjMnKTtcbiAgICAgICAgIH0pO1xuICAgICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKi9cbnZhciBwYXR0ZXJuRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICByZXF1aXJlOiAnP25nTW9kZWwnLFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbG0sIGF0dHIsIGN0cmwpIHtcbiAgICAgIGlmICghY3RybCkgcmV0dXJuO1xuXG4gICAgICB2YXIgcmVnZXhwLCBwYXR0ZXJuRXhwID0gYXR0ci5uZ1BhdHRlcm4gfHwgYXR0ci5wYXR0ZXJuO1xuICAgICAgYXR0ci4kb2JzZXJ2ZSgncGF0dGVybicsIGZ1bmN0aW9uKHJlZ2V4KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhyZWdleCkgJiYgcmVnZXgubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyByZWdleCArICckJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVnZXggJiYgIXJlZ2V4LnRlc3QpIHtcbiAgICAgICAgICB0aHJvdyBtaW5FcnIoJ25nUGF0dGVybicpKCdub3JlZ2V4cCcsXG4gICAgICAgICAgICAnRXhwZWN0ZWQgezB9IHRvIGJlIGEgUmVnRXhwIGJ1dCB3YXMgezF9LiBFbGVtZW50OiB7Mn0nLCBwYXR0ZXJuRXhwLFxuICAgICAgICAgICAgcmVnZXgsIHN0YXJ0aW5nVGFnKGVsbSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnZXhwID0gcmVnZXggfHwgdW5kZWZpbmVkO1xuICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGN0cmwuJHZhbGlkYXRvcnMucGF0dGVybiA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkge1xuICAgICAgICAvLyBIVE1MNSBwYXR0ZXJuIGNvbnN0cmFpbnQgdmFsaWRhdGVzIHRoZSBpbnB1dCB2YWx1ZSwgc28gd2UgdmFsaWRhdGUgdGhlIHZpZXdWYWx1ZVxuICAgICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2aWV3VmFsdWUpIHx8IGlzVW5kZWZpbmVkKHJlZ2V4cCkgfHwgcmVnZXhwLnRlc3Qodmlld1ZhbHVlKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ01heGxlbmd0aFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIG5nTWF4bGVuZ3RoIGFkZHMgdGhlIG1heGxlbmd0aCB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdG9ycyBgdmFsaWRhdG9yYH0gdG8ge0BsaW5rIG5nTW9kZWwgYG5nTW9kZWxgfS5cbiAqIEl0IGlzIG1vc3Qgb2Z0ZW4gdXNlZCBmb3IgdGV4dC1iYXNlZCB7QGxpbmsgaW5wdXQgYGlucHV0YH0gY29udHJvbHMsIGJ1dCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGN1c3RvbSB0ZXh0LWJhc2VkIGNvbnRyb2xzLlxuICpcbiAqIFRoZSB2YWxpZGF0b3Igc2V0cyB0aGUgYG1heGxlbmd0aGAgZXJyb3Iga2V5IGlmIHRoZSB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlIGBuZ01vZGVsLiR2aWV3VmFsdWVgfVxuICogaXMgbG9uZ2VyIHRoYW4gdGhlIGludGVnZXIgb2J0YWluZWQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZVxuICogYG5nTWF4bGVuZ3RoYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cbiAqICoqTm90ZToqKiBUaGlzIGRpcmVjdGl2ZSBpcyBhbHNvIGFkZGVkIHdoZW4gdGhlIHBsYWluIGBtYXhsZW5ndGhgIGF0dHJpYnV0ZSBpcyB1c2VkLCB3aXRoIHR3b1xuICogZGlmZmVyZW5jZXM6XG4gKiA8b2w+XG4gKiAgIDxsaT5cbiAqICAgICBgbmdNYXhsZW5ndGhgIGRvZXMgbm90IHNldCB0aGUgYG1heGxlbmd0aGAgYXR0cmlidXRlIGFuZCB0aGVyZWZvcmUgSFRNTDUgY29uc3RyYWludFxuICogICAgIHZhbGlkYXRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIFRoZSBgbmdNYXhsZW5ndGhgIGF0dHJpYnV0ZSBtdXN0IGJlIGFuIGV4cHJlc3Npb24sIHdoaWxlIHRoZSBgbWF4bGVuZ3RoYCB2YWx1ZSBtdXN0IGJlXG4gKiAgICAgaW50ZXJwb2xhdGVkLlxuICogICA8L2xpPlxuICogPC9vbD5cbiAqIDwvZGl2PlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZXhhbXBsZSBuYW1lPVwibmdNYXhsZW5ndGhEaXJlY3RpdmVcIiBtb2R1bGU9XCJuZ01heGxlbmd0aEV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8c2NyaXB0PlxuICogICAgICAgYW5ndWxhci5tb2R1bGUoJ25nTWF4bGVuZ3RoRXhhbXBsZScsIFtdKVxuICogICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICogICAgICAgICAgICRzY29wZS5tYXhsZW5ndGggPSA1O1xuICogICAgICAgICB9XSk7XG4gKiAgICAgPC9zY3JpcHQ+XG4gKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgICAgIDxmb3JtIG5hbWU9XCJmb3JtXCI+XG4gKiAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXhsZW5ndGhcIj5TZXQgYSBtYXhsZW5ndGg6IDwvbGFiZWw+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbmctbW9kZWw9XCJtYXhsZW5ndGhcIiBpZD1cIm1heGxlbmd0aFwiIC8+XG4gKiAgICAgICAgIDxicj5cbiAqICAgICAgICAgPGxhYmVsIGZvcj1cImlucHV0XCI+VGhpcyBpbnB1dCBpcyByZXN0cmljdGVkIGJ5IHRoZSBjdXJyZW50IG1heGxlbmd0aDogPC9sYWJlbD5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJtb2RlbFwiIGlkPVwiaW5wdXRcIiBuYW1lPVwiaW5wdXRcIiBuZy1tYXhsZW5ndGg9XCJtYXhsZW5ndGhcIiAvPjxicj5cbiAqICAgICAgICAgPGhyPlxuICogICAgICAgICBpbnB1dCB2YWxpZD8gPSA8Y29kZT57e2Zvcm0uaW5wdXQuJHZhbGlkfX08L2NvZGU+PGJyPlxuICogICAgICAgICBtb2RlbCA9IDxjb2RlPnt7bW9kZWx9fTwvY29kZT5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgdmFyIG1vZGVsID0gZWxlbWVudChieS5iaW5kaW5nKCdtb2RlbCcpKTtcbiAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5LmlkKCdpbnB1dCcpKTtcblxuICAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdGhlIGlucHV0IHdpdGggdGhlIGRlZmF1bHQgbWF4bGVuZ3RoJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBpbnB1dC5zZW5kS2V5cygnYWJjZGVmJyk7XG4gICAgICAgICBleHBlY3QobW9kZWwuZ2V0VGV4dCgpKS5ub3QudG9Db250YWluKCdhYmNkZWYnKTtcblxuICAgICAgICAgaW5wdXQuY2xlYXIoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnYWJjZGUnKTtcbiAgICAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9Db250YWluKCdhYmNkZScpO1xuICAgICAgICAgfSk7XG4gICAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqL1xudmFyIG1heGxlbmd0aERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgcmVxdWlyZTogJz9uZ01vZGVsJyxcbiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7XG4gICAgICBpZiAoIWN0cmwpIHJldHVybjtcblxuICAgICAgdmFyIG1heGxlbmd0aCA9IC0xO1xuICAgICAgYXR0ci4kb2JzZXJ2ZSgnbWF4bGVuZ3RoJywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIGludFZhbCA9IHRvSW50KHZhbHVlKTtcbiAgICAgICAgbWF4bGVuZ3RoID0gaXNOdW1iZXJOYU4oaW50VmFsKSA/IC0xIDogaW50VmFsO1xuICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgICBjdHJsLiR2YWxpZGF0b3JzLm1heGxlbmd0aCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gKG1heGxlbmd0aCA8IDApIHx8IGN0cmwuJGlzRW1wdHkodmlld1ZhbHVlKSB8fCAodmlld1ZhbHVlLmxlbmd0aCA8PSBtYXhsZW5ndGgpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTWlubGVuZ3RoXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogbmdNaW5sZW5ndGggYWRkcyB0aGUgbWlubGVuZ3RoIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2YWxpZGF0b3JzIGB2YWxpZGF0b3JgfSB0byB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9LlxuICogSXQgaXMgbW9zdCBvZnRlbiB1c2VkIGZvciB0ZXh0LWJhc2VkIHtAbGluayBpbnB1dCBgaW5wdXRgfSBjb250cm9scywgYnV0IGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY3VzdG9tIHRleHQtYmFzZWQgY29udHJvbHMuXG4gKlxuICogVGhlIHZhbGlkYXRvciBzZXRzIHRoZSBgbWlubGVuZ3RoYCBlcnJvciBrZXkgaWYgdGhlIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgYG5nTW9kZWwuJHZpZXdWYWx1ZWB9XG4gKiBpcyBzaG9ydGVyIHRoYW4gdGhlIGludGVnZXIgb2J0YWluZWQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZVxuICogYG5nTWlubGVuZ3RoYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cbiAqICoqTm90ZToqKiBUaGlzIGRpcmVjdGl2ZSBpcyBhbHNvIGFkZGVkIHdoZW4gdGhlIHBsYWluIGBtaW5sZW5ndGhgIGF0dHJpYnV0ZSBpcyB1c2VkLCB3aXRoIHR3b1xuICogZGlmZmVyZW5jZXM6XG4gKiA8b2w+XG4gKiAgIDxsaT5cbiAqICAgICBgbmdNaW5sZW5ndGhgIGRvZXMgbm90IHNldCB0aGUgYG1pbmxlbmd0aGAgYXR0cmlidXRlIGFuZCB0aGVyZWZvcmUgSFRNTDUgY29uc3RyYWludFxuICogICAgIHZhbGlkYXRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIFRoZSBgbmdNaW5sZW5ndGhgIHZhbHVlIG11c3QgYmUgYW4gZXhwcmVzc2lvbiwgd2hpbGUgdGhlIGBtaW5sZW5ndGhgIHZhbHVlIG11c3QgYmVcbiAqICAgICBpbnRlcnBvbGF0ZWQuXG4gKiAgIDwvbGk+XG4gKiA8L29sPlxuICogPC9kaXY+XG4gKlxuICogQGV4YW1wbGVcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ01pbmxlbmd0aERpcmVjdGl2ZVwiIG1vZHVsZT1cIm5nTWlubGVuZ3RoRXhhbXBsZVwiPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgIDxzY3JpcHQ+XG4gKiAgICAgICBhbmd1bGFyLm1vZHVsZSgnbmdNaW5sZW5ndGhFeGFtcGxlJywgW10pXG4gKiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICAgICAgJHNjb3BlLm1pbmxlbmd0aCA9IDM7XG4gKiAgICAgICAgIH1dKTtcbiAqICAgICA8L3NjcmlwdD5cbiAqICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICAgICAgPGZvcm0gbmFtZT1cImZvcm1cIj5cbiAqICAgICAgICAgPGxhYmVsIGZvcj1cIm1pbmxlbmd0aFwiPlNldCBhIG1pbmxlbmd0aDogPC9sYWJlbD5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBuZy1tb2RlbD1cIm1pbmxlbmd0aFwiIGlkPVwibWlubGVuZ3RoXCIgLz5cbiAqICAgICAgICAgPGJyPlxuICogICAgICAgICA8bGFiZWwgZm9yPVwiaW5wdXRcIj5UaGlzIGlucHV0IGlzIHJlc3RyaWN0ZWQgYnkgdGhlIGN1cnJlbnQgbWlubGVuZ3RoOiA8L2xhYmVsPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm1vZGVsXCIgaWQ9XCJpbnB1dFwiIG5hbWU9XCJpbnB1dFwiIG5nLW1pbmxlbmd0aD1cIm1pbmxlbmd0aFwiIC8+PGJyPlxuICogICAgICAgICA8aHI+XG4gKiAgICAgICAgIGlucHV0IHZhbGlkPyA9IDxjb2RlPnt7Zm9ybS5pbnB1dC4kdmFsaWR9fTwvY29kZT48YnI+XG4gKiAgICAgICAgIG1vZGVsID0gPGNvZGU+e3ttb2RlbH19PC9jb2RlPlxuICogICAgICAgPC9mb3JtPlxuICogICAgIDwvZGl2PlxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICB2YXIgbW9kZWwgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ21vZGVsJykpO1xuICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkuaWQoJ2lucHV0JykpO1xuXG4gICAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0aGUgaW5wdXQgd2l0aCB0aGUgZGVmYXVsdCBtaW5sZW5ndGgnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGlucHV0LnNlbmRLZXlzKCdhYicpO1xuICAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkubm90LnRvQ29udGFpbignYWInKTtcblxuICAgICAgICAgaW5wdXQuc2VuZEtleXMoJ2FiYycpO1xuICAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9Db250YWluKCdhYmMnKTtcbiAgICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICovXG52YXIgbWlubGVuZ3RoRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICByZXF1aXJlOiAnP25nTW9kZWwnLFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbG0sIGF0dHIsIGN0cmwpIHtcbiAgICAgIGlmICghY3RybCkgcmV0dXJuO1xuXG4gICAgICB2YXIgbWlubGVuZ3RoID0gMDtcbiAgICAgIGF0dHIuJG9ic2VydmUoJ21pbmxlbmd0aCcsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIG1pbmxlbmd0aCA9IHRvSW50KHZhbHVlKSB8fCAwO1xuICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgICBjdHJsLiR2YWxpZGF0b3JzLm1pbmxlbmd0aCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2aWV3VmFsdWUpIHx8IHZpZXdWYWx1ZS5sZW5ndGggPj0gbWlubGVuZ3RoO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG5pZiAod2luZG93LmFuZ3VsYXIuYm9vdHN0cmFwKSB7XG4gIC8vIEFuZ3VsYXJKUyBpcyBhbHJlYWR5IGxvYWRlZCwgc28gd2UgY2FuIHJldHVybiBoZXJlLi4uXG4gIGlmICh3aW5kb3cuY29uc29sZSkge1xuICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBUcmllZCB0byBsb2FkIGFuZ3VsYXIgbW9yZSB0aGFuIG9uY2UuJyk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vLyB0cnkgdG8gYmluZCB0byBqcXVlcnkgbm93IHNvIHRoYXQgb25lIGNhbiB3cml0ZSBqcUxpdGUoZm4pXG4vLyBidXQgd2Ugd2lsbCByZWJpbmQgb24gYm9vdHN0cmFwIGFnYWluLlxuYmluZEpRdWVyeSgpO1xuXG5wdWJsaXNoRXh0ZXJuYWxBUEkoYW5ndWxhcik7XG5cbmFuZ3VsYXIubW9kdWxlKFwibmdMb2NhbGVcIiwgW10sIFtcIiRwcm92aWRlXCIsIGZ1bmN0aW9uKCRwcm92aWRlKSB7XG52YXIgUExVUkFMX0NBVEVHT1JZID0ge1pFUk86IFwiemVyb1wiLCBPTkU6IFwib25lXCIsIFRXTzogXCJ0d29cIiwgRkVXOiBcImZld1wiLCBNQU5ZOiBcIm1hbnlcIiwgT1RIRVI6IFwib3RoZXJcIn07XG5mdW5jdGlvbiBnZXREZWNpbWFscyhuKSB7XG4gIG4gPSBuICsgJyc7XG4gIHZhciBpID0gbi5pbmRleE9mKCcuJyk7XG4gIHJldHVybiAoaSA9PSAtMSkgPyAwIDogbi5sZW5ndGggLSBpIC0gMTtcbn1cblxuZnVuY3Rpb24gZ2V0VkYobiwgb3B0X3ByZWNpc2lvbikge1xuICB2YXIgdiA9IG9wdF9wcmVjaXNpb247XG5cbiAgaWYgKHVuZGVmaW5lZCA9PT0gdikge1xuICAgIHYgPSBNYXRoLm1pbihnZXREZWNpbWFscyhuKSwgMyk7XG4gIH1cblxuICB2YXIgYmFzZSA9IE1hdGgucG93KDEwLCB2KTtcbiAgdmFyIGYgPSAoKG4gKiBiYXNlKSB8IDApICUgYmFzZTtcbiAgcmV0dXJuIHt2OiB2LCBmOiBmfTtcbn1cblxuJHByb3ZpZGUudmFsdWUoXCIkbG9jYWxlXCIsIHtcbiAgXCJEQVRFVElNRV9GT1JNQVRTXCI6IHtcbiAgICBcIkFNUE1TXCI6IFtcbiAgICAgIFwiQU1cIixcbiAgICAgIFwiUE1cIlxuICAgIF0sXG4gICAgXCJEQVlcIjogW1xuICAgICAgXCJTdW5kYXlcIixcbiAgICAgIFwiTW9uZGF5XCIsXG4gICAgICBcIlR1ZXNkYXlcIixcbiAgICAgIFwiV2VkbmVzZGF5XCIsXG4gICAgICBcIlRodXJzZGF5XCIsXG4gICAgICBcIkZyaWRheVwiLFxuICAgICAgXCJTYXR1cmRheVwiXG4gICAgXSxcbiAgICBcIkVSQU5BTUVTXCI6IFtcbiAgICAgIFwiQmVmb3JlIENocmlzdFwiLFxuICAgICAgXCJBbm5vIERvbWluaVwiXG4gICAgXSxcbiAgICBcIkVSQVNcIjogW1xuICAgICAgXCJCQ1wiLFxuICAgICAgXCJBRFwiXG4gICAgXSxcbiAgICBcIkZJUlNUREFZT0ZXRUVLXCI6IDYsXG4gICAgXCJNT05USFwiOiBbXG4gICAgICBcIkphbnVhcnlcIixcbiAgICAgIFwiRmVicnVhcnlcIixcbiAgICAgIFwiTWFyY2hcIixcbiAgICAgIFwiQXByaWxcIixcbiAgICAgIFwiTWF5XCIsXG4gICAgICBcIkp1bmVcIixcbiAgICAgIFwiSnVseVwiLFxuICAgICAgXCJBdWd1c3RcIixcbiAgICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgICBcIk9jdG9iZXJcIixcbiAgICAgIFwiTm92ZW1iZXJcIixcbiAgICAgIFwiRGVjZW1iZXJcIlxuICAgIF0sXG4gICAgXCJTSE9SVERBWVwiOiBbXG4gICAgICBcIlN1blwiLFxuICAgICAgXCJNb25cIixcbiAgICAgIFwiVHVlXCIsXG4gICAgICBcIldlZFwiLFxuICAgICAgXCJUaHVcIixcbiAgICAgIFwiRnJpXCIsXG4gICAgICBcIlNhdFwiXG4gICAgXSxcbiAgICBcIlNIT1JUTU9OVEhcIjogW1xuICAgICAgXCJKYW5cIixcbiAgICAgIFwiRmViXCIsXG4gICAgICBcIk1hclwiLFxuICAgICAgXCJBcHJcIixcbiAgICAgIFwiTWF5XCIsXG4gICAgICBcIkp1blwiLFxuICAgICAgXCJKdWxcIixcbiAgICAgIFwiQXVnXCIsXG4gICAgICBcIlNlcFwiLFxuICAgICAgXCJPY3RcIixcbiAgICAgIFwiTm92XCIsXG4gICAgICBcIkRlY1wiXG4gICAgXSxcbiAgICBcIlNUQU5EQUxPTkVNT05USFwiOiBbXG4gICAgICBcIkphbnVhcnlcIixcbiAgICAgIFwiRmVicnVhcnlcIixcbiAgICAgIFwiTWFyY2hcIixcbiAgICAgIFwiQXByaWxcIixcbiAgICAgIFwiTWF5XCIsXG4gICAgICBcIkp1bmVcIixcbiAgICAgIFwiSnVseVwiLFxuICAgICAgXCJBdWd1c3RcIixcbiAgICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgICBcIk9jdG9iZXJcIixcbiAgICAgIFwiTm92ZW1iZXJcIixcbiAgICAgIFwiRGVjZW1iZXJcIlxuICAgIF0sXG4gICAgXCJXRUVLRU5EUkFOR0VcIjogW1xuICAgICAgNSxcbiAgICAgIDZcbiAgICBdLFxuICAgIFwiZnVsbERhdGVcIjogXCJFRUVFLCBNTU1NIGQsIHlcIixcbiAgICBcImxvbmdEYXRlXCI6IFwiTU1NTSBkLCB5XCIsXG4gICAgXCJtZWRpdW1cIjogXCJNTU0gZCwgeSBoOm1tOnNzIGFcIixcbiAgICBcIm1lZGl1bURhdGVcIjogXCJNTU0gZCwgeVwiLFxuICAgIFwibWVkaXVtVGltZVwiOiBcImg6bW06c3MgYVwiLFxuICAgIFwic2hvcnRcIjogXCJNL2QveXkgaDptbSBhXCIsXG4gICAgXCJzaG9ydERhdGVcIjogXCJNL2QveXlcIixcbiAgICBcInNob3J0VGltZVwiOiBcImg6bW0gYVwiXG4gIH0sXG4gIFwiTlVNQkVSX0ZPUk1BVFNcIjoge1xuICAgIFwiQ1VSUkVOQ1lfU1lNXCI6IFwiJFwiLFxuICAgIFwiREVDSU1BTF9TRVBcIjogXCIuXCIsXG4gICAgXCJHUk9VUF9TRVBcIjogXCIsXCIsXG4gICAgXCJQQVRURVJOU1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZ1NpemVcIjogMyxcbiAgICAgICAgXCJsZ1NpemVcIjogMyxcbiAgICAgICAgXCJtYXhGcmFjXCI6IDMsXG4gICAgICAgIFwibWluRnJhY1wiOiAwLFxuICAgICAgICBcIm1pbkludFwiOiAxLFxuICAgICAgICBcIm5lZ1ByZVwiOiBcIi1cIixcbiAgICAgICAgXCJuZWdTdWZcIjogXCJcIixcbiAgICAgICAgXCJwb3NQcmVcIjogXCJcIixcbiAgICAgICAgXCJwb3NTdWZcIjogXCJcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJnU2l6ZVwiOiAzLFxuICAgICAgICBcImxnU2l6ZVwiOiAzLFxuICAgICAgICBcIm1heEZyYWNcIjogMixcbiAgICAgICAgXCJtaW5GcmFjXCI6IDIsXG4gICAgICAgIFwibWluSW50XCI6IDEsXG4gICAgICAgIFwibmVnUHJlXCI6IFwiLVxcdTAwYTRcIixcbiAgICAgICAgXCJuZWdTdWZcIjogXCJcIixcbiAgICAgICAgXCJwb3NQcmVcIjogXCJcXHUwMGE0XCIsXG4gICAgICAgIFwicG9zU3VmXCI6IFwiXCJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIFwiaWRcIjogXCJlbi11c1wiLFxuICBcImxvY2FsZUlEXCI6IFwiZW5fVVNcIixcbiAgXCJwbHVyYWxDYXRcIjogZnVuY3Rpb24obiwgb3B0X3ByZWNpc2lvbikgeyAgdmFyIGkgPSBuIHwgMDsgIHZhciB2ZiA9IGdldFZGKG4sIG9wdF9wcmVjaXNpb24pOyAgaWYgKGkgPT0gMSAmJiB2Zi52ID09IDApIHsgICAgcmV0dXJuIFBMVVJBTF9DQVRFR09SWS5PTkU7ICB9ICByZXR1cm4gUExVUkFMX0NBVEVHT1JZLk9USEVSO31cbn0pO1xufV0pO1xuXG4gIGpxTGl0ZShmdW5jdGlvbigpIHtcbiAgICBhbmd1bGFySW5pdCh3aW5kb3cuZG9jdW1lbnQsIGJvb3RzdHJhcCk7XG4gIH0pO1xuXG59KSh3aW5kb3cpO1xuXG4hd2luZG93LmFuZ3VsYXIuJCRjc3AoKS5ub0lubGluZVN0eWxlICYmIHdpbmRvdy5hbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQuaGVhZCkucHJlcGVuZCgnPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPkBjaGFyc2V0IFwiVVRGLThcIjtbbmdcXFxcOmNsb2FrXSxbbmctY2xvYWtdLFtkYXRhLW5nLWNsb2FrXSxbeC1uZy1jbG9ha10sLm5nLWNsb2FrLC54LW5nLWNsb2FrLC5uZy1oaWRlOm5vdCgubmctaGlkZS1hbmltYXRlKXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9bmdcXFxcOmZvcm17ZGlzcGxheTpibG9jazt9Lm5nLWFuaW1hdGUtc2hpbXt2aXNpYmlsaXR5OmhpZGRlbjt9Lm5nLWFuY2hvcntwb3NpdGlvbjphYnNvbHV0ZTt9PC9zdHlsZT4nKTsiLCIvKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXJKUyB2MS42LjFcbiAqIChjKSAyMDEwLTIwMTYgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhcikgeyd1c2Ugc3RyaWN0JztcblxudmFyICRyZXNvdXJjZU1pbkVyciA9IGFuZ3VsYXIuJCRtaW5FcnIoJyRyZXNvdXJjZScpO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb25zIGFuZCByZWdleCB0byBsb29rdXAgYSBkb3R0ZWQgcGF0aCBvbiBhbiBvYmplY3Rcbi8vIHN0b3BwaW5nIGF0IHVuZGVmaW5lZC9udWxsLiAgVGhlIHBhdGggbXVzdCBiZSBjb21wb3NlZCBvZiBBU0NJSVxuLy8gaWRlbnRpZmllcnMgKGp1c3QgbGlrZSAkcGFyc2UpXG52YXIgTUVNQkVSX05BTUVfUkVHRVggPSAvXihcXC5bYS16QS1aXyRAXVswLTlhLXpBLVpfJEBdKikrJC87XG5cbmZ1bmN0aW9uIGlzVmFsaWREb3R0ZWRQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIChwYXRoICE9IG51bGwgJiYgcGF0aCAhPT0gJycgJiYgcGF0aCAhPT0gJ2hhc093blByb3BlcnR5JyAmJlxuICAgICAgTUVNQkVSX05BTUVfUkVHRVgudGVzdCgnLicgKyBwYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cERvdHRlZFBhdGgob2JqLCBwYXRoKSB7XG4gIGlmICghaXNWYWxpZERvdHRlZFBhdGgocGF0aCkpIHtcbiAgICB0aHJvdyAkcmVzb3VyY2VNaW5FcnIoJ2JhZG1lbWJlcicsICdEb3R0ZWQgbWVtYmVyIHBhdGggXCJAezB9XCIgaXMgaW52YWxpZC4nLCBwYXRoKTtcbiAgfVxuICB2YXIga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgZm9yICh2YXIgaSA9IDAsIGlpID0ga2V5cy5sZW5ndGg7IGkgPCBpaSAmJiBhbmd1bGFyLmlzRGVmaW5lZChvYmopOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBvYmogPSAob2JqICE9PSBudWxsKSA/IG9ialtrZXldIDogdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc2hhbGxvdyBjb3B5IG9mIGFuIG9iamVjdCBhbmQgY2xlYXIgb3RoZXIgZmllbGRzIGZyb20gdGhlIGRlc3RpbmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dDbGVhckFuZENvcHkoc3JjLCBkc3QpIHtcbiAgZHN0ID0gZHN0IHx8IHt9O1xuXG4gIGFuZ3VsYXIuZm9yRWFjaChkc3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICBkZWxldGUgZHN0W2tleV07XG4gIH0pO1xuXG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkgJiYgIShrZXkuY2hhckF0KDApID09PSAnJCcgJiYga2V5LmNoYXJBdCgxKSA9PT0gJyQnKSkge1xuICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHN0O1xufVxuXG4vKipcbiAqIEBuZ2RvYyBtb2R1bGVcbiAqIEBuYW1lIG5nUmVzb3VyY2VcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqICMgbmdSZXNvdXJjZVxuICpcbiAqIFRoZSBgbmdSZXNvdXJjZWAgbW9kdWxlIHByb3ZpZGVzIGludGVyYWN0aW9uIHN1cHBvcnQgd2l0aCBSRVNUZnVsIHNlcnZpY2VzXG4gKiB2aWEgdGhlICRyZXNvdXJjZSBzZXJ2aWNlLlxuICpcbiAqXG4gKiA8ZGl2IGRvYy1tb2R1bGUtY29tcG9uZW50cz1cIm5nUmVzb3VyY2VcIj48L2Rpdj5cbiAqXG4gKiBTZWUge0BsaW5rIG5nUmVzb3VyY2UuJHJlc291cmNlUHJvdmlkZXJ9IGFuZCB7QGxpbmsgbmdSZXNvdXJjZS4kcmVzb3VyY2V9IGZvciB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJHJlc291cmNlUHJvdmlkZXJcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBVc2UgYCRyZXNvdXJjZVByb3ZpZGVyYCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIHtAbGluayBuZ1Jlc291cmNlLiRyZXNvdXJjZX1cbiAqIHNlcnZpY2UuXG4gKlxuICogIyMgRGVwZW5kZW5jaWVzXG4gKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nUmVzb3VyY2UgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLlxuICpcbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkcmVzb3VyY2VcbiAqIEByZXF1aXJlcyAkaHR0cFxuICogQHJlcXVpcmVzIG5nLiRsb2dcbiAqIEByZXF1aXJlcyAkcVxuICogQHJlcXVpcmVzIG5nLiR0aW1lb3V0XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIHJlc291cmNlIG9iamVjdCB0aGF0IGxldHMgeW91IGludGVyYWN0IHdpdGhcbiAqIFtSRVNUZnVsXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JlcHJlc2VudGF0aW9uYWxfU3RhdGVfVHJhbnNmZXIpIHNlcnZlci1zaWRlIGRhdGEgc291cmNlcy5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgcmVzb3VyY2Ugb2JqZWN0IGhhcyBhY3Rpb24gbWV0aG9kcyB3aGljaCBwcm92aWRlIGhpZ2gtbGV2ZWwgYmVoYXZpb3JzIHdpdGhvdXRcbiAqIHRoZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIGxvdyBsZXZlbCB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IHNlcnZpY2UuXG4gKlxuICogUmVxdWlyZXMgdGhlIHtAbGluayBuZ1Jlc291cmNlIGBuZ1Jlc291cmNlYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0cmFpbGluZyBzbGFzaGVzIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgY2FsY3VsYXRlZCBVUkxzLFxuICogd2hpY2ggY2FuIHBvc2UgcHJvYmxlbXMgd2l0aCBzZXJ2ZXIgYmFja2VuZHMgdGhhdCBkbyBub3QgZXhwZWN0IHRoYXRcbiAqIGJlaGF2aW9yLiAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgY29uZmlndXJpbmcgdGhlIGAkcmVzb3VyY2VQcm92aWRlcmAgbGlrZVxuICogdGhpczpcbiAqXG4gKiBgYGBqc1xuICAgICBhcHAuY29uZmlnKFsnJHJlc291cmNlUHJvdmlkZXInLCBmdW5jdGlvbigkcmVzb3VyY2VQcm92aWRlcikge1xuICAgICAgIC8vIERvbid0IHN0cmlwIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBjYWxjdWxhdGVkIFVSTHNcbiAgICAgICAkcmVzb3VyY2VQcm92aWRlci5kZWZhdWx0cy5zdHJpcFRyYWlsaW5nU2xhc2hlcyA9IGZhbHNlO1xuICAgICB9XSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIEEgcGFyYW1ldGVyaXplZCBVUkwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzIHByZWZpeGVkIGJ5IGA6YCBhcyBpblxuICogICBgL3VzZXIvOnVzZXJuYW1lYC4gSWYgeW91IGFyZSB1c2luZyBhIFVSTCB3aXRoIGEgcG9ydCBudW1iZXIgKGUuZy5cbiAqICAgYGh0dHA6Ly9leGFtcGxlLmNvbTo4MDgwL2FwaWApLCBpdCB3aWxsIGJlIHJlc3BlY3RlZC5cbiAqXG4gKiAgIElmIHlvdSBhcmUgdXNpbmcgYSB1cmwgd2l0aCBhIHN1ZmZpeCwganVzdCBhZGQgdGhlIHN1ZmZpeCwgbGlrZSB0aGlzOlxuICogICBgJHJlc291cmNlKCdodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UuanNvbicpYCBvciBgJHJlc291cmNlKCdodHRwOi8vZXhhbXBsZS5jb20vOmlkLmpzb24nKWBcbiAqICAgb3IgZXZlbiBgJHJlc291cmNlKCdodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UvOnJlc291cmNlX2lkLjpmb3JtYXQnKWBcbiAqICAgSWYgdGhlIHBhcmFtZXRlciBiZWZvcmUgdGhlIHN1ZmZpeCBpcyBlbXB0eSwgOnJlc291cmNlX2lkIGluIHRoaXMgY2FzZSwgdGhlbiB0aGUgYC8uYCB3aWxsIGJlXG4gKiAgIGNvbGxhcHNlZCBkb3duIHRvIGEgc2luZ2xlIGAuYC4gIElmIHlvdSBuZWVkIHRoaXMgc2VxdWVuY2UgdG8gYXBwZWFyIGFuZCBub3QgY29sbGFwc2UgdGhlbiB5b3VcbiAqICAgY2FuIGVzY2FwZSBpdCB3aXRoIGAvXFwuYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdD19IHBhcmFtRGVmYXVsdHMgRGVmYXVsdCB2YWx1ZXMgZm9yIGB1cmxgIHBhcmFtZXRlcnMuIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGluXG4gKiAgIGBhY3Rpb25zYCBtZXRob2RzLiBJZiBhIHBhcmFtZXRlciB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lXG4gKiAgIGEgcGFyYW0gdmFsdWUgbmVlZHMgdG8gYmUgb2J0YWluZWQgZm9yIGEgcmVxdWVzdCAodW5sZXNzIHRoZSBwYXJhbSB3YXMgb3ZlcnJpZGRlbikuIFRoZSBmdW5jdGlvblxuICogICB3aWxsIGJlIHBhc3NlZCB0aGUgY3VycmVudCBkYXRhIHZhbHVlIGFzIGFuIGFyZ3VtZW50LlxuICpcbiAqICAgRWFjaCBrZXkgdmFsdWUgaW4gdGhlIHBhcmFtZXRlciBvYmplY3QgaXMgZmlyc3QgYm91bmQgdG8gdXJsIHRlbXBsYXRlIGlmIHByZXNlbnQgYW5kIHRoZW4gYW55XG4gKiAgIGV4Y2VzcyBrZXlzIGFyZSBhcHBlbmRlZCB0byB0aGUgdXJsIHNlYXJjaCBxdWVyeSBhZnRlciB0aGUgYD9gLlxuICpcbiAqICAgR2l2ZW4gYSB0ZW1wbGF0ZSBgL3BhdGgvOnZlcmJgIGFuZCBwYXJhbWV0ZXIgYHt2ZXJiOidncmVldCcsIHNhbHV0YXRpb246J0hlbGxvJ31gIHJlc3VsdHMgaW5cbiAqICAgVVJMIGAvcGF0aC9ncmVldD9zYWx1dGF0aW9uPUhlbGxvYC5cbiAqXG4gKiAgIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgcHJlZml4ZWQgd2l0aCBgQGAsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGF0IHBhcmFtZXRlciB3aWxsIGJlXG4gKiAgIGV4dHJhY3RlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IG9uIHRoZSBgZGF0YWAgb2JqZWN0IChwcm92aWRlZCB3aGVuIGNhbGxpbmcgYVxuICogICBcIm5vbi1HRVRcIiBhY3Rpb24gbWV0aG9kKS5cbiAqICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBgZGVmYXVsdFBhcmFtYCBvYmplY3QgaXMgYHtzb21lUGFyYW06ICdAc29tZVByb3AnfWAgdGhlbiB0aGUgdmFsdWUgb2ZcbiAqICAgYHNvbWVQYXJhbWAgd2lsbCBiZSBgZGF0YS5zb21lUHJvcGAuXG4gKiAgIE5vdGUgdGhhdCB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZCwgd2hlbiBjYWxsaW5nIGEgXCJHRVRcIiBhY3Rpb24gbWV0aG9kIChpLmUuIGFuIGFjdGlvblxuICogICBtZXRob2QgdGhhdCBkb2VzIG5vdCBhY2NlcHQgYSByZXF1ZXN0IGJvZHkpXG4gKlxuICogQHBhcmFtIHtPYmplY3QuPE9iamVjdD49fSBhY3Rpb25zIEhhc2ggd2l0aCBkZWNsYXJhdGlvbiBvZiBjdXN0b20gYWN0aW9ucyB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlXG4gKiAgIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IHNldCBvZiByZXNvdXJjZSBhY3Rpb25zIChzZWUgYmVsb3cpLiBJZiBhIGN1c3RvbSBhY3Rpb24gaGFzIHRoZSBzYW1lXG4gKiAgIGtleSBhcyBhIGRlZmF1bHQgYWN0aW9uIChlLmcuIGBzYXZlYCksIHRoZW4gdGhlIGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgKm92ZXJ3cml0dGVuKiwgYW5kIG5vdFxuICogICBleHRlbmRlZC5cbiAqXG4gKiAgIFRoZSBkZWNsYXJhdGlvbiBzaG91bGQgYmUgY3JlYXRlZCBpbiB0aGUgZm9ybWF0IG9mIHtAbGluayBuZy4kaHR0cCN1c2FnZSAkaHR0cC5jb25maWd9OlxuICpcbiAqICAgICAgIHthY3Rpb24xOiB7bWV0aG9kOj8sIHBhcmFtczo/LCBpc0FycmF5Oj8sIGhlYWRlcnM6PywgLi4ufSxcbiAqICAgICAgICBhY3Rpb24yOiB7bWV0aG9kOj8sIHBhcmFtczo/LCBpc0FycmF5Oj8sIGhlYWRlcnM6PywgLi4ufSxcbiAqICAgICAgICAuLi59XG4gKlxuICogICBXaGVyZTpcbiAqXG4gKiAgIC0gKipgYWN0aW9uYCoqIOKAkyB7c3RyaW5nfSDigJMgVGhlIG5hbWUgb2YgYWN0aW9uLiBUaGlzIG5hbWUgYmVjb21lcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uXG4gKiAgICAgeW91ciByZXNvdXJjZSBvYmplY3QuXG4gKiAgIC0gKipgbWV0aG9kYCoqIOKAkyB7c3RyaW5nfSDigJMgQ2FzZSBpbnNlbnNpdGl2ZSBIVFRQIG1ldGhvZCAoZS5nLiBgR0VUYCwgYFBPU1RgLCBgUFVUYCxcbiAqICAgICBgREVMRVRFYCwgYEpTT05QYCwgZXRjKS5cbiAqICAgLSAqKmBwYXJhbXNgKiog4oCTIHtPYmplY3Q9fSDigJMgT3B0aW9uYWwgc2V0IG9mIHByZS1ib3VuZCBwYXJhbWV0ZXJzIGZvciB0aGlzIGFjdGlvbi4gSWYgYW55IG9mXG4gKiAgICAgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdoZW4gYSBwYXJhbSB2YWx1ZSBuZWVkcyB0b1xuICogICAgIGJlIG9idGFpbmVkIGZvciBhIHJlcXVlc3QgKHVubGVzcyB0aGUgcGFyYW0gd2FzIG92ZXJyaWRkZW4pLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBwYXNzZWQgdGhlXG4gKiAgICAgY3VycmVudCBkYXRhIHZhbHVlIGFzIGFuIGFyZ3VtZW50LlxuICogICAtICoqYHVybGAqKiDigJMge3N0cmluZ30g4oCTIGFjdGlvbiBzcGVjaWZpYyBgdXJsYCBvdmVycmlkZS4gVGhlIHVybCB0ZW1wbGF0aW5nIGlzIHN1cHBvcnRlZCBqdXN0XG4gKiAgICAgbGlrZSBmb3IgdGhlIHJlc291cmNlLWxldmVsIHVybHMuXG4gKiAgIC0gKipgaXNBcnJheWAqKiDigJMge2Jvb2xlYW49fSDigJMgSWYgdHJ1ZSB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3QgZm9yIHRoaXMgYWN0aW9uIGlzIGFuIGFycmF5LFxuICogICAgIHNlZSBgcmV0dXJuc2Agc2VjdGlvbi5cbiAqICAgLSAqKmB0cmFuc2Zvcm1SZXF1ZXN0YCoqIOKAk1xuICogICAgIGB7ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcil8QXJyYXkuPGZ1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIpPn1gIOKAk1xuICogICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cFxuICogICAgIHJlcXVlc3QgYm9keSBhbmQgaGVhZGVycyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBzZXJpYWxpemVkKSB2ZXJzaW9uLlxuICogICAgIEJ5IGRlZmF1bHQsIHRyYW5zZm9ybVJlcXVlc3Qgd2lsbCBjb250YWluIG9uZSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgcmVxdWVzdCBkYXRhIGlzXG4gKiAgICAgYW4gb2JqZWN0IGFuZCBzZXJpYWxpemVzIGl0IHVzaW5nIGBhbmd1bGFyLnRvSnNvbmAuIFRvIHByZXZlbnQgdGhpcyBiZWhhdmlvciwgc2V0XG4gKiAgICAgYHRyYW5zZm9ybVJlcXVlc3RgIHRvIGFuIGVtcHR5IGFycmF5OiBgdHJhbnNmb3JtUmVxdWVzdDogW11gXG4gKiAgIC0gKipgdHJhbnNmb3JtUmVzcG9uc2VgKiog4oCTXG4gKiAgICAgYHtmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyLCBzdGF0dXMpfEFycmF5LjxmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyLCBzdGF0dXMpPn1gIOKAk1xuICogICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cFxuICogICAgIHJlc3BvbnNlIGJvZHksIGhlYWRlcnMgYW5kIHN0YXR1cyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBkZXNlcmlhbGl6ZWQpXG4gKiAgICAgdmVyc2lvbi5cbiAqICAgICBCeSBkZWZhdWx0LCB0cmFuc2Zvcm1SZXNwb25zZSB3aWxsIGNvbnRhaW4gb25lIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSByZXNwb25zZSBsb29rc1xuICogICAgIGxpa2UgYSBKU09OIHN0cmluZyBhbmQgZGVzZXJpYWxpemVzIGl0IHVzaW5nIGBhbmd1bGFyLmZyb21Kc29uYC4gVG8gcHJldmVudCB0aGlzIGJlaGF2aW9yLFxuICogICAgIHNldCBgdHJhbnNmb3JtUmVzcG9uc2VgIHRvIGFuIGVtcHR5IGFycmF5OiBgdHJhbnNmb3JtUmVzcG9uc2U6IFtdYFxuICogICAtICoqYGNhY2hlYCoqIOKAkyBge2Jvb2xlYW58Q2FjaGV9YCDigJMgSWYgdHJ1ZSwgYSBkZWZhdWx0ICRodHRwIGNhY2hlIHdpbGwgYmUgdXNlZCB0byBjYWNoZSB0aGVcbiAqICAgICBHRVQgcmVxdWVzdCwgb3RoZXJ3aXNlIGlmIGEgY2FjaGUgaW5zdGFuY2UgYnVpbHQgd2l0aFxuICogICAgIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5ICRjYWNoZUZhY3Rvcnl9LCB0aGlzIGNhY2hlIHdpbGwgYmUgdXNlZCBmb3JcbiAqICAgICBjYWNoaW5nLlxuICogICAtICoqYHRpbWVvdXRgKiog4oCTIGB7bnVtYmVyfWAg4oCTIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLjxiciAvPlxuICogICAgICoqTm90ZToqKiBJbiBjb250cmFzdCB0byB7QGxpbmsgbmcuJGh0dHAjdXNhZ2UgJGh0dHAuY29uZmlnfSwge0BsaW5rIG5nLiRxIHByb21pc2VzfSBhcmVcbiAqICAgICAqKm5vdCoqIHN1cHBvcnRlZCBpbiAkcmVzb3VyY2UsIGJlY2F1c2UgdGhlIHNhbWUgdmFsdWUgd291bGQgYmUgdXNlZCBmb3IgbXVsdGlwbGUgcmVxdWVzdHMuXG4gKiAgICAgSWYgeW91IGFyZSBsb29raW5nIGZvciBhIHdheSB0byBjYW5jZWwgcmVxdWVzdHMsIHlvdSBzaG91bGQgdXNlIHRoZSBgY2FuY2VsbGFibGVgIG9wdGlvbi5cbiAqICAgLSAqKmBjYW5jZWxsYWJsZWAqKiDigJMgYHtib29sZWFufWAg4oCTIGlmIHNldCB0byB0cnVlLCB0aGUgcmVxdWVzdCBtYWRlIGJ5IGEgXCJub24taW5zdGFuY2VcIiBjYWxsXG4gKiAgICAgd2lsbCBiZSBjYW5jZWxsZWQgKGlmIG5vdCBhbHJlYWR5IGNvbXBsZXRlZCkgYnkgY2FsbGluZyBgJGNhbmNlbFJlcXVlc3QoKWAgb24gdGhlIGNhbGwnc1xuICogICAgIHJldHVybiB2YWx1ZS4gQ2FsbGluZyBgJGNhbmNlbFJlcXVlc3QoKWAgZm9yIGEgbm9uLWNhbmNlbGxhYmxlIG9yIGFuIGFscmVhZHlcbiAqICAgICBjb21wbGV0ZWQvY2FuY2VsbGVkIHJlcXVlc3Qgd2lsbCBoYXZlIG5vIGVmZmVjdC48YnIgLz5cbiAqICAgLSAqKmB3aXRoQ3JlZGVudGlhbHNgKiogLSBge2Jvb2xlYW59YCAtIHdoZXRoZXIgdG8gc2V0IHRoZSBgd2l0aENyZWRlbnRpYWxzYCBmbGFnIG9uIHRoZVxuICogICAgIFhIUiBvYmplY3QuIFNlZVxuICogICAgIFtyZXF1ZXN0cyB3aXRoIGNyZWRlbnRpYWxzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9odHRwX2FjY2Vzc19jb250cm9sI3NlY3Rpb25fNSlcbiAqICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqICAgLSAqKmByZXNwb25zZVR5cGVgKiogLSBge3N0cmluZ31gIC0gc2VlXG4gKiAgICAgW3JlcXVlc3RUeXBlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RPTS9YTUxIdHRwUmVxdWVzdCNyZXNwb25zZVR5cGUpLlxuICogICAtICoqYGludGVyY2VwdG9yYCoqIC0gYHtPYmplY3Q9fWAgLSBUaGUgaW50ZXJjZXB0b3Igb2JqZWN0IGhhcyB0d28gb3B0aW9uYWwgbWV0aG9kcyAtXG4gKiAgICAgYHJlc3BvbnNlYCBhbmQgYHJlc3BvbnNlRXJyb3JgLiBCb3RoIGByZXNwb25zZWAgYW5kIGByZXNwb25zZUVycm9yYCBpbnRlcmNlcHRvcnMgZ2V0IGNhbGxlZFxuICogICAgIHdpdGggYGh0dHAgcmVzcG9uc2VgIG9iamVjdC4gU2VlIHtAbGluayBuZy4kaHR0cCAkaHR0cCBpbnRlcmNlcHRvcnN9LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIEhhc2ggd2l0aCBjdXN0b20gc2V0dGluZ3MgdGhhdCBzaG91bGQgZXh0ZW5kIHRoZVxuICogICBkZWZhdWx0IGAkcmVzb3VyY2VQcm92aWRlcmAgYmVoYXZpb3IuICBUaGUgc3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqICAgLSAqKmBzdHJpcFRyYWlsaW5nU2xhc2hlc2AqKiDigJMge2Jvb2xlYW59IOKAkyBJZiB0cnVlIHRoZW4gdGhlIHRyYWlsaW5nXG4gKiAgIHNsYXNoZXMgZnJvbSBhbnkgY2FsY3VsYXRlZCBVUkwgd2lsbCBiZSBzdHJpcHBlZC4gKERlZmF1bHRzIHRvIHRydWUuKVxuICogICAtICoqYGNhbmNlbGxhYmxlYCoqIOKAkyB7Ym9vbGVhbn0g4oCTIElmIHRydWUsIHRoZSByZXF1ZXN0IG1hZGUgYnkgYSBcIm5vbi1pbnN0YW5jZVwiIGNhbGwgd2lsbCBiZVxuICogICBjYW5jZWxsZWQgKGlmIG5vdCBhbHJlYWR5IGNvbXBsZXRlZCkgYnkgY2FsbGluZyBgJGNhbmNlbFJlcXVlc3QoKWAgb24gdGhlIGNhbGwncyByZXR1cm4gdmFsdWUuXG4gKiAgIFRoaXMgY2FuIGJlIG92ZXJ3cml0dGVuIHBlciBhY3Rpb24uIChEZWZhdWx0cyB0byBmYWxzZS4pXG4gKlxuICogQHJldHVybnMge09iamVjdH0gQSByZXNvdXJjZSBcImNsYXNzXCIgb2JqZWN0IHdpdGggbWV0aG9kcyBmb3IgdGhlIGRlZmF1bHQgc2V0IG9mIHJlc291cmNlIGFjdGlvbnNcbiAqICAgb3B0aW9uYWxseSBleHRlbmRlZCB3aXRoIGN1c3RvbSBgYWN0aW9uc2AuIFRoZSBkZWZhdWx0IHNldCBjb250YWlucyB0aGVzZSBhY3Rpb25zOlxuICogICBgYGBqc1xuICogICB7ICdnZXQnOiAgICB7bWV0aG9kOidHRVQnfSxcbiAqICAgICAnc2F2ZSc6ICAge21ldGhvZDonUE9TVCd9LFxuICogICAgICdxdWVyeSc6ICB7bWV0aG9kOidHRVQnLCBpc0FycmF5OnRydWV9LFxuICogICAgICdyZW1vdmUnOiB7bWV0aG9kOidERUxFVEUnfSxcbiAqICAgICAnZGVsZXRlJzoge21ldGhvZDonREVMRVRFJ30gfTtcbiAqICAgYGBgXG4gKlxuICogICBDYWxsaW5nIHRoZXNlIG1ldGhvZHMgaW52b2tlIGFuIHtAbGluayBuZy4kaHR0cH0gd2l0aCB0aGUgc3BlY2lmaWVkIGh0dHAgbWV0aG9kLFxuICogICBkZXN0aW5hdGlvbiBhbmQgcGFyYW1ldGVycy4gV2hlbiB0aGUgZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgdGhlbiB0aGUgb2JqZWN0IGlzIGFuXG4gKiAgIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBjbGFzcy4gVGhlIGFjdGlvbnMgYHNhdmVgLCBgcmVtb3ZlYCBhbmQgYGRlbGV0ZWAgYXJlIGF2YWlsYWJsZSBvbiBpdFxuICogICBhcyAgbWV0aG9kcyB3aXRoIHRoZSBgJGAgcHJlZml4LiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IHBlcmZvcm0gQ1JVRCBvcGVyYXRpb25zIChjcmVhdGUsXG4gKiAgIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKSBvbiBzZXJ2ZXItc2lkZSBkYXRhIGxpa2UgdGhpczpcbiAqICAgYGBganNcbiAqICAgdmFyIFVzZXIgPSAkcmVzb3VyY2UoJy91c2VyLzp1c2VySWQnLCB7dXNlcklkOidAaWQnfSk7XG4gKiAgIHZhciB1c2VyID0gVXNlci5nZXQoe3VzZXJJZDoxMjN9LCBmdW5jdGlvbigpIHtcbiAqICAgICB1c2VyLmFiYyA9IHRydWU7XG4gKiAgICAgdXNlci4kc2F2ZSgpO1xuICogICB9KTtcbiAqICAgYGBgXG4gKlxuICogICBJdCBpcyBpbXBvcnRhbnQgdG8gcmVhbGl6ZSB0aGF0IGludm9raW5nIGEgJHJlc291cmNlIG9iamVjdCBtZXRob2QgaW1tZWRpYXRlbHkgcmV0dXJucyBhblxuICogICBlbXB0eSByZWZlcmVuY2UgKG9iamVjdCBvciBhcnJheSBkZXBlbmRpbmcgb24gYGlzQXJyYXlgKS4gT25jZSB0aGUgZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZVxuICogICBzZXJ2ZXIgdGhlIGV4aXN0aW5nIHJlZmVyZW5jZSBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgYWN0dWFsIGRhdGEuIFRoaXMgaXMgYSB1c2VmdWwgdHJpY2sgc2luY2VcbiAqICAgdXN1YWxseSB0aGUgcmVzb3VyY2UgaXMgYXNzaWduZWQgdG8gYSBtb2RlbCB3aGljaCBpcyB0aGVuIHJlbmRlcmVkIGJ5IHRoZSB2aWV3LiBIYXZpbmcgYW4gZW1wdHlcbiAqICAgb2JqZWN0IHJlc3VsdHMgaW4gbm8gcmVuZGVyaW5nLCBvbmNlIHRoZSBkYXRhIGFycml2ZXMgZnJvbSB0aGUgc2VydmVyIHRoZW4gdGhlIG9iamVjdCBpc1xuICogICBwb3B1bGF0ZWQgd2l0aCB0aGUgZGF0YSBhbmQgdGhlIHZpZXcgYXV0b21hdGljYWxseSByZS1yZW5kZXJzIGl0c2VsZiBzaG93aW5nIHRoZSBuZXcgZGF0YS4gVGhpc1xuICogICBtZWFucyB0aGF0IGluIG1vc3QgY2FzZXMgb25lIG5ldmVyIGhhcyB0byB3cml0ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgYWN0aW9uIG1ldGhvZHMuXG4gKlxuICogICBUaGUgYWN0aW9uIG1ldGhvZHMgb24gdGhlIGNsYXNzIG9iamVjdCBvciBpbnN0YW5jZSBvYmplY3QgY2FuIGJlIGludm9rZWQgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiAgIHBhcmFtZXRlcnM6XG4gKlxuICogICAtIEhUVFAgR0VUIFwiY2xhc3NcIiBhY3Rpb25zOiBgUmVzb3VyY2UuYWN0aW9uKFtwYXJhbWV0ZXJzXSwgW3N1Y2Nlc3NdLCBbZXJyb3JdKWBcbiAqICAgLSBub24tR0VUIFwiY2xhc3NcIiBhY3Rpb25zOiBgUmVzb3VyY2UuYWN0aW9uKFtwYXJhbWV0ZXJzXSwgcG9zdERhdGEsIFtzdWNjZXNzXSwgW2Vycm9yXSlgXG4gKiAgIC0gbm9uLUdFVCBpbnN0YW5jZSBhY3Rpb25zOiAgYGluc3RhbmNlLiRhY3Rpb24oW3BhcmFtZXRlcnNdLCBbc3VjY2Vzc10sIFtlcnJvcl0pYFxuICpcbiAqXG4gKiAgIFN1Y2Nlc3MgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggKHZhbHVlIChPYmplY3R8QXJyYXkpLCByZXNwb25zZUhlYWRlcnMgKEZ1bmN0aW9uKSxcbiAqICAgc3RhdHVzIChudW1iZXIpLCBzdGF0dXNUZXh0IChzdHJpbmcpKSBhcmd1bWVudHMsIHdoZXJlIHRoZSB2YWx1ZSBpcyB0aGUgcG9wdWxhdGVkIHJlc291cmNlXG4gKiAgIGluc3RhbmNlIG9yIGNvbGxlY3Rpb24gb2JqZWN0LiBUaGUgZXJyb3IgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggKGh0dHBSZXNwb25zZSkgYXJndW1lbnQuXG4gKlxuICogICBDbGFzcyBhY3Rpb25zIHJldHVybiBlbXB0eSBpbnN0YW5jZSAod2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYmVsb3cpLlxuICogICBJbnN0YW5jZSBhY3Rpb25zIHJldHVybiBwcm9taXNlIG9mIHRoZSBhY3Rpb24uXG4gKlxuICogICBUaGUgUmVzb3VyY2UgaW5zdGFuY2VzIGFuZCBjb2xsZWN0aW9ucyBoYXZlIHRoZXNlIGFkZGl0aW9uYWwgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gYCRwcm9taXNlYDogdGhlIHtAbGluayBuZy4kcSBwcm9taXNlfSBvZiB0aGUgb3JpZ2luYWwgc2VydmVyIGludGVyYWN0aW9uIHRoYXQgY3JlYXRlZCB0aGlzXG4gKiAgICAgaW5zdGFuY2Ugb3IgY29sbGVjdGlvbi5cbiAqXG4gKiAgICAgT24gc3VjY2VzcywgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc2FtZSByZXNvdXJjZSBpbnN0YW5jZSBvciBjb2xsZWN0aW9uIG9iamVjdCxcbiAqICAgICB1cGRhdGVkIHdpdGggZGF0YSBmcm9tIHNlcnZlci4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHVzZSBpblxuICogICAgIHtAbGluayBuZ1JvdXRlLiRyb3V0ZVByb3ZpZGVyIHJlc29sdmUgc2VjdGlvbiBvZiAkcm91dGVQcm92aWRlci53aGVuKCl9IHRvIGRlZmVyIHZpZXdcbiAqICAgICByZW5kZXJpbmcgdW50aWwgdGhlIHJlc291cmNlKHMpIGFyZSBsb2FkZWQuXG4gKlxuICogICAgIE9uIGZhaWx1cmUsIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIHdpdGggdGhlIHtAbGluayBuZy4kaHR0cCBodHRwIHJlc3BvbnNlfSBvYmplY3QsIHdpdGhvdXRcbiAqICAgICB0aGUgYHJlc291cmNlYCBwcm9wZXJ0eS5cbiAqXG4gKiAgICAgSWYgYW4gaW50ZXJjZXB0b3Igb2JqZWN0IHdhcyBwcm92aWRlZCwgdGhlIHByb21pc2Ugd2lsbCBpbnN0ZWFkIGJlIHJlc29sdmVkIHdpdGggdGhlIHZhbHVlXG4gKiAgICAgcmV0dXJuZWQgYnkgdGhlIGludGVyY2VwdG9yLlxuICpcbiAqICAgLSBgJHJlc29sdmVkYDogYHRydWVgIGFmdGVyIGZpcnN0IHNlcnZlciBpbnRlcmFjdGlvbiBpcyBjb21wbGV0ZWQgKGVpdGhlciB3aXRoIHN1Y2Nlc3Mgb3JcbiAqICAgICAgcmVqZWN0aW9uKSwgYGZhbHNlYCBiZWZvcmUgdGhhdC4gS25vd2luZyBpZiB0aGUgUmVzb3VyY2UgaGFzIGJlZW4gcmVzb2x2ZWQgaXMgdXNlZnVsIGluXG4gKiAgICAgIGRhdGEtYmluZGluZy5cbiAqXG4gKiAgIFRoZSBSZXNvdXJjZSBpbnN0YW5jZXMgYW5kIGNvbGxlY3Rpb25zIGhhdmUgdGhlc2UgYWRkaXRpb25hbCBtZXRob2RzOlxuICpcbiAqICAgLSBgJGNhbmNlbFJlcXVlc3RgOiBJZiB0aGVyZSBpcyBhIGNhbmNlbGxhYmxlLCBwZW5kaW5nIHJlcXVlc3QgcmVsYXRlZCB0byB0aGUgaW5zdGFuY2Ugb3JcbiAqICAgICAgY29sbGVjdGlvbiwgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGFib3J0IHRoZSByZXF1ZXN0LlxuICpcbiAqICAgVGhlIFJlc291cmNlIGluc3RhbmNlcyBoYXZlIHRoZXNlIGFkZGl0aW9uYWwgbWV0aG9kczpcbiAqXG4gKiAgIC0gYHRvSlNPTmA6IEl0IHJldHVybnMgYSBzaW1wbGUgb2JqZWN0IHdpdGhvdXQgYW55IG9mIHRoZSBleHRyYSBwcm9wZXJ0aWVzIGFkZGVkIGFzIHBhcnQgb2ZcbiAqICAgICB0aGUgUmVzb3VyY2UgQVBJLiBUaGlzIG9iamVjdCBjYW4gYmUgc2VyaWFsaXplZCB0aHJvdWdoIHtAbGluayBhbmd1bGFyLnRvSnNvbn0gc2FmZWx5XG4gKiAgICAgd2l0aG91dCBhdHRhY2hpbmcgQW5ndWxhci1zcGVjaWZpYyBmaWVsZHMuIE5vdGljZSB0aGF0IGBKU09OLnN0cmluZ2lmeWAgKGFuZFxuICogICAgIGBhbmd1bGFyLnRvSnNvbmApIGF1dG9tYXRpY2FsbHkgdXNlIHRoaXMgbWV0aG9kIHdoZW4gc2VyaWFsaXppbmcgYSBSZXNvdXJjZSBpbnN0YW5jZVxuICogICAgIChzZWUgW01ETl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjdG9KU09OKClfYmVoYXZpb3IpKS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICMgQ3JlZGl0IGNhcmQgcmVzb3VyY2VcbiAqXG4gKiBgYGBqc1xuICAgICAvLyBEZWZpbmUgQ3JlZGl0Q2FyZCBjbGFzc1xuICAgICB2YXIgQ3JlZGl0Q2FyZCA9ICRyZXNvdXJjZSgnL3VzZXIvOnVzZXJJZC9jYXJkLzpjYXJkSWQnLFxuICAgICAge3VzZXJJZDoxMjMsIGNhcmRJZDonQGlkJ30sIHtcbiAgICAgICBjaGFyZ2U6IHttZXRob2Q6J1BPU1QnLCBwYXJhbXM6e2NoYXJnZTp0cnVlfX1cbiAgICAgIH0pO1xuXG4gICAgIC8vIFdlIGNhbiByZXRyaWV2ZSBhIGNvbGxlY3Rpb24gZnJvbSB0aGUgc2VydmVyXG4gICAgIHZhciBjYXJkcyA9IENyZWRpdENhcmQucXVlcnkoZnVuY3Rpb24oKSB7XG4gICAgICAgLy8gR0VUOiAvdXNlci8xMjMvY2FyZFxuICAgICAgIC8vIHNlcnZlciByZXR1cm5zOiBbIHtpZDo0NTYsIG51bWJlcjonMTIzNCcsIG5hbWU6J1NtaXRoJ30gXTtcblxuICAgICAgIHZhciBjYXJkID0gY2FyZHNbMF07XG4gICAgICAgLy8gZWFjaCBpdGVtIGlzIGFuIGluc3RhbmNlIG9mIENyZWRpdENhcmRcbiAgICAgICBleHBlY3QoY2FyZCBpbnN0YW5jZW9mIENyZWRpdENhcmQpLnRvRXF1YWwodHJ1ZSk7XG4gICAgICAgY2FyZC5uYW1lID0gXCJKLiBTbWl0aFwiO1xuICAgICAgIC8vIG5vbiBHRVQgbWV0aG9kcyBhcmUgbWFwcGVkIG9udG8gdGhlIGluc3RhbmNlc1xuICAgICAgIGNhcmQuJHNhdmUoKTtcbiAgICAgICAvLyBQT1NUOiAvdXNlci8xMjMvY2FyZC80NTYge2lkOjQ1NiwgbnVtYmVyOicxMjM0JywgbmFtZTonSi4gU21pdGgnfVxuICAgICAgIC8vIHNlcnZlciByZXR1cm5zOiB7aWQ6NDU2LCBudW1iZXI6JzEyMzQnLCBuYW1lOiAnSi4gU21pdGgnfTtcblxuICAgICAgIC8vIG91ciBjdXN0b20gbWV0aG9kIGlzIG1hcHBlZCBhcyB3ZWxsLlxuICAgICAgIGNhcmQuJGNoYXJnZSh7YW1vdW50OjkuOTl9KTtcbiAgICAgICAvLyBQT1NUOiAvdXNlci8xMjMvY2FyZC80NTY/YW1vdW50PTkuOTkmY2hhcmdlPXRydWUge2lkOjQ1NiwgbnVtYmVyOicxMjM0JywgbmFtZTonSi4gU21pdGgnfVxuICAgICB9KTtcblxuICAgICAvLyB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIGFzIHdlbGxcbiAgICAgdmFyIG5ld0NhcmQgPSBuZXcgQ3JlZGl0Q2FyZCh7bnVtYmVyOicwMTIzJ30pO1xuICAgICBuZXdDYXJkLm5hbWUgPSBcIk1pa2UgU21pdGhcIjtcbiAgICAgbmV3Q2FyZC4kc2F2ZSgpO1xuICAgICAvLyBQT1NUOiAvdXNlci8xMjMvY2FyZCB7bnVtYmVyOicwMTIzJywgbmFtZTonTWlrZSBTbWl0aCd9XG4gICAgIC8vIHNlcnZlciByZXR1cm5zOiB7aWQ6Nzg5LCBudW1iZXI6JzAxMjMnLCBuYW1lOiAnTWlrZSBTbWl0aCd9O1xuICAgICBleHBlY3QobmV3Q2FyZC5pZCkudG9FcXVhbCg3ODkpO1xuICogYGBgXG4gKlxuICogVGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gZXhlY3V0aW9uIGlzIGEgcmVzb3VyY2UgXCJjbGFzc1wiIHdoaWNoIGhhcyBcInN0YXRpY1wiIG1ldGhvZFxuICogZm9yIGVhY2ggYWN0aW9uIGluIHRoZSBkZWZpbml0aW9uLlxuICpcbiAqIENhbGxpbmcgdGhlc2UgbWV0aG9kcyBpbnZva2UgYCRodHRwYCBvbiB0aGUgYHVybGAgdGVtcGxhdGUgd2l0aCB0aGUgZ2l2ZW4gYG1ldGhvZGAsIGBwYXJhbXNgIGFuZFxuICogYGhlYWRlcnNgLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogIyBVc2VyIHJlc291cmNlXG4gKlxuICogV2hlbiB0aGUgZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgdGhlbiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSB0eXBlIGFuZFxuICogYWxsIG9mIHRoZSBub24tR0VUIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB3aXRoIGAkYCBwcmVmaXguIFRoaXMgYWxsb3dzIHlvdSB0byBlYXNpbHkgc3VwcG9ydCBDUlVEXG4gKiBvcGVyYXRpb25zIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKSBvbiBzZXJ2ZXItc2lkZSBkYXRhLlxuXG4gICBgYGBqc1xuICAgICB2YXIgVXNlciA9ICRyZXNvdXJjZSgnL3VzZXIvOnVzZXJJZCcsIHt1c2VySWQ6J0BpZCd9KTtcbiAgICAgVXNlci5nZXQoe3VzZXJJZDoxMjN9LCBmdW5jdGlvbih1c2VyKSB7XG4gICAgICAgdXNlci5hYmMgPSB0cnVlO1xuICAgICAgIHVzZXIuJHNhdmUoKTtcbiAgICAgfSk7XG4gICBgYGBcbiAqXG4gKiBJdCdzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBzdWNjZXNzIGNhbGxiYWNrIGZvciBgZ2V0YCwgYHF1ZXJ5YCBhbmQgb3RoZXIgbWV0aG9kcyBnZXRzIHBhc3NlZFxuICogaW4gdGhlIHJlc3BvbnNlIHRoYXQgY2FtZSBmcm9tIHRoZSBzZXJ2ZXIgYXMgd2VsbCBhcyAkaHR0cCBoZWFkZXIgZ2V0dGVyIGZ1bmN0aW9uLCBzbyBvbmVcbiAqIGNvdWxkIHJld3JpdGUgdGhlIGFib3ZlIGV4YW1wbGUgYW5kIGdldCBhY2Nlc3MgdG8gaHR0cCBoZWFkZXJzIGFzOlxuICpcbiAgIGBgYGpzXG4gICAgIHZhciBVc2VyID0gJHJlc291cmNlKCcvdXNlci86dXNlcklkJywge3VzZXJJZDonQGlkJ30pO1xuICAgICBVc2VyLmdldCh7dXNlcklkOjEyM30sIGZ1bmN0aW9uKHVzZXIsIGdldFJlc3BvbnNlSGVhZGVycyl7XG4gICAgICAgdXNlci5hYmMgPSB0cnVlO1xuICAgICAgIHVzZXIuJHNhdmUoZnVuY3Rpb24odXNlciwgcHV0UmVzcG9uc2VIZWFkZXJzKSB7XG4gICAgICAgICAvL3VzZXIgPT4gc2F2ZWQgdXNlciBvYmplY3RcbiAgICAgICAgIC8vcHV0UmVzcG9uc2VIZWFkZXJzID0+ICRodHRwIGhlYWRlciBnZXR0ZXJcbiAgICAgICB9KTtcbiAgICAgfSk7XG4gICBgYGBcbiAqXG4gKiBZb3UgY2FuIGFsc28gYWNjZXNzIHRoZSByYXcgYCRodHRwYCBwcm9taXNlIHZpYSB0aGUgYCRwcm9taXNlYCBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0IHJldHVybmVkXG4gKlxuICAgYGBgXG4gICAgIHZhciBVc2VyID0gJHJlc291cmNlKCcvdXNlci86dXNlcklkJywge3VzZXJJZDonQGlkJ30pO1xuICAgICBVc2VyLmdldCh7dXNlcklkOjEyM30pXG4gICAgICAgICAuJHByb21pc2UudGhlbihmdW5jdGlvbih1c2VyKSB7XG4gICAgICAgICAgICRzY29wZS51c2VyID0gdXNlcjtcbiAgICAgICAgIH0pO1xuICAgYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAjIENyZWF0aW5nIGEgY3VzdG9tICdQVVQnIHJlcXVlc3RcbiAqXG4gKiBJbiB0aGlzIGV4YW1wbGUgd2UgY3JlYXRlIGEgY3VzdG9tIG1ldGhvZCBvbiBvdXIgcmVzb3VyY2UgdG8gbWFrZSBhIFBVVCByZXF1ZXN0XG4gKiBgYGBqc1xuICogICAgdmFyIGFwcCA9IGFuZ3VsYXIubW9kdWxlKCdhcHAnLCBbJ25nUmVzb3VyY2UnLCAnbmdSb3V0ZSddKTtcbiAqXG4gKiAgICAvLyBTb21lIEFQSXMgZXhwZWN0IGEgUFVUIHJlcXVlc3QgaW4gdGhlIGZvcm1hdCBVUkwvb2JqZWN0L0lEXG4gKiAgICAvLyBIZXJlIHdlIGFyZSBjcmVhdGluZyBhbiAndXBkYXRlJyBtZXRob2RcbiAqICAgIGFwcC5mYWN0b3J5KCdOb3RlcycsIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7XG4gKiAgICByZXR1cm4gJHJlc291cmNlKCcvbm90ZXMvOmlkJywgbnVsbCxcbiAqICAgICAgICB7XG4gKiAgICAgICAgICAgICd1cGRhdGUnOiB7IG1ldGhvZDonUFVUJyB9XG4gKiAgICAgICAgfSk7XG4gKiAgICB9XSk7XG4gKlxuICogICAgLy8gSW4gb3VyIGNvbnRyb2xsZXIgd2UgZ2V0IHRoZSBJRCBmcm9tIHRoZSBVUkwgdXNpbmcgbmdSb3V0ZSBhbmQgJHJvdXRlUGFyYW1zXG4gKiAgICAvLyBXZSBwYXNzIGluICRyb3V0ZVBhcmFtcyBhbmQgb3VyIE5vdGVzIGZhY3RvcnkgYWxvbmcgd2l0aCAkc2NvcGVcbiAqICAgIGFwcC5jb250cm9sbGVyKCdOb3Rlc0N0cmwnLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnTm90ZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkc2NvcGUsICRyb3V0ZVBhcmFtcywgTm90ZXMpIHtcbiAqICAgIC8vIEZpcnN0IGdldCBhIG5vdGUgb2JqZWN0IGZyb20gdGhlIGZhY3RvcnlcbiAqICAgIHZhciBub3RlID0gTm90ZXMuZ2V0KHsgaWQ6JHJvdXRlUGFyYW1zLmlkIH0pO1xuICogICAgJGlkID0gbm90ZS5pZDtcbiAqXG4gKiAgICAvLyBOb3cgY2FsbCB1cGRhdGUgcGFzc2luZyBpbiB0aGUgSUQgZmlyc3QgdGhlbiB0aGUgb2JqZWN0IHlvdSBhcmUgdXBkYXRpbmdcbiAqICAgIE5vdGVzLnVwZGF0ZSh7IGlkOiRpZCB9LCBub3RlKTtcbiAqXG4gKiAgICAvLyBUaGlzIHdpbGwgUFVUIC9ub3Rlcy9JRCB3aXRoIHRoZSBub3RlIG9iamVjdCBpbiB0aGUgcmVxdWVzdCBwYXlsb2FkXG4gKiAgICB9XSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICMgQ2FuY2VsbGluZyByZXF1ZXN0c1xuICpcbiAqIElmIGFuIGFjdGlvbidzIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIHRoYXQgaXQgaXMgY2FuY2VsbGFibGUsIHlvdSBjYW4gY2FuY2VsIHRoZSByZXF1ZXN0IHJlbGF0ZWRcbiAqIHRvIGFuIGluc3RhbmNlIG9yIGNvbGxlY3Rpb24gKGFzIGxvbmcgYXMgaXQgaXMgYSByZXN1bHQgb2YgYSBcIm5vbi1pbnN0YW5jZVwiIGNhbGwpOlxuICpcbiAgIGBgYGpzXG4gICAgIC8vIC4uLmRlZmluaW5nIHRoZSBgSG90ZWxgIHJlc291cmNlLi4uXG4gICAgIHZhciBIb3RlbCA9ICRyZXNvdXJjZSgnL2FwaS9ob3RlbC86aWQnLCB7aWQ6ICdAaWQnfSwge1xuICAgICAgIC8vIExldCdzIG1ha2UgdGhlIGBxdWVyeSgpYCBtZXRob2QgY2FuY2VsbGFibGVcbiAgICAgICBxdWVyeToge21ldGhvZDogJ2dldCcsIGlzQXJyYXk6IHRydWUsIGNhbmNlbGxhYmxlOiB0cnVlfVxuICAgICB9KTtcblxuICAgICAvLyAuLi5zb21ld2hlcmUgaW4gdGhlIFBsYW5WYWNhdGlvbkNvbnRyb2xsZXIuLi5cbiAgICAgLi4uXG4gICAgIHRoaXMub25EZXN0aW5hdGlvbkNoYW5nZWQgPSBmdW5jdGlvbiBvbkRlc3RpbmF0aW9uQ2hhbmdlZChkZXN0aW5hdGlvbikge1xuICAgICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgYW55IHBlbmRpbmcgcmVxdWVzdCBmb3IgaG90ZWxzXG4gICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgZGVzdGluYXRpb24gYW55IG1vcmVcbiAgICAgICB0aGlzLmF2YWlsYWJsZUhvdGVscy4kY2FuY2VsUmVxdWVzdCgpO1xuXG4gICAgICAgLy8gTGV0J3MgcXVlcnkgZm9yIGhvdGVscyBpbiAnPGRlc3RpbmF0aW9uPidcbiAgICAgICAvLyAoY2FsbHM6IC9hcGkvaG90ZWw/bG9jYXRpb249PGRlc3RpbmF0aW9uPilcbiAgICAgICB0aGlzLmF2YWlsYWJsZUhvdGVscyA9IEhvdGVsLnF1ZXJ5KHtsb2NhdGlvbjogZGVzdGluYXRpb259KTtcbiAgICAgfTtcbiAgIGBgYFxuICpcbiAqL1xuYW5ndWxhci5tb2R1bGUoJ25nUmVzb3VyY2UnLCBbJ25nJ10pLlxuICBwcm92aWRlcignJHJlc291cmNlJywgZnVuY3Rpb24gUmVzb3VyY2VQcm92aWRlcigpIHtcbiAgICB2YXIgUFJPVE9DT0xfQU5EX0lQVjZfUkVHRVggPSAvXmh0dHBzPzpcXC9cXC9cXFtbXlxcXV0qXVteL10qLztcblxuICAgIHZhciBwcm92aWRlciA9IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICAgKiBAbmFtZSAkcmVzb3VyY2VQcm92aWRlciNkZWZhdWx0c1xuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIE9iamVjdCBjb250YWluaW5nIGRlZmF1bHQgb3B0aW9ucyB1c2VkIHdoZW4gY3JlYXRpbmcgYCRyZXNvdXJjZWAgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWVzIHNhdGlzZnkgYSB3aWRlIHJhbmdlIG9mIHVzZWNhc2VzLCBidXQgeW91IG1heSBjaG9vc2UgdG8gb3ZlcndyaXRlIGFueSBvZlxuICAgICAqIHRoZW0gdG8gZnVydGhlciBjdXN0b21pemUgeW91ciBpbnN0YW5jZXMuIFRoZSBhdmFpbGFibGUgcHJvcGVydGllcyBhcmU6XG4gICAgICpcbiAgICAgKiAtICoqc3RyaXBUcmFpbGluZ1NsYXNoZXMqKiDigJMgYHtib29sZWFufWAg4oCTIElmIHRydWUsIHRoZW4gdGhlIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBhbnlcbiAgICAgKiAgIGNhbGN1bGF0ZWQgVVJMIHdpbGwgYmUgc3RyaXBwZWQuPGJyIC8+XG4gICAgICogICAoRGVmYXVsdHMgdG8gdHJ1ZS4pXG4gICAgICogLSAqKmNhbmNlbGxhYmxlKiog4oCTIGB7Ym9vbGVhbn1gIOKAkyBJZiB0cnVlLCB0aGUgcmVxdWVzdCBtYWRlIGJ5IGEgXCJub24taW5zdGFuY2VcIiBjYWxsIHdpbGwgYmVcbiAgICAgKiAgIGNhbmNlbGxlZCAoaWYgbm90IGFscmVhZHkgY29tcGxldGVkKSBieSBjYWxsaW5nIGAkY2FuY2VsUmVxdWVzdCgpYCBvbiB0aGUgY2FsbCdzIHJldHVyblxuICAgICAqICAgdmFsdWUuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB7QGxpbmsgbmdSZXNvdXJjZS4kcmVzb3VyY2V9LiBUaGlzIGNhbiBiZSBvdmVyd3JpdHRlbiBwZXJcbiAgICAgKiAgIHJlc291cmNlIGNsYXNzIG9yIGFjdGlvbi48YnIgLz5cbiAgICAgKiAgIChEZWZhdWx0cyB0byBmYWxzZS4pXG4gICAgICogLSAqKmFjdGlvbnMqKiAtIGB7T2JqZWN0LjxPYmplY3Q+fWAgLSBBIGhhc2ggd2l0aCBkZWZhdWx0IGFjdGlvbnMgZGVjbGFyYXRpb25zLiBBY3Rpb25zIGFyZVxuICAgICAqICAgaGlnaC1sZXZlbCBtZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gUkVTVGZ1bCBhY3Rpb25zL21ldGhvZHMgb24gcmVzb3VyY2VzLiBBbiBhY3Rpb24gbWF5XG4gICAgICogICBzcGVjaWZ5IHdoYXQgSFRUUCBtZXRob2QgdG8gdXNlLCB3aGF0IFVSTCB0byBoaXQsIGlmIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhIHNpbmdsZVxuICAgICAqICAgb2JqZWN0IG9yIGEgY29sbGVjdGlvbiAoYXJyYXkpIG9mIG9iamVjdHMgZXRjLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWVcbiAgICAgKiAgIHtAbGluayBuZ1Jlc291cmNlLiRyZXNvdXJjZX0uIFRoZSBhY3Rpb25zIGNhbiBhbHNvIGJlIGVuaGFuY2VkIG9yIG92ZXJ3cml0dGVuIHBlciByZXNvdXJjZVxuICAgICAqICAgY2xhc3MuPGJyIC8+XG4gICAgICogICBUaGUgZGVmYXVsdCBhY3Rpb25zIGFyZTpcbiAgICAgKiAgIGBgYGpzXG4gICAgICogICB7XG4gICAgICogICAgIGdldDoge21ldGhvZDogJ0dFVCd9LFxuICAgICAqICAgICBzYXZlOiB7bWV0aG9kOiAnUE9TVCd9LFxuICAgICAqICAgICBxdWVyeToge21ldGhvZDogJ0dFVCcsIGlzQXJyYXk6IHRydWV9LFxuICAgICAqICAgICByZW1vdmU6IHttZXRob2Q6ICdERUxFVEUnfSxcbiAgICAgKiAgICAgZGVsZXRlOiB7bWV0aG9kOiAnREVMRVRFJ31cbiAgICAgKiAgIH1cbiAgICAgKiAgIGBgYFxuICAgICAqXG4gICAgICogIyMjIyBFeGFtcGxlXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgeW91IGNhbiBzcGVjaWZ5IGEgbmV3IGB1cGRhdGVgIGFjdGlvbiB0aGF0IHVzZXMgdGhlIGBQVVRgIEhUVFAgdmVyYjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogICBhbmd1bGFyLlxuICAgICAqICAgICBtb2R1bGUoJ215QXBwJykuXG4gICAgICogICAgIGNvbmZpZyhbJyRyZXNvdXJjZVByb3ZpZGVyJywgZnVuY3Rpb24gKCRyZXNvdXJjZVByb3ZpZGVyKSB7XG4gICAgICogICAgICAgJHJlc291cmNlUHJvdmlkZXIuZGVmYXVsdHMuYWN0aW9ucy51cGRhdGUgPSB7XG4gICAgICogICAgICAgICBtZXRob2Q6ICdQVVQnXG4gICAgICogICAgICAgfTtcbiAgICAgKiAgICAgfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBPciB5b3UgY2FuIGV2ZW4gb3ZlcndyaXRlIHRoZSB3aG9sZSBgYWN0aW9uc2AgbGlzdCBhbmQgc3BlY2lmeSB5b3VyIG93bjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogICBhbmd1bGFyLlxuICAgICAqICAgICBtb2R1bGUoJ215QXBwJykuXG4gICAgICogICAgIGNvbmZpZyhbJyRyZXNvdXJjZVByb3ZpZGVyJywgZnVuY3Rpb24gKCRyZXNvdXJjZVByb3ZpZGVyKSB7XG4gICAgICogICAgICAgJHJlc291cmNlUHJvdmlkZXIuZGVmYXVsdHMuYWN0aW9ucyA9IHtcbiAgICAgKiAgICAgICAgIGNyZWF0ZToge21ldGhvZDogJ1BPU1QnfSxcbiAgICAgKiAgICAgICAgIGdldDogICAge21ldGhvZDogJ0dFVCd9LFxuICAgICAqICAgICAgICAgZ2V0QWxsOiB7bWV0aG9kOiAnR0VUJywgaXNBcnJheTp0cnVlfSxcbiAgICAgKiAgICAgICAgIHVwZGF0ZToge21ldGhvZDogJ1BVVCd9LFxuICAgICAqICAgICAgICAgZGVsZXRlOiB7bWV0aG9kOiAnREVMRVRFJ31cbiAgICAgKiAgICAgICB9O1xuICAgICAqICAgICB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqL1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICAvLyBTdHJpcCBzbGFzaGVzIGJ5IGRlZmF1bHRcbiAgICAgIHN0cmlwVHJhaWxpbmdTbGFzaGVzOiB0cnVlLFxuXG4gICAgICAvLyBNYWtlIG5vbi1pbnN0YW5jZSByZXF1ZXN0cyBjYW5jZWxsYWJsZSAodmlhIGAkY2FuY2VsUmVxdWVzdCgpYClcbiAgICAgIGNhbmNlbGxhYmxlOiBmYWxzZSxcblxuICAgICAgLy8gRGVmYXVsdCBhY3Rpb25zIGNvbmZpZ3VyYXRpb25cbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgJ2dldCc6IHttZXRob2Q6ICdHRVQnfSxcbiAgICAgICAgJ3NhdmUnOiB7bWV0aG9kOiAnUE9TVCd9LFxuICAgICAgICAncXVlcnknOiB7bWV0aG9kOiAnR0VUJywgaXNBcnJheTogdHJ1ZX0sXG4gICAgICAgICdyZW1vdmUnOiB7bWV0aG9kOiAnREVMRVRFJ30sXG4gICAgICAgICdkZWxldGUnOiB7bWV0aG9kOiAnREVMRVRFJ31cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy4kZ2V0ID0gWyckaHR0cCcsICckbG9nJywgJyRxJywgJyR0aW1lb3V0JywgZnVuY3Rpb24oJGh0dHAsICRsb2csICRxLCAkdGltZW91dCkge1xuXG4gICAgICB2YXIgbm9vcCA9IGFuZ3VsYXIubm9vcCxcbiAgICAgICAgICBmb3JFYWNoID0gYW5ndWxhci5mb3JFYWNoLFxuICAgICAgICAgIGV4dGVuZCA9IGFuZ3VsYXIuZXh0ZW5kLFxuICAgICAgICAgIGNvcHkgPSBhbmd1bGFyLmNvcHksXG4gICAgICAgICAgaXNBcnJheSA9IGFuZ3VsYXIuaXNBcnJheSxcbiAgICAgICAgICBpc0RlZmluZWQgPSBhbmd1bGFyLmlzRGVmaW5lZCxcbiAgICAgICAgICBpc0Z1bmN0aW9uID0gYW5ndWxhci5pc0Z1bmN0aW9uLFxuICAgICAgICAgIGlzTnVtYmVyID0gYW5ndWxhci5pc051bWJlcixcbiAgICAgICAgICBlbmNvZGVVcmlRdWVyeSA9IGFuZ3VsYXIuJCRlbmNvZGVVcmlRdWVyeSxcbiAgICAgICAgICBlbmNvZGVVcmlTZWdtZW50ID0gYW5ndWxhci4kJGVuY29kZVVyaVNlZ21lbnQ7XG5cbiAgICAgIGZ1bmN0aW9uIFJvdXRlKHRlbXBsYXRlLCBkZWZhdWx0cykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSBleHRlbmQoe30sIHByb3ZpZGVyLmRlZmF1bHRzLCBkZWZhdWx0cyk7XG4gICAgICAgIHRoaXMudXJsUGFyYW1zID0ge307XG4gICAgICB9XG5cbiAgICAgIFJvdXRlLnByb3RvdHlwZSA9IHtcbiAgICAgICAgc2V0VXJsUGFyYW1zOiBmdW5jdGlvbihjb25maWcsIHBhcmFtcywgYWN0aW9uVXJsKSB7XG4gICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgdXJsID0gYWN0aW9uVXJsIHx8IHNlbGYudGVtcGxhdGUsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlbmNvZGVkVmFsLFxuICAgICAgICAgICAgcHJvdG9jb2xBbmRJcHY2ID0gJyc7XG5cbiAgICAgICAgICB2YXIgdXJsUGFyYW1zID0gc2VsZi51cmxQYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGZvckVhY2godXJsLnNwbGl0KC9cXFcvKSwgZnVuY3Rpb24ocGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChwYXJhbSA9PT0gJ2hhc093blByb3BlcnR5Jykge1xuICAgICAgICAgICAgICB0aHJvdyAkcmVzb3VyY2VNaW5FcnIoJ2JhZG5hbWUnLCAnaGFzT3duUHJvcGVydHkgaXMgbm90IGEgdmFsaWQgcGFyYW1ldGVyIG5hbWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShuZXcgUmVnRXhwKCdeXFxcXGQrJCcpLnRlc3QocGFyYW0pKSAmJiBwYXJhbSAmJlxuICAgICAgICAgICAgICAobmV3IFJlZ0V4cCgnKF58W15cXFxcXFxcXF0pOicgKyBwYXJhbSArICcoXFxcXFd8JCknKS50ZXN0KHVybCkpKSB7XG4gICAgICAgICAgICAgIHVybFBhcmFtc1twYXJhbV0gPSB7XG4gICAgICAgICAgICAgICAgaXNRdWVyeVBhcmFtVmFsdWU6IChuZXcgUmVnRXhwKCdcXFxcPy4qPTonICsgcGFyYW0gKyAnKD86XFxcXFd8JCknKSkudGVzdCh1cmwpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcXFw6L2csICc6Jyk7XG4gICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoUFJPVE9DT0xfQU5EX0lQVjZfUkVHRVgsIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgICAgICAgICBwcm90b2NvbEFuZElwdjYgPSBtYXRjaDtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgICBmb3JFYWNoKHNlbGYudXJsUGFyYW1zLCBmdW5jdGlvbihwYXJhbUluZm8sIHVybFBhcmFtKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJhbXMuaGFzT3duUHJvcGVydHkodXJsUGFyYW0pID8gcGFyYW1zW3VybFBhcmFtXSA6IHNlbGYuZGVmYXVsdHNbdXJsUGFyYW1dO1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWwpICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAocGFyYW1JbmZvLmlzUXVlcnlQYXJhbVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZW5jb2RlZFZhbCA9IGVuY29kZVVyaVF1ZXJ5KHZhbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5jb2RlZFZhbCA9IGVuY29kZVVyaVNlZ21lbnQodmFsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShuZXcgUmVnRXhwKCc6JyArIHVybFBhcmFtICsgJyhcXFxcV3wkKScsICdnJyksIGZ1bmN0aW9uKG1hdGNoLCBwMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVkVmFsICsgcDE7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UobmV3IFJlZ0V4cCgnKC8/KTonICsgdXJsUGFyYW0gKyAnKFxcXFxXfCQpJywgJ2cnKSwgZnVuY3Rpb24obWF0Y2gsXG4gICAgICAgICAgICAgICAgICBsZWFkaW5nU2xhc2hlcywgdGFpbCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWlsLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGFpbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdTbGFzaGVzICsgdGFpbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gc3RyaXAgdHJhaWxpbmcgc2xhc2hlcyBhbmQgc2V0IHRoZSB1cmwgKHVubGVzcyB0aGlzIGJlaGF2aW9yIGlzIHNwZWNpZmljYWxseSBkaXNhYmxlZClcbiAgICAgICAgICBpZiAoc2VsZi5kZWZhdWx0cy5zdHJpcFRyYWlsaW5nU2xhc2hlcykge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcLyskLywgJycpIHx8ICcvJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB0aGVuIHJlcGxhY2UgY29sbGFwc2UgYC8uYCBpZiBmb3VuZCBpbiB0aGUgbGFzdCBVUkwgcGF0aCBzZWdtZW50IGJlZm9yZSB0aGUgcXVlcnlcbiAgICAgICAgICAvLyBFLmcuIGBodHRwOi8vdXJsLmNvbS9pZC4vZm9ybWF0P3E9eGAgYmVjb21lcyBgaHR0cDovL3VybC5jb20vaWQuZm9ybWF0P3E9eGBcbiAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXFwvXFwuKD89XFx3KygkfFxcPykpLywgJy4nKTtcbiAgICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgYC9cXC5gIHdpdGggYC8uYFxuICAgICAgICAgIGNvbmZpZy51cmwgPSBwcm90b2NvbEFuZElwdjYgKyB1cmwucmVwbGFjZSgvXFwvXFxcXFxcLi8sICcvLicpO1xuXG5cbiAgICAgICAgICAvLyBzZXQgcGFyYW1zIC0gZGVsZWdhdGUgcGFyYW0gZW5jb2RpbmcgdG8gJGh0dHBcbiAgICAgICAgICBmb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgaWYgKCFzZWxmLnVybFBhcmFtc1trZXldKSB7XG4gICAgICAgICAgICAgIGNvbmZpZy5wYXJhbXMgPSBjb25maWcucGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgICBjb25maWcucGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuXG4gICAgICBmdW5jdGlvbiByZXNvdXJjZUZhY3RvcnkodXJsLCBwYXJhbURlZmF1bHRzLCBhY3Rpb25zLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciByb3V0ZSA9IG5ldyBSb3V0ZSh1cmwsIG9wdGlvbnMpO1xuXG4gICAgICAgIGFjdGlvbnMgPSBleHRlbmQoe30sIHByb3ZpZGVyLmRlZmF1bHRzLmFjdGlvbnMsIGFjdGlvbnMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGV4dHJhY3RQYXJhbXMoZGF0YSwgYWN0aW9uUGFyYW1zKSB7XG4gICAgICAgICAgdmFyIGlkcyA9IHt9O1xuICAgICAgICAgIGFjdGlvblBhcmFtcyA9IGV4dGVuZCh7fSwgcGFyYW1EZWZhdWx0cywgYWN0aW9uUGFyYW1zKTtcbiAgICAgICAgICBmb3JFYWNoKGFjdGlvblBhcmFtcywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7IHZhbHVlID0gdmFsdWUoZGF0YSk7IH1cbiAgICAgICAgICAgIGlkc1trZXldID0gdmFsdWUgJiYgdmFsdWUuY2hhckF0ICYmIHZhbHVlLmNoYXJBdCgwKSA9PT0gJ0AnID9cbiAgICAgICAgICAgICAgbG9va3VwRG90dGVkUGF0aChkYXRhLCB2YWx1ZS5zdWJzdHIoMSkpIDogdmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRSZXNwb25zZUludGVyY2VwdG9yKHJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gUmVzb3VyY2UodmFsdWUpIHtcbiAgICAgICAgICBzaGFsbG93Q2xlYXJBbmRDb3B5KHZhbHVlIHx8IHt9LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGV4dGVuZCh7fSwgdGhpcyk7XG4gICAgICAgICAgZGVsZXRlIGRhdGEuJHByb21pc2U7XG4gICAgICAgICAgZGVsZXRlIGRhdGEuJHJlc29sdmVkO1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvckVhY2goYWN0aW9ucywgZnVuY3Rpb24oYWN0aW9uLCBuYW1lKSB7XG4gICAgICAgICAgdmFyIGhhc0JvZHkgPSAvXihQT1NUfFBVVHxQQVRDSCkkL2kudGVzdChhY3Rpb24ubWV0aG9kKTtcbiAgICAgICAgICB2YXIgbnVtZXJpY1RpbWVvdXQgPSBhY3Rpb24udGltZW91dDtcbiAgICAgICAgICB2YXIgY2FuY2VsbGFibGUgPSBpc0RlZmluZWQoYWN0aW9uLmNhbmNlbGxhYmxlKSA/XG4gICAgICAgICAgICAgIGFjdGlvbi5jYW5jZWxsYWJsZSA6IHJvdXRlLmRlZmF1bHRzLmNhbmNlbGxhYmxlO1xuXG4gICAgICAgICAgaWYgKG51bWVyaWNUaW1lb3V0ICYmICFpc051bWJlcihudW1lcmljVGltZW91dCkpIHtcbiAgICAgICAgICAgICRsb2cuZGVidWcoJ25nUmVzb3VyY2U6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICcgIE9ubHkgbnVtZXJpYyB2YWx1ZXMgYXJlIGFsbG93ZWQgYXMgYHRpbWVvdXRgLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAnICBQcm9taXNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiAkcmVzb3VyY2UsIGJlY2F1c2UgdGhlIHNhbWUgdmFsdWUgd291bGQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICdiZSB1c2VkIGZvciBtdWx0aXBsZSByZXF1ZXN0cy4gSWYgeW91IGFyZSBsb29raW5nIGZvciBhIHdheSB0byBjYW5jZWwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICdyZXF1ZXN0cywgeW91IHNob3VsZCB1c2UgdGhlIGBjYW5jZWxsYWJsZWAgb3B0aW9uLicpO1xuICAgICAgICAgICAgZGVsZXRlIGFjdGlvbi50aW1lb3V0O1xuICAgICAgICAgICAgbnVtZXJpY1RpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIFJlc291cmNlW25hbWVdID0gZnVuY3Rpb24oYTEsIGEyLCBhMywgYTQpIHtcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fSwgZGF0YSwgc3VjY2VzcywgZXJyb3I7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBhNDtcbiAgICAgICAgICAgICAgICBzdWNjZXNzID0gYTM7XG4gICAgICAgICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihhMikpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGExKSkge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gYTE7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gYTI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBzdWNjZXNzID0gYTI7XG4gICAgICAgICAgICAgICAgICBlcnJvciA9IGEzO1xuICAgICAgICAgICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhMTtcbiAgICAgICAgICAgICAgICAgIGRhdGEgPSBhMjtcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBhMztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihhMSkpIHN1Y2Nlc3MgPSBhMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNCb2R5KSBkYXRhID0gYTE7XG4gICAgICAgICAgICAgICAgZWxzZSBwYXJhbXMgPSBhMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAwOiBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyAkcmVzb3VyY2VNaW5FcnIoJ2JhZGFyZ3MnLFxuICAgICAgICAgICAgICAgICAgJ0V4cGVjdGVkIHVwIHRvIDQgYXJndW1lbnRzIFtwYXJhbXMsIGRhdGEsIHN1Y2Nlc3MsIGVycm9yXSwgZ290IHswfSBhcmd1bWVudHMnLFxuICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpc0luc3RhbmNlQ2FsbCA9IHRoaXMgaW5zdGFuY2VvZiBSZXNvdXJjZTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGlzSW5zdGFuY2VDYWxsID8gZGF0YSA6IChhY3Rpb24uaXNBcnJheSA/IFtdIDogbmV3IFJlc291cmNlKGRhdGEpKTtcbiAgICAgICAgICAgIHZhciBodHRwQ29uZmlnID0ge307XG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VJbnRlcmNlcHRvciA9IGFjdGlvbi5pbnRlcmNlcHRvciAmJiBhY3Rpb24uaW50ZXJjZXB0b3IucmVzcG9uc2UgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdFJlc3BvbnNlSW50ZXJjZXB0b3I7XG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VFcnJvckludGVyY2VwdG9yID0gYWN0aW9uLmludGVyY2VwdG9yICYmIGFjdGlvbi5pbnRlcmNlcHRvci5yZXNwb25zZUVycm9yIHx8XG4gICAgICAgICAgICAgIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciBoYXNFcnJvciA9ICEhZXJyb3I7XG4gICAgICAgICAgICB2YXIgaGFzUmVzcG9uc2VFcnJvckludGVyY2VwdG9yID0gISFyZXNwb25zZUVycm9ySW50ZXJjZXB0b3I7XG4gICAgICAgICAgICB2YXIgdGltZW91dERlZmVycmVkO1xuICAgICAgICAgICAgdmFyIG51bWVyaWNUaW1lb3V0UHJvbWlzZTtcblxuICAgICAgICAgICAgZm9yRWFjaChhY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaHR0cENvbmZpZ1trZXldID0gY29weSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwYXJhbXMnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2lzQXJyYXknOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludGVyY2VwdG9yJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjYW5jZWxsYWJsZSc6XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghaXNJbnN0YW5jZUNhbGwgJiYgY2FuY2VsbGFibGUpIHtcbiAgICAgICAgICAgICAgdGltZW91dERlZmVycmVkID0gJHEuZGVmZXIoKTtcbiAgICAgICAgICAgICAgaHR0cENvbmZpZy50aW1lb3V0ID0gdGltZW91dERlZmVycmVkLnByb21pc2U7XG5cbiAgICAgICAgICAgICAgaWYgKG51bWVyaWNUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgbnVtZXJpY1RpbWVvdXRQcm9taXNlID0gJHRpbWVvdXQodGltZW91dERlZmVycmVkLnJlc29sdmUsIG51bWVyaWNUaW1lb3V0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzQm9keSkgaHR0cENvbmZpZy5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHJvdXRlLnNldFVybFBhcmFtcyhodHRwQ29uZmlnLFxuICAgICAgICAgICAgICBleHRlbmQoe30sIGV4dHJhY3RQYXJhbXMoZGF0YSwgYWN0aW9uLnBhcmFtcyB8fCB7fSksIHBhcmFtcyksXG4gICAgICAgICAgICAgIGFjdGlvbi51cmwpO1xuXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICRodHRwKGh0dHBDb25maWcpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjb252ZXJ0IGFjdGlvbi5pc0FycmF5IHRvIGJvb2xlYW4gaW4gY2FzZSBpdCBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShkYXRhKSAhPT0gKCEhYWN0aW9uLmlzQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyAkcmVzb3VyY2VNaW5FcnIoJ2JhZGNmZycsXG4gICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGluIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gZm9yIGFjdGlvbiBgezB9YC4gRXhwZWN0ZWQgcmVzcG9uc2UgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW4gYW4gezF9IGJ1dCBnb3QgYW4gezJ9IChSZXF1ZXN0OiB7M30gezR9KScsIG5hbWUsIGFjdGlvbi5pc0FycmF5ID8gJ2FycmF5JyA6ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICBpc0FycmF5KGRhdGEpID8gJ2FycmF5JyA6ICdvYmplY3QnLCBodHRwQ29uZmlnLm1ldGhvZCwgaHR0cENvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICBmb3JFYWNoKGRhdGEsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnB1c2gobmV3IFJlc291cmNlKGl0ZW0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZCBKU09OIHZhbHVlcyBtYXkgYmUgc3RyaW5nIGxpdGVyYWxzLCBhbmQgdGhlc2Ugc2hvdWxkIG5vdCBiZSBjb252ZXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIG9iamVjdHMuIFRoZXNlIGl0ZW1zIHdpbGwgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBSZXNvdXJjZSBwcm90b3R5cGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2RzLCBidXQgdW5mb3J0dW5hdGVseSB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHZhbHVlLiRwcm9taXNlOyAgICAgLy8gU2F2ZSB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgICAgc2hhbGxvd0NsZWFyQW5kQ29weShkYXRhLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZS4kcHJvbWlzZSA9IHByb21pc2U7ICAgICAgICAgLy8gUmVzdG9yZSB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNwb25zZS5yZXNvdXJjZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZVsnZmluYWxseSddKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YWx1ZS4kcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAoIWlzSW5zdGFuY2VDYWxsICYmIGNhbmNlbGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuJGNhbmNlbFJlcXVlc3QgPSBub29wO1xuICAgICAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbChudW1lcmljVGltZW91dFByb21pc2UpO1xuICAgICAgICAgICAgICAgIHRpbWVvdXREZWZlcnJlZCA9IG51bWVyaWNUaW1lb3V0UHJvbWlzZSA9IGh0dHBDb25maWcudGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKFxuICAgICAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3BvbnNlSW50ZXJjZXB0b3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIChzdWNjZXNzIHx8IG5vb3ApKHZhbHVlLCByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKGhhc0Vycm9yIHx8IGhhc1Jlc3BvbnNlRXJyb3JJbnRlcmNlcHRvcikgP1xuICAgICAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNFcnJvcikgZXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYXNSZXNwb25zZUVycm9ySW50ZXJjZXB0b3IgP1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZUVycm9ySW50ZXJjZXB0b3IocmVzcG9uc2UpIDpcbiAgICAgICAgICAgICAgICAgICAgJHEucmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfSA6XG4gICAgICAgICAgICAgIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBpZiAoaGFzRXJyb3IgJiYgIWhhc1Jlc3BvbnNlRXJyb3JJbnRlcmNlcHRvcikge1xuICAgICAgICAgICAgICAvLyBBdm9pZCBgUG9zc2libHkgVW5oYW5kbGVkIFJlamVjdGlvbmAgZXJyb3IsXG4gICAgICAgICAgICAgIC8vIGJ1dCBzdGlsbCBmdWxmaWxsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpdGggYSByZWplY3Rpb25cbiAgICAgICAgICAgICAgcHJvbWlzZS5jYXRjaChub29wKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0luc3RhbmNlQ2FsbCkge1xuICAgICAgICAgICAgICAvLyB3ZSBhcmUgY3JlYXRpbmcgaW5zdGFuY2UgLyBjb2xsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIC0gc2V0IHRoZSBpbml0aWFsIHByb21pc2VcbiAgICAgICAgICAgICAgLy8gLSByZXR1cm4gdGhlIGluc3RhbmNlIC8gY29sbGVjdGlvblxuICAgICAgICAgICAgICB2YWx1ZS4kcHJvbWlzZSA9IHByb21pc2U7XG4gICAgICAgICAgICAgIHZhbHVlLiRyZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoY2FuY2VsbGFibGUpIHZhbHVlLiRjYW5jZWxSZXF1ZXN0ID0gY2FuY2VsUmVxdWVzdDtcblxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluc3RhbmNlIGNhbGxcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBjYW5jZWxSZXF1ZXN0KHZhbHVlKSB7XG4gICAgICAgICAgICAgIHByb21pc2UuY2F0Y2gobm9vcCk7XG4gICAgICAgICAgICAgIHRpbWVvdXREZWZlcnJlZC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGVbJyQnICsgbmFtZV0gPSBmdW5jdGlvbihwYXJhbXMsIHN1Y2Nlc3MsIGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwYXJhbXMpKSB7XG4gICAgICAgICAgICAgIGVycm9yID0gc3VjY2Vzczsgc3VjY2VzcyA9IHBhcmFtczsgcGFyYW1zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gUmVzb3VyY2VbbmFtZV0uY2FsbCh0aGlzLCBwYXJhbXMsIHRoaXMsIHN1Y2Nlc3MsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuJHByb21pc2UgfHwgcmVzdWx0O1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFJlc291cmNlLmJpbmQgPSBmdW5jdGlvbihhZGRpdGlvbmFsUGFyYW1EZWZhdWx0cykge1xuICAgICAgICAgIHZhciBleHRlbmRlZFBhcmFtRGVmYXVsdHMgPSBleHRlbmQoe30sIHBhcmFtRGVmYXVsdHMsIGFkZGl0aW9uYWxQYXJhbURlZmF1bHRzKTtcbiAgICAgICAgICByZXR1cm4gcmVzb3VyY2VGYWN0b3J5KHVybCwgZXh0ZW5kZWRQYXJhbURlZmF1bHRzLCBhY3Rpb25zLCBvcHRpb25zKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gUmVzb3VyY2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvdXJjZUZhY3Rvcnk7XG4gICAgfV07XG4gIH0pO1xuXG5cbn0pKHdpbmRvdywgd2luZG93LmFuZ3VsYXIpO1xuIiwiLy8hIG1vbWVudC5qc1xuLy8hIHZlcnNpb24gOiAyLjE3LjFcbi8vISBhdXRob3JzIDogVGltIFdvb2QsIElza3JlbiBDaGVybmV2LCBNb21lbnQuanMgY29udHJpYnV0b3JzXG4vLyEgbGljZW5zZSA6IE1JVFxuLy8hIG1vbWVudGpzLmNvbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICBnbG9iYWwubW9tZW50ID0gZmFjdG9yeSgpXG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIGhvb2tDYWxsYmFjaztcblxuZnVuY3Rpb24gaG9va3MgKCkge1xuICAgIHJldHVybiBob29rQ2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbi8vIHdpdGhvdXQgY3JlYXRpbmcgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrIChjYWxsYmFjaykge1xuICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAvLyBJRTggd2lsbCB0cmVhdCB1bmRlZmluZWQgYW5kIG51bGwgYXMgb2JqZWN0IGlmIGl0IHdhc24ndCBmb3JcbiAgICAvLyBpbnB1dCAhPSBudWxsXG4gICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7XG4gICAgdmFyIGs7XG4gICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAvLyBldmVuIGlmIGl0cyBub3Qgb3duIHByb3BlcnR5IEknZCBzdGlsbCBjYWxsIGl0IG5vbi1lbXB0eVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihpbnB1dCkge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xufVxuXG5mdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICB2YXIgcmVzID0gW10sIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICByZXMucHVzaChmbihhcnJbaV0sIGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gaGFzT3duUHJvcChhLCBiKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgaSkpIHtcbiAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc093blByb3AoYiwgJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgfVxuXG4gICAgaWYgKGhhc093blByb3AoYiwgJ3ZhbHVlT2YnKSkge1xuICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgdHJ1ZSkudXRjKCk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgLy8gV2UgbmVlZCB0byBkZWVwIGNsb25lIHRoaXMgb2JqZWN0LlxuICAgIHJldHVybiB7XG4gICAgICAgIGVtcHR5ICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICB1bnVzZWRUb2tlbnMgICAgOiBbXSxcbiAgICAgICAgdW51c2VkSW5wdXQgICAgIDogW10sXG4gICAgICAgIG92ZXJmbG93ICAgICAgICA6IC0yLFxuICAgICAgICBjaGFyc0xlZnRPdmVyICAgOiAwLFxuICAgICAgICBudWxsSW5wdXQgICAgICAgOiBmYWxzZSxcbiAgICAgICAgaW52YWxpZE1vbnRoICAgIDogbnVsbCxcbiAgICAgICAgaW52YWxpZEZvcm1hdCAgIDogZmFsc2UsXG4gICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICBpc28gICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgcGFyc2VkRGF0ZVBhcnRzIDogW10sXG4gICAgICAgIG1lcmlkaWVtICAgICAgICA6IG51bGxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgIH1cbiAgICByZXR1cm4gbS5fcGY7XG59XG5cbnZhciBzb21lO1xuaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xufSBlbHNlIHtcbiAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxuXG52YXIgc29tZSQxID0gc29tZTtcblxuZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICB2YXIgZmxhZ3MgPSBnZXRQYXJzaW5nRmxhZ3MobSk7XG4gICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUkMS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpICE9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaXNOb3dWYWxpZCA9ICFpc05hTihtLl9kLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgIGZsYWdzLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAhZmxhZ3MuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAhZmxhZ3MuaW52YWxpZFdlZWtkYXkgJiZcbiAgICAgICAgICAgICFmbGFncy5udWxsSW5wdXQgJiZcbiAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRm9ybWF0ICYmXG4gICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAoIWZsYWdzLm1lcmlkaWVtIHx8IChmbGFncy5tZXJpZGllbSAmJiBwYXJzZWRQYXJ0cykpO1xuXG4gICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgZmxhZ3MuY2hhcnNMZWZ0T3ZlciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuID09IG51bGwgfHwgIU9iamVjdC5pc0Zyb3plbihtKSkge1xuICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbS5faXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW52YWxpZCAoZmxhZ3MpIHtcbiAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgIGV4dGVuZChnZXRQYXJzaW5nRmxhZ3MobSksIGZsYWdzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS51c2VySW52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCA9PT0gdm9pZCAwO1xufVxuXG4vLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4vLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxudmFyIG1vbWVudFByb3BlcnRpZXMgPSBob29rcy5tb21lbnRQcm9wZXJ0aWVzID0gW107XG5cbmZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICB2YXIgaSwgcHJvcCwgdmFsO1xuXG4gICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc0FNb21lbnRPYmplY3QpKSB7XG4gICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faSkpIHtcbiAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2YpKSB7XG4gICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICB9XG4gICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sKSkge1xuICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fc3RyaWN0KSkge1xuICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3R6bSkpIHtcbiAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICB9XG4gICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc1VUQykpIHtcbiAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fb2Zmc2V0KSkge1xuICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3BmKSkge1xuICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbG9jYWxlKSkge1xuICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgIH1cblxuICAgIGlmIChtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChpIGluIG1vbWVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgdmFsID0gZnJvbVtwcm9wXTtcbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvO1xufVxuXG52YXIgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4vLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxuZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgIGNvcHlDb25maWcodGhpcywgY29uZmlnKTtcbiAgICB0aGlzLl9kID0gbmV3IERhdGUoY29uZmlnLl9kICE9IG51bGwgPyBjb25maWcuX2QuZ2V0VGltZSgpIDogTmFOKTtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgLy8gb2JqZWN0cy5cbiAgICBpZiAodXBkYXRlSW5Qcm9ncmVzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNNb21lbnQgKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xufVxuXG5mdW5jdGlvbiBhYnNGbG9vciAobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgLy8gLTAgLT4gMFxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcikgfHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgIHZhciBjb2VyY2VkTnVtYmVyID0gK2FyZ3VtZW50Rm9yQ29lcmNpb24sXG4gICAgICAgIHZhbHVlID0gMDtcblxuICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgIHZhbHVlID0gYWJzRmxvb3IoY29lcmNlZE51bWJlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG5mdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKSkge1xuICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xufVxuXG5mdW5jdGlvbiB3YXJuKG1zZykge1xuICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAodHlwZW9mIGNvbnNvbGUgIT09ICAndW5kZWZpbmVkJykgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRpb24gd2FybmluZzogJyArIG1zZyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZXByZWNhdGUobXNnLCBmbikge1xuICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIHZhciBhcmc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgKz0gJ1xcblsnICsgaSArICddICc7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSwgZm4pO1xufVxuXG52YXIgZGVwcmVjYXRpb25zID0ge307XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgfVxuICAgIGlmICghZGVwcmVjYXRpb25zW25hbWVdKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICB9XG59XG5cbmhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyID0gbnVsbDtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbmZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgdmFyIHByb3AsIGk7XG4gICAgZm9yIChpIGluIGNvbmZpZykge1xuICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgdGhpc1tpXSA9IHByb3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgLy8gTGVuaWVudCBvcmRpbmFsIHBhcnNpbmcgYWNjZXB0cyBqdXN0IGEgbnVtYmVyIGluIGFkZGl0aW9uIHRvXG4gICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfb3JkaW5hbFBhcnNlTGVuaWVudC5cbiAgICB0aGlzLl9vcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cCh0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlICsgJ3wnICsgKC9cXGR7MSwyfS8pLnNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgdmFyIHJlcyA9IGV4dGVuZCh7fSwgcGFyZW50Q29uZmlnKSwgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gY2hpbGRDb25maWcpIHtcbiAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSB7fTtcbiAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRDb25maWdbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVzW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgaWYgKGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgIHJlc1twcm9wXSA9IGV4dGVuZCh7fSwgcmVzW3Byb3BdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgfVxufVxuXG52YXIga2V5cztcblxuaWYgKE9iamVjdC5rZXlzKSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzO1xufSBlbHNlIHtcbiAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgaSwgcmVzID0gW107XG4gICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaSkpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG59XG5cbnZhciBrZXlzJDEgPSBrZXlzO1xuXG52YXIgZGVmYXVsdENhbGVuZGFyID0ge1xuICAgIHNhbWVEYXkgOiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgIGxhc3REYXkgOiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgIHNhbWVFbHNlIDogJ0wnXG59O1xuXG5mdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhcltrZXldIHx8IHRoaXMuX2NhbGVuZGFyWydzYW1lRWxzZSddO1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dCkgPyBvdXRwdXQuY2FsbChtb20sIG5vdykgOiBvdXRwdXQ7XG59XG5cbnZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgTFRTICA6ICdoOm1tOnNzIEEnLFxuICAgIExUICAgOiAnaDptbSBBJyxcbiAgICBMICAgIDogJ01NL0REL1lZWVknLFxuICAgIExMICAgOiAnTU1NTSBELCBZWVlZJyxcbiAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgIExMTEwgOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSdcbn07XG5cbmZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgZm9ybWF0VXBwZXIgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV07XG5cbiAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsLnNsaWNlKDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG59XG5cbnZhciBkZWZhdWx0SW52YWxpZERhdGUgPSAnSW52YWxpZCBkYXRlJztcblxuZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbn1cblxudmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbnZhciBkZWZhdWx0T3JkaW5hbFBhcnNlID0gL1xcZHsxLDJ9LztcblxuZnVuY3Rpb24gb3JkaW5hbCAobnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZSgnJWQnLCBudW1iZXIpO1xufVxuXG52YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICBmdXR1cmUgOiAnaW4gJXMnLFxuICAgIHBhc3QgICA6ICclcyBhZ28nLFxuICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgIG0gIDogJ2EgbWludXRlJyxcbiAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICBoICA6ICdhbiBob3VyJyxcbiAgICBoaCA6ICclZCBob3VycycsXG4gICAgZCAgOiAnYSBkYXknLFxuICAgIGRkIDogJyVkIGRheXMnLFxuICAgIE0gIDogJ2EgbW9udGgnLFxuICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgeSAgOiAnYSB5ZWFyJyxcbiAgICB5eSA6ICclZCB5ZWFycydcbn07XG5cbmZ1bmN0aW9uIHJlbGF0aXZlVGltZSAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgdmFyIG91dHB1dCA9IHRoaXMuX3JlbGF0aXZlVGltZVtzdHJpbmddO1xuICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgIG91dHB1dChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIDpcbiAgICAgICAgb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG59XG5cbmZ1bmN0aW9uIHBhc3RGdXR1cmUgKGRpZmYsIG91dHB1dCkge1xuICAgIHZhciBmb3JtYXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbZGlmZiA+IDAgPyAnZnV0dXJlJyA6ICdwYXN0J107XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG59XG5cbnZhciBhbGlhc2VzID0ge307XG5cbmZ1bmN0aW9uIGFkZFVuaXRBbGlhcyAodW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgdmFyIGxvd2VyQ2FzZSA9IHVuaXQudG9Mb3dlckNhc2UoKTtcbiAgICBhbGlhc2VzW2xvd2VyQ2FzZV0gPSBhbGlhc2VzW2xvd2VyQ2FzZSArICdzJ10gPSBhbGlhc2VzW3Nob3J0aGFuZF0gPSB1bml0O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgIHJldHVybiB0eXBlb2YgdW5pdHMgPT09ICdzdHJpbmcnID8gYWxpYXNlc1t1bml0c10gfHwgYWxpYXNlc1t1bml0cy50b0xvd2VyQ2FzZSgpXSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICBwcm9wO1xuXG4gICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG59XG5cbnZhciBwcmlvcml0aWVzID0ge307XG5cbmZ1bmN0aW9uIGFkZFVuaXRQcmlvcml0eSh1bml0LCBwcmlvcml0eSkge1xuICAgIHByaW9yaXRpZXNbdW5pdF0gPSBwcmlvcml0eTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0c09iaikge1xuICAgIHZhciB1bml0cyA9IFtdO1xuICAgIGZvciAodmFyIHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgdW5pdHMucHVzaCh7dW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV19KTtcbiAgICB9XG4gICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHVuaXRzO1xufVxuXG5mdW5jdGlvbiBtYWtlR2V0U2V0ICh1bml0LCBrZWVwVGltZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldCQxKHRoaXMsIHVuaXQsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXQgKG1vbSwgdW5pdCkge1xuICAgIHJldHVybiBtb20uaXNWYWxpZCgpID9cbiAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG59XG5cbmZ1bmN0aW9uIHNldCQxIChtb20sIHVuaXQsIHZhbHVlKSB7XG4gICAgaWYgKG1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICB9XG59XG5cbi8vIE1PTUVOVFNcblxuZnVuY3Rpb24gc3RyaW5nR2V0ICh1bml0cykge1xuICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuZnVuY3Rpb24gc3RyaW5nU2V0ICh1bml0cywgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKHVuaXRzKTtcbiAgICAgICAgdmFyIHByaW9yaXRpemVkID0gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0cyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXNbcHJpb3JpdGl6ZWRbaV0udW5pdF0odW5pdHNbcHJpb3JpdGl6ZWRbaV0udW5pdF0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgIHZhciBhYnNOdW1iZXIgPSAnJyArIE1hdGguYWJzKG51bWJlciksXG4gICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgIHJldHVybiAoc2lnbiA/IChmb3JjZVNpZ24gPyAnKycgOiAnJykgOiAnLScpICtcbiAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgKyBhYnNOdW1iZXI7XG59XG5cbnZhciBmb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KFtIaF1tbShzcyk/fE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFFvP3xZWVlZWVl8WVlZWVl8WVlZWXxZWXxnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xraz98bW0/fHNzP3xTezEsOX18eHxYfHp6P3xaWj98LikvZztcblxudmFyIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2c7XG5cbnZhciBmb3JtYXRGdW5jdGlvbnMgPSB7fTtcblxudmFyIGZvcm1hdFRva2VuRnVuY3Rpb25zID0ge307XG5cbi8vIHRva2VuOiAgICAnTSdcbi8vIHBhZGRlZDogICBbJ01NJywgMl1cbi8vIG9yZGluYWw6ICAnTW8nXG4vLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbmZ1bmN0aW9uIGFkZEZvcm1hdFRva2VuICh0b2tlbiwgcGFkZGVkLCBvcmRpbmFsLCBjYWxsYmFjaykge1xuICAgIHZhciBmdW5jID0gY2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW2NhbGxiYWNrXSgpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICB9XG4gICAgaWYgKHBhZGRlZCkge1xuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHplcm9GaWxsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgcGFkZGVkWzFdLCBwYWRkZWRbMl0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3JkaW5hbCkge1xuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1tvcmRpbmFsXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdG9rZW4pO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgIGlmIChpbnB1dC5tYXRjaCgvXFxbW1xcc1xcU10vKSkge1xuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xufVxuXG5mdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgdmFyIGFycmF5ID0gZm9ybWF0Lm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpLCBpLCBsZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dKSB7XG4gICAgICAgICAgICBhcnJheVtpXSA9IGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5W2ldID0gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhhcnJheVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gJycsIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb3V0cHV0ICs9IGFycmF5W2ldIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KSA6IGFycmF5W2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbn1cblxuLy8gZm9ybWF0IGRhdGUgdXNpbmcgbmF0aXZlIGRhdGUgb2JqZWN0XG5mdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG4gICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gbS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICB9XG5cbiAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPSBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSB8fCBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcblxuICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbG9jYWxlKSB7XG4gICAgdmFyIGkgPSA1O1xuXG4gICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoaW5wdXQpIHx8IGlucHV0O1xuICAgIH1cblxuICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChpID49IDAgJiYgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShsb2NhbEZvcm1hdHRpbmdUb2tlbnMsIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2Vucyk7XG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpIC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdDtcbn1cblxudmFyIG1hdGNoMSAgICAgICAgID0gL1xcZC87ICAgICAgICAgICAgLy8gICAgICAgMCAtIDlcbnZhciBtYXRjaDIgICAgICAgICA9IC9cXGRcXGQvOyAgICAgICAgICAvLyAgICAgIDAwIC0gOTlcbnZhciBtYXRjaDMgICAgICAgICA9IC9cXGR7M30vOyAgICAgICAgIC8vICAgICAwMDAgLSA5OTlcbnZhciBtYXRjaDQgICAgICAgICA9IC9cXGR7NH0vOyAgICAgICAgIC8vICAgIDAwMDAgLSA5OTk5XG52YXIgbWF0Y2g2ICAgICAgICAgPSAvWystXT9cXGR7Nn0vOyAgICAvLyAtOTk5OTk5IC0gOTk5OTk5XG52YXIgbWF0Y2gxdG8yICAgICAgPSAvXFxkXFxkPy87ICAgICAgICAgLy8gICAgICAgMCAtIDk5XG52YXIgbWF0Y2gzdG80ICAgICAgPSAvXFxkXFxkXFxkXFxkPy87ICAgICAvLyAgICAgOTk5IC0gOTk5OVxudmFyIG1hdGNoNXRvNiAgICAgID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vOyAvLyAgIDk5OTk5IC0gOTk5OTk5XG52YXIgbWF0Y2gxdG8zICAgICAgPSAvXFxkezEsM30vOyAgICAgICAvLyAgICAgICAwIC0gOTk5XG52YXIgbWF0Y2gxdG80ICAgICAgPSAvXFxkezEsNH0vOyAgICAgICAvLyAgICAgICAwIC0gOTk5OVxudmFyIG1hdGNoMXRvNiAgICAgID0gL1srLV0/XFxkezEsNn0vOyAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuXG52YXIgbWF0Y2hVbnNpZ25lZCAgPSAvXFxkKy87ICAgICAgICAgICAvLyAgICAgICAwIC0gaW5mXG52YXIgbWF0Y2hTaWduZWQgICAgPSAvWystXT9cXGQrLzsgICAgICAvLyAgICAtaW5mIC0gaW5mXG5cbnZhciBtYXRjaE9mZnNldCAgICA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naTsgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG52YXIgbWF0Y2hTaG9ydE9mZnNldCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/L2dpOyAvLyArMDAgLTAwICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuXG52YXIgbWF0Y2hUaW1lc3RhbXAgPSAvWystXT9cXGQrKFxcLlxcZHsxLDN9KT8vOyAvLyAxMjM0NTY3ODkgMTIzNDU2Nzg5LjEyM1xuXG4vLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbi8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbnZhciBtYXRjaFdvcmQgPSAvWzAtOV0qWydhLXpcXHUwMEEwLVxcdTA1RkZcXHUwNzAwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdK3xbXFx1MDYwMC1cXHUwNkZGXFwvXSsoXFxzKj9bXFx1MDYwMC1cXHUwNkZGXSspezEsMn0vaTtcblxuXG52YXIgcmVnZXhlcyA9IHt9O1xuXG5mdW5jdGlvbiBhZGRSZWdleFRva2VuICh0b2tlbiwgcmVnZXgsIHN0cmljdFJlZ2V4KSB7XG4gICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgIHJldHVybiAoaXNTdHJpY3QgJiYgc3RyaWN0UmVnZXgpID8gc3RyaWN0UmVnZXggOiByZWdleDtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4gKHRva2VuLCBjb25maWcpIHtcbiAgICBpZiAoIWhhc093blByb3AocmVnZXhlcywgdG9rZW4pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2V4ZXNbdG9rZW5dKGNvbmZpZy5fc3RyaWN0LCBjb25maWcuX2xvY2FsZSk7XG59XG5cbi8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIHVuZXNjYXBlRm9ybWF0KHMpIHtcbiAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgIHJldHVybiBwMSB8fCBwMiB8fCBwMyB8fCBwNDtcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbn1cblxudmFyIHRva2VucyA9IHt9O1xuXG5mdW5jdGlvbiBhZGRQYXJzZVRva2VuICh0b2tlbiwgY2FsbGJhY2spIHtcbiAgICB2YXIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRva2VuID0gW3Rva2VuXTtcbiAgICB9XG4gICAgaWYgKGlzTnVtYmVyKGNhbGxiYWNrKSkge1xuICAgICAgICBmdW5jID0gZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdG9rZW5zW3Rva2VuW2ldXSA9IGZ1bmM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRXZWVrUGFyc2VUb2tlbiAodG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgIGNhbGxiYWNrKGlucHV0LCBjb25maWcuX3csIGNvbmZpZywgdG9rZW4pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGhhc093blByb3AodG9rZW5zLCB0b2tlbikpIHtcbiAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICB9XG59XG5cbnZhciBZRUFSID0gMDtcbnZhciBNT05USCA9IDE7XG52YXIgREFURSA9IDI7XG52YXIgSE9VUiA9IDM7XG52YXIgTUlOVVRFID0gNDtcbnZhciBTRUNPTkQgPSA1O1xudmFyIE1JTExJU0VDT05EID0gNjtcbnZhciBXRUVLID0gNztcbnZhciBXRUVLREFZID0gODtcblxudmFyIGluZGV4T2Y7XG5cbmlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcbn0gZWxzZSB7XG4gICAgaW5kZXhPZiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIC8vIEkga25vd1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2ldID09PSBvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG59XG5cbnZhciBpbmRleE9mJDEgPSBpbmRleE9mO1xuXG5mdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCArIDEsIDApKS5nZXRVVENEYXRlKCk7XG59XG5cbi8vIEZPUk1BVFRJTkdcblxuYWRkRm9ybWF0VG9rZW4oJ00nLCBbJ01NJywgMl0sICdNbycsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbignTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKCdNTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbn0pO1xuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygnbW9udGgnLCAnTScpO1xuXG4vLyBQUklPUklUWVxuXG5hZGRVbml0UHJpb3JpdHkoJ21vbnRoJywgOCk7XG5cbi8vIFBBUlNJTkdcblxuYWRkUmVnZXhUb2tlbignTScsICAgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdNTScsICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuYWRkUmVnZXhUb2tlbignTU1NJywgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5tb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbn0pO1xuYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5tb250aHNSZWdleChpc1N0cmljdCk7XG59KTtcblxuYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgIGFycmF5W01PTlRIXSA9IHRvSW50KGlucHV0KSAtIDE7XG59KTtcblxuYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICB2YXIgbW9udGggPSBjb25maWcuX2xvY2FsZS5tb250aHNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1vbnRoIG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZC5cbiAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICBhcnJheVtNT05USF0gPSBtb250aDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICB9XG59KTtcblxuLy8gTE9DQUxFU1xuXG52YXIgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LztcbnZhciBkZWZhdWx0TG9jYWxlTW9udGhzID0gJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyk7XG5mdW5jdGlvbiBsb2NhbGVNb250aHMgKG0sIGZvcm1hdCkge1xuICAgIGlmICghbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzO1xuICAgIH1cbiAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpID8gdGhpcy5fbW9udGhzW20ubW9udGgoKV0gOlxuICAgICAgICB0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbn1cblxudmFyIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCA9ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKTtcbmZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICBpZiAoIW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0O1xuICAgIH1cbiAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbTU9OVEhTX0lOX0ZPUk1BVC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgIHZhciBpLCBpaSwgbW9tLCBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlclxuICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ01NTU0nICYmIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIE1PTUVOVFNcblxuZnVuY3Rpb24gc2V0TW9udGggKG1vbSwgdmFsdWUpIHtcbiAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAvLyBObyBvcFxuICAgICAgICByZXR1cm4gbW9tO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgLy8gVE9ETzogQW5vdGhlciBzaWxlbnQgZmFpbHVyZT9cbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRheU9mTW9udGggPSBNYXRoLm1pbihtb20uZGF0ZSgpLCBkYXlzSW5Nb250aChtb20ueWVhcigpLCB2YWx1ZSkpO1xuICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyAnTW9udGgnXSh2YWx1ZSwgZGF5T2ZNb250aCk7XG4gICAgcmV0dXJuIG1vbTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V0TW9udGggKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgc2V0TW9udGgodGhpcywgdmFsdWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXQodGhpcywgJ01vbnRoJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXlzSW5Nb250aCAoKSB7XG4gICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xufVxuXG52YXIgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQ7XG5mdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgIH1cbn1cblxudmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbmZ1bmN0aW9uIG1vbnRoc1JlZ2V4IChpc1N0cmljdCkge1xuICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4IDogdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlTW9udGhzUGFyc2UgKCkge1xuICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgIGksIG1vbTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgIHNob3J0UGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgIGxvbmdQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgIH1cbiAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignWScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgeSA9IHRoaXMueWVhcigpO1xuICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKDAsIFsnWVknLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVknLCAgIDRdLCAgICAgICAwLCAneWVhcicpO1xuYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbmFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuLy8gUFJJT1JJVElFU1xuXG5hZGRVbml0UHJpb3JpdHkoJ3llYXInLCAxKTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdZJywgICAgICBtYXRjaFNpZ25lZCk7XG5hZGRSZWdleFRva2VuKCdZWScsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG5hZGRSZWdleFRva2VuKCdZWVlZWScsICBtYXRjaDF0bzYsIG1hdGNoNik7XG5hZGRSZWdleFRva2VuKCdZWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbmFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG5hZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgIGFycmF5W1lFQVJdID0gaW5wdXQubGVuZ3RoID09PSAyID8gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xufSk7XG5hZGRQYXJzZVRva2VuKCdZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICBhcnJheVtZRUFSXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbn0pO1xuYWRkUGFyc2VUb2tlbignWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG59KTtcblxuLy8gSEVMUEVSU1xuXG5mdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cblxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xufVxuXG4vLyBIT09LU1xuXG5ob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG59O1xuXG4vLyBNT01FTlRTXG5cbnZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuZnVuY3Rpb24gZ2V0SXNMZWFwWWVhciAoKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgIC8vY2FuJ3QganVzdCBhcHBseSgpIHRvIGNyZWF0ZSBhIGRhdGU6XG4gICAgLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MTM0OC9pbnN0YW50aWF0aW5nLWEtamF2YXNjcmlwdC1vYmplY3QtYnktY2FsbGluZy1wcm90b3R5cGUtY29uc3RydWN0b3ItYXBwbHlcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcblxuICAgIC8vdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih5KTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVUQ0RhdGUgKHkpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuXG4gICAgLy90aGUgRGF0ZS5VVEMgZnVuY3Rpb24gcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSkpIHtcbiAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG59XG5cbi8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG5mdW5jdGlvbiBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpIHtcbiAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgIC8vIGZpcnN0LXdlZWsgZGF5IGxvY2FsIHdlZWtkYXkgLS0gd2hpY2ggbG9jYWwgd2Vla2RheSBpcyBmd2RcbiAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG59XG5cbi8vaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxuZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgdmFyIGxvY2FsV2Vla2RheSA9ICg3ICsgd2Vla2RheSAtIGRvdykgJSA3LFxuICAgICAgICB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgcmVzWWVhciwgcmVzRGF5T2ZZZWFyO1xuXG4gICAgaWYgKGRheU9mWWVhciA8PSAwKSB7XG4gICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5c0luWWVhcihyZXNZZWFyKSArIGRheU9mWWVhcjtcbiAgICB9IGVsc2UgaWYgKGRheU9mWWVhciA+IGRheXNJblllYXIoeWVhcikpIHtcbiAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXIgLSBkYXlzSW5ZZWFyKHllYXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcjogcmVzWWVhcixcbiAgICAgICAgZGF5T2ZZZWFyOiByZXNEYXlPZlllYXJcbiAgICB9O1xufVxuXG5mdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgIHdlZWsgPSBNYXRoLmZsb29yKChtb20uZGF5T2ZZZWFyKCkgLSB3ZWVrT2Zmc2V0IC0gMSkgLyA3KSArIDEsXG4gICAgICAgIHJlc1dlZWssIHJlc1llYXI7XG5cbiAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgLSAxO1xuICAgICAgICByZXNXZWVrID0gd2VlayArIHdlZWtzSW5ZZWFyKHJlc1llYXIsIGRvdywgZG95KTtcbiAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgcmVzV2VlayA9IHdlZWsgLSB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSk7XG4gICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKTtcbiAgICAgICAgcmVzV2VlayA9IHdlZWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2VlazogcmVzV2VlayxcbiAgICAgICAgeWVhcjogcmVzWWVhclxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICB3ZWVrT2Zmc2V0TmV4dCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyICsgMSwgZG93LCBkb3kpO1xuICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xufVxuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuYWRkRm9ybWF0VG9rZW4oJ1cnLCBbJ1dXJywgMl0sICdXbycsICdpc29XZWVrJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbmFkZFVuaXRBbGlhcygnaXNvV2VlaycsICdXJyk7XG5cbi8vIFBSSU9SSVRJRVNcblxuYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG5hZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWsnLCA1KTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCd3JywgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCd3dycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbmFkZFJlZ2V4VG9rZW4oJ1cnLCAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ1dXJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG5hZGRXZWVrUGFyc2VUb2tlbihbJ3cnLCAnd3cnLCAnVycsICdXVyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAxKV0gPSB0b0ludChpbnB1dCk7XG59KTtcblxuLy8gSEVMUEVSU1xuXG4vLyBMT0NBTEVTXG5cbmZ1bmN0aW9uIGxvY2FsZVdlZWsgKG1vbSkge1xuICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1vbSwgdGhpcy5fd2Vlay5kb3csIHRoaXMuX3dlZWsuZG95KS53ZWVrO1xufVxuXG52YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxufTtcblxuZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsgKCkge1xuICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbn1cblxuZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZlllYXIgKCkge1xuICAgIHJldHVybiB0aGlzLl93ZWVrLmRveTtcbn1cblxuLy8gTU9NRU5UU1xuXG5mdW5jdGlvbiBnZXRTZXRXZWVrIChpbnB1dCkge1xuICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG59XG5cbmZ1bmN0aW9uIGdldFNldElTT1dlZWsgKGlucHV0KSB7XG4gICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XG4gICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xufVxuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG5hZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsIGZvcm1hdCk7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNTaG9ydCh0aGlzLCBmb3JtYXQpO1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5cyh0aGlzLCBmb3JtYXQpO1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbmFkZEZvcm1hdFRva2VuKCdFJywgMCwgMCwgJ2lzb1dlZWtkYXknKTtcblxuLy8gQUxJQVNFU1xuXG5hZGRVbml0QWxpYXMoJ2RheScsICdkJyk7XG5hZGRVbml0QWxpYXMoJ3dlZWtkYXknLCAnZScpO1xuYWRkVW5pdEFsaWFzKCdpc29XZWVrZGF5JywgJ0UnKTtcblxuLy8gUFJJT1JJVFlcbmFkZFVuaXRQcmlvcml0eSgnZGF5JywgMTEpO1xuYWRkVW5pdFByaW9yaXR5KCd3ZWVrZGF5JywgMTEpO1xuYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrZGF5JywgMTEpO1xuXG4vLyBQQVJTSU5HXG5cbmFkZFJlZ2V4VG9rZW4oJ2QnLCAgICBtYXRjaDF0bzIpO1xuYWRkUmVnZXhUb2tlbignZScsICAgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdFJywgICAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ2RkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG59KTtcbmFkZFJlZ2V4VG9rZW4oJ2RkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG59KTtcbmFkZFJlZ2V4VG9rZW4oJ2RkZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbn0pO1xuXG5hZGRXZWVrUGFyc2VUb2tlbihbJ2RkJywgJ2RkZCcsICdkZGRkJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgd2Vla2RheSBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWRcbiAgICBpZiAod2Vla2RheSAhPSBudWxsKSB7XG4gICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICB9XG59KTtcblxuYWRkV2Vla1BhcnNlVG9rZW4oWydkJywgJ2UnLCAnRSddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbn0pO1xuXG4vLyBIRUxQRVJTXG5cbmZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmICghaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dCwgMTApO1xuICAgIH1cblxuICAgIGlucHV0ID0gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGFyc2VJc29XZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW5wdXQpID8gbnVsbCA6IGlucHV0O1xufVxuXG4vLyBMT0NBTEVTXG5cbnZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG5mdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyAobSwgZm9ybWF0KSB7XG4gICAgaWYgKCFtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5cztcbiAgICB9XG4gICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fd2Vla2RheXMpID8gdGhpcy5fd2Vla2RheXNbbS5kYXkoKV0gOlxuICAgICAgICB0aGlzLl93ZWVrZGF5c1t0aGlzLl93ZWVrZGF5cy5pc0Zvcm1hdC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5kYXkoKV07XG59XG5cbnZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyk7XG5mdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1Nob3J0IChtKSB7XG4gICAgcmV0dXJuIChtKSA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV0gOiB0aGlzLl93ZWVrZGF5c1Nob3J0O1xufVxuXG52YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluID0gJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpO1xuZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4gKG0pIHtcbiAgICByZXR1cm4gKG0pID8gdGhpcy5fd2Vla2RheXNNaW5bbS5kYXkoKV0gOiB0aGlzLl93ZWVrZGF5c01pbjtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICB2YXIgaSwgaWksIG1vbSwgbGxjID0gd2Vla2RheU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1BhcnNlICh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZGRkJyAmJiB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZCcgJiYgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGQnICYmIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIE1PTUVOVFNcblxuZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrIChpbnB1dCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgIH1cbiAgICB2YXIgZGF5ID0gdGhpcy5faXNVVEMgPyB0aGlzLl9kLmdldFVUQ0RheSgpIDogdGhpcy5fZC5nZXREYXkoKTtcbiAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICBpbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGQoaW5wdXQgLSBkYXksICdkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRheTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFNldExvY2FsZURheU9mV2VlayAoaW5wdXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICB9XG4gICAgdmFyIHdlZWtkYXkgPSAodGhpcy5kYXkoKSArIDcgLSB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpICUgNztcbiAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG59XG5cbmZ1bmN0aW9uIGdldFNldElTT0RheU9mV2VlayAoaW5wdXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICB9XG5cbiAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgLy8gYXMgYSBnZXR0ZXIsIHJldHVybnMgNyBpbnN0ZWFkIG9mIDAgKDEtNyByYW5nZSBpbnN0ZWFkIG9mIDAtNilcbiAgICAvLyBhcyBhIHNldHRlciwgc3VuZGF5IHNob3VsZCBiZWxvbmcgdG8gdGhlIHByZXZpb3VzIHdlZWsuXG5cbiAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgd2Vla2RheSA9IHBhcnNlSXNvV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSAlIDcgPyB3ZWVrZGF5IDogd2Vla2RheSAtIDcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRheSgpIHx8IDc7XG4gICAgfVxufVxuXG52YXIgZGVmYXVsdFdlZWtkYXlzUmVnZXggPSBtYXRjaFdvcmQ7XG5mdW5jdGlvbiB3ZWVrZGF5c1JlZ2V4IChpc1N0cmljdCkge1xuICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1JlZ2V4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgIH1cbn1cblxudmFyIGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXggPSBtYXRjaFdvcmQ7XG5mdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIH1cbn1cblxudmFyIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuZnVuY3Rpb24gd2Vla2RheXNNaW5SZWdleCAoaXNTdHJpY3QpIHtcbiAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSBkZWZhdWx0V2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gY29tcHV0ZVdlZWtkYXlzUGFyc2UgKCkge1xuICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBtaW5QaWVjZXMgPSBbXSwgc2hvcnRQaWVjZXMgPSBbXSwgbG9uZ1BpZWNlcyA9IFtdLCBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICBpLCBtb20sIG1pbnAsIHNob3J0cCwgbG9uZ3A7XG4gICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICBtaW5wID0gdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgc2hvcnRwID0gdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpO1xuICAgICAgICBsb25ncCA9IHRoaXMud2Vla2RheXMobW9tLCAnJyk7XG4gICAgICAgIG1pblBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIG1peGVkUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgIG1peGVkUGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgfVxuICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgd2Vla2RheSAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICBtaW5QaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgbG9uZ1BpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKGxvbmdQaWVjZXNbaV0pO1xuICAgICAgICBtaXhlZFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKG1peGVkUGllY2VzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xufVxuXG4vLyBGT1JNQVRUSU5HXG5cbmZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaG91cnMoKSAlIDEyIHx8IDEyO1xufVxuXG5mdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLmhvdXJzKCkgfHwgMjQ7XG59XG5cbmFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuYWRkRm9ybWF0VG9rZW4oJ2gnLCBbJ2hoJywgMl0sIDAsIGhGb3JtYXQpO1xuYWRkRm9ybWF0VG9rZW4oJ2snLCBbJ2trJywgMl0sIDAsIGtGb3JtYXQpO1xuXG5hZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMik7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oJ0htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJycgKyB0aGlzLmhvdXJzKCkgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oJ0htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbn0pO1xuXG5mdW5jdGlvbiBtZXJpZGllbSAodG9rZW4sIGxvd2VyY2FzZSkge1xuICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbSh0aGlzLmhvdXJzKCksIHRoaXMubWludXRlcygpLCBsb3dlcmNhc2UpO1xuICAgIH0pO1xufVxuXG5tZXJpZGllbSgnYScsIHRydWUpO1xubWVyaWRpZW0oJ0EnLCBmYWxzZSk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCdob3VyJywgJ2gnKTtcblxuLy8gUFJJT1JJVFlcbmFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuLy8gUEFSU0lOR1xuXG5mdW5jdGlvbiBtYXRjaE1lcmlkaWVtIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbn1cblxuYWRkUmVnZXhUb2tlbignYScsICBtYXRjaE1lcmlkaWVtKTtcbmFkZFJlZ2V4VG9rZW4oJ0EnLCAgbWF0Y2hNZXJpZGllbSk7XG5hZGRSZWdleFRva2VuKCdIJywgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdoJywgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdISCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbmFkZFJlZ2V4VG9rZW4oJ2hoJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG5hZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuYWRkUmVnZXhUb2tlbignaG1tc3MnLCBtYXRjaDV0bzYpO1xuYWRkUmVnZXhUb2tlbignSG1tJywgbWF0Y2gzdG80KTtcbmFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuYWRkUGFyc2VUb2tlbihbJ0gnLCAnSEgnXSwgSE9VUik7XG5hZGRQYXJzZVRva2VuKFsnYScsICdBJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgIGNvbmZpZy5fbWVyaWRpZW0gPSBpbnB1dDtcbn0pO1xuYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ2htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ2htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ0htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG59KTtcblxuLy8gTE9DQUxFU1xuXG5mdW5jdGlvbiBsb2NhbGVJc1BNIChpbnB1dCkge1xuICAgIC8vIElFOCBRdWlya3MgTW9kZSAmIElFNyBTdGFuZGFyZHMgTW9kZSBkbyBub3QgYWxsb3cgYWNjZXNzaW5nIHN0cmluZ3MgbGlrZSBhcnJheXNcbiAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICByZXR1cm4gKChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnKTtcbn1cblxudmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG5mdW5jdGlvbiBsb2NhbGVNZXJpZGllbSAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2FtJyA6ICdBTSc7XG4gICAgfVxufVxuXG5cbi8vIE1PTUVOVFNcblxuLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4vLyBzcGVjaWZpZWQgd2hpY2ggaG91ciBoZSB3YW50cy4gU28gdHJ5aW5nIHRvIG1haW50YWluIHRoZSBzYW1lIGhvdXIgKGluXG4vLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbi8vIHRoaXMgcnVsZS5cbnZhciBnZXRTZXRIb3VyID0gbWFrZUdldFNldCgnSG91cnMnLCB0cnVlKTtcblxuLy8gbW9udGhzXG4vLyB3ZWVrXG4vLyB3ZWVrZGF5c1xuLy8gbWVyaWRpZW1cbnZhciBiYXNlQ29uZmlnID0ge1xuICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgbG9uZ0RhdGVGb3JtYXQ6IGRlZmF1bHRMb25nRGF0ZUZvcm1hdCxcbiAgICBpbnZhbGlkRGF0ZTogZGVmYXVsdEludmFsaWREYXRlLFxuICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgIG9yZGluYWxQYXJzZTogZGVmYXVsdE9yZGluYWxQYXJzZSxcbiAgICByZWxhdGl2ZVRpbWU6IGRlZmF1bHRSZWxhdGl2ZVRpbWUsXG5cbiAgICBtb250aHM6IGRlZmF1bHRMb2NhbGVNb250aHMsXG4gICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgIHdlZWs6IGRlZmF1bHRMb2NhbGVXZWVrLFxuXG4gICAgd2Vla2RheXM6IGRlZmF1bHRMb2NhbGVXZWVrZGF5cyxcbiAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgIHdlZWtkYXlzU2hvcnQ6IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LFxuXG4gICAgbWVyaWRpZW1QYXJzZTogZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2Vcbn07XG5cbi8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxvY2FsZSBjb25maWcgZmlsZXNcbnZhciBsb2NhbGVzID0ge307XG52YXIgbG9jYWxlRmFtaWxpZXMgPSB7fTtcbnZhciBnbG9iYWxMb2NhbGU7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShrZXkpIHtcbiAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG59XG5cbi8vIHBpY2sgdGhlIGxvY2FsZSBmcm9tIHRoZSBhcnJheVxuLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbi8vIHN1YnN0cmluZyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3QsIGJ1dCBtb3ZlIHRvIHRoZSBuZXh0IGFycmF5IGl0ZW0gaWYgaXQncyBhIG1vcmUgc3BlY2lmaWMgdmFyaWFudCB0aGFuIHRoZSBjdXJyZW50IHJvb3RcbmZ1bmN0aW9uIGNob29zZUxvY2FsZShuYW1lcykge1xuICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgIHdoaWxlIChpIDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIHNwbGl0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2ldKS5zcGxpdCgnLScpO1xuICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICBuZXh0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2kgKyAxXSk7XG4gICAgICAgIG5leHQgPSBuZXh0ID8gbmV4dC5zcGxpdCgnLScpIDogbnVsbDtcbiAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKHNwbGl0LnNsaWNlKDAsIGopLmpvaW4oJy0nKSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQubGVuZ3RoID49IGogJiYgY29tcGFyZUFycmF5cyhzcGxpdCwgbmV4dCwgdHJ1ZSkgPj0gaiAtIDEpIHtcbiAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqLS07XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbG9hZExvY2FsZShuYW1lKSB7XG4gICAgdmFyIG9sZExvY2FsZSA9IG51bGw7XG4gICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gcmVnaXN0ZXIgYW5kIGxvYWQgYWxsIHRoZSBsb2NhbGVzIGluIE5vZGVcbiAgICBpZiAoIWxvY2FsZXNbbmFtZV0gJiYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICByZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAvLyBiZWNhdXNlIGRlZmluZUxvY2FsZSBjdXJyZW50bHkgYWxzbyBzZXRzIHRoZSBnbG9iYWwgbG9jYWxlLCB3ZVxuICAgICAgICAgICAgLy8gd2FudCB0byB1bmRvIHRoYXQgZm9yIGxhenkgbG9hZGVkIGxvY2FsZXNcbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShvbGRMb2NhbGUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuLy8gbm8gYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4sIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCBnbG9iYWxcbi8vIGxvY2FsZSBrZXkuXG5mdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUgKGtleSwgdmFsdWVzKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgaWYgKGtleSkge1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGRlZmluZUxvY2FsZShrZXksIHZhbHVlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgLy8gbW9tZW50LmR1cmF0aW9uLl9sb2NhbGUgPSBtb21lbnQuX2xvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICBnbG9iYWxMb2NhbGUgPSBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbn1cblxuZnVuY3Rpb24gZGVmaW5lTG9jYWxlIChuYW1lLCBjb25maWcpIHtcbiAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICBjb25maWcuYWJiciA9IG5hbWU7XG4gICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZSgnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAndXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgJyArXG4gICAgICAgICAgICAgICAgICAgICdhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uJyk7XG4gICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW25hbWVdLl9jb25maWc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXS5fY29uZmlnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgIGlmIChsb2NhbGVGYW1pbGllc1tuYW1lXSkge1xuICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGxvY2FsZSBBRlRFUiBhbGwgY2hpbGQgbG9jYWxlcyBoYXZlIGJlZW5cbiAgICAgICAgLy8gY3JlYXRlZCwgc28gd2Ugd29uJ3QgZW5kIHVwIHdpdGggdGhlIGNoaWxkIGxvY2FsZSBzZXQuXG4gICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuXG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMb2NhbGUobmFtZSwgY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIHZhciBsb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgIC8vIE1FUkdFXG4gICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpO1xuICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG4gICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlO1xuXG4gICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcGFzcyBudWxsIGZvciBjb25maWcgdG8gdW51cGRhdGUsIHVzZWZ1bCBmb3IgdGVzdHNcbiAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xufVxuXG4vLyByZXR1cm5zIGxvY2FsZSBkYXRhXG5mdW5jdGlvbiBnZXRMb2NhbGUgKGtleSkge1xuICAgIHZhciBsb2NhbGU7XG5cbiAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgIGtleSA9IGtleS5fbG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGlmICgha2V5KSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgLy9zaG9ydC1jaXJjdWl0IGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xufVxuXG5mdW5jdGlvbiBsaXN0TG9jYWxlcygpIHtcbiAgICByZXR1cm4ga2V5cyQxKGxvY2FsZXMpO1xufVxuXG5mdW5jdGlvbiBjaGVja092ZXJmbG93IChtKSB7XG4gICAgdmFyIG92ZXJmbG93O1xuICAgIHZhciBhID0gbS5fYTtcblxuICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgb3ZlcmZsb3cgPVxuICAgICAgICAgICAgYVtNT05USF0gICAgICAgPCAwIHx8IGFbTU9OVEhdICAgICAgID4gMTEgID8gTU9OVEggOlxuICAgICAgICAgICAgYVtEQVRFXSAgICAgICAgPCAxIHx8IGFbREFURV0gICAgICAgID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICBhW0hPVVJdICAgICAgICA8IDAgfHwgYVtIT1VSXSAgICAgICAgPiAyNCB8fCAoYVtIT1VSXSA9PT0gMjQgJiYgKGFbTUlOVVRFXSAhPT0gMCB8fCBhW1NFQ09ORF0gIT09IDAgfHwgYVtNSUxMSVNFQ09ORF0gIT09IDApKSA/IEhPVVIgOlxuICAgICAgICAgICAgYVtNSU5VVEVdICAgICAgPCAwIHx8IGFbTUlOVVRFXSAgICAgID4gNTkgID8gTUlOVVRFIDpcbiAgICAgICAgICAgIGFbU0VDT05EXSAgICAgIDwgMCB8fCBhW1NFQ09ORF0gICAgICA+IDU5ICA/IFNFQ09ORCA6XG4gICAgICAgICAgICBhW01JTExJU0VDT05EXSA8IDAgfHwgYVtNSUxMSVNFQ09ORF0gPiA5OTkgPyBNSUxMSVNFQ09ORCA6XG4gICAgICAgICAgICAtMTtcblxuICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFS0RBWTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG4vLyBpc28gODYwMSByZWdleFxuLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG52YXIgZXh0ZW5kZWRJc29SZWdleCA9IC9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSktKD86XFxkXFxkLVxcZFxcZHxXXFxkXFxkLVxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGQpKSg/OihUfCApKFxcZFxcZCg/OjpcXGRcXGQoPzo6XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFtcXCtcXC1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLztcbnZhciBiYXNpY0lzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFtcXCtcXC1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLztcblxudmFyIHR6UmVnZXggPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy87XG5cbnZhciBpc29EYXRlcyA9IFtcbiAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICBbJ1lZWVktTU0tREQnLCAvXFxkezR9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxcbiAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L10sXG4gICAgWydZWVlZLU1NJywgL1xcZHs0fS1cXGRcXGQvLCBmYWxzZV0sXG4gICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgWydZWVlZTU1ERCcsIC9cXGR7OH0vXSxcbiAgICAvLyBZWVlZTU0gaXMgTk9UIGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkXG4gICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICBbJ0dHR0dbV11XVycsIC9cXGR7NH1XXFxkezJ9LywgZmFsc2VdLFxuICAgIFsnWVlZWURERCcsIC9cXGR7N30vXVxuXTtcblxuLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xudmFyIGlzb1RpbWVzID0gW1xuICAgIFsnSEg6bW06c3MuU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZFxcLlxcZCsvXSxcbiAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgIFsnSEg6bW06c3MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICBbJ0hIOm1tJywgL1xcZFxcZDpcXGRcXGQvXSxcbiAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICBbJ0hIbW1zcyxTU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sXG4gICAgWydISG1tc3MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkL10sXG4gICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgIFsnSEgnLCAvXFxkXFxkL11cbl07XG5cbnZhciBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pO1xuXG4vLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuZnVuY3Rpb24gY29uZmlnRnJvbUlTTyhjb25maWcpIHtcbiAgICB2YXIgaSwgbCxcbiAgICAgICAgc3RyaW5nID0gY29uZmlnLl9pLFxuICAgICAgICBtYXRjaCA9IGV4dGVuZGVkSXNvUmVnZXguZXhlYyhzdHJpbmcpIHx8IGJhc2ljSXNvUmVnZXguZXhlYyhzdHJpbmcpLFxuICAgICAgICBhbGxvd1RpbWUsIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQsIHR6Rm9ybWF0O1xuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmlzbyA9IHRydWU7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9IGlzb0RhdGVzW2ldWzBdO1xuICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvVGltZXNbaV1bMV0uZXhlYyhtYXRjaFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlICdUJyBvciBzcGFjZVxuICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRpbWVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgaWYgKHR6UmVnZXguZXhlYyhtYXRjaFs0XSkpIHtcbiAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBkYXRlIGZyb20gaXNvIGZvcm1hdCBvciBmYWxsYmFja1xuZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG5cbiAgICBpZiAobWF0Y2hlZCAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICB9XG59XG5cbmhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrID0gZGVwcmVjYXRlKFxuICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIElTTyBmb3JtYXQuIG1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlKCksICcgK1xuICAgICd3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBJU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAnZGlzY291cmFnZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyBtYWpvciByZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gJyArXG4gICAgJ2h0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoY29uZmlnLl9pICsgKGNvbmZpZy5fdXNlVVRDID8gJyBVVEMnIDogJycpKTtcbiAgICB9XG4pO1xuXG4vLyBQaWNrIHRoZSBmaXJzdCBkZWZpbmVkIG9mIHR3byBvciB0aHJlZSBhcmd1bWVudHMuXG5mdW5jdGlvbiBkZWZhdWx0cyhhLCBiLCBjKSB7XG4gICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYjtcbiAgICB9XG4gICAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICB2YXIgbm93VmFsdWUgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgaWYgKGNvbmZpZy5fdXNlVVRDKSB7XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSwgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpXTtcbiAgICB9XG4gICAgcmV0dXJuIFtub3dWYWx1ZS5nZXRGdWxsWWVhcigpLCBub3dWYWx1ZS5nZXRNb250aCgpLCBub3dWYWx1ZS5nZXREYXRlKCldO1xufVxuXG4vLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbi8vIHRoZSBhcnJheSBzaG91bGQgbWlycm9yIHRoZSBwYXJhbWV0ZXJzIGJlbG93XG4vLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbi8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuZnVuY3Rpb24gY29uZmlnRnJvbUFycmF5IChjb25maWcpIHtcbiAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIHllYXJUb1VzZTtcblxuICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgLy9jb21wdXRlIGRheSBvZiB0aGUgeWVhciBmcm9tIHdlZWtzIGFuZCB3ZWVrZGF5c1xuICAgIGlmIChjb25maWcuX3cgJiYgY29uZmlnLl9hW0RBVEVdID09IG51bGwgJiYgY29uZmlnLl9hW01PTlRIXSA9PSBudWxsKSB7XG4gICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgIH1cblxuICAgIC8vaWYgdGhlIGRheSBvZiB0aGUgeWVhciBpcyBzZXQsIGZpZ3VyZSBvdXQgd2hhdCBpdCBpc1xuICAgIGlmIChjb25maWcuX2RheU9mWWVhcikge1xuICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXJUb1VzZSkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgfVxuXG4gICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgY29uZmlnLl9uZXh0RGF5ID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICB9XG5cbiAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBjcmVhdGVVVENEYXRlIDogY3JlYXRlRGF0ZSkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICB3ID0gY29uZmlnLl93O1xuICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcbiAgICAgICAgZG93ID0gMTtcbiAgICAgICAgZG95ID0gNDtcblxuICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIHRvIHRha2UgdGhlIGN1cnJlbnQgaXNvV2Vla1llYXIsIGJ1dCB0aGF0IGRlcGVuZHMgb25cbiAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAvLyBhIG5vdyB2ZXJzaW9uIG9mIGN1cnJlbnQgY29uZmlnICh0YWtlIGxvY2FsL3V0Yy9vZmZzZXQgZmxhZ3MsIGFuZFxuICAgICAgICAvLyBjcmVhdGUgbm93KS5cbiAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LlcsIDEpO1xuICAgICAgICB3ZWVrZGF5ID0gZGVmYXVsdHMody5FLCAxKTtcbiAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICBkb3kgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3k7XG5cbiAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgd2Vlay5cbiAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIHdlZWtkYXkgLS0gbG93IGRheSBudW1iZXJzIGFyZSBjb25zaWRlcmVkIG5leHQgd2Vla1xuICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGxvY2FsIHdlZWtkYXkgLS0gY291bnRpbmcgc3RhcnRzIGZyb20gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgIGlmICh3LmUgPCAwIHx8IHcuZSA+IDYpIHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbmluZyBvZiB3ZWVrXG4gICAgICAgICAgICB3ZWVrZGF5ID0gZG93O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh3ZWVrIDwgMSB8fCB3ZWVrID4gd2Vla3NJblllYXIod2Vla1llYXIsIGRvdywgZG95KSkge1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrZGF5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICB9XG59XG5cbi8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbmhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbi8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcbmZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5JU09fODYwMSkge1xuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25maWcuX2EgPSBbXTtcbiAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IHRydWU7XG5cbiAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgaSwgcGFyc2VkSW5wdXQsIHRva2VucywgdG9rZW4sIHNraXBwZWQsXG4gICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggPSAwO1xuXG4gICAgdG9rZW5zID0gZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgY29uZmlnLl9sb2NhbGUpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpIHx8IFtdO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHwgW10pWzBdO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygndG9rZW4nLCB0b2tlbiwgJ3BhcnNlZElucHV0JywgcGFyc2VkSW5wdXQsXG4gICAgICAgIC8vICAgICAgICAgJ3JlZ2V4JywgZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKTtcbiAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc2tpcHBlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2Uoc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoKTtcbiAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5jaGFyc0xlZnRPdmVyID0gc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgIH1cblxuICAgIC8vIGNsZWFyIF8xMmggZmxhZyBpZiBob3VyIGlzIDw9IDEyXG4gICAgaWYgKGNvbmZpZy5fYVtIT1VSXSA8PSAxMiAmJlxuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID09PSB0cnVlICYmXG4gICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDApIHtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5wYXJzZWREYXRlUGFydHMgPSBjb25maWcuX2Euc2xpY2UoMCk7XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykubWVyaWRpZW0gPSBjb25maWcuX21lcmlkaWVtO1xuICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgIGNvbmZpZy5fYVtIT1VSXSA9IG1lcmlkaWVtRml4V3JhcChjb25maWcuX2xvY2FsZSwgY29uZmlnLl9hW0hPVVJdLCBjb25maWcuX21lcmlkaWVtKTtcblxuICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbn1cblxuXG5mdW5jdGlvbiBtZXJpZGllbUZpeFdyYXAgKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICB2YXIgaXNQbTtcblxuICAgIGlmIChtZXJpZGllbSA9PSBudWxsKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgfVxuICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tZXJpZGllbUhvdXIoaG91ciwgbWVyaWRpZW0pO1xuICAgIH0gZWxzZSBpZiAobG9jYWxlLmlzUE0gIT0gbnVsbCkge1xuICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICBpc1BtID0gbG9jYWxlLmlzUE0obWVyaWRpZW0pO1xuICAgICAgICBpZiAoaXNQbSAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1BtICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaG91cjtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW5cbiAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgfVxufVxuXG4vLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgIHZhciB0ZW1wQ29uZmlnLFxuICAgICAgICBiZXN0TW9tZW50LFxuXG4gICAgICAgIHNjb3JlVG9CZWF0LFxuICAgICAgICBpLFxuICAgICAgICBjdXJyZW50U2NvcmU7XG5cbiAgICBpZiAoY29uZmlnLl9mLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWcuX2YubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY3VycmVudFNjb3JlID0gMDtcbiAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl91c2VVVEMgPSBjb25maWcuX3VzZVVUQztcbiAgICAgICAgfVxuICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KHRlbXBDb25maWcpO1xuXG4gICAgICAgIGlmICghaXNWYWxpZCh0ZW1wQ29uZmlnKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgdGhhdCB3YXMgbm90IHBhcnNlZCBhZGQgYSBwZW5hbHR5IGZvciB0aGF0IGZvcm1hdFxuICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLmNoYXJzTGVmdE92ZXI7XG5cbiAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgIGlmIChzY29yZVRvQmVhdCA9PSBudWxsIHx8IGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0KSB7XG4gICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gY29uZmlnRnJvbU9iamVjdChjb25maWcpIHtcbiAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSk7XG4gICAgY29uZmlnLl9hID0gbWFwKFtpLnllYXIsIGkubW9udGgsIGkuZGF5IHx8IGkuZGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgfSk7XG5cbiAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyAoY29uZmlnKSB7XG4gICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICBpZiAocmVzLl9uZXh0RGF5KSB7XG4gICAgICAgIC8vIEFkZGluZyBpcyBzbWFydCBlbm91Z2ggYXJvdW5kIERTVFxuICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgIHJlcy5fbmV4dERheSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlQ29uZmlnIChjb25maWcpIHtcbiAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgIGNvbmZpZy5fbG9jYWxlID0gY29uZmlnLl9sb2NhbGUgfHwgZ2V0TG9jYWxlKGNvbmZpZy5fbCk7XG5cbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgKGZvcm1hdCA9PT0gdW5kZWZpbmVkICYmIGlucHV0ID09PSAnJykpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoe251bGxJbnB1dDogdHJ1ZX0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgIH1cblxuICAgIGlmIChpc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICBjb25maWcuX2QgPSBpbnB1dDtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCkge1xuICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgfSAgZWxzZSB7XG4gICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgIH1cblxuICAgIGlmICghaXNWYWxpZChjb25maWcpKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcbn1cblxuZnVuY3Rpb24gY29uZmlnRnJvbUlucHV0KGNvbmZpZykge1xuICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faTtcbiAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YoaW5wdXQpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2NhbE9yVVRDIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgaXNVVEMpIHtcbiAgICB2YXIgYyA9IHt9O1xuXG4gICAgaWYgKGxvY2FsZSA9PT0gdHJ1ZSB8fCBsb2NhbGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgbG9jYWxlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICgoaXNPYmplY3QoaW5wdXQpICYmIGlzT2JqZWN0RW1wdHkoaW5wdXQpKSB8fFxuICAgICAgICAgICAgKGlzQXJyYXkoaW5wdXQpICYmIGlucHV0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgYy5faSA9IGlucHV0O1xuICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuXG4gICAgcmV0dXJuIGNyZWF0ZUZyb21Db25maWcoYyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2FsIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBmYWxzZSk7XG59XG5cbnZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlciA8IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICB9XG4gICAgfVxuKTtcblxudmFyIHByb3RvdHlwZU1heCA9IGRlcHJlY2F0ZShcbiAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyID4gdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgIH1cbiAgICB9XG4pO1xuXG4vLyBQaWNrIGEgbW9tZW50IG0gZnJvbSBtb21lbnRzIHNvIHRoYXQgbVtmbl0ob3RoZXIpIGlzIHRydWUgZm9yIGFsbFxuLy8gb3RoZXIuIFRoaXMgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbiBmbiB0byBiZSB0cmFuc2l0aXZlLlxuLy9cbi8vIG1vbWVudHMgc2hvdWxkIGVpdGhlciBiZSBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cyBvciBhbiBhcnJheSwgd2hvc2Vcbi8vIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMuXG5mdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICB2YXIgcmVzLCBpO1xuICAgIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG1vbWVudHNbMF0pKSB7XG4gICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgIH1cbiAgICBpZiAoIW1vbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgIH1cbiAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICghbW9tZW50c1tpXS5pc1ZhbGlkKCkgfHwgbW9tZW50c1tpXVtmbl0ocmVzKSkge1xuICAgICAgICAgICAgcmVzID0gbW9tZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBUT0RPOiBVc2UgW10uc29ydCBpbnN0ZWFkP1xuZnVuY3Rpb24gbWluICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG59XG5cbmZ1bmN0aW9uIG1heCAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG59XG5cbnZhciBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICsobmV3IERhdGUoKSk7XG59O1xuXG5mdW5jdGlvbiBEdXJhdGlvbiAoZHVyYXRpb24pIHtcbiAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxuICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgbW9udGhzID0gbm9ybWFsaXplZElucHV0Lm1vbnRoIHx8IDAsXG4gICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgMCxcbiAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgaG91cnMgPSBub3JtYWxpemVkSW5wdXQuaG91ciB8fCAwLFxuICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICBtaWxsaXNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmQgfHwgMDtcblxuICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gK21pbGxpc2Vjb25kcyArXG4gICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgIHRoaXMuX2RheXMgPSArZGF5cyArXG4gICAgICAgIHdlZWtzICogNztcbiAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgIC8vIHdoaWNoIG1vbnRocyB5b3UgYXJlIGFyZSB0YWxraW5nIGFib3V0LCBzbyB3ZSBoYXZlIHRvIHN0b3JlXG4gICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICtcbiAgICAgICAgcXVhcnRlcnMgKiAzICtcbiAgICAgICAgeWVhcnMgKiAxMjtcblxuICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgdGhpcy5fYnViYmxlKCk7XG59XG5cbmZ1bmN0aW9uIGlzRHVyYXRpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbn1cblxuZnVuY3Rpb24gYWJzUm91bmQgKG51bWJlcikge1xuICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlcik7XG4gICAgfVxufVxuXG4vLyBGT1JNQVRUSU5HXG5cbmZ1bmN0aW9uIG9mZnNldCAodG9rZW4sIHNlcGFyYXRvcikge1xuICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB2YXIgc2lnbiA9ICcrJztcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWduICsgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArIHNlcGFyYXRvciArIHplcm9GaWxsKH5+KG9mZnNldCkgJSA2MCwgMik7XG4gICAgfSk7XG59XG5cbm9mZnNldCgnWicsICc6Jyk7XG5vZmZzZXQoJ1paJywgJycpO1xuXG4vLyBQQVJTSU5HXG5cbmFkZFJlZ2V4VG9rZW4oJ1onLCAgbWF0Y2hTaG9ydE9mZnNldCk7XG5hZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuYWRkUGFyc2VUb2tlbihbJ1onLCAnWlonXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG59KTtcblxuLy8gSEVMUEVSU1xuXG4vLyB0aW1lem9uZSBjaHVua2VyXG4vLyAnKzEwOjAwJyA+IFsnMTAnLCAgJzAwJ11cbi8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxudmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG5mdW5jdGlvbiBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoZXIsIHN0cmluZykge1xuICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlcik7XG5cbiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY2h1bmsgICA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICB2YXIgcGFydHMgICA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgdmFyIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgP1xuICAgICAgMCA6XG4gICAgICBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xufVxuXG4vLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxuZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgIHZhciByZXMsIGRpZmY7XG4gICAgaWYgKG1vZGVsLl9pc1VUQykge1xuICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICBkaWZmID0gKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpID8gaW5wdXQudmFsdWVPZigpIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgIHJlcy5fZC5zZXRUaW1lKHJlcy5fZC52YWx1ZU9mKCkgKyBkaWZmKTtcbiAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGVPZmZzZXQgKG0pIHtcbiAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgIHJldHVybiAtTWF0aC5yb3VuZChtLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTtcbn1cblxuLy8gSE9PS1NcblxuLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG5ob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuLy8gTU9NRU5UU1xuXG4vLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbi8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4vLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4vLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4vL1xuLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4vLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbi8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbi8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbmZ1bmN0aW9uIGdldFNldE9mZnNldCAoaW5wdXQsIGtlZXBMb2NhbFRpbWUpIHtcbiAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgIGxvY2FsQWRqdXN0O1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgIH1cbiAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaW5wdXQgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2KSB7XG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICBsb2NhbEFkanVzdCA9IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgaWYgKGxvY2FsQWRqdXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZzZXQgIT09IGlucHV0KSB7XG4gICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGNyZWF0ZUR1cmF0aW9uKGlucHV0IC0gb2Zmc2V0LCAnbScpLCAxLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IG9mZnNldCA6IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZXRab25lIChpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXRjT2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gLXRoaXMudXRjT2Zmc2V0KCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRPZmZzZXRUb1VUQyAoa2VlcExvY2FsVGltZSkge1xuICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbn1cblxuZnVuY3Rpb24gc2V0T2Zmc2V0VG9Mb2NhbCAoa2VlcExvY2FsVGltZSkge1xuICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICBpZiAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCAoKSB7XG4gICAgaWYgKHRoaXMuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0Wm9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQgKGlucHV0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQgKCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5faXNEU1RTaGlmdGVkKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgIH1cblxuICAgIHZhciBjID0ge307XG5cbiAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgaWYgKGMuX2EpIHtcbiAgICAgICAgdmFyIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbn1cblxuZnVuY3Rpb24gaXNMb2NhbCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzVXRjT2Zmc2V0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1V0YyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG59XG5cbi8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxudmFyIGFzcE5ldFJlZ2V4ID0gL14oXFwtKT8oPzooXFxkKilbLiBdKT8oXFxkKylcXDooXFxkKykoPzpcXDooXFxkKykoXFwuXFxkKik/KT8kLztcblxuLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbi8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbi8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbnZhciBpc29SZWdleCA9IC9eKC0pP1AoPzooLT9bMC05LC5dKilZKT8oPzooLT9bMC05LC5dKilNKT8oPzooLT9bMC05LC5dKilXKT8oPzooLT9bMC05LC5dKilEKT8oPzpUKD86KC0/WzAtOSwuXSopSCk/KD86KC0/WzAtOSwuXSopTSk/KD86KC0/WzAtOSwuXSopUyk/KT8kLztcblxuZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24gKGlucHV0LCBrZXkpIHtcbiAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICBzaWduLFxuICAgICAgICByZXQsXG4gICAgICAgIGRpZmZSZXM7XG5cbiAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICBtcyA6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkICA6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgTSAgOiBpbnB1dC5fbW9udGhzXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgZHVyYXRpb25ba2V5XSA9IGlucHV0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHVyYXRpb24ubWlsbGlzZWNvbmRzID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgeSAgOiAwLFxuICAgICAgICAgICAgZCAgOiB0b0ludChtYXRjaFtEQVRFXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgaCAgOiB0b0ludChtYXRjaFtIT1VSXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgbSAgOiB0b0ludChtYXRjaFtNSU5VVEVdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgcyAgOiB0b0ludChtYXRjaFtTRUNPTkRdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgbXMgOiB0b0ludChhYnNSb3VuZChtYXRjaFtNSUxMSVNFQ09ORF0gKiAxMDAwKSkgKiBzaWduIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogMTtcbiAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgTSA6IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgIHcgOiBwYXJzZUlzbyhtYXRjaFs0XSwgc2lnbiksXG4gICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgaCA6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgIG0gOiBwYXJzZUlzbyhtYXRjaFs3XSwgc2lnbiksXG4gICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7Ly8gY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJiAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pKSB7XG4gICAgICAgIGRpZmZSZXMgPSBtb21lbnRzRGlmZmVyZW5jZShjcmVhdGVMb2NhbChkdXJhdGlvbi5mcm9tKSwgY3JlYXRlTG9jYWwoZHVyYXRpb24udG8pKTtcblxuICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5NID0gZGlmZlJlcy5tb250aHM7XG4gICAgfVxuXG4gICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSAmJiBoYXNPd25Qcm9wKGlucHV0LCAnX2xvY2FsZScpKSB7XG4gICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufVxuXG5jcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuZnVuY3Rpb24gcGFyc2VJc28gKGlucCwgc2lnbikge1xuICAgIC8vIFdlJ2Qgbm9ybWFsbHkgdXNlIH5+aW5wIGZvciB0aGlzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBhbHNvXG4gICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgIHZhciByZXMgPSBpbnAgJiYgcGFyc2VGbG9hdChpbnAucmVwbGFjZSgnLCcsICcuJykpO1xuICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG59XG5cbmZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICB2YXIgcmVzID0ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcblxuICAgIHJlcy5tb250aHMgPSBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICtcbiAgICAgICAgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgIGlmIChiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykuaXNBZnRlcihvdGhlcikpIHtcbiAgICAgICAgLS1yZXMubW9udGhzO1xuICAgIH1cblxuICAgIHJlcy5taWxsaXNlY29uZHMgPSArb3RoZXIgLSArKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKSk7XG5cbiAgICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBtb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgIHZhciByZXM7XG4gICAgaWYgKCEoYmFzZS5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSkge1xuICAgICAgICByZXR1cm4ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcbiAgICB9XG5cbiAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gLXJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG5mdW5jdGlvbiBjcmVhdGVBZGRlcihkaXJlY3Rpb24sIG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgLy9pbnZlcnQgdGhlIGFyZ3VtZW50cywgYnV0IGNvbXBsYWluIGFib3V0IGl0XG4gICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUobmFtZSwgJ21vbWVudCgpLicgKyBuYW1lICArICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArIG5hbWUgKyAnKG51bWJlciwgcGVyaW9kKS4gJyArXG4gICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvYWRkLWludmVydGVkLXBhcmFtLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgdG1wID0gdmFsOyB2YWwgPSBwZXJpb2Q7IHBlcmlvZCA9IHRtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbCA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gK3ZhbCA6IHZhbDtcbiAgICAgICAgZHVyID0gY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBkdXIsIGRpcmVjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGFkZFN1YnRyYWN0IChtb20sIGR1cmF0aW9uLCBpc0FkZGluZywgdXBkYXRlT2Zmc2V0KSB7XG4gICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgIGRheXMgPSBhYnNSb3VuZChkdXJhdGlvbi5fZGF5cyksXG4gICAgICAgIG1vbnRocyA9IGFic1JvdW5kKGR1cmF0aW9uLl9tb250aHMpO1xuXG4gICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgIC8vIE5vIG9wXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIG1vbS5fZC5zZXRUaW1lKG1vbS5fZC52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgfVxuICAgIGlmIChkYXlzKSB7XG4gICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICB9XG4gICAgaWYgKG1vbnRocykge1xuICAgICAgICBzZXRNb250aChtb20sIGdldChtb20sICdNb250aCcpICsgbW9udGhzICogaXNBZGRpbmcpO1xuICAgIH1cbiAgICBpZiAodXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICB9XG59XG5cbnZhciBhZGQgICAgICA9IGNyZWF0ZUFkZGVyKDEsICdhZGQnKTtcbnZhciBzdWJ0cmFjdCA9IGNyZWF0ZUFkZGVyKC0xLCAnc3VidHJhY3QnKTtcblxuZnVuY3Rpb24gZ2V0Q2FsZW5kYXJGb3JtYXQobXlNb21lbnQsIG5vdykge1xuICAgIHZhciBkaWZmID0gbXlNb21lbnQuZGlmZihub3csICdkYXlzJywgdHJ1ZSk7XG4gICAgcmV0dXJuIGRpZmYgPCAtNiA/ICdzYW1lRWxzZScgOlxuICAgICAgICAgICAgZGlmZiA8IC0xID8gJ2xhc3RXZWVrJyA6XG4gICAgICAgICAgICBkaWZmIDwgMCA/ICdsYXN0RGF5JyA6XG4gICAgICAgICAgICBkaWZmIDwgMSA/ICdzYW1lRGF5JyA6XG4gICAgICAgICAgICBkaWZmIDwgMiA/ICduZXh0RGF5JyA6XG4gICAgICAgICAgICBkaWZmIDwgNyA/ICduZXh0V2VlaycgOiAnc2FtZUVsc2UnO1xufVxuXG5mdW5jdGlvbiBjYWxlbmRhciQxICh0aW1lLCBmb3JtYXRzKSB7XG4gICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cbiAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICB2YXIgbm93ID0gdGltZSB8fCBjcmVhdGVMb2NhbCgpLFxuICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnO1xuXG4gICAgdmFyIG91dHB1dCA9IGZvcm1hdHMgJiYgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKSA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdykgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0KG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpKTtcbn1cblxuZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xufVxuXG5mdW5jdGlvbiBpc0FmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHMoIWlzVW5kZWZpbmVkKHVuaXRzKSA/IHVuaXRzIDogJ21pbGxpc2Vjb25kJyk7XG4gICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2NhbElucHV0LnZhbHVlT2YoKSA8IHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0JlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQmV0d2VlbiAoZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgIGluY2x1c2l2aXR5ID0gaW5jbHVzaXZpdHkgfHwgJygpJztcbiAgICByZXR1cm4gKGluY2x1c2l2aXR5WzBdID09PSAnKCcgPyB0aGlzLmlzQWZ0ZXIoZnJvbSwgdW5pdHMpIDogIXRoaXMuaXNCZWZvcmUoZnJvbSwgdW5pdHMpKSAmJlxuICAgICAgICAoaW5jbHVzaXZpdHlbMV0gPT09ICcpJyA/IHRoaXMuaXNCZWZvcmUodG8sIHVuaXRzKSA6ICF0aGlzLmlzQWZ0ZXIodG8sIHVuaXRzKSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KSxcbiAgICAgICAgaW5wdXRNcztcbiAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzIHx8ICdtaWxsaXNlY29uZCcpO1xuICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0TXMgPSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCkgPD0gaW5wdXRNcyAmJiBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LHVuaXRzKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsdW5pdHMpO1xufVxuXG5mdW5jdGlvbiBkaWZmIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICB2YXIgdGhhdCxcbiAgICAgICAgem9uZURlbHRhLFxuICAgICAgICBkZWx0YSwgb3V0cHV0O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cblxuICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgaWYgKCF0aGF0LmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cblxuICAgIHpvbmVEZWx0YSA9ICh0aGF0LnV0Y09mZnNldCgpIC0gdGhpcy51dGNPZmZzZXQoKSkgKiA2ZTQ7XG5cbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgIGlmICh1bml0cyA9PT0gJ3llYXInIHx8IHVuaXRzID09PSAnbW9udGgnIHx8IHVuaXRzID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdxdWFydGVyJykge1xuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0IC8gMztcbiAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQgLyAxMjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbHRhID0gdGhpcyAtIHRoYXQ7XG4gICAgICAgIG91dHB1dCA9IHVuaXRzID09PSAnc2Vjb25kJyA/IGRlbHRhIC8gMWUzIDogLy8gMTAwMFxuICAgICAgICAgICAgdW5pdHMgPT09ICdtaW51dGUnID8gZGVsdGEgLyA2ZTQgOiAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIHVuaXRzID09PSAnaG91cicgPyBkZWx0YSAvIDM2ZTUgOiAvLyAxMDAwICogNjAgKiA2MFxuICAgICAgICAgICAgdW5pdHMgPT09ICdkYXknID8gKGRlbHRhIC0gem9uZURlbHRhKSAvIDg2NGU1IDogLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgdW5pdHMgPT09ICd3ZWVrJyA/IChkZWx0YSAtIHpvbmVEZWx0YSkgLyA2MDQ4ZTUgOiAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVsdGE7XG4gICAgfVxuICAgIHJldHVybiBhc0Zsb2F0ID8gb3V0cHV0IDogYWJzRmxvb3Iob3V0cHV0KTtcbn1cblxuZnVuY3Rpb24gbW9udGhEaWZmIChhLCBiKSB7XG4gICAgLy8gZGlmZmVyZW5jZSBpbiBtb250aHNcbiAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIpICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgIGFuY2hvciA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYsICdtb250aHMnKSxcbiAgICAgICAgYW5jaG9yMiwgYWRqdXN0O1xuXG4gICAgaWYgKGIgLSBhbmNob3IgPCAwKSB7XG4gICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmIC0gMSwgJ21vbnRocycpO1xuICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yIC0gYW5jaG9yMik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IyIC0gYW5jaG9yKTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGZvciBuZWdhdGl2ZSB6ZXJvLCByZXR1cm4gemVybyBpZiBuZWdhdGl2ZSB6ZXJvXG4gICAgcmV0dXJuIC0od2hvbGVNb250aERpZmYgKyBhZGp1c3QpIHx8IDA7XG59XG5cbmhvb2tzLmRlZmF1bHRGb3JtYXQgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA9ICdZWVlZLU1NLUREVEhIOm1tOnNzW1pdJztcblxuZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbn1cblxuZnVuY3Rpb24gdG9JU09TdHJpbmcgKCkge1xuICAgIHZhciBtID0gdGhpcy5jbG9uZSgpLnV0YygpO1xuICAgIGlmICgwIDwgbS55ZWFyKCkgJiYgbS55ZWFyKCkgPD0gOTk5OSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgICAgICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB+NTB4IGZhc3RlciwgdXNlIGl0IHdoZW4gd2UgY2FuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gKiBhbHNvIGJlIGV2YWx1YXRlZCB0byBnZXQgYSBuZXcgbW9tZW50IHdoaWNoIGlzIHRoZSBzYW1lXG4gKlxuICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAqL1xuZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgIH1cbiAgICB2YXIgZnVuYyA9ICdtb21lbnQnO1xuICAgIHZhciB6b25lID0gJyc7XG4gICAgaWYgKCF0aGlzLmlzTG9jYWwoKSkge1xuICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgem9uZSA9ICdaJztcbiAgICB9XG4gICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgdmFyIHllYXIgPSAoMCA8IHRoaXMueWVhcigpICYmIHRoaXMueWVhcigpIDw9IDk5OTkpID8gJ1lZWVknIDogJ1lZWVlZWSc7XG4gICAgdmFyIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgdmFyIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0KHByZWZpeCArIHllYXIgKyBkYXRldGltZSArIHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdCAoaW5wdXRTdHJpbmcpIHtcbiAgICBpZiAoIWlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgfVxuICAgIHZhciBvdXRwdXQgPSBmb3JtYXRNb21lbnQodGhpcywgaW5wdXRTdHJpbmcpO1xuICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG59XG5cbmZ1bmN0aW9uIGZyb20gKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe3RvOiB0aGlzLCBmcm9tOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZyb21Ob3cgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xufVxuXG5mdW5jdGlvbiB0byAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHxcbiAgICAgICAgICAgICBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7ZnJvbTogdGhpcywgdG86IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9Ob3cgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbn1cblxuLy8gSWYgcGFzc2VkIGEgbG9jYWxlIGtleSwgaXQgd2lsbCBzZXQgdGhlIGxvY2FsZSBmb3IgdGhpc1xuLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuZnVuY3Rpb24gbG9jYWxlIChrZXkpIHtcbiAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlLl9hYmJyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgaWYgKG5ld0xvY2FsZURhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbnZhciBsYW5nID0gZGVwcmVjYXRlKFxuICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuKTtcblxuZnVuY3Rpb24gbG9jYWxlRGF0YSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbn1cblxuZnVuY3Rpb24gc3RhcnRPZiAodW5pdHMpIHtcbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAvLyB0aGUgZm9sbG93aW5nIHN3aXRjaCBpbnRlbnRpb25hbGx5IG9taXRzIGJyZWFrIGtleXdvcmRzXG4gICAgLy8gdG8gdXRpbGl6ZSBmYWxsaW5nIHRocm91Z2ggdGhlIGNhc2VzLlxuICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLm1vbnRoKDApO1xuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5kYXRlKDEpO1xuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgdGhpcy5ob3VycygwKTtcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoMCk7XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICB0aGlzLnNlY29uZHMoMCk7XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kcygwKTtcbiAgICB9XG5cbiAgICAvLyB3ZWVrcyBhcmUgYSBzcGVjaWFsIGNhc2VcbiAgICBpZiAodW5pdHMgPT09ICd3ZWVrJykge1xuICAgICAgICB0aGlzLndlZWtkYXkoMCk7XG4gICAgfVxuICAgIGlmICh1bml0cyA9PT0gJ2lzb1dlZWsnKSB7XG4gICAgICAgIHRoaXMuaXNvV2Vla2RheSgxKTtcbiAgICB9XG5cbiAgICAvLyBxdWFydGVycyBhcmUgYWxzbyBzcGVjaWFsXG4gICAgaWYgKHVuaXRzID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgdGhpcy5tb250aChNYXRoLmZsb29yKHRoaXMubW9udGgoKSAvIDMpICogMyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIGVuZE9mICh1bml0cykge1xuICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vICdkYXRlJyBpcyBhbiBhbGlhcyBmb3IgJ2RheScsIHNvIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHN1Y2guXG4gICAgaWYgKHVuaXRzID09PSAnZGF0ZScpIHtcbiAgICAgICAgdW5pdHMgPSAnZGF5JztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXRzKS5hZGQoMSwgKHVuaXRzID09PSAnaXNvV2VlaycgPyAnd2VlaycgOiB1bml0cykpLnN1YnRyYWN0KDEsICdtcycpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZU9mICgpIHtcbiAgICByZXR1cm4gdGhpcy5fZC52YWx1ZU9mKCkgLSAoKHRoaXMuX29mZnNldCB8fCAwKSAqIDYwMDAwKTtcbn1cblxuZnVuY3Rpb24gdW5peCAoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkgLyAxMDAwKTtcbn1cblxuZnVuY3Rpb24gdG9EYXRlICgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5ICgpIHtcbiAgICB2YXIgbSA9IHRoaXM7XG4gICAgcmV0dXJuIFttLnllYXIoKSwgbS5tb250aCgpLCBtLmRhdGUoKSwgbS5ob3VyKCksIG0ubWludXRlKCksIG0uc2Vjb25kKCksIG0ubWlsbGlzZWNvbmQoKV07XG59XG5cbmZ1bmN0aW9uIHRvT2JqZWN0ICgpIHtcbiAgICB2YXIgbSA9IHRoaXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICBtb250aHM6IG0ubW9udGgoKSxcbiAgICAgICAgZGF0ZTogbS5kYXRlKCksXG4gICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgIG1pbnV0ZXM6IG0ubWludXRlcygpLFxuICAgICAgICBzZWNvbmRzOiBtLnNlY29uZHMoKSxcbiAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICAvLyBuZXcgRGF0ZShOYU4pLnRvSlNPTigpID09PSBudWxsXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy50b0lTT1N0cmluZygpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZCQxICgpIHtcbiAgICByZXR1cm4gaXNWYWxpZCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2luZ0ZsYWdzICgpIHtcbiAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xufVxuXG5mdW5jdGlvbiBpbnZhbGlkQXQgKCkge1xuICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG59XG5cbmZ1bmN0aW9uIGNyZWF0aW9uRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgZm9ybWF0OiB0aGlzLl9mLFxuICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICBzdHJpY3Q6IHRoaXMuX3N0cmljdFxuICAgIH07XG59XG5cbi8vIEZPUk1BVFRJTkdcblxuYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xufSk7XG5cbmZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4gKHRva2VuLCBnZXR0ZXIpIHtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbdG9rZW4sIHRva2VuLmxlbmd0aF0sIDAsIGdldHRlcik7XG59XG5cbmFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2cnLCAgICAgJ3dlZWtZZWFyJyk7XG5hZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnZycsICAgICd3ZWVrWWVhcicpO1xuYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHRycsICAnaXNvV2Vla1llYXInKTtcbmFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCd3ZWVrWWVhcicsICdnZycpO1xuYWRkVW5pdEFsaWFzKCdpc29XZWVrWWVhcicsICdHRycpO1xuXG4vLyBQUklPUklUWVxuXG5hZGRVbml0UHJpb3JpdHkoJ3dlZWtZZWFyJywgMSk7XG5hZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtZZWFyJywgMSk7XG5cblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdHJywgICAgICBtYXRjaFNpZ25lZCk7XG5hZGRSZWdleFRva2VuKCdnJywgICAgICBtYXRjaFNpZ25lZCk7XG5hZGRSZWdleFRva2VuKCdHRycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdnZycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdHR0dHJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG5hZGRSZWdleFRva2VuKCdnZ2dnJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG5hZGRSZWdleFRva2VuKCdHR0dHRycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG5hZGRSZWdleFRva2VuKCdnZ2dnZycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbmFkZFdlZWtQYXJzZVRva2VuKFsnZ2dnZycsICdnZ2dnZycsICdHR0dHJywgJ0dHR0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDIpXSA9IHRvSW50KGlucHV0KTtcbn0pO1xuXG5hZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgIHdlZWtbdG9rZW5dID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xufSk7XG5cbi8vIE1PTUVOVFNcblxuZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXIgKGlucHV0KSB7XG4gICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICB0aGlzLndlZWtkYXkoKSxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveSk7XG59XG5cbmZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyIChpbnB1dCkge1xuICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICBpbnB1dCwgdGhpcy5pc29XZWVrKCksIHRoaXMuaXNvV2Vla2RheSgpLCAxLCA0KTtcbn1cblxuZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIgKCkge1xuICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG59XG5cbmZ1bmN0aW9uIGdldFdlZWtzSW5ZZWFyICgpIHtcbiAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdlZWtzVGFyZ2V0ID0gd2Vla3NJblllYXIoaW5wdXQsIGRvdywgZG95KTtcbiAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoZGF5T2ZZZWFyRGF0YS55ZWFyLCAwLCBkYXlPZlllYXJEYXRhLmRheU9mWWVhcik7XG5cbiAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgdGhpcy5kYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCdxdWFydGVyJywgJ1EnKTtcblxuLy8gUFJJT1JJVFlcblxuYWRkVW5pdFByaW9yaXR5KCdxdWFydGVyJywgNyk7XG5cbi8vIFBBUlNJTkdcblxuYWRkUmVnZXhUb2tlbignUScsIG1hdGNoMSk7XG5hZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgIGFycmF5W01PTlRIXSA9ICh0b0ludChpbnB1dCkgLSAxKSAqIDM7XG59KTtcblxuLy8gTU9NRU5UU1xuXG5mdW5jdGlvbiBnZXRTZXRRdWFydGVyIChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gTWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkgKyAxKSAvIDMpIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyB0aGlzLm1vbnRoKCkgJSAzKTtcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignRCcsIFsnREQnLCAyXSwgJ0RvJywgJ2RhdGUnKTtcblxuLy8gQUxJQVNFU1xuXG5hZGRVbml0QWxpYXMoJ2RhdGUnLCAnRCcpO1xuXG4vLyBQUklPUk9JVFlcbmFkZFVuaXRQcmlvcml0eSgnZGF0ZScsIDkpO1xuXG4vLyBQQVJTSU5HXG5cbmFkZFJlZ2V4VG9rZW4oJ0QnLCAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ0REJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgIHJldHVybiBpc1N0cmljdCA/IGxvY2FsZS5fb3JkaW5hbFBhcnNlIDogbG9jYWxlLl9vcmRpbmFsUGFyc2VMZW5pZW50O1xufSk7XG5cbmFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgYXJyYXlbREFURV0gPSB0b0ludChpbnB1dC5tYXRjaChtYXRjaDF0bzIpWzBdLCAxMCk7XG59KTtcblxuLy8gTU9NRU5UU1xuXG52YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignREREJywgWydEREREJywgM10sICdERERvJywgJ2RheU9mWWVhcicpO1xuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygnZGF5T2ZZZWFyJywgJ0RERCcpO1xuXG4vLyBQUklPUklUWVxuYWRkVW5pdFByaW9yaXR5KCdkYXlPZlllYXInLCA0KTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdEREQnLCAgbWF0Y2gxdG8zKTtcbmFkZFJlZ2V4VG9rZW4oJ0REREQnLCBtYXRjaDMpO1xuYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xufSk7XG5cbi8vIEhFTFBFUlNcblxuLy8gTU9NRU5UU1xuXG5mdW5jdGlvbiBnZXRTZXREYXlPZlllYXIgKGlucHV0KSB7XG4gICAgdmFyIGRheU9mWWVhciA9IE1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTUpICsgMTtcbiAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKChpbnB1dCAtIGRheU9mWWVhciksICdkJyk7XG59XG5cbi8vIEZPUk1BVFRJTkdcblxuYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuLy8gQUxJQVNFU1xuXG5hZGRVbml0QWxpYXMoJ21pbnV0ZScsICdtJyk7XG5cbi8vIFBSSU9SSVRZXG5cbmFkZFVuaXRQcmlvcml0eSgnbWludXRlJywgMTQpO1xuXG4vLyBQQVJTSU5HXG5cbmFkZFJlZ2V4VG9rZW4oJ20nLCAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuYWRkUGFyc2VUb2tlbihbJ20nLCAnbW0nXSwgTUlOVVRFKTtcblxuLy8gTU9NRU5UU1xuXG52YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbigncycsIFsnc3MnLCAyXSwgMCwgJ3NlY29uZCcpO1xuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygnc2Vjb25kJywgJ3MnKTtcblxuLy8gUFJJT1JJVFlcblxuYWRkVW5pdFByaW9yaXR5KCdzZWNvbmQnLCAxNSk7XG5cbi8vIFBBUlNJTkdcblxuYWRkUmVnZXhUb2tlbigncycsICBtYXRjaDF0bzIpO1xuYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4vLyBNT01FTlRTXG5cbnZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKCdTJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKDAsIFsnU1MnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oMCwgWydTU1MnLCAzXSwgMCwgJ21pbGxpc2Vjb25kJyk7XG5hZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbn0pO1xuYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbn0pO1xuYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xufSk7XG5hZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbn0pO1xuYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbn0pO1xuYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xufSk7XG5cblxuLy8gQUxJQVNFU1xuXG5hZGRVbml0QWxpYXMoJ21pbGxpc2Vjb25kJywgJ21zJyk7XG5cbi8vIFBSSU9SSVRZXG5cbmFkZFVuaXRQcmlvcml0eSgnbWlsbGlzZWNvbmQnLCAxNik7XG5cbi8vIFBBUlNJTkdcblxuYWRkUmVnZXhUb2tlbignUycsICAgIG1hdGNoMXRvMywgbWF0Y2gxKTtcbmFkZFJlZ2V4VG9rZW4oJ1NTJywgICBtYXRjaDF0bzMsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdTU1MnLCAgbWF0Y2gxdG8zLCBtYXRjaDMpO1xuXG52YXIgdG9rZW47XG5mb3IgKHRva2VuID0gJ1NTU1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTXMoaW5wdXQsIGFycmF5KSB7XG4gICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbn1cblxuZm9yICh0b2tlbiA9ICdTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xufVxuLy8gTU9NRU5UU1xuXG52YXIgZ2V0U2V0TWlsbGlzZWNvbmQgPSBtYWtlR2V0U2V0KCdNaWxsaXNlY29uZHMnLCBmYWxzZSk7XG5cbi8vIEZPUk1BVFRJTkdcblxuYWRkRm9ybWF0VG9rZW4oJ3onLCAgMCwgMCwgJ3pvbmVBYmJyJyk7XG5hZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuLy8gTU9NRU5UU1xuXG5mdW5jdGlvbiBnZXRab25lQWJiciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0Wm9uZU5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZScgOiAnJztcbn1cblxudmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxucHJvdG8uYWRkICAgICAgICAgICAgICAgPSBhZGQ7XG5wcm90by5jYWxlbmRhciAgICAgICAgICA9IGNhbGVuZGFyJDE7XG5wcm90by5jbG9uZSAgICAgICAgICAgICA9IGNsb25lO1xucHJvdG8uZGlmZiAgICAgICAgICAgICAgPSBkaWZmO1xucHJvdG8uZW5kT2YgICAgICAgICAgICAgPSBlbmRPZjtcbnByb3RvLmZvcm1hdCAgICAgICAgICAgID0gZm9ybWF0O1xucHJvdG8uZnJvbSAgICAgICAgICAgICAgPSBmcm9tO1xucHJvdG8uZnJvbU5vdyAgICAgICAgICAgPSBmcm9tTm93O1xucHJvdG8udG8gICAgICAgICAgICAgICAgPSB0bztcbnByb3RvLnRvTm93ICAgICAgICAgICAgID0gdG9Ob3c7XG5wcm90by5nZXQgICAgICAgICAgICAgICA9IHN0cmluZ0dldDtcbnByb3RvLmludmFsaWRBdCAgICAgICAgID0gaW52YWxpZEF0O1xucHJvdG8uaXNBZnRlciAgICAgICAgICAgPSBpc0FmdGVyO1xucHJvdG8uaXNCZWZvcmUgICAgICAgICAgPSBpc0JlZm9yZTtcbnByb3RvLmlzQmV0d2VlbiAgICAgICAgID0gaXNCZXR3ZWVuO1xucHJvdG8uaXNTYW1lICAgICAgICAgICAgPSBpc1NhbWU7XG5wcm90by5pc1NhbWVPckFmdGVyICAgICA9IGlzU2FtZU9yQWZ0ZXI7XG5wcm90by5pc1NhbWVPckJlZm9yZSAgICA9IGlzU2FtZU9yQmVmb3JlO1xucHJvdG8uaXNWYWxpZCAgICAgICAgICAgPSBpc1ZhbGlkJDE7XG5wcm90by5sYW5nICAgICAgICAgICAgICA9IGxhbmc7XG5wcm90by5sb2NhbGUgICAgICAgICAgICA9IGxvY2FsZTtcbnByb3RvLmxvY2FsZURhdGEgICAgICAgID0gbG9jYWxlRGF0YTtcbnByb3RvLm1heCAgICAgICAgICAgICAgID0gcHJvdG90eXBlTWF4O1xucHJvdG8ubWluICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNaW47XG5wcm90by5wYXJzaW5nRmxhZ3MgICAgICA9IHBhcnNpbmdGbGFncztcbnByb3RvLnNldCAgICAgICAgICAgICAgID0gc3RyaW5nU2V0O1xucHJvdG8uc3RhcnRPZiAgICAgICAgICAgPSBzdGFydE9mO1xucHJvdG8uc3VidHJhY3QgICAgICAgICAgPSBzdWJ0cmFjdDtcbnByb3RvLnRvQXJyYXkgICAgICAgICAgID0gdG9BcnJheTtcbnByb3RvLnRvT2JqZWN0ICAgICAgICAgID0gdG9PYmplY3Q7XG5wcm90by50b0RhdGUgICAgICAgICAgICA9IHRvRGF0ZTtcbnByb3RvLnRvSVNPU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmc7XG5wcm90by5pbnNwZWN0ICAgICAgICAgICA9IGluc3BlY3Q7XG5wcm90by50b0pTT04gICAgICAgICAgICA9IHRvSlNPTjtcbnByb3RvLnRvU3RyaW5nICAgICAgICAgID0gdG9TdHJpbmc7XG5wcm90by51bml4ICAgICAgICAgICAgICA9IHVuaXg7XG5wcm90by52YWx1ZU9mICAgICAgICAgICA9IHZhbHVlT2Y7XG5wcm90by5jcmVhdGlvbkRhdGEgICAgICA9IGNyZWF0aW9uRGF0YTtcblxuLy8gWWVhclxucHJvdG8ueWVhciAgICAgICA9IGdldFNldFllYXI7XG5wcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcblxuLy8gV2VlayBZZWFyXG5wcm90by53ZWVrWWVhciAgICA9IGdldFNldFdlZWtZZWFyO1xucHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcblxuLy8gUXVhcnRlclxucHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcblxuLy8gTW9udGhcbnByb3RvLm1vbnRoICAgICAgID0gZ2V0U2V0TW9udGg7XG5wcm90by5kYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoO1xuXG4vLyBXZWVrXG5wcm90by53ZWVrICAgICAgICAgICA9IHByb3RvLndlZWtzICAgICAgICA9IGdldFNldFdlZWs7XG5wcm90by5pc29XZWVrICAgICAgICA9IHByb3RvLmlzb1dlZWtzICAgICA9IGdldFNldElTT1dlZWs7XG5wcm90by53ZWVrc0luWWVhciAgICA9IGdldFdlZWtzSW5ZZWFyO1xucHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcblxuLy8gRGF5XG5wcm90by5kYXRlICAgICAgID0gZ2V0U2V0RGF5T2ZNb250aDtcbnByb3RvLmRheSAgICAgICAgPSBwcm90by5kYXlzICAgICAgICAgICAgID0gZ2V0U2V0RGF5T2ZXZWVrO1xucHJvdG8ud2Vla2RheSAgICA9IGdldFNldExvY2FsZURheU9mV2VlaztcbnByb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG5wcm90by5kYXlPZlllYXIgID0gZ2V0U2V0RGF5T2ZZZWFyO1xuXG4vLyBIb3VyXG5wcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuXG4vLyBNaW51dGVcbnByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG5cbi8vIFNlY29uZFxucHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcblxuLy8gTWlsbGlzZWNvbmRcbnByb3RvLm1pbGxpc2Vjb25kID0gcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG5cbi8vIE9mZnNldFxucHJvdG8udXRjT2Zmc2V0ICAgICAgICAgICAgPSBnZXRTZXRPZmZzZXQ7XG5wcm90by51dGMgICAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvVVRDO1xucHJvdG8ubG9jYWwgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb0xvY2FsO1xucHJvdG8ucGFyc2Vab25lICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldDtcbnByb3RvLmhhc0FsaWduZWRIb3VyT2Zmc2V0ID0gaGFzQWxpZ25lZEhvdXJPZmZzZXQ7XG5wcm90by5pc0RTVCAgICAgICAgICAgICAgICA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xucHJvdG8uaXNMb2NhbCAgICAgICAgICAgICAgPSBpc0xvY2FsO1xucHJvdG8uaXNVdGNPZmZzZXQgICAgICAgICAgPSBpc1V0Y09mZnNldDtcbnByb3RvLmlzVXRjICAgICAgICAgICAgICAgID0gaXNVdGM7XG5wcm90by5pc1VUQyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuXG4vLyBUaW1lem9uZVxucHJvdG8uem9uZUFiYnIgPSBnZXRab25lQWJicjtcbnByb3RvLnpvbmVOYW1lID0gZ2V0Wm9uZU5hbWU7XG5cbi8vIERlcHJlY2F0aW9uc1xucHJvdG8uZGF0ZXMgID0gZGVwcmVjYXRlKCdkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLicsIGdldFNldERheU9mTW9udGgpO1xucHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKCdtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQnLCBnZXRTZXRNb250aCk7XG5wcm90by55ZWFycyAgPSBkZXByZWNhdGUoJ3llYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWQnLCBnZXRTZXRZZWFyKTtcbnByb3RvLnpvbmUgICA9IGRlcHJlY2F0ZSgnbW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3Mvem9uZS8nLCBnZXRTZXRab25lKTtcbnByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZSgnaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuaXggKGlucHV0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0ICogMTAwMCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUluWm9uZSAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG59XG5cbmZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdCAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZztcbn1cblxudmFyIHByb3RvJDEgPSBMb2NhbGUucHJvdG90eXBlO1xuXG5wcm90byQxLmNhbGVuZGFyICAgICAgICA9IGNhbGVuZGFyO1xucHJvdG8kMS5sb25nRGF0ZUZvcm1hdCAgPSBsb25nRGF0ZUZvcm1hdDtcbnByb3RvJDEuaW52YWxpZERhdGUgICAgID0gaW52YWxpZERhdGU7XG5wcm90byQxLm9yZGluYWwgICAgICAgICA9IG9yZGluYWw7XG5wcm90byQxLnByZXBhcnNlICAgICAgICA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbnByb3RvJDEucG9zdGZvcm1hdCAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xucHJvdG8kMS5yZWxhdGl2ZVRpbWUgICAgPSByZWxhdGl2ZVRpbWU7XG5wcm90byQxLnBhc3RGdXR1cmUgICAgICA9IHBhc3RGdXR1cmU7XG5wcm90byQxLnNldCAgICAgICAgICAgICA9IHNldDtcblxuLy8gTW9udGhcbnByb3RvJDEubW9udGhzICAgICAgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzO1xucHJvdG8kMS5tb250aHNTaG9ydCAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNTaG9ydDtcbnByb3RvJDEubW9udGhzUGFyc2UgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzUGFyc2U7XG5wcm90byQxLm1vbnRoc1JlZ2V4ICAgICAgID0gbW9udGhzUmVnZXg7XG5wcm90byQxLm1vbnRoc1Nob3J0UmVnZXggID0gbW9udGhzU2hvcnRSZWdleDtcblxuLy8gV2Vla1xucHJvdG8kMS53ZWVrID0gbG9jYWxlV2VlaztcbnByb3RvJDEuZmlyc3REYXlPZlllYXIgPSBsb2NhbGVGaXJzdERheU9mWWVhcjtcbnByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuLy8gRGF5IG9mIFdlZWtcbnByb3RvJDEud2Vla2RheXMgICAgICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXM7XG5wcm90byQxLndlZWtkYXlzTWluICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzTWluO1xucHJvdG8kMS53ZWVrZGF5c1Nob3J0ICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1Nob3J0O1xucHJvdG8kMS53ZWVrZGF5c1BhcnNlICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG5wcm90byQxLndlZWtkYXlzUmVnZXggICAgICAgPSAgICAgICAgd2Vla2RheXNSZWdleDtcbnByb3RvJDEud2Vla2RheXNTaG9ydFJlZ2V4ICA9ICAgICAgICB3ZWVrZGF5c1Nob3J0UmVnZXg7XG5wcm90byQxLndlZWtkYXlzTWluUmVnZXggICAgPSAgICAgICAgd2Vla2RheXNNaW5SZWdleDtcblxuLy8gSG91cnNcbnByb3RvJDEuaXNQTSA9IGxvY2FsZUlzUE07XG5wcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbmZ1bmN0aW9uIGdldCQxIChmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpO1xuICAgIHZhciB1dGMgPSBjcmVhdGVVVEMoKS5zZXQoc2V0dGVyLCBpbmRleCk7XG4gICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xufVxuXG5mdW5jdGlvbiBsaXN0TW9udGhzSW1wbCAoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgfVxuXG4gICAgdmFyIGk7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgaSwgZmllbGQsICdtb250aCcpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuXG4vLyAoKVxuLy8gKDUpXG4vLyAoZm10LCA1KVxuLy8gKGZtdClcbi8vICh0cnVlKVxuLy8gKHRydWUsIDUpXG4vLyAodHJ1ZSwgZm10LCA1KVxuLy8gKHRydWUsIGZtdClcbmZ1bmN0aW9uIGxpc3RXZWVrZGF5c0ltcGwgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXQgPSBsb2NhbGVTb3J0ZWQ7XG4gICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICBsb2NhbGVTb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgfVxuXG4gICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwO1xuXG4gICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgKGluZGV4ICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICB9XG5cbiAgICB2YXIgaTtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIChpICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gbGlzdE1vbnRocyAoZm9ybWF0LCBpbmRleCkge1xuICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzJyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RNb250aHNTaG9ydCAoZm9ybWF0LCBpbmRleCkge1xuICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzU2hvcnQnKTtcbn1cblxuZnVuY3Rpb24gbGlzdFdlZWtkYXlzIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xufVxuXG5mdW5jdGlvbiBsaXN0V2Vla2RheXNTaG9ydCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNTaG9ydCcpO1xufVxuXG5mdW5jdGlvbiBsaXN0V2Vla2RheXNNaW4gKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzTWluJyk7XG59XG5cbmdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgb3V0cHV0ID0gKHRvSW50KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICB9XG59KTtcblxuLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuaG9va3MubGFuZyA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4nLCBnZXRTZXRHbG9iYWxMb2NhbGUpO1xuaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLCBnZXRMb2NhbGUpO1xuXG52YXIgbWF0aEFicyA9IE1hdGguYWJzO1xuXG5mdW5jdGlvbiBhYnMgKCkge1xuICAgIHZhciBkYXRhICAgICAgICAgICA9IHRoaXMuX2RhdGE7XG5cbiAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgdGhpcy5fZGF5cyAgICAgICAgID0gbWF0aEFicyh0aGlzLl9kYXlzKTtcbiAgICB0aGlzLl9tb250aHMgICAgICAgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICBkYXRhLm1pbGxpc2Vjb25kcyAgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICBkYXRhLnNlY29uZHMgICAgICAgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgZGF0YS5taW51dGVzICAgICAgID0gbWF0aEFicyhkYXRhLm1pbnV0ZXMpO1xuICAgIGRhdGEuaG91cnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgZGF0YS5tb250aHMgICAgICAgID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgZGF0YS55ZWFycyAgICAgICAgID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBhZGRTdWJ0cmFjdCQxIChkdXJhdGlvbiwgaW5wdXQsIHZhbHVlLCBkaXJlY3Rpb24pIHtcbiAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgIGR1cmF0aW9uLl9kYXlzICAgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgZHVyYXRpb24uX21vbnRocyAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgcmV0dXJuIGR1cmF0aW9uLl9idWJibGUoKTtcbn1cblxuLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuZnVuY3Rpb24gYWRkJDEgKGlucHV0LCB2YWx1ZSkge1xuICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgMSk7XG59XG5cbi8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG5mdW5jdGlvbiBzdWJ0cmFjdCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIC0xKTtcbn1cblxuZnVuY3Rpb24gYWJzQ2VpbCAobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBidWJibGUgKCkge1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG4gICAgdmFyIGRheXMgICAgICAgICA9IHRoaXMuX2RheXM7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IHRoaXMuX21vbnRocztcbiAgICB2YXIgZGF0YSAgICAgICAgID0gdGhpcy5fZGF0YTtcbiAgICB2YXIgc2Vjb25kcywgbWludXRlcywgaG91cnMsIHllYXJzLCBtb250aHNGcm9tRGF5cztcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICBpZiAoISgobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA8PSAwICYmIGRheXMgPD0gMCAmJiBtb250aHMgPD0gMCkpKSB7XG4gICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgIG1vbnRocyA9IDA7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgIC8vIGV4YW1wbGVzIG9mIHdoYXQgdGhhdCBtZWFucy5cbiAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICBzZWNvbmRzICAgICAgICAgICA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgIGRhdGEuc2Vjb25kcyAgICAgID0gc2Vjb25kcyAlIDYwO1xuXG4gICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGRhdGEubWludXRlcyAgICAgID0gbWludXRlcyAlIDYwO1xuXG4gICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgIGRhdGEuaG91cnMgICAgICAgID0gaG91cnMgJSAyNDtcblxuICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgbW9udGhzRnJvbURheXMgPSBhYnNGbG9vcihkYXlzVG9Nb250aHMoZGF5cykpO1xuICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgbW9udGhzICU9IDEyO1xuXG4gICAgZGF0YS5kYXlzICAgPSBkYXlzO1xuICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgIGRhdGEueWVhcnMgID0geWVhcnM7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gZGF5c1RvTW9udGhzIChkYXlzKSB7XG4gICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgIC8vIDQwMCB5ZWFycyBoYXZlIDEyIG1vbnRocyA9PT0gNDgwMFxuICAgIHJldHVybiBkYXlzICogNDgwMCAvIDE0NjA5Nztcbn1cblxuZnVuY3Rpb24gbW9udGhzVG9EYXlzIChtb250aHMpIHtcbiAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICByZXR1cm4gbW9udGhzICogMTQ2MDk3IC8gNDgwMDtcbn1cblxuZnVuY3Rpb24gYXMgKHVuaXRzKSB7XG4gICAgdmFyIGRheXM7XG4gICAgdmFyIG1vbnRocztcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICBkYXlzICAgPSB0aGlzLl9kYXlzICAgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICByZXR1cm4gdW5pdHMgPT09ICdtb250aCcgPyBtb250aHMgOiBtb250aHMgLyAxMjtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnICAgOiByZXR1cm4gZGF5cyAvIDcgICAgICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgY2FzZSAnZGF5JyAgICA6IHJldHVybiBkYXlzICAgICAgICAgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInICAgOiByZXR1cm4gZGF5cyAqIDI0ICAgICsgbWlsbGlzZWNvbmRzIC8gMzZlNTtcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZScgOiByZXR1cm4gZGF5cyAqIDE0NDAgICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJyA6IHJldHVybiBkYXlzICogODY0MDAgKyBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6IHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdW5pdCAnICsgdW5pdHMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUT0RPOiBVc2UgdGhpcy5hcygnbXMnKT9cbmZ1bmN0aW9uIHZhbHVlT2YkMSAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzICtcbiAgICAgICAgdGhpcy5fZGF5cyAqIDg2NGU1ICtcbiAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgIHRvSW50KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTZcbiAgICApO1xufVxuXG5mdW5jdGlvbiBtYWtlQXMgKGFsaWFzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgIH07XG59XG5cbnZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKTtcbnZhciBhc1NlY29uZHMgICAgICA9IG1ha2VBcygncycpO1xudmFyIGFzTWludXRlcyAgICAgID0gbWFrZUFzKCdtJyk7XG52YXIgYXNIb3VycyAgICAgICAgPSBtYWtlQXMoJ2gnKTtcbnZhciBhc0RheXMgICAgICAgICA9IG1ha2VBcygnZCcpO1xudmFyIGFzV2Vla3MgICAgICAgID0gbWFrZUFzKCd3Jyk7XG52YXIgYXNNb250aHMgICAgICAgPSBtYWtlQXMoJ00nKTtcbnZhciBhc1llYXJzICAgICAgICA9IG1ha2VBcygneScpO1xuXG5mdW5jdGlvbiBnZXQkMiAodW5pdHMpIHtcbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICByZXR1cm4gdGhpc1t1bml0cyArICdzJ10oKTtcbn1cblxuZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFbbmFtZV07XG4gICAgfTtcbn1cblxudmFyIG1pbGxpc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ21pbGxpc2Vjb25kcycpO1xudmFyIHNlY29uZHMgICAgICA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKTtcbnZhciBtaW51dGVzICAgICAgPSBtYWtlR2V0dGVyKCdtaW51dGVzJyk7XG52YXIgaG91cnMgICAgICAgID0gbWFrZUdldHRlcignaG91cnMnKTtcbnZhciBkYXlzICAgICAgICAgPSBtYWtlR2V0dGVyKCdkYXlzJyk7XG52YXIgbW9udGhzICAgICAgID0gbWFrZUdldHRlcignbW9udGhzJyk7XG52YXIgeWVhcnMgICAgICAgID0gbWFrZUdldHRlcigneWVhcnMnKTtcblxuZnVuY3Rpb24gd2Vla3MgKCkge1xuICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xufVxuXG52YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xudmFyIHRocmVzaG9sZHMgPSB7XG4gICAgczogNDUsICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgIG06IDQ1LCAgLy8gbWludXRlcyB0byBob3VyXG4gICAgaDogMjIsICAvLyBob3VycyB0byBkYXlcbiAgICBkOiAyNiwgIC8vIGRheXMgdG8gbW9udGhcbiAgICBNOiAxMSAgIC8vIG1vbnRocyB0byB5ZWFyXG59O1xuXG4vLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICByZXR1cm4gbG9jYWxlLnJlbGF0aXZlVGltZShudW1iZXIgfHwgMSwgISF3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKTtcbn1cblxuZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICB2YXIgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCk7XG4gICAgdmFyIHNlY29uZHMgID0gcm91bmQoZHVyYXRpb24uYXMoJ3MnKSk7XG4gICAgdmFyIG1pbnV0ZXMgID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSk7XG4gICAgdmFyIGhvdXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ2gnKSk7XG4gICAgdmFyIGRheXMgICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ2QnKSk7XG4gICAgdmFyIG1vbnRocyAgID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSk7XG4gICAgdmFyIHllYXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSk7XG5cbiAgICB2YXIgYSA9IHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgJiYgWydzJywgc2Vjb25kc10gIHx8XG4gICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICYmIFsnbSddICAgICAgICAgICB8fFxuICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAmJiBbJ21tJywgbWludXRlc10gfHxcbiAgICAgICAgICAgIGhvdXJzICAgPD0gMSAgICAgICAgICAgJiYgWydoJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICYmIFsnaGgnLCBob3Vyc10gICB8fFxuICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAmJiBbJ2QnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgIGRheXMgICAgPCB0aHJlc2hvbGRzLmQgJiYgWydkZCcsIGRheXNdICAgIHx8XG4gICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICYmIFsnTSddICAgICAgICAgICB8fFxuICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAmJiBbJ01NJywgbW9udGhzXSAgfHxcbiAgICAgICAgICAgIHllYXJzICAgPD0gMSAgICAgICAgICAgJiYgWyd5J10gICAgICAgICAgIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICBhWzNdID0gK3Bvc05lZ0R1cmF0aW9uID4gMDtcbiAgICBhWzRdID0gbG9jYWxlO1xuICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgcm91bmRpbmcgZnVuY3Rpb24gZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByb3VuZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZihyb3VuZGluZ0Z1bmN0aW9uKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByb3VuZCA9IHJvdW5kaW5nRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkICh0aHJlc2hvbGQsIGxpbWl0KSB7XG4gICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRocmVzaG9sZHNbdGhyZXNob2xkXTtcbiAgICB9XG4gICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGh1bWFuaXplICh3aXRoU3VmZml4KSB7XG4gICAgdmFyIGxvY2FsZSA9IHRoaXMubG9jYWxlRGF0YSgpO1xuICAgIHZhciBvdXRwdXQgPSByZWxhdGl2ZVRpbWUkMSh0aGlzLCAhd2l0aFN1ZmZpeCwgbG9jYWxlKTtcblxuICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgIG91dHB1dCA9IGxvY2FsZS5wYXN0RnV0dXJlKCt0aGlzLCBvdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xufVxuXG52YXIgYWJzJDEgPSBNYXRoLmFicztcblxuZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAvLyBmb3IgSVNPIHN0cmluZ3Mgd2UgZG8gbm90IHVzZSB0aGUgbm9ybWFsIGJ1YmJsaW5nIHJ1bGVzOlxuICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgLy8gICogbW9udGhzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSB5ZWFyc1xuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgLy8gYW5kIGFsc28gbm90IGJldHdlZW4gZGF5cyBhbmQgbW9udGhzICgyOC0zMSBkYXlzIHBlciBtb250aClcbiAgICB2YXIgc2Vjb25kcyA9IGFicyQxKHRoaXMuX21pbGxpc2Vjb25kcykgLyAxMDAwO1xuICAgIHZhciBkYXlzICAgICAgICAgPSBhYnMkMSh0aGlzLl9kYXlzKTtcbiAgICB2YXIgbW9udGhzICAgICAgID0gYWJzJDEodGhpcy5fbW9udGhzKTtcbiAgICB2YXIgbWludXRlcywgaG91cnMsIHllYXJzO1xuXG4gICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGhvdXJzICAgICAgICAgICAgID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICBzZWNvbmRzICU9IDYwO1xuICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgeWVhcnMgID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgIG1vbnRocyAlPSAxMjtcblxuXG4gICAgLy8gaW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2RvcmRpbGxlL21vbWVudC1pc29kdXJhdGlvbi9ibG9iL21hc3Rlci9tb21lbnQuaXNvZHVyYXRpb24uanNcbiAgICB2YXIgWSA9IHllYXJzO1xuICAgIHZhciBNID0gbW9udGhzO1xuICAgIHZhciBEID0gZGF5cztcbiAgICB2YXIgaCA9IGhvdXJzO1xuICAgIHZhciBtID0gbWludXRlcztcbiAgICB2YXIgcyA9IHNlY29uZHM7XG4gICAgdmFyIHRvdGFsID0gdGhpcy5hc1NlY29uZHMoKTtcblxuICAgIGlmICghdG90YWwpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgIHJldHVybiAnUDBEJztcbiAgICB9XG5cbiAgICByZXR1cm4gKHRvdGFsIDwgMCA/ICctJyA6ICcnKSArXG4gICAgICAgICdQJyArXG4gICAgICAgIChZID8gWSArICdZJyA6ICcnKSArXG4gICAgICAgIChNID8gTSArICdNJyA6ICcnKSArXG4gICAgICAgIChEID8gRCArICdEJyA6ICcnKSArXG4gICAgICAgICgoaCB8fCBtIHx8IHMpID8gJ1QnIDogJycpICtcbiAgICAgICAgKGggPyBoICsgJ0gnIDogJycpICtcbiAgICAgICAgKG0gPyBtICsgJ00nIDogJycpICtcbiAgICAgICAgKHMgPyBzICsgJ1MnIDogJycpO1xufVxuXG52YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxucHJvdG8kMi5hYnMgICAgICAgICAgICA9IGFicztcbnByb3RvJDIuYWRkICAgICAgICAgICAgPSBhZGQkMTtcbnByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xucHJvdG8kMi5hcyAgICAgICAgICAgICA9IGFzO1xucHJvdG8kMi5hc01pbGxpc2Vjb25kcyA9IGFzTWlsbGlzZWNvbmRzO1xucHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbnByb3RvJDIuYXNNaW51dGVzICAgICAgPSBhc01pbnV0ZXM7XG5wcm90byQyLmFzSG91cnMgICAgICAgID0gYXNIb3VycztcbnByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG5wcm90byQyLmFzV2Vla3MgICAgICAgID0gYXNXZWVrcztcbnByb3RvJDIuYXNNb250aHMgICAgICAgPSBhc01vbnRocztcbnByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xucHJvdG8kMi52YWx1ZU9mICAgICAgICA9IHZhbHVlT2YkMTtcbnByb3RvJDIuX2J1YmJsZSAgICAgICAgPSBidWJibGU7XG5wcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG5wcm90byQyLm1pbGxpc2Vjb25kcyAgID0gbWlsbGlzZWNvbmRzO1xucHJvdG8kMi5zZWNvbmRzICAgICAgICA9IHNlY29uZHM7XG5wcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbnByb3RvJDIuaG91cnMgICAgICAgICAgPSBob3VycztcbnByb3RvJDIuZGF5cyAgICAgICAgICAgPSBkYXlzO1xucHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xucHJvdG8kMi5tb250aHMgICAgICAgICA9IG1vbnRocztcbnByb3RvJDIueWVhcnMgICAgICAgICAgPSB5ZWFycztcbnByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbnByb3RvJDIudG9JU09TdHJpbmcgICAgPSB0b0lTT1N0cmluZyQxO1xucHJvdG8kMi50b1N0cmluZyAgICAgICA9IHRvSVNPU3RyaW5nJDE7XG5wcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbnByb3RvJDIubG9jYWxlICAgICAgICAgPSBsb2NhbGU7XG5wcm90byQyLmxvY2FsZURhdGEgICAgID0gbG9jYWxlRGF0YTtcblxuLy8gRGVwcmVjYXRpb25zXG5wcm90byQyLnRvSXNvU3RyaW5nID0gZGVwcmVjYXRlKCd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsIHRvSVNPU3RyaW5nJDEpO1xucHJvdG8kMi5sYW5nID0gbGFuZztcblxuLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKCdYJywgMCwgMCwgJ3VuaXgnKTtcbmFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCd4JywgbWF0Y2hTaWduZWQpO1xuYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbmFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KGlucHV0LCAxMCkgKiAxMDAwKTtcbn0pO1xuYWRkUGFyc2VUb2tlbigneCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG59KTtcblxuLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG5cbmhvb2tzLnZlcnNpb24gPSAnMi4xNy4xJztcblxuc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuaG9va3MuZm4gICAgICAgICAgICAgICAgICAgID0gcHJvdG87XG5ob29rcy5taW4gICAgICAgICAgICAgICAgICAgPSBtaW47XG5ob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG5ob29rcy5ub3cgICAgICAgICAgICAgICAgICAgPSBub3c7XG5ob29rcy51dGMgICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVVEM7XG5ob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuaG9va3MubW9udGhzICAgICAgICAgICAgICAgID0gbGlzdE1vbnRocztcbmhvb2tzLmlzRGF0ZSAgICAgICAgICAgICAgICA9IGlzRGF0ZTtcbmhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbmhvb2tzLmludmFsaWQgICAgICAgICAgICAgICA9IGNyZWF0ZUludmFsaWQ7XG5ob29rcy5kdXJhdGlvbiAgICAgICAgICAgICAgPSBjcmVhdGVEdXJhdGlvbjtcbmhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuaG9va3Mud2Vla2RheXMgICAgICAgICAgICAgID0gbGlzdFdlZWtkYXlzO1xuaG9va3MucGFyc2Vab25lICAgICAgICAgICAgID0gY3JlYXRlSW5ab25lO1xuaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuaG9va3MuaXNEdXJhdGlvbiAgICAgICAgICAgID0gaXNEdXJhdGlvbjtcbmhvb2tzLm1vbnRoc1Nob3J0ICAgICAgICAgICA9IGxpc3RNb250aHNTaG9ydDtcbmhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbmhvb2tzLmRlZmluZUxvY2FsZSAgICAgICAgICA9IGRlZmluZUxvY2FsZTtcbmhvb2tzLnVwZGF0ZUxvY2FsZSAgICAgICAgICA9IHVwZGF0ZUxvY2FsZTtcbmhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuaG9va3Mud2Vla2RheXNTaG9ydCAgICAgICAgID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG5ob29rcy5ub3JtYWxpemVVbml0cyAgICAgICAgPSBub3JtYWxpemVVbml0cztcbmhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG5ob29rcy5yZWxhdGl2ZVRpbWVUaHJlc2hvbGQgPSBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQ7XG5ob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbmhvb2tzLnByb3RvdHlwZSAgICAgICAgICAgICA9IHByb3RvO1xuXG5yZXR1cm4gaG9va3M7XG5cbn0pKSk7XG4iLCIvKiEgbmdUYWJsZSB2MC44LjMgYnkgVml0YWxpaSBTYXZjaHVrKGVzdml0NjY2QGdtYWlsLmNvbSkgLSBodHRwczovL2dpdGh1Yi5jb20vZXN2aXQvbmctdGFibGUgLSBOZXcgQlNEIExpY2Vuc2UgKi9cblxuIWZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP3ZvaWQgZGVmaW5lKFtcImFuZ3VsYXJcIl0sZnVuY3Rpb24oYSl7cmV0dXJuIGIoYSl9KTpiKGEpfSh3aW5kb3cuYW5ndWxhcnx8bnVsbCxmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj1hLm1vZHVsZShcIm5nVGFibGVcIixbXSk7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIsYyl7dmFyIGY9Yi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnN1YnN0cmluZygxKSxnPXt9O3JldHVybiBnW1wib25cIitmXT1kKGIpLGdbXCJwdWJsaXNoXCIrZl09ZShiKSxhLmV4dGVuZChjLGcpfWZ1bmN0aW9uIGQoYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWEuaWRlbnRpdHksZz1iO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoP2EuaXNGdW5jdGlvbihhcmd1bWVudHNbMV0uJG5ldyk/Zz1hcmd1bWVudHNbMV06ZT1hcmd1bWVudHNbMV06YXJndW1lbnRzLmxlbmd0aD4yJiYoZz1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMl0pLGEuaXNPYmplY3QoZSkpe3ZhciBoPWU7ZT1mdW5jdGlvbihhKXtyZXR1cm4gYT09PWh9fXJldHVybiBnLiRvbihcIm5nVGFibGU6XCIrYyxmdW5jdGlvbihhLGIpe2lmKCFiLmlzTnVsbEluc3RhbmNlKXt2YXIgYz1mKGFyZ3VtZW50cywyKSxnPVtiXS5jb25jYXQoYyk7ZS5hcHBseSh0aGlzLGcpJiZkLmFwcGx5KHRoaXMsZyl9fSl9fWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9W1wibmdUYWJsZTpcIithXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7Yi4kYnJvYWRjYXN0LmFwcGx5KGIsYyl9fWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxudWxsPT1iPzE6Yil9dmFyIGc9e307cmV0dXJuIGc9YyhcImFmdGVyQ3JlYXRlZFwiLGcpLGc9YyhcImFmdGVyUmVsb2FkRGF0YVwiLGcpLGc9YyhcImRhdGFzZXRDaGFuZ2VkXCIsZyksZz1jKFwicGFnZXNDaGFuZ2VkXCIsZyl9YS5tb2R1bGUoXCJuZ1RhYmxlXCIpLmZhY3RvcnkoXCJuZ1RhYmxlRXZlbnRzQ2hhbm5lbFwiLGIpLGIuJGluamVjdD1bXCIkcm9vdFNjb3BlXCJdfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Z1bmN0aW9uIGIoKXtjKCl9ZnVuY3Rpb24gYygpe2Y9Z31mdW5jdGlvbiBkKGIpe3ZhciBjPWEuZXh0ZW5kKHt9LGYsYik7Yy5hbGlhc1VybHM9YS5leHRlbmQoe30sZi5hbGlhc1VybHMsYi5hbGlhc1VybHMpLGY9Y31mdW5jdGlvbiBlKCl7ZnVuY3Rpb24gYihhLGIpe3JldHVybi0xIT09YS5pbmRleE9mKFwiL1wiKT9hOmUuZ2V0VXJsRm9yQWxpYXMoYSxiKX1mdW5jdGlvbiBjKGEpe3JldHVybiBmLmFsaWFzVXJsc1thXXx8Zi5kZWZhdWx0QmFzZVVybCthK2YuZGVmYXVsdEV4dH12YXIgZCxlPXtjb25maWc6ZCxnZXRUZW1wbGF0ZVVybDpiLGdldFVybEZvckFsaWFzOmN9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNvbmZpZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZD1kfHxhLmNvcHkoZil9LGVudW1lcmFibGU6ITB9KSxlfXZhciBmLGc9e2RlZmF1bHRCYXNlVXJsOlwibmctdGFibGUvZmlsdGVycy9cIixkZWZhdWx0RXh0OlwiLmh0bWxcIixhbGlhc1VybHM6e319O3RoaXMuJGdldD1lLHRoaXMucmVzZXRDb25maWdzPWMsdGhpcy5zZXRDb25maWc9ZCxiKCksZS4kaW5qZWN0PVtdfWEubW9kdWxlKFwibmdUYWJsZVwiKS5wcm92aWRlcihcIm5nVGFibGVGaWx0ZXJDb25maWdcIixiKSxiLiRpbmplY3Q9W119KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7ZnVuY3Rpb24gYShhKXtmdW5jdGlvbiBjKGMsZCl7aWYobnVsbD09YylyZXR1cm5bXTt2YXIgZT1kLmhhc0ZpbHRlcigpP2EoYi5maWx0ZXJGaWx0ZXJOYW1lKShjLGQuZmlsdGVyKCEwKSk6YyxmPWQub3JkZXJCeSgpLGc9Zi5sZW5ndGg/YShiLnNvcnRpbmdGaWx0ZXJOYW1lKShlLGYpOmUsaD1nLnNsaWNlKChkLnBhZ2UoKS0xKSpkLmNvdW50KCksZC5wYWdlKCkqZC5jb3VudCgpKTtyZXR1cm4gZC50b3RhbChnLmxlbmd0aCksaH1yZXR1cm4gY312YXIgYj10aGlzO2IuJGdldD1hLGIuZmlsdGVyRmlsdGVyTmFtZT1cImZpbHRlclwiLGIuc29ydGluZ0ZpbHRlck5hbWU9XCJvcmRlckJ5XCIsYS4kaW5qZWN0PVtcIiRmaWx0ZXJcIl19YS5tb2R1bGUoXCJuZ1RhYmxlXCIpLnByb3ZpZGVyKFwibmdUYWJsZURlZmF1bHRHZXREYXRhXCIsYiksYi4kaW5qZWN0PVtdfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtmdW5jdGlvbiBiKGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBjPWEuZGVmZXIoKSxkPWIuYXBwbHkodGhpcyxbY10uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtyZXR1cm4gZHx8KGQ9Yy5wcm9taXNlKSxkfX1yZXR1cm4gYn1hLm1vZHVsZShcIm5nVGFibGVcIikuZmFjdG9yeShcIm5nVGFibGVHZXREYXRhQmNTaGltXCIsYiksYi4kaW5qZWN0PVtcIiRxXCJdfSgpLGIudmFsdWUoXCJuZ1RhYmxlRGVmYXVsdHNcIix7cGFyYW1zOnt9LHNldHRpbmdzOnt9fSksYi5mYWN0b3J5KFwiTmdUYWJsZVBhcmFtc1wiLFtcIiRxXCIsXCIkbG9nXCIsXCJuZ1RhYmxlRGVmYXVsdHNcIixcIm5nVGFibGVHZXREYXRhQmNTaGltXCIsXCJuZ1RhYmxlRGVmYXVsdEdldERhdGFcIixcIm5nVGFibGVFdmVudHNDaGFubmVsXCIsZnVuY3Rpb24oYixjLGQsZSxmLGcpe3ZhciBoPWZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGEpKSYmaXNGaW5pdGUoYSl9LGk9ZnVuY3Rpb24oaSxqKXtmdW5jdGlvbiBrKCl7dmFyIGE9cy5nZXREYXRhRm5BZGFwdG9yKHMuZ2V0RGF0YSk7cmV0dXJuIGIud2hlbihhLmNhbGwocyxvKSl9ZnVuY3Rpb24gbCgpe3ZhciBhPXMuZ2V0R3JvdXBzRm5BZGFwdG9yKHMuZ2V0R3JvdXBzKTtyZXR1cm4gYi53aGVuKGEuY2FsbChzLHMuZ3JvdXBCeSxvKSl9ZnVuY3Rpb24gbShhKXt2YXIgYz1zLmludGVyY2VwdG9yc3x8W107cmV0dXJuIGMucmVkdWNlKGZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yy5yZXNwb25zZSYmYy5yZXNwb25zZS5iaW5kKGMpfHxiLndoZW4sZT1jLnJlc3BvbnNlRXJyb3ImJmMucmVzcG9uc2VFcnJvci5iaW5kKGMpfHxiLnJlamVjdDtyZXR1cm4gYS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBkKGEsbyl9LGZ1bmN0aW9uKGEpe3JldHVybiBlKGEsbyl9KX0sYSgpKX1cImJvb2xlYW5cIj09dHlwZW9mIGkmJih0aGlzLmlzTnVsbEluc3RhbmNlPSEwKTt2YXIgbixvPXRoaXMscD0hMSxxPWZ1bmN0aW9uKCl7cy5kZWJ1Z01vZGUmJmMuZGVidWcmJmMuZGVidWcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0aGlzLmRhdGE9W10sdGhpcy5wYXJhbWV0ZXJzPWZ1bmN0aW9uKGIsYyl7aWYoYz1jfHwhMSxhLmlzRGVmaW5lZChiKSl7Zm9yKHZhciBkIGluIGIpe3ZhciBlPWJbZF07aWYoYyYmZC5pbmRleE9mKFwiW1wiKT49MCl7Zm9yKHZhciBmPWQuc3BsaXQoL1xcWyguKilcXF0vKS5yZXZlcnNlKCksZz1cIlwiLGk9MCxqPWYubGVuZ3RoO2o+aTtpKyspe3ZhciBrPWZbaV07aWYoXCJcIiE9PWspe3ZhciBsPWU7ZT17fSxlW2c9a109aChsKT9wYXJzZUZsb2F0KGwpOmx9fVwic29ydGluZ1wiPT09ZyYmKHJbZ109e30pLHJbZ109YS5leHRlbmQocltnXXx8e30sZVtnXSl9ZWxzZSByW2RdPWgoYltkXSk/cGFyc2VGbG9hdChiW2RdKTpiW2RdfXJldHVybiBxKFwibmdUYWJsZTogc2V0IHBhcmFtZXRlcnNcIixyKSx0aGlzfXJldHVybiByfSx0aGlzLnNldHRpbmdzPWZ1bmN0aW9uKGIpe2lmKGEuaXNEZWZpbmVkKGIpKXthLmlzQXJyYXkoYi5kYXRhKSYmKGIudG90YWw9Yi5kYXRhLmxlbmd0aCksYi5nZXREYXRhJiZiLmdldERhdGEubGVuZ3RoPjEmJihiLmdldERhdGFGbkFkYXB0b3I9ZSksYi5nZXRHcm91cHMmJmIuZ2V0R3JvdXBzLmxlbmd0aD4yJiYoYi5nZXRHcm91cHNGbkFkYXB0b3I9ZSk7dmFyIGM9cy5kYXRhO3M9YS5leHRlbmQocyxiKTt2YXIgZD1iLmhhc093blByb3BlcnR5KFwiZGF0YVwiKSYmYi5kYXRhIT1jO3JldHVybiBkJiYocCYmdGhpcy5wYWdlKDEpLHA9ITEsZy5wdWJsaXNoRGF0YXNldENoYW5nZWQodGhpcyxiLmRhdGEsYykpLHEoXCJuZ1RhYmxlOiBzZXQgc2V0dGluZ3NcIixzKSx0aGlzfXJldHVybiBzfSx0aGlzLnBhZ2U9ZnVuY3Rpb24oYil7cmV0dXJuIGEuaXNEZWZpbmVkKGIpP3RoaXMucGFyYW1ldGVycyh7cGFnZTpifSk6ci5wYWdlfSx0aGlzLnRvdGFsPWZ1bmN0aW9uKGIpe3JldHVybiBhLmlzRGVmaW5lZChiKT90aGlzLnNldHRpbmdzKHt0b3RhbDpifSk6cy50b3RhbH0sdGhpcy5jb3VudD1mdW5jdGlvbihiKXtyZXR1cm4gYS5pc0RlZmluZWQoYik/dGhpcy5wYXJhbWV0ZXJzKHtjb3VudDpiLHBhZ2U6MX0pOnIuY291bnR9LHRoaXMuZmlsdGVyPWZ1bmN0aW9uKGIpe2lmKGEuaXNEZWZpbmVkKGIpJiZhLmlzT2JqZWN0KGIpKXJldHVybiB0aGlzLnBhcmFtZXRlcnMoe2ZpbHRlcjpiLHBhZ2U6MX0pO2lmKGI9PT0hMCl7Zm9yKHZhciBjPU9iamVjdC5rZXlzKHIuZmlsdGVyKSxkPXt9LGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9ci5maWx0ZXJbY1tlXV07bnVsbCE9ZiYmXCJcIiE9PWYmJihkW2NbZV1dPWYpfXJldHVybiBkfXJldHVybiByLmZpbHRlcn0sdGhpcy5zb3J0aW5nPWZ1bmN0aW9uKGIpe2lmKDI9PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBjPXt9O3JldHVybiBjW2JdPWFyZ3VtZW50c1sxXSx0aGlzLnBhcmFtZXRlcnMoe3NvcnRpbmc6Y30pLHRoaXN9cmV0dXJuIGEuaXNEZWZpbmVkKGIpP3RoaXMucGFyYW1ldGVycyh7c29ydGluZzpifSk6ci5zb3J0aW5nfSx0aGlzLmlzU29ydEJ5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHZvaWQgMCE9PWM/YS5pc0RlZmluZWQoci5zb3J0aW5nW2JdKSYmci5zb3J0aW5nW2JdPT1jOmEuaXNEZWZpbmVkKHIuc29ydGluZ1tiXSl9LHRoaXMub3JkZXJCeT1mdW5jdGlvbigpe3ZhciBhPVtdO2Zvcih2YXIgYiBpbiByLnNvcnRpbmcpYS5wdXNoKChcImFzY1wiPT09ci5zb3J0aW5nW2JdP1wiK1wiOlwiLVwiKStiKTtyZXR1cm4gYX0sdGhpcy5nZXREYXRhPWZ1bmN0aW9uKGEpe3JldHVybiBmKHRoaXMuZGF0YSxhKX0sdGhpcy5nZXRHcm91cHM9ZnVuY3Rpb24oYil7cmV0dXJuIGsoKS50aGVuKGZ1bmN0aW9uKGMpe3ZhciBkPXt9O2EuZm9yRWFjaChjLGZ1bmN0aW9uKGMpe3ZhciBlPWEuaXNGdW5jdGlvbihiKT9iKGMpOmNbYl07ZFtlXT1kW2VdfHx7ZGF0YTpbXX0sZFtlXS52YWx1ZT1lLGRbZV0uZGF0YS5wdXNoKGMpfSk7dmFyIGU9W107Zm9yKHZhciBmIGluIGQpZS5wdXNoKGRbZl0pO3JldHVybiBxKFwibmdUYWJsZTogcmVmcmVzaCBncm91cHNcIixlKSxlfSl9LHRoaXMuZ2VuZXJhdGVQYWdlc0FycmF5PWZ1bmN0aW9uKGEsYixjLGQpe2FyZ3VtZW50cy5sZW5ndGh8fChhPXRoaXMucGFnZSgpLGI9dGhpcy50b3RhbCgpLGM9dGhpcy5jb3VudCgpKTt2YXIgZSxmLGcsaCxpO2lmKGQ9ZCYmNj5kPzY6ZCxpPVtdLGg9TWF0aC5jZWlsKGIvYyksaD4xKXtpLnB1c2goe3R5cGU6XCJwcmV2XCIsbnVtYmVyOk1hdGgubWF4KDEsYS0xKSxhY3RpdmU6YT4xfSksaS5wdXNoKHt0eXBlOlwiZmlyc3RcIixudW1iZXI6MSxhY3RpdmU6YT4xLGN1cnJlbnQ6MT09PWF9KSxmPU1hdGgucm91bmQoKHMucGFnaW5hdGlvbk1heEJsb2Nrcy1zLnBhZ2luYXRpb25NaW5CbG9ja3MpLzIpLGc9TWF0aC5tYXgoMixhLWYpLGU9TWF0aC5taW4oaC0xLGErMipmLShhLWcpKSxnPU1hdGgubWF4KDIsZy0oMipmLShlLWcpKSk7Zm9yKHZhciBqPWc7ZT49ajspaS5wdXNoKGo9PT1nJiYyIT09anx8aj09PWUmJmohPT1oLTE/e3R5cGU6XCJtb3JlXCIsYWN0aXZlOiExfTp7dHlwZTpcInBhZ2VcIixudW1iZXI6aixhY3RpdmU6YSE9PWosY3VycmVudDphPT09an0pLGorKztpLnB1c2goe3R5cGU6XCJsYXN0XCIsbnVtYmVyOmgsYWN0aXZlOmEhPT1oLGN1cnJlbnQ6YT09PWh9KSxpLnB1c2goe3R5cGU6XCJuZXh0XCIsbnVtYmVyOk1hdGgubWluKGgsYSsxKSxhY3RpdmU6aD5hfSl9cmV0dXJuIGl9LHRoaXMuaXNEYXRhUmVsb2FkUmVxdWlyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hcHx8IWEuZXF1YWxzKHIsbil9LHRoaXMuaGFzRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKCEwKSkubGVuZ3RoPjB9LHRoaXMuaGFzRmlsdGVyQ2hhbmdlcz1mdW5jdGlvbigpe3JldHVybiFhLmVxdWFscyhyJiZyLmZpbHRlcixuJiZuLmZpbHRlcil9LHRoaXMudXJsPWZ1bmN0aW9uKGIpe2I9Ynx8ITE7dmFyIGM9Yj9bXTp7fTtmb3IodmFyIGQgaW4gcilpZihyLmhhc093blByb3BlcnR5KGQpKXt2YXIgZT1yW2RdLGY9ZW5jb2RlVVJJQ29tcG9uZW50KGQpO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBlKXtmb3IodmFyIGcgaW4gZSlpZighYS5pc1VuZGVmaW5lZChlW2ddKSYmXCJcIiE9PWVbZ10pe3ZhciBoPWYrXCJbXCIrZW5jb2RlVVJJQ29tcG9uZW50KGcpK1wiXVwiO2I/Yy5wdXNoKGgrXCI9XCIrZVtnXSk6Y1toXT1lW2ddfX1lbHNlIGEuaXNGdW5jdGlvbihlKXx8YS5pc1VuZGVmaW5lZChlKXx8XCJcIj09PWV8fChiP2MucHVzaChmK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChlKSk6Y1tmXT1lbmNvZGVVUklDb21wb25lbnQoZSkpfXJldHVybiBjfSx0aGlzLnJlbG9hZD1mdW5jdGlvbigpe3ZhciBjPXRoaXMsZD1udWxsO3MuJGxvYWRpbmc9ITAsbj1hLmNvcHkocikscD0hMCxkPW0ocy5ncm91cEJ5P2w6aykscShcIm5nVGFibGU6IHJlbG9hZCBkYXRhXCIpO3ZhciBlPWMuZGF0YTtyZXR1cm4gZC50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBzLiRsb2FkaW5nPSExLGMuZGF0YT1hLGcucHVibGlzaEFmdGVyUmVsb2FkRGF0YShjLGEsZSksYy5yZWxvYWRQYWdlcygpLHMuJHNjb3BlJiZzLiRzY29wZS4kZW1pdChcIm5nVGFibGVBZnRlclJlbG9hZERhdGFcIiksYX0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24oYSl7cmV0dXJuIG49bnVsbCxwPSExLGIucmVqZWN0KGEpfSl9LHRoaXMucmVsb2FkUGFnZXM9ZnVuY3Rpb24oKXt2YXIgYjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1iLGQ9by5nZW5lcmF0ZVBhZ2VzQXJyYXkoby5wYWdlKCksby50b3RhbCgpLG8uY291bnQoKSk7YS5lcXVhbHMoYyxkKXx8KGI9ZCxnLnB1Ymxpc2hQYWdlc0NoYW5nZWQodGhpcyxkLGMpKX19KCk7dmFyIHI9e3BhZ2U6MSxjb3VudDoxLGZpbHRlcjp7fSxzb3J0aW5nOnt9LGdyb3VwOnt9LGdyb3VwQnk6bnVsbH07YS5leHRlbmQocixkLnBhcmFtcyk7dmFyIHM9eyRzY29wZTpudWxsLCRsb2FkaW5nOiExLGRhdGE6bnVsbCx0b3RhbDowLGRlZmF1bHRTb3J0OlwiZGVzY1wiLGZpbHRlckRlbGF5Ojc1MCxjb3VudHM6WzEwLDI1LDUwLDEwMF0saW50ZXJjZXB0b3JzOltdLHBhZ2luYXRpb25NYXhCbG9ja3M6MTEscGFnaW5hdGlvbk1pbkJsb2Nrczo1LHNvcnRpbmdJbmRpY2F0b3I6XCJzcGFuXCIsZ2V0RGF0YUZuQWRhcHRvcjphLmlkZW50aXR5LGdldEdyb3Vwc0ZuQWRhcHRvcjphLmlkZW50aXR5LGdldEdyb3Vwczp0aGlzLmdldEdyb3VwcyxnZXREYXRhOnRoaXMuZ2V0RGF0YX07cmV0dXJuIHRoaXMuc2V0dGluZ3MoZC5zZXR0aW5ncyksdGhpcy5zZXR0aW5ncyhqKSx0aGlzLnBhcmFtZXRlcnMoaSwhMCksZy5wdWJsaXNoQWZ0ZXJDcmVhdGVkKHRoaXMpLHRoaXN9O3JldHVybiBpfV0pLGIuZmFjdG9yeShcIm5nVGFibGVQYXJhbXNcIixbXCJOZ1RhYmxlUGFyYW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGF9XSksZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGEsYil7YS5jb25maWc9Yn1hLm1vZHVsZShcIm5nVGFibGVcIikuY29udHJvbGxlcihcIm5nVGFibGVGaWx0ZXJSb3dDb250cm9sbGVyXCIsYiksYi4kaW5qZWN0PVtcIiRzY29wZVwiLFwibmdUYWJsZUZpbHRlckNvbmZpZ1wiXX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7ZnVuY3Rpb24gYihiLGMpe3ZhciBkPWIuc29ydGFibGUmJmIuc29ydGFibGUoKTtpZihkKXt2YXIgZT1hLnBhcmFtcy5zZXR0aW5ncygpLmRlZmF1bHRTb3J0LGY9XCJhc2NcIj09PWU/XCJkZXNjXCI6XCJhc2NcIixnPWEucGFyYW1zLnNvcnRpbmcoKSYmYS5wYXJhbXMuc29ydGluZygpW2RdJiZhLnBhcmFtcy5zb3J0aW5nKClbZF09PT1lLGg9Yy5jdHJsS2V5fHxjLm1ldGFLZXk/YS5wYXJhbXMuc29ydGluZygpOnt9O2hbZF09Zz9mOmUsYS5wYXJhbXMucGFyYW1ldGVycyh7c29ydGluZzpofSl9fWEuc29ydEJ5PWJ9YS5tb2R1bGUoXCJuZ1RhYmxlXCIpLmNvbnRyb2xsZXIoXCJuZ1RhYmxlU29ydGVyUm93Q29udHJvbGxlclwiLGIpLGIuJGluamVjdD1bXCIkc2NvcGVcIl19KCksYi5jb250cm9sbGVyKFwibmdUYWJsZUNvbnRyb2xsZXJcIixbXCIkc2NvcGVcIixcIk5nVGFibGVQYXJhbXNcIixcIiR0aW1lb3V0XCIsXCIkcGFyc2VcIixcIiRjb21waWxlXCIsXCIkYXR0cnNcIixcIiRlbGVtZW50XCIsXCJuZ1RhYmxlQ29sdW1uXCIsXCJuZ1RhYmxlRXZlbnRzQ2hhbm5lbFwiLGZ1bmN0aW9uKGIsYyxkLGUsZixnLGgsaSxqKXtmdW5jdGlvbiBrKGEpe2lmKGEpe2IucGFyYW1zLnNldHRpbmdzKCkuJHNjb3BlPWI7dmFyIGM9Yi5wYXJhbXM7aWYoYy5oYXNGaWx0ZXJDaGFuZ2VzKCkpe3ZhciBkPWZ1bmN0aW9uKCl7Yy5wYWdlKDEpLGMucmVsb2FkKCl9O2Muc2V0dGluZ3MoKS5maWx0ZXJEZWxheT9tKGQsYy5zZXR0aW5ncygpLmZpbHRlckRlbGF5KTpkKCl9ZWxzZSBjLnJlbG9hZCgpfX1mdW5jdGlvbiBsKCl7ZnVuY3Rpb24gYShhLGMpe2Euc2V0dGluZ3MoKS5ncm91cEJ5P2IuJGdyb3Vwcz1jOmIuJGRhdGE9Y31mdW5jdGlvbiBjKGEsYyl7Yi5wYWdlcz1jfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGIucGFyYW1zPT09YX1qLm9uQWZ0ZXJSZWxvYWREYXRhKGEsYixkKSxqLm9uUGFnZXNDaGFuZ2VkKGMsYixkKX1iLiRmaWx0ZXJSb3c9e30sYi4kbG9hZGluZz0hMSxiLmhhc093blByb3BlcnR5KFwicGFyYW1zXCIpfHwoYi5wYXJhbXM9bmV3IGMoITApKSxiLnBhcmFtcy5zZXR0aW5ncygpLiRzY29wZT1iO3ZhciBtPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYixjKXtkLmNhbmNlbChhKSxhPWQoYixjKX19KCk7Yi4kd2F0Y2goXCJwYXJhbXNcIixmdW5jdGlvbihhLGIpe2EhPT1iJiZhJiZhLnJlbG9hZCgpfSwhMSksYi4kd2F0Y2goXCJwYXJhbXMuaXNEYXRhUmVsb2FkUmVxdWlyZWQoKVwiLGspLHRoaXMuY29tcGlsZURpcmVjdGl2ZVRlbXBsYXRlcz1mdW5jdGlvbigpe2lmKCFoLmhhc0NsYXNzKFwibmctdGFibGVcIikpe2IudGVtcGxhdGVzPXtoZWFkZXI6Zy50ZW1wbGF0ZUhlYWRlcj9nLnRlbXBsYXRlSGVhZGVyOlwibmctdGFibGUvaGVhZGVyLmh0bWxcIixwYWdpbmF0aW9uOmcudGVtcGxhdGVQYWdpbmF0aW9uP2cudGVtcGxhdGVQYWdpbmF0aW9uOlwibmctdGFibGUvcGFnZXIuaHRtbFwifSxoLmFkZENsYXNzKFwibmctdGFibGVcIik7dmFyIGM9bnVsbCxkPSExO2EuZm9yRWFjaChoLmNoaWxkcmVuKCksZnVuY3Rpb24oYSl7XCJUSEVBRFwiPT09YS50YWdOYW1lJiYoZD0hMCl9KSxkfHwoYz1hLmVsZW1lbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRoZWFkXCIpKS5hdHRyKFwibmctaW5jbHVkZVwiLFwidGVtcGxhdGVzLmhlYWRlclwiKSxoLnByZXBlbmQoYykpO3ZhciBlPWEuZWxlbWVudChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5hdHRyKHtcIm5nLXRhYmxlLXBhZ2luYXRpb25cIjpcInBhcmFtc1wiLFwidGVtcGxhdGUtdXJsXCI6XCJ0ZW1wbGF0ZXMucGFnaW5hdGlvblwifSk7aC5hZnRlcihlKSxjJiZmKGMpKGIpLGYoZSkoYil9fSx0aGlzLmxvYWRGaWx0ZXJEYXRhPWZ1bmN0aW9uKGMpe2EuZm9yRWFjaChjLGZ1bmN0aW9uKGMpe3ZhciBkO3JldHVybiBkPWMuZmlsdGVyRGF0YShiLHskY29sdW1uOmN9KSxkP2EuaXNPYmplY3QoZCkmJmEuaXNPYmplY3QoZC5wcm9taXNlKT8oZGVsZXRlIGMuZmlsdGVyRGF0YSxkLnByb21pc2UudGhlbihmdW5jdGlvbihiKXthLmlzQXJyYXkoYil8fGEuaXNGdW5jdGlvbihiKXx8YS5pc09iamVjdChiKT9hLmlzQXJyYXkoYikmJmIudW5zaGlmdCh7dGl0bGU6XCJcIixpZDpcIlwifSk6Yj1bXSxjLmRhdGE9Yn0pKTpjLmRhdGE9ZDp2b2lkIGRlbGV0ZSBjLmZpbHRlckRhdGF9KX0sdGhpcy5idWlsZENvbHVtbnM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBpLmJ1aWxkQ29sdW1uKGEsYil9KX0sdGhpcy5wYXJzZU5nVGFibGVEeW5hbWljRXhwcj1mdW5jdGlvbihhKXtpZighYXx8YS5pbmRleE9mKFwiIHdpdGggXCIpPi0xKXt2YXIgYj1hLnNwbGl0KC9cXHMrd2l0aFxccysvKTtyZXR1cm57dGFibGVQYXJhbXM6YlswXSxjb2x1bW5zOmJbMV19fXRocm93IG5ldyBFcnJvcihcIlBhcnNlIGVycm9yIChleHBlY3RlZCBleGFtcGxlOiBuZy10YWJsZS1keW5hbWljPSd0YWJsZVBhcmFtcyB3aXRoIGNvbHMnKVwiKX0sdGhpcy5zZXR1cEJpbmRpbmdzVG9JbnRlcm5hbFNjb3BlPWZ1bmN0aW9uKGMpe3ZhciBkPWUoYyk7Yi4kd2F0Y2goZCxmdW5jdGlvbihjKXthLmlzVW5kZWZpbmVkKGMpfHwoYi5wYXJhbXNNb2RlbD1kLGIucGFyYW1zPWMpfSwhMSksZy5zaG93RmlsdGVyJiZiLiRwYXJlbnQuJHdhdGNoKGcuc2hvd0ZpbHRlcixmdW5jdGlvbihhKXtiLnNob3dfZmlsdGVyPWF9KSxnLmRpc2FibGVGaWx0ZXImJmIuJHBhcmVudC4kd2F0Y2goZy5kaXNhYmxlRmlsdGVyLGZ1bmN0aW9uKGEpe2IuJGZpbHRlclJvdy5kaXNhYmxlZD1hfSl9LGwoKX1dKSxiLmZhY3RvcnkoXCJuZ1RhYmxlQ29sdW1uXCIsW2Z1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGQpe3ZhciBlPU9iamVjdC5jcmVhdGUoYik7Zm9yKHZhciBmIGluIGMpdm9pZCAwPT09ZVtmXSYmKGVbZl09Y1tmXSksYS5pc0Z1bmN0aW9uKGVbZl0pfHwhZnVuY3Rpb24oYSl7ZVthXT1mdW5jdGlvbigpe3JldHVybiBiW2FdfX0oZiksZnVuY3Rpb24oYSl7dmFyIGM9ZVthXTtlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP2MuY2FsbChiLGQpOmMuYXBwbHkoYixhcmd1bWVudHMpfX0oZik7cmV0dXJuIGV9dmFyIGM9e1wiY2xhc3NcIjpmdW5jdGlvbigpe3JldHVyblwiXCJ9LGZpbHRlcjpmdW5jdGlvbigpe3JldHVybiExfSxmaWx0ZXJEYXRhOmEubm9vcCxoZWFkZXJUZW1wbGF0ZVVSTDpmdW5jdGlvbigpe3JldHVybiExfSxoZWFkZXJUaXRsZTpmdW5jdGlvbigpe3JldHVyblwiXCJ9LHNvcnRhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdGl0bGU6ZnVuY3Rpb24oKXtyZXR1cm5cIlwifSx0aXRsZUFsdDpmdW5jdGlvbigpe3JldHVyblwiXCJ9fTtyZXR1cm57YnVpbGRDb2x1bW46Yn19XSksYi5kaXJlY3RpdmUoXCJuZ1RhYmxlXCIsW1wiJHFcIixcIiRwYXJzZVwiLGZ1bmN0aW9uKGIsYyl7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLHByaW9yaXR5OjEwMDEsc2NvcGU6ITAsY29udHJvbGxlcjpcIm5nVGFibGVDb250cm9sbGVyXCIsY29tcGlsZTpmdW5jdGlvbihiKXt2YXIgZD1bXSxlPTAsZj1udWxsO3JldHVybiBhLmZvckVhY2goYS5lbGVtZW50KGIuZmluZChcInRyXCIpKSxmdW5jdGlvbihiKXtiPWEuZWxlbWVudChiKSxiLmhhc0NsYXNzKFwibmctdGFibGUtZ3JvdXBcIil8fGZ8fChmPWIpfSksZj8oYS5mb3JFYWNoKGYuZmluZChcInRkXCIpLGZ1bmN0aW9uKGIpe3ZhciBmPWEuZWxlbWVudChiKTtpZighZi5hdHRyKFwiaWdub3JlLWNlbGxcIil8fFwidHJ1ZVwiIT09Zi5hdHRyKFwiaWdub3JlLWNlbGxcIikpe3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiBmLmF0dHIoXCJ4LWRhdGEtXCIrYSl8fGYuYXR0cihcImRhdGEtXCIrYSl8fGYuYXR0cihhKX0saD1mdW5jdGlvbihiKXt2YXIgZT1nKGIpO3JldHVybiBlP2Z1bmN0aW9uKGIsZil7cmV0dXJuIGMoZSkoYixhLmV4dGVuZChmfHx7fSx7JGNvbHVtbnM6ZH0pKX06dm9pZCAwfSxpPWcoXCJ0aXRsZS1hbHRcIil8fGcoXCJ0aXRsZVwiKTtpJiZmLmF0dHIoXCJkYXRhLXRpdGxlLXRleHRcIixcInt7XCIraStcIn19XCIpLGQucHVzaCh7aWQ6ZSsrLHRpdGxlOmgoXCJ0aXRsZVwiKSx0aXRsZUFsdDpoKFwidGl0bGUtYWx0XCIpLGhlYWRlclRpdGxlOmgoXCJoZWFkZXItdGl0bGVcIiksc29ydGFibGU6aChcInNvcnRhYmxlXCIpLFwiY2xhc3NcIjpoKFwiaGVhZGVyLWNsYXNzXCIpLGZpbHRlcjpoKFwiZmlsdGVyXCIpLGhlYWRlclRlbXBsYXRlVVJMOmgoXCJoZWFkZXJcIiksZmlsdGVyRGF0YTpoKFwiZmlsdGVyLWRhdGFcIiksc2hvdzpmLmF0dHIoXCJuZy1pZlwiKT9mdW5jdGlvbihhKXtyZXR1cm4gYyhmLmF0dHIoXCJuZy1pZlwiKSkoYSl9OnZvaWQgMH0pfX0pLGZ1bmN0aW9uKGEsYixjLGUpe2EuJGNvbHVtbnM9ZD1lLmJ1aWxkQ29sdW1ucyhkKSxlLnNldHVwQmluZGluZ3NUb0ludGVybmFsU2NvcGUoYy5uZ1RhYmxlKSxlLmxvYWRGaWx0ZXJEYXRhKGQpLGUuY29tcGlsZURpcmVjdGl2ZVRlbXBsYXRlcygpfSk6dm9pZCAwfX19XSksYi5kaXJlY3RpdmUoXCJuZ1RhYmxlRHluYW1pY1wiLFtcIiRwYXJzZVwiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLHByaW9yaXR5OjEwMDEsc2NvcGU6ITAsY29udHJvbGxlcjpcIm5nVGFibGVDb250cm9sbGVyXCIsY29tcGlsZTpmdW5jdGlvbihiKXt2YXIgYztyZXR1cm4gYS5mb3JFYWNoKGEuZWxlbWVudChiLmZpbmQoXCJ0clwiKSksZnVuY3Rpb24oYil7Yj1hLmVsZW1lbnQoYiksYi5oYXNDbGFzcyhcIm5nLXRhYmxlLWdyb3VwXCIpfHxjfHwoYz1iKX0pLGM/KGEuZm9yRWFjaChjLmZpbmQoXCJ0ZFwiKSxmdW5jdGlvbihiKXt2YXIgYz1hLmVsZW1lbnQoYiksZD1mdW5jdGlvbihhKXtyZXR1cm4gYy5hdHRyKFwieC1kYXRhLVwiK2EpfHxjLmF0dHIoXCJkYXRhLVwiK2EpfHxjLmF0dHIoYSl9LGU9ZChcInRpdGxlXCIpO2V8fGMuYXR0cihcImRhdGEtdGl0bGUtdGV4dFwiLFwie3skY29sdW1uc1skaW5kZXhdLnRpdGxlQWx0KHRoaXMpIHx8ICRjb2x1bW5zWyRpbmRleF0udGl0bGUodGhpcyl9fVwiKTt2YXIgZj1jLmF0dHIoXCJuZy1pZlwiKTtmfHxjLmF0dHIoXCJuZy1pZlwiLFwiJGNvbHVtbnNbJGluZGV4XS5zaG93KHRoaXMpXCIpfSksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZC5wYXJzZU5nVGFibGVEeW5hbWljRXhwcihjLm5nVGFibGVEeW5hbWljKTtkLnNldHVwQmluZGluZ3NUb0ludGVybmFsU2NvcGUoZS50YWJsZVBhcmFtcyksZC5jb21waWxlRGlyZWN0aXZlVGVtcGxhdGVzKCksYS4kd2F0Y2hDb2xsZWN0aW9uKGUuY29sdW1ucyxmdW5jdGlvbihiKXthLiRjb2x1bW5zPWQuYnVpbGRDb2x1bW5zKGIpLGQubG9hZEZpbHRlckRhdGEoYS4kY29sdW1ucyl9KX0pOnZvaWQgMH19fV0pLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe3ZhciBhPXtyZXN0cmljdDpcIkVcIixyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOlwibmctdGFibGUvZmlsdGVyUm93Lmh0bWxcIixzY29wZTohMCxjb250cm9sbGVyOlwibmdUYWJsZUZpbHRlclJvd0NvbnRyb2xsZXJcIn07cmV0dXJuIGF9YS5tb2R1bGUoXCJuZ1RhYmxlXCIpLmRpcmVjdGl2ZShcIm5nVGFibGVGaWx0ZXJSb3dcIixiKSxiLiRpbmplY3Q9W119KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dmFyIGE9e3Jlc3RyaWN0OlwiRVwiLHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6XCJuZy10YWJsZS9zb3J0ZXJSb3cuaHRtbFwiLHNjb3BlOiEwLGNvbnRyb2xsZXI6XCJuZ1RhYmxlU29ydGVyUm93Q29udHJvbGxlclwifTtyZXR1cm4gYX1hLm1vZHVsZShcIm5nVGFibGVcIikuZGlyZWN0aXZlKFwibmdUYWJsZVNvcnRlclJvd1wiLGIpLGIuJGluamVjdD1bXX0oKSxiLmRpcmVjdGl2ZShcIm5nVGFibGVQYWdpbmF0aW9uXCIsW1wiJGNvbXBpbGVcIixcIm5nVGFibGVFdmVudHNDaGFubmVsXCIsZnVuY3Rpb24oYixjKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIsc2NvcGU6e3BhcmFtczpcIj1uZ1RhYmxlUGFnaW5hdGlvblwiLHRlbXBsYXRlVXJsOlwiPVwifSxyZXBsYWNlOiExLGxpbms6ZnVuY3Rpb24oZCxlKXtjLm9uQWZ0ZXJSZWxvYWREYXRhKGZ1bmN0aW9uKGEpe2QucGFnZXM9YS5nZW5lcmF0ZVBhZ2VzQXJyYXkoKX0sZCxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWQucGFyYW1zfSksZC4kd2F0Y2goXCJ0ZW1wbGF0ZVVybFwiLGZ1bmN0aW9uKGMpe2lmKCFhLmlzVW5kZWZpbmVkKGMpKXt2YXIgZj1hLmVsZW1lbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7Zi5hdHRyKHtcIm5nLWluY2x1ZGVcIjpcInRlbXBsYXRlVXJsXCJ9KSxlLmFwcGVuZChmKSxiKGYpKGQpfX0pfX19XSksYS5tb2R1bGUoXCJuZ1RhYmxlXCIpLnJ1bihbXCIkdGVtcGxhdGVDYWNoZVwiLGZ1bmN0aW9uKGEpe2EucHV0KFwibmctdGFibGUvZmlsdGVyUm93Lmh0bWxcIiwnPHRyIG5nLXNob3c9XCJzaG93X2ZpbHRlclwiIGNsYXNzPVwibmctdGFibGUtZmlsdGVyc1wiPiA8dGggZGF0YS10aXRsZS10ZXh0PVwie3skY29sdW1uLnRpdGxlQWx0KHRoaXMpIHx8ICRjb2x1bW4udGl0bGUodGhpcyl9fVwiIG5nLXJlcGVhdD1cIiRjb2x1bW4gaW4gJGNvbHVtbnNcIiBuZy1pZj1cIiRjb2x1bW4uc2hvdyh0aGlzKVwiIGNsYXNzPVwiZmlsdGVyXCI+IDxkaXYgbmctcmVwZWF0PVwiKG5hbWUsIGZpbHRlcikgaW4gJGNvbHVtbi5maWx0ZXIodGhpcylcIj4gPGRpdiBuZy1pbmNsdWRlPVwiY29uZmlnLmdldFRlbXBsYXRlVXJsKGZpbHRlcilcIj48L2Rpdj4gPC9kaXY+IDwvdGg+IDwvdHI+ICcpLGEucHV0KFwibmctdGFibGUvZmlsdGVycy9udW1iZXIuaHRtbFwiLCc8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5hbWU9XCJ7e25hbWV9fVwiIG5nLWRpc2FibGVkPVwiJGZpbHRlclJvdy5kaXNhYmxlZFwiIG5nLW1vZGVsPVwicGFyYW1zLmZpbHRlcigpW25hbWVdXCIgY2xhc3M9XCJpbnB1dC1maWx0ZXIgZm9ybS1jb250cm9sXCIvPiAnKSxhLnB1dChcIm5nLXRhYmxlL2ZpbHRlcnMvc2VsZWN0LW11bHRpcGxlLmh0bWxcIiwnPHNlbGVjdCBuZy1vcHRpb25zPVwiZGF0YS5pZCBhcyBkYXRhLnRpdGxlIGZvciBkYXRhIGluICRjb2x1bW4uZGF0YVwiIG5nLWRpc2FibGVkPVwiJGZpbHRlclJvdy5kaXNhYmxlZFwiIG11bHRpcGxlIG5nLW11bHRpcGxlPVwidHJ1ZVwiIG5nLW1vZGVsPVwicGFyYW1zLmZpbHRlcigpW25hbWVdXCIgY2xhc3M9XCJmaWx0ZXIgZmlsdGVyLXNlbGVjdC1tdWx0aXBsZSBmb3JtLWNvbnRyb2xcIiBuYW1lPVwie3tuYW1lfX1cIj4gPC9zZWxlY3Q+ICcpLGEucHV0KFwibmctdGFibGUvZmlsdGVycy9zZWxlY3QuaHRtbFwiLCc8c2VsZWN0IG5nLW9wdGlvbnM9XCJkYXRhLmlkIGFzIGRhdGEudGl0bGUgZm9yIGRhdGEgaW4gJGNvbHVtbi5kYXRhXCIgbmctZGlzYWJsZWQ9XCIkZmlsdGVyUm93LmRpc2FibGVkXCIgbmctbW9kZWw9XCJwYXJhbXMuZmlsdGVyKClbbmFtZV1cIiBjbGFzcz1cImZpbHRlciBmaWx0ZXItc2VsZWN0IGZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e25hbWV9fVwiPiA8b3B0aW9uIHN0eWxlPVwiZGlzcGxheTpub25lXCIgdmFsdWU9XCJcIj48L29wdGlvbj4gPC9zZWxlY3Q+ICcpLGEucHV0KFwibmctdGFibGUvZmlsdGVycy90ZXh0Lmh0bWxcIiwnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInt7bmFtZX19XCIgbmctZGlzYWJsZWQ9XCIkZmlsdGVyUm93LmRpc2FibGVkXCIgbmctbW9kZWw9XCJwYXJhbXMuZmlsdGVyKClbbmFtZV1cIiBjbGFzcz1cImlucHV0LWZpbHRlciBmb3JtLWNvbnRyb2xcIi8+ICcpLGEucHV0KFwibmctdGFibGUvaGVhZGVyLmh0bWxcIixcIjxuZy10YWJsZS1zb3J0ZXItcm93PjwvbmctdGFibGUtc29ydGVyLXJvdz4gPG5nLXRhYmxlLWZpbHRlci1yb3c+PC9uZy10YWJsZS1maWx0ZXItcm93PiBcIiksYS5wdXQoXCJuZy10YWJsZS9wYWdlci5odG1sXCIsJzxkaXYgY2xhc3M9XCJuZy1jbG9hayBuZy10YWJsZS1wYWdlclwiIG5nLWlmPVwicGFyYW1zLmRhdGEubGVuZ3RoXCI+IDxkaXYgbmctaWY9XCJwYXJhbXMuc2V0dGluZ3MoKS5jb3VudHMubGVuZ3RoXCIgY2xhc3M9XCJuZy10YWJsZS1jb3VudHMgYnRuLWdyb3VwIHB1bGwtcmlnaHRcIj4gPGJ1dHRvbiBuZy1yZXBlYXQ9XCJjb3VudCBpbiBwYXJhbXMuc2V0dGluZ3MoKS5jb3VudHNcIiB0eXBlPVwiYnV0dG9uXCIgbmctY2xhc3M9XCJ7XFwnYWN0aXZlXFwnOnBhcmFtcy5jb3VudCgpPT1jb3VudH1cIiBuZy1jbGljaz1cInBhcmFtcy5jb3VudChjb3VudClcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiPiA8c3BhbiBuZy1iaW5kPVwiY291bnRcIj48L3NwYW4+IDwvYnV0dG9uPiA8L2Rpdj4gPHVsIGNsYXNzPVwicGFnaW5hdGlvbiBuZy10YWJsZS1wYWdpbmF0aW9uXCI+IDxsaSBuZy1jbGFzcz1cIntcXCdkaXNhYmxlZFxcJzogIXBhZ2UuYWN0aXZlICYmICFwYWdlLmN1cnJlbnQsIFxcJ2FjdGl2ZVxcJzogcGFnZS5jdXJyZW50fVwiIG5nLXJlcGVhdD1cInBhZ2UgaW4gcGFnZXNcIiBuZy1zd2l0Y2g9XCJwYWdlLnR5cGVcIj4gPGEgbmctc3dpdGNoLXdoZW49XCJwcmV2XCIgbmctY2xpY2s9XCJwYXJhbXMucGFnZShwYWdlLm51bWJlcilcIiBocmVmPVwiXCI+JmxhcXVvOzwvYT4gPGEgbmctc3dpdGNoLXdoZW49XCJmaXJzdFwiIG5nLWNsaWNrPVwicGFyYW1zLnBhZ2UocGFnZS5udW1iZXIpXCIgaHJlZj1cIlwiPjxzcGFuIG5nLWJpbmQ9XCJwYWdlLm51bWJlclwiPjwvc3Bhbj48L2E+IDxhIG5nLXN3aXRjaC13aGVuPVwicGFnZVwiIG5nLWNsaWNrPVwicGFyYW1zLnBhZ2UocGFnZS5udW1iZXIpXCIgaHJlZj1cIlwiPjxzcGFuIG5nLWJpbmQ9XCJwYWdlLm51bWJlclwiPjwvc3Bhbj48L2E+IDxhIG5nLXN3aXRjaC13aGVuPVwibW9yZVwiIG5nLWNsaWNrPVwicGFyYW1zLnBhZ2UocGFnZS5udW1iZXIpXCIgaHJlZj1cIlwiPiYjODIzMDs8L2E+IDxhIG5nLXN3aXRjaC13aGVuPVwibGFzdFwiIG5nLWNsaWNrPVwicGFyYW1zLnBhZ2UocGFnZS5udW1iZXIpXCIgaHJlZj1cIlwiPjxzcGFuIG5nLWJpbmQ9XCJwYWdlLm51bWJlclwiPjwvc3Bhbj48L2E+IDxhIG5nLXN3aXRjaC13aGVuPVwibmV4dFwiIG5nLWNsaWNrPVwicGFyYW1zLnBhZ2UocGFnZS5udW1iZXIpXCIgaHJlZj1cIlwiPiZyYXF1bzs8L2E+IDwvbGk+IDwvdWw+IDwvZGl2PiAnKSxhLnB1dChcIm5nLXRhYmxlL3NvcnRlclJvdy5odG1sXCIsJzx0cj4gPHRoIHRpdGxlPVwie3skY29sdW1uLmhlYWRlclRpdGxlKHRoaXMpfX1cIiBuZy1yZXBlYXQ9XCIkY29sdW1uIGluICRjb2x1bW5zXCIgbmctY2xhc3M9XCJ7IFxcJ3NvcnRhYmxlXFwnOiAkY29sdW1uLnNvcnRhYmxlKHRoaXMpLCBcXCdzb3J0LWFzY1xcJzogcGFyYW1zLnNvcnRpbmcoKVskY29sdW1uLnNvcnRhYmxlKHRoaXMpXT09XFwnYXNjXFwnLCBcXCdzb3J0LWRlc2NcXCc6IHBhcmFtcy5zb3J0aW5nKClbJGNvbHVtbi5zb3J0YWJsZSh0aGlzKV09PVxcJ2Rlc2NcXCcgfVwiIG5nLWNsaWNrPVwic29ydEJ5KCRjb2x1bW4sICRldmVudClcIiBuZy1pZj1cIiRjb2x1bW4uc2hvdyh0aGlzKVwiIG5nLWluaXQ9XCJ0ZW1wbGF0ZT0kY29sdW1uLmhlYWRlclRlbXBsYXRlVVJMKHRoaXMpXCIgY2xhc3M9XCJoZWFkZXIge3skY29sdW1uLmNsYXNzKHRoaXMpfX1cIj4gPGRpdiBuZy1pZj1cIiF0ZW1wbGF0ZVwiIGNsYXNzPVwibmctdGFibGUtaGVhZGVyXCIgbmctY2xhc3M9XCJ7XFwnc29ydC1pbmRpY2F0b3JcXCc6IHBhcmFtcy5zZXR0aW5ncygpLnNvcnRpbmdJbmRpY2F0b3I9PVxcJ2RpdlxcJ31cIj4gPHNwYW4gbmctYmluZD1cIiRjb2x1bW4udGl0bGUodGhpcylcIiBuZy1jbGFzcz1cIntcXCdzb3J0LWluZGljYXRvclxcJzogcGFyYW1zLnNldHRpbmdzKCkuc29ydGluZ0luZGljYXRvcj09XFwnc3BhblxcJ31cIj48L3NwYW4+IDwvZGl2PiA8ZGl2IG5nLWlmPVwidGVtcGxhdGVcIiBuZy1pbmNsdWRlPVwidGVtcGxhdGVcIj48L2Rpdj4gPC90aD4gPC90cj4gJyl9XSksYn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmctdGFibGUubWluLmpzLm1hcCIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4xLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOS0yMlQyMjozMFpcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59ICkoIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gRWRnZSA8PSAxMiAtIDEzKywgRmlyZWZveCA8PTE4IC0gNDUrLCBJRSAxMCAtIDExLCBTYWZhcmkgNS4xIC0gOSssIGlPUyA2IC0gOS4xXG4vLyB0aHJvdyBleGNlcHRpb25zIHdoZW4gbm9uLXN0cmljdCBjb2RlIChlLmcuLCBBU1AuTkVUIDQuNSkgYWNjZXNzZXMgc3RyaWN0IG1vZGVcbi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uXG4vLyBlbm91Z2ggdGhhdCBhbGwgc3VjaCBhdHRlbXB0cyBhcmUgZ3VhcmRlZCBpbiBhIHRyeSBibG9jay5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyID0gW107XG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBjb25jYXQgPSBhcnIuY29uY2F0O1xuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG5cdGZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYyApIHtcblx0XHRkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7XG5cblx0XHR2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRkb2MuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdH1cbi8qIGdsb2JhbCBTeW1ib2wgKi9cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8gZGVmaW5lIGdsb2JhbCBvbmx5IGZvciB0aGlzIG1vZHVsZVxuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjMuMS4xXCIsXG5cblx0Ly8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnlcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csXG5cblx0Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXG5cdHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZyxcblxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5cdGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7XG5cdFx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICkge1xuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXksXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fSxcblxuXHRpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHRcdC8vIHN0cmluZ3MgYW5kIG51bWJlcnMgKHByaW1pdGl2ZXMgb3Igb2JqZWN0cylcblx0XHQvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKVxuXHRcdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRcdHJldHVybiAoIHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiApICYmXG5cblx0XHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChcIlwiKVxuXHRcdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0XHQhaXNOYU4oIG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICk7XG5cdH0sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgcHJvdG8sIEN0b3I7XG5cblx0XHQvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcblx0XHQvLyBVc2UgdG9TdHJpbmcgaW5zdGVhZCBvZiBqUXVlcnkudHlwZSB0byBjYXRjaCBob3N0IG9iamVjdHNcblx0XHRpZiAoICFvYmogfHwgdG9TdHJpbmcuY2FsbCggb2JqICkgIT09IFwiW29iamVjdCBPYmplY3RdXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cHJvdG8gPSBnZXRQcm90byggb2JqICk7XG5cblx0XHQvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluXG5cdFx0aWYgKCAhcHJvdG8gKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuXHRcdEN0b3IgPSBoYXNPd24uY2FsbCggcHJvdG8sIFwiY29uc3RydWN0b3JcIiApICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cblx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjVcblx0XHR2YXIgbmFtZTtcblxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHRcdHR5cGVvZiBvYmo7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdC8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXNcblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxM1xuXHQvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5cdGNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcblx0fSxcblxuXHRub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0dHJpbTogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0cmV0dXJuIHRleHQgPT0gbnVsbCA/XG5cdFx0XHRcIlwiIDpcblx0XHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCJcIiApO1xuXHR9LFxuXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkge1xuXHRcdHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG5cdFx0aWYgKCBhcnIgIT0gbnVsbCApIHtcblx0XHRcdGlmICggaXNBcnJheUxpa2UoIE9iamVjdCggYXJyICkgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciBsZW5ndGgsIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggZWxlbXMgKSApIHtcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG5cdC8vIGFyZ3VtZW50cy5cblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0XHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdFx0Y29udGV4dCA9IGZuO1xuXHRcdFx0Zm4gPSB0bXA7XG5cdFx0fVxuXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0XHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBTaW11bGF0ZWQgYmluZFxuXHRcdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdFx0fTtcblxuXHRcdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRcdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9LFxuXG5cdG5vdzogRGF0ZS5ub3csXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0gKTtcblxuaWYgKCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdGpRdWVyeS5mblsgU3ltYm9sLml0ZXJhdG9yIF0gPSBhcnJbIFN5bWJvbC5pdGVyYXRvciBdO1xufVxuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKCBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoIFwiIFwiICksXG5mdW5jdGlvbiggaSwgbmFtZSApIHtcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cblx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGlkIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbnZhciByaXNTaW1wbGUgPSAvXi5bXjojXFxbXFwuLF0qJC87XG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIFNpbXBsZSBzZWxlY3RvciB0aGF0IGNhbiBiZSBmaWx0ZXJlZCBkaXJlY3RseSwgcmVtb3Zpbmcgbm9uLUVsZW1lbnRzXG5cdGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcblx0fVxuXG5cdC8vIENvbXBsZXggc2VsZWN0b3IsIGNvbXBhcmUgdGhlIHR3byBzZXRzLCByZW1vdmluZyBub24tRWxlbWVudHNcblx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90ICYmIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdGlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHR9ICkgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBpLCByZXQsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHNlbGYgPSB0aGlzO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0cmV0ID0gdGhpcy5wdXNoU3RhY2soIFtdICk7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIHJldCApIDogcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlICkgKTtcblx0fSxcblx0bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59ICk7XG5cblxuLy8gSW5pdGlhbGl6ZSBhIGpRdWVyeSBvYmplY3RcblxuXG4vLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudClcbnZhciByb290alF1ZXJ5LFxuXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXG5cdC8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpXG5cdC8vIFNob3J0Y3V0IHNpbXBsZSAjaWQgY2FzZSBmb3Igc3BlZWRcblx0cnF1aWNrRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSspKSQvLFxuXG5cdGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdCApIHtcblx0XHR2YXIgbWF0Y2gsIGVsZW07XG5cblx0XHQvLyBIQU5ETEU6ICQoXCJcIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSlcblx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIE1ldGhvZCBpbml0KCkgYWNjZXB0cyBhbiBhbHRlcm5hdGUgcm9vdGpRdWVyeVxuXHRcdC8vIHNvIG1pZ3JhdGUgY2FuIHN1cHBvcnQgalF1ZXJ5LnN1YiAoZ2gtMjEwMSlcblx0XHRyb290ID0gcm9vdCB8fCByb290alF1ZXJ5O1xuXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0aWYgKCBzZWxlY3RvclsgMCBdID09PSBcIjxcIiAmJlxuXHRcdFx0XHRzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSBcIj5cIiAmJlxuXHRcdFx0XHRzZWxlY3Rvci5sZW5ndGggPj0gMyApIHtcblxuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKCBtYXRjaFsgMSBdIHx8ICFjb250ZXh0ICkgKSB7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpXG5cdFx0XHRcdGlmICggbWF0Y2hbIDEgXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbIDAgXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRNTCBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTChcblx0XHRcdFx0XHRcdG1hdGNoWyAxIF0sXG5cdFx0XHRcdFx0XHRjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LFxuXHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdCkgKTtcblxuXHRcdFx0XHRcdC8vIEhBTkRMRTogJChodG1sLCBwcm9wcylcblx0XHRcdFx0XHRpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGVcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3RodG1sd2hpdGUgPSAoIC9bXlxceDIwXFx0XFxyXFxuXFxmXSsvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9ICk7XG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAqXG4gKlx0b3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvd1xuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XG4gKlxuICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmVcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zOlxuICpcbiAqXHRvbmNlOlx0XHRcdHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcbiAqXHRcdFx0XHRcdGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0IFwibWVtb3JpemVkXCJcbiAqXHRcdFx0XHRcdHZhbHVlcyAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHR1bmlxdWU6XHRcdFx0d2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpXG4gKlxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gKlxuICovXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0Ly8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZFxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXG5cdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0Y3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXG5cdFx0Ly8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHNcblx0XHRtZW1vcnksXG5cblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZFxuXHRcdGZpcmVkLFxuXG5cdFx0Ly8gRmxhZyB0byBwcmV2ZW50IGZpcmluZ1xuXHRcdGxvY2tlZCxcblxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXG5cdFx0Ly8gUXVldWUgb2YgZXhlY3V0aW9uIGRhdGEgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRxdWV1ZSA9IFtdLFxuXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQpXG5cdFx0ZmlyaW5nSW5kZXggPSAtMSxcblxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbmZvcmNlIHNpbmdsZS1maXJpbmdcblx0XHRcdGxvY2tlZCA9IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgalF1ZXJ5LnR5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlICkuZG9uZSggcmVzb2x2ZSApLmZhaWwoIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgdGhlbmFibGVzXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHRcdC8vIFN0cmljdCBtb2RlIGZ1bmN0aW9ucyBpbnZva2VkIHdpdGhvdXQgLmNhbGwvLmFwcGx5IGdldCBnbG9iYWwtb2JqZWN0IGNvbnRleHRcblx0XHRcdHJlc29sdmUuY2FsbCggdW5kZWZpbmVkLCB2YWx1ZSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5jYWxsKCB1bmRlZmluZWQsIHZhbHVlICk7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsXG5cdFx0XHRcdC8vIC4uLiAudGhlbiBoYW5kbGVycywgYXJndW1lbnQgaW5kZXgsIFtmaW5hbCBzdGF0ZV1cblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksIDIgXSxcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAwLCBcInJlc29sdmVkXCIgXSxcblx0XHRcdFx0WyBcInJlamVjdFwiLCBcImZhaWxcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDEsIFwicmVqZWN0ZWRcIiBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiY2F0Y2hcIjogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLnRoZW4oIG51bGwsIGZuICk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7XG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBNYXAgdHVwbGVzIChwcm9ncmVzcywgZG9uZSwgZmFpbCkgdG8gYXJndW1lbnRzIChkb25lLCBmYWlsLCBwcm9ncmVzcylcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyApIHtcblx0XHRcdFx0XHR2YXIgbWF4RGVwdGggPSAwO1xuXHRcdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmUoIGRlcHRoLCBkZWZlcnJlZCwgaGFuZGxlciwgc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHRoYXQgPSB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBhcmd1bWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkLCB0aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuM1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBkb3VibGUtcmVzb2x1dGlvbiBhdHRlbXB0c1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCA8IG1heERlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkID0gaGFuZGxlci5hcHBseSggdGhhdCwgYXJncyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC00OFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCA9PT0gZGVmZXJyZWQucHJvbWlzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCBcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTc1XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVuID0gcmV0dXJuZWQgJiZcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy40XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgY2hlY2sgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGZvciB0aGVuYWJpbGl0eVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHR5cGVvZiByZXR1cm5lZCA9PT0gXCJvYmplY3RcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiByZXR1cm5lZCA9PT0gXCJmdW5jdGlvblwiICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQudGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoZW4gKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTcGVjaWFsIHByb2Nlc3NvcnMgKG5vdGlmeSkganVzdCB3YWl0IGZvciByZXNvbHV0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBOb3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgYWxzbyBob29rIGludG8gcHJvZ3Jlc3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBkaXNyZWdhcmQgb2xkZXIgcmVzb2x1dGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtYXhEZXB0aCsrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGggKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBJZGVudGl0eSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIHJldHVybmVkIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBQcm9jZXNzIHRoZSB2YWx1ZShzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHNwZWNpYWwgfHwgZGVmZXJyZWQucmVzb2x2ZVdpdGggKSggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IG5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBjYXRjaCBhbmQgcmVqZWN0IGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzID0gc3BlY2lhbCA/XG5cdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93IDpcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKyAxID49IG1heERlcHRoICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gVGhyb3dlciApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgZSBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4xXG5cdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU3XG5cdFx0XHRcdFx0XHRcdC8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb21cblx0XHRcdFx0XHRcdFx0Ly8gc3Vic2VxdWVudCBlcnJvcnNcblx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDYWxsIGFuIG9wdGlvbmFsIGhvb2sgdG8gcmVjb3JkIHRoZSBzdGFjaywgaW4gY2FzZSBvZiBleGNlcHRpb25cblx0XHRcdFx0XHRcdFx0XHQvLyBzaW5jZSBpdCdzIG90aGVyd2lzZSBsb3N0IHdoZW4gZXhlY3V0aW9uIGdvZXMgYXN5bmNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgPSBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBwcm9jZXNzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXG5cdFx0XHRcdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIG9uUmVqZWN0ZWQgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvblJlamVjdGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdFRocm93ZXJcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWRcblx0XHRcdFx0Ly8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdFxuXHRcdFx0XHRwcm9taXNlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdFx0XHRcdHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlZmVycmVkID0ge307XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyA1IF07XG5cblx0XHRcdC8vIHByb21pc2UucHJvZ3Jlc3MgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5kb25lID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsgMSBdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZChcblx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlc29sdmVkXCIgKGkuZS4sIGZ1bGZpbGxlZClcblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZWplY3RlZFwiXG5cdFx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHQvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBtYXN0ZXIudGhlbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCByZXNvbHZlVmFsdWVzWyBpIF0sIHVwZGF0ZUZ1bmMoIGkgKSwgbWFzdGVyLnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXN0ZXIucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcblx0aG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHtcblx0XHRpZiAoIGhvbGQgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oXG5cdFx0XHRcdFx0ZWxlbXNbIGkgXSwga2V5LCByYXcgP1xuXHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggY2hhaW5hYmxlICkge1xuXHRcdHJldHVybiBlbGVtcztcblx0fVxuXG5cdC8vIEdldHNcblx0aWYgKCBidWxrICkge1xuXHRcdHJldHVybiBmbi5jYWxsKCBlbGVtcyApO1xuXHR9XG5cblx0cmV0dXJuIGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdFx0Ly8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBvYmplY3QuXG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlclxuXHRcdFx0XHQvLyB1c2UgcGxhaW4gYXNzaWdubWVudFxuXHRcdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHZhbHVlO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHQvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZVxuXHRcdFx0XHQvLyBkZWxldGVkIHdoZW4gZGF0YSBpcyByZW1vdmVkXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRvLCB7XG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cdHNldDogZnVuY3Rpb24oIG93bmVyLCBkYXRhLCB2YWx1ZSApIHtcblx0XHR2YXIgcHJvcCxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwga2V5LCB2YWx1ZSBdIGFyZ3Ncblx0XHQvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBqUXVlcnkuY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cblx0XHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGpRdWVyeS5jYW1lbENhc2UoIGtleSApIF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KCAoIGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblx0XHR9XG5cblx0XHQvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdGlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGtleSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5c1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBjcmVhdGUgYW4gYXJyYXkgYnkgbWF0Y2hpbmcgbm9uLXdoaXRlc3BhY2Vcblx0XHRcdFx0a2V5ID0ga2V5IGluIGNhY2hlID9cblx0XHRcdFx0XHRbIGtleSBdIDpcblx0XHRcdFx0XHQoIGtleS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdICk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBrZXkubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiB0aGVyZSdzIG5vIG1vcmUgZGF0YVxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDVcblx0XHRcdC8vIFdlYmtpdCAmIEJsaW5rIHBlcmZvcm1hbmNlIHN1ZmZlcnMgd2hlbiBkZWxldGluZyBwcm9wZXJ0aWVzXG5cdFx0XHQvLyBmcm9tIERPTSBub2Rlcywgc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKVxuXHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHR2YXIgY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0cmV0dXJuIGNhY2hlICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApO1xuXHR9XG59O1xudmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFVc2VyID0gbmV3IERhdGEoKTtcblxuXG5cbi8vXHRJbXBsZW1lbnRhdGlvbiBTdW1tYXJ5XG4vL1xuLy9cdDEuIEVuZm9yY2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFuY2hcbi8vXHQyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2Vcbi8vXHRcdHBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS5cbi8vXHQzLiBVc2UgdGhlIHNhbWUgc2luZ2xlIG1lY2hhbmlzbSB0byBzdXBwb3J0IFwicHJpdmF0ZVwiIGFuZCBcInVzZXJcIiBkYXRhLlxuLy9cdDQuIF9OZXZlcl8gZXhwb3NlIFwicHJpdmF0ZVwiIGRhdGEgdG8gdXNlciBjb2RlIChUT0RPOiBEcm9wIF9kYXRhLCBfcmVtb3ZlRGF0YSlcbi8vXHQ1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcylcbi8vXHQ2LiBQcm92aWRlIGEgY2xlYXIgcGF0aCBmb3IgaW1wbGVtZW50YXRpb24gdXBncmFkZSB0byBXZWFrTWFwIGluIDIwMTRcblxudmFyIHJicmFjZSA9IC9eKD86XFx7W1xcd1xcV10qXFx9fFxcW1tcXHdcXFddKlxcXSkkLyxcblx0cm11bHRpRGFzaCA9IC9bQS1aXS9nO1xuXG5mdW5jdGlvbiBnZXREYXRhKCBkYXRhICkge1xuXHRpZiAoIGRhdGEgPT09IFwidHJ1ZVwiICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcImZhbHNlXCIgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcIm51bGxcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdGlmICggZGF0YSA9PT0gK2RhdGEgKyBcIlwiICkge1xuXHRcdHJldHVybiArZGF0YTtcblx0fVxuXG5cdGlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApO1xuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XG5cdHZhciBuYW1lO1xuXG5cdC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnlcblx0Ly8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0bmFtZSA9IFwiZGF0YS1cIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kJlwiICkudG9Mb3dlckNhc2UoKTtcblx0XHRkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcblxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkYXRhID0gZ2V0RGF0YSggZGF0YSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFVc2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YVByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fSxcblxuXHQvLyBUT0RPOiBOb3cgdGhhdCBhbGwgY2FsbHMgdG8gX2RhdGEgYW5kIF9yZW1vdmVEYXRhIGhhdmUgYmVlbiByZXBsYWNlZFxuXHQvLyB3aXRoIGRpcmVjdCBjYWxscyB0byBkYXRhUHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiApICkge1xuXHRcdFx0XHRcdGkgPSBhdHRycy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICYmXG5cblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiO1xuXHR9O1xuXG52YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsXG5cdFx0c2NhbGUgPSAxLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRvdWJsZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyouXG5cdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdC8vIEFkanVzdCBhbmQgYXBwbHlcblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKVxuXHRcdC8vIEJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2guXG5cdFx0fSB3aGlsZSAoXG5cdFx0XHRzY2FsZSAhPT0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCApICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9uc1xuXHRcdCk7XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFQcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvO1xuXG5mdW5jdGlvbiBidWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uLCBpZ25vcmVkICkge1xuXHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0bm9kZXMgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbWUsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogalF1ZXJ5LmlzRnVuY3Rpb24oIGhvb2sgKSA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaG9vayggdGhpcy5vcmlnaW5hbEV2ZW50ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXG5cdFx0XHQvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHtcblx0XHRcdFx0XHR0aGlzLmZvY3VzKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3VzaW5cIlxuXHRcdH0sXG5cdFx0Ymx1cjoge1xuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7XG5cdFx0XHRcdFx0dGhpcy5ibHVyKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3Vzb3V0XCJcblx0XHR9LFxuXHRcdGNsaWNrOiB7XG5cblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiB0aGlzLmNsaWNrICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGljaygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpO1xuXG5cdC8vIE1hcmsgaXQgYXMgZml4ZWRcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XG59O1xuXG4vLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmdcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBqUXVlcnkuRXZlbnQsXG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc1NpbXVsYXRlZDogZmFsc2UsXG5cblx0cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHNcbmpRdWVyeS5lYWNoKCB7XG5cdGFsdEtleTogdHJ1ZSxcblx0YnViYmxlczogdHJ1ZSxcblx0Y2FuY2VsYWJsZTogdHJ1ZSxcblx0Y2hhbmdlZFRvdWNoZXM6IHRydWUsXG5cdGN0cmxLZXk6IHRydWUsXG5cdGRldGFpbDogdHJ1ZSxcblx0ZXZlbnRQaGFzZTogdHJ1ZSxcblx0bWV0YUtleTogdHJ1ZSxcblx0cGFnZVg6IHRydWUsXG5cdHBhZ2VZOiB0cnVlLFxuXHRzaGlmdEtleTogdHJ1ZSxcblx0dmlldzogdHJ1ZSxcblx0XCJjaGFyXCI6IHRydWUsXG5cdGNoYXJDb2RlOiB0cnVlLFxuXHRrZXk6IHRydWUsXG5cdGtleUNvZGU6IHRydWUsXG5cdGJ1dHRvbjogdHJ1ZSxcblx0YnV0dG9uczogdHJ1ZSxcblx0Y2xpZW50WDogdHJ1ZSxcblx0Y2xpZW50WTogdHJ1ZSxcblx0b2Zmc2V0WDogdHJ1ZSxcblx0b2Zmc2V0WTogdHJ1ZSxcblx0cG9pbnRlcklkOiB0cnVlLFxuXHRwb2ludGVyVHlwZTogdHJ1ZSxcblx0c2NyZWVuWDogdHJ1ZSxcblx0c2NyZWVuWTogdHJ1ZSxcblx0dGFyZ2V0VG91Y2hlczogdHJ1ZSxcblx0dG9FbGVtZW50OiB0cnVlLFxuXHR0b3VjaGVzOiB0cnVlLFxuXG5cdHdoaWNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcblxuXHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xuXHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCAmJiBya2V5RXZlbnQudGVzdCggZXZlbnQudHlwZSApICkge1xuXHRcdFx0cmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICYmIHJtb3VzZUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdGlmICggYnV0dG9uICYgMSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgMiApIHtcblx0XHRcdFx0cmV0dXJuIDM7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgNCApIHtcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC53aGljaDtcblx0fVxufSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LlxuLy8gRG8gdGhlIHNhbWUgZm9yIHBvaW50ZXJlbnRlci9wb2ludGVybGVhdmUgYW5kIHBvaW50ZXJvdmVyL3BvaW50ZXJvdXRcbi8vXG4vLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5XG4vLyBTYWZhcmkgc2VuZHMgbW91c2VlbnRlciB0b28gb2Z0ZW47IHNlZTpcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OFxuLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS5cbmpRdWVyeS5lYWNoKCB7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8ICggcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApICkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5XG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKilbXj5dKilcXC8+L2dpLFxuXG5cdC8qIGVzbGludC1lbmFibGUgKi9cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEsIEVkZ2UgMTIgLSAxM1xuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVxcLyguKikvLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwidGFibGVcIiApICYmXG5cdFx0alF1ZXJ5Lm5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwidGJvZHlcIiApWyAwIF0gfHwgZWxlbTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG5mdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkge1xuXHRlbGVtLnR5cGUgPSAoIGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICE9PSBudWxsICkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblxuXHRpZiAoIG1hdGNoICkge1xuXHRcdGVsZW0udHlwZSA9IG1hdGNoWyAxIF07XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIFwidHlwZVwiICk7XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cGRhdGFPbGQgPSBkYXRhUHJpdi5hY2Nlc3MoIHNyYyApO1xuXHRcdHBkYXRhQ3VyID0gZGF0YVByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTtcblx0XHRcdHBkYXRhQ3VyLmV2ZW50cyA9IHt9O1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHR1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFVc2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG4vLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHNcbmZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi5cblx0aWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cdFx0ZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0Ly8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApO1xuXG5cdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRpID0gMCxcblx0XHRsID0gY29sbGVjdGlvbi5sZW5ndGgsXG5cdFx0aU5vQ2xvbmUgPSBsIC0gMSxcblx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XG5cdGlmICggaXNGdW5jdGlvbiB8fFxuXHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0dmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApO1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbC5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApO1xuXHR9LFxuXG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0YXJnZXQuZmlyc3RDaGlsZCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGFmdGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0aHRtbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBlbGVtID0gdGhpc1sgMCBdIHx8IHt9LFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcblx0XHRcdFx0IXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkge1xuXG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdIHx8IHt9O1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cdFx0XHRcdFx0XHRcdGVsZW0uaW5uZXJIVE1MID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XG5cblx0XHRcdFx0Ly8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpZ25vcmVkID0gW107XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0XHRwYXJlbnQucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEZvcmNlIGNhbGxiYWNrIGludm9jYXRpb25cblx0XHR9LCBpZ25vcmVkICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcbnZhciBybWFyZ2luID0gKCAvXm1hcmdpbi8gKTtcblxudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblxuXHQvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXRcblx0Ly8gc28gdGhleSdyZSBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi5cblx0ZnVuY3Rpb24gY29tcHV0ZVN0eWxlVGVzdHMoKSB7XG5cblx0XHQvLyBUaGlzIGlzIGEgc2luZ2xldG9uLCB3ZSBuZWVkIHRvIGV4ZWN1dGUgaXQgb25seSBvbmNlXG5cdFx0aWYgKCAhZGl2ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwiYm94LXNpemluZzpib3JkZXItYm94O1wiICtcblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztcIiArXG5cdFx0XHRcIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7XCIgK1xuXHRcdFx0XCJ0b3A6MSU7d2lkdGg6NTAlXCI7XG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0ZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gZGl2U3R5bGUubWFyZ2luTGVmdCA9PT0gXCIycHhcIjtcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09PSBcIjRweFwiO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seVxuXHRcdC8vIFNvbWUgc3R5bGVzIGNvbWUgYmFjayB3aXRoIHBlcmNlbnRhZ2UgdmFsdWVzLCBldmVuIHRob3VnaCB0aGV5IHNob3VsZG4ndFxuXHRcdGRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IFwiNTAlXCI7XG5cdFx0cGl4ZWxNYXJnaW5SaWdodFZhbCA9IGRpdlN0eWxlLm1hcmdpblJpZ2h0ID09PSBcIjRweFwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCwgcGl4ZWxNYXJnaW5SaWdodFZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7XCIgK1xuXHRcdFwicGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbE1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSAoIzEyNTM3KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBBIHRyaWJ1dGUgdG8gdGhlIFwiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1wiXG5cdFx0Ly8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsXG5cdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy5cblx0XHQvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6XG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoICFzdXBwb3J0LnBpeGVsTWFyZ2luUmlnaHQoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuXG5cdFx0cmV0ICsgXCJcIiA6XG5cdFx0cmV0O1xufVxuXG5cbmZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHtcblxuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cbnZhclxuXG5cdC8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGVcblx0Ly8gZXhjZXB0IFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIgXSxcblx0ZW1wdHlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKS5zdHlsZTtcblxuLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gU2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWRcblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkge1xuXHR2YXIgaSxcblx0XHR2YWwgPSAwO1xuXG5cdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRpZiAoIGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgKSB7XG5cdFx0aSA9IDQ7XG5cblx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHR9IGVsc2Uge1xuXHRcdGkgPSBuYW1lID09PSBcIndpZHRoXCIgPyAxIDogMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcblx0XHRpZiAoIGV4dHJhID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XG5cblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxuXHRcdFx0aWYgKCBleHRyYSA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQsIHNvIGFkZCBwYWRkaW5nXG5cdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXJcblx0XHRcdGlmICggZXh0cmEgIT09IFwicGFkZGluZ1wiICkge1xuXHRcdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZVxuXHR2YXIgdmFsLFxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHQvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuXG5cdGlmICggZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHR2YWwgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpWyBuYW1lIF07XG5cdH1cblxuXHQvLyBTb21lIG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWRcblx0Ly8gc3ZnIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5Mjg1XG5cdC8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MTY2OFxuXHRpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkge1xuXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHRpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7XG5cdFx0XHR2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi5cblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0XHQvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmXG5cdFx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApO1xuXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuXHRcdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cdH1cblxuXHQvLyBVc2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlc1xuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0ZWxlbSxcblx0XHRcdG5hbWUsXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50XCI6IHRydWUsXG5cdFx0XCJjb2x1bW5Db3VudFwiOiB0cnVlLFxuXHRcdFwiZmlsbE9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcImZsZXhHcm93XCI6IHRydWUsXG5cdFx0XCJmbGV4U2hyaW5rXCI6IHRydWUsXG5cdFx0XCJmb250V2VpZ2h0XCI6IHRydWUsXG5cdFx0XCJsaW5lSGVpZ2h0XCI6IHRydWUsXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJvcmRlclwiOiB0cnVlLFxuXHRcdFwib3JwaGFuc1wiOiB0cnVlLFxuXHRcdFwid2lkb3dzXCI6IHRydWUsXG5cdFx0XCJ6SW5kZXhcIjogdHJ1ZSxcblx0XHRcInpvb21cIjogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge1xuXHRcdFwiZmxvYXRcIjogXCJjc3NGbG9hdFwiXG5cdH0sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fFxuXHRcdFx0KCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggb3JpZ05hbWUgKSB8fCBvcmlnTmFtZSApO1xuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8XG5cdFx0XHQoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiZcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4K1xuXHRcdFx0XHRcdC8vIFRhYmxlIGNvbHVtbnMgaW4gU2FmYXJpIGhhdmUgbm9uLXplcm8gb2Zmc2V0V2lkdGggJiB6ZXJvXG5cdFx0XHRcdFx0Ly8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggdW5sZXNzIGRpc3BsYXkgaXMgY2hhbmdlZC5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHRcdFx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlXG5cdFx0XHRcdFx0Ly8gaW4gSUUgdGhyb3dzIGFuIGVycm9yLlxuXHRcdFx0XHRcdCggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggfHwgIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKSA/XG5cdFx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhICYmIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHQpO1xuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCkgKyBcInB4XCI7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCgge1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoIFwiIFwiICkgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggbmFtZSApICkge1xuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdFx0bGVuID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0bWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgalF1ZXJ5LmVhc2luZy5fZGVmYXVsdDtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsXG5cdFx0XHQvLyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3RzLlxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmIHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxuXHRcdFx0cmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSBcImF1dG9cIiA/IDAgOiByZXN1bHQ7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblxuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fFxuXHRcdFx0XHRcdGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCB0aW1lcklkLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbmZ1bmN0aW9uIHJhZigpIHtcblx0aWYgKCB0aW1lcklkICkge1xuXHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHJhZiApO1xuXHRcdGpRdWVyeS5meC50aWNrKCk7XG5cdH1cbn1cblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTNcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WVxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICgjMTI0OTcpXG5cdFx0XHRcdHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCxcblx0XHRcdFx0cGVyY2VudCA9IDEgLSB0ZW1wLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0gKTtcblxuXHRcdFx0aWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiByZW1haW5pbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7XG5cdFx0XHRcdHNwZWNpYWxFYXNpbmc6IHt9LFxuXHRcdFx0XHRlYXNpbmc6IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHRcblx0XHRcdH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0alF1ZXJ5LnByb3h5KCByZXN1bHQuc3RvcCwgcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0Ly8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0cmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0Ly8gR28gdG8gdGhlIGVuZCBzdGF0ZSBpZiBmeCBhcmUgb2ZmIG9yIGlmIGRvY3VtZW50IGlzIGhpZGRlblxuXHRpZiAoIGpRdWVyeS5meC5vZmYgfHwgZG9jdW1lbnQuaGlkZGVuICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7XG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIG9wdDtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbldpdGhpblRyZWUgKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fSxcblx0YW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXG5cdFx0XHRkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmXG5cdFx0XHRcdFx0KCB0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgKSB7XG5cblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXgsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBqUXVlcnkubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cblx0XHQvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlbW92ZWRcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRpZiAoIHRpbWVyKCkgKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnRpbWVycy5wb3AoKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCAhdGltZXJJZCApIHtcblx0XHR0aW1lcklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/XG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCByYWYgKSA6XG5cdFx0XHR3aW5kb3cuc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aWYgKCB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgKSB7XG5cdFx0d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKCB0aW1lcklkICk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTtcblx0fVxuXG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGUsXG5cdFx0XHRsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cblx0XHRcdC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXJcblx0XHRcdGhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IHJldDtcblx0XHRcdHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID9cblx0XHRcdFx0bG93ZXJjYXNlTmFtZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59ICk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmNsaWNrYWJsZSA9IC9eKD86YXxhcmVhKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzXG5cdFx0XHRuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdO1xuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHRcdFx0Ly8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlXG5cdFx0XHRcdC8vIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldFxuXHRcdFx0XHQvLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNDExMTYyMzMzNDcvaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC9cblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3Milcblx0XHRcdFx0dmFyIHRhYmluZGV4ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0YWJpbmRleFwiICk7XG5cblx0XHRcdFx0aWYgKCB0YWJpbmRleCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoIHRhYmluZGV4LCAxMCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8XG5cdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiZcblx0XHRcdFx0XHRlbGVtLmhyZWZcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fVxufSApO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbi8vIGVzbGludCBydWxlIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgY29kZVxuLy8gc2luY2UgaXQgY29uc2lkZXJzIHN1Y2ggYWNjZXNzaW9ucyBub29wXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaCggW1xuXHRcInRhYkluZGV4XCIsXG5cdFwicmVhZE9ubHlcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImNlbGxQYWRkaW5nXCIsXG5cdFwicm93U3BhblwiLFxuXHRcImNvbFNwYW5cIixcblx0XCJ1c2VNYXBcIixcblx0XCJmcmFtZUJvcmRlclwiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiXG5dLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpcztcbn0gKTtcblxuXG5cblxuXHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gSFRNTCBzcGVjXG5cdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0ZnVuY3Rpb24gc3RyaXBBbmRDb2xsYXBzZSggdmFsdWUgKSB7XG5cdFx0dmFyIHRva2VucyA9IHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdFx0cmV0dXJuIHRva2Vucy5qb2luKCBcIiBcIiApO1xuXHR9XG5cblxuZnVuY3Rpb24gZ2V0Q2xhc3MoIGVsZW0gKSB7XG5cdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc1wiICkgfHwgXCJcIjtcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgKSB7XG5cdFx0XHRjbGFzc2VzID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA8IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciArPSBjbGF6eiArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSApIHtcblx0XHRcdGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblxuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgPSBjdXIucmVwbGFjZSggXCIgXCIgKyBjbGF6eiArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lcztcblxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdGNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRcdHdoaWxlICggKCBjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCxcblx0XHRcdFx0Ly8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSxcblx0XHRcdFx0Ly8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuXHRcdFx0XHRpZiAoIHRoaXMuc2V0QXR0cmlidXRlICkge1xuXHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcdFwiXCIgOlxuXHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgaG9va3MsIHJldCwgaXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdGlmICggdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHR2YXIgdmFsO1xuXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsIFwib3B0Z3JvdXBcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb25cblx0XHRcdFx0XHRcdHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHNcblx0XHRcdFx0XHRcdGlmICggb25lICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBvcHRpb25TZXQsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICksXG5cdFx0XHRcdFx0aSA9IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG5cblx0XHRcdFx0XHRpZiAoIG9wdGlvbi5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggalF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tY29uZC1hc3NpZ24gKi9cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goIFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLztcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJlxuXHRcdFx0XHRkYXRhUHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBhY2NlcHREYXRhKCBjdXIgKSApIHtcblx0XHRcdFx0ZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XG5cblx0XHQvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblxuXHRcdFx0aWYgKCAoICFzcGVjaWFsLl9kZWZhdWx0IHx8XG5cdFx0XHRcdHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSApICYmXG5cdFx0XHRcdGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lXG5cdC8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQgKSB7XG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlXG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XG5cdH1cblxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0gKTtcblx0fSxcblx0dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBlbGVtID0gdGhpc1sgMCBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbmpRdWVyeS5lYWNoKCAoIFwiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgXCIgK1xuXHRcIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIFwiICtcblx0XCJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51XCIgKS5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cblx0Ly8gSGFuZGxlIGV2ZW50IGJpbmRpbmdcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID9cblx0XHRcdHRoaXMub24oIG5hbWUsIG51bGwsIGRhdGEsIGZuICkgOlxuXHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkge1xuXHRcdHJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApO1xuXHR9XG59ICk7XG5cblxuXG5cbnN1cHBvcnQuZm9jdXNpbiA9IFwib25mb2N1c2luXCIgaW4gd2luZG93O1xuXG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjFcbi8vIGZvY3VzKGluIHwgb3V0KSBldmVudHMgZmlyZSBhZnRlciBmb2N1cyAmIGJsdXIgZXZlbnRzLFxuLy8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuXHRcdGpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkge1xuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcblxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKFxuXHRcdFx0XHRcdHByZWZpeCArIFwiW1wiICsgKCB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9IG51bGwgPyBpIDogXCJcIiApICsgXCJdXCIsXG5cdFx0XHRcdFx0dixcblx0XHRcdFx0XHR0cmFkaXRpb25hbCxcblx0XHRcdFx0XHRhZGRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZU9yRnVuY3Rpb24gKSA/XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbigpIDpcblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uO1xuXG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICtcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0fTtcblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0gKVxuXHRcdC5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9IClcblx0XHQubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0XHRqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDpcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb21wbGV0ZWQgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhY2hlcyB0aGUgaGVhZGVyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID1cblx0XHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHwgbmFtZTtcblx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXJcblx0XHRcdFx0b3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrcyBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRmb3IgKCBjb2RlIGluIG1hcCApIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTtcblxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSAoIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cblx0XHQvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gdGhlIG9yaWdpbiBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IG9yaWdpbi5cblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHVybEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTNcblx0XHRcdC8vIElFIHRocm93cyBleGNlcHRpb24gb24gYWNjZXNzaW5nIHRoZSBocmVmIHByb3BlcnR5IGlmIHVybCBpcyBtYWxmb3JtZWQsXG5cdFx0XHQvLyBlLmcuIGh0dHA6Ly9leGFtcGxlLmNvbTo4MHgvXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHMudXJsO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExIG9ubHlcblx0XHRcdFx0Ly8gQW5jaG9yJ3MgaG9zdCBwcm9wZXJ0eSBpc24ndCBjb3JyZWN0bHkgc2V0IHdoZW4gcy51cmwgaXMgcmVsYXRpdmVcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjtcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IG9yaWdpbkFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIG9yaWdpbkFuY2hvci5ob3N0ICE9PVxuXHRcdFx0XHRcdHVybEFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIHVybEFuY2hvci5ob3N0O1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgVVJMLCBhc3N1bWUgaXQgaXMgY3Jvc3NEb21haW4sXG5cdFx0XHRcdC8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWRcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdH1cblxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXG5cdFx0Ly8gRG9uJ3QgZmlyZSBldmVudHMgaWYgalF1ZXJ5LmV2ZW50IGlzIHVuZGVmaW5lZCBpbiBhbiBBTUQtdXNhZ2Ugc2NlbmFyaW8gKCMxNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvblxuXHRcdGNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsIFwiXCIgKTtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgaGFzaCBzbyB3ZSBjYW4gcHV0IGl0IGJhY2tcblx0XHRcdHVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApO1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvciB1cGRhdGUgYW50aS1jYWNoZSBwYXJhbSBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gY2FjaGVVUkwucmVwbGFjZSggcmFudGlDYWNoZSwgXCIkMVwiICk7XG5cdFx0XHRcdHVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIFwiXz1cIiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkxhc3QtTW9kaWZpZWRcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiZXRhZ1wiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaWYgbm8gY29udGVudFxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gXCJIRUFEXCIgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm9jb250ZW50XCI7XG5cblx0XHRcdFx0Ly8gaWYgbm90IG1vZGlmaWVkXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlO1xuXHRcdFx0XHRcdHN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdGVycm9yID0gcmVzcG9uc2UuZXJyb3I7XG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RvcFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ganFYSFI7XG5cdH0sXG5cblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssIFwianNvblwiICk7XG5cdH0sXG5cblx0Z2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRcdGh0bWwgPSBodG1sLmNhbGwoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR0aGlzLnBhcmVudCggc2VsZWN0b3IgKS5ub3QoIFwiYm9keVwiICkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICEhKCBlbGVtLm9mZnNldFdpZHRoIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0IHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKTtcbn07XG5cblxuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIE9uIGEgbWFudWFsIG5hdGl2ZSBhYm9ydCwgSUU5IHRocm93c1xuXHRcdFx0XHRcdFx0XHRcdC8vIGVycm9ycyBvbiBhbnkgcHJvcGVydHkgYWNjZXNzIHRoYXQgaXMgbm90IHJlYWR5U3RhdGVcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB4aHIuc3RhdHVzICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIDAsIFwiZXJyb3JcIiApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaWxlOiBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgIzg2MDUsICMxNDIwN1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0LFxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSUU5IGhhcyBubyBYSFIyIGJ1dCB0aHJvd3Mgb24gYmluYXJ5ICh0cmFjLTExNDI2KVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gRm9yIFhIUjIgbm9uLXRleHQsIGxldCB0aGUgY2FsbGVyIGhhbmRsZSBpdCAoZ2gtMjQ5OClcblx0XHRcdFx0XHRcdFx0XHRcdCggeGhyLnJlc3BvbnNlVHlwZSB8fCBcInRleHRcIiApICE9PSBcInRleHRcIiAgfHxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ICE9PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyB0ZXh0OiB4aHIucmVzcG9uc2VUZXh0IH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBMaXN0ZW4gdG8gZXZlbnRzXG5cdFx0XHRcdHhoci5vbmxvYWQgPSBjYWxsYmFjaygpO1xuXHRcdFx0XHRlcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSBjYWxsYmFjayggXCJlcnJvclwiICk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdC8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0XG5cdFx0XHRcdC8vIHRvIGhhbmRsZSB1bmNhdWdodCBhYm9ydHNcblx0XHRcdFx0aWYgKCB4aHIub25hYm9ydCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHhoci5vbmFib3J0ID0gZXJyb3JDYWxsYmFjaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHJlYWR5U3RhdGUgYmVmb3JlIHRpbWVvdXQgYXMgaXQgY2hhbmdlc1xuXHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCxcblx0XHRcdFx0XHRcdFx0Ly8gYnV0IHRoYXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0XG5cdFx0XHRcdFx0XHRcdC8vIEFsc28sIHNhdmUgZXJyb3JDYWxsYmFjayB0byBhIHZhcmlhYmxlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrKCBcImFib3J0XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHQvLyAjMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiICkucHJvcCgge1xuXHRcdFx0XHRcdGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCxcblx0XHRcdFx0XHRzcmM6IHMudXJsXG5cdFx0XHRcdH0gKS5vbihcblx0XHRcdFx0XHRcImxvYWQgZXJyb3JcIixcblx0XHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9IG51bGw7XG5cdFx0XHRcdFx0XHRpZiAoIGV2dCApIHtcblx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIGV2dC50eXBlID09PSBcImVycm9yXCIgPyA0MDQgOiAyMDAsIGV2dC50eXBlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIFVzZSBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBvdXIgZG9tTWFuaXAgQUpBWCB0cmlja2VyeVxuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHRbIDAgXSApO1xuXHRcdFx0fSxcblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59ICk7XG5cbi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0c1xualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwianNvbiBqc29ucFwiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7XG5cblx0dmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLFxuXHRcdGpzb25Qcm9wID0gcy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/XG5cdFx0XHRcInVybFwiIDpcblx0XHRcdHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgJiZcblx0XHRcdFx0cmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KCB7XG5cdFx0XHR1cmw6IHVybCxcblxuXHRcdFx0Ly8gSWYgXCJ0eXBlXCIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuIFwiR0VUXCIgbWV0aG9kIHdpbGwgYmUgdXNlZC5cblx0XHRcdC8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZVxuXHRcdFx0Ly8gdXNlciBjYW4gb3ZlcnJpZGUgaXQgdGhyb3VnaCBhamF4U2V0dXAgbWV0aG9kXG5cdFx0XHR0eXBlOiB0eXBlIHx8IFwiR0VUXCIsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9ICkuZG9uZSggZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHtcblxuXHRcdFx0Ly8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrXG5cdFx0XHRyZXNwb25zZSA9IGFyZ3VtZW50cztcblxuXHRcdFx0c2VsZi5odG1sKCBzZWxlY3RvciA/XG5cblx0XHRcdFx0Ly8gSWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEgZHVtbXkgZGl2XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9yc1xuXHRcdFx0XHRqUXVlcnkoIFwiPGRpdj5cIiApLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdC8vIElmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJkYXRhXCIsIFwic3RhdHVzXCIsIFwianFYSFJcIlxuXHRcdC8vIGJ1dCB0aGV5IGFyZSBpZ25vcmVkIGJlY2F1c2UgcmVzcG9uc2Ugd2FzIHNldCBhYm92ZS5cblx0XHQvLyBJZiBpdCBmYWlscywgdGhpcyBmdW5jdGlvbiBnZXRzIFwianFYSFJcIiwgXCJzdGF0dXNcIiwgXCJlcnJvclwiXG5cdFx0fSApLmFsd2F5cyggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7XG5cdFx0XHRzZWxmLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxuLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHNcbmpRdWVyeS5lYWNoKCBbXG5cdFwiYWpheFN0YXJ0XCIsXG5cdFwiYWpheFN0b3BcIixcblx0XCJhamF4Q29tcGxldGVcIixcblx0XCJhamF4RXJyb3JcIixcblx0XCJhamF4U3VjY2Vzc1wiLFxuXHRcImFqYXhTZW5kXCJcbl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSApLmxlbmd0aDtcbn07XG5cblxuXG5cbi8qKlxuICogR2V0cyBhIHdpbmRvdyBmcm9tIGFuIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPyBlbGVtIDogZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRlZmF1bHRWaWV3O1xufVxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgZG9jRWxlbSwgd2luLCByZWN0LCBkb2MsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIGVsZW1lbnQgaXMgbm90IGhpZGRlbiAoZGlzcGxheTogbm9uZSlcblx0XHRpZiAoIHJlY3Qud2lkdGggfHwgcmVjdC5oZWlnaHQgKSB7XG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHR3aW4gPSBnZXRXaW5kb3coIGRvYyApO1xuXHRcdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQgLSBkb2NFbGVtLmNsaWVudFRvcCxcblx0XHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB6ZXJvcyBmb3IgZGlzY29ubmVjdGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0cmV0dXJuIHJlY3Q7XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpdHMgb25seSBvZmZzZXQgcGFyZW50XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7XG5cdFx0XHRcdHRvcDogcGFyZW50T2Zmc2V0LnRvcCArIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKSxcblx0XHRcdFx0bGVmdDogcGFyZW50T2Zmc2V0LmxlZnQgKyBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucGFyc2VKU09OID0gSlNPTi5wYXJzZTtcblxuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1Nylcbi8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3NlciBlbXVsYXRvcnMgKCMxMzU2NilcbmlmICggIW5vR2xvYmFsICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cblxucmV0dXJuIGpRdWVyeTtcbn0gKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgRmVsaXggR25hc3NcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL3NwaW4uanMub3JnL1xuICpcbiAqIEV4YW1wbGU6XG4gICAgdmFyIG9wdHMgPSB7XG4gICAgICBsaW5lczogMTIgICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBsaW5lcyB0byBkcmF3XG4gICAgLCBsZW5ndGg6IDcgICAgICAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGxpbmVcbiAgICAsIHdpZHRoOiA1ICAgICAgICAgICAgICAvLyBUaGUgbGluZSB0aGlja25lc3NcbiAgICAsIHJhZGl1czogMTAgICAgICAgICAgICAvLyBUaGUgcmFkaXVzIG9mIHRoZSBpbm5lciBjaXJjbGVcbiAgICAsIHNjYWxlOiAxLjAgICAgICAgICAgICAvLyBTY2FsZXMgb3ZlcmFsbCBzaXplIG9mIHRoZSBzcGlubmVyXG4gICAgLCBjb3JuZXJzOiAxICAgICAgICAgICAgLy8gUm91bmRuZXNzICgwLi4xKVxuICAgICwgY29sb3I6ICcjMDAwJyAgICAgICAgIC8vICNyZ2Igb3IgI3JyZ2diYlxuICAgICwgb3BhY2l0eTogMS80ICAgICAgICAgIC8vIE9wYWNpdHkgb2YgdGhlIGxpbmVzXG4gICAgLCByb3RhdGU6IDAgICAgICAgICAgICAgLy8gUm90YXRpb24gb2Zmc2V0XG4gICAgLCBkaXJlY3Rpb246IDEgICAgICAgICAgLy8gMTogY2xvY2t3aXNlLCAtMTogY291bnRlcmNsb2Nrd2lzZVxuICAgICwgc3BlZWQ6IDEgICAgICAgICAgICAgIC8vIFJvdW5kcyBwZXIgc2Vjb25kXG4gICAgLCB0cmFpbDogMTAwICAgICAgICAgICAgLy8gQWZ0ZXJnbG93IHBlcmNlbnRhZ2VcbiAgICAsIGZwczogMjAgICAgICAgICAgICAgICAvLyBGcmFtZXMgcGVyIHNlY29uZCB3aGVuIHVzaW5nIHNldFRpbWVvdXQoKVxuICAgICwgekluZGV4OiAyZTkgICAgICAgICAgIC8vIFVzZSBhIGhpZ2ggei1pbmRleCBieSBkZWZhdWx0XG4gICAgLCBjbGFzc05hbWU6ICdzcGlubmVyJyAgLy8gQ1NTIGNsYXNzIHRvIGFzc2lnbiB0byB0aGUgZWxlbWVudFxuICAgICwgdG9wOiAnNTAlJyAgICAgICAgICAgIC8vIGNlbnRlciB2ZXJ0aWNhbGx5XG4gICAgLCBsZWZ0OiAnNTAlJyAgICAgICAgICAgLy8gY2VudGVyIGhvcml6b250YWxseVxuICAgICwgc2hhZG93OiBmYWxzZSAgICAgICAgIC8vIFdoZXRoZXIgdG8gcmVuZGVyIGEgc2hhZG93XG4gICAgLCBod2FjY2VsOiBmYWxzZSAgICAgICAgLy8gV2hldGhlciB0byB1c2UgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIChtaWdodCBiZSBidWdneSlcbiAgICAsIHBvc2l0aW9uOiAnYWJzb2x1dGUnICAvLyBFbGVtZW50IHBvc2l0aW9uaW5nXG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9vJylcbiAgICB2YXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKG9wdHMpLnNwaW4odGFyZ2V0KVxuICovXG47KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cbiAgLyogQ29tbW9uSlMgKi9cbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpXG5cbiAgLyogQU1EIG1vZHVsZSAqL1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKGZhY3RvcnkpXG5cbiAgLyogQnJvd3NlciBnbG9iYWwgKi9cbiAgZWxzZSByb290LlNwaW5uZXIgPSBmYWN0b3J5KClcbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICBcInVzZSBzdHJpY3RcIlxuXG4gIHZhciBwcmVmaXhlcyA9IFsnd2Via2l0JywgJ01veicsICdtcycsICdPJ10gLyogVmVuZG9yIHByZWZpeGVzICovXG4gICAgLCBhbmltYXRpb25zID0ge30gLyogQW5pbWF0aW9uIHJ1bGVzIGtleWVkIGJ5IHRoZWlyIG5hbWUgKi9cbiAgICAsIHVzZUNzc0FuaW1hdGlvbnMgLyogV2hldGhlciB0byB1c2UgQ1NTIGFuaW1hdGlvbnMgb3Igc2V0VGltZW91dCAqL1xuICAgICwgc2hlZXQgLyogQSBzdHlsZXNoZWV0IHRvIGhvbGQgdGhlIEBrZXlmcmFtZSBvciBWTUwgcnVsZXMuICovXG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGVsZW1lbnRzLiBJZiBubyB0YWcgbmFtZSBpcyBnaXZlbixcbiAgICogYSBESVYgaXMgY3JlYXRlZC4gT3B0aW9uYWxseSBwcm9wZXJ0aWVzIGNhbiBiZSBwYXNzZWQuXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVFbCAodGFnLCBwcm9wKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcgfHwgJ2RpdicpXG4gICAgICAsIG5cblxuICAgIGZvciAobiBpbiBwcm9wKSBlbFtuXSA9IHByb3Bbbl1cbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGNoaWxkcmVuIGFuZCByZXR1cm5zIHRoZSBwYXJlbnQuXG4gICAqL1xuICBmdW5jdGlvbiBpbnMgKHBhcmVudCAvKiBjaGlsZDEsIGNoaWxkMiwgLi4uKi8pIHtcbiAgICBmb3IgKHZhciBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChhcmd1bWVudHNbaV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb3BhY2l0eSBrZXlmcmFtZSBhbmltYXRpb24gcnVsZSBhbmQgcmV0dXJucyBpdHMgbmFtZS5cbiAgICogU2luY2UgbW9zdCBtb2JpbGUgV2Via2l0cyBoYXZlIHRpbWluZyBpc3N1ZXMgd2l0aCBhbmltYXRpb24tZGVsYXksXG4gICAqIHdlIGNyZWF0ZSBzZXBhcmF0ZSBydWxlcyBmb3IgZWFjaCBsaW5lL3NlZ21lbnQuXG4gICAqL1xuICBmdW5jdGlvbiBhZGRBbmltYXRpb24gKGFscGhhLCB0cmFpbCwgaSwgbGluZXMpIHtcbiAgICB2YXIgbmFtZSA9IFsnb3BhY2l0eScsIHRyYWlsLCB+fihhbHBoYSAqIDEwMCksIGksIGxpbmVzXS5qb2luKCctJylcbiAgICAgICwgc3RhcnQgPSAwLjAxICsgaS9saW5lcyAqIDEwMFxuICAgICAgLCB6ID0gTWF0aC5tYXgoMSAtICgxLWFscGhhKSAvIHRyYWlsICogKDEwMC1zdGFydCksIGFscGhhKVxuICAgICAgLCBwcmVmaXggPSB1c2VDc3NBbmltYXRpb25zLnN1YnN0cmluZygwLCB1c2VDc3NBbmltYXRpb25zLmluZGV4T2YoJ0FuaW1hdGlvbicpKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIHByZSA9IHByZWZpeCAmJiAnLScgKyBwcmVmaXggKyAnLScgfHwgJydcblxuICAgIGlmICghYW5pbWF0aW9uc1tuYW1lXSkge1xuICAgICAgc2hlZXQuaW5zZXJ0UnVsZShcbiAgICAgICAgJ0AnICsgcHJlICsgJ2tleWZyYW1lcyAnICsgbmFtZSArICd7JyArXG4gICAgICAgICcwJXtvcGFjaXR5OicgKyB6ICsgJ30nICtcbiAgICAgICAgc3RhcnQgKyAnJXtvcGFjaXR5OicgKyBhbHBoYSArICd9JyArXG4gICAgICAgIChzdGFydCswLjAxKSArICcle29wYWNpdHk6MX0nICtcbiAgICAgICAgKHN0YXJ0K3RyYWlsKSAlIDEwMCArICcle29wYWNpdHk6JyArIGFscGhhICsgJ30nICtcbiAgICAgICAgJzEwMCV7b3BhY2l0eTonICsgeiArICd9JyArXG4gICAgICAgICd9Jywgc2hlZXQuY3NzUnVsZXMubGVuZ3RoKVxuXG4gICAgICBhbmltYXRpb25zW25hbWVdID0gMVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdmFyaW91cyB2ZW5kb3IgcHJlZml4ZXMgYW5kIHJldHVybnMgdGhlIGZpcnN0IHN1cHBvcnRlZCBwcm9wZXJ0eS5cbiAgICovXG4gIGZ1bmN0aW9uIHZlbmRvciAoZWwsIHByb3ApIHtcbiAgICB2YXIgcyA9IGVsLnN0eWxlXG4gICAgICAsIHBwXG4gICAgICAsIGlcblxuICAgIHByb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKVxuICAgIGlmIChzW3Byb3BdICE9PSB1bmRlZmluZWQpIHJldHVybiBwcm9wXG4gICAgZm9yIChpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwcCA9IHByZWZpeGVzW2ldK3Byb3BcbiAgICAgIGlmIChzW3BwXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcHBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBtdWx0aXBsZSBzdHlsZSBwcm9wZXJ0aWVzIGF0IG9uY2UuXG4gICAqL1xuICBmdW5jdGlvbiBjc3MgKGVsLCBwcm9wKSB7XG4gICAgZm9yICh2YXIgbiBpbiBwcm9wKSB7XG4gICAgICBlbC5zdHlsZVt2ZW5kb3IoZWwsIG4pIHx8IG5dID0gcHJvcFtuXVxuICAgIH1cblxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxzIGluIGRlZmF1bHQgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2UgKG9iaikge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVmID0gYXJndW1lbnRzW2ldXG4gICAgICBmb3IgKHZhciBuIGluIGRlZikge1xuICAgICAgICBpZiAob2JqW25dID09PSB1bmRlZmluZWQpIG9ialtuXSA9IGRlZltuXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGluZSBjb2xvciBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgb3IgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb2xvciAoY29sb3IsIGlkeCkge1xuICAgIHJldHVybiB0eXBlb2YgY29sb3IgPT0gJ3N0cmluZycgPyBjb2xvciA6IGNvbG9yW2lkeCAlIGNvbG9yLmxlbmd0aF1cbiAgfVxuXG4gIC8vIEJ1aWx0LWluIGRlZmF1bHRzXG5cbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGxpbmVzOiAxMiAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGxpbmVzIHRvIGRyYXdcbiAgLCBsZW5ndGg6IDcgICAgICAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGxpbmVcbiAgLCB3aWR0aDogNSAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgdGhpY2tuZXNzXG4gICwgcmFkaXVzOiAxMCAgICAgICAgICAgIC8vIFRoZSByYWRpdXMgb2YgdGhlIGlubmVyIGNpcmNsZVxuICAsIHNjYWxlOiAxLjAgICAgICAgICAgICAvLyBTY2FsZXMgb3ZlcmFsbCBzaXplIG9mIHRoZSBzcGlubmVyXG4gICwgY29ybmVyczogMSAgICAgICAgICAgIC8vIFJvdW5kbmVzcyAoMC4uMSlcbiAgLCBjb2xvcjogJyMwMDAnICAgICAgICAgLy8gI3JnYiBvciAjcnJnZ2JiXG4gICwgb3BhY2l0eTogMS80ICAgICAgICAgIC8vIE9wYWNpdHkgb2YgdGhlIGxpbmVzXG4gICwgcm90YXRlOiAwICAgICAgICAgICAgIC8vIFJvdGF0aW9uIG9mZnNldFxuICAsIGRpcmVjdGlvbjogMSAgICAgICAgICAvLyAxOiBjbG9ja3dpc2UsIC0xOiBjb3VudGVyY2xvY2t3aXNlXG4gICwgc3BlZWQ6IDEgICAgICAgICAgICAgIC8vIFJvdW5kcyBwZXIgc2Vjb25kXG4gICwgdHJhaWw6IDEwMCAgICAgICAgICAgIC8vIEFmdGVyZ2xvdyBwZXJjZW50YWdlXG4gICwgZnBzOiAyMCAgICAgICAgICAgICAgIC8vIEZyYW1lcyBwZXIgc2Vjb25kIHdoZW4gdXNpbmcgc2V0VGltZW91dCgpXG4gICwgekluZGV4OiAyZTkgICAgICAgICAgIC8vIFVzZSBhIGhpZ2ggei1pbmRleCBieSBkZWZhdWx0XG4gICwgY2xhc3NOYW1lOiAnc3Bpbm5lcicgIC8vIENTUyBjbGFzcyB0byBhc3NpZ24gdG8gdGhlIGVsZW1lbnRcbiAgLCB0b3A6ICc1MCUnICAgICAgICAgICAgLy8gY2VudGVyIHZlcnRpY2FsbHlcbiAgLCBsZWZ0OiAnNTAlJyAgICAgICAgICAgLy8gY2VudGVyIGhvcml6b250YWxseVxuICAsIHNoYWRvdzogZmFsc2UgICAgICAgICAvLyBXaGV0aGVyIHRvIHJlbmRlciBhIHNoYWRvd1xuICAsIGh3YWNjZWw6IGZhbHNlICAgICAgICAvLyBXaGV0aGVyIHRvIHVzZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gKG1pZ2h0IGJlIGJ1Z2d5KVxuICAsIHBvc2l0aW9uOiAnYWJzb2x1dGUnICAvLyBFbGVtZW50IHBvc2l0aW9uaW5nXG4gIH1cblxuICAvKiogVGhlIGNvbnN0cnVjdG9yICovXG4gIGZ1bmN0aW9uIFNwaW5uZXIgKG8pIHtcbiAgICB0aGlzLm9wdHMgPSBtZXJnZShvIHx8IHt9LCBTcGlubmVyLmRlZmF1bHRzLCBkZWZhdWx0cylcbiAgfVxuXG4gIC8vIEdsb2JhbCBkZWZhdWx0cyB0aGF0IG92ZXJyaWRlIHRoZSBidWlsdC1pbnM6XG4gIFNwaW5uZXIuZGVmYXVsdHMgPSB7fVxuXG4gIG1lcmdlKFNwaW5uZXIucHJvdG90eXBlLCB7XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgc3Bpbm5lciB0byB0aGUgZ2l2ZW4gdGFyZ2V0IGVsZW1lbnQuIElmIHRoaXMgaW5zdGFuY2UgaXMgYWxyZWFkeVxuICAgICAqIHNwaW5uaW5nLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSBpdHMgcHJldmlvdXMgdGFyZ2V0IGIgY2FsbGluZ1xuICAgICAqIHN0b3AoKSBpbnRlcm5hbGx5LlxuICAgICAqL1xuICAgIHNwaW46IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHRoaXMuc3RvcCgpXG5cbiAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICAsIG8gPSBzZWxmLm9wdHNcbiAgICAgICAgLCBlbCA9IHNlbGYuZWwgPSBjcmVhdGVFbChudWxsLCB7Y2xhc3NOYW1lOiBvLmNsYXNzTmFtZX0pXG5cbiAgICAgIGNzcyhlbCwge1xuICAgICAgICBwb3NpdGlvbjogby5wb3NpdGlvblxuICAgICAgLCB3aWR0aDogMFxuICAgICAgLCB6SW5kZXg6IG8uekluZGV4XG4gICAgICAsIGxlZnQ6IG8ubGVmdFxuICAgICAgLCB0b3A6IG8udG9wXG4gICAgICB9KVxuXG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUoZWwsIHRhcmdldC5maXJzdENoaWxkIHx8IG51bGwpXG4gICAgICB9XG5cbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdwcm9ncmVzc2JhcicpXG4gICAgICBzZWxmLmxpbmVzKGVsLCBzZWxmLm9wdHMpXG5cbiAgICAgIGlmICghdXNlQ3NzQW5pbWF0aW9ucykge1xuICAgICAgICAvLyBObyBDU1MgYW5pbWF0aW9uIHN1cHBvcnQsIHVzZSBzZXRUaW1lb3V0KCkgaW5zdGVhZFxuICAgICAgICB2YXIgaSA9IDBcbiAgICAgICAgICAsIHN0YXJ0ID0gKG8ubGluZXMgLSAxKSAqICgxIC0gby5kaXJlY3Rpb24pIC8gMlxuICAgICAgICAgICwgYWxwaGFcbiAgICAgICAgICAsIGZwcyA9IG8uZnBzXG4gICAgICAgICAgLCBmID0gZnBzIC8gby5zcGVlZFxuICAgICAgICAgICwgb3N0ZXAgPSAoMSAtIG8ub3BhY2l0eSkgLyAoZiAqIG8udHJhaWwgLyAxMDApXG4gICAgICAgICAgLCBhc3RlcCA9IGYgLyBvLmxpbmVzXG5cbiAgICAgICAgOyhmdW5jdGlvbiBhbmltICgpIHtcbiAgICAgICAgICBpKytcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG8ubGluZXM7IGorKykge1xuICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heCgxIC0gKGkgKyAoby5saW5lcyAtIGopICogYXN0ZXApICUgZiAqIG9zdGVwLCBvLm9wYWNpdHkpXG5cbiAgICAgICAgICAgIHNlbGYub3BhY2l0eShlbCwgaiAqIG8uZGlyZWN0aW9uICsgc3RhcnQsIGFscGhhLCBvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLnRpbWVvdXQgPSBzZWxmLmVsICYmIHNldFRpbWVvdXQoYW5pbSwgfn4oMTAwMCAvIGZwcykpXG4gICAgICAgIH0pKClcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgYW5kIHJlbW92ZXMgdGhlIFNwaW5uZXIuXG4gICAgICovXG4gICwgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGVsID0gdGhpcy5lbFxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXG4gICAgICAgIGlmIChlbC5wYXJlbnROb2RlKSBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKVxuICAgICAgICB0aGlzLmVsID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IGRyYXdzIHRoZSBpbmRpdmlkdWFsIGxpbmVzLiBXaWxsIGJlIG92ZXJ3cml0dGVuXG4gICAgICogaW4gVk1MIGZhbGxiYWNrIG1vZGUgYmVsb3cuXG4gICAgICovXG4gICwgbGluZXM6IGZ1bmN0aW9uIChlbCwgbykge1xuICAgICAgdmFyIGkgPSAwXG4gICAgICAgICwgc3RhcnQgPSAoby5saW5lcyAtIDEpICogKDEgLSBvLmRpcmVjdGlvbikgLyAyXG4gICAgICAgICwgc2VnXG5cbiAgICAgIGZ1bmN0aW9uIGZpbGwgKGNvbG9yLCBzaGFkb3cpIHtcbiAgICAgICAgcmV0dXJuIGNzcyhjcmVhdGVFbCgpLCB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICAgICAgLCB3aWR0aDogby5zY2FsZSAqIChvLmxlbmd0aCArIG8ud2lkdGgpICsgJ3B4J1xuICAgICAgICAsIGhlaWdodDogby5zY2FsZSAqIG8ud2lkdGggKyAncHgnXG4gICAgICAgICwgYmFja2dyb3VuZDogY29sb3JcbiAgICAgICAgLCBib3hTaGFkb3c6IHNoYWRvd1xuICAgICAgICAsIHRyYW5zZm9ybU9yaWdpbjogJ2xlZnQnXG4gICAgICAgICwgdHJhbnNmb3JtOiAncm90YXRlKCcgKyB+figzNjAvby5saW5lcyppICsgby5yb3RhdGUpICsgJ2RlZykgdHJhbnNsYXRlKCcgKyBvLnNjYWxlKm8ucmFkaXVzICsgJ3B4JyArICcsMCknXG4gICAgICAgICwgYm9yZGVyUmFkaXVzOiAoby5jb3JuZXJzICogby5zY2FsZSAqIG8ud2lkdGggPj4gMSkgKyAncHgnXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBpIDwgby5saW5lczsgaSsrKSB7XG4gICAgICAgIHNlZyA9IGNzcyhjcmVhdGVFbCgpLCB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICAgICAgLCB0b3A6IDEgKyB+KG8uc2NhbGUgKiBvLndpZHRoIC8gMikgKyAncHgnXG4gICAgICAgICwgdHJhbnNmb3JtOiBvLmh3YWNjZWwgPyAndHJhbnNsYXRlM2QoMCwwLDApJyA6ICcnXG4gICAgICAgICwgb3BhY2l0eTogby5vcGFjaXR5XG4gICAgICAgICwgYW5pbWF0aW9uOiB1c2VDc3NBbmltYXRpb25zICYmIGFkZEFuaW1hdGlvbihvLm9wYWNpdHksIG8udHJhaWwsIHN0YXJ0ICsgaSAqIG8uZGlyZWN0aW9uLCBvLmxpbmVzKSArICcgJyArIDEgLyBvLnNwZWVkICsgJ3MgbGluZWFyIGluZmluaXRlJ1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChvLnNoYWRvdykgaW5zKHNlZywgY3NzKGZpbGwoJyMwMDAnLCAnMCAwIDRweCAjMDAwJyksIHt0b3A6ICcycHgnfSkpXG4gICAgICAgIGlucyhlbCwgaW5zKHNlZywgZmlsbChnZXRDb2xvcihvLmNvbG9yLCBpKSwgJzAgMCAxcHggcmdiYSgwLDAsMCwuMSknKSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gZWxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBhZGp1c3RzIHRoZSBvcGFjaXR5IG9mIGEgc2luZ2xlIGxpbmUuXG4gICAgICogV2lsbCBiZSBvdmVyd3JpdHRlbiBpbiBWTUwgZmFsbGJhY2sgbW9kZSBiZWxvdy5cbiAgICAgKi9cbiAgLCBvcGFjaXR5OiBmdW5jdGlvbiAoZWwsIGksIHZhbCkge1xuICAgICAgaWYgKGkgPCBlbC5jaGlsZE5vZGVzLmxlbmd0aCkgZWwuY2hpbGROb2Rlc1tpXS5zdHlsZS5vcGFjaXR5ID0gdmFsXG4gICAgfVxuXG4gIH0pXG5cblxuICBmdW5jdGlvbiBpbml0Vk1MICgpIHtcblxuICAgIC8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgVk1MIHRhZyAqL1xuICAgIGZ1bmN0aW9uIHZtbCAodGFnLCBhdHRyKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRWwoJzwnICsgdGFnICsgJyB4bWxucz1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC5jb206dm1sXCIgY2xhc3M9XCJzcGluLXZtbFwiPicsIGF0dHIpXG4gICAgfVxuXG4gICAgLy8gTm8gQ1NTIHRyYW5zZm9ybXMgYnV0IFZNTCBzdXBwb3J0LCBhZGQgYSBDU1MgcnVsZSBmb3IgVk1MIGVsZW1lbnRzOlxuICAgIHNoZWV0LmFkZFJ1bGUoJy5zcGluLXZtbCcsICdiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKScpXG5cbiAgICBTcGlubmVyLnByb3RvdHlwZS5saW5lcyA9IGZ1bmN0aW9uIChlbCwgbykge1xuICAgICAgdmFyIHIgPSBvLnNjYWxlICogKG8ubGVuZ3RoICsgby53aWR0aClcbiAgICAgICAgLCBzID0gby5zY2FsZSAqIDIgKiByXG5cbiAgICAgIGZ1bmN0aW9uIGdycCAoKSB7XG4gICAgICAgIHJldHVybiBjc3MoXG4gICAgICAgICAgdm1sKCdncm91cCcsIHtcbiAgICAgICAgICAgIGNvb3Jkc2l6ZTogcyArICcgJyArIHNcbiAgICAgICAgICAsIGNvb3Jkb3JpZ2luOiAtciArICcgJyArIC1yXG4gICAgICAgICAgfSlcbiAgICAgICAgLCB7IHdpZHRoOiBzLCBoZWlnaHQ6IHMgfVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHZhciBtYXJnaW4gPSAtKG8ud2lkdGggKyBvLmxlbmd0aCkgKiBvLnNjYWxlICogMiArICdweCdcbiAgICAgICAgLCBnID0gY3NzKGdycCgpLCB7cG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogbWFyZ2luLCBsZWZ0OiBtYXJnaW59KVxuICAgICAgICAsIGlcblxuICAgICAgZnVuY3Rpb24gc2VnIChpLCBkeCwgZmlsdGVyKSB7XG4gICAgICAgIGlucyhcbiAgICAgICAgICBnXG4gICAgICAgICwgaW5zKFxuICAgICAgICAgICAgY3NzKGdycCgpLCB7cm90YXRpb246IDM2MCAvIG8ubGluZXMgKiBpICsgJ2RlZycsIGxlZnQ6IH5+ZHh9KVxuICAgICAgICAgICwgaW5zKFxuICAgICAgICAgICAgICBjc3MoXG4gICAgICAgICAgICAgICAgdm1sKCdyb3VuZHJlY3QnLCB7YXJjc2l6ZTogby5jb3JuZXJzfSlcbiAgICAgICAgICAgICAgLCB7IHdpZHRoOiByXG4gICAgICAgICAgICAgICAgLCBoZWlnaHQ6IG8uc2NhbGUgKiBvLndpZHRoXG4gICAgICAgICAgICAgICAgLCBsZWZ0OiBvLnNjYWxlICogby5yYWRpdXNcbiAgICAgICAgICAgICAgICAsIHRvcDogLW8uc2NhbGUgKiBvLndpZHRoID4+IDFcbiAgICAgICAgICAgICAgICAsIGZpbHRlcjogZmlsdGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAsIHZtbCgnZmlsbCcsIHtjb2xvcjogZ2V0Q29sb3Ioby5jb2xvciwgaSksIG9wYWNpdHk6IG8ub3BhY2l0eX0pXG4gICAgICAgICAgICAsIHZtbCgnc3Ryb2tlJywge29wYWNpdHk6IDB9KSAvLyB0cmFuc3BhcmVudCBzdHJva2UgdG8gZml4IGNvbG9yIGJsZWVkaW5nIHVwb24gb3BhY2l0eSBjaGFuZ2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKG8uc2hhZG93KVxuICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG8ubGluZXM7IGkrKykge1xuICAgICAgICAgIHNlZyhpLCAtMiwgJ3Byb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CbHVyKHBpeGVscmFkaXVzPTIsbWFrZXNoYWRvdz0xLHNoYWRvd29wYWNpdHk9LjMpJylcbiAgICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAxOyBpIDw9IG8ubGluZXM7IGkrKykgc2VnKGkpXG4gICAgICByZXR1cm4gaW5zKGVsLCBnKVxuICAgIH1cblxuICAgIFNwaW5uZXIucHJvdG90eXBlLm9wYWNpdHkgPSBmdW5jdGlvbiAoZWwsIGksIHZhbCwgbykge1xuICAgICAgdmFyIGMgPSBlbC5maXJzdENoaWxkXG4gICAgICBvID0gby5zaGFkb3cgJiYgby5saW5lcyB8fCAwXG4gICAgICBpZiAoYyAmJiBpICsgbyA8IGMuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgYyA9IGMuY2hpbGROb2Rlc1tpICsgb107IGMgPSBjICYmIGMuZmlyc3RDaGlsZDsgYyA9IGMgJiYgYy5maXJzdENoaWxkXG4gICAgICAgIGlmIChjKSBjLm9wYWNpdHkgPSB2YWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHNoZWV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlbCA9IGNyZWF0ZUVsKCdzdHlsZScsIHt0eXBlIDogJ3RleHQvY3NzJ30pXG4gICAgICBpbnMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSwgZWwpXG4gICAgICByZXR1cm4gZWwuc2hlZXQgfHwgZWwuc3R5bGVTaGVldFxuICAgIH0oKSlcblxuICAgIHZhciBwcm9iZSA9IGNzcyhjcmVhdGVFbCgnZ3JvdXAnKSwge2JlaGF2aW9yOiAndXJsKCNkZWZhdWx0I1ZNTCknfSlcblxuICAgIGlmICghdmVuZG9yKHByb2JlLCAndHJhbnNmb3JtJykgJiYgcHJvYmUuYWRqKSBpbml0Vk1MKClcbiAgICBlbHNlIHVzZUNzc0FuaW1hdGlvbnMgPSB2ZW5kb3IocHJvYmUsICdhbmltYXRpb24nKVxuICB9XG5cbiAgcmV0dXJuIFNwaW5uZXJcblxufSkpO1xuIiwiIWZ1bmN0aW9uKCkge1xyXG4gIHZhciBkMyA9IHtcclxuICAgIHZlcnNpb246IFwiMy41LjE3XCJcclxuICB9O1xyXG4gIHZhciBkM19hcnJheVNsaWNlID0gW10uc2xpY2UsIGQzX2FycmF5ID0gZnVuY3Rpb24obGlzdCkge1xyXG4gICAgcmV0dXJuIGQzX2FycmF5U2xpY2UuY2FsbChsaXN0KTtcclxuICB9O1xyXG4gIHZhciBkM19kb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQ7XHJcbiAgZnVuY3Rpb24gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpIHtcclxuICAgIHJldHVybiBub2RlICYmIChub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZS5kb2N1bWVudCB8fCBub2RlKS5kb2N1bWVudEVsZW1lbnQ7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3dpbmRvdyhub2RlKSB7XHJcbiAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgfHwgbm9kZS5kZWZhdWx0Vmlldyk7XHJcbiAgfVxyXG4gIGlmIChkM19kb2N1bWVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgZDNfYXJyYXkoZDNfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBkM19hcnJheSA9IGZ1bmN0aW9uKGxpc3QpIHtcclxuICAgICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoLCBhcnJheSA9IG5ldyBBcnJheShpKTtcclxuICAgICAgICB3aGlsZSAoaS0tKSBhcnJheVtpXSA9IGxpc3RbaV07XHJcbiAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoIURhdGUubm93KSBEYXRlLm5vdyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuICtuZXcgRGF0ZSgpO1xyXG4gIH07XHJcbiAgaWYgKGQzX2RvY3VtZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBkM19kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpLnN0eWxlLnNldFByb3BlcnR5KFwib3BhY2l0eVwiLCAwLCBcIlwiKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHZhciBkM19lbGVtZW50X3Byb3RvdHlwZSA9IHRoaXMuRWxlbWVudC5wcm90b3R5cGUsIGQzX2VsZW1lbnRfc2V0QXR0cmlidXRlID0gZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlLCBkM19lbGVtZW50X3NldEF0dHJpYnV0ZU5TID0gZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsIGQzX3N0eWxlX3Byb3RvdHlwZSA9IHRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsIGQzX3N0eWxlX3NldFByb3BlcnR5ID0gZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5O1xyXG4gICAgICBkM19lbGVtZW50X3Byb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xyXG4gICAgICAgIGQzX2VsZW1lbnRfc2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgdmFsdWUgKyBcIlwiKTtcclxuICAgICAgfTtcclxuICAgICAgZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMgPSBmdW5jdGlvbihzcGFjZSwgbG9jYWwsIHZhbHVlKSB7XHJcbiAgICAgICAgZDNfZWxlbWVudF9zZXRBdHRyaWJ1dGVOUy5jYWxsKHRoaXMsIHNwYWNlLCBsb2NhbCwgdmFsdWUgKyBcIlwiKTtcclxuICAgICAgfTtcclxuICAgICAgZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XHJcbiAgICAgICAgZDNfc3R5bGVfc2V0UHJvcGVydHkuY2FsbCh0aGlzLCBuYW1lLCB2YWx1ZSArIFwiXCIsIHByaW9yaXR5KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbiAgZDMuYXNjZW5kaW5nID0gZDNfYXNjZW5kaW5nO1xyXG4gIGZ1bmN0aW9uIGQzX2FzY2VuZGluZyhhLCBiKSB7XHJcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XHJcbiAgfVxyXG4gIGQzLmRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7XHJcbiAgICByZXR1cm4gYiA8IGEgPyAtMSA6IGIgPiBhID8gMSA6IGIgPj0gYSA/IDAgOiBOYU47XHJcbiAgfTtcclxuICBkMy5taW4gPSBmdW5jdGlvbihhcnJheSwgZikge1xyXG4gICAgdmFyIGkgPSAtMSwgbiA9IGFycmF5Lmxlbmd0aCwgYSwgYjtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID49IGIpIHtcclxuICAgICAgICBhID0gYjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYSA+IGIpIGEgPSBiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPj0gYikge1xyXG4gICAgICAgIGEgPSBiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYTtcclxuICB9O1xyXG4gIGQzLm1heCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XHJcbiAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBiO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPj0gYikge1xyXG4gICAgICAgIGEgPSBiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYiA+PSBiKSB7XHJcbiAgICAgICAgYSA9IGI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjtcclxuICAgIH1cclxuICAgIHJldHVybiBhO1xyXG4gIH07XHJcbiAgZDMuZXh0ZW50ID0gZnVuY3Rpb24oYXJyYXksIGYpIHtcclxuICAgIHZhciBpID0gLTEsIG4gPSBhcnJheS5sZW5ndGgsIGEsIGIsIGM7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7XHJcbiAgICAgICAgYSA9IGMgPSBiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChhID4gYikgYSA9IGI7XHJcbiAgICAgICAgaWYgKGMgPCBiKSBjID0gYjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPj0gYikge1xyXG4gICAgICAgIGEgPSBjID0gYjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoYSA+IGIpIGEgPSBiO1xyXG4gICAgICAgIGlmIChjIDwgYikgYyA9IGI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBbIGEsIGMgXTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX251bWJlcih4KSB7XHJcbiAgICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19udW1lcmljKHgpIHtcclxuICAgIHJldHVybiAhaXNOYU4oeCk7XHJcbiAgfVxyXG4gIGQzLnN1bSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XHJcbiAgICB2YXIgcyA9IDAsIG4gPSBhcnJheS5sZW5ndGgsIGEsIGkgPSAtMTtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtZXJpYyhhID0gK2FycmF5W2ldKSkgcyArPSBhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1lcmljKGEgPSArZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSBzICs9IGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcztcclxuICB9O1xyXG4gIGQzLm1lYW4gPSBmdW5jdGlvbihhcnJheSwgZikge1xyXG4gICAgdmFyIHMgPSAwLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBpID0gLTEsIGogPSBuO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1lcmljKGEgPSBkM19udW1iZXIoYXJyYXlbaV0pKSkgcyArPSBhOyBlbHNlIC0tajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtZXJpYyhhID0gZDNfbnVtYmVyKGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkpIHMgKz0gYTsgZWxzZSAtLWo7XHJcbiAgICB9XHJcbiAgICBpZiAoaikgcmV0dXJuIHMgLyBqO1xyXG4gIH07XHJcbiAgZDMucXVhbnRpbGUgPSBmdW5jdGlvbih2YWx1ZXMsIHApIHtcclxuICAgIHZhciBIID0gKHZhbHVlcy5sZW5ndGggLSAxKSAqIHAgKyAxLCBoID0gTWF0aC5mbG9vcihIKSwgdiA9ICt2YWx1ZXNbaCAtIDFdLCBlID0gSCAtIGg7XHJcbiAgICByZXR1cm4gZSA/IHYgKyBlICogKHZhbHVlc1toXSAtIHYpIDogdjtcclxuICB9O1xyXG4gIGQzLm1lZGlhbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XHJcbiAgICB2YXIgbnVtYmVycyA9IFtdLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBpID0gLTE7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWVyaWMoYSA9IGQzX251bWJlcihhcnJheVtpXSkpKSBudW1iZXJzLnB1c2goYSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWVyaWMoYSA9IGQzX251bWJlcihmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkpKSBudW1iZXJzLnB1c2goYSk7XHJcbiAgICB9XHJcbiAgICBpZiAobnVtYmVycy5sZW5ndGgpIHJldHVybiBkMy5xdWFudGlsZShudW1iZXJzLnNvcnQoZDNfYXNjZW5kaW5nKSwgLjUpO1xyXG4gIH07XHJcbiAgZDMudmFyaWFuY2UgPSBmdW5jdGlvbihhcnJheSwgZikge1xyXG4gICAgdmFyIG4gPSBhcnJheS5sZW5ndGgsIG0gPSAwLCBhLCBkLCBzID0gMCwgaSA9IC0xLCBqID0gMDtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgICAgaWYgKGQzX251bWVyaWMoYSA9IGQzX251bWJlcihhcnJheVtpXSkpKSB7XHJcbiAgICAgICAgICBkID0gYSAtIG07XHJcbiAgICAgICAgICBtICs9IGQgLyArK2o7XHJcbiAgICAgICAgICBzICs9IGQgKiAoYSAtIG0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICBpZiAoZDNfbnVtZXJpYyhhID0gZDNfbnVtYmVyKGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkpIHtcclxuICAgICAgICAgIGQgPSBhIC0gbTtcclxuICAgICAgICAgIG0gKz0gZCAvICsrajtcclxuICAgICAgICAgIHMgKz0gZCAqIChhIC0gbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaiA+IDEpIHJldHVybiBzIC8gKGogLSAxKTtcclxuICB9O1xyXG4gIGQzLmRldmlhdGlvbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIHYgPSBkMy52YXJpYW5jZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2O1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfYmlzZWN0b3IoY29tcGFyZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBsbyA9IDA7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoO1xyXG4gICAgICAgIHdoaWxlIChsbyA8IGhpKSB7XHJcbiAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcclxuICAgICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7IGVsc2UgaGkgPSBtaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsbztcclxuICAgICAgfSxcclxuICAgICAgcmlnaHQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkge1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgbG8gPSAwO1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgaGkgPSBhLmxlbmd0aDtcclxuICAgICAgICB3aGlsZSAobG8gPCBoaSkge1xyXG4gICAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7XHJcbiAgICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7IGVsc2UgbG8gPSBtaWQgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbG87XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIHZhciBkM19iaXNlY3QgPSBkM19iaXNlY3RvcihkM19hc2NlbmRpbmcpO1xyXG4gIGQzLmJpc2VjdExlZnQgPSBkM19iaXNlY3QubGVmdDtcclxuICBkMy5iaXNlY3QgPSBkMy5iaXNlY3RSaWdodCA9IGQzX2Jpc2VjdC5yaWdodDtcclxuICBkMy5iaXNlY3RvciA9IGZ1bmN0aW9uKGYpIHtcclxuICAgIHJldHVybiBkM19iaXNlY3RvcihmLmxlbmd0aCA9PT0gMSA/IGZ1bmN0aW9uKGQsIHgpIHtcclxuICAgICAgcmV0dXJuIGQzX2FzY2VuZGluZyhmKGQpLCB4KTtcclxuICAgIH0gOiBmKTtcclxuICB9O1xyXG4gIGQzLnNodWZmbGUgPSBmdW5jdGlvbihhcnJheSwgaTAsIGkxKSB7XHJcbiAgICBpZiAoKG0gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDMpIHtcclxuICAgICAgaTEgPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgIGlmIChtIDwgMikgaTAgPSAwO1xyXG4gICAgfVxyXG4gICAgdmFyIG0gPSBpMSAtIGkwLCB0LCBpO1xyXG4gICAgd2hpbGUgKG0pIHtcclxuICAgICAgaSA9IE1hdGgucmFuZG9tKCkgKiBtLS0gfCAwO1xyXG4gICAgICB0ID0gYXJyYXlbbSArIGkwXSwgYXJyYXlbbSArIGkwXSA9IGFycmF5W2kgKyBpMF0sIGFycmF5W2kgKyBpMF0gPSB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH07XHJcbiAgZDMucGVybXV0ZSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7XHJcbiAgICB2YXIgaSA9IGluZGV4ZXMubGVuZ3RoLCBwZXJtdXRlcyA9IG5ldyBBcnJheShpKTtcclxuICAgIHdoaWxlIChpLS0pIHBlcm11dGVzW2ldID0gYXJyYXlbaW5kZXhlc1tpXV07XHJcbiAgICByZXR1cm4gcGVybXV0ZXM7XHJcbiAgfTtcclxuICBkMy5wYWlycyA9IGZ1bmN0aW9uKGFycmF5KSB7XHJcbiAgICB2YXIgaSA9IDAsIG4gPSBhcnJheS5sZW5ndGggLSAxLCBwMCwgcDEgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7XHJcbiAgICB3aGlsZSAoaSA8IG4pIHBhaXJzW2ldID0gWyBwMCA9IHAxLCBwMSA9IGFycmF5WysraV0gXTtcclxuICAgIHJldHVybiBwYWlycztcclxuICB9O1xyXG4gIGQzLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG1hdHJpeCkge1xyXG4gICAgaWYgKCEobiA9IG1hdHJpeC5sZW5ndGgpKSByZXR1cm4gW107XHJcbiAgICBmb3IgKHZhciBpID0gLTEsIG0gPSBkMy5taW4obWF0cml4LCBkM190cmFuc3Bvc2VMZW5ndGgpLCB0cmFuc3Bvc2UgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07ICkge1xyXG4gICAgICBmb3IgKHZhciBqID0gLTEsIG4sIHJvdyA9IHRyYW5zcG9zZVtpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjsgKSB7XHJcbiAgICAgICAgcm93W2pdID0gbWF0cml4W2pdW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJhbnNwb3NlO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfdHJhbnNwb3NlTGVuZ3RoKGQpIHtcclxuICAgIHJldHVybiBkLmxlbmd0aDtcclxuICB9XHJcbiAgZDMuemlwID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDMudHJhbnNwb3NlKGFyZ3VtZW50cyk7XHJcbiAgfTtcclxuICBkMy5rZXlzID0gZnVuY3Rpb24obWFwKSB7XHJcbiAgICB2YXIga2V5cyA9IFtdO1xyXG4gICAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7XHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9O1xyXG4gIGQzLnZhbHVlcyA9IGZ1bmN0aW9uKG1hcCkge1xyXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xyXG4gICAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pO1xyXG4gICAgcmV0dXJuIHZhbHVlcztcclxuICB9O1xyXG4gIGQzLmVudHJpZXMgPSBmdW5jdGlvbihtYXApIHtcclxuICAgIHZhciBlbnRyaWVzID0gW107XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe1xyXG4gICAgICBrZXk6IGtleSxcclxuICAgICAgdmFsdWU6IG1hcFtrZXldXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBlbnRyaWVzO1xyXG4gIH07XHJcbiAgZDMubWVyZ2UgPSBmdW5jdGlvbihhcnJheXMpIHtcclxuICAgIHZhciBuID0gYXJyYXlzLmxlbmd0aCwgbSwgaSA9IC0xLCBqID0gMCwgbWVyZ2VkLCBhcnJheTtcclxuICAgIHdoaWxlICgrK2kgPCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7XHJcbiAgICBtZXJnZWQgPSBuZXcgQXJyYXkoaik7XHJcbiAgICB3aGlsZSAoLS1uID49IDApIHtcclxuICAgICAgYXJyYXkgPSBhcnJheXNbbl07XHJcbiAgICAgIG0gPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgIHdoaWxlICgtLW0gPj0gMCkge1xyXG4gICAgICAgIG1lcmdlZFstLWpdID0gYXJyYXlbbV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtZXJnZWQ7XHJcbiAgfTtcclxuICB2YXIgYWJzID0gTWF0aC5hYnM7XHJcbiAgZDMucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XHJcbiAgICAgIHN0ZXAgPSAxO1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICBzdG9wID0gc3RhcnQ7XHJcbiAgICAgICAgc3RhcnQgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoKHN0b3AgLSBzdGFydCkgLyBzdGVwID09PSBJbmZpbml0eSkgdGhyb3cgbmV3IEVycm9yKFwiaW5maW5pdGUgcmFuZ2VcIik7XHJcbiAgICB2YXIgcmFuZ2UgPSBbXSwgayA9IGQzX3JhbmdlX2ludGVnZXJTY2FsZShhYnMoc3RlcCkpLCBpID0gLTEsIGo7XHJcbiAgICBzdGFydCAqPSBrLCBzdG9wICo9IGssIHN0ZXAgKj0gaztcclxuICAgIGlmIChzdGVwIDwgMCkgd2hpbGUgKChqID0gc3RhcnQgKyBzdGVwICogKytpKSA+IHN0b3ApIHJhbmdlLnB1c2goaiAvIGspOyBlbHNlIHdoaWxlICgoaiA9IHN0YXJ0ICsgc3RlcCAqICsraSkgPCBzdG9wKSByYW5nZS5wdXNoKGogLyBrKTtcclxuICAgIHJldHVybiByYW5nZTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3JhbmdlX2ludGVnZXJTY2FsZSh4KSB7XHJcbiAgICB2YXIgayA9IDE7XHJcbiAgICB3aGlsZSAoeCAqIGsgJSAxKSBrICo9IDEwO1xyXG4gICAgcmV0dXJuIGs7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2NsYXNzKGN0b3IsIHByb3BlcnRpZXMpIHtcclxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwga2V5LCB7XHJcbiAgICAgICAgdmFsdWU6IHByb3BlcnRpZXNba2V5XSxcclxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgZDMubWFwID0gZnVuY3Rpb24ob2JqZWN0LCBmKSB7XHJcbiAgICB2YXIgbWFwID0gbmV3IGQzX01hcCgpO1xyXG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIGQzX01hcCkge1xyXG4gICAgICBvYmplY3QuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xyXG4gICAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aCwgbztcclxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7IGVsc2Ugd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoZi5jYWxsKG9iamVjdCwgbyA9IG9iamVjdFtpXSwgaSksIG8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkgbWFwLnNldChrZXksIG9iamVjdFtrZXldKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXA7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19NYXAoKSB7XHJcbiAgICB0aGlzLl8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gIH1cclxuICB2YXIgZDNfbWFwX3Byb3RvID0gXCJfX3Byb3RvX19cIiwgZDNfbWFwX3plcm8gPSBcIlxceDAwXCI7XHJcbiAgZDNfY2xhc3MoZDNfTWFwLCB7XHJcbiAgICBoYXM6IGQzX21hcF9oYXMsXHJcbiAgICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fW2QzX21hcF9lc2NhcGUoa2V5KV07XHJcbiAgICB9LFxyXG4gICAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9bZDNfbWFwX2VzY2FwZShrZXkpXSA9IHZhbHVlO1xyXG4gICAgfSxcclxuICAgIHJlbW92ZTogZDNfbWFwX3JlbW92ZSxcclxuICAgIGtleXM6IGQzX21hcF9rZXlzLFxyXG4gICAgdmFsdWVzOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xyXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSB2YWx1ZXMucHVzaCh0aGlzLl9ba2V5XSk7XHJcbiAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICB9LFxyXG4gICAgZW50cmllczogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBlbnRyaWVzID0gW107XHJcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl8pIGVudHJpZXMucHVzaCh7XHJcbiAgICAgICAga2V5OiBkM19tYXBfdW5lc2NhcGUoa2V5KSxcclxuICAgICAgICB2YWx1ZTogdGhpcy5fW2tleV1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBlbnRyaWVzO1xyXG4gICAgfSxcclxuICAgIHNpemU6IGQzX21hcF9zaXplLFxyXG4gICAgZW1wdHk6IGQzX21hcF9lbXB0eSxcclxuICAgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHtcclxuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuXykgZi5jYWxsKHRoaXMsIGQzX21hcF91bmVzY2FwZShrZXkpLCB0aGlzLl9ba2V5XSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgZnVuY3Rpb24gZDNfbWFwX2VzY2FwZShrZXkpIHtcclxuICAgIHJldHVybiAoa2V5ICs9IFwiXCIpID09PSBkM19tYXBfcHJvdG8gfHwga2V5WzBdID09PSBkM19tYXBfemVybyA/IGQzX21hcF96ZXJvICsga2V5IDoga2V5O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19tYXBfdW5lc2NhcGUoa2V5KSB7XHJcbiAgICByZXR1cm4gKGtleSArPSBcIlwiKVswXSA9PT0gZDNfbWFwX3plcm8gPyBrZXkuc2xpY2UoMSkgOiBrZXk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX21hcF9oYXMoa2V5KSB7XHJcbiAgICByZXR1cm4gZDNfbWFwX2VzY2FwZShrZXkpIGluIHRoaXMuXztcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfbWFwX3JlbW92ZShrZXkpIHtcclxuICAgIHJldHVybiAoa2V5ID0gZDNfbWFwX2VzY2FwZShrZXkpKSBpbiB0aGlzLl8gJiYgZGVsZXRlIHRoaXMuX1trZXldO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19tYXBfa2V5cygpIHtcclxuICAgIHZhciBrZXlzID0gW107XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSBrZXlzLnB1c2goZDNfbWFwX3VuZXNjYXBlKGtleSkpO1xyXG4gICAgcmV0dXJuIGtleXM7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX21hcF9zaXplKCkge1xyXG4gICAgdmFyIHNpemUgPSAwO1xyXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuXykgKytzaXplO1xyXG4gICAgcmV0dXJuIHNpemU7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX21hcF9lbXB0eSgpIHtcclxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl8pIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICBkMy5uZXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgbmVzdCA9IHt9LCBrZXlzID0gW10sIHNvcnRLZXlzID0gW10sIHNvcnRWYWx1ZXMsIHJvbGx1cDtcclxuICAgIGZ1bmN0aW9uIG1hcChtYXBUeXBlLCBhcnJheSwgZGVwdGgpIHtcclxuICAgICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gcm9sbHVwID8gcm9sbHVwLmNhbGwobmVzdCwgYXJyYXkpIDogc29ydFZhbHVlcyA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykgOiBhcnJheTtcclxuICAgICAgdmFyIGkgPSAtMSwgbiA9IGFycmF5Lmxlbmd0aCwga2V5ID0ga2V5c1tkZXB0aCsrXSwga2V5VmFsdWUsIG9iamVjdCwgc2V0dGVyLCB2YWx1ZXNCeUtleSA9IG5ldyBkM19NYXAoKSwgdmFsdWVzO1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkob2JqZWN0ID0gYXJyYXlbaV0pKSkge1xyXG4gICAgICAgICAgdmFsdWVzLnB1c2gob2JqZWN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbIG9iamVjdCBdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hcFR5cGUpIHtcclxuICAgICAgICBvYmplY3QgPSBtYXBUeXBlKCk7XHJcbiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oa2V5VmFsdWUsIHZhbHVlcykge1xyXG4gICAgICAgICAgb2JqZWN0LnNldChrZXlWYWx1ZSwgbWFwKG1hcFR5cGUsIHZhbHVlcywgZGVwdGgpKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9iamVjdCA9IHt9O1xyXG4gICAgICAgIHNldHRlciA9IGZ1bmN0aW9uKGtleVZhbHVlLCB2YWx1ZXMpIHtcclxuICAgICAgICAgIG9iamVjdFtrZXlWYWx1ZV0gPSBtYXAobWFwVHlwZSwgdmFsdWVzLCBkZXB0aCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICB2YWx1ZXNCeUtleS5mb3JFYWNoKHNldHRlcik7XHJcbiAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHtcclxuICAgICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwO1xyXG4gICAgICB2YXIgYXJyYXkgPSBbXSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRoKytdO1xyXG4gICAgICBtYXAuZm9yRWFjaChmdW5jdGlvbihrZXksIGtleU1hcCkge1xyXG4gICAgICAgIGFycmF5LnB1c2goe1xyXG4gICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICB2YWx1ZXM6IGVudHJpZXMoa2V5TWFwLCBkZXB0aClcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBzb3J0S2V5ID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTtcclxuICAgICAgfSkgOiBhcnJheTtcclxuICAgIH1cclxuICAgIG5lc3QubWFwID0gZnVuY3Rpb24oYXJyYXksIG1hcFR5cGUpIHtcclxuICAgICAgcmV0dXJuIG1hcChtYXBUeXBlLCBhcnJheSwgMCk7XHJcbiAgICB9O1xyXG4gICAgbmVzdC5lbnRyaWVzID0gZnVuY3Rpb24oYXJyYXkpIHtcclxuICAgICAgcmV0dXJuIGVudHJpZXMobWFwKGQzLm1hcCwgYXJyYXksIDApLCAwKTtcclxuICAgIH07XHJcbiAgICBuZXN0LmtleSA9IGZ1bmN0aW9uKGQpIHtcclxuICAgICAga2V5cy5wdXNoKGQpO1xyXG4gICAgICByZXR1cm4gbmVzdDtcclxuICAgIH07XHJcbiAgICBuZXN0LnNvcnRLZXlzID0gZnVuY3Rpb24ob3JkZXIpIHtcclxuICAgICAgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyO1xyXG4gICAgICByZXR1cm4gbmVzdDtcclxuICAgIH07XHJcbiAgICBuZXN0LnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihvcmRlcikge1xyXG4gICAgICBzb3J0VmFsdWVzID0gb3JkZXI7XHJcbiAgICAgIHJldHVybiBuZXN0O1xyXG4gICAgfTtcclxuICAgIG5lc3Qucm9sbHVwID0gZnVuY3Rpb24oZikge1xyXG4gICAgICByb2xsdXAgPSBmO1xyXG4gICAgICByZXR1cm4gbmVzdDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmVzdDtcclxuICB9O1xyXG4gIGQzLnNldCA9IGZ1bmN0aW9uKGFycmF5KSB7XHJcbiAgICB2YXIgc2V0ID0gbmV3IGQzX1NldCgpO1xyXG4gICAgaWYgKGFycmF5KSBmb3IgKHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aDsgaSA8IG47ICsraSkgc2V0LmFkZChhcnJheVtpXSk7XHJcbiAgICByZXR1cm4gc2V0O1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfU2V0KCkge1xyXG4gICAgdGhpcy5fID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICB9XHJcbiAgZDNfY2xhc3MoZDNfU2V0LCB7XHJcbiAgICBoYXM6IGQzX21hcF9oYXMsXHJcbiAgICBhZGQ6IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICB0aGlzLl9bZDNfbWFwX2VzY2FwZShrZXkgKz0gXCJcIildID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6IGQzX21hcF9yZW1vdmUsXHJcbiAgICB2YWx1ZXM6IGQzX21hcF9rZXlzLFxyXG4gICAgc2l6ZTogZDNfbWFwX3NpemUsXHJcbiAgICBlbXB0eTogZDNfbWFwX2VtcHR5LFxyXG4gICAgZm9yRWFjaDogZnVuY3Rpb24oZikge1xyXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSBmLmNhbGwodGhpcywgZDNfbWFwX3VuZXNjYXBlKGtleSkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGQzLmJlaGF2aW9yID0ge307XHJcbiAgZnVuY3Rpb24gZDNfaWRlbnRpdHkoZCkge1xyXG4gICAgcmV0dXJuIGQ7XHJcbiAgfVxyXG4gIGQzLnJlYmluZCA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7XHJcbiAgICB2YXIgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBtZXRob2Q7XHJcbiAgICB3aGlsZSAoKytpIDwgbikgdGFyZ2V0W21ldGhvZCA9IGFyZ3VtZW50c1tpXV0gPSBkM19yZWJpbmQodGFyZ2V0LCBzb3VyY2UsIHNvdXJjZVttZXRob2RdKTtcclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19yZWJpbmQodGFyZ2V0LCBzb3VyY2UsIG1ldGhvZCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgdmFsdWUgPSBtZXRob2QuYXBwbHkoc291cmNlLCBhcmd1bWVudHMpO1xyXG4gICAgICByZXR1cm4gdmFsdWUgPT09IHNvdXJjZSA/IHRhcmdldCA6IHZhbHVlO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdmVuZG9yU3ltYm9sKG9iamVjdCwgbmFtZSkge1xyXG4gICAgaWYgKG5hbWUgaW4gb2JqZWN0KSByZXR1cm4gbmFtZTtcclxuICAgIG5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcclxuICAgIGZvciAodmFyIGkgPSAwLCBuID0gZDNfdmVuZG9yUHJlZml4ZXMubGVuZ3RoOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgIHZhciBwcmVmaXhOYW1lID0gZDNfdmVuZG9yUHJlZml4ZXNbaV0gKyBuYW1lO1xyXG4gICAgICBpZiAocHJlZml4TmFtZSBpbiBvYmplY3QpIHJldHVybiBwcmVmaXhOYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuICB2YXIgZDNfdmVuZG9yUHJlZml4ZXMgPSBbIFwid2Via2l0XCIsIFwibXNcIiwgXCJtb3pcIiwgXCJNb3pcIiwgXCJvXCIsIFwiT1wiIF07XHJcbiAgZnVuY3Rpb24gZDNfbm9vcCgpIHt9XHJcbiAgZDMuZGlzcGF0Y2ggPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBkaXNwYXRjaCA9IG5ldyBkM19kaXNwYXRjaCgpLCBpID0gLTEsIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xyXG4gICAgd2hpbGUgKCsraSA8IG4pIGRpc3BhdGNoW2FyZ3VtZW50c1tpXV0gPSBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCk7XHJcbiAgICByZXR1cm4gZGlzcGF0Y2g7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19kaXNwYXRjaCgpIHt9XHJcbiAgZDNfZGlzcGF0Y2gucHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcclxuICAgIHZhciBpID0gdHlwZS5pbmRleE9mKFwiLlwiKSwgbmFtZSA9IFwiXCI7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIG5hbWUgPSB0eXBlLnNsaWNlKGkgKyAxKTtcclxuICAgICAgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSkgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdGhpc1t0eXBlXS5vbihuYW1lKSA6IHRoaXNbdHlwZV0ub24obmFtZSwgbGlzdGVuZXIpO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIGZvciAodHlwZSBpbiB0aGlzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkodHlwZSkpIHRoaXNbdHlwZV0ub24obmFtZSwgbnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCkge1xyXG4gICAgdmFyIGxpc3RlbmVycyA9IFtdLCBsaXN0ZW5lckJ5TmFtZSA9IG5ldyBkM19NYXAoKTtcclxuICAgIGZ1bmN0aW9uIGV2ZW50KCkge1xyXG4gICAgICB2YXIgeiA9IGxpc3RlbmVycywgaSA9IC0xLCBuID0gei5sZW5ndGgsIGw7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAobCA9IHpbaV0ub24pIGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgcmV0dXJuIGRpc3BhdGNoO1xyXG4gICAgfVxyXG4gICAgZXZlbnQub24gPSBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xyXG4gICAgICB2YXIgbCA9IGxpc3RlbmVyQnlOYW1lLmdldChuYW1lKSwgaTtcclxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gbCAmJiBsLm9uO1xyXG4gICAgICBpZiAobCkge1xyXG4gICAgICAgIGwub24gPSBudWxsO1xyXG4gICAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSgwLCBpID0gbGlzdGVuZXJzLmluZGV4T2YobCkpLmNvbmNhdChsaXN0ZW5lcnMuc2xpY2UoaSArIDEpKTtcclxuICAgICAgICBsaXN0ZW5lckJ5TmFtZS5yZW1vdmUobmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lckJ5TmFtZS5zZXQobmFtZSwge1xyXG4gICAgICAgIG9uOiBsaXN0ZW5lclxyXG4gICAgICB9KSk7XHJcbiAgICAgIHJldHVybiBkaXNwYXRjaDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gZXZlbnQ7XHJcbiAgfVxyXG4gIGQzLmV2ZW50ID0gbnVsbDtcclxuICBmdW5jdGlvbiBkM19ldmVudFByZXZlbnREZWZhdWx0KCkge1xyXG4gICAgZDMuZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZXZlbnRTb3VyY2UoKSB7XHJcbiAgICB2YXIgZSA9IGQzLmV2ZW50LCBzO1xyXG4gICAgd2hpbGUgKHMgPSBlLnNvdXJjZUV2ZW50KSBlID0gcztcclxuICAgIHJldHVybiBlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19ldmVudERpc3BhdGNoKHRhcmdldCkge1xyXG4gICAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoKCksIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDtcclxuICAgIHdoaWxlICgrK2kgPCBuKSBkaXNwYXRjaFthcmd1bWVudHNbaV1dID0gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpO1xyXG4gICAgZGlzcGF0Y2gub2YgPSBmdW5jdGlvbih0aGl6LCBhcmd1bWVudHopIHtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUxKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHZhciBlMCA9IGUxLnNvdXJjZUV2ZW50ID0gZDMuZXZlbnQ7XHJcbiAgICAgICAgICBlMS50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgICBkMy5ldmVudCA9IGUxO1xyXG4gICAgICAgICAgZGlzcGF0Y2hbZTEudHlwZV0uYXBwbHkodGhpeiwgYXJndW1lbnR6KTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgZDMuZXZlbnQgPSBlMDtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGRpc3BhdGNoO1xyXG4gIH1cclxuICBkMy5yZXF1b3RlID0gZnVuY3Rpb24ocykge1xyXG4gICAgcmV0dXJuIHMucmVwbGFjZShkM19yZXF1b3RlX3JlLCBcIlxcXFwkJlwiKTtcclxuICB9O1xyXG4gIHZhciBkM19yZXF1b3RlX3JlID0gL1tcXFxcXFxeXFwkXFwqXFwrXFw/XFx8XFxbXFxdXFwoXFwpXFwuXFx7XFx9XS9nO1xyXG4gIHZhciBkM19zdWJjbGFzcyA9IHt9Ll9fcHJvdG9fXyA/IGZ1bmN0aW9uKG9iamVjdCwgcHJvdG90eXBlKSB7XHJcbiAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlO1xyXG4gIH0gOiBmdW5jdGlvbihvYmplY3QsIHByb3RvdHlwZSkge1xyXG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvdG90eXBlKSBvYmplY3RbcHJvcGVydHldID0gcHJvdG90eXBlW3Byb3BlcnR5XTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbihncm91cHMpIHtcclxuICAgIGQzX3N1YmNsYXNzKGdyb3VwcywgZDNfc2VsZWN0aW9uUHJvdG90eXBlKTtcclxuICAgIHJldHVybiBncm91cHM7XHJcbiAgfVxyXG4gIHZhciBkM19zZWxlY3QgPSBmdW5jdGlvbihzLCBuKSB7XHJcbiAgICByZXR1cm4gbi5xdWVyeVNlbGVjdG9yKHMpO1xyXG4gIH0sIGQzX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHMsIG4pIHtcclxuICAgIHJldHVybiBuLnF1ZXJ5U2VsZWN0b3JBbGwocyk7XHJcbiAgfSwgZDNfc2VsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKG4sIHMpIHtcclxuICAgIHZhciBkM19zZWxlY3RNYXRjaGVyID0gbi5tYXRjaGVzIHx8IG5bZDNfdmVuZG9yU3ltYm9sKG4sIFwibWF0Y2hlc1NlbGVjdG9yXCIpXTtcclxuICAgIGQzX3NlbGVjdE1hdGNoZXMgPSBmdW5jdGlvbihuLCBzKSB7XHJcbiAgICAgIHJldHVybiBkM19zZWxlY3RNYXRjaGVyLmNhbGwobiwgcyk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGQzX3NlbGVjdE1hdGNoZXMobiwgcyk7XHJcbiAgfTtcclxuICBpZiAodHlwZW9mIFNpenpsZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICBkM19zZWxlY3QgPSBmdW5jdGlvbihzLCBuKSB7XHJcbiAgICAgIHJldHVybiBTaXp6bGUocywgbilbMF0gfHwgbnVsbDtcclxuICAgIH07XHJcbiAgICBkM19zZWxlY3RBbGwgPSBTaXp6bGU7XHJcbiAgICBkM19zZWxlY3RNYXRjaGVzID0gU2l6emxlLm1hdGNoZXNTZWxlY3RvcjtcclxuICB9XHJcbiAgZDMuc2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDMuc2VsZWN0KGQzX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcbiAgfTtcclxuICB2YXIgZDNfc2VsZWN0aW9uUHJvdG90eXBlID0gZDMuc2VsZWN0aW9uLnByb3RvdHlwZSA9IFtdO1xyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3Rvcikge1xyXG4gICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgc3Vibm9kZSwgZ3JvdXAsIG5vZGU7XHJcbiAgICBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XHJcbiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pO1xyXG4gICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTtcclxuICAgICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHtcclxuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XHJcbiAgICAgICAgICBzdWJncm91cC5wdXNoKHN1Ym5vZGUgPSBzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKTtcclxuICAgICAgICAgIGlmIChzdWJub2RlICYmIFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcikge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3NlbGVjdChzZWxlY3RvciwgdGhpcyk7XHJcbiAgICB9O1xyXG4gIH1cclxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGU7XHJcbiAgICBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7XHJcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XHJcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHtcclxuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XHJcbiAgICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IGQzX2FycmF5KHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpKTtcclxuICAgICAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSBub2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3RvciA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gZDNfc2VsZWN0QWxsKHNlbGVjdG9yLCB0aGlzKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIHZhciBkM19uc1hodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XHJcbiAgdmFyIGQzX25zUHJlZml4ID0ge1xyXG4gICAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXHJcbiAgICB4aHRtbDogZDNfbnNYaHRtbCxcclxuICAgIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcclxuICAgIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcclxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcclxuICB9O1xyXG4gIGQzLm5zID0ge1xyXG4gICAgcHJlZml4OiBkM19uc1ByZWZpeCxcclxuICAgIHF1YWxpZnk6IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoXCI6XCIpLCBwcmVmaXggPSBuYW1lO1xyXG4gICAgICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XHJcbiAgICAgIHJldHVybiBkM19uc1ByZWZpeC5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge1xyXG4gICAgICAgIHNwYWNlOiBkM19uc1ByZWZpeFtwcmVmaXhdLFxyXG4gICAgICAgIGxvY2FsOiBuYW1lXHJcbiAgICAgIH0gOiBuYW1lO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XHJcbiAgICAgICAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWUubG9jYWwgPyBub2RlLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yICh2YWx1ZSBpbiBuYW1lKSB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX2F0dHIodmFsdWUsIG5hbWVbdmFsdWVdKSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fYXR0cihuYW1lLCB2YWx1ZSkpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHtcclxuICAgIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpO1xyXG4gICAgZnVuY3Rpb24gYXR0ck51bGwoKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXR0ck51bGxOUygpIHtcclxuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudCgpIHtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoKSB7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgIGlmICh4ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOyBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHgpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoKSB7XHJcbiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBuYW1lLmxvY2FsID8gYXR0ck51bGxOUyA6IGF0dHJOdWxsIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24gOiBuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQ7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2NvbGxhcHNlKHMpIHtcclxuICAgIHJldHVybiBzLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcclxuICB9XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNsYXNzZWQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCksIG4gPSAobmFtZSA9IGQzX3NlbGVjdGlvbl9jbGFzc2VzKG5hbWUpKS5sZW5ndGgsIGkgPSAtMTtcclxuICAgICAgICBpZiAodmFsdWUgPSBub2RlLmNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghdmFsdWUuY29udGFpbnMobmFtZVtpXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xyXG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghZDNfc2VsZWN0aW9uX2NsYXNzZWRSZShuYW1lW2ldKS50ZXN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKHZhbHVlIGluIG5hbWUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fY2xhc3NlZCh2YWx1ZSwgbmFtZVt2YWx1ZV0pKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWUpIHtcclxuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKD86XnxcXFxccyspXCIgKyBkMy5yZXF1b3RlKG5hbWUpICsgXCIoPzpcXFxccyt8JClcIiwgXCJnXCIpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fY2xhc3NlcyhuYW1lKSB7XHJcbiAgICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fY2xhc3NlZChuYW1lLCB2YWx1ZSkge1xyXG4gICAgbmFtZSA9IGQzX3NlbGVjdGlvbl9jbGFzc2VzKG5hbWUpLm1hcChkM19zZWxlY3Rpb25fY2xhc3NlZE5hbWUpO1xyXG4gICAgdmFyIG4gPSBuYW1lLmxlbmd0aDtcclxuICAgIGZ1bmN0aW9uIGNsYXNzZWRDb25zdGFudCgpIHtcclxuICAgICAgdmFyIGkgPSAtMTtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIG5hbWVbaV0odGhpcywgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgaSA9IC0xLCB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIG5hbWVbaV0odGhpcywgeCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBjbGFzc2VkRnVuY3Rpb24gOiBjbGFzc2VkQ29uc3RhbnQ7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkTmFtZShuYW1lKSB7XHJcbiAgICB2YXIgcmUgPSBkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWUpO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7XHJcbiAgICAgIGlmIChjID0gbm9kZS5jbGFzc0xpc3QpIHJldHVybiB2YWx1ZSA/IGMuYWRkKG5hbWUpIDogYy5yZW1vdmUobmFtZSk7XHJcbiAgICAgIHZhciBjID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiO1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICByZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgICAgIGlmICghcmUudGVzdChjKSkgbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBkM19jb2xsYXBzZShjICsgXCIgXCIgKyBuYW1lKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBkM19jb2xsYXBzZShjLnJlcGxhY2UocmUsIFwiIFwiKSkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcclxuICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDtcclxuICAgIGlmIChuIDwgMykge1xyXG4gICAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBpZiAobiA8IDIpIHZhbHVlID0gXCJcIjtcclxuICAgICAgICBmb3IgKHByaW9yaXR5IGluIG5hbWUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fc3R5bGUocHJpb3JpdHksIG5hbWVbcHJpb3JpdHldLCB2YWx1ZSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuIDwgMikge1xyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XHJcbiAgICAgICAgcmV0dXJuIGQzX3dpbmRvdyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgcHJpb3JpdHkgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fc3R5bGUobmFtZSwgdmFsdWUsIHByaW9yaXR5KSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fc3R5bGUobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XHJcbiAgICBmdW5jdGlvbiBzdHlsZU51bGwoKSB7XHJcbiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50KCkge1xyXG4gICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgIGlmICh4ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7IGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB4LCBwcmlvcml0eSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHN0eWxlTnVsbCA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gc3R5bGVGdW5jdGlvbiA6IHN0eWxlQ29uc3RhbnQ7XHJcbiAgfVxyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5ub2RlKClbbmFtZV07XHJcbiAgICAgIGZvciAodmFsdWUgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9wcm9wZXJ0eSh2YWx1ZSwgbmFtZVt2YWx1ZV0pKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3Byb3BlcnR5KG5hbWUsIHZhbHVlKSB7XHJcbiAgICBmdW5jdGlvbiBwcm9wZXJ0eU51bGwoKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudCgpIHtcclxuICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHggPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICBpZiAoeCA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsgZWxzZSB0aGlzW25hbWVdID0geDtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gcHJvcGVydHlOdWxsIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBwcm9wZXJ0eUZ1bmN0aW9uIDogcHJvcGVydHlDb25zdGFudDtcclxuICB9XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XHJcbiAgICB9IDogdmFsdWUgPT0gbnVsbCA/IGZ1bmN0aW9uKCkge1xyXG4gICAgICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcclxuICAgIH0gOiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xyXG4gICAgfSkgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcclxuICB9O1xyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5odG1sID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcclxuICAgIH0gOiB2YWx1ZSA9PSBudWxsID8gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgIH0gOiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcclxuICAgIH0pIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MO1xyXG4gIH07XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIG5hbWUgPSBkM19zZWxlY3Rpb25fY3JlYXRvcihuYW1lKTtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobmFtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2NyZWF0b3IobmFtZSkge1xyXG4gICAgZnVuY3Rpb24gY3JlYXRlKCkge1xyXG4gICAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsIG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlVVJJO1xyXG4gICAgICByZXR1cm4gbmFtZXNwYWNlID09PSBkM19uc1hodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IGQzX25zWGh0bWwgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgbmFtZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBjcmVhdGVOUygpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiAobmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSkpLmxvY2FsID8gY3JlYXRlTlMgOiBjcmVhdGU7XHJcbiAgfVxyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcclxuICAgIG5hbWUgPSBkM19zZWxlY3Rpb25fY3JlYXRvcihuYW1lKTtcclxuICAgIGJlZm9yZSA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihiZWZvcmUpO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobmFtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBiZWZvcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25SZW1vdmUpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uUmVtb3ZlKCkge1xyXG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcclxuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcclxuICB9XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmRhdGEgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XHJcbiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIGdyb3VwLCBub2RlO1xyXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHZhbHVlID0gbmV3IEFycmF5KG4gPSAoZ3JvdXAgPSB0aGlzWzBdKS5sZW5ndGgpO1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcclxuICAgICAgICAgIHZhbHVlW2ldID0gbm9kZS5fX2RhdGFfXztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYmluZChncm91cCwgZ3JvdXBEYXRhKSB7XHJcbiAgICAgIHZhciBpLCBuID0gZ3JvdXAubGVuZ3RoLCBtID0gZ3JvdXBEYXRhLmxlbmd0aCwgbjAgPSBNYXRoLm1pbihuLCBtKSwgdXBkYXRlTm9kZXMgPSBuZXcgQXJyYXkobSksIGVudGVyTm9kZXMgPSBuZXcgQXJyYXkobSksIGV4aXROb2RlcyA9IG5ldyBBcnJheShuKSwgbm9kZSwgbm9kZURhdGE7XHJcbiAgICAgIGlmIChrZXkpIHtcclxuICAgICAgICB2YXIgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgZDNfTWFwKCksIGtleVZhbHVlcyA9IG5ldyBBcnJheShuKSwga2V5VmFsdWU7XHJcbiAgICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47ICkge1xyXG4gICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xyXG4gICAgICAgICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpKSB7XHJcbiAgICAgICAgICAgICAgZXhpdE5vZGVzW2ldID0gbm9kZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbTsgKSB7XHJcbiAgICAgICAgICBpZiAoIShub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlID0ga2V5LmNhbGwoZ3JvdXBEYXRhLCBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXSwgaSkpKSkge1xyXG4gICAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGU7XHJcbiAgICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBub2RlRGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuOyApIHtcclxuICAgICAgICAgIGlmIChpIGluIGtleVZhbHVlcyAmJiBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBleGl0Tm9kZXNbaV0gPSBncm91cFtpXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9yIChpID0gLTE7ICsraSA8IG4wOyApIHtcclxuICAgICAgICAgIG5vZGUgPSBncm91cFtpXTtcclxuICAgICAgICAgIG5vZGVEYXRhID0gZ3JvdXBEYXRhW2ldO1xyXG4gICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhO1xyXG4gICAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICg7aSA8IG07ICsraSkge1xyXG4gICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShncm91cERhdGFbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKDtpIDwgbjsgKytpKSB7XHJcbiAgICAgICAgICBleGl0Tm9kZXNbaV0gPSBncm91cFtpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZW50ZXJOb2Rlcy51cGRhdGUgPSB1cGRhdGVOb2RlcztcclxuICAgICAgZW50ZXJOb2Rlcy5wYXJlbnROb2RlID0gdXBkYXRlTm9kZXMucGFyZW50Tm9kZSA9IGV4aXROb2Rlcy5wYXJlbnROb2RlID0gZ3JvdXAucGFyZW50Tm9kZTtcclxuICAgICAgZW50ZXIucHVzaChlbnRlck5vZGVzKTtcclxuICAgICAgdXBkYXRlLnB1c2godXBkYXRlTm9kZXMpO1xyXG4gICAgICBleGl0LnB1c2goZXhpdE5vZGVzKTtcclxuICAgIH1cclxuICAgIHZhciBlbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcihbXSksIHVwZGF0ZSA9IGQzX3NlbGVjdGlvbihbXSksIGV4aXQgPSBkM19zZWxlY3Rpb24oW10pO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgICAgYmluZChncm91cCA9IHRoaXNbaV0sIHZhbHVlLmNhbGwoZ3JvdXAsIGdyb3VwLnBhcmVudE5vZGUuX19kYXRhX18sIGkpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB1cGRhdGUuZW50ZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGVudGVyO1xyXG4gICAgfTtcclxuICAgIHVwZGF0ZS5leGl0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBleGl0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiB1cGRhdGU7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fZGF0YU5vZGUoZGF0YSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgX19kYXRhX186IGRhdGFcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5kYXR1bSA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSkgOiB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIik7XHJcbiAgfTtcclxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICB2YXIgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBncm91cCwgbm9kZTtcclxuICAgIGlmICh0eXBlb2YgZmlsdGVyICE9PSBcImZ1bmN0aW9uXCIpIGZpbHRlciA9IGQzX3NlbGVjdGlvbl9maWx0ZXIoZmlsdGVyKTtcclxuICAgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHtcclxuICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XHJcbiAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSAoZ3JvdXAgPSB0aGlzW2pdKS5wYXJlbnROb2RlO1xyXG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBmaWx0ZXIuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSkge1xyXG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9maWx0ZXIoc2VsZWN0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3NlbGVjdE1hdGNoZXModGhpcywgc2VsZWN0b3IpO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLm9yZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XHJcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7ICkge1xyXG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcclxuICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09IG5vZGUubmV4dFNpYmxpbmcpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XHJcbiAgICAgICAgICBuZXh0ID0gbm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbihjb21wYXJhdG9yKSB7XHJcbiAgICBjb21wYXJhdG9yID0gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB0aGlzW2pdLnNvcnQoY29tcGFyYXRvcik7XHJcbiAgICByZXR1cm4gdGhpcy5vcmRlcigpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIHtcclxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgY29tcGFyYXRvciA9IGQzX2FzY2VuZGluZztcclxuICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJhdG9yKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbihub2RlLCBpLCBqKSB7XHJcbiAgICAgIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7XHJcbiAgICB9KTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9lYWNoKGdyb3VwcywgY2FsbGJhY2spIHtcclxuICAgIGZvciAodmFyIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07IGorKykge1xyXG4gICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjayhub2RlLCBpLCBqKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwcztcclxuICB9XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgdmFyIGFyZ3MgPSBkM19hcnJheShhcmd1bWVudHMpO1xyXG4gICAgY2FsbGJhY2suYXBwbHkoYXJnc1swXSA9IHRoaXMsIGFyZ3MpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiAhdGhpcy5ub2RlKCk7XHJcbiAgfTtcclxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykge1xyXG4gICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcclxuICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH07XHJcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBuID0gMDtcclxuICAgIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIGZ1bmN0aW9uKCkge1xyXG4gICAgICArK247XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBuO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VudGVyKHNlbGVjdGlvbikge1xyXG4gICAgZDNfc3ViY2xhc3Moc2VsZWN0aW9uLCBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcbiAgdmFyIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSA9IFtdO1xyXG4gIGQzLnNlbGVjdGlvbi5lbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcjtcclxuICBkMy5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlID0gZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlO1xyXG4gIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5hcHBlbmQgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kO1xyXG4gIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5lbXB0eSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5lbXB0eTtcclxuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUubm9kZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5ub2RlO1xyXG4gIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5jYWxsID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNhbGw7XHJcbiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLnNpemUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2l6ZTtcclxuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIHN1Ym5vZGUsIHVwZ3JvdXAsIGdyb3VwLCBub2RlO1xyXG4gICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkge1xyXG4gICAgICB1cGdyb3VwID0gKGdyb3VwID0gdGhpc1tqXSkudXBkYXRlO1xyXG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcclxuICAgICAgc3ViZ3JvdXAucGFyZW50Tm9kZSA9IGdyb3VwLnBhcmVudE5vZGU7XHJcbiAgICAgIGZvciAodmFyIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7XHJcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xyXG4gICAgICAgICAgc3ViZ3JvdXAucHVzaCh1cGdyb3VwW2ldID0gc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwoZ3JvdXAucGFyZW50Tm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpO1xyXG4gICAgICAgICAgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7XHJcbiAgfTtcclxuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGJlZm9yZSA9IGQzX3NlbGVjdGlvbl9lbnRlckluc2VydEJlZm9yZSh0aGlzKTtcclxuICAgIHJldHVybiBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW5zZXJ0LmNhbGwodGhpcywgbmFtZSwgYmVmb3JlKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9lbnRlckluc2VydEJlZm9yZShlbnRlcikge1xyXG4gICAgdmFyIGkwLCBqMDtcclxuICAgIHJldHVybiBmdW5jdGlvbihkLCBpLCBqKSB7XHJcbiAgICAgIHZhciBncm91cCA9IGVudGVyW2pdLnVwZGF0ZSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTtcclxuICAgICAgaWYgKGogIT0gajApIGowID0gaiwgaTAgPSAwO1xyXG4gICAgICBpZiAoaSA+PSBpMCkgaTAgPSBpICsgMTtcclxuICAgICAgd2hpbGUgKCEobm9kZSA9IGdyb3VwW2kwXSkgJiYgKytpMCA8IG4pIDtcclxuICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9O1xyXG4gIH1cclxuICBkMy5zZWxlY3QgPSBmdW5jdGlvbihub2RlKSB7XHJcbiAgICB2YXIgZ3JvdXA7XHJcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgZ3JvdXAgPSBbIGQzX3NlbGVjdChub2RlLCBkM19kb2N1bWVudCkgXTtcclxuICAgICAgZ3JvdXAucGFyZW50Tm9kZSA9IGQzX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VwID0gWyBub2RlIF07XHJcbiAgICAgIGdyb3VwLnBhcmVudE5vZGUgPSBkM19kb2N1bWVudEVsZW1lbnQobm9kZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKFsgZ3JvdXAgXSk7XHJcbiAgfTtcclxuICBkMy5zZWxlY3RBbGwgPSBmdW5jdGlvbihub2Rlcykge1xyXG4gICAgdmFyIGdyb3VwO1xyXG4gICAgaWYgKHR5cGVvZiBub2RlcyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBncm91cCA9IGQzX2FycmF5KGQzX3NlbGVjdEFsbChub2RlcywgZDNfZG9jdW1lbnQpKTtcclxuICAgICAgZ3JvdXAucGFyZW50Tm9kZSA9IGQzX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VwID0gZDNfYXJyYXkobm9kZXMpO1xyXG4gICAgICBncm91cC5wYXJlbnROb2RlID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oWyBncm91cCBdKTtcclxuICB9O1xyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKSB7XHJcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XHJcbiAgICBpZiAobiA8IDMpIHtcclxuICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgaWYgKG4gPCAyKSBsaXN0ZW5lciA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAoY2FwdHVyZSBpbiB0eXBlKSB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX29uKGNhcHR1cmUsIHR5cGVbY2FwdHVyZV0sIGxpc3RlbmVyKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG4gPCAyKSByZXR1cm4gKG4gPSB0aGlzLm5vZGUoKVtcIl9fb25cIiArIHR5cGVdKSAmJiBuLl87XHJcbiAgICAgIGNhcHR1cmUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX29uKHR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpIHtcclxuICAgIHZhciBuYW1lID0gXCJfX29uXCIgKyB0eXBlLCBpID0gdHlwZS5pbmRleE9mKFwiLlwiKSwgd3JhcCA9IGQzX3NlbGVjdGlvbl9vbkxpc3RlbmVyO1xyXG4gICAgaWYgKGkgPiAwKSB0eXBlID0gdHlwZS5zbGljZSgwLCBpKTtcclxuICAgIHZhciBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fb25GaWx0ZXJzLmdldCh0eXBlKTtcclxuICAgIGlmIChmaWx0ZXIpIHR5cGUgPSBmaWx0ZXIsIHdyYXAgPSBkM19zZWxlY3Rpb25fb25GaWx0ZXI7XHJcbiAgICBmdW5jdGlvbiBvblJlbW92ZSgpIHtcclxuICAgICAgdmFyIGwgPSB0aGlzW25hbWVdO1xyXG4gICAgICBpZiAobCkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsLCBsLiQpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkFkZCgpIHtcclxuICAgICAgdmFyIGwgPSB3cmFwKGxpc3RlbmVyLCBkM19hcnJheShhcmd1bWVudHMpKTtcclxuICAgICAgb25SZW1vdmUuY2FsbCh0aGlzKTtcclxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbbmFtZV0gPSBsLCBsLiQgPSBjYXB0dXJlKTtcclxuICAgICAgbC5fID0gbGlzdGVuZXI7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZW1vdmVBbGwoKSB7XHJcbiAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoXCJeX19vbihbXi5dKylcIiArIGQzLnJlcXVvdGUodHlwZSkgKyBcIiRcIiksIG1hdGNoO1xyXG4gICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcclxuICAgICAgICBpZiAobWF0Y2ggPSBuYW1lLm1hdGNoKHJlKSkge1xyXG4gICAgICAgICAgdmFyIGwgPSB0aGlzW25hbWVdO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG1hdGNoWzFdLCBsLCBsLiQpO1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaSA/IGxpc3RlbmVyID8gb25BZGQgOiBvblJlbW92ZSA6IGxpc3RlbmVyID8gZDNfbm9vcCA6IHJlbW92ZUFsbDtcclxuICB9XHJcbiAgdmFyIGQzX3NlbGVjdGlvbl9vbkZpbHRlcnMgPSBkMy5tYXAoe1xyXG4gICAgbW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcclxuICAgIG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIlxyXG4gIH0pO1xyXG4gIGlmIChkM19kb2N1bWVudCkge1xyXG4gICAgZDNfc2VsZWN0aW9uX29uRmlsdGVycy5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcclxuICAgICAgaWYgKFwib25cIiArIGsgaW4gZDNfZG9jdW1lbnQpIGQzX3NlbGVjdGlvbl9vbkZpbHRlcnMucmVtb3ZlKGspO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9vbkxpc3RlbmVyKGxpc3RlbmVyLCBhcmd1bWVudHopIHtcclxuICAgIHJldHVybiBmdW5jdGlvbihlKSB7XHJcbiAgICAgIHZhciBvID0gZDMuZXZlbnQ7XHJcbiAgICAgIGQzLmV2ZW50ID0gZTtcclxuICAgICAgYXJndW1lbnR6WzBdID0gdGhpcy5fX2RhdGFfXztcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHopO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGQzLmV2ZW50ID0gbztcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX29uRmlsdGVyKGxpc3RlbmVyLCBhcmd1bWVudHopIHtcclxuICAgIHZhciBsID0gZDNfc2VsZWN0aW9uX29uTGlzdGVuZXIobGlzdGVuZXIsIGFyZ3VtZW50eik7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xyXG4gICAgICB2YXIgdGFyZ2V0ID0gdGhpcywgcmVsYXRlZCA9IGUucmVsYXRlZFRhcmdldDtcclxuICAgICAgaWYgKCFyZWxhdGVkIHx8IHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhKHJlbGF0ZWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGFyZ2V0KSAmIDgpKSB7XHJcbiAgICAgICAgbC5jYWxsKHRhcmdldCwgZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIHZhciBkM19ldmVudF9kcmFnU2VsZWN0LCBkM19ldmVudF9kcmFnSWQgPSAwO1xyXG4gIGZ1bmN0aW9uIGQzX2V2ZW50X2RyYWdTdXBwcmVzcyhub2RlKSB7XHJcbiAgICB2YXIgbmFtZSA9IFwiLmRyYWdzdXBwcmVzcy1cIiArICsrZDNfZXZlbnRfZHJhZ0lkLCBjbGljayA9IFwiY2xpY2tcIiArIG5hbWUsIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KG5vZGUpKS5vbihcInRvdWNobW92ZVwiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCkub24oXCJkcmFnc3RhcnRcIiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpLm9uKFwic2VsZWN0c3RhcnRcIiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpO1xyXG4gICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QgPT0gbnVsbCkge1xyXG4gICAgICBkM19ldmVudF9kcmFnU2VsZWN0ID0gXCJvbnNlbGVjdHN0YXJ0XCIgaW4gbm9kZSA/IGZhbHNlIDogZDNfdmVuZG9yU3ltYm9sKG5vZGUuc3R5bGUsIFwidXNlclNlbGVjdFwiKTtcclxuICAgIH1cclxuICAgIGlmIChkM19ldmVudF9kcmFnU2VsZWN0KSB7XHJcbiAgICAgIHZhciBzdHlsZSA9IGQzX2RvY3VtZW50RWxlbWVudChub2RlKS5zdHlsZSwgc2VsZWN0ID0gc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF07XHJcbiAgICAgIHN0eWxlW2QzX2V2ZW50X2RyYWdTZWxlY3RdID0gXCJub25lXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oc3VwcHJlc3NDbGljaykge1xyXG4gICAgICB3Lm9uKG5hbWUsIG51bGwpO1xyXG4gICAgICBpZiAoZDNfZXZlbnRfZHJhZ1NlbGVjdCkgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSBzZWxlY3Q7XHJcbiAgICAgIGlmIChzdXBwcmVzc0NsaWNrKSB7XHJcbiAgICAgICAgdmFyIG9mZiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdy5vbihjbGljaywgbnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB3Lm9uKGNsaWNrLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIG9mZigpO1xyXG4gICAgICAgIH0sIHRydWUpO1xyXG4gICAgICAgIHNldFRpbWVvdXQob2ZmLCAwKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbiAgZDMubW91c2UgPSBmdW5jdGlvbihjb250YWluZXIpIHtcclxuICAgIHJldHVybiBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgZDNfZXZlbnRTb3VyY2UoKSk7XHJcbiAgfTtcclxuICB2YXIgZDNfbW91c2VfYnVnNDQwODMgPSB0aGlzLm5hdmlnYXRvciAmJiAvV2ViS2l0Ly50ZXN0KHRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCkgPyAtMSA6IDA7XHJcbiAgZnVuY3Rpb24gZDNfbW91c2VQb2ludChjb250YWluZXIsIGUpIHtcclxuICAgIGlmIChlLmNoYW5nZWRUb3VjaGVzKSBlID0gZS5jaGFuZ2VkVG91Y2hlc1swXTtcclxuICAgIHZhciBzdmcgPSBjb250YWluZXIub3duZXJTVkdFbGVtZW50IHx8IGNvbnRhaW5lcjtcclxuICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcclxuICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7XHJcbiAgICAgIGlmIChkM19tb3VzZV9idWc0NDA4MyA8IDApIHtcclxuICAgICAgICB2YXIgd2luZG93ID0gZDNfd2luZG93KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5zY3JvbGxYIHx8IHdpbmRvdy5zY3JvbGxZKSB7XHJcbiAgICAgICAgICBzdmcgPSBkMy5zZWxlY3QoXCJib2R5XCIpLmFwcGVuZChcInN2Z1wiKS5zdHlsZSh7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgbWFyZ2luOiAwLFxyXG4gICAgICAgICAgICBwYWRkaW5nOiAwLFxyXG4gICAgICAgICAgICBib3JkZXI6IFwibm9uZVwiXHJcbiAgICAgICAgICB9LCBcImltcG9ydGFudFwiKTtcclxuICAgICAgICAgIHZhciBjdG0gPSBzdmdbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7XHJcbiAgICAgICAgICBkM19tb3VzZV9idWc0NDA4MyA9ICEoY3RtLmYgfHwgY3RtLmUpO1xyXG4gICAgICAgICAgc3ZnLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZDNfbW91c2VfYnVnNDQwODMpIHBvaW50LnggPSBlLnBhZ2VYLCBwb2ludC55ID0gZS5wYWdlWTsgZWxzZSBwb2ludC54ID0gZS5jbGllbnRYLCBcclxuICAgICAgcG9pbnQueSA9IGUuY2xpZW50WTtcclxuICAgICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0oY29udGFpbmVyLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XHJcbiAgICAgIHJldHVybiBbIHBvaW50LngsIHBvaW50LnkgXTtcclxuICAgIH1cclxuICAgIHZhciByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgcmV0dXJuIFsgZS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gY29udGFpbmVyLmNsaWVudExlZnQsIGUuY2xpZW50WSAtIHJlY3QudG9wIC0gY29udGFpbmVyLmNsaWVudFRvcCBdO1xyXG4gIH1cclxuICBkMy50b3VjaCA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgdG91Y2hlcywgaWRlbnRpZmllcikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBpZGVudGlmaWVyID0gdG91Y2hlcywgdG91Y2hlcyA9IGQzX2V2ZW50U291cmNlKCkuY2hhbmdlZFRvdWNoZXM7XHJcbiAgICBpZiAodG91Y2hlcykgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzLmxlbmd0aCwgdG91Y2g7IGkgPCBuOyArK2kpIHtcclxuICAgICAgaWYgKCh0b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcclxuICAgICAgICByZXR1cm4gZDNfbW91c2VQb2ludChjb250YWluZXIsIHRvdWNoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgZDMuYmVoYXZpb3IuZHJhZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaChkcmFnLCBcImRyYWdcIiwgXCJkcmFnc3RhcnRcIiwgXCJkcmFnZW5kXCIpLCBvcmlnaW4gPSBudWxsLCBtb3VzZWRvd24gPSBkcmFnc3RhcnQoZDNfbm9vcCwgZDMubW91c2UsIGQzX3dpbmRvdywgXCJtb3VzZW1vdmVcIiwgXCJtb3VzZXVwXCIpLCB0b3VjaHN0YXJ0ID0gZHJhZ3N0YXJ0KGQzX2JlaGF2aW9yX2RyYWdUb3VjaElkLCBkMy50b3VjaCwgZDNfaWRlbnRpdHksIFwidG91Y2htb3ZlXCIsIFwidG91Y2hlbmRcIik7XHJcbiAgICBmdW5jdGlvbiBkcmFnKCkge1xyXG4gICAgICB0aGlzLm9uKFwibW91c2Vkb3duLmRyYWdcIiwgbW91c2Vkb3duKS5vbihcInRvdWNoc3RhcnQuZHJhZ1wiLCB0b3VjaHN0YXJ0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGRyYWdzdGFydChpZCwgcG9zaXRpb24sIHN1YmplY3QsIG1vdmUsIGVuZCkge1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzLCB0YXJnZXQgPSBkMy5ldmVudC50YXJnZXQuY29ycmVzcG9uZGluZ0VsZW1lbnQgfHwgZDMuZXZlbnQudGFyZ2V0LCBwYXJlbnQgPSB0aGF0LnBhcmVudE5vZGUsIGRpc3BhdGNoID0gZXZlbnQub2YodGhhdCwgYXJndW1lbnRzKSwgZHJhZ2dlZCA9IDAsIGRyYWdJZCA9IGlkKCksIGRyYWdOYW1lID0gXCIuZHJhZ1wiICsgKGRyYWdJZCA9PSBudWxsID8gXCJcIiA6IFwiLVwiICsgZHJhZ0lkKSwgZHJhZ09mZnNldCwgZHJhZ1N1YmplY3QgPSBkMy5zZWxlY3Qoc3ViamVjdCh0YXJnZXQpKS5vbihtb3ZlICsgZHJhZ05hbWUsIG1vdmVkKS5vbihlbmQgKyBkcmFnTmFtZSwgZW5kZWQpLCBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0YXJnZXQpLCBwb3NpdGlvbjAgPSBwb3NpdGlvbihwYXJlbnQsIGRyYWdJZCk7XHJcbiAgICAgICAgaWYgKG9yaWdpbikge1xyXG4gICAgICAgICAgZHJhZ09mZnNldCA9IG9yaWdpbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgZHJhZ09mZnNldCA9IFsgZHJhZ09mZnNldC54IC0gcG9zaXRpb24wWzBdLCBkcmFnT2Zmc2V0LnkgLSBwb3NpdGlvbjBbMV0gXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZHJhZ09mZnNldCA9IFsgMCwgMCBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkaXNwYXRjaCh7XHJcbiAgICAgICAgICB0eXBlOiBcImRyYWdzdGFydFwiXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZnVuY3Rpb24gbW92ZWQoKSB7XHJcbiAgICAgICAgICB2YXIgcG9zaXRpb24xID0gcG9zaXRpb24ocGFyZW50LCBkcmFnSWQpLCBkeCwgZHk7XHJcbiAgICAgICAgICBpZiAoIXBvc2l0aW9uMSkgcmV0dXJuO1xyXG4gICAgICAgICAgZHggPSBwb3NpdGlvbjFbMF0gLSBwb3NpdGlvbjBbMF07XHJcbiAgICAgICAgICBkeSA9IHBvc2l0aW9uMVsxXSAtIHBvc2l0aW9uMFsxXTtcclxuICAgICAgICAgIGRyYWdnZWQgfD0gZHggfCBkeTtcclxuICAgICAgICAgIHBvc2l0aW9uMCA9IHBvc2l0aW9uMTtcclxuICAgICAgICAgIGRpc3BhdGNoKHtcclxuICAgICAgICAgICAgdHlwZTogXCJkcmFnXCIsXHJcbiAgICAgICAgICAgIHg6IHBvc2l0aW9uMVswXSArIGRyYWdPZmZzZXRbMF0sXHJcbiAgICAgICAgICAgIHk6IHBvc2l0aW9uMVsxXSArIGRyYWdPZmZzZXRbMV0sXHJcbiAgICAgICAgICAgIGR4OiBkeCxcclxuICAgICAgICAgICAgZHk6IGR5XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZW5kZWQoKSB7XHJcbiAgICAgICAgICBpZiAoIXBvc2l0aW9uKHBhcmVudCwgZHJhZ0lkKSkgcmV0dXJuO1xyXG4gICAgICAgICAgZHJhZ1N1YmplY3Qub24obW92ZSArIGRyYWdOYW1lLCBudWxsKS5vbihlbmQgKyBkcmFnTmFtZSwgbnVsbCk7XHJcbiAgICAgICAgICBkcmFnUmVzdG9yZShkcmFnZ2VkKTtcclxuICAgICAgICAgIGRpc3BhdGNoKHtcclxuICAgICAgICAgICAgdHlwZTogXCJkcmFnZW5kXCJcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGRyYWcub3JpZ2luID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmlnaW47XHJcbiAgICAgIG9yaWdpbiA9IHg7XHJcbiAgICAgIHJldHVybiBkcmFnO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBkMy5yZWJpbmQoZHJhZywgZXZlbnQsIFwib25cIik7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19iZWhhdmlvcl9kcmFnVG91Y2hJZCgpIHtcclxuICAgIHJldHVybiBkMy5ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyO1xyXG4gIH1cclxuICBkMy50b3VjaGVzID0gZnVuY3Rpb24oY29udGFpbmVyLCB0b3VjaGVzKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHRvdWNoZXMgPSBkM19ldmVudFNvdXJjZSgpLnRvdWNoZXM7XHJcbiAgICByZXR1cm4gdG91Y2hlcyA/IGQzX2FycmF5KHRvdWNoZXMpLm1hcChmdW5jdGlvbih0b3VjaCkge1xyXG4gICAgICB2YXIgcG9pbnQgPSBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgdG91Y2gpO1xyXG4gICAgICBwb2ludC5pZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjtcclxuICAgICAgcmV0dXJuIHBvaW50O1xyXG4gICAgfSkgOiBbXTtcclxuICB9O1xyXG4gIHZhciDOtSA9IDFlLTYsIM61MiA9IM61ICogzrUsIM+AID0gTWF0aC5QSSwgz4QgPSAyICogz4AsIM+EzrUgPSDPhCAtIM61LCBoYWxmz4AgPSDPgCAvIDIsIGQzX3JhZGlhbnMgPSDPgCAvIDE4MCwgZDNfZGVncmVlcyA9IDE4MCAvIM+AO1xyXG4gIGZ1bmN0aW9uIGQzX3Nnbih4KSB7XHJcbiAgICByZXR1cm4geCA+IDAgPyAxIDogeCA8IDAgPyAtMSA6IDA7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2Nyb3NzMmQoYSwgYiwgYykge1xyXG4gICAgcmV0dXJuIChiWzBdIC0gYVswXSkgKiAoY1sxXSAtIGFbMV0pIC0gKGJbMV0gLSBhWzFdKSAqIChjWzBdIC0gYVswXSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2Fjb3MoeCkge1xyXG4gICAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IM+AIDogTWF0aC5hY29zKHgpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19hc2luKHgpIHtcclxuICAgIHJldHVybiB4ID4gMSA/IGhhbGbPgCA6IHggPCAtMSA/IC1oYWxmz4AgOiBNYXRoLmFzaW4oeCk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3NpbmgoeCkge1xyXG4gICAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2Nvc2goeCkge1xyXG4gICAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RhbmgoeCkge1xyXG4gICAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2hhdmVyc2luKHgpIHtcclxuICAgIHJldHVybiAoeCA9IE1hdGguc2luKHggLyAyKSkgKiB4O1xyXG4gIH1cclxuICB2YXIgz4EgPSBNYXRoLlNRUlQyLCDPgTIgPSAyLCDPgTQgPSA0O1xyXG4gIGQzLmludGVycG9sYXRlWm9vbSA9IGZ1bmN0aW9uKHAwLCBwMSkge1xyXG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSwgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLCBkeCA9IHV4MSAtIHV4MCwgZHkgPSB1eTEgLSB1eTAsIGQyID0gZHggKiBkeCArIGR5ICogZHksIGksIFM7XHJcbiAgICBpZiAoZDIgPCDOtTIpIHtcclxuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gz4E7XHJcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgcmV0dXJuIFsgdXgwICsgdCAqIGR4LCB1eTAgKyB0ICogZHksIHcwICogTWF0aC5leHAoz4EgKiB0ICogUykgXTtcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgz4E0ICogZDIpIC8gKDIgKiB3MCAqIM+BMiAqIGQxKSwgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSDPgTQgKiBkMikgLyAoMiAqIHcxICogz4EyICogZDEpLCByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcclxuICAgICAgUyA9IChyMSAtIHIwKSAvIM+BO1xyXG4gICAgICBpID0gZnVuY3Rpb24odCkge1xyXG4gICAgICAgIHZhciBzID0gdCAqIFMsIGNvc2hyMCA9IGQzX2Nvc2gocjApLCB1ID0gdzAgLyAoz4EyICogZDEpICogKGNvc2hyMCAqIGQzX3Rhbmgoz4EgKiBzICsgcjApIC0gZDNfc2luaChyMCkpO1xyXG4gICAgICAgIHJldHVybiBbIHV4MCArIHUgKiBkeCwgdXkwICsgdSAqIGR5LCB3MCAqIGNvc2hyMCAvIGQzX2Nvc2goz4EgKiBzICsgcjApIF07XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpLmR1cmF0aW9uID0gUyAqIDFlMztcclxuICAgIHJldHVybiBpO1xyXG4gIH07XHJcbiAgZDMuYmVoYXZpb3Iuem9vbSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIHZpZXcgPSB7XHJcbiAgICAgIHg6IDAsXHJcbiAgICAgIHk6IDAsXHJcbiAgICAgIGs6IDFcclxuICAgIH0sIHRyYW5zbGF0ZTAsIGNlbnRlcjAsIGNlbnRlciwgc2l6ZSA9IFsgOTYwLCA1MDAgXSwgc2NhbGVFeHRlbnQgPSBkM19iZWhhdmlvcl96b29tSW5maW5pdHksIGR1cmF0aW9uID0gMjUwLCB6b29taW5nID0gMCwgbW91c2Vkb3duID0gXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZW1vdmUgPSBcIm1vdXNlbW92ZS56b29tXCIsIG1vdXNldXAgPSBcIm1vdXNldXAuem9vbVwiLCBtb3VzZXdoZWVsVGltZXIsIHRvdWNoc3RhcnQgPSBcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHRpbWUsIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaCh6b29tLCBcInpvb21zdGFydFwiLCBcInpvb21cIiwgXCJ6b29tZW5kXCIpLCB4MCwgeDEsIHkwLCB5MTtcclxuICAgIGlmICghZDNfYmVoYXZpb3Jfem9vbVdoZWVsKSB7XHJcbiAgICAgIGQzX2JlaGF2aW9yX3pvb21XaGVlbCA9IFwib253aGVlbFwiIGluIGQzX2RvY3VtZW50ID8gKGQzX2JlaGF2aW9yX3pvb21EZWx0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiAtZDMuZXZlbnQuZGVsdGFZICogKGQzLmV2ZW50LmRlbHRhTW9kZSA/IDEyMCA6IDEpO1xyXG4gICAgICB9LCBcIndoZWVsXCIpIDogXCJvbm1vdXNld2hlZWxcIiBpbiBkM19kb2N1bWVudCA/IChkM19iZWhhdmlvcl96b29tRGVsdGEgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gZDMuZXZlbnQud2hlZWxEZWx0YTtcclxuICAgICAgfSwgXCJtb3VzZXdoZWVsXCIpIDogKGQzX2JlaGF2aW9yX3pvb21EZWx0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiAtZDMuZXZlbnQuZGV0YWlsO1xyXG4gICAgICB9LCBcIk1vek1vdXNlUGl4ZWxTY3JvbGxcIik7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB6b29tKGcpIHtcclxuICAgICAgZy5vbihtb3VzZWRvd24sIG1vdXNlZG93bmVkKS5vbihkM19iZWhhdmlvcl96b29tV2hlZWwgKyBcIi56b29tXCIsIG1vdXNld2hlZWxlZCkub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpLm9uKHRvdWNoc3RhcnQsIHRvdWNoc3RhcnRlZCk7XHJcbiAgICB9XHJcbiAgICB6b29tLmV2ZW50ID0gZnVuY3Rpb24oZykge1xyXG4gICAgICBnLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGRpc3BhdGNoID0gZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSwgdmlldzEgPSB2aWV3O1xyXG4gICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7XHJcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2aWV3ID0gdGhpcy5fX2NoYXJ0X18gfHwge1xyXG4gICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICBrOiAxXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTtcclxuICAgICAgICAgIH0pLnR3ZWVuKFwiem9vbTp6b29tXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgZHggPSBzaXplWzBdLCBkeSA9IHNpemVbMV0sIGN4ID0gY2VudGVyMCA/IGNlbnRlcjBbMF0gOiBkeCAvIDIsIGN5ID0gY2VudGVyMCA/IGNlbnRlcjBbMV0gOiBkeSAvIDIsIGkgPSBkMy5pbnRlcnBvbGF0ZVpvb20oWyAoY3ggLSB2aWV3LngpIC8gdmlldy5rLCAoY3kgLSB2aWV3LnkpIC8gdmlldy5rLCBkeCAvIHZpZXcuayBdLCBbIChjeCAtIHZpZXcxLngpIC8gdmlldzEuaywgKGN5IC0gdmlldzEueSkgLyB2aWV3MS5rLCBkeCAvIHZpZXcxLmsgXSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgICAgICAgdmFyIGwgPSBpKHQpLCBrID0gZHggLyBsWzJdO1xyXG4gICAgICAgICAgICAgIHRoaXMuX19jaGFydF9fID0gdmlldyA9IHtcclxuICAgICAgICAgICAgICAgIHg6IGN4IC0gbFswXSAqIGssXHJcbiAgICAgICAgICAgICAgICB5OiBjeSAtIGxbMV0gKiBrLFxyXG4gICAgICAgICAgICAgICAgazoga1xyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgem9vbWVkKGRpc3BhdGNoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pLmVhY2goXCJpbnRlcnJ1cHQuem9vbVwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcclxuICAgICAgICAgIH0pLmVhY2goXCJlbmQuem9vbVwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9fY2hhcnRfXyA9IHZpZXc7XHJcbiAgICAgICAgICB6b29tc3RhcnRlZChkaXNwYXRjaCk7XHJcbiAgICAgICAgICB6b29tZWQoZGlzcGF0Y2gpO1xyXG4gICAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHpvb20udHJhbnNsYXRlID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIHZpZXcueCwgdmlldy55IF07XHJcbiAgICAgIHZpZXcgPSB7XHJcbiAgICAgICAgeDogK19bMF0sXHJcbiAgICAgICAgeTogK19bMV0sXHJcbiAgICAgICAgazogdmlldy5rXHJcbiAgICAgIH07XHJcbiAgICAgIHJlc2NhbGUoKTtcclxuICAgICAgcmV0dXJuIHpvb207XHJcbiAgICB9O1xyXG4gICAgem9vbS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmlldy5rO1xyXG4gICAgICB2aWV3ID0ge1xyXG4gICAgICAgIHg6IHZpZXcueCxcclxuICAgICAgICB5OiB2aWV3LnksXHJcbiAgICAgICAgazogbnVsbFxyXG4gICAgICB9O1xyXG4gICAgICBzY2FsZVRvKCtfKTtcclxuICAgICAgcmVzY2FsZSgpO1xyXG4gICAgICByZXR1cm4gem9vbTtcclxuICAgIH07XHJcbiAgICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZUV4dGVudDtcclxuICAgICAgc2NhbGVFeHRlbnQgPSBfID09IG51bGwgPyBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgOiBbICtfWzBdLCArX1sxXSBdO1xyXG4gICAgICByZXR1cm4gem9vbTtcclxuICAgIH07XHJcbiAgICB6b29tLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2VudGVyO1xyXG4gICAgICBjZW50ZXIgPSBfICYmIFsgK19bMF0sICtfWzFdIF07XHJcbiAgICAgIHJldHVybiB6b29tO1xyXG4gICAgfTtcclxuICAgIHpvb20uc2l6ZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcclxuICAgICAgc2l6ZSA9IF8gJiYgWyArX1swXSwgK19bMV0gXTtcclxuICAgICAgcmV0dXJuIHpvb207XHJcbiAgICB9O1xyXG4gICAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZHVyYXRpb247XHJcbiAgICAgIGR1cmF0aW9uID0gK187XHJcbiAgICAgIHJldHVybiB6b29tO1xyXG4gICAgfTtcclxuICAgIHpvb20ueCA9IGZ1bmN0aW9uKHopIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7XHJcbiAgICAgIHgxID0gejtcclxuICAgICAgeDAgPSB6LmNvcHkoKTtcclxuICAgICAgdmlldyA9IHtcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAsXHJcbiAgICAgICAgazogMVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gem9vbTtcclxuICAgIH07XHJcbiAgICB6b29tLnkgPSBmdW5jdGlvbih6KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxO1xyXG4gICAgICB5MSA9IHo7XHJcbiAgICAgIHkwID0gei5jb3B5KCk7XHJcbiAgICAgIHZpZXcgPSB7XHJcbiAgICAgICAgeDogMCxcclxuICAgICAgICB5OiAwLFxyXG4gICAgICAgIGs6IDFcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIHpvb207XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gbG9jYXRpb24ocCkge1xyXG4gICAgICByZXR1cm4gWyAocFswXSAtIHZpZXcueCkgLyB2aWV3LmssIChwWzFdIC0gdmlldy55KSAvIHZpZXcuayBdO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcG9pbnQobCkge1xyXG4gICAgICByZXR1cm4gWyBsWzBdICogdmlldy5rICsgdmlldy54LCBsWzFdICogdmlldy5rICsgdmlldy55IF07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzY2FsZVRvKHMpIHtcclxuICAgICAgdmlldy5rID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBzKSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVUbyhwLCBsKSB7XHJcbiAgICAgIGwgPSBwb2ludChsKTtcclxuICAgICAgdmlldy54ICs9IHBbMF0gLSBsWzBdO1xyXG4gICAgICB2aWV3LnkgKz0gcFsxXSAtIGxbMV07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB6b29tVG8odGhhdCwgcCwgbCwgaykge1xyXG4gICAgICB0aGF0Ll9fY2hhcnRfXyA9IHtcclxuICAgICAgICB4OiB2aWV3LngsXHJcbiAgICAgICAgeTogdmlldy55LFxyXG4gICAgICAgIGs6IHZpZXcua1xyXG4gICAgICB9O1xyXG4gICAgICBzY2FsZVRvKE1hdGgucG93KDIsIGspKTtcclxuICAgICAgdHJhbnNsYXRlVG8oY2VudGVyMCA9IHAsIGwpO1xyXG4gICAgICB0aGF0ID0gZDMuc2VsZWN0KHRoYXQpO1xyXG4gICAgICBpZiAoZHVyYXRpb24gPiAwKSB0aGF0ID0gdGhhdC50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pO1xyXG4gICAgICB0aGF0LmNhbGwoem9vbS5ldmVudCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNjYWxlKCkge1xyXG4gICAgICBpZiAoeDEpIHgxLmRvbWFpbih4MC5yYW5nZSgpLm1hcChmdW5jdGlvbih4KSB7XHJcbiAgICAgICAgcmV0dXJuICh4IC0gdmlldy54KSAvIHZpZXcuaztcclxuICAgICAgfSkubWFwKHgwLmludmVydCkpO1xyXG4gICAgICBpZiAoeTEpIHkxLmRvbWFpbih5MC5yYW5nZSgpLm1hcChmdW5jdGlvbih5KSB7XHJcbiAgICAgICAgcmV0dXJuICh5IC0gdmlldy55KSAvIHZpZXcuaztcclxuICAgICAgfSkubWFwKHkwLmludmVydCkpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpIHtcclxuICAgICAgaWYgKCF6b29taW5nKyspIGRpc3BhdGNoKHtcclxuICAgICAgICB0eXBlOiBcInpvb21zdGFydFwiXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gem9vbWVkKGRpc3BhdGNoKSB7XHJcbiAgICAgIHJlc2NhbGUoKTtcclxuICAgICAgZGlzcGF0Y2goe1xyXG4gICAgICAgIHR5cGU6IFwiem9vbVwiLFxyXG4gICAgICAgIHNjYWxlOiB2aWV3LmssXHJcbiAgICAgICAgdHJhbnNsYXRlOiBbIHZpZXcueCwgdmlldy55IF1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB6b29tZW5kZWQoZGlzcGF0Y2gpIHtcclxuICAgICAgaWYgKCEtLXpvb21pbmcpIGRpc3BhdGNoKHtcclxuICAgICAgICB0eXBlOiBcInpvb21lbmRcIlxyXG4gICAgICB9KSwgY2VudGVyMCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHtcclxuICAgICAgdmFyIHRoYXQgPSB0aGlzLCBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoYXQsIGFyZ3VtZW50cyksIGRyYWdnZWQgPSAwLCBzdWJqZWN0ID0gZDMuc2VsZWN0KGQzX3dpbmRvdyh0aGF0KSkub24obW91c2Vtb3ZlLCBtb3ZlZCkub24obW91c2V1cCwgZW5kZWQpLCBsb2NhdGlvbjAgPSBsb2NhdGlvbihkMy5tb3VzZSh0aGF0KSksIGRyYWdSZXN0b3JlID0gZDNfZXZlbnRfZHJhZ1N1cHByZXNzKHRoYXQpO1xyXG4gICAgICBkM19zZWxlY3Rpb25faW50ZXJydXB0LmNhbGwodGhhdCk7XHJcbiAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTtcclxuICAgICAgZnVuY3Rpb24gbW92ZWQoKSB7XHJcbiAgICAgICAgZHJhZ2dlZCA9IDE7XHJcbiAgICAgICAgdHJhbnNsYXRlVG8oZDMubW91c2UodGhhdCksIGxvY2F0aW9uMCk7XHJcbiAgICAgICAgem9vbWVkKGRpc3BhdGNoKTtcclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBlbmRlZCgpIHtcclxuICAgICAgICBzdWJqZWN0Lm9uKG1vdXNlbW92ZSwgbnVsbCkub24obW91c2V1cCwgbnVsbCk7XHJcbiAgICAgICAgZHJhZ1Jlc3RvcmUoZHJhZ2dlZCk7XHJcbiAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKCkge1xyXG4gICAgICB2YXIgdGhhdCA9IHRoaXMsIGRpc3BhdGNoID0gZXZlbnQub2YodGhhdCwgYXJndW1lbnRzKSwgbG9jYXRpb25zMCA9IHt9LCBkaXN0YW5jZTAgPSAwLCBzY2FsZTAsIHpvb21OYW1lID0gXCIuem9vbS1cIiArIGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIsIHRvdWNobW92ZSA9IFwidG91Y2htb3ZlXCIgKyB6b29tTmFtZSwgdG91Y2hlbmQgPSBcInRvdWNoZW5kXCIgKyB6b29tTmFtZSwgdGFyZ2V0cyA9IFtdLCBzdWJqZWN0ID0gZDMuc2VsZWN0KHRoYXQpLCBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0aGF0KTtcclxuICAgICAgc3RhcnRlZCgpO1xyXG4gICAgICB6b29tc3RhcnRlZChkaXNwYXRjaCk7XHJcbiAgICAgIHN1YmplY3Qub24obW91c2Vkb3duLCBudWxsKS5vbih0b3VjaHN0YXJ0LCBzdGFydGVkKTtcclxuICAgICAgZnVuY3Rpb24gcmVsb2NhdGUoKSB7XHJcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoYXQpO1xyXG4gICAgICAgIHNjYWxlMCA9IHZpZXcuaztcclxuICAgICAgICB0b3VjaGVzLmZvckVhY2goZnVuY3Rpb24odCkge1xyXG4gICAgICAgICAgaWYgKHQuaWRlbnRpZmllciBpbiBsb2NhdGlvbnMwKSBsb2NhdGlvbnMwW3QuaWRlbnRpZmllcl0gPSBsb2NhdGlvbih0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG91Y2hlcztcclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBzdGFydGVkKCkge1xyXG4gICAgICAgIHZhciB0YXJnZXQgPSBkMy5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgZDMuc2VsZWN0KHRhcmdldCkub24odG91Y2htb3ZlLCBtb3ZlZCkub24odG91Y2hlbmQsIGVuZGVkKTtcclxuICAgICAgICB0YXJnZXRzLnB1c2godGFyZ2V0KTtcclxuICAgICAgICB2YXIgY2hhbmdlZCA9IGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gY2hhbmdlZC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcclxuICAgICAgICAgIGxvY2F0aW9uczBbY2hhbmdlZFtpXS5pZGVudGlmaWVyXSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0b3VjaGVzID0gcmVsb2NhdGUoKSwgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodG91Y2hlcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgIGlmIChub3cgLSB0b3VjaHRpbWUgPCA1MDApIHtcclxuICAgICAgICAgICAgdmFyIHAgPSB0b3VjaGVzWzBdO1xyXG4gICAgICAgICAgICB6b29tVG8odGhhdCwgcCwgbG9jYXRpb25zMFtwLmlkZW50aWZpZXJdLCBNYXRoLmZsb29yKE1hdGgubG9nKHZpZXcuaykgLyBNYXRoLkxOMikgKyAxKTtcclxuICAgICAgICAgICAgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdG91Y2h0aW1lID0gbm93O1xyXG4gICAgICAgIH0gZWxzZSBpZiAodG91Y2hlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICB2YXIgcCA9IHRvdWNoZXNbMF0sIHEgPSB0b3VjaGVzWzFdLCBkeCA9IHBbMF0gLSBxWzBdLCBkeSA9IHBbMV0gLSBxWzFdO1xyXG4gICAgICAgICAgZGlzdGFuY2UwID0gZHggKiBkeCArIGR5ICogZHk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGZ1bmN0aW9uIG1vdmVkKCkge1xyXG4gICAgICAgIHZhciB0b3VjaGVzID0gZDMudG91Y2hlcyh0aGF0KSwgcDAsIGwwLCBwMSwgbDE7XHJcbiAgICAgICAgZDNfc2VsZWN0aW9uX2ludGVycnVwdC5jYWxsKHRoYXQpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcy5sZW5ndGg7IGkgPCBuOyArK2ksIGwxID0gbnVsbCkge1xyXG4gICAgICAgICAgcDEgPSB0b3VjaGVzW2ldO1xyXG4gICAgICAgICAgaWYgKGwxID0gbG9jYXRpb25zMFtwMS5pZGVudGlmaWVyXSkge1xyXG4gICAgICAgICAgICBpZiAobDApIGJyZWFrO1xyXG4gICAgICAgICAgICBwMCA9IHAxLCBsMCA9IGwxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobDEpIHtcclxuICAgICAgICAgIHZhciBkaXN0YW5jZTEgPSAoZGlzdGFuY2UxID0gcDFbMF0gLSBwMFswXSkgKiBkaXN0YW5jZTEgKyAoZGlzdGFuY2UxID0gcDFbMV0gLSBwMFsxXSkgKiBkaXN0YW5jZTEsIHNjYWxlMSA9IGRpc3RhbmNlMCAmJiBNYXRoLnNxcnQoZGlzdGFuY2UxIC8gZGlzdGFuY2UwKTtcclxuICAgICAgICAgIHAwID0gWyAocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyIF07XHJcbiAgICAgICAgICBsMCA9IFsgKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMiBdO1xyXG4gICAgICAgICAgc2NhbGVUbyhzY2FsZTEgKiBzY2FsZTApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0b3VjaHRpbWUgPSBudWxsO1xyXG4gICAgICAgIHRyYW5zbGF0ZVRvKHAwLCBsMCk7XHJcbiAgICAgICAgem9vbWVkKGRpc3BhdGNoKTtcclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBlbmRlZCgpIHtcclxuICAgICAgICBpZiAoZDMuZXZlbnQudG91Y2hlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHZhciBjaGFuZ2VkID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGNoYW5nZWQubGVuZ3RoOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBsb2NhdGlvbnMwW2NoYW5nZWRbaV0uaWRlbnRpZmllcl07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb3IgKHZhciBpZGVudGlmaWVyIGluIGxvY2F0aW9uczApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgcmVsb2NhdGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZDMuc2VsZWN0QWxsKHRhcmdldHMpLm9uKHpvb21OYW1lLCBudWxsKTtcclxuICAgICAgICBzdWJqZWN0Lm9uKG1vdXNlZG93biwgbW91c2Vkb3duZWQpLm9uKHRvdWNoc3RhcnQsIHRvdWNoc3RhcnRlZCk7XHJcbiAgICAgICAgZHJhZ1Jlc3RvcmUoKTtcclxuICAgICAgICB6b29tZW5kZWQoZGlzcGF0Y2gpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBtb3VzZXdoZWVsZWQoKSB7XHJcbiAgICAgIHZhciBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgIGlmIChtb3VzZXdoZWVsVGltZXIpIGNsZWFyVGltZW91dChtb3VzZXdoZWVsVGltZXIpOyBlbHNlIGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHQuY2FsbCh0aGlzKSwgXHJcbiAgICAgIHRyYW5zbGF0ZTAgPSBsb2NhdGlvbihjZW50ZXIwID0gY2VudGVyIHx8IGQzLm1vdXNlKHRoaXMpKSwgem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpO1xyXG4gICAgICBtb3VzZXdoZWVsVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIG1vdXNld2hlZWxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcclxuICAgICAgfSwgNTApO1xyXG4gICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHNjYWxlVG8oTWF0aC5wb3coMiwgZDNfYmVoYXZpb3Jfem9vbURlbHRhKCkgKiAuMDAyKSAqIHZpZXcuayk7XHJcbiAgICAgIHRyYW5zbGF0ZVRvKGNlbnRlcjAsIHRyYW5zbGF0ZTApO1xyXG4gICAgICB6b29tZWQoZGlzcGF0Y2gpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZGJsY2xpY2tlZCgpIHtcclxuICAgICAgdmFyIHAgPSBkMy5tb3VzZSh0aGlzKSwgayA9IE1hdGgubG9nKHZpZXcuaykgLyBNYXRoLkxOMjtcclxuICAgICAgem9vbVRvKHRoaXMsIHAsIGxvY2F0aW9uKHApLCBkMy5ldmVudC5zaGlmdEtleSA/IE1hdGguY2VpbChrKSAtIDEgOiBNYXRoLmZsb29yKGspICsgMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDMucmViaW5kKHpvb20sIGV2ZW50LCBcIm9uXCIpO1xyXG4gIH07XHJcbiAgdmFyIGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSA9IFsgMCwgSW5maW5pdHkgXSwgZDNfYmVoYXZpb3Jfem9vbURlbHRhLCBkM19iZWhhdmlvcl96b29tV2hlZWw7XHJcbiAgZDMuY29sb3IgPSBkM19jb2xvcjtcclxuICBmdW5jdGlvbiBkM19jb2xvcigpIHt9XHJcbiAgZDNfY29sb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZ2IoKSArIFwiXCI7XHJcbiAgfTtcclxuICBkMy5oc2wgPSBkM19oc2w7XHJcbiAgZnVuY3Rpb24gZDNfaHNsKGgsIHMsIGwpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgZDNfaHNsID8gdm9pZCAodGhpcy5oID0gK2gsIHRoaXMucyA9ICtzLCB0aGlzLmwgPSArbCkgOiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGggaW5zdGFuY2VvZiBkM19oc2wgPyBuZXcgZDNfaHNsKGguaCwgaC5zLCBoLmwpIDogZDNfcmdiX3BhcnNlKFwiXCIgKyBoLCBkM19yZ2JfaHNsLCBkM19oc2wpIDogbmV3IGQzX2hzbChoLCBzLCBsKTtcclxuICB9XHJcbiAgdmFyIGQzX2hzbFByb3RvdHlwZSA9IGQzX2hzbC5wcm90b3R5cGUgPSBuZXcgZDNfY29sb3IoKTtcclxuICBkM19oc2xQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7XHJcbiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7XHJcbiAgICByZXR1cm4gbmV3IGQzX2hzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sIC8gayk7XHJcbiAgfTtcclxuICBkM19oc2xQcm90b3R5cGUuZGFya2VyID0gZnVuY3Rpb24oaykge1xyXG4gICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpO1xyXG4gICAgcmV0dXJuIG5ldyBkM19oc2wodGhpcy5oLCB0aGlzLnMsIGsgKiB0aGlzLmwpO1xyXG4gIH07XHJcbiAgZDNfaHNsUHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX2hzbF9yZ2IodGhpcy5oLCB0aGlzLnMsIHRoaXMubCk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19oc2xfcmdiKGgsIHMsIGwpIHtcclxuICAgIHZhciBtMSwgbTI7XHJcbiAgICBoID0gaXNOYU4oaCkgPyAwIDogKGggJT0gMzYwKSA8IDAgPyBoICsgMzYwIDogaDtcclxuICAgIHMgPSBpc05hTihzKSA/IDAgOiBzIDwgMCA/IDAgOiBzID4gMSA/IDEgOiBzO1xyXG4gICAgbCA9IGwgPCAwID8gMCA6IGwgPiAxID8gMSA6IGw7XHJcbiAgICBtMiA9IGwgPD0gLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XHJcbiAgICBtMSA9IDIgKiBsIC0gbTI7XHJcbiAgICBmdW5jdGlvbiB2KGgpIHtcclxuICAgICAgaWYgKGggPiAzNjApIGggLT0gMzYwOyBlbHNlIGlmIChoIDwgMCkgaCArPSAzNjA7XHJcbiAgICAgIGlmIChoIDwgNjApIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggLyA2MDtcclxuICAgICAgaWYgKGggPCAxODApIHJldHVybiBtMjtcclxuICAgICAgaWYgKGggPCAyNDApIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwO1xyXG4gICAgICByZXR1cm4gbTE7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB2dihoKSB7XHJcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHYoaCkgKiAyNTUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBkM19yZ2IodnYoaCArIDEyMCksIHZ2KGgpLCB2dihoIC0gMTIwKSk7XHJcbiAgfVxyXG4gIGQzLmhjbCA9IGQzX2hjbDtcclxuICBmdW5jdGlvbiBkM19oY2woaCwgYywgbCkge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkM19oY2wgPyB2b2lkICh0aGlzLmggPSAraCwgdGhpcy5jID0gK2MsIHRoaXMubCA9ICtsKSA6IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gaCBpbnN0YW5jZW9mIGQzX2hjbCA/IG5ldyBkM19oY2woaC5oLCBoLmMsIGgubCkgOiBoIGluc3RhbmNlb2YgZDNfbGFiID8gZDNfbGFiX2hjbChoLmwsIGguYSwgaC5iKSA6IGQzX2xhYl9oY2woKGggPSBkM19yZ2JfbGFiKChoID0gZDMucmdiKGgpKS5yLCBoLmcsIGguYikpLmwsIGguYSwgaC5iKSA6IG5ldyBkM19oY2woaCwgYywgbCk7XHJcbiAgfVxyXG4gIHZhciBkM19oY2xQcm90b3R5cGUgPSBkM19oY2wucHJvdG90eXBlID0gbmV3IGQzX2NvbG9yKCk7XHJcbiAgZDNfaGNsUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykge1xyXG4gICAgcmV0dXJuIG5ldyBkM19oY2wodGhpcy5oLCB0aGlzLmMsIE1hdGgubWluKDEwMCwgdGhpcy5sICsgZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSkpO1xyXG4gIH07XHJcbiAgZDNfaGNsUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHtcclxuICAgIHJldHVybiBuZXcgZDNfaGNsKHRoaXMuaCwgdGhpcy5jLCBNYXRoLm1heCgwLCB0aGlzLmwgLSBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSk7XHJcbiAgfTtcclxuICBkM19oY2xQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfaGNsX2xhYih0aGlzLmgsIHRoaXMuYywgdGhpcy5sKS5yZ2IoKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2hjbF9sYWIoaCwgYywgbCkge1xyXG4gICAgaWYgKGlzTmFOKGgpKSBoID0gMDtcclxuICAgIGlmIChpc05hTihjKSkgYyA9IDA7XHJcbiAgICByZXR1cm4gbmV3IGQzX2xhYihsLCBNYXRoLmNvcyhoICo9IGQzX3JhZGlhbnMpICogYywgTWF0aC5zaW4oaCkgKiBjKTtcclxuICB9XHJcbiAgZDMubGFiID0gZDNfbGFiO1xyXG4gIGZ1bmN0aW9uIGQzX2xhYihsLCBhLCBiKSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGQzX2xhYiA/IHZvaWQgKHRoaXMubCA9ICtsLCB0aGlzLmEgPSArYSwgdGhpcy5iID0gK2IpIDogYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBsIGluc3RhbmNlb2YgZDNfbGFiID8gbmV3IGQzX2xhYihsLmwsIGwuYSwgbC5iKSA6IGwgaW5zdGFuY2VvZiBkM19oY2wgPyBkM19oY2xfbGFiKGwuaCwgbC5jLCBsLmwpIDogZDNfcmdiX2xhYigobCA9IGQzX3JnYihsKSkuciwgbC5nLCBsLmIpIDogbmV3IGQzX2xhYihsLCBhLCBiKTtcclxuICB9XHJcbiAgdmFyIGQzX2xhYl9LID0gMTg7XHJcbiAgdmFyIGQzX2xhYl9YID0gLjk1MDQ3LCBkM19sYWJfWSA9IDEsIGQzX2xhYl9aID0gMS4wODg4MztcclxuICB2YXIgZDNfbGFiUHJvdG90eXBlID0gZDNfbGFiLnByb3RvdHlwZSA9IG5ldyBkM19jb2xvcigpO1xyXG4gIGQzX2xhYlByb3RvdHlwZS5icmlnaHRlciA9IGZ1bmN0aW9uKGspIHtcclxuICAgIHJldHVybiBuZXcgZDNfbGFiKE1hdGgubWluKDEwMCwgdGhpcy5sICsgZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSksIHRoaXMuYSwgdGhpcy5iKTtcclxuICB9O1xyXG4gIGQzX2xhYlByb3RvdHlwZS5kYXJrZXIgPSBmdW5jdGlvbihrKSB7XHJcbiAgICByZXR1cm4gbmV3IGQzX2xhYihNYXRoLm1heCgwLCB0aGlzLmwgLSBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSwgdGhpcy5hLCB0aGlzLmIpO1xyXG4gIH07XHJcbiAgZDNfbGFiUHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX2xhYl9yZ2IodGhpcy5sLCB0aGlzLmEsIHRoaXMuYik7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19sYWJfcmdiKGwsIGEsIGIpIHtcclxuICAgIHZhciB5ID0gKGwgKyAxNikgLyAxMTYsIHggPSB5ICsgYSAvIDUwMCwgeiA9IHkgLSBiIC8gMjAwO1xyXG4gICAgeCA9IGQzX2xhYl94eXooeCkgKiBkM19sYWJfWDtcclxuICAgIHkgPSBkM19sYWJfeHl6KHkpICogZDNfbGFiX1k7XHJcbiAgICB6ID0gZDNfbGFiX3h5eih6KSAqIGQzX2xhYl9aO1xyXG4gICAgcmV0dXJuIG5ldyBkM19yZ2IoZDNfeHl6X3JnYigzLjI0MDQ1NDIgKiB4IC0gMS41MzcxMzg1ICogeSAtIC40OTg1MzE0ICogeiksIGQzX3h5el9yZ2IoLS45NjkyNjYgKiB4ICsgMS44NzYwMTA4ICogeSArIC4wNDE1NTYgKiB6KSwgZDNfeHl6X3JnYiguMDU1NjQzNCAqIHggLSAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xhYl9oY2wobCwgYSwgYikge1xyXG4gICAgcmV0dXJuIGwgPiAwID8gbmV3IGQzX2hjbChNYXRoLmF0YW4yKGIsIGEpICogZDNfZGVncmVlcywgTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpLCBsKSA6IG5ldyBkM19oY2woTmFOLCBOYU4sIGwpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYWJfeHl6KHgpIHtcclxuICAgIHJldHVybiB4ID4gLjIwNjg5MzAzNCA/IHggKiB4ICogeCA6ICh4IC0gNCAvIDI5KSAvIDcuNzg3MDM3O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM194eXpfbGFiKHgpIHtcclxuICAgIHJldHVybiB4ID4gLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6IDcuNzg3MDM3ICogeCArIDQgLyAyOTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfeHl6X3JnYihyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgyNTUgKiAociA8PSAuMDAzMDQgPyAxMi45MiAqIHIgOiAxLjA1NSAqIE1hdGgucG93KHIsIDEgLyAyLjQpIC0gLjA1NSkpO1xyXG4gIH1cclxuICBkMy5yZ2IgPSBkM19yZ2I7XHJcbiAgZnVuY3Rpb24gZDNfcmdiKHIsIGcsIGIpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgZDNfcmdiID8gdm9pZCAodGhpcy5yID0gfn5yLCB0aGlzLmcgPSB+fmcsIHRoaXMuYiA9IH5+YikgOiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHIgaW5zdGFuY2VvZiBkM19yZ2IgPyBuZXcgZDNfcmdiKHIuciwgci5nLCByLmIpIDogZDNfcmdiX3BhcnNlKFwiXCIgKyByLCBkM19yZ2IsIGQzX2hzbF9yZ2IpIDogbmV3IGQzX3JnYihyLCBnLCBiKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfcmdiTnVtYmVyKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gbmV3IGQzX3JnYih2YWx1ZSA+PiAxNiwgdmFsdWUgPj4gOCAmIDI1NSwgdmFsdWUgJiAyNTUpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19yZ2JTdHJpbmcodmFsdWUpIHtcclxuICAgIHJldHVybiBkM19yZ2JOdW1iZXIodmFsdWUpICsgXCJcIjtcclxuICB9XHJcbiAgdmFyIGQzX3JnYlByb3RvdHlwZSA9IGQzX3JnYi5wcm90b3R5cGUgPSBuZXcgZDNfY29sb3IoKTtcclxuICBkM19yZ2JQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7XHJcbiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7XHJcbiAgICB2YXIgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYiwgaSA9IDMwO1xyXG4gICAgaWYgKCFyICYmICFnICYmICFiKSByZXR1cm4gbmV3IGQzX3JnYihpLCBpLCBpKTtcclxuICAgIGlmIChyICYmIHIgPCBpKSByID0gaTtcclxuICAgIGlmIChnICYmIGcgPCBpKSBnID0gaTtcclxuICAgIGlmIChiICYmIGIgPCBpKSBiID0gaTtcclxuICAgIHJldHVybiBuZXcgZDNfcmdiKE1hdGgubWluKDI1NSwgciAvIGspLCBNYXRoLm1pbigyNTUsIGcgLyBrKSwgTWF0aC5taW4oMjU1LCBiIC8gaykpO1xyXG4gIH07XHJcbiAgZDNfcmdiUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHtcclxuICAgIGsgPSBNYXRoLnBvdyguNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTtcclxuICAgIHJldHVybiBuZXcgZDNfcmdiKGsgKiB0aGlzLnIsIGsgKiB0aGlzLmcsIGsgKiB0aGlzLmIpO1xyXG4gIH07XHJcbiAgZDNfcmdiUHJvdG90eXBlLmhzbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX3JnYl9oc2wodGhpcy5yLCB0aGlzLmcsIHRoaXMuYik7XHJcbiAgfTtcclxuICBkM19yZ2JQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBcIiNcIiArIGQzX3JnYl9oZXgodGhpcy5yKSArIGQzX3JnYl9oZXgodGhpcy5nKSArIGQzX3JnYl9oZXgodGhpcy5iKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3JnYl9oZXgodikge1xyXG4gICAgcmV0dXJuIHYgPCAxNiA/IFwiMFwiICsgTWF0aC5tYXgoMCwgdikudG9TdHJpbmcoMTYpIDogTWF0aC5taW4oMjU1LCB2KS50b1N0cmluZygxNik7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3JnYl9wYXJzZShmb3JtYXQsIHJnYiwgaHNsKSB7XHJcbiAgICB2YXIgciA9IDAsIGcgPSAwLCBiID0gMCwgbTEsIG0yLCBjb2xvcjtcclxuICAgIG0xID0gLyhbYS16XSspXFwoKC4qKVxcKS8uZXhlYyhmb3JtYXQgPSBmb3JtYXQudG9Mb3dlckNhc2UoKSk7XHJcbiAgICBpZiAobTEpIHtcclxuICAgICAgbTIgPSBtMVsyXS5zcGxpdChcIixcIik7XHJcbiAgICAgIHN3aXRjaCAobTFbMV0pIHtcclxuICAgICAgIGNhc2UgXCJoc2xcIjpcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZXR1cm4gaHNsKHBhcnNlRmxvYXQobTJbMF0pLCBwYXJzZUZsb2F0KG0yWzFdKSAvIDEwMCwgcGFyc2VGbG9hdChtMlsyXSkgLyAxMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICBjYXNlIFwicmdiXCI6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmV0dXJuIHJnYihkM19yZ2JfcGFyc2VOdW1iZXIobTJbMF0pLCBkM19yZ2JfcGFyc2VOdW1iZXIobTJbMV0pLCBkM19yZ2JfcGFyc2VOdW1iZXIobTJbMl0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjb2xvciA9IGQzX3JnYl9uYW1lcy5nZXQoZm9ybWF0KSkge1xyXG4gICAgICByZXR1cm4gcmdiKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZvcm1hdCAhPSBudWxsICYmIGZvcm1hdC5jaGFyQXQoMCkgPT09IFwiI1wiICYmICFpc05hTihjb2xvciA9IHBhcnNlSW50KGZvcm1hdC5zbGljZSgxKSwgMTYpKSkge1xyXG4gICAgICBpZiAoZm9ybWF0Lmxlbmd0aCA9PT0gNCkge1xyXG4gICAgICAgIHIgPSAoY29sb3IgJiAzODQwKSA+PiA0O1xyXG4gICAgICAgIHIgPSByID4+IDQgfCByO1xyXG4gICAgICAgIGcgPSBjb2xvciAmIDI0MDtcclxuICAgICAgICBnID0gZyA+PiA0IHwgZztcclxuICAgICAgICBiID0gY29sb3IgJiAxNTtcclxuICAgICAgICBiID0gYiA8PCA0IHwgYjtcclxuICAgICAgfSBlbHNlIGlmIChmb3JtYXQubGVuZ3RoID09PSA3KSB7XHJcbiAgICAgICAgciA9IChjb2xvciAmIDE2NzExNjgwKSA+PiAxNjtcclxuICAgICAgICBnID0gKGNvbG9yICYgNjUyODApID4+IDg7XHJcbiAgICAgICAgYiA9IGNvbG9yICYgMjU1O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmdiKHIsIGcsIGIpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19yZ2JfaHNsKHIsIGcsIGIpIHtcclxuICAgIHZhciBtaW4gPSBNYXRoLm1pbihyIC89IDI1NSwgZyAvPSAyNTUsIGIgLz0gMjU1KSwgbWF4ID0gTWF0aC5tYXgociwgZywgYiksIGQgPSBtYXggLSBtaW4sIGgsIHMsIGwgPSAobWF4ICsgbWluKSAvIDI7XHJcbiAgICBpZiAoZCkge1xyXG4gICAgICBzID0gbCA8IC41ID8gZCAvIChtYXggKyBtaW4pIDogZCAvICgyIC0gbWF4IC0gbWluKTtcclxuICAgICAgaWYgKHIgPT0gbWF4KSBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7IGVsc2UgaWYgKGcgPT0gbWF4KSBoID0gKGIgLSByKSAvIGQgKyAyOyBlbHNlIGggPSAociAtIGcpIC8gZCArIDQ7XHJcbiAgICAgIGggKj0gNjA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBoID0gTmFOO1xyXG4gICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgZDNfaHNsKGgsIHMsIGwpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19yZ2JfbGFiKHIsIGcsIGIpIHtcclxuICAgIHIgPSBkM19yZ2JfeHl6KHIpO1xyXG4gICAgZyA9IGQzX3JnYl94eXooZyk7XHJcbiAgICBiID0gZDNfcmdiX3h5eihiKTtcclxuICAgIHZhciB4ID0gZDNfeHl6X2xhYigoLjQxMjQ1NjQgKiByICsgLjM1NzU3NjEgKiBnICsgLjE4MDQzNzUgKiBiKSAvIGQzX2xhYl9YKSwgeSA9IGQzX3h5el9sYWIoKC4yMTI2NzI5ICogciArIC43MTUxNTIyICogZyArIC4wNzIxNzUgKiBiKSAvIGQzX2xhYl9ZKSwgeiA9IGQzX3h5el9sYWIoKC4wMTkzMzM5ICogciArIC4xMTkxOTIgKiBnICsgLjk1MDMwNDEgKiBiKSAvIGQzX2xhYl9aKTtcclxuICAgIHJldHVybiBkM19sYWIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfcmdiX3h5eihyKSB7XHJcbiAgICByZXR1cm4gKHIgLz0gMjU1KSA8PSAuMDQwNDUgPyByIC8gMTIuOTIgOiBNYXRoLnBvdygociArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3JnYl9wYXJzZU51bWJlcihjKSB7XHJcbiAgICB2YXIgZiA9IHBhcnNlRmxvYXQoYyk7XHJcbiAgICByZXR1cm4gYy5jaGFyQXQoYy5sZW5ndGggLSAxKSA9PT0gXCIlXCIgPyBNYXRoLnJvdW5kKGYgKiAyLjU1KSA6IGY7XHJcbiAgfVxyXG4gIHZhciBkM19yZ2JfbmFtZXMgPSBkMy5tYXAoe1xyXG4gICAgYWxpY2VibHVlOiAxNTc5MjM4MyxcclxuICAgIGFudGlxdWV3aGl0ZTogMTY0NDQzNzUsXHJcbiAgICBhcXVhOiA2NTUzNSxcclxuICAgIGFxdWFtYXJpbmU6IDgzODg1NjQsXHJcbiAgICBhenVyZTogMTU3OTQxNzUsXHJcbiAgICBiZWlnZTogMTYxMTkyNjAsXHJcbiAgICBiaXNxdWU6IDE2NzcwMjQ0LFxyXG4gICAgYmxhY2s6IDAsXHJcbiAgICBibGFuY2hlZGFsbW9uZDogMTY3NzIwNDUsXHJcbiAgICBibHVlOiAyNTUsXHJcbiAgICBibHVldmlvbGV0OiA5MDU1MjAyLFxyXG4gICAgYnJvd246IDEwODI0MjM0LFxyXG4gICAgYnVybHl3b29kOiAxNDU5NjIzMSxcclxuICAgIGNhZGV0Ymx1ZTogNjI2NjUyOCxcclxuICAgIGNoYXJ0cmV1c2U6IDgzODgzNTIsXHJcbiAgICBjaG9jb2xhdGU6IDEzNzg5NDcwLFxyXG4gICAgY29yYWw6IDE2NzQ0MjcyLFxyXG4gICAgY29ybmZsb3dlcmJsdWU6IDY1OTE5ODEsXHJcbiAgICBjb3Juc2lsazogMTY3NzUzODgsXHJcbiAgICBjcmltc29uOiAxNDQyMzEwMCxcclxuICAgIGN5YW46IDY1NTM1LFxyXG4gICAgZGFya2JsdWU6IDEzOSxcclxuICAgIGRhcmtjeWFuOiAzNTcyMyxcclxuICAgIGRhcmtnb2xkZW5yb2Q6IDEyMDkyOTM5LFxyXG4gICAgZGFya2dyYXk6IDExMTE5MDE3LFxyXG4gICAgZGFya2dyZWVuOiAyNTYwMCxcclxuICAgIGRhcmtncmV5OiAxMTExOTAxNyxcclxuICAgIGRhcmtraGFraTogMTI0MzMyNTksXHJcbiAgICBkYXJrbWFnZW50YTogOTEwOTY0MyxcclxuICAgIGRhcmtvbGl2ZWdyZWVuOiA1NTk3OTk5LFxyXG4gICAgZGFya29yYW5nZTogMTY3NDc1MjAsXHJcbiAgICBkYXJrb3JjaGlkOiAxMDA0MDAxMixcclxuICAgIGRhcmtyZWQ6IDkxMDk1MDQsXHJcbiAgICBkYXJrc2FsbW9uOiAxNTMwODQxMCxcclxuICAgIGRhcmtzZWFncmVlbjogOTQxOTkxOSxcclxuICAgIGRhcmtzbGF0ZWJsdWU6IDQ3MzQzNDcsXHJcbiAgICBkYXJrc2xhdGVncmF5OiAzMTAwNDk1LFxyXG4gICAgZGFya3NsYXRlZ3JleTogMzEwMDQ5NSxcclxuICAgIGRhcmt0dXJxdW9pc2U6IDUyOTQ1LFxyXG4gICAgZGFya3Zpb2xldDogOTY5OTUzOSxcclxuICAgIGRlZXBwaW5rOiAxNjcxNjk0NyxcclxuICAgIGRlZXBza3libHVlOiA0OTE1MSxcclxuICAgIGRpbWdyYXk6IDY5MDgyNjUsXHJcbiAgICBkaW1ncmV5OiA2OTA4MjY1LFxyXG4gICAgZG9kZ2VyYmx1ZTogMjAwMzE5OSxcclxuICAgIGZpcmVicmljazogMTE2NzQxNDYsXHJcbiAgICBmbG9yYWx3aGl0ZTogMTY3NzU5MjAsXHJcbiAgICBmb3Jlc3RncmVlbjogMjI2Mzg0MixcclxuICAgIGZ1Y2hzaWE6IDE2NzExOTM1LFxyXG4gICAgZ2FpbnNib3JvOiAxNDQ3NDQ2MCxcclxuICAgIGdob3N0d2hpdGU6IDE2MzE2NjcxLFxyXG4gICAgZ29sZDogMTY3NjY3MjAsXHJcbiAgICBnb2xkZW5yb2Q6IDE0MzI5MTIwLFxyXG4gICAgZ3JheTogODQyMTUwNCxcclxuICAgIGdyZWVuOiAzMjc2OCxcclxuICAgIGdyZWVueWVsbG93OiAxMTQwMzA1NSxcclxuICAgIGdyZXk6IDg0MjE1MDQsXHJcbiAgICBob25leWRldzogMTU3OTQxNjAsXHJcbiAgICBob3RwaW5rOiAxNjczODc0MCxcclxuICAgIGluZGlhbnJlZDogMTM0NTg1MjQsXHJcbiAgICBpbmRpZ286IDQ5MTUzMzAsXHJcbiAgICBpdm9yeTogMTY3NzcyMDAsXHJcbiAgICBraGFraTogMTU3ODc2NjAsXHJcbiAgICBsYXZlbmRlcjogMTUxMzI0MTAsXHJcbiAgICBsYXZlbmRlcmJsdXNoOiAxNjc3MzM2NSxcclxuICAgIGxhd25ncmVlbjogODE5MDk3NixcclxuICAgIGxlbW9uY2hpZmZvbjogMTY3NzU4ODUsXHJcbiAgICBsaWdodGJsdWU6IDExMzkzMjU0LFxyXG4gICAgbGlnaHRjb3JhbDogMTU3NjE1MzYsXHJcbiAgICBsaWdodGN5YW46IDE0NzQ1NTk5LFxyXG4gICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDE2NDQ4MjEwLFxyXG4gICAgbGlnaHRncmF5OiAxMzg4MjMyMyxcclxuICAgIGxpZ2h0Z3JlZW46IDk0OTgyNTYsXHJcbiAgICBsaWdodGdyZXk6IDEzODgyMzIzLFxyXG4gICAgbGlnaHRwaW5rOiAxNjc1ODQ2NSxcclxuICAgIGxpZ2h0c2FsbW9uOiAxNjc1Mjc2MixcclxuICAgIGxpZ2h0c2VhZ3JlZW46IDIxNDI4OTAsXHJcbiAgICBsaWdodHNreWJsdWU6IDg5MDAzNDYsXHJcbiAgICBsaWdodHNsYXRlZ3JheTogNzgzMzc1MyxcclxuICAgIGxpZ2h0c2xhdGVncmV5OiA3ODMzNzUzLFxyXG4gICAgbGlnaHRzdGVlbGJsdWU6IDExNTg0NzM0LFxyXG4gICAgbGlnaHR5ZWxsb3c6IDE2Nzc3MTg0LFxyXG4gICAgbGltZTogNjUyODAsXHJcbiAgICBsaW1lZ3JlZW46IDMzMjkzMzAsXHJcbiAgICBsaW5lbjogMTY0NDU2NzAsXHJcbiAgICBtYWdlbnRhOiAxNjcxMTkzNSxcclxuICAgIG1hcm9vbjogODM4ODYwOCxcclxuICAgIG1lZGl1bWFxdWFtYXJpbmU6IDY3MzczMjIsXHJcbiAgICBtZWRpdW1ibHVlOiAyMDUsXHJcbiAgICBtZWRpdW1vcmNoaWQ6IDEyMjExNjY3LFxyXG4gICAgbWVkaXVtcHVycGxlOiA5NjYyNjgzLFxyXG4gICAgbWVkaXVtc2VhZ3JlZW46IDM5NzgwOTcsXHJcbiAgICBtZWRpdW1zbGF0ZWJsdWU6IDgwODc3OTAsXHJcbiAgICBtZWRpdW1zcHJpbmdncmVlbjogNjQxNTQsXHJcbiAgICBtZWRpdW10dXJxdW9pc2U6IDQ3NzIzMDAsXHJcbiAgICBtZWRpdW12aW9sZXRyZWQ6IDEzMDQ3MTczLFxyXG4gICAgbWlkbmlnaHRibHVlOiAxNjQ0OTEyLFxyXG4gICAgbWludGNyZWFtOiAxNjEyMTg1MCxcclxuICAgIG1pc3R5cm9zZTogMTY3NzAyNzMsXHJcbiAgICBtb2NjYXNpbjogMTY3NzAyMjksXHJcbiAgICBuYXZham93aGl0ZTogMTY3Njg2ODUsXHJcbiAgICBuYXZ5OiAxMjgsXHJcbiAgICBvbGRsYWNlOiAxNjY0MzU1OCxcclxuICAgIG9saXZlOiA4NDIxMzc2LFxyXG4gICAgb2xpdmVkcmFiOiA3MDQ4NzM5LFxyXG4gICAgb3JhbmdlOiAxNjc1MzkyMCxcclxuICAgIG9yYW5nZXJlZDogMTY3MjkzNDQsXHJcbiAgICBvcmNoaWQ6IDE0MzE1NzM0LFxyXG4gICAgcGFsZWdvbGRlbnJvZDogMTU2NTcxMzAsXHJcbiAgICBwYWxlZ3JlZW46IDEwMDI1ODgwLFxyXG4gICAgcGFsZXR1cnF1b2lzZTogMTE1Mjk5NjYsXHJcbiAgICBwYWxldmlvbGV0cmVkOiAxNDM4MTIwMyxcclxuICAgIHBhcGF5YXdoaXA6IDE2NzczMDc3LFxyXG4gICAgcGVhY2hwdWZmOiAxNjc2NzY3MyxcclxuICAgIHBlcnU6IDEzNDY4OTkxLFxyXG4gICAgcGluazogMTY3NjEwMzUsXHJcbiAgICBwbHVtOiAxNDUyNDYzNyxcclxuICAgIHBvd2RlcmJsdWU6IDExNTkxOTEwLFxyXG4gICAgcHVycGxlOiA4Mzg4NzM2LFxyXG4gICAgcmViZWNjYXB1cnBsZTogNjY5Nzg4MSxcclxuICAgIHJlZDogMTY3MTE2ODAsXHJcbiAgICByb3N5YnJvd246IDEyMzU3NTE5LFxyXG4gICAgcm95YWxibHVlOiA0Mjg2OTQ1LFxyXG4gICAgc2FkZGxlYnJvd246IDkxMjcxODcsXHJcbiAgICBzYWxtb246IDE2NDE2ODgyLFxyXG4gICAgc2FuZHlicm93bjogMTYwMzI4NjQsXHJcbiAgICBzZWFncmVlbjogMzA1MDMyNyxcclxuICAgIHNlYXNoZWxsOiAxNjc3NDYzOCxcclxuICAgIHNpZW5uYTogMTA1MDY3OTcsXHJcbiAgICBzaWx2ZXI6IDEyNjMyMjU2LFxyXG4gICAgc2t5Ymx1ZTogODkwMDMzMSxcclxuICAgIHNsYXRlYmx1ZTogNjk3MDA2MSxcclxuICAgIHNsYXRlZ3JheTogNzM3Mjk0NCxcclxuICAgIHNsYXRlZ3JleTogNzM3Mjk0NCxcclxuICAgIHNub3c6IDE2Nzc1OTMwLFxyXG4gICAgc3ByaW5nZ3JlZW46IDY1NDA3LFxyXG4gICAgc3RlZWxibHVlOiA0NjIwOTgwLFxyXG4gICAgdGFuOiAxMzgwODc4MCxcclxuICAgIHRlYWw6IDMyODk2LFxyXG4gICAgdGhpc3RsZTogMTQyMDQ4ODgsXHJcbiAgICB0b21hdG86IDE2NzM3MDk1LFxyXG4gICAgdHVycXVvaXNlOiA0MjUxODU2LFxyXG4gICAgdmlvbGV0OiAxNTYzMTA4NixcclxuICAgIHdoZWF0OiAxNjExMzMzMSxcclxuICAgIHdoaXRlOiAxNjc3NzIxNSxcclxuICAgIHdoaXRlc21va2U6IDE2MTE5Mjg1LFxyXG4gICAgeWVsbG93OiAxNjc3Njk2MCxcclxuICAgIHllbGxvd2dyZWVuOiAxMDE0NTA3NFxyXG4gIH0pO1xyXG4gIGQzX3JnYl9uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgIGQzX3JnYl9uYW1lcy5zZXQoa2V5LCBkM19yZ2JOdW1iZXIodmFsdWUpKTtcclxuICB9KTtcclxuICBmdW5jdGlvbiBkM19mdW5jdG9yKHYpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJmdW5jdGlvblwiID8gdiA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdjtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzLmZ1bmN0b3IgPSBkM19mdW5jdG9yO1xyXG4gIGQzLnhociA9IGQzX3hoclR5cGUoZDNfaWRlbnRpdHkpO1xyXG4gIGZ1bmN0aW9uIGQzX3hoclR5cGUocmVzcG9uc2UpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbih1cmwsIG1pbWVUeXBlLCBjYWxsYmFjaykge1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgbWltZVR5cGUgPT09IFwiZnVuY3Rpb25cIikgY2FsbGJhY2sgPSBtaW1lVHlwZSwgXHJcbiAgICAgIG1pbWVUeXBlID0gbnVsbDtcclxuICAgICAgcmV0dXJuIGQzX3hocih1cmwsIG1pbWVUeXBlLCByZXNwb25zZSwgY2FsbGJhY2spO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfeGhyKHVybCwgbWltZVR5cGUsIHJlc3BvbnNlLCBjYWxsYmFjaykge1xyXG4gICAgdmFyIHhociA9IHt9LCBkaXNwYXRjaCA9IGQzLmRpc3BhdGNoKFwiYmVmb3Jlc2VuZFwiLCBcInByb2dyZXNzXCIsIFwibG9hZFwiLCBcImVycm9yXCIpLCBoZWFkZXJzID0ge30sIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKSwgcmVzcG9uc2VUeXBlID0gbnVsbDtcclxuICAgIGlmICh0aGlzLlhEb21haW5SZXF1ZXN0ICYmICEoXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiByZXF1ZXN0KSAmJiAvXihodHRwKHMpPzopP1xcL1xcLy8udGVzdCh1cmwpKSByZXF1ZXN0ID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7XHJcbiAgICBcIm9ubG9hZFwiIGluIHJlcXVlc3QgPyByZXF1ZXN0Lm9ubG9hZCA9IHJlcXVlc3Qub25lcnJvciA9IHJlc3BvbmQgOiByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXF1ZXN0LnJlYWR5U3RhdGUgPiAzICYmIHJlc3BvbmQoKTtcclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiByZXNwb25kKCkge1xyXG4gICAgICB2YXIgc3RhdHVzID0gcmVxdWVzdC5zdGF0dXMsIHJlc3VsdDtcclxuICAgICAgaWYgKCFzdGF0dXMgJiYgZDNfeGhySGFzUmVzcG9uc2UocmVxdWVzdCkgfHwgc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UuY2FsbCh4aHIsIHJlcXVlc3QpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGRpc3BhdGNoLmVycm9yLmNhbGwoeGhyLCBlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGlzcGF0Y2gubG9hZC5jYWxsKHhociwgcmVzdWx0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkaXNwYXRjaC5lcnJvci5jYWxsKHhociwgcmVxdWVzdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJlcXVlc3Qub25wcm9ncmVzcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgIHZhciBvID0gZDMuZXZlbnQ7XHJcbiAgICAgIGQzLmV2ZW50ID0gZXZlbnQ7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZGlzcGF0Y2gucHJvZ3Jlc3MuY2FsbCh4aHIsIHJlcXVlc3QpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGQzLmV2ZW50ID0gbztcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHhoci5oZWFkZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xyXG4gICAgICBuYW1lID0gKG5hbWUgKyBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBoZWFkZXJzW25hbWVdO1xyXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgZGVsZXRlIGhlYWRlcnNbbmFtZV07IGVsc2UgaGVhZGVyc1tuYW1lXSA9IHZhbHVlICsgXCJcIjtcclxuICAgICAgcmV0dXJuIHhocjtcclxuICAgIH07XHJcbiAgICB4aHIubWltZVR5cGUgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBtaW1lVHlwZTtcclxuICAgICAgbWltZVR5cGUgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlICsgXCJcIjtcclxuICAgICAgcmV0dXJuIHhocjtcclxuICAgIH07XHJcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmVzcG9uc2VUeXBlO1xyXG4gICAgICByZXNwb25zZVR5cGUgPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuIHhocjtcclxuICAgIH07XHJcbiAgICB4aHIucmVzcG9uc2UgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgICByZXNwb25zZSA9IHZhbHVlO1xyXG4gICAgICByZXR1cm4geGhyO1xyXG4gICAgfTtcclxuICAgIFsgXCJnZXRcIiwgXCJwb3N0XCIgXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xyXG4gICAgICB4aHJbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB4aHIuc2VuZC5hcHBseSh4aHIsIFsgbWV0aG9kIF0uY29uY2F0KGQzX2FycmF5KGFyZ3VtZW50cykpKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgeGhyLnNlbmQgPSBmdW5jdGlvbihtZXRob2QsIGRhdGEsIGNhbGxiYWNrKSB7XHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBkYXRhID09PSBcImZ1bmN0aW9uXCIpIGNhbGxiYWNrID0gZGF0YSwgZGF0YSA9IG51bGw7XHJcbiAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XHJcbiAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmICEoXCJhY2NlcHRcIiBpbiBoZWFkZXJzKSkgaGVhZGVyc1tcImFjY2VwdFwiXSA9IG1pbWVUeXBlICsgXCIsKi8qXCI7XHJcbiAgICAgIGlmIChyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIpIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pO1xyXG4gICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUpIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZShtaW1lVHlwZSk7XHJcbiAgICAgIGlmIChyZXNwb25zZVR5cGUgIT0gbnVsbCkgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7XHJcbiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB4aHIub24oXCJlcnJvclwiLCBjYWxsYmFjaykub24oXCJsb2FkXCIsIGZ1bmN0aW9uKHJlcXVlc3QpIHtcclxuICAgICAgICBjYWxsYmFjayhudWxsLCByZXF1ZXN0KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGRpc3BhdGNoLmJlZm9yZXNlbmQuY2FsbCh4aHIsIHJlcXVlc3QpO1xyXG4gICAgICByZXF1ZXN0LnNlbmQoZGF0YSA9PSBudWxsID8gbnVsbCA6IGRhdGEpO1xyXG4gICAgICByZXR1cm4geGhyO1xyXG4gICAgfTtcclxuICAgIHhoci5hYm9ydCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXF1ZXN0LmFib3J0KCk7XHJcbiAgICAgIHJldHVybiB4aHI7XHJcbiAgICB9O1xyXG4gICAgZDMucmViaW5kKHhociwgZGlzcGF0Y2gsIFwib25cIik7XHJcbiAgICByZXR1cm4gY2FsbGJhY2sgPT0gbnVsbCA/IHhociA6IHhoci5nZXQoZDNfeGhyX2ZpeENhbGxiYWNrKGNhbGxiYWNrKSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3hocl9maXhDYWxsYmFjayhjYWxsYmFjaykge1xyXG4gICAgcmV0dXJuIGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IGZ1bmN0aW9uKGVycm9yLCByZXF1ZXN0KSB7XHJcbiAgICAgIGNhbGxiYWNrKGVycm9yID09IG51bGwgPyByZXF1ZXN0IDogbnVsbCk7XHJcbiAgICB9IDogY2FsbGJhY2s7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3hockhhc1Jlc3BvbnNlKHJlcXVlc3QpIHtcclxuICAgIHZhciB0eXBlID0gcmVxdWVzdC5yZXNwb25zZVR5cGU7XHJcbiAgICByZXR1cm4gdHlwZSAmJiB0eXBlICE9PSBcInRleHRcIiA/IHJlcXVlc3QucmVzcG9uc2UgOiByZXF1ZXN0LnJlc3BvbnNlVGV4dDtcclxuICB9XHJcbiAgZDMuZHN2ID0gZnVuY3Rpb24oZGVsaW1pdGVyLCBtaW1lVHlwZSkge1xyXG4gICAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cCgnW1wiJyArIGRlbGltaXRlciArIFwiXFxuXVwiKSwgZGVsaW1pdGVyQ29kZSA9IGRlbGltaXRlci5jaGFyQ29kZUF0KDApO1xyXG4gICAgZnVuY3Rpb24gZHN2KHVybCwgcm93LCBjYWxsYmFjaykge1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGNhbGxiYWNrID0gcm93LCByb3cgPSBudWxsO1xyXG4gICAgICB2YXIgeGhyID0gZDNfeGhyKHVybCwgbWltZVR5cGUsIHJvdyA9PSBudWxsID8gcmVzcG9uc2UgOiB0eXBlZFJlc3BvbnNlKHJvdyksIGNhbGxiYWNrKTtcclxuICAgICAgeGhyLnJvdyA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHhoci5yZXNwb25zZSgocm93ID0gXykgPT0gbnVsbCA/IHJlc3BvbnNlIDogdHlwZWRSZXNwb25zZShfKSkgOiByb3c7XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiB4aHI7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNwb25zZShyZXF1ZXN0KSB7XHJcbiAgICAgIHJldHVybiBkc3YucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdHlwZWRSZXNwb25zZShmKSB7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGRzdi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCwgZik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBkc3YucGFyc2UgPSBmdW5jdGlvbih0ZXh0LCBmKSB7XHJcbiAgICAgIHZhciBvO1xyXG4gICAgICByZXR1cm4gZHN2LnBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHtcclxuICAgICAgICBpZiAobykgcmV0dXJuIG8ocm93LCBpIC0gMSk7XHJcbiAgICAgICAgdmFyIGEgPSBuZXcgRnVuY3Rpb24oXCJkXCIsIFwicmV0dXJuIHtcIiArIHJvdy5tYXAoZnVuY3Rpb24obmFtZSwgaSkge1xyXG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgXCI6IGRbXCIgKyBpICsgXCJdXCI7XHJcbiAgICAgICAgfSkuam9pbihcIixcIikgKyBcIn1cIik7XHJcbiAgICAgICAgbyA9IGYgPyBmdW5jdGlvbihyb3csIGkpIHtcclxuICAgICAgICAgIHJldHVybiBmKGEocm93KSwgaSk7XHJcbiAgICAgICAgfSA6IGE7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIGRzdi5wYXJzZVJvd3MgPSBmdW5jdGlvbih0ZXh0LCBmKSB7XHJcbiAgICAgIHZhciBFT0wgPSB7fSwgRU9GID0ge30sIHJvd3MgPSBbXSwgTiA9IHRleHQubGVuZ3RoLCBJID0gMCwgbiA9IDAsIHQsIGVvbDtcclxuICAgICAgZnVuY3Rpb24gdG9rZW4oKSB7XHJcbiAgICAgICAgaWYgKEkgPj0gTikgcmV0dXJuIEVPRjtcclxuICAgICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDtcclxuICAgICAgICB2YXIgaiA9IEk7XHJcbiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gMzQpIHtcclxuICAgICAgICAgIHZhciBpID0gajtcclxuICAgICAgICAgIHdoaWxlIChpKysgPCBOKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDM0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpICsgMSkgIT09IDM0KSBicmVhaztcclxuICAgICAgICAgICAgICArK2k7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEkgPSBpICsgMjtcclxuICAgICAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KGkgKyAxKTtcclxuICAgICAgICAgIGlmIChjID09PSAxMykge1xyXG4gICAgICAgICAgICBlb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAyKSA9PT0gMTApICsrSTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gMTApIHtcclxuICAgICAgICAgICAgZW9sID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGogKyAxLCBpKS5yZXBsYWNlKC9cIlwiL2csICdcIicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoSSA8IE4pIHtcclxuICAgICAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KEkrKyksIGsgPSAxO1xyXG4gICAgICAgICAgaWYgKGMgPT09IDEwKSBlb2wgPSB0cnVlOyBlbHNlIGlmIChjID09PSAxMykge1xyXG4gICAgICAgICAgICBlb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSAxMCkgKytJLCArK2s7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgIT09IGRlbGltaXRlckNvZGUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiwgSSAtIGspO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqKTtcclxuICAgICAgfVxyXG4gICAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7XHJcbiAgICAgICAgdmFyIGEgPSBbXTtcclxuICAgICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikge1xyXG4gICAgICAgICAgYS5wdXNoKHQpO1xyXG4gICAgICAgICAgdCA9IHRva2VuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmICYmIChhID0gZihhLCBuKyspKSA9PSBudWxsKSBjb250aW51ZTtcclxuICAgICAgICByb3dzLnB1c2goYSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJvd3M7XHJcbiAgICB9O1xyXG4gICAgZHN2LmZvcm1hdCA9IGZ1bmN0aW9uKHJvd3MpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93c1swXSkpIHJldHVybiBkc3YuZm9ybWF0Um93cyhyb3dzKTtcclxuICAgICAgdmFyIGZpZWxkU2V0ID0gbmV3IGQzX1NldCgpLCBmaWVsZHMgPSBbXTtcclxuICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xyXG4gICAgICAgIGZvciAodmFyIGZpZWxkIGluIHJvdykge1xyXG4gICAgICAgICAgaWYgKCFmaWVsZFNldC5oYXMoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkU2V0LmFkZChmaWVsZCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBbIGZpZWxkcy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKSBdLmNvbmNhdChyb3dzLm1hcChmdW5jdGlvbihyb3cpIHtcclxuICAgICAgICByZXR1cm4gZmllbGRzLm1hcChmdW5jdGlvbihmaWVsZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tmaWVsZF0pO1xyXG4gICAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKTtcclxuICAgICAgfSkpLmpvaW4oXCJcXG5cIik7XHJcbiAgICB9O1xyXG4gICAgZHN2LmZvcm1hdFJvd3MgPSBmdW5jdGlvbihyb3dzKSB7XHJcbiAgICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oXCJcXG5cIik7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykge1xyXG4gICAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodGV4dCkge1xyXG4gICAgICByZXR1cm4gcmVGb3JtYXQudGVzdCh0ZXh0KSA/ICdcIicgKyB0ZXh0LnJlcGxhY2UoL1xcXCIvZywgJ1wiXCInKSArICdcIicgOiB0ZXh0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRzdjtcclxuICB9O1xyXG4gIGQzLmNzdiA9IGQzLmRzdihcIixcIiwgXCJ0ZXh0L2NzdlwiKTtcclxuICBkMy50c3YgPSBkMy5kc3YoXCJcdFwiLCBcInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXNcIik7XHJcbiAgdmFyIGQzX3RpbWVyX3F1ZXVlSGVhZCwgZDNfdGltZXJfcXVldWVUYWlsLCBkM190aW1lcl9pbnRlcnZhbCwgZDNfdGltZXJfdGltZW91dCwgZDNfdGltZXJfZnJhbWUgPSB0aGlzW2QzX3ZlbmRvclN5bWJvbCh0aGlzLCBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiKV0gfHwgZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDE3KTtcclxuICB9O1xyXG4gIGQzLnRpbWVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICBkM190aW1lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aGVuKSB7XHJcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XHJcbiAgICBpZiAobiA8IDIpIGRlbGF5ID0gMDtcclxuICAgIGlmIChuIDwgMykgdGhlbiA9IERhdGUubm93KCk7XHJcbiAgICB2YXIgdGltZSA9IHRoZW4gKyBkZWxheSwgdGltZXIgPSB7XHJcbiAgICAgIGM6IGNhbGxiYWNrLFxyXG4gICAgICB0OiB0aW1lLFxyXG4gICAgICBuOiBudWxsXHJcbiAgICB9O1xyXG4gICAgaWYgKGQzX3RpbWVyX3F1ZXVlVGFpbCkgZDNfdGltZXJfcXVldWVUYWlsLm4gPSB0aW1lcjsgZWxzZSBkM190aW1lcl9xdWV1ZUhlYWQgPSB0aW1lcjtcclxuICAgIGQzX3RpbWVyX3F1ZXVlVGFpbCA9IHRpbWVyO1xyXG4gICAgaWYgKCFkM190aW1lcl9pbnRlcnZhbCkge1xyXG4gICAgICBkM190aW1lcl90aW1lb3V0ID0gY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpO1xyXG4gICAgICBkM190aW1lcl9pbnRlcnZhbCA9IDE7XHJcbiAgICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRpbWVyO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190aW1lcl9zdGVwKCkge1xyXG4gICAgdmFyIG5vdyA9IGQzX3RpbWVyX21hcmsoKSwgZGVsYXkgPSBkM190aW1lcl9zd2VlcCgpIC0gbm93O1xyXG4gICAgaWYgKGRlbGF5ID4gMjQpIHtcclxuICAgICAgaWYgKGlzRmluaXRlKGRlbGF5KSkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dChkM190aW1lcl90aW1lb3V0KTtcclxuICAgICAgICBkM190aW1lcl90aW1lb3V0ID0gc2V0VGltZW91dChkM190aW1lcl9zdGVwLCBkZWxheSk7XHJcbiAgICAgIH1cclxuICAgICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAxO1xyXG4gICAgICBkM190aW1lcl9mcmFtZShkM190aW1lcl9zdGVwKTtcclxuICAgIH1cclxuICB9XHJcbiAgZDMudGltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHtcclxuICAgIGQzX3RpbWVyX21hcmsoKTtcclxuICAgIGQzX3RpbWVyX3N3ZWVwKCk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM190aW1lcl9tYXJrKCkge1xyXG4gICAgdmFyIG5vdyA9IERhdGUubm93KCksIHRpbWVyID0gZDNfdGltZXJfcXVldWVIZWFkO1xyXG4gICAgd2hpbGUgKHRpbWVyKSB7XHJcbiAgICAgIGlmIChub3cgPj0gdGltZXIudCAmJiB0aW1lci5jKG5vdyAtIHRpbWVyLnQpKSB0aW1lci5jID0gbnVsbDtcclxuICAgICAgdGltZXIgPSB0aW1lci5uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vdztcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZXJfc3dlZXAoKSB7XHJcbiAgICB2YXIgdDAsIHQxID0gZDNfdGltZXJfcXVldWVIZWFkLCB0aW1lID0gSW5maW5pdHk7XHJcbiAgICB3aGlsZSAodDEpIHtcclxuICAgICAgaWYgKHQxLmMpIHtcclxuICAgICAgICBpZiAodDEudCA8IHRpbWUpIHRpbWUgPSB0MS50O1xyXG4gICAgICAgIHQxID0gKHQwID0gdDEpLm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdDEgPSB0MCA/IHQwLm4gPSB0MS5uIDogZDNfdGltZXJfcXVldWVIZWFkID0gdDEubjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZDNfdGltZXJfcXVldWVUYWlsID0gdDA7XHJcbiAgICByZXR1cm4gdGltZTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZm9ybWF0X3ByZWNpc2lvbih4LCBwKSB7XHJcbiAgICByZXR1cm4gcCAtICh4ID8gTWF0aC5jZWlsKE1hdGgubG9nKHgpIC8gTWF0aC5MTjEwKSA6IDEpO1xyXG4gIH1cclxuICBkMy5yb3VuZCA9IGZ1bmN0aW9uKHgsIG4pIHtcclxuICAgIHJldHVybiBuID8gTWF0aC5yb3VuZCh4ICogKG4gPSBNYXRoLnBvdygxMCwgbikpKSAvIG4gOiBNYXRoLnJvdW5kKHgpO1xyXG4gIH07XHJcbiAgdmFyIGQzX2Zvcm1hdFByZWZpeGVzID0gWyBcInlcIiwgXCJ6XCIsIFwiYVwiLCBcImZcIiwgXCJwXCIsIFwiblwiLCBcIsK1XCIsIFwibVwiLCBcIlwiLCBcImtcIiwgXCJNXCIsIFwiR1wiLCBcIlRcIiwgXCJQXCIsIFwiRVwiLCBcIlpcIiwgXCJZXCIgXS5tYXAoZDNfZm9ybWF0UHJlZml4KTtcclxuICBkMy5mb3JtYXRQcmVmaXggPSBmdW5jdGlvbih2YWx1ZSwgcHJlY2lzaW9uKSB7XHJcbiAgICB2YXIgaSA9IDA7XHJcbiAgICBpZiAodmFsdWUgPSArdmFsdWUpIHtcclxuICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgKj0gLTE7XHJcbiAgICAgIGlmIChwcmVjaXNpb24pIHZhbHVlID0gZDMucm91bmQodmFsdWUsIGQzX2Zvcm1hdF9wcmVjaXNpb24odmFsdWUsIHByZWNpc2lvbikpO1xyXG4gICAgICBpID0gMSArIE1hdGguZmxvb3IoMWUtMTIgKyBNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMTApO1xyXG4gICAgICBpID0gTWF0aC5tYXgoLTI0LCBNYXRoLm1pbigyNCwgTWF0aC5mbG9vcigoaSAtIDEpIC8gMykgKiAzKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDNfZm9ybWF0UHJlZml4ZXNbOCArIGkgLyAzXTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2Zvcm1hdFByZWZpeChkLCBpKSB7XHJcbiAgICB2YXIgayA9IE1hdGgucG93KDEwLCBhYnMoOCAtIGkpICogMyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzY2FsZTogaSA+IDggPyBmdW5jdGlvbihkKSB7XHJcbiAgICAgICAgcmV0dXJuIGQgLyBrO1xyXG4gICAgICB9IDogZnVuY3Rpb24oZCkge1xyXG4gICAgICAgIHJldHVybiBkICogaztcclxuICAgICAgfSxcclxuICAgICAgc3ltYm9sOiBkXHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sb2NhbGVfbnVtYmVyRm9ybWF0KGxvY2FsZSkge1xyXG4gICAgdmFyIGxvY2FsZV9kZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwsIGxvY2FsZV90aG91c2FuZHMgPSBsb2NhbGUudGhvdXNhbmRzLCBsb2NhbGVfZ3JvdXBpbmcgPSBsb2NhbGUuZ3JvdXBpbmcsIGxvY2FsZV9jdXJyZW5jeSA9IGxvY2FsZS5jdXJyZW5jeSwgZm9ybWF0R3JvdXAgPSBsb2NhbGVfZ3JvdXBpbmcgJiYgbG9jYWxlX3Rob3VzYW5kcyA/IGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xyXG4gICAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCwgdCA9IFtdLCBqID0gMCwgZyA9IGxvY2FsZV9ncm91cGluZ1swXSwgbGVuZ3RoID0gMDtcclxuICAgICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7XHJcbiAgICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XHJcbiAgICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XHJcbiAgICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrO1xyXG4gICAgICAgIGcgPSBsb2NhbGVfZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBsb2NhbGVfZ3JvdXBpbmcubGVuZ3RoXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbihsb2NhbGVfdGhvdXNhbmRzKTtcclxuICAgIH0gOiBkM19pZGVudGl0eTtcclxuICAgIHJldHVybiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcclxuICAgICAgdmFyIG1hdGNoID0gZDNfZm9ybWF0X3JlLmV4ZWMoc3BlY2lmaWVyKSwgZmlsbCA9IG1hdGNoWzFdIHx8IFwiIFwiLCBhbGlnbiA9IG1hdGNoWzJdIHx8IFwiPlwiLCBzaWduID0gbWF0Y2hbM10gfHwgXCItXCIsIHN5bWJvbCA9IG1hdGNoWzRdIHx8IFwiXCIsIHpmaWxsID0gbWF0Y2hbNV0sIHdpZHRoID0gK21hdGNoWzZdLCBjb21tYSA9IG1hdGNoWzddLCBwcmVjaXNpb24gPSBtYXRjaFs4XSwgdHlwZSA9IG1hdGNoWzldLCBzY2FsZSA9IDEsIHByZWZpeCA9IFwiXCIsIHN1ZmZpeCA9IFwiXCIsIGludGVnZXIgPSBmYWxzZSwgZXhwb25lbnQgPSB0cnVlO1xyXG4gICAgICBpZiAocHJlY2lzaW9uKSBwcmVjaXNpb24gPSArcHJlY2lzaW9uLnN1YnN0cmluZygxKTtcclxuICAgICAgaWYgKHpmaWxsIHx8IGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikge1xyXG4gICAgICAgIHpmaWxsID0gZmlsbCA9IFwiMFwiO1xyXG4gICAgICAgIGFsaWduID0gXCI9XCI7XHJcbiAgICAgIH1cclxuICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICBjYXNlIFwiblwiOlxyXG4gICAgICAgIGNvbW1hID0gdHJ1ZTtcclxuICAgICAgICB0eXBlID0gXCJnXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgY2FzZSBcIiVcIjpcclxuICAgICAgICBzY2FsZSA9IDEwMDtcclxuICAgICAgICBzdWZmaXggPSBcIiVcIjtcclxuICAgICAgICB0eXBlID0gXCJmXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgY2FzZSBcInBcIjpcclxuICAgICAgICBzY2FsZSA9IDEwMDtcclxuICAgICAgICBzdWZmaXggPSBcIiVcIjtcclxuICAgICAgICB0eXBlID0gXCJyXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgY2FzZSBcImJcIjpcclxuICAgICAgIGNhc2UgXCJvXCI6XHJcbiAgICAgICBjYXNlIFwieFwiOlxyXG4gICAgICAgY2FzZSBcIlhcIjpcclxuICAgICAgICBpZiAoc3ltYm9sID09PSBcIiNcIikgcHJlZml4ID0gXCIwXCIgKyB0eXBlLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICAgY2FzZSBcImNcIjpcclxuICAgICAgICBleHBvbmVudCA9IGZhbHNlO1xyXG5cclxuICAgICAgIGNhc2UgXCJkXCI6XHJcbiAgICAgICAgaW50ZWdlciA9IHRydWU7XHJcbiAgICAgICAgcHJlY2lzaW9uID0gMDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICBjYXNlIFwic1wiOlxyXG4gICAgICAgIHNjYWxlID0gLTE7XHJcbiAgICAgICAgdHlwZSA9IFwiclwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzeW1ib2wgPT09IFwiJFwiKSBwcmVmaXggPSBsb2NhbGVfY3VycmVuY3lbMF0sIHN1ZmZpeCA9IGxvY2FsZV9jdXJyZW5jeVsxXTtcclxuICAgICAgaWYgKHR5cGUgPT0gXCJyXCIgJiYgIXByZWNpc2lvbikgdHlwZSA9IFwiZ1wiO1xyXG4gICAgICBpZiAocHJlY2lzaW9uICE9IG51bGwpIHtcclxuICAgICAgICBpZiAodHlwZSA9PSBcImdcIikgcHJlY2lzaW9uID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpOyBlbHNlIGlmICh0eXBlID09IFwiZVwiIHx8IHR5cGUgPT0gXCJmXCIpIHByZWNpc2lvbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTtcclxuICAgICAgfVxyXG4gICAgICB0eXBlID0gZDNfZm9ybWF0X3R5cGVzLmdldCh0eXBlKSB8fCBkM19mb3JtYXRfdHlwZURlZmF1bHQ7XHJcbiAgICAgIHZhciB6Y29tbWEgPSB6ZmlsbCAmJiBjb21tYTtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgdmFyIGZ1bGxTdWZmaXggPSBzdWZmaXg7XHJcbiAgICAgICAgaWYgKGludGVnZXIgJiYgdmFsdWUgJSAxKSByZXR1cm4gXCJcIjtcclxuICAgICAgICB2YXIgbmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/ICh2YWx1ZSA9IC12YWx1ZSwgXCItXCIpIDogc2lnbiA9PT0gXCItXCIgPyBcIlwiIDogc2lnbjtcclxuICAgICAgICBpZiAoc2NhbGUgPCAwKSB7XHJcbiAgICAgICAgICB2YXIgdW5pdCA9IGQzLmZvcm1hdFByZWZpeCh2YWx1ZSwgcHJlY2lzaW9uKTtcclxuICAgICAgICAgIHZhbHVlID0gdW5pdC5zY2FsZSh2YWx1ZSk7XHJcbiAgICAgICAgICBmdWxsU3VmZml4ID0gdW5pdC5zeW1ib2wgKyBzdWZmaXg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhbHVlICo9IHNjYWxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWx1ZSA9IHR5cGUodmFsdWUsIHByZWNpc2lvbik7XHJcbiAgICAgICAgdmFyIGkgPSB2YWx1ZS5sYXN0SW5kZXhPZihcIi5cIiksIGJlZm9yZSwgYWZ0ZXI7XHJcbiAgICAgICAgaWYgKGkgPCAwKSB7XHJcbiAgICAgICAgICB2YXIgaiA9IGV4cG9uZW50ID8gdmFsdWUubGFzdEluZGV4T2YoXCJlXCIpIDogLTE7XHJcbiAgICAgICAgICBpZiAoaiA8IDApIGJlZm9yZSA9IHZhbHVlLCBhZnRlciA9IFwiXCI7IGVsc2UgYmVmb3JlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGopLCBhZnRlciA9IHZhbHVlLnN1YnN0cmluZyhqKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYmVmb3JlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGkpO1xyXG4gICAgICAgICAgYWZ0ZXIgPSBsb2NhbGVfZGVjaW1hbCArIHZhbHVlLnN1YnN0cmluZyhpICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghemZpbGwgJiYgY29tbWEpIGJlZm9yZSA9IGZvcm1hdEdyb3VwKGJlZm9yZSwgSW5maW5pdHkpO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBwcmVmaXgubGVuZ3RoICsgYmVmb3JlLmxlbmd0aCArIGFmdGVyLmxlbmd0aCArICh6Y29tbWEgPyAwIDogbmVnYXRpdmUubGVuZ3RoKSwgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KGxlbmd0aCA9IHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XHJcbiAgICAgICAgaWYgKHpjb21tYSkgYmVmb3JlID0gZm9ybWF0R3JvdXAocGFkZGluZyArIGJlZm9yZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIGFmdGVyLmxlbmd0aCA6IEluZmluaXR5KTtcclxuICAgICAgICBuZWdhdGl2ZSArPSBwcmVmaXg7XHJcbiAgICAgICAgdmFsdWUgPSBiZWZvcmUgKyBhZnRlcjtcclxuICAgICAgICByZXR1cm4gKGFsaWduID09PSBcIjxcIiA/IG5lZ2F0aXZlICsgdmFsdWUgKyBwYWRkaW5nIDogYWxpZ24gPT09IFwiPlwiID8gcGFkZGluZyArIG5lZ2F0aXZlICsgdmFsdWUgOiBhbGlnbiA9PT0gXCJeXCIgPyBwYWRkaW5nLnN1YnN0cmluZygwLCBsZW5ndGggPj49IDEpICsgbmVnYXRpdmUgKyB2YWx1ZSArIHBhZGRpbmcuc3Vic3RyaW5nKGxlbmd0aCkgOiBuZWdhdGl2ZSArICh6Y29tbWEgPyB2YWx1ZSA6IHBhZGRpbmcgKyB2YWx1ZSkpICsgZnVsbFN1ZmZpeDtcclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgfVxyXG4gIHZhciBkM19mb3JtYXRfcmUgPSAvKD86KFtee10pPyhbPD49Xl0pKT8oWytcXC0gXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC4tP1xcZCspPyhbYS16JV0pPy9pO1xyXG4gIHZhciBkM19mb3JtYXRfdHlwZXMgPSBkMy5tYXAoe1xyXG4gICAgYjogZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4geC50b1N0cmluZygyKTtcclxuICAgIH0sXHJcbiAgICBjOiBmdW5jdGlvbih4KSB7XHJcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpO1xyXG4gICAgfSxcclxuICAgIG86IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgcmV0dXJuIHgudG9TdHJpbmcoOCk7XHJcbiAgICB9LFxyXG4gICAgeDogZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4geC50b1N0cmluZygxNik7XHJcbiAgICB9LFxyXG4gICAgWDogZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4geC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcclxuICAgIH0sXHJcbiAgICBnOiBmdW5jdGlvbih4LCBwKSB7XHJcbiAgICAgIHJldHVybiB4LnRvUHJlY2lzaW9uKHApO1xyXG4gICAgfSxcclxuICAgIGU6IGZ1bmN0aW9uKHgsIHApIHtcclxuICAgICAgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTtcclxuICAgIH0sXHJcbiAgICBmOiBmdW5jdGlvbih4LCBwKSB7XHJcbiAgICAgIHJldHVybiB4LnRvRml4ZWQocCk7XHJcbiAgICB9LFxyXG4gICAgcjogZnVuY3Rpb24oeCwgcCkge1xyXG4gICAgICByZXR1cm4gKHggPSBkMy5yb3VuZCh4LCBkM19mb3JtYXRfcHJlY2lzaW9uKHgsIHApKSkudG9GaXhlZChNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgZDNfZm9ybWF0X3ByZWNpc2lvbih4ICogKDEgKyAxZS0xNSksIHApKSkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGZ1bmN0aW9uIGQzX2Zvcm1hdF90eXBlRGVmYXVsdCh4KSB7XHJcbiAgICByZXR1cm4geCArIFwiXCI7XHJcbiAgfVxyXG4gIHZhciBkM190aW1lID0gZDMudGltZSA9IHt9LCBkM19kYXRlID0gRGF0ZTtcclxuICBmdW5jdGlvbiBkM19kYXRlX3V0YygpIHtcclxuICAgIHRoaXMuXyA9IG5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gRGF0ZS5VVEMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGFyZ3VtZW50c1swXSk7XHJcbiAgfVxyXG4gIGQzX2RhdGVfdXRjLnByb3RvdHlwZSA9IHtcclxuICAgIGdldERhdGU6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKTtcclxuICAgIH0sXHJcbiAgICBnZXREYXk6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ0RheSgpO1xyXG4gICAgfSxcclxuICAgIGdldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgfSxcclxuICAgIGdldEhvdXJzOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpO1xyXG4gICAgfSxcclxuICAgIGdldE1pbGxpc2Vjb25kczogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XHJcbiAgICB9LFxyXG4gICAgZ2V0TWludXRlczogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpO1xyXG4gICAgfSxcclxuICAgIGdldE1vbnRoOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpO1xyXG4gICAgfSxcclxuICAgIGdldFNlY29uZHM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ1NlY29uZHMoKTtcclxuICAgIH0sXHJcbiAgICBnZXRUaW1lOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRUaW1lKCk7XHJcbiAgICB9LFxyXG4gICAgZ2V0VGltZXpvbmVPZmZzZXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0sXHJcbiAgICB2YWx1ZU9mOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuXy52YWx1ZU9mKCk7XHJcbiAgICB9LFxyXG4gICAgc2V0RGF0ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xyXG4gICAgfSxcclxuICAgIHNldERheTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XHJcbiAgICB9LFxyXG4gICAgc2V0RnVsbFllYXI6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XHJcbiAgICB9LFxyXG4gICAgc2V0SG91cnM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XHJcbiAgICB9LFxyXG4gICAgc2V0TWlsbGlzZWNvbmRzOiBmdW5jdGlvbigpIHtcclxuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcclxuICAgIH0sXHJcbiAgICBzZXRNaW51dGVzOiBmdW5jdGlvbigpIHtcclxuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XHJcbiAgICB9LFxyXG4gICAgc2V0TW9udGg6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XHJcbiAgICB9LFxyXG4gICAgc2V0U2Vjb25kczogZnVuY3Rpb24oKSB7XHJcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xyXG4gICAgfSxcclxuICAgIHNldFRpbWU6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRUaW1lLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHZhciBkM190aW1lX3Byb3RvdHlwZSA9IERhdGUucHJvdG90eXBlO1xyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfaW50ZXJ2YWwobG9jYWwsIHN0ZXAsIG51bWJlcikge1xyXG4gICAgZnVuY3Rpb24gcm91bmQoZGF0ZSkge1xyXG4gICAgICB2YXIgZDAgPSBsb2NhbChkYXRlKSwgZDEgPSBvZmZzZXQoZDAsIDEpO1xyXG4gICAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGNlaWwoZGF0ZSkge1xyXG4gICAgICBzdGVwKGRhdGUgPSBsb2NhbChuZXcgZDNfZGF0ZShkYXRlIC0gMSkpLCAxKTtcclxuICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvZmZzZXQoZGF0ZSwgaykge1xyXG4gICAgICBzdGVwKGRhdGUgPSBuZXcgZDNfZGF0ZSgrZGF0ZSksIGspO1xyXG4gICAgICByZXR1cm4gZGF0ZTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJhbmdlKHQwLCB0MSwgZHQpIHtcclxuICAgICAgdmFyIHRpbWUgPSBjZWlsKHQwKSwgdGltZXMgPSBbXTtcclxuICAgICAgaWYgKGR0ID4gMSkge1xyXG4gICAgICAgIHdoaWxlICh0aW1lIDwgdDEpIHtcclxuICAgICAgICAgIGlmICghKG51bWJlcih0aW1lKSAlIGR0KSkgdGltZXMucHVzaChuZXcgRGF0ZSgrdGltZSkpO1xyXG4gICAgICAgICAgc3RlcCh0aW1lLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgdGltZXMucHVzaChuZXcgRGF0ZSgrdGltZSkpLCBzdGVwKHRpbWUsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aW1lcztcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJhbmdlX3V0Yyh0MCwgdDEsIGR0KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZDNfZGF0ZSA9IGQzX2RhdGVfdXRjO1xyXG4gICAgICAgIHZhciB1dGMgPSBuZXcgZDNfZGF0ZV91dGMoKTtcclxuICAgICAgICB1dGMuXyA9IHQwO1xyXG4gICAgICAgIHJldHVybiByYW5nZSh1dGMsIHQxLCBkdCk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgZDNfZGF0ZSA9IERhdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxvY2FsLmZsb29yID0gbG9jYWw7XHJcbiAgICBsb2NhbC5yb3VuZCA9IHJvdW5kO1xyXG4gICAgbG9jYWwuY2VpbCA9IGNlaWw7XHJcbiAgICBsb2NhbC5vZmZzZXQgPSBvZmZzZXQ7XHJcbiAgICBsb2NhbC5yYW5nZSA9IHJhbmdlO1xyXG4gICAgdmFyIHV0YyA9IGxvY2FsLnV0YyA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKGxvY2FsKTtcclxuICAgIHV0Yy5mbG9vciA9IHV0YztcclxuICAgIHV0Yy5yb3VuZCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKHJvdW5kKTtcclxuICAgIHV0Yy5jZWlsID0gZDNfdGltZV9pbnRlcnZhbF91dGMoY2VpbCk7XHJcbiAgICB1dGMub2Zmc2V0ID0gZDNfdGltZV9pbnRlcnZhbF91dGMob2Zmc2V0KTtcclxuICAgIHV0Yy5yYW5nZSA9IHJhbmdlX3V0YztcclxuICAgIHJldHVybiBsb2NhbDtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9pbnRlcnZhbF91dGMobWV0aG9kKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgaykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGQzX2RhdGUgPSBkM19kYXRlX3V0YztcclxuICAgICAgICB2YXIgdXRjID0gbmV3IGQzX2RhdGVfdXRjKCk7XHJcbiAgICAgICAgdXRjLl8gPSBkYXRlO1xyXG4gICAgICAgIHJldHVybiBtZXRob2QodXRjLCBrKS5fO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGQzX2RhdGUgPSBEYXRlO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBkM190aW1lLnllYXIgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcclxuICAgIGRhdGUgPSBkM190aW1lLmRheShkYXRlKTtcclxuICAgIGRhdGUuc2V0TW9udGgoMCwgMSk7XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcclxuICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgb2Zmc2V0KTtcclxuICB9LCBmdW5jdGlvbihkYXRlKSB7XHJcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gIH0pO1xyXG4gIGQzX3RpbWUueWVhcnMgPSBkM190aW1lLnllYXIucmFuZ2U7XHJcbiAgZDNfdGltZS55ZWFycy51dGMgPSBkM190aW1lLnllYXIudXRjLnJhbmdlO1xyXG4gIGQzX3RpbWUuZGF5ID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XHJcbiAgICB2YXIgZGF5ID0gbmV3IGQzX2RhdGUoMmUzLCAwKTtcclxuICAgIGRheS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgcmV0dXJuIGRheTtcclxuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcclxuICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG9mZnNldCk7XHJcbiAgfSwgZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTtcclxuICB9KTtcclxuICBkM190aW1lLmRheXMgPSBkM190aW1lLmRheS5yYW5nZTtcclxuICBkM190aW1lLmRheXMudXRjID0gZDNfdGltZS5kYXkudXRjLnJhbmdlO1xyXG4gIGQzX3RpbWUuZGF5T2ZZZWFyID0gZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgdmFyIHllYXIgPSBkM190aW1lLnllYXIoZGF0ZSk7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoZGF0ZSAtIHllYXIgLSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC0geWVhci5nZXRUaW1lem9uZU9mZnNldCgpKSAqIDZlNCkgLyA4NjRlNSk7XHJcbiAgfTtcclxuICBbIFwic3VuZGF5XCIsIFwibW9uZGF5XCIsIFwidHVlc2RheVwiLCBcIndlZG5lc2RheVwiLCBcInRodXJzZGF5XCIsIFwiZnJpZGF5XCIsIFwic2F0dXJkYXlcIiBdLmZvckVhY2goZnVuY3Rpb24oZGF5LCBpKSB7XHJcbiAgICBpID0gNyAtIGk7XHJcbiAgICB2YXIgaW50ZXJ2YWwgPSBkM190aW1lW2RheV0gPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcclxuICAgICAgKGRhdGUgPSBkM190aW1lLmRheShkYXRlKSkuc2V0RGF0ZShkYXRlLmdldERhdGUoKSAtIChkYXRlLmdldERheSgpICsgaSkgJSA3KTtcclxuICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcclxuICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogNyk7XHJcbiAgICB9LCBmdW5jdGlvbihkYXRlKSB7XHJcbiAgICAgIHZhciBkYXkgPSBkM190aW1lLnllYXIoZGF0ZSkuZ2V0RGF5KCk7XHJcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKChkM190aW1lLmRheU9mWWVhcihkYXRlKSArIChkYXkgKyBpKSAlIDcpIC8gNykgLSAoZGF5ICE9PSBpKTtcclxuICAgIH0pO1xyXG4gICAgZDNfdGltZVtkYXkgKyBcInNcIl0gPSBpbnRlcnZhbC5yYW5nZTtcclxuICAgIGQzX3RpbWVbZGF5ICsgXCJzXCJdLnV0YyA9IGludGVydmFsLnV0Yy5yYW5nZTtcclxuICAgIGQzX3RpbWVbZGF5ICsgXCJPZlllYXJcIl0gPSBmdW5jdGlvbihkYXRlKSB7XHJcbiAgICAgIHZhciBkYXkgPSBkM190aW1lLnllYXIoZGF0ZSkuZ2V0RGF5KCk7XHJcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKChkM190aW1lLmRheU9mWWVhcihkYXRlKSArIChkYXkgKyBpKSAlIDcpIC8gNyk7XHJcbiAgICB9O1xyXG4gIH0pO1xyXG4gIGQzX3RpbWUud2VlayA9IGQzX3RpbWUuc3VuZGF5O1xyXG4gIGQzX3RpbWUud2Vla3MgPSBkM190aW1lLnN1bmRheS5yYW5nZTtcclxuICBkM190aW1lLndlZWtzLnV0YyA9IGQzX3RpbWUuc3VuZGF5LnV0Yy5yYW5nZTtcclxuICBkM190aW1lLndlZWtPZlllYXIgPSBkM190aW1lLnN1bmRheU9mWWVhcjtcclxuICBmdW5jdGlvbiBkM19sb2NhbGVfdGltZUZvcm1hdChsb2NhbGUpIHtcclxuICAgIHZhciBsb2NhbGVfZGF0ZVRpbWUgPSBsb2NhbGUuZGF0ZVRpbWUsIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsIGxvY2FsZV90aW1lID0gbG9jYWxlLnRpbWUsIGxvY2FsZV9wZXJpb2RzID0gbG9jYWxlLnBlcmlvZHMsIGxvY2FsZV9kYXlzID0gbG9jYWxlLmRheXMsIGxvY2FsZV9zaG9ydERheXMgPSBsb2NhbGUuc2hvcnREYXlzLCBsb2NhbGVfbW9udGhzID0gbG9jYWxlLm1vbnRocywgbG9jYWxlX3Nob3J0TW9udGhzID0gbG9jYWxlLnNob3J0TW9udGhzO1xyXG4gICAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXQodGVtcGxhdGUpIHtcclxuICAgICAgdmFyIG4gPSB0ZW1wbGF0ZS5sZW5ndGg7XHJcbiAgICAgIGZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7XHJcbiAgICAgICAgdmFyIHN0cmluZyA9IFtdLCBpID0gLTEsIGogPSAwLCBjLCBwLCBmO1xyXG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgICAgICBpZiAodGVtcGxhdGUuY2hhckNvZGVBdChpKSA9PT0gMzcpIHtcclxuICAgICAgICAgICAgc3RyaW5nLnB1c2godGVtcGxhdGUuc2xpY2UoaiwgaSkpO1xyXG4gICAgICAgICAgICBpZiAoKHAgPSBkM190aW1lX2Zvcm1hdFBhZHNbYyA9IHRlbXBsYXRlLmNoYXJBdCgrK2kpXSkgIT0gbnVsbCkgYyA9IHRlbXBsYXRlLmNoYXJBdCgrK2kpO1xyXG4gICAgICAgICAgICBpZiAoZiA9IGQzX3RpbWVfZm9ybWF0c1tjXSkgYyA9IGYoZGF0ZSwgcCA9PSBudWxsID8gYyA9PT0gXCJlXCIgPyBcIiBcIiA6IFwiMFwiIDogcCk7XHJcbiAgICAgICAgICAgIHN0cmluZy5wdXNoKGMpO1xyXG4gICAgICAgICAgICBqID0gaSArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0cmluZy5wdXNoKHRlbXBsYXRlLnNsaWNlKGosIGkpKTtcclxuICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oXCJcIik7XHJcbiAgICAgIH1cclxuICAgICAgZm9ybWF0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGQgPSB7XHJcbiAgICAgICAgICB5OiAxOTAwLFxyXG4gICAgICAgICAgbTogMCxcclxuICAgICAgICAgIGQ6IDEsXHJcbiAgICAgICAgICBIOiAwLFxyXG4gICAgICAgICAgTTogMCxcclxuICAgICAgICAgIFM6IDAsXHJcbiAgICAgICAgICBMOiAwLFxyXG4gICAgICAgICAgWjogbnVsbFxyXG4gICAgICAgIH0sIGkgPSBkM190aW1lX3BhcnNlKGQsIHRlbXBsYXRlLCBzdHJpbmcsIDApO1xyXG4gICAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmIChcInBcIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyO1xyXG4gICAgICAgIHZhciBsb2NhbFogPSBkLlogIT0gbnVsbCAmJiBkM19kYXRlICE9PSBkM19kYXRlX3V0YywgZGF0ZSA9IG5ldyAobG9jYWxaID8gZDNfZGF0ZV91dGMgOiBkM19kYXRlKSgpO1xyXG4gICAgICAgIGlmIChcImpcIiBpbiBkKSBkYXRlLnNldEZ1bGxZZWFyKGQueSwgMCwgZC5qKTsgZWxzZSBpZiAoXCJXXCIgaW4gZCB8fCBcIlVcIiBpbiBkKSB7XHJcbiAgICAgICAgICBpZiAoIShcIndcIiBpbiBkKSkgZC53ID0gXCJXXCIgaW4gZCA/IDEgOiAwO1xyXG4gICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkLnksIDAsIDEpO1xyXG4gICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkLnksIDAsIFwiV1wiIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXRlLmdldERheSgpICsgNSkgJSA3IDogZC53ICsgZC5VICogNyAtIChkYXRlLmdldERheSgpICsgNikgJSA3KTtcclxuICAgICAgICB9IGVsc2UgZGF0ZS5zZXRGdWxsWWVhcihkLnksIGQubSwgZC5kKTtcclxuICAgICAgICBkYXRlLnNldEhvdXJzKGQuSCArIChkLlogLyAxMDAgfCAwKSwgZC5NICsgZC5aICUgMTAwLCBkLlMsIGQuTCk7XHJcbiAgICAgICAgcmV0dXJuIGxvY2FsWiA/IGRhdGUuXyA6IGRhdGU7XHJcbiAgICAgIH07XHJcbiAgICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIGZvcm1hdDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2UoZGF0ZSwgdGVtcGxhdGUsIHN0cmluZywgaikge1xyXG4gICAgICB2YXIgYywgcCwgdCwgaSA9IDAsIG4gPSB0ZW1wbGF0ZS5sZW5ndGgsIG0gPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgICB3aGlsZSAoaSA8IG4pIHtcclxuICAgICAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7XHJcbiAgICAgICAgYyA9IHRlbXBsYXRlLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICBpZiAoYyA9PT0gMzcpIHtcclxuICAgICAgICAgIHQgPSB0ZW1wbGF0ZS5jaGFyQXQoaSsrKTtcclxuICAgICAgICAgIHAgPSBkM190aW1lX3BhcnNlcnNbdCBpbiBkM190aW1lX2Zvcm1hdFBhZHMgPyB0ZW1wbGF0ZS5jaGFyQXQoaSsrKSA6IHRdO1xyXG4gICAgICAgICAgaWYgKCFwIHx8IChqID0gcChkYXRlLCBzdHJpbmcsIGopKSA8IDApIHJldHVybiAtMTtcclxuICAgICAgICB9IGVsc2UgaWYgKGMgIT0gc3RyaW5nLmNoYXJDb2RlQXQoaisrKSkge1xyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gajtcclxuICAgIH1cclxuICAgIGQzX3RpbWVfZm9ybWF0LnV0YyA9IGZ1bmN0aW9uKHRlbXBsYXRlKSB7XHJcbiAgICAgIHZhciBsb2NhbCA9IGQzX3RpbWVfZm9ybWF0KHRlbXBsYXRlKTtcclxuICAgICAgZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgZDNfZGF0ZSA9IGQzX2RhdGVfdXRjO1xyXG4gICAgICAgICAgdmFyIHV0YyA9IG5ldyBkM19kYXRlKCk7XHJcbiAgICAgICAgICB1dGMuXyA9IGRhdGU7XHJcbiAgICAgICAgICByZXR1cm4gbG9jYWwodXRjKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgZDNfZGF0ZSA9IERhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBkM19kYXRlID0gZDNfZGF0ZV91dGM7XHJcbiAgICAgICAgICB2YXIgZGF0ZSA9IGxvY2FsLnBhcnNlKHN0cmluZyk7XHJcbiAgICAgICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlLl87XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIGQzX2RhdGUgPSBEYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZm9ybWF0LnRvU3RyaW5nID0gbG9jYWwudG9TdHJpbmc7XHJcbiAgICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgICB9O1xyXG4gICAgZDNfdGltZV9mb3JtYXQubXVsdGkgPSBkM190aW1lX2Zvcm1hdC51dGMubXVsdGkgPSBkM190aW1lX2Zvcm1hdE11bHRpO1xyXG4gICAgdmFyIGQzX3RpbWVfcGVyaW9kTG9va3VwID0gZDMubWFwKCksIGQzX3RpbWVfZGF5UmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9kYXlzKSwgZDNfdGltZV9kYXlMb29rdXAgPSBkM190aW1lX2Zvcm1hdExvb2t1cChsb2NhbGVfZGF5cyksIGQzX3RpbWVfZGF5QWJicmV2UmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9zaG9ydERheXMpLCBkM190aW1lX2RheUFiYnJldkxvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydERheXMpLCBkM190aW1lX21vbnRoUmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9tb250aHMpLCBkM190aW1lX21vbnRoTG9va3VwID0gZDNfdGltZV9mb3JtYXRMb29rdXAobG9jYWxlX21vbnRocyksIGQzX3RpbWVfbW9udGhBYmJyZXZSZSA9IGQzX3RpbWVfZm9ybWF0UmUobG9jYWxlX3Nob3J0TW9udGhzKSwgZDNfdGltZV9tb250aEFiYnJldkxvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7XHJcbiAgICBsb2NhbGVfcGVyaW9kcy5mb3JFYWNoKGZ1bmN0aW9uKHAsIGkpIHtcclxuICAgICAgZDNfdGltZV9wZXJpb2RMb29rdXAuc2V0KHAudG9Mb3dlckNhc2UoKSwgaSk7XHJcbiAgICB9KTtcclxuICAgIHZhciBkM190aW1lX2Zvcm1hdHMgPSB7XHJcbiAgICAgIGE6IGZ1bmN0aW9uKGQpIHtcclxuICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0RGF5c1tkLmdldERheSgpXTtcclxuICAgICAgfSxcclxuICAgICAgQTogZnVuY3Rpb24oZCkge1xyXG4gICAgICAgIHJldHVybiBsb2NhbGVfZGF5c1tkLmdldERheSgpXTtcclxuICAgICAgfSxcclxuICAgICAgYjogZnVuY3Rpb24oZCkge1xyXG4gICAgICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRNb250aCgpXTtcclxuICAgICAgfSxcclxuICAgICAgQjogZnVuY3Rpb24oZCkge1xyXG4gICAgICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07XHJcbiAgICAgIH0sXHJcbiAgICAgIGM6IGQzX3RpbWVfZm9ybWF0KGxvY2FsZV9kYXRlVGltZSksXHJcbiAgICAgIGQ6IGZ1bmN0aW9uKGQsIHApIHtcclxuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXREYXRlKCksIHAsIDIpO1xyXG4gICAgICB9LFxyXG4gICAgICBlOiBmdW5jdGlvbihkLCBwKSB7XHJcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0RGF0ZSgpLCBwLCAyKTtcclxuICAgICAgfSxcclxuICAgICAgSDogZnVuY3Rpb24oZCwgcCkge1xyXG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldEhvdXJzKCksIHAsIDIpO1xyXG4gICAgICB9LFxyXG4gICAgICBJOiBmdW5jdGlvbihkLCBwKSB7XHJcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTtcclxuICAgICAgfSxcclxuICAgICAgajogZnVuY3Rpb24oZCwgcCkge1xyXG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZCgxICsgZDNfdGltZS5kYXlPZlllYXIoZCksIHAsIDMpO1xyXG4gICAgICB9LFxyXG4gICAgICBMOiBmdW5jdGlvbihkLCBwKSB7XHJcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpO1xyXG4gICAgICB9LFxyXG4gICAgICBtOiBmdW5jdGlvbihkLCBwKSB7XHJcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpO1xyXG4gICAgICB9LFxyXG4gICAgICBNOiBmdW5jdGlvbihkLCBwKSB7XHJcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0TWludXRlcygpLCBwLCAyKTtcclxuICAgICAgfSxcclxuICAgICAgcDogZnVuY3Rpb24oZCkge1xyXG4gICAgICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0SG91cnMoKSA+PSAxMildO1xyXG4gICAgICB9LFxyXG4gICAgICBTOiBmdW5jdGlvbihkLCBwKSB7XHJcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0U2Vjb25kcygpLCBwLCAyKTtcclxuICAgICAgfSxcclxuICAgICAgVTogZnVuY3Rpb24oZCwgcCkge1xyXG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkM190aW1lLnN1bmRheU9mWWVhcihkKSwgcCwgMik7XHJcbiAgICAgIH0sXHJcbiAgICAgIHc6IGZ1bmN0aW9uKGQpIHtcclxuICAgICAgICByZXR1cm4gZC5nZXREYXkoKTtcclxuICAgICAgfSxcclxuICAgICAgVzogZnVuY3Rpb24oZCwgcCkge1xyXG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkM190aW1lLm1vbmRheU9mWWVhcihkKSwgcCwgMik7XHJcbiAgICAgIH0sXHJcbiAgICAgIHg6IGQzX3RpbWVfZm9ybWF0KGxvY2FsZV9kYXRlKSxcclxuICAgICAgWDogZDNfdGltZV9mb3JtYXQobG9jYWxlX3RpbWUpLFxyXG4gICAgICB5OiBmdW5jdGlvbihkLCBwKSB7XHJcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCwgcCwgMik7XHJcbiAgICAgIH0sXHJcbiAgICAgIFk6IGZ1bmN0aW9uKGQsIHApIHtcclxuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRGdWxsWWVhcigpICUgMWU0LCBwLCA0KTtcclxuICAgICAgfSxcclxuICAgICAgWjogZDNfdGltZV96b25lLFxyXG4gICAgICBcIiVcIjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiJVwiO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdmFyIGQzX3RpbWVfcGFyc2VycyA9IHtcclxuICAgICAgYTogZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYsXHJcbiAgICAgIEE6IGQzX3RpbWVfcGFyc2VXZWVrZGF5LFxyXG4gICAgICBiOiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYsXHJcbiAgICAgIEI6IGQzX3RpbWVfcGFyc2VNb250aCxcclxuICAgICAgYzogZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwsXHJcbiAgICAgIGQ6IGQzX3RpbWVfcGFyc2VEYXksXHJcbiAgICAgIGU6IGQzX3RpbWVfcGFyc2VEYXksXHJcbiAgICAgIEg6IGQzX3RpbWVfcGFyc2VIb3VyMjQsXHJcbiAgICAgIEk6IGQzX3RpbWVfcGFyc2VIb3VyMjQsXHJcbiAgICAgIGo6IGQzX3RpbWVfcGFyc2VEYXlPZlllYXIsXHJcbiAgICAgIEw6IGQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMsXHJcbiAgICAgIG06IGQzX3RpbWVfcGFyc2VNb250aE51bWJlcixcclxuICAgICAgTTogZDNfdGltZV9wYXJzZU1pbnV0ZXMsXHJcbiAgICAgIHA6IGQzX3RpbWVfcGFyc2VBbVBtLFxyXG4gICAgICBTOiBkM190aW1lX3BhcnNlU2Vjb25kcyxcclxuICAgICAgVTogZDNfdGltZV9wYXJzZVdlZWtOdW1iZXJTdW5kYXksXHJcbiAgICAgIHc6IGQzX3RpbWVfcGFyc2VXZWVrZGF5TnVtYmVyLFxyXG4gICAgICBXOiBkM190aW1lX3BhcnNlV2Vla051bWJlck1vbmRheSxcclxuICAgICAgeDogZDNfdGltZV9wYXJzZUxvY2FsZURhdGUsXHJcbiAgICAgIFg6IGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lLFxyXG4gICAgICB5OiBkM190aW1lX3BhcnNlWWVhcixcclxuICAgICAgWTogZDNfdGltZV9wYXJzZUZ1bGxZZWFyLFxyXG4gICAgICBaOiBkM190aW1lX3BhcnNlWm9uZSxcclxuICAgICAgXCIlXCI6IGQzX3RpbWVfcGFyc2VMaXRlcmFsUGVyY2VudFxyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2KGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgICBkM190aW1lX2RheUFiYnJldlJlLmxhc3RJbmRleCA9IDA7XHJcbiAgICAgIHZhciBuID0gZDNfdGltZV9kYXlBYmJyZXZSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XHJcbiAgICAgIHJldHVybiBuID8gKGRhdGUudyA9IGQzX3RpbWVfZGF5QWJicmV2TG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlV2Vla2RheShkYXRlLCBzdHJpbmcsIGkpIHtcclxuICAgICAgZDNfdGltZV9kYXlSZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgICB2YXIgbiA9IGQzX3RpbWVfZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xyXG4gICAgICByZXR1cm4gbiA/IChkYXRlLncgPSBkM190aW1lX2RheUxvb2t1cC5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1vbnRoQWJicmV2KGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgICBkM190aW1lX21vbnRoQWJicmV2UmUubGFzdEluZGV4ID0gMDtcclxuICAgICAgdmFyIG4gPSBkM190aW1lX21vbnRoQWJicmV2UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xyXG4gICAgICByZXR1cm4gbiA/IChkYXRlLm0gPSBkM190aW1lX21vbnRoQWJicmV2TG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGgoZGF0ZSwgc3RyaW5nLCBpKSB7XHJcbiAgICAgIGQzX3RpbWVfbW9udGhSZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgICB2YXIgbiA9IGQzX3RpbWVfbW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XHJcbiAgICAgIHJldHVybiBuID8gKGRhdGUubSA9IGQzX3RpbWVfbW9udGhMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVGdWxsKGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMuYy50b1N0cmluZygpLCBzdHJpbmcsIGkpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZURhdGUoZGF0ZSwgc3RyaW5nLCBpKSB7XHJcbiAgICAgIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy54LnRvU3RyaW5nKCksIHN0cmluZywgaSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlVGltZShkYXRlLCBzdHJpbmcsIGkpIHtcclxuICAgICAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLlgudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VBbVBtKGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgICB2YXIgbiA9IGQzX3RpbWVfcGVyaW9kTG9va3VwLmdldChzdHJpbmcuc2xpY2UoaSwgaSArPSAyKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgcmV0dXJuIG4gPT0gbnVsbCA/IC0xIDogKGRhdGUucCA9IG4sIGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0O1xyXG4gIH1cclxuICB2YXIgZDNfdGltZV9mb3JtYXRQYWRzID0ge1xyXG4gICAgXCItXCI6IFwiXCIsXHJcbiAgICBfOiBcIiBcIixcclxuICAgIFwiMFwiOiBcIjBcIlxyXG4gIH0sIGQzX3RpbWVfbnVtYmVyUmUgPSAvXlxccypcXGQrLywgZDNfdGltZV9wZXJjZW50UmUgPSAvXiUvO1xyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0UGFkKHZhbHVlLCBmaWxsLCB3aWR0aCkge1xyXG4gICAgdmFyIHNpZ24gPSB2YWx1ZSA8IDAgPyBcIi1cIiA6IFwiXCIsIHN0cmluZyA9IChzaWduID8gLXZhbHVlIDogdmFsdWUpICsgXCJcIiwgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcclxuICAgIHJldHVybiBzaWduICsgKGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHN0cmluZyA6IHN0cmluZyk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0UmUobmFtZXMpIHtcclxuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXig/OlwiICsgbmFtZXMubWFwKGQzLnJlcXVvdGUpLmpvaW4oXCJ8XCIpICsgXCIpXCIsIFwiaVwiKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRMb29rdXAobmFtZXMpIHtcclxuICAgIHZhciBtYXAgPSBuZXcgZDNfTWFwKCksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcclxuICAgIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KG5hbWVzW2ldLnRvTG93ZXJDYXNlKCksIGkpO1xyXG4gICAgcmV0dXJuIG1hcDtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVdlZWtkYXlOdW1iZXIoZGF0ZSwgc3RyaW5nLCBpKSB7XHJcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XHJcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcclxuICAgIHJldHVybiBuID8gKGRhdGUudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyU3VuZGF5KGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcclxuICAgIHJldHVybiBuID8gKGRhdGUuVSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyTW9uZGF5KGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcclxuICAgIHJldHVybiBuID8gKGRhdGUuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VGdWxsWWVhcihkYXRlLCBzdHJpbmcsIGkpIHtcclxuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcclxuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgNCkpO1xyXG4gICAgcmV0dXJuIG4gPyAoZGF0ZS55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7XHJcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XHJcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcclxuICAgIHJldHVybiBuID8gKGRhdGUueSA9IGQzX3RpbWVfZXhwYW5kWWVhcigrblswXSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVpvbmUoZGF0ZSwgc3RyaW5nLCBpKSB7XHJcbiAgICByZXR1cm4gL15bKy1dXFxkezR9JC8udGVzdChzdHJpbmcgPSBzdHJpbmcuc2xpY2UoaSwgaSArIDUpKSA/IChkYXRlLlogPSAtc3RyaW5nLCBcclxuICAgIGkgKyA1KSA6IC0xO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190aW1lX2V4cGFuZFllYXIoZCkge1xyXG4gICAgcmV0dXJuIGQgKyAoZCA+IDY4ID8gMTkwMCA6IDJlMyk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aE51bWJlcihkYXRlLCBzdHJpbmcsIGkpIHtcclxuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcclxuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xyXG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5tID0gblswXSAtIDEsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZURheShkYXRlLCBzdHJpbmcsIGkpIHtcclxuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcclxuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xyXG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZURheU9mWWVhcihkYXRlLCBzdHJpbmcsIGkpIHtcclxuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcclxuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpO1xyXG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5qID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUhvdXIyNChkYXRlLCBzdHJpbmcsIGkpIHtcclxuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcclxuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xyXG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5IID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1pbnV0ZXMoZGF0ZSwgc3RyaW5nLCBpKSB7XHJcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XHJcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcclxuICAgIHJldHVybiBuID8gKGRhdGUuTSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VTZWNvbmRzKGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XHJcbiAgICByZXR1cm4gbiA/IChkYXRlLlMgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTWlsbGlzZWNvbmRzKGRhdGUsIHN0cmluZywgaSkge1xyXG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7XHJcbiAgICByZXR1cm4gbiA/IChkYXRlLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190aW1lX3pvbmUoZCkge1xyXG4gICAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCksIHpzID0geiA+IDAgPyBcIi1cIiA6IFwiK1wiLCB6aCA9IGFicyh6KSAvIDYwIHwgMCwgem0gPSBhYnMoeikgJSA2MDtcclxuICAgIHJldHVybiB6cyArIGQzX3RpbWVfZm9ybWF0UGFkKHpoLCBcIjBcIiwgMikgKyBkM190aW1lX2Zvcm1hdFBhZCh6bSwgXCIwXCIsIDIpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTGl0ZXJhbFBlcmNlbnQoZGF0ZSwgc3RyaW5nLCBpKSB7XHJcbiAgICBkM190aW1lX3BlcmNlbnRSZS5sYXN0SW5kZXggPSAwO1xyXG4gICAgdmFyIG4gPSBkM190aW1lX3BlcmNlbnRSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpO1xyXG4gICAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRNdWx0aShmb3JtYXRzKSB7XHJcbiAgICB2YXIgbiA9IGZvcm1hdHMubGVuZ3RoLCBpID0gLTE7XHJcbiAgICB3aGlsZSAoKytpIDwgbikgZm9ybWF0c1tpXVswXSA9IHRoaXMoZm9ybWF0c1tpXVswXSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgICB2YXIgaSA9IDAsIGYgPSBmb3JtYXRzW2ldO1xyXG4gICAgICB3aGlsZSAoIWZbMV0oZGF0ZSkpIGYgPSBmb3JtYXRzWysraV07XHJcbiAgICAgIHJldHVybiBmWzBdKGRhdGUpO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZDMubG9jYWxlID0gZnVuY3Rpb24obG9jYWxlKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBudW1iZXJGb3JtYXQ6IGQzX2xvY2FsZV9udW1iZXJGb3JtYXQobG9jYWxlKSxcclxuICAgICAgdGltZUZvcm1hdDogZDNfbG9jYWxlX3RpbWVGb3JtYXQobG9jYWxlKVxyXG4gICAgfTtcclxuICB9O1xyXG4gIHZhciBkM19sb2NhbGVfZW5VUyA9IGQzLmxvY2FsZSh7XHJcbiAgICBkZWNpbWFsOiBcIi5cIixcclxuICAgIHRob3VzYW5kczogXCIsXCIsXHJcbiAgICBncm91cGluZzogWyAzIF0sXHJcbiAgICBjdXJyZW5jeTogWyBcIiRcIiwgXCJcIiBdLFxyXG4gICAgZGF0ZVRpbWU6IFwiJWEgJWIgJWUgJVggJVlcIixcclxuICAgIGRhdGU6IFwiJW0vJWQvJVlcIixcclxuICAgIHRpbWU6IFwiJUg6JU06JVNcIixcclxuICAgIHBlcmlvZHM6IFsgXCJBTVwiLCBcIlBNXCIgXSxcclxuICAgIGRheXM6IFsgXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiIF0sXHJcbiAgICBzaG9ydERheXM6IFsgXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIiBdLFxyXG4gICAgbW9udGhzOiBbIFwiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIiwgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGVjZW1iZXJcIiBdLFxyXG4gICAgc2hvcnRNb250aHM6IFsgXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIiBdXHJcbiAgfSk7XHJcbiAgZDMuZm9ybWF0ID0gZDNfbG9jYWxlX2VuVVMubnVtYmVyRm9ybWF0O1xyXG4gIGQzLmdlbyA9IHt9O1xyXG4gIGZ1bmN0aW9uIGQzX2FkZGVyKCkge31cclxuICBkM19hZGRlci5wcm90b3R5cGUgPSB7XHJcbiAgICBzOiAwLFxyXG4gICAgdDogMCxcclxuICAgIGFkZDogZnVuY3Rpb24oeSkge1xyXG4gICAgICBkM19hZGRlclN1bSh5LCB0aGlzLnQsIGQzX2FkZGVyVGVtcCk7XHJcbiAgICAgIGQzX2FkZGVyU3VtKGQzX2FkZGVyVGVtcC5zLCB0aGlzLnMsIHRoaXMpO1xyXG4gICAgICBpZiAodGhpcy5zKSB0aGlzLnQgKz0gZDNfYWRkZXJUZW1wLnQ7IGVsc2UgdGhpcy5zID0gZDNfYWRkZXJUZW1wLnQ7XHJcbiAgICB9LFxyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB0aGlzLnMgPSB0aGlzLnQgPSAwO1xyXG4gICAgfSxcclxuICAgIHZhbHVlT2Y6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgdmFyIGQzX2FkZGVyVGVtcCA9IG5ldyBkM19hZGRlcigpO1xyXG4gIGZ1bmN0aW9uIGQzX2FkZGVyU3VtKGEsIGIsIG8pIHtcclxuICAgIHZhciB4ID0gby5zID0gYSArIGIsIGJ2ID0geCAtIGEsIGF2ID0geCAtIGJ2O1xyXG4gICAgby50ID0gYSAtIGF2ICsgKGIgLSBidik7XHJcbiAgfVxyXG4gIGQzLmdlby5zdHJlYW0gPSBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XHJcbiAgICBpZiAob2JqZWN0ICYmIGQzX2dlb19zdHJlYW1PYmplY3RUeXBlLmhhc093blByb3BlcnR5KG9iamVjdC50eXBlKSkge1xyXG4gICAgICBkM19nZW9fc3RyZWFtT2JqZWN0VHlwZVtvYmplY3QudHlwZV0ob2JqZWN0LCBsaXN0ZW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkM19nZW9fc3RyZWFtR2VvbWV0cnkob2JqZWN0LCBsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cnksIGxpc3RlbmVyKSB7XHJcbiAgICBpZiAoZ2VvbWV0cnkgJiYgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5VHlwZS5oYXNPd25Qcm9wZXJ0eShnZW9tZXRyeS50eXBlKSkge1xyXG4gICAgICBkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlW2dlb21ldHJ5LnR5cGVdKGdlb21ldHJ5LCBsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHZhciBkM19nZW9fc3RyZWFtT2JqZWN0VHlwZSA9IHtcclxuICAgIEZlYXR1cmU6IGZ1bmN0aW9uKGZlYXR1cmUsIGxpc3RlbmVyKSB7XHJcbiAgICAgIGQzX2dlb19zdHJlYW1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBsaXN0ZW5lcik7XHJcbiAgICB9LFxyXG4gICAgRmVhdHVyZUNvbGxlY3Rpb246IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHtcclxuICAgICAgdmFyIGZlYXR1cmVzID0gb2JqZWN0LmZlYXR1cmVzLCBpID0gLTEsIG4gPSBmZWF0dXJlcy5sZW5ndGg7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtR2VvbWV0cnkoZmVhdHVyZXNbaV0uZ2VvbWV0cnksIGxpc3RlbmVyKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHZhciBkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlID0ge1xyXG4gICAgU3BoZXJlOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XHJcbiAgICAgIGxpc3RlbmVyLnNwaGVyZSgpO1xyXG4gICAgfSxcclxuICAgIFBvaW50OiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XHJcbiAgICAgIG9iamVjdCA9IG9iamVjdC5jb29yZGluYXRlcztcclxuICAgICAgbGlzdGVuZXIucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7XHJcbiAgICB9LFxyXG4gICAgTXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xyXG4gICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIG9iamVjdCA9IGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lci5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTtcclxuICAgIH0sXHJcbiAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XHJcbiAgICAgIGQzX2dlb19zdHJlYW1MaW5lKG9iamVjdC5jb29yZGluYXRlcywgbGlzdGVuZXIsIDApO1xyXG4gICAgfSxcclxuICAgIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xyXG4gICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lciwgMCk7XHJcbiAgICB9LFxyXG4gICAgUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xyXG4gICAgICBkM19nZW9fc3RyZWFtUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIGxpc3RlbmVyKTtcclxuICAgIH0sXHJcbiAgICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHtcclxuICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtUG9seWdvbihjb29yZGluYXRlc1tpXSwgbGlzdGVuZXIpO1xyXG4gICAgfSxcclxuICAgIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xyXG4gICAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1HZW9tZXRyeShnZW9tZXRyaWVzW2ldLCBsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fc3RyZWFtTGluZShjb29yZGluYXRlcywgbGlzdGVuZXIsIGNsb3NlZCkge1xyXG4gICAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCAtIGNsb3NlZCwgY29vcmRpbmF0ZTtcclxuICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xyXG4gICAgd2hpbGUgKCsraSA8IG4pIGNvb3JkaW5hdGUgPSBjb29yZGluYXRlc1tpXSwgbGlzdGVuZXIucG9pbnQoY29vcmRpbmF0ZVswXSwgY29vcmRpbmF0ZVsxXSwgY29vcmRpbmF0ZVsyXSk7XHJcbiAgICBsaXN0ZW5lci5saW5lRW5kKCk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19zdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzLCBsaXN0ZW5lcikge1xyXG4gICAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcclxuICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpO1xyXG4gICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lciwgMSk7XHJcbiAgICBsaXN0ZW5lci5wb2x5Z29uRW5kKCk7XHJcbiAgfVxyXG4gIGQzLmdlby5hcmVhID0gZnVuY3Rpb24ob2JqZWN0KSB7XHJcbiAgICBkM19nZW9fYXJlYVN1bSA9IDA7XHJcbiAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgZDNfZ2VvX2FyZWEpO1xyXG4gICAgcmV0dXJuIGQzX2dlb19hcmVhU3VtO1xyXG4gIH07XHJcbiAgdmFyIGQzX2dlb19hcmVhU3VtLCBkM19nZW9fYXJlYVJpbmdTdW0gPSBuZXcgZDNfYWRkZXIoKTtcclxuICB2YXIgZDNfZ2VvX2FyZWEgPSB7XHJcbiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM19nZW9fYXJlYVN1bSArPSA0ICogz4A7XHJcbiAgICB9LFxyXG4gICAgcG9pbnQ6IGQzX25vb3AsXHJcbiAgICBsaW5lU3RhcnQ6IGQzX25vb3AsXHJcbiAgICBsaW5lRW5kOiBkM19ub29wLFxyXG4gICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgZDNfZ2VvX2FyZWFSaW5nU3VtLnJlc2V0KCk7XHJcbiAgICAgIGQzX2dlb19hcmVhLmxpbmVTdGFydCA9IGQzX2dlb19hcmVhUmluZ1N0YXJ0O1xyXG4gICAgfSxcclxuICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgYXJlYSA9IDIgKiBkM19nZW9fYXJlYVJpbmdTdW07XHJcbiAgICAgIGQzX2dlb19hcmVhU3VtICs9IGFyZWEgPCAwID8gNCAqIM+AICsgYXJlYSA6IGFyZWE7XHJcbiAgICAgIGQzX2dlb19hcmVhLmxpbmVTdGFydCA9IGQzX2dlb19hcmVhLmxpbmVFbmQgPSBkM19nZW9fYXJlYS5wb2ludCA9IGQzX25vb3A7XHJcbiAgICB9XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fYXJlYVJpbmdTdGFydCgpIHtcclxuICAgIHZhciDOuzAwLCDPhjAwLCDOuzAsIGNvc8+GMCwgc2luz4YwO1xyXG4gICAgZDNfZ2VvX2FyZWEucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHtcclxuICAgICAgZDNfZ2VvX2FyZWEucG9pbnQgPSBuZXh0UG9pbnQ7XHJcbiAgICAgIM67MCA9ICjOuzAwID0gzrspICogZDNfcmFkaWFucywgY29zz4YwID0gTWF0aC5jb3Moz4YgPSAoz4YwMCA9IM+GKSAqIGQzX3JhZGlhbnMgLyAyICsgz4AgLyA0KSwgXHJcbiAgICAgIHNpbs+GMCA9IE1hdGguc2luKM+GKTtcclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQozrssIM+GKSB7XHJcbiAgICAgIM67ICo9IGQzX3JhZGlhbnM7XHJcbiAgICAgIM+GID0gz4YgKiBkM19yYWRpYW5zIC8gMiArIM+AIC8gNDtcclxuICAgICAgdmFyIGTOuyA9IM67IC0gzrswLCBzZM67ID0gZM67ID49IDAgPyAxIDogLTEsIGFkzrsgPSBzZM67ICogZM67LCBjb3PPhiA9IE1hdGguY29zKM+GKSwgc2luz4YgPSBNYXRoLnNpbijPhiksIGsgPSBzaW7PhjAgKiBzaW7PhiwgdSA9IGNvc8+GMCAqIGNvc8+GICsgayAqIE1hdGguY29zKGFkzrspLCB2ID0gayAqIHNkzrsgKiBNYXRoLnNpbihhZM67KTtcclxuICAgICAgZDNfZ2VvX2FyZWFSaW5nU3VtLmFkZChNYXRoLmF0YW4yKHYsIHUpKTtcclxuICAgICAgzrswID0gzrssIGNvc8+GMCA9IGNvc8+GLCBzaW7PhjAgPSBzaW7PhjtcclxuICAgIH1cclxuICAgIGQzX2dlb19hcmVhLmxpbmVFbmQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgbmV4dFBvaW50KM67MDAsIM+GMDApO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbihzcGhlcmljYWwpIHtcclxuICAgIHZhciDOuyA9IHNwaGVyaWNhbFswXSwgz4YgPSBzcGhlcmljYWxbMV0sIGNvc8+GID0gTWF0aC5jb3Moz4YpO1xyXG4gICAgcmV0dXJuIFsgY29zz4YgKiBNYXRoLmNvcyjOuyksIGNvc8+GICogTWF0aC5zaW4ozrspLCBNYXRoLnNpbijPhikgXTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbkRvdChhLCBiKSB7XHJcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuQ3Jvc3MoYSwgYikge1xyXG4gICAgcmV0dXJuIFsgYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsyXSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXSBdO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuQWRkKGEsIGIpIHtcclxuICAgIGFbMF0gKz0gYlswXTtcclxuICAgIGFbMV0gKz0gYlsxXTtcclxuICAgIGFbMl0gKz0gYlsyXTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHZlY3Rvciwgaykge1xyXG4gICAgcmV0dXJuIFsgdmVjdG9yWzBdICogaywgdmVjdG9yWzFdICogaywgdmVjdG9yWzJdICogayBdO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGQpIHtcclxuICAgIHZhciBsID0gTWF0aC5zcXJ0KGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV0gKyBkWzJdICogZFsyXSk7XHJcbiAgICBkWzBdIC89IGw7XHJcbiAgICBkWzFdIC89IGw7XHJcbiAgICBkWzJdIC89IGw7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19zcGhlcmljYWwoY2FydGVzaWFuKSB7XHJcbiAgICByZXR1cm4gWyBNYXRoLmF0YW4yKGNhcnRlc2lhblsxXSwgY2FydGVzaWFuWzBdKSwgZDNfYXNpbihjYXJ0ZXNpYW5bMl0pIF07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19zcGhlcmljYWxFcXVhbChhLCBiKSB7XHJcbiAgICByZXR1cm4gYWJzKGFbMF0gLSBiWzBdKSA8IM61ICYmIGFicyhhWzFdIC0gYlsxXSkgPCDOtTtcclxuICB9XHJcbiAgZDMuZ2VvLmJvdW5kcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIM67MCwgz4YwLCDOuzEsIM+GMSwgzrtfLCDOu19fLCDPhl9fLCBwMCwgZM67U3VtLCByYW5nZXMsIHJhbmdlO1xyXG4gICAgdmFyIGJvdW5kID0ge1xyXG4gICAgICBwb2ludDogcG9pbnQsXHJcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxyXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxyXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGJvdW5kLnBvaW50ID0gcmluZ1BvaW50O1xyXG4gICAgICAgIGJvdW5kLmxpbmVTdGFydCA9IHJpbmdTdGFydDtcclxuICAgICAgICBib3VuZC5saW5lRW5kID0gcmluZ0VuZDtcclxuICAgICAgICBkzrtTdW0gPSAwO1xyXG4gICAgICAgIGQzX2dlb19hcmVhLnBvbHlnb25TdGFydCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBkM19nZW9fYXJlYS5wb2x5Z29uRW5kKCk7XHJcbiAgICAgICAgYm91bmQucG9pbnQgPSBwb2ludDtcclxuICAgICAgICBib3VuZC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XHJcbiAgICAgICAgYm91bmQubGluZUVuZCA9IGxpbmVFbmQ7XHJcbiAgICAgICAgaWYgKGQzX2dlb19hcmVhUmluZ1N1bSA8IDApIM67MCA9IC0ozrsxID0gMTgwKSwgz4YwID0gLSjPhjEgPSA5MCk7IGVsc2UgaWYgKGTOu1N1bSA+IM61KSDPhjEgPSA5MDsgZWxzZSBpZiAoZM67U3VtIDwgLc61KSDPhjAgPSAtOTA7XHJcbiAgICAgICAgcmFuZ2VbMF0gPSDOuzAsIHJhbmdlWzFdID0gzrsxO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gcG9pbnQozrssIM+GKSB7XHJcbiAgICAgIHJhbmdlcy5wdXNoKHJhbmdlID0gWyDOuzAgPSDOuywgzrsxID0gzrsgXSk7XHJcbiAgICAgIGlmICjPhiA8IM+GMCkgz4YwID0gz4Y7XHJcbiAgICAgIGlmICjPhiA+IM+GMSkgz4YxID0gz4Y7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBsaW5lUG9pbnQozrssIM+GKSB7XHJcbiAgICAgIHZhciBwID0gZDNfZ2VvX2NhcnRlc2lhbihbIM67ICogZDNfcmFkaWFucywgz4YgKiBkM19yYWRpYW5zIF0pO1xyXG4gICAgICBpZiAocDApIHtcclxuICAgICAgICB2YXIgbm9ybWFsID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKHAwLCBwKSwgZXF1YXRvcmlhbCA9IFsgbm9ybWFsWzFdLCAtbm9ybWFsWzBdLCAwIF0sIGluZmxlY3Rpb24gPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MoZXF1YXRvcmlhbCwgbm9ybWFsKTtcclxuICAgICAgICBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGluZmxlY3Rpb24pO1xyXG4gICAgICAgIGluZmxlY3Rpb24gPSBkM19nZW9fc3BoZXJpY2FsKGluZmxlY3Rpb24pO1xyXG4gICAgICAgIHZhciBkzrsgPSDOuyAtIM67XywgcyA9IGTOuyA+IDAgPyAxIDogLTEsIM67aSA9IGluZmxlY3Rpb25bMF0gKiBkM19kZWdyZWVzICogcywgYW50aW1lcmlkaWFuID0gYWJzKGTOuykgPiAxODA7XHJcbiAgICAgICAgaWYgKGFudGltZXJpZGlhbiBeIChzICogzrtfIDwgzrtpICYmIM67aSA8IHMgKiDOuykpIHtcclxuICAgICAgICAgIHZhciDPhmkgPSBpbmZsZWN0aW9uWzFdICogZDNfZGVncmVlcztcclxuICAgICAgICAgIGlmICjPhmkgPiDPhjEpIM+GMSA9IM+GaTtcclxuICAgICAgICB9IGVsc2UgaWYgKM67aSA9ICjOu2kgKyAzNjApICUgMzYwIC0gMTgwLCBhbnRpbWVyaWRpYW4gXiAocyAqIM67XyA8IM67aSAmJiDOu2kgPCBzICogzrspKSB7XHJcbiAgICAgICAgICB2YXIgz4ZpID0gLWluZmxlY3Rpb25bMV0gKiBkM19kZWdyZWVzO1xyXG4gICAgICAgICAgaWYgKM+GaSA8IM+GMCkgz4YwID0gz4ZpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoz4YgPCDPhjApIM+GMCA9IM+GO1xyXG4gICAgICAgICAgaWYgKM+GID4gz4YxKSDPhjEgPSDPhjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFudGltZXJpZGlhbikge1xyXG4gICAgICAgICAgaWYgKM67IDwgzrtfKSB7XHJcbiAgICAgICAgICAgIGlmIChhbmdsZSjOuzAsIM67KSA+IGFuZ2xlKM67MCwgzrsxKSkgzrsxID0gzrs7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoYW5nbGUozrssIM67MSkgPiBhbmdsZSjOuzAsIM67MSkpIM67MCA9IM67O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAozrsxID49IM67MCkge1xyXG4gICAgICAgICAgICBpZiAozrsgPCDOuzApIM67MCA9IM67O1xyXG4gICAgICAgICAgICBpZiAozrsgPiDOuzEpIM67MSA9IM67O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKM67ID4gzrtfKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGFuZ2xlKM67MCwgzrspID4gYW5nbGUozrswLCDOuzEpKSDOuzEgPSDOuztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoYW5nbGUozrssIM67MSkgPiBhbmdsZSjOuzAsIM67MSkpIM67MCA9IM67O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBvaW50KM67LCDPhik7XHJcbiAgICAgIH1cclxuICAgICAgcDAgPSBwLCDOu18gPSDOuztcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHtcclxuICAgICAgYm91bmQucG9pbnQgPSBsaW5lUG9pbnQ7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xyXG4gICAgICByYW5nZVswXSA9IM67MCwgcmFuZ2VbMV0gPSDOuzE7XHJcbiAgICAgIGJvdW5kLnBvaW50ID0gcG9pbnQ7XHJcbiAgICAgIHAwID0gbnVsbDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJpbmdQb2ludCjOuywgz4YpIHtcclxuICAgICAgaWYgKHAwKSB7XHJcbiAgICAgICAgdmFyIGTOuyA9IM67IC0gzrtfO1xyXG4gICAgICAgIGTOu1N1bSArPSBhYnMoZM67KSA+IDE4MCA/IGTOuyArIChkzrsgPiAwID8gMzYwIDogLTM2MCkgOiBkzrs7XHJcbiAgICAgIH0gZWxzZSDOu19fID0gzrssIM+GX18gPSDPhjtcclxuICAgICAgZDNfZ2VvX2FyZWEucG9pbnQozrssIM+GKTtcclxuICAgICAgbGluZVBvaW50KM67LCDPhik7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7XHJcbiAgICAgIGQzX2dlb19hcmVhLmxpbmVTdGFydCgpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcclxuICAgICAgcmluZ1BvaW50KM67X18sIM+GX18pO1xyXG4gICAgICBkM19nZW9fYXJlYS5saW5lRW5kKCk7XHJcbiAgICAgIGlmIChhYnMoZM67U3VtKSA+IM61KSDOuzAgPSAtKM67MSA9IDE4MCk7XHJcbiAgICAgIHJhbmdlWzBdID0gzrswLCByYW5nZVsxXSA9IM67MTtcclxuICAgICAgcDAgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYW5nbGUozrswLCDOuzEpIHtcclxuICAgICAgcmV0dXJuICjOuzEgLT0gzrswKSA8IDAgPyDOuzEgKyAzNjAgOiDOuzE7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBjb21wYXJlUmFuZ2VzKGEsIGIpIHtcclxuICAgICAgcmV0dXJuIGFbMF0gLSBiWzBdO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gd2l0aGluUmFuZ2UoeCwgcmFuZ2UpIHtcclxuICAgICAgcmV0dXJuIHJhbmdlWzBdIDw9IHJhbmdlWzFdID8gcmFuZ2VbMF0gPD0geCAmJiB4IDw9IHJhbmdlWzFdIDogeCA8IHJhbmdlWzBdIHx8IHJhbmdlWzFdIDwgeDtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbihmZWF0dXJlKSB7XHJcbiAgICAgIM+GMSA9IM67MSA9IC0ozrswID0gz4YwID0gSW5maW5pdHkpO1xyXG4gICAgICByYW5nZXMgPSBbXTtcclxuICAgICAgZDMuZ2VvLnN0cmVhbShmZWF0dXJlLCBib3VuZCk7XHJcbiAgICAgIHZhciBuID0gcmFuZ2VzLmxlbmd0aDtcclxuICAgICAgaWYgKG4pIHtcclxuICAgICAgICByYW5nZXMuc29ydChjb21wYXJlUmFuZ2VzKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMSwgYSA9IHJhbmdlc1swXSwgYiwgbWVyZ2VkID0gWyBhIF07IGkgPCBuOyArK2kpIHtcclxuICAgICAgICAgIGIgPSByYW5nZXNbaV07XHJcbiAgICAgICAgICBpZiAod2l0aGluUmFuZ2UoYlswXSwgYSkgfHwgd2l0aGluUmFuZ2UoYlsxXSwgYSkpIHtcclxuICAgICAgICAgICAgaWYgKGFuZ2xlKGFbMF0sIGJbMV0pID4gYW5nbGUoYVswXSwgYVsxXSkpIGFbMV0gPSBiWzFdO1xyXG4gICAgICAgICAgICBpZiAoYW5nbGUoYlswXSwgYVsxXSkgPiBhbmdsZShhWzBdLCBhWzFdKSkgYVswXSA9IGJbMF07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZXJnZWQucHVzaChhID0gYik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBiZXN0ID0gLUluZmluaXR5LCBkzrs7XHJcbiAgICAgICAgZm9yICh2YXIgbiA9IG1lcmdlZC5sZW5ndGggLSAxLCBpID0gMCwgYSA9IG1lcmdlZFtuXSwgYjsgaSA8PSBuOyBhID0gYiwgKytpKSB7XHJcbiAgICAgICAgICBiID0gbWVyZ2VkW2ldO1xyXG4gICAgICAgICAgaWYgKChkzrsgPSBhbmdsZShhWzFdLCBiWzBdKSkgPiBiZXN0KSBiZXN0ID0gZM67LCDOuzAgPSBiWzBdLCDOuzEgPSBhWzFdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByYW5nZXMgPSByYW5nZSA9IG51bGw7XHJcbiAgICAgIHJldHVybiDOuzAgPT09IEluZmluaXR5IHx8IM+GMCA9PT0gSW5maW5pdHkgPyBbIFsgTmFOLCBOYU4gXSwgWyBOYU4sIE5hTiBdIF0gOiBbIFsgzrswLCDPhjAgXSwgWyDOuzEsIM+GMSBdIF07XHJcbiAgICB9O1xyXG4gIH0oKTtcclxuICBkMy5nZW8uY2VudHJvaWQgPSBmdW5jdGlvbihvYmplY3QpIHtcclxuICAgIGQzX2dlb19jZW50cm9pZFcwID0gZDNfZ2VvX2NlbnRyb2lkVzEgPSBkM19nZW9fY2VudHJvaWRYMCA9IGQzX2dlb19jZW50cm9pZFkwID0gZDNfZ2VvX2NlbnRyb2lkWjAgPSBkM19nZW9fY2VudHJvaWRYMSA9IGQzX2dlb19jZW50cm9pZFkxID0gZDNfZ2VvX2NlbnRyb2lkWjEgPSBkM19nZW9fY2VudHJvaWRYMiA9IGQzX2dlb19jZW50cm9pZFkyID0gZDNfZ2VvX2NlbnRyb2lkWjIgPSAwO1xyXG4gICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGQzX2dlb19jZW50cm9pZCk7XHJcbiAgICB2YXIgeCA9IGQzX2dlb19jZW50cm9pZFgyLCB5ID0gZDNfZ2VvX2NlbnRyb2lkWTIsIHogPSBkM19nZW9fY2VudHJvaWRaMiwgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcclxuICAgIGlmIChtIDwgzrUyKSB7XHJcbiAgICAgIHggPSBkM19nZW9fY2VudHJvaWRYMSwgeSA9IGQzX2dlb19jZW50cm9pZFkxLCB6ID0gZDNfZ2VvX2NlbnRyb2lkWjE7XHJcbiAgICAgIGlmIChkM19nZW9fY2VudHJvaWRXMSA8IM61KSB4ID0gZDNfZ2VvX2NlbnRyb2lkWDAsIHkgPSBkM19nZW9fY2VudHJvaWRZMCwgeiA9IGQzX2dlb19jZW50cm9pZFowO1xyXG4gICAgICBtID0geCAqIHggKyB5ICogeSArIHogKiB6O1xyXG4gICAgICBpZiAobSA8IM61MikgcmV0dXJuIFsgTmFOLCBOYU4gXTtcclxuICAgIH1cclxuICAgIHJldHVybiBbIE1hdGguYXRhbjIoeSwgeCkgKiBkM19kZWdyZWVzLCBkM19hc2luKHogLyBNYXRoLnNxcnQobSkpICogZDNfZGVncmVlcyBdO1xyXG4gIH07XHJcbiAgdmFyIGQzX2dlb19jZW50cm9pZFcwLCBkM19nZW9fY2VudHJvaWRXMSwgZDNfZ2VvX2NlbnRyb2lkWDAsIGQzX2dlb19jZW50cm9pZFkwLCBkM19nZW9fY2VudHJvaWRaMCwgZDNfZ2VvX2NlbnRyb2lkWDEsIGQzX2dlb19jZW50cm9pZFkxLCBkM19nZW9fY2VudHJvaWRaMSwgZDNfZ2VvX2NlbnRyb2lkWDIsIGQzX2dlb19jZW50cm9pZFkyLCBkM19nZW9fY2VudHJvaWRaMjtcclxuICB2YXIgZDNfZ2VvX2NlbnRyb2lkID0ge1xyXG4gICAgc3BoZXJlOiBkM19ub29wLFxyXG4gICAgcG9pbnQ6IGQzX2dlb19jZW50cm9pZFBvaW50LFxyXG4gICAgbGluZVN0YXJ0OiBkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQsXHJcbiAgICBsaW5lRW5kOiBkM19nZW9fY2VudHJvaWRMaW5lRW5kLFxyXG4gICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19jZW50cm9pZFJpbmdTdGFydDtcclxuICAgIH0sXHJcbiAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19jZW50cm9pZExpbmVTdGFydDtcclxuICAgIH1cclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2dlb19jZW50cm9pZFBvaW50KM67LCDPhikge1xyXG4gICAgzrsgKj0gZDNfcmFkaWFucztcclxuICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GICo9IGQzX3JhZGlhbnMpO1xyXG4gICAgZDNfZ2VvX2NlbnRyb2lkUG9pbnRYWVooY29zz4YgKiBNYXRoLmNvcyjOuyksIGNvc8+GICogTWF0aC5zaW4ozrspLCBNYXRoLnNpbijPhikpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4LCB5LCB6KSB7XHJcbiAgICArK2QzX2dlb19jZW50cm9pZFcwO1xyXG4gICAgZDNfZ2VvX2NlbnRyb2lkWDAgKz0gKHggLSBkM19nZW9fY2VudHJvaWRYMCkgLyBkM19nZW9fY2VudHJvaWRXMDtcclxuICAgIGQzX2dlb19jZW50cm9pZFkwICs9ICh5IC0gZDNfZ2VvX2NlbnRyb2lkWTApIC8gZDNfZ2VvX2NlbnRyb2lkVzA7XHJcbiAgICBkM19nZW9fY2VudHJvaWRaMCArPSAoeiAtIGQzX2dlb19jZW50cm9pZFowKSAvIGQzX2dlb19jZW50cm9pZFcwO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQoKSB7XHJcbiAgICB2YXIgeDAsIHkwLCB6MDtcclxuICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IGZ1bmN0aW9uKM67LCDPhikge1xyXG4gICAgICDOuyAqPSBkM19yYWRpYW5zO1xyXG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKTtcclxuICAgICAgeDAgPSBjb3PPhiAqIE1hdGguY29zKM67KTtcclxuICAgICAgeTAgPSBjb3PPhiAqIE1hdGguc2luKM67KTtcclxuICAgICAgejAgPSBNYXRoLnNpbijPhik7XHJcbiAgICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkUG9pbnRYWVooeDAsIHkwLCB6MCk7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gbmV4dFBvaW50KM67LCDPhikge1xyXG4gICAgICDOuyAqPSBkM19yYWRpYW5zO1xyXG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKSwgeCA9IGNvc8+GICogTWF0aC5jb3MozrspLCB5ID0gY29zz4YgKiBNYXRoLnNpbijOuyksIHogPSBNYXRoLnNpbijPhiksIHcgPSBNYXRoLmF0YW4yKE1hdGguc3FydCgodyA9IHkwICogeiAtIHowICogeSkgKiB3ICsgKHcgPSB6MCAqIHggLSB4MCAqIHopICogdyArICh3ID0geDAgKiB5IC0geTAgKiB4KSAqIHcpLCB4MCAqIHggKyB5MCAqIHkgKyB6MCAqIHopO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRXMSArPSB3O1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRYMSArPSB3ICogKHgwICsgKHgwID0geCkpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRZMSArPSB3ICogKHkwICsgKHkwID0geSkpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRaMSArPSB3ICogKHowICsgKHowID0geikpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4MCwgeTAsIHowKTtcclxuICAgIH1cclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NlbnRyb2lkTGluZUVuZCgpIHtcclxuICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IGQzX2dlb19jZW50cm9pZFBvaW50O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRSaW5nU3RhcnQoKSB7XHJcbiAgICB2YXIgzrswMCwgz4YwMCwgeDAsIHkwLCB6MDtcclxuICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IGZ1bmN0aW9uKM67LCDPhikge1xyXG4gICAgICDOuzAwID0gzrssIM+GMDAgPSDPhjtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gbmV4dFBvaW50O1xyXG4gICAgICDOuyAqPSBkM19yYWRpYW5zO1xyXG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKTtcclxuICAgICAgeDAgPSBjb3PPhiAqIE1hdGguY29zKM67KTtcclxuICAgICAgeTAgPSBjb3PPhiAqIE1hdGguc2luKM67KTtcclxuICAgICAgejAgPSBNYXRoLnNpbijPhik7XHJcbiAgICAgIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKHgwLCB5MCwgejApO1xyXG4gICAgfTtcclxuICAgIGQzX2dlb19jZW50cm9pZC5saW5lRW5kID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIG5leHRQb2ludCjOuzAwLCDPhjAwKTtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkLmxpbmVFbmQgPSBkM19nZW9fY2VudHJvaWRMaW5lRW5kO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBkM19nZW9fY2VudHJvaWRQb2ludDtcclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQozrssIM+GKSB7XHJcbiAgICAgIM67ICo9IGQzX3JhZGlhbnM7XHJcbiAgICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GICo9IGQzX3JhZGlhbnMpLCB4ID0gY29zz4YgKiBNYXRoLmNvcyjOuyksIHkgPSBjb3PPhiAqIE1hdGguc2luKM67KSwgeiA9IE1hdGguc2luKM+GKSwgY3ggPSB5MCAqIHogLSB6MCAqIHksIGN5ID0gejAgKiB4IC0geDAgKiB6LCBjeiA9IHgwICogeSAtIHkwICogeCwgbSA9IE1hdGguc3FydChjeCAqIGN4ICsgY3kgKiBjeSArIGN6ICogY3opLCB1ID0geDAgKiB4ICsgeTAgKiB5ICsgejAgKiB6LCB2ID0gbSAmJiAtZDNfYWNvcyh1KSAvIG0sIHcgPSBNYXRoLmF0YW4yKG0sIHUpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRYMiArPSB2ICogY3g7XHJcbiAgICAgIGQzX2dlb19jZW50cm9pZFkyICs9IHYgKiBjeTtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkWjIgKz0gdiAqIGN6O1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRXMSArPSB3O1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRYMSArPSB3ICogKHgwICsgKHgwID0geCkpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRZMSArPSB3ICogKHkwICsgKHkwID0geSkpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRaMSArPSB3ICogKHowICsgKHowID0geikpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4MCwgeTAsIHowKTtcclxuICAgIH1cclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NvbXBvc2UoYSwgYikge1xyXG4gICAgZnVuY3Rpb24gY29tcG9zZSh4LCB5KSB7XHJcbiAgICAgIHJldHVybiB4ID0gYSh4LCB5KSwgYih4WzBdLCB4WzFdKTtcclxuICAgIH1cclxuICAgIGlmIChhLmludmVydCAmJiBiLmludmVydCkgY29tcG9zZS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XHJcbiAgICAgIHJldHVybiB4ID0gYi5pbnZlcnQoeCwgeSksIHggJiYgYS5pbnZlcnQoeFswXSwgeFsxXSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGNvbXBvc2U7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RydWUoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBQb2x5Z29uKHNlZ21lbnRzLCBjb21wYXJlLCBjbGlwU3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBsaXN0ZW5lcikge1xyXG4gICAgdmFyIHN1YmplY3QgPSBbXSwgY2xpcCA9IFtdO1xyXG4gICAgc2VnbWVudHMuZm9yRWFjaChmdW5jdGlvbihzZWdtZW50KSB7XHJcbiAgICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuO1xyXG4gICAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl07XHJcbiAgICAgIGlmIChkM19nZW9fc3BoZXJpY2FsRXF1YWwocDAsIHAxKSkge1xyXG4gICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBsaXN0ZW5lci5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pO1xyXG4gICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdmFyIGEgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAwLCBzZWdtZW50LCBudWxsLCB0cnVlKSwgYiA9IG5ldyBkM19nZW9fY2xpcFBvbHlnb25JbnRlcnNlY3Rpb24ocDAsIG51bGwsIGEsIGZhbHNlKTtcclxuICAgICAgYS5vID0gYjtcclxuICAgICAgc3ViamVjdC5wdXNoKGEpO1xyXG4gICAgICBjbGlwLnB1c2goYik7XHJcbiAgICAgIGEgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAxLCBzZWdtZW50LCBudWxsLCBmYWxzZSk7XHJcbiAgICAgIGIgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAxLCBudWxsLCBhLCB0cnVlKTtcclxuICAgICAgYS5vID0gYjtcclxuICAgICAgc3ViamVjdC5wdXNoKGEpO1xyXG4gICAgICBjbGlwLnB1c2goYik7XHJcbiAgICB9KTtcclxuICAgIGNsaXAuc29ydChjb21wYXJlKTtcclxuICAgIGQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhcihzdWJqZWN0KTtcclxuICAgIGQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhcihjbGlwKTtcclxuICAgIGlmICghc3ViamVjdC5sZW5ndGgpIHJldHVybjtcclxuICAgIGZvciAodmFyIGkgPSAwLCBlbnRyeSA9IGNsaXBTdGFydEluc2lkZSwgbiA9IGNsaXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgIGNsaXBbaV0uZSA9IGVudHJ5ID0gIWVudHJ5O1xyXG4gICAgfVxyXG4gICAgdmFyIHN0YXJ0ID0gc3ViamVjdFswXSwgcG9pbnRzLCBwb2ludDtcclxuICAgIHdoaWxlICgxKSB7XHJcbiAgICAgIHZhciBjdXJyZW50ID0gc3RhcnQsIGlzU3ViamVjdCA9IHRydWU7XHJcbiAgICAgIHdoaWxlIChjdXJyZW50LnYpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubikgPT09IHN0YXJ0KSByZXR1cm47XHJcbiAgICAgIHBvaW50cyA9IGN1cnJlbnQuejtcclxuICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBjdXJyZW50LnYgPSBjdXJyZW50Lm8udiA9IHRydWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnQuZSkge1xyXG4gICAgICAgICAgaWYgKGlzU3ViamVjdCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBuOyArK2kpIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5uLngsIDEsIGxpc3RlbmVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChpc1N1YmplY3QpIHtcclxuICAgICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBwb2ludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5vO1xyXG4gICAgICAgIHBvaW50cyA9IGN1cnJlbnQuejtcclxuICAgICAgICBpc1N1YmplY3QgPSAhaXNTdWJqZWN0O1xyXG4gICAgICB9IHdoaWxlICghY3VycmVudC52KTtcclxuICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2xpcFBvbHlnb25MaW5rQ2lyY3VsYXIoYXJyYXkpIHtcclxuICAgIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47XHJcbiAgICB2YXIgbiwgaSA9IDAsIGEgPSBhcnJheVswXSwgYjtcclxuICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgIGEubiA9IGIgPSBhcnJheVtpXTtcclxuICAgICAgYi5wID0gYTtcclxuICAgICAgYSA9IGI7XHJcbiAgICB9XHJcbiAgICBhLm4gPSBiID0gYXJyYXlbMF07XHJcbiAgICBiLnAgPSBhO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2xpcFBvbHlnb25JbnRlcnNlY3Rpb24ocG9pbnQsIHBvaW50cywgb3RoZXIsIGVudHJ5KSB7XHJcbiAgICB0aGlzLnggPSBwb2ludDtcclxuICAgIHRoaXMueiA9IHBvaW50cztcclxuICAgIHRoaXMubyA9IG90aGVyO1xyXG4gICAgdGhpcy5lID0gZW50cnk7XHJcbiAgICB0aGlzLnYgPSBmYWxzZTtcclxuICAgIHRoaXMubiA9IHRoaXMucCA9IG51bGw7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwKHBvaW50VmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBjbGlwU3RhcnQpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbihyb3RhdGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgIHZhciBsaW5lID0gY2xpcExpbmUobGlzdGVuZXIpLCByb3RhdGVkQ2xpcFN0YXJ0ID0gcm90YXRlLmludmVydChjbGlwU3RhcnRbMF0sIGNsaXBTdGFydFsxXSk7XHJcbiAgICAgIHZhciBjbGlwID0ge1xyXG4gICAgICAgIHBvaW50OiBwb2ludCxcclxuICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcclxuICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLFxyXG4gICAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnRSaW5nO1xyXG4gICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7XHJcbiAgICAgICAgICBjbGlwLmxpbmVFbmQgPSByaW5nRW5kO1xyXG4gICAgICAgICAgc2VnbWVudHMgPSBbXTtcclxuICAgICAgICAgIHBvbHlnb24gPSBbXTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xyXG4gICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XHJcbiAgICAgICAgICBjbGlwLmxpbmVFbmQgPSBsaW5lRW5kO1xyXG4gICAgICAgICAgc2VnbWVudHMgPSBkMy5tZXJnZShzZWdtZW50cyk7XHJcbiAgICAgICAgICB2YXIgY2xpcFN0YXJ0SW5zaWRlID0gZDNfZ2VvX3BvaW50SW5Qb2x5Z29uKHJvdGF0ZWRDbGlwU3RhcnQsIHBvbHlnb24pO1xyXG4gICAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBkM19nZW9fY2xpcFBvbHlnb24oc2VnbWVudHMsIGQzX2dlb19jbGlwU29ydCwgY2xpcFN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjbGlwU3RhcnRJbnNpZGUpIHtcclxuICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgbGlzdGVuZXIucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHBvbHlnb25TdGFydGVkKSBsaXN0ZW5lci5wb2x5Z29uRW5kKCksIHBvbHlnb25TdGFydGVkID0gZmFsc2U7XHJcbiAgICAgICAgICBzZWdtZW50cyA9IHBvbHlnb24gPSBudWxsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3BoZXJlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpO1xyXG4gICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XHJcbiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XHJcbiAgICAgICAgICBsaXN0ZW5lci5wb2x5Z29uRW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBmdW5jdGlvbiBwb2ludCjOuywgz4YpIHtcclxuICAgICAgICB2YXIgcG9pbnQgPSByb3RhdGUozrssIM+GKTtcclxuICAgICAgICBpZiAocG9pbnRWaXNpYmxlKM67ID0gcG9pbnRbMF0sIM+GID0gcG9pbnRbMV0pKSBsaXN0ZW5lci5wb2ludCjOuywgz4YpO1xyXG4gICAgICB9XHJcbiAgICAgIGZ1bmN0aW9uIHBvaW50TGluZSjOuywgz4YpIHtcclxuICAgICAgICB2YXIgcG9pbnQgPSByb3RhdGUozrssIM+GKTtcclxuICAgICAgICBsaW5lLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xyXG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludExpbmU7XHJcbiAgICAgICAgbGluZS5saW5lU3RhcnQoKTtcclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xyXG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDtcclxuICAgICAgICBsaW5lLmxpbmVFbmQoKTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgc2VnbWVudHM7XHJcbiAgICAgIHZhciBidWZmZXIgPSBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCksIHJpbmdMaXN0ZW5lciA9IGNsaXBMaW5lKGJ1ZmZlciksIHBvbHlnb25TdGFydGVkID0gZmFsc2UsIHBvbHlnb24sIHJpbmc7XHJcbiAgICAgIGZ1bmN0aW9uIHBvaW50UmluZyjOuywgz4YpIHtcclxuICAgICAgICByaW5nLnB1c2goWyDOuywgz4YgXSk7XHJcbiAgICAgICAgdmFyIHBvaW50ID0gcm90YXRlKM67LCDPhik7XHJcbiAgICAgICAgcmluZ0xpc3RlbmVyLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xyXG4gICAgICAgIHJpbmdMaXN0ZW5lci5saW5lU3RhcnQoKTtcclxuICAgICAgICByaW5nID0gW107XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcclxuICAgICAgICBwb2ludFJpbmcocmluZ1swXVswXSwgcmluZ1swXVsxXSk7XHJcbiAgICAgICAgcmluZ0xpc3RlbmVyLmxpbmVFbmQoKTtcclxuICAgICAgICB2YXIgY2xlYW4gPSByaW5nTGlzdGVuZXIuY2xlYW4oKSwgcmluZ1NlZ21lbnRzID0gYnVmZmVyLmJ1ZmZlcigpLCBzZWdtZW50LCBuID0gcmluZ1NlZ21lbnRzLmxlbmd0aDtcclxuICAgICAgICByaW5nLnBvcCgpO1xyXG4gICAgICAgIHBvbHlnb24ucHVzaChyaW5nKTtcclxuICAgICAgICByaW5nID0gbnVsbDtcclxuICAgICAgICBpZiAoIW4pIHJldHVybjtcclxuICAgICAgICBpZiAoY2xlYW4gJiAxKSB7XHJcbiAgICAgICAgICBzZWdtZW50ID0gcmluZ1NlZ21lbnRzWzBdO1xyXG4gICAgICAgICAgdmFyIG4gPSBzZWdtZW50Lmxlbmd0aCAtIDEsIGkgPSAtMSwgcG9pbnQ7XHJcbiAgICAgICAgICBpZiAobiA+IDApIHtcclxuICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgbGlzdGVuZXIucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XHJcbiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0ZW5lci5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pO1xyXG4gICAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuID4gMSAmJiBjbGVhbiAmIDIpIHJpbmdTZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5wb3AoKS5jb25jYXQocmluZ1NlZ21lbnRzLnNoaWZ0KCkpKTtcclxuICAgICAgICBzZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5maWx0ZXIoZDNfZ2VvX2NsaXBTZWdtZW50TGVuZ3RoMSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjbGlwO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBTZWdtZW50TGVuZ3RoMShzZWdtZW50KSB7XHJcbiAgICByZXR1cm4gc2VnbWVudC5sZW5ndGggPiAxO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCkge1xyXG4gICAgdmFyIGxpbmVzID0gW10sIGxpbmU7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxpbmVzLnB1c2gobGluZSA9IFtdKTtcclxuICAgICAgfSxcclxuICAgICAgcG9pbnQ6IGZ1bmN0aW9uKM67LCDPhikge1xyXG4gICAgICAgIGxpbmUucHVzaChbIM67LCDPhiBdKTtcclxuICAgICAgfSxcclxuICAgICAgbGluZUVuZDogZDNfbm9vcCxcclxuICAgICAgYnVmZmVyOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgYnVmZmVyID0gbGluZXM7XHJcbiAgICAgICAgbGluZXMgPSBbXTtcclxuICAgICAgICBsaW5lID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgICB9LFxyXG4gICAgICByZWpvaW46IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSBsaW5lcy5wdXNoKGxpbmVzLnBvcCgpLmNvbmNhdChsaW5lcy5zaGlmdCgpKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwU29ydChhLCBiKSB7XHJcbiAgICByZXR1cm4gKChhID0gYS54KVswXSA8IDAgPyBhWzFdIC0gaGFsZs+AIC0gzrUgOiBoYWxmz4AgLSBhWzFdKSAtICgoYiA9IGIueClbMF0gPCAwID8gYlsxXSAtIGhhbGbPgCAtIM61IDogaGFsZs+AIC0gYlsxXSk7XHJcbiAgfVxyXG4gIHZhciBkM19nZW9fY2xpcEFudGltZXJpZGlhbiA9IGQzX2dlb19jbGlwKGQzX3RydWUsIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuTGluZSwgZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnBvbGF0ZSwgWyAtz4AsIC3PgCAvIDIgXSk7XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5MaW5lKGxpc3RlbmVyKSB7XHJcbiAgICB2YXIgzrswID0gTmFOLCDPhjAgPSBOYU4sIHPOuzAgPSBOYU4sIGNsZWFuO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcclxuICAgICAgICBjbGVhbiA9IDE7XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvaW50OiBmdW5jdGlvbijOuzEsIM+GMSkge1xyXG4gICAgICAgIHZhciBzzrsxID0gzrsxID4gMCA/IM+AIDogLc+ALCBkzrsgPSBhYnMozrsxIC0gzrswKTtcclxuICAgICAgICBpZiAoYWJzKGTOuyAtIM+AKSA8IM61KSB7XHJcbiAgICAgICAgICBsaXN0ZW5lci5wb2ludCjOuzAsIM+GMCA9ICjPhjAgKyDPhjEpIC8gMiA+IDAgPyBoYWxmz4AgOiAtaGFsZs+AKTtcclxuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzAsIM+GMCk7XHJcbiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XHJcbiAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcclxuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzEsIM+GMCk7XHJcbiAgICAgICAgICBsaXN0ZW5lci5wb2ludCjOuzEsIM+GMCk7XHJcbiAgICAgICAgICBjbGVhbiA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzzrswICE9PSBzzrsxICYmIGTOuyA+PSDPgCkge1xyXG4gICAgICAgICAgaWYgKGFicyjOuzAgLSBzzrswKSA8IM61KSDOuzAgLT0gc867MCAqIM61O1xyXG4gICAgICAgICAgaWYgKGFicyjOuzEgLSBzzrsxKSA8IM61KSDOuzEgLT0gc867MSAqIM61O1xyXG4gICAgICAgICAgz4YwID0gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnNlY3QozrswLCDPhjAsIM67MSwgz4YxKTtcclxuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzAsIM+GMCk7XHJcbiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XHJcbiAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcclxuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzEsIM+GMCk7XHJcbiAgICAgICAgICBjbGVhbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxpc3RlbmVyLnBvaW50KM67MCA9IM67MSwgz4YwID0gz4YxKTtcclxuICAgICAgICBzzrswID0gc867MTtcclxuICAgICAgfSxcclxuICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xyXG4gICAgICAgIM67MCA9IM+GMCA9IE5hTjtcclxuICAgICAgfSxcclxuICAgICAgY2xlYW46IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiAyIC0gY2xlYW47XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KM67MCwgz4YwLCDOuzEsIM+GMSkge1xyXG4gICAgdmFyIGNvc8+GMCwgY29zz4YxLCBzaW7OuzBfzrsxID0gTWF0aC5zaW4ozrswIC0gzrsxKTtcclxuICAgIHJldHVybiBhYnMoc2luzrswX867MSkgPiDOtSA/IE1hdGguYXRhbigoTWF0aC5zaW4oz4YwKSAqIChjb3PPhjEgPSBNYXRoLmNvcyjPhjEpKSAqIE1hdGguc2luKM67MSkgLSBNYXRoLnNpbijPhjEpICogKGNvc8+GMCA9IE1hdGguY29zKM+GMCkpICogTWF0aC5zaW4ozrswKSkgLyAoY29zz4YwICogY29zz4YxICogc2luzrswX867MSkpIDogKM+GMCArIM+GMSkgLyAyO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIGxpc3RlbmVyKSB7XHJcbiAgICB2YXIgz4Y7XHJcbiAgICBpZiAoZnJvbSA9PSBudWxsKSB7XHJcbiAgICAgIM+GID0gZGlyZWN0aW9uICogaGFsZs+AO1xyXG4gICAgICBsaXN0ZW5lci5wb2ludCgtz4AsIM+GKTtcclxuICAgICAgbGlzdGVuZXIucG9pbnQoMCwgz4YpO1xyXG4gICAgICBsaXN0ZW5lci5wb2ludCjPgCwgz4YpO1xyXG4gICAgICBsaXN0ZW5lci5wb2ludCjPgCwgMCk7XHJcbiAgICAgIGxpc3RlbmVyLnBvaW50KM+ALCAtz4YpO1xyXG4gICAgICBsaXN0ZW5lci5wb2ludCgwLCAtz4YpO1xyXG4gICAgICBsaXN0ZW5lci5wb2ludCgtz4AsIC3Phik7XHJcbiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgMCk7XHJcbiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgz4YpO1xyXG4gICAgfSBlbHNlIGlmIChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IM61KSB7XHJcbiAgICAgIHZhciBzID0gZnJvbVswXSA8IHRvWzBdID8gz4AgOiAtz4A7XHJcbiAgICAgIM+GID0gZGlyZWN0aW9uICogcyAvIDI7XHJcbiAgICAgIGxpc3RlbmVyLnBvaW50KC1zLCDPhik7XHJcbiAgICAgIGxpc3RlbmVyLnBvaW50KDAsIM+GKTtcclxuICAgICAgbGlzdGVuZXIucG9pbnQocywgz4YpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGlzdGVuZXIucG9pbnQodG9bMF0sIHRvWzFdKTtcclxuICAgIH1cclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3BvaW50SW5Qb2x5Z29uKHBvaW50LCBwb2x5Z29uKSB7XHJcbiAgICB2YXIgbWVyaWRpYW4gPSBwb2ludFswXSwgcGFyYWxsZWwgPSBwb2ludFsxXSwgbWVyaWRpYW5Ob3JtYWwgPSBbIE1hdGguc2luKG1lcmlkaWFuKSwgLU1hdGguY29zKG1lcmlkaWFuKSwgMCBdLCBwb2xhckFuZ2xlID0gMCwgd2luZGluZyA9IDA7XHJcbiAgICBkM19nZW9fYXJlYVJpbmdTdW0ucmVzZXQoKTtcclxuICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcclxuICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW2ldLCBtID0gcmluZy5sZW5ndGg7XHJcbiAgICAgIGlmICghbSkgY29udGludWU7XHJcbiAgICAgIHZhciBwb2ludDAgPSByaW5nWzBdLCDOuzAgPSBwb2ludDBbMF0sIM+GMCA9IHBvaW50MFsxXSAvIDIgKyDPgCAvIDQsIHNpbs+GMCA9IE1hdGguc2luKM+GMCksIGNvc8+GMCA9IE1hdGguY29zKM+GMCksIGogPSAxO1xyXG4gICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIGlmIChqID09PSBtKSBqID0gMDtcclxuICAgICAgICBwb2ludCA9IHJpbmdbal07XHJcbiAgICAgICAgdmFyIM67ID0gcG9pbnRbMF0sIM+GID0gcG9pbnRbMV0gLyAyICsgz4AgLyA0LCBzaW7PhiA9IE1hdGguc2luKM+GKSwgY29zz4YgPSBNYXRoLmNvcyjPhiksIGTOuyA9IM67IC0gzrswLCBzZM67ID0gZM67ID49IDAgPyAxIDogLTEsIGFkzrsgPSBzZM67ICogZM67LCBhbnRpbWVyaWRpYW4gPSBhZM67ID4gz4AsIGsgPSBzaW7PhjAgKiBzaW7PhjtcclxuICAgICAgICBkM19nZW9fYXJlYVJpbmdTdW0uYWRkKE1hdGguYXRhbjIoayAqIHNkzrsgKiBNYXRoLnNpbihhZM67KSwgY29zz4YwICogY29zz4YgKyBrICogTWF0aC5jb3MoYWTOuykpKTtcclxuICAgICAgICBwb2xhckFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGTOuyArIHNkzrsgKiDPhCA6IGTOuztcclxuICAgICAgICBpZiAoYW50aW1lcmlkaWFuIF4gzrswID49IG1lcmlkaWFuIF4gzrsgPj0gbWVyaWRpYW4pIHtcclxuICAgICAgICAgIHZhciBhcmMgPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MoZDNfZ2VvX2NhcnRlc2lhbihwb2ludDApLCBkM19nZW9fY2FydGVzaWFuKHBvaW50KSk7XHJcbiAgICAgICAgICBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGFyYyk7XHJcbiAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKG1lcmlkaWFuTm9ybWFsLCBhcmMpO1xyXG4gICAgICAgICAgZDNfZ2VvX2NhcnRlc2lhbk5vcm1hbGl6ZShpbnRlcnNlY3Rpb24pO1xyXG4gICAgICAgICAgdmFyIM+GYXJjID0gKGFudGltZXJpZGlhbiBeIGTOuyA+PSAwID8gLTEgOiAxKSAqIGQzX2FzaW4oaW50ZXJzZWN0aW9uWzJdKTtcclxuICAgICAgICAgIGlmIChwYXJhbGxlbCA+IM+GYXJjIHx8IHBhcmFsbGVsID09PSDPhmFyYyAmJiAoYXJjWzBdIHx8IGFyY1sxXSkpIHtcclxuICAgICAgICAgICAgd2luZGluZyArPSBhbnRpbWVyaWRpYW4gXiBkzrsgPj0gMCA/IDEgOiAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFqKyspIGJyZWFrO1xyXG4gICAgICAgIM67MCA9IM67LCBzaW7PhjAgPSBzaW7PhiwgY29zz4YwID0gY29zz4YsIHBvaW50MCA9IHBvaW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHBvbGFyQW5nbGUgPCAtzrUgfHwgcG9sYXJBbmdsZSA8IM61ICYmIGQzX2dlb19hcmVhUmluZ1N1bSA8IC3OtSkgXiB3aW5kaW5nICYgMTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBDaXJjbGUocmFkaXVzKSB7XHJcbiAgICB2YXIgY3IgPSBNYXRoLmNvcyhyYWRpdXMpLCBzbWFsbFJhZGl1cyA9IGNyID4gMCwgbm90SGVtaXNwaGVyZSA9IGFicyhjcikgPiDOtSwgaW50ZXJwb2xhdGUgPSBkM19nZW9fY2lyY2xlSW50ZXJwb2xhdGUocmFkaXVzLCA2ICogZDNfcmFkaWFucyk7XHJcbiAgICByZXR1cm4gZDNfZ2VvX2NsaXAodmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBzbWFsbFJhZGl1cyA/IFsgMCwgLXJhZGl1cyBdIDogWyAtz4AsIHJhZGl1cyAtIM+AIF0pO1xyXG4gICAgZnVuY3Rpb24gdmlzaWJsZSjOuywgz4YpIHtcclxuICAgICAgcmV0dXJuIE1hdGguY29zKM67KSAqIE1hdGguY29zKM+GKSA+IGNyO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY2xpcExpbmUobGlzdGVuZXIpIHtcclxuICAgICAgdmFyIHBvaW50MCwgYzAsIHYwLCB2MDAsIGNsZWFuO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICB2MDAgPSB2MCA9IGZhbHNlO1xyXG4gICAgICAgICAgY2xlYW4gPSAxO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKM67LCDPhikge1xyXG4gICAgICAgICAgdmFyIHBvaW50MSA9IFsgzrssIM+GIF0sIHBvaW50MiwgdiA9IHZpc2libGUozrssIM+GKSwgYyA9IHNtYWxsUmFkaXVzID8gdiA/IDAgOiBjb2RlKM67LCDPhikgOiB2ID8gY29kZSjOuyArICjOuyA8IDAgPyDPgCA6IC3PgCksIM+GKSA6IDA7XHJcbiAgICAgICAgICBpZiAoIXBvaW50MCAmJiAodjAwID0gdjAgPSB2KSkgbGlzdGVuZXIubGluZVN0YXJ0KCk7XHJcbiAgICAgICAgICBpZiAodiAhPT0gdjApIHtcclxuICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTtcclxuICAgICAgICAgICAgaWYgKGQzX2dlb19zcGhlcmljYWxFcXVhbChwb2ludDAsIHBvaW50MikgfHwgZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MSwgcG9pbnQyKSkge1xyXG4gICAgICAgICAgICAgIHBvaW50MVswXSArPSDOtTtcclxuICAgICAgICAgICAgICBwb2ludDFbMV0gKz0gzrU7XHJcbiAgICAgICAgICAgICAgdiA9IHZpc2libGUocG9pbnQxWzBdLCBwb2ludDFbMV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodiAhPT0gdjApIHtcclxuICAgICAgICAgICAgY2xlYW4gPSAwO1xyXG4gICAgICAgICAgICBpZiAodikge1xyXG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xyXG4gICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCk7XHJcbiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7XHJcbiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pO1xyXG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwb2ludDAgPSBwb2ludDI7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG5vdEhlbWlzcGhlcmUgJiYgcG9pbnQwICYmIHNtYWxsUmFkaXVzIF4gdikge1xyXG4gICAgICAgICAgICB2YXIgdDtcclxuICAgICAgICAgICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgY2xlYW4gPSAwO1xyXG4gICAgICAgICAgICAgIGlmIChzbWFsbFJhZGl1cykge1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzBdWzBdLCB0WzBdWzFdKTtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pO1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQodFswXVswXSwgdFswXVsxXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodiAmJiAoIXBvaW50MCB8fCAhZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHtcclxuICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQxWzBdLCBwb2ludDFbMV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcG9pbnQwID0gcG9pbnQxLCB2MCA9IHYsIGMwID0gYztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgaWYgKHYwKSBsaXN0ZW5lci5saW5lRW5kKCk7XHJcbiAgICAgICAgICBwb2ludDAgPSBudWxsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYW46IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNsZWFuIHwgKHYwMCAmJiB2MCkgPDwgMTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnRlcnNlY3QoYSwgYiwgdHdvKSB7XHJcbiAgICAgIHZhciBwYSA9IGQzX2dlb19jYXJ0ZXNpYW4oYSksIHBiID0gZDNfZ2VvX2NhcnRlc2lhbihiKTtcclxuICAgICAgdmFyIG4xID0gWyAxLCAwLCAwIF0sIG4yID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKHBhLCBwYiksIG4ybjIgPSBkM19nZW9fY2FydGVzaWFuRG90KG4yLCBuMiksIG4xbjIgPSBuMlswXSwgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7XHJcbiAgICAgIGlmICghZGV0ZXJtaW5hbnQpIHJldHVybiAhdHdvICYmIGE7XHJcbiAgICAgIHZhciBjMSA9IGNyICogbjJuMiAvIGRldGVybWluYW50LCBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwgbjF4bjIgPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MobjEsIG4yKSwgQSA9IGQzX2dlb19jYXJ0ZXNpYW5TY2FsZShuMSwgYzEpLCBCID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKG4yLCBjMik7XHJcbiAgICAgIGQzX2dlb19jYXJ0ZXNpYW5BZGQoQSwgQik7XHJcbiAgICAgIHZhciB1ID0gbjF4bjIsIHcgPSBkM19nZW9fY2FydGVzaWFuRG90KEEsIHUpLCB1dSA9IGQzX2dlb19jYXJ0ZXNpYW5Eb3QodSwgdSksIHQyID0gdyAqIHcgLSB1dSAqIChkM19nZW9fY2FydGVzaWFuRG90KEEsIEEpIC0gMSk7XHJcbiAgICAgIGlmICh0MiA8IDApIHJldHVybjtcclxuICAgICAgdmFyIHQgPSBNYXRoLnNxcnQodDIpLCBxID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHUsICgtdyAtIHQpIC8gdXUpO1xyXG4gICAgICBkM19nZW9fY2FydGVzaWFuQWRkKHEsIEEpO1xyXG4gICAgICBxID0gZDNfZ2VvX3NwaGVyaWNhbChxKTtcclxuICAgICAgaWYgKCF0d28pIHJldHVybiBxO1xyXG4gICAgICB2YXIgzrswID0gYVswXSwgzrsxID0gYlswXSwgz4YwID0gYVsxXSwgz4YxID0gYlsxXSwgejtcclxuICAgICAgaWYgKM67MSA8IM67MCkgeiA9IM67MCwgzrswID0gzrsxLCDOuzEgPSB6O1xyXG4gICAgICB2YXIgzrTOuyA9IM67MSAtIM67MCwgcG9sYXIgPSBhYnMozrTOuyAtIM+AKSA8IM61LCBtZXJpZGlhbiA9IHBvbGFyIHx8IM60zrsgPCDOtTtcclxuICAgICAgaWYgKCFwb2xhciAmJiDPhjEgPCDPhjApIHogPSDPhjAsIM+GMCA9IM+GMSwgz4YxID0gejtcclxuICAgICAgaWYgKG1lcmlkaWFuID8gcG9sYXIgPyDPhjAgKyDPhjEgPiAwIF4gcVsxXSA8IChhYnMocVswXSAtIM67MCkgPCDOtSA/IM+GMCA6IM+GMSkgOiDPhjAgPD0gcVsxXSAmJiBxWzFdIDw9IM+GMSA6IM60zrsgPiDPgCBeICjOuzAgPD0gcVswXSAmJiBxWzBdIDw9IM67MSkpIHtcclxuICAgICAgICB2YXIgcTEgPSBkM19nZW9fY2FydGVzaWFuU2NhbGUodSwgKC13ICsgdCkgLyB1dSk7XHJcbiAgICAgICAgZDNfZ2VvX2NhcnRlc2lhbkFkZChxMSwgQSk7XHJcbiAgICAgICAgcmV0dXJuIFsgcSwgZDNfZ2VvX3NwaGVyaWNhbChxMSkgXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY29kZSjOuywgz4YpIHtcclxuICAgICAgdmFyIHIgPSBzbWFsbFJhZGl1cyA/IHJhZGl1cyA6IM+AIC0gcmFkaXVzLCBjb2RlID0gMDtcclxuICAgICAgaWYgKM67IDwgLXIpIGNvZGUgfD0gMTsgZWxzZSBpZiAozrsgPiByKSBjb2RlIHw9IDI7XHJcbiAgICAgIGlmICjPhiA8IC1yKSBjb2RlIHw9IDQ7IGVsc2UgaWYgKM+GID4gcikgY29kZSB8PSA4O1xyXG4gICAgICByZXR1cm4gY29kZTtcclxuICAgIH1cclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV9jbGlwTGluZSh4MCwgeTAsIHgxLCB5MSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGxpbmUpIHtcclxuICAgICAgdmFyIGEgPSBsaW5lLmEsIGIgPSBsaW5lLmIsIGF4ID0gYS54LCBheSA9IGEueSwgYnggPSBiLngsIGJ5ID0gYi55LCB0MCA9IDAsIHQxID0gMSwgZHggPSBieCAtIGF4LCBkeSA9IGJ5IC0gYXksIHI7XHJcbiAgICAgIHIgPSB4MCAtIGF4O1xyXG4gICAgICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47XHJcbiAgICAgIHIgLz0gZHg7XHJcbiAgICAgIGlmIChkeCA8IDApIHtcclxuICAgICAgICBpZiAociA8IHQwKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByO1xyXG4gICAgICB9IGVsc2UgaWYgKGR4ID4gMCkge1xyXG4gICAgICAgIGlmIChyID4gdDEpIHJldHVybjtcclxuICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7XHJcbiAgICAgIH1cclxuICAgICAgciA9IHgxIC0gYXg7XHJcbiAgICAgIGlmICghZHggJiYgciA8IDApIHJldHVybjtcclxuICAgICAgciAvPSBkeDtcclxuICAgICAgaWYgKGR4IDwgMCkge1xyXG4gICAgICAgIGlmIChyID4gdDEpIHJldHVybjtcclxuICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7XHJcbiAgICAgIH0gZWxzZSBpZiAoZHggPiAwKSB7XHJcbiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjtcclxuICAgICAgfVxyXG4gICAgICByID0geTAgLSBheTtcclxuICAgICAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuO1xyXG4gICAgICByIC89IGR5O1xyXG4gICAgICBpZiAoZHkgPCAwKSB7XHJcbiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjtcclxuICAgICAgfSBlbHNlIGlmIChkeSA+IDApIHtcclxuICAgICAgICBpZiAociA+IHQxKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByO1xyXG4gICAgICB9XHJcbiAgICAgIHIgPSB5MSAtIGF5O1xyXG4gICAgICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47XHJcbiAgICAgIHIgLz0gZHk7XHJcbiAgICAgIGlmIChkeSA8IDApIHtcclxuICAgICAgICBpZiAociA+IHQxKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByO1xyXG4gICAgICB9IGVsc2UgaWYgKGR5ID4gMCkge1xyXG4gICAgICAgIGlmIChyIDwgdDApIHJldHVybjtcclxuICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHQwID4gMCkgbGluZS5hID0ge1xyXG4gICAgICAgIHg6IGF4ICsgdDAgKiBkeCxcclxuICAgICAgICB5OiBheSArIHQwICogZHlcclxuICAgICAgfTtcclxuICAgICAgaWYgKHQxIDwgMSkgbGluZS5iID0ge1xyXG4gICAgICAgIHg6IGF4ICsgdDEgKiBkeCxcclxuICAgICAgICB5OiBheSArIHQxICogZHlcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9O1xyXG4gIH1cclxuICB2YXIgZDNfZ2VvX2NsaXBFeHRlbnRNQVggPSAxZTk7XHJcbiAgZDMuZ2VvLmNsaXBFeHRlbnQgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciB4MCwgeTAsIHgxLCB5MSwgc3RyZWFtLCBjbGlwLCBjbGlwRXh0ZW50ID0ge1xyXG4gICAgICBzdHJlYW06IGZ1bmN0aW9uKG91dHB1dCkge1xyXG4gICAgICAgIGlmIChzdHJlYW0pIHN0cmVhbS52YWxpZCA9IGZhbHNlO1xyXG4gICAgICAgIHN0cmVhbSA9IGNsaXAob3V0cHV0KTtcclxuICAgICAgICBzdHJlYW0udmFsaWQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBzdHJlYW07XHJcbiAgICAgIH0sXHJcbiAgICAgIGV4dGVudDogZnVuY3Rpb24oXykge1xyXG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgWyB4MCwgeTAgXSwgWyB4MSwgeTEgXSBdO1xyXG4gICAgICAgIGNsaXAgPSBkM19nZW9fY2xpcEV4dGVudCh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdKTtcclxuICAgICAgICBpZiAoc3RyZWFtKSBzdHJlYW0udmFsaWQgPSBmYWxzZSwgc3RyZWFtID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gY2xpcEV4dGVudDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBjbGlwRXh0ZW50LmV4dGVudChbIFsgMCwgMCBdLCBbIDk2MCwgNTAwIF0gXSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fY2xpcEV4dGVudCh4MCwgeTAsIHgxLCB5MSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGxpc3RlbmVyKSB7XHJcbiAgICAgIHZhciBsaXN0ZW5lcl8gPSBsaXN0ZW5lciwgYnVmZmVyTGlzdGVuZXIgPSBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCksIGNsaXBMaW5lID0gZDNfZ2VvbV9jbGlwTGluZSh4MCwgeTAsIHgxLCB5MSksIHNlZ21lbnRzLCBwb2x5Z29uLCByaW5nO1xyXG4gICAgICB2YXIgY2xpcCA9IHtcclxuICAgICAgICBwb2ludDogcG9pbnQsXHJcbiAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXHJcbiAgICAgICAgbGluZUVuZDogbGluZUVuZCxcclxuICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgbGlzdGVuZXIgPSBidWZmZXJMaXN0ZW5lcjtcclxuICAgICAgICAgIHNlZ21lbnRzID0gW107XHJcbiAgICAgICAgICBwb2x5Z29uID0gW107XHJcbiAgICAgICAgICBjbGVhbiA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJfO1xyXG4gICAgICAgICAgc2VnbWVudHMgPSBkMy5tZXJnZShzZWdtZW50cyk7XHJcbiAgICAgICAgICB2YXIgY2xpcFN0YXJ0SW5zaWRlID0gaW5zaWRlUG9seWdvbihbIHgwLCB5MSBdKSwgaW5zaWRlID0gY2xlYW4gJiYgY2xpcFN0YXJ0SW5zaWRlLCB2aXNpYmxlID0gc2VnbWVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgaWYgKGluc2lkZSB8fCB2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpO1xyXG4gICAgICAgICAgICBpZiAoaW5zaWRlKSB7XHJcbiAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgIGQzX2dlb19jbGlwUG9seWdvbihzZWdtZW50cywgY29tcGFyZSwgY2xpcFN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25FbmQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNlZ21lbnRzID0gcG9seWdvbiA9IHJpbmcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZnVuY3Rpb24gaW5zaWRlUG9seWdvbihwKSB7XHJcbiAgICAgICAgdmFyIHduID0gMCwgbiA9IHBvbHlnb24ubGVuZ3RoLCB5ID0gcFsxXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgICAgZm9yICh2YXIgaiA9IDEsIHYgPSBwb2x5Z29uW2ldLCBtID0gdi5sZW5ndGgsIGEgPSB2WzBdLCBiOyBqIDwgbTsgKytqKSB7XHJcbiAgICAgICAgICAgIGIgPSB2W2pdO1xyXG4gICAgICAgICAgICBpZiAoYVsxXSA8PSB5KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGJbMV0gPiB5ICYmIGQzX2Nyb3NzMmQoYSwgYiwgcCkgPiAwKSArK3duO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChiWzFdIDw9IHkgJiYgZDNfY3Jvc3MyZChhLCBiLCBwKSA8IDApIC0td247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYSA9IGI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3biAhPT0gMDtcclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIHZhciBhID0gMCwgYTEgPSAwO1xyXG4gICAgICAgIGlmIChmcm9tID09IG51bGwgfHwgKGEgPSBjb3JuZXIoZnJvbSwgZGlyZWN0aW9uKSkgIT09IChhMSA9IGNvcm5lcih0bywgZGlyZWN0aW9uKSkgfHwgY29tcGFyZVBvaW50cyhmcm9tLCB0bykgPCAwIF4gZGlyZWN0aW9uID4gMCkge1xyXG4gICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBsaXN0ZW5lci5wb2ludChhID09PSAwIHx8IGEgPT09IDMgPyB4MCA6IHgxLCBhID4gMSA/IHkxIDogeTApO1xyXG4gICAgICAgICAgfSB3aGlsZSAoKGEgPSAoYSArIGRpcmVjdGlvbiArIDQpICUgNCkgIT09IGExKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGlzdGVuZXIucG9pbnQodG9bMF0sIHRvWzFdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gcG9pbnRWaXNpYmxlKHgsIHkpIHtcclxuICAgICAgICByZXR1cm4geDAgPD0geCAmJiB4IDw9IHgxICYmIHkwIDw9IHkgJiYgeSA8PSB5MTtcclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7XHJcbiAgICAgICAgaWYgKHBvaW50VmlzaWJsZSh4LCB5KSkgbGlzdGVuZXIucG9pbnQoeCwgeSk7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHhfXywgeV9fLCB2X18sIHhfLCB5Xywgdl8sIGZpcnN0LCBjbGVhbjtcclxuICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xyXG4gICAgICAgIGNsaXAucG9pbnQgPSBsaW5lUG9pbnQ7XHJcbiAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb24ucHVzaChyaW5nID0gW10pO1xyXG4gICAgICAgIGZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICB2XyA9IGZhbHNlO1xyXG4gICAgICAgIHhfID0geV8gPSBOYU47XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcclxuICAgICAgICBpZiAoc2VnbWVudHMpIHtcclxuICAgICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7XHJcbiAgICAgICAgICBpZiAodl9fICYmIHZfKSBidWZmZXJMaXN0ZW5lci5yZWpvaW4oKTtcclxuICAgICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyTGlzdGVuZXIuYnVmZmVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7XHJcbiAgICAgICAgaWYgKHZfKSBsaXN0ZW5lci5saW5lRW5kKCk7XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gbGluZVBvaW50KHgsIHkpIHtcclxuICAgICAgICB4ID0gTWF0aC5tYXgoLWQzX2dlb19jbGlwRXh0ZW50TUFYLCBNYXRoLm1pbihkM19nZW9fY2xpcEV4dGVudE1BWCwgeCkpO1xyXG4gICAgICAgIHkgPSBNYXRoLm1heCgtZDNfZ2VvX2NsaXBFeHRlbnRNQVgsIE1hdGgubWluKGQzX2dlb19jbGlwRXh0ZW50TUFYLCB5KSk7XHJcbiAgICAgICAgdmFyIHYgPSBwb2ludFZpc2libGUoeCwgeSk7XHJcbiAgICAgICAgaWYgKHBvbHlnb24pIHJpbmcucHVzaChbIHgsIHkgXSk7XHJcbiAgICAgICAgaWYgKGZpcnN0KSB7XHJcbiAgICAgICAgICB4X18gPSB4LCB5X18gPSB5LCB2X18gPSB2O1xyXG4gICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xyXG4gICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh4LCB5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHYgJiYgdl8pIGxpc3RlbmVyLnBvaW50KHgsIHkpOyBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGwgPSB7XHJcbiAgICAgICAgICAgICAgYToge1xyXG4gICAgICAgICAgICAgICAgeDogeF8sXHJcbiAgICAgICAgICAgICAgICB5OiB5X1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgYjoge1xyXG4gICAgICAgICAgICAgICAgeDogeCxcclxuICAgICAgICAgICAgICAgIHk6IHlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChjbGlwTGluZShsKSkge1xyXG4gICAgICAgICAgICAgIGlmICghdl8pIHtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQobC5hLngsIGwuYS55KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQobC5iLngsIGwuYi55KTtcclxuICAgICAgICAgICAgICBpZiAoIXYpIGxpc3RlbmVyLmxpbmVFbmQoKTtcclxuICAgICAgICAgICAgICBjbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYpIHtcclxuICAgICAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcclxuICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh4LCB5KTtcclxuICAgICAgICAgICAgICBjbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNsaXA7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gY29ybmVyKHAsIGRpcmVjdGlvbikge1xyXG4gICAgICByZXR1cm4gYWJzKHBbMF0gLSB4MCkgPCDOtSA/IGRpcmVjdGlvbiA+IDAgPyAwIDogMyA6IGFicyhwWzBdIC0geDEpIDwgzrUgPyBkaXJlY3Rpb24gPiAwID8gMiA6IDEgOiBhYnMocFsxXSAtIHkwKSA8IM61ID8gZGlyZWN0aW9uID4gMCA/IDEgOiAwIDogZGlyZWN0aW9uID4gMCA/IDMgOiAyO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XHJcbiAgICAgIHJldHVybiBjb21wYXJlUG9pbnRzKGEueCwgYi54KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGNvbXBhcmVQb2ludHMoYSwgYikge1xyXG4gICAgICB2YXIgY2EgPSBjb3JuZXIoYSwgMSksIGNiID0gY29ybmVyKGIsIDEpO1xyXG4gICAgICByZXR1cm4gY2EgIT09IGNiID8gY2EgLSBjYiA6IGNhID09PSAwID8gYlsxXSAtIGFbMV0gOiBjYSA9PT0gMSA/IGFbMF0gLSBiWzBdIDogY2EgPT09IDIgPyBhWzFdIC0gYlsxXSA6IGJbMF0gLSBhWzBdO1xyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY29uaWMocHJvamVjdEF0KSB7XHJcbiAgICB2YXIgz4YwID0gMCwgz4YxID0gz4AgLyAzLCBtID0gZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCksIHAgPSBtKM+GMCwgz4YxKTtcclxuICAgIHAucGFyYWxsZWxzID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIM+GMCAvIM+AICogMTgwLCDPhjEgLyDPgCAqIDE4MCBdO1xyXG4gICAgICByZXR1cm4gbSjPhjAgPSBfWzBdICogz4AgLyAxODAsIM+GMSA9IF9bMV0gKiDPgCAvIDE4MCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHA7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19jb25pY0VxdWFsQXJlYSjPhjAsIM+GMSkge1xyXG4gICAgdmFyIHNpbs+GMCA9IE1hdGguc2luKM+GMCksIG4gPSAoc2luz4YwICsgTWF0aC5zaW4oz4YxKSkgLyAyLCBDID0gMSArIHNpbs+GMCAqICgyICogbiAtIHNpbs+GMCksIM+BMCA9IE1hdGguc3FydChDKSAvIG47XHJcbiAgICBmdW5jdGlvbiBmb3J3YXJkKM67LCDPhikge1xyXG4gICAgICB2YXIgz4EgPSBNYXRoLnNxcnQoQyAtIDIgKiBuICogTWF0aC5zaW4oz4YpKSAvIG47XHJcbiAgICAgIHJldHVybiBbIM+BICogTWF0aC5zaW4ozrsgKj0gbiksIM+BMCAtIM+BICogTWF0aC5jb3MozrspIF07XHJcbiAgICB9XHJcbiAgICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgdmFyIM+BMF95ID0gz4EwIC0geTtcclxuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih4LCDPgTBfeSkgLyBuLCBkM19hc2luKChDIC0gKHggKiB4ICsgz4EwX3kgKiDPgTBfeSkgKiBuICogbikgLyAoMiAqIG4pKSBdO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBmb3J3YXJkO1xyXG4gIH1cclxuICAoZDMuZ2VvLmNvbmljRXF1YWxBcmVhID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfZ2VvX2NvbmljKGQzX2dlb19jb25pY0VxdWFsQXJlYSk7XHJcbiAgfSkucmF3ID0gZDNfZ2VvX2NvbmljRXF1YWxBcmVhO1xyXG4gIGQzLmdlby5hbGJlcnMgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkMy5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWyA5NiwgMCBdKS5jZW50ZXIoWyAtLjYsIDM4LjcgXSkucGFyYWxsZWxzKFsgMjkuNSwgNDUuNSBdKS5zY2FsZSgxMDcwKTtcclxuICB9O1xyXG4gIGQzLmdlby5hbGJlcnNVc2EgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBsb3dlcjQ4ID0gZDMuZ2VvLmFsYmVycygpO1xyXG4gICAgdmFyIGFsYXNrYSA9IGQzLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbIDE1NCwgMCBdKS5jZW50ZXIoWyAtMiwgNTguNSBdKS5wYXJhbGxlbHMoWyA1NSwgNjUgXSk7XHJcbiAgICB2YXIgaGF3YWlpID0gZDMuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsgMTU3LCAwIF0pLmNlbnRlcihbIC0zLCAxOS45IF0pLnBhcmFsbGVscyhbIDgsIDE4IF0pO1xyXG4gICAgdmFyIHBvaW50LCBwb2ludFN0cmVhbSA9IHtcclxuICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgICBwb2ludCA9IFsgeCwgeSBdO1xyXG4gICAgICB9XHJcbiAgICB9LCBsb3dlcjQ4UG9pbnQsIGFsYXNrYVBvaW50LCBoYXdhaWlQb2ludDtcclxuICAgIGZ1bmN0aW9uIGFsYmVyc1VzYShjb29yZGluYXRlcykge1xyXG4gICAgICB2YXIgeCA9IGNvb3JkaW5hdGVzWzBdLCB5ID0gY29vcmRpbmF0ZXNbMV07XHJcbiAgICAgIHBvaW50ID0gbnVsbDtcclxuICAgICAgKGxvd2VyNDhQb2ludCh4LCB5KSwgcG9pbnQpIHx8IChhbGFza2FQb2ludCh4LCB5KSwgcG9pbnQpIHx8IGhhd2FpaVBvaW50KHgsIHkpO1xyXG4gICAgICByZXR1cm4gcG9pbnQ7XHJcbiAgICB9XHJcbiAgICBhbGJlcnNVc2EuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHtcclxuICAgICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxlKCksIHQgPSBsb3dlcjQ4LnRyYW5zbGF0ZSgpLCB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdFswXSkgLyBrLCB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdFsxXSkgLyBrO1xyXG4gICAgICByZXR1cm4gKHkgPj0gLjEyICYmIHkgPCAuMjM0ICYmIHggPj0gLS40MjUgJiYgeCA8IC0uMjE0ID8gYWxhc2thIDogeSA+PSAuMTY2ICYmIHkgPCAuMjM0ICYmIHggPj0gLS4yMTQgJiYgeCA8IC0uMTE1ID8gaGF3YWlpIDogbG93ZXI0OCkuaW52ZXJ0KGNvb3JkaW5hdGVzKTtcclxuICAgIH07XHJcbiAgICBhbGJlcnNVc2Euc3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XHJcbiAgICAgIHZhciBsb3dlcjQ4U3RyZWFtID0gbG93ZXI0OC5zdHJlYW0oc3RyZWFtKSwgYWxhc2thU3RyZWFtID0gYWxhc2thLnN0cmVhbShzdHJlYW0pLCBoYXdhaWlTdHJlYW0gPSBoYXdhaWkuc3RyZWFtKHN0cmVhbSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgICAgIGxvd2VyNDhTdHJlYW0ucG9pbnQoeCwgeSk7XHJcbiAgICAgICAgICBhbGFza2FTdHJlYW0ucG9pbnQoeCwgeSk7XHJcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ucG9pbnQoeCwgeSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgbG93ZXI0OFN0cmVhbS5zcGhlcmUoKTtcclxuICAgICAgICAgIGFsYXNrYVN0cmVhbS5zcGhlcmUoKTtcclxuICAgICAgICAgIGhhd2FpaVN0cmVhbS5zcGhlcmUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBsb3dlcjQ4U3RyZWFtLmxpbmVTdGFydCgpO1xyXG4gICAgICAgICAgYWxhc2thU3RyZWFtLmxpbmVTdGFydCgpO1xyXG4gICAgICAgICAgaGF3YWlpU3RyZWFtLmxpbmVTdGFydCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBsb3dlcjQ4U3RyZWFtLmxpbmVFbmQoKTtcclxuICAgICAgICAgIGFsYXNrYVN0cmVhbS5saW5lRW5kKCk7XHJcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ubGluZUVuZCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIGxvd2VyNDhTdHJlYW0ucG9seWdvblN0YXJ0KCk7XHJcbiAgICAgICAgICBhbGFza2FTdHJlYW0ucG9seWdvblN0YXJ0KCk7XHJcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ucG9seWdvblN0YXJ0KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIGxvd2VyNDhTdHJlYW0ucG9seWdvbkVuZCgpO1xyXG4gICAgICAgICAgYWxhc2thU3RyZWFtLnBvbHlnb25FbmQoKTtcclxuICAgICAgICAgIGhhd2FpaVN0cmVhbS5wb2x5Z29uRW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICAgIGFsYmVyc1VzYS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDgucHJlY2lzaW9uKCk7XHJcbiAgICAgIGxvd2VyNDgucHJlY2lzaW9uKF8pO1xyXG4gICAgICBhbGFza2EucHJlY2lzaW9uKF8pO1xyXG4gICAgICBoYXdhaWkucHJlY2lzaW9uKF8pO1xyXG4gICAgICByZXR1cm4gYWxiZXJzVXNhO1xyXG4gICAgfTtcclxuICAgIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC5zY2FsZSgpO1xyXG4gICAgICBsb3dlcjQ4LnNjYWxlKF8pO1xyXG4gICAgICBhbGFza2Euc2NhbGUoXyAqIC4zNSk7XHJcbiAgICAgIGhhd2FpaS5zY2FsZShfKTtcclxuICAgICAgcmV0dXJuIGFsYmVyc1VzYS50cmFuc2xhdGUobG93ZXI0OC50cmFuc2xhdGUoKSk7XHJcbiAgICB9O1xyXG4gICAgYWxiZXJzVXNhLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTtcclxuICAgICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxlKCksIHggPSArX1swXSwgeSA9ICtfWzFdO1xyXG4gICAgICBsb3dlcjQ4UG9pbnQgPSBsb3dlcjQ4LnRyYW5zbGF0ZShfKS5jbGlwRXh0ZW50KFsgWyB4IC0gLjQ1NSAqIGssIHkgLSAuMjM4ICogayBdLCBbIHggKyAuNDU1ICogaywgeSArIC4yMzggKiBrIF0gXSkuc3RyZWFtKHBvaW50U3RyZWFtKS5wb2ludDtcclxuICAgICAgYWxhc2thUG9pbnQgPSBhbGFza2EudHJhbnNsYXRlKFsgeCAtIC4zMDcgKiBrLCB5ICsgLjIwMSAqIGsgXSkuY2xpcEV4dGVudChbIFsgeCAtIC40MjUgKiBrICsgzrUsIHkgKyAuMTIgKiBrICsgzrUgXSwgWyB4IC0gLjIxNCAqIGsgLSDOtSwgeSArIC4yMzQgKiBrIC0gzrUgXSBdKS5zdHJlYW0ocG9pbnRTdHJlYW0pLnBvaW50O1xyXG4gICAgICBoYXdhaWlQb2ludCA9IGhhd2FpaS50cmFuc2xhdGUoWyB4IC0gLjIwNSAqIGssIHkgKyAuMjEyICogayBdKS5jbGlwRXh0ZW50KFsgWyB4IC0gLjIxNCAqIGsgKyDOtSwgeSArIC4xNjYgKiBrICsgzrUgXSwgWyB4IC0gLjExNSAqIGsgLSDOtSwgeSArIC4yMzQgKiBrIC0gzrUgXSBdKS5zdHJlYW0ocG9pbnRTdHJlYW0pLnBvaW50O1xyXG4gICAgICByZXR1cm4gYWxiZXJzVXNhO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBhbGJlcnNVc2Euc2NhbGUoMTA3MCk7XHJcbiAgfTtcclxuICB2YXIgZDNfZ2VvX3BhdGhBcmVhU3VtLCBkM19nZW9fcGF0aEFyZWFQb2x5Z29uLCBkM19nZW9fcGF0aEFyZWEgPSB7XHJcbiAgICBwb2ludDogZDNfbm9vcCxcclxuICAgIGxpbmVTdGFydDogZDNfbm9vcCxcclxuICAgIGxpbmVFbmQ6IGQzX25vb3AsXHJcbiAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM19nZW9fcGF0aEFyZWFQb2x5Z29uID0gMDtcclxuICAgICAgZDNfZ2VvX3BhdGhBcmVhLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQXJlYVJpbmdTdGFydDtcclxuICAgIH0sXHJcbiAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgZDNfZ2VvX3BhdGhBcmVhLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQXJlYS5saW5lRW5kID0gZDNfZ2VvX3BhdGhBcmVhLnBvaW50ID0gZDNfbm9vcDtcclxuICAgICAgZDNfZ2VvX3BhdGhBcmVhU3VtICs9IGFicyhkM19nZW9fcGF0aEFyZWFQb2x5Z29uIC8gMik7XHJcbiAgICB9XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fcGF0aEFyZWFSaW5nU3RhcnQoKSB7XHJcbiAgICB2YXIgeDAwLCB5MDAsIHgwLCB5MDtcclxuICAgIGQzX2dlb19wYXRoQXJlYS5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgZDNfZ2VvX3BhdGhBcmVhLnBvaW50ID0gbmV4dFBvaW50O1xyXG4gICAgICB4MDAgPSB4MCA9IHgsIHkwMCA9IHkwID0geTtcclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQoeCwgeSkge1xyXG4gICAgICBkM19nZW9fcGF0aEFyZWFQb2x5Z29uICs9IHkwICogeCAtIHgwICogeTtcclxuICAgICAgeDAgPSB4LCB5MCA9IHk7XHJcbiAgICB9XHJcbiAgICBkM19nZW9fcGF0aEFyZWEubGluZUVuZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICBuZXh0UG9pbnQoeDAwLCB5MDApO1xyXG4gICAgfTtcclxuICB9XHJcbiAgdmFyIGQzX2dlb19wYXRoQm91bmRzWDAsIGQzX2dlb19wYXRoQm91bmRzWTAsIGQzX2dlb19wYXRoQm91bmRzWDEsIGQzX2dlb19wYXRoQm91bmRzWTE7XHJcbiAgdmFyIGQzX2dlb19wYXRoQm91bmRzID0ge1xyXG4gICAgcG9pbnQ6IGQzX2dlb19wYXRoQm91bmRzUG9pbnQsXHJcbiAgICBsaW5lU3RhcnQ6IGQzX25vb3AsXHJcbiAgICBsaW5lRW5kOiBkM19ub29wLFxyXG4gICAgcG9seWdvblN0YXJ0OiBkM19ub29wLFxyXG4gICAgcG9seWdvbkVuZDogZDNfbm9vcFxyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhCb3VuZHNQb2ludCh4LCB5KSB7XHJcbiAgICBpZiAoeCA8IGQzX2dlb19wYXRoQm91bmRzWDApIGQzX2dlb19wYXRoQm91bmRzWDAgPSB4O1xyXG4gICAgaWYgKHggPiBkM19nZW9fcGF0aEJvdW5kc1gxKSBkM19nZW9fcGF0aEJvdW5kc1gxID0geDtcclxuICAgIGlmICh5IDwgZDNfZ2VvX3BhdGhCb3VuZHNZMCkgZDNfZ2VvX3BhdGhCb3VuZHNZMCA9IHk7XHJcbiAgICBpZiAoeSA+IGQzX2dlb19wYXRoQm91bmRzWTEpIGQzX2dlb19wYXRoQm91bmRzWTEgPSB5O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fcGF0aEJ1ZmZlcigpIHtcclxuICAgIHZhciBwb2ludENpcmNsZSA9IGQzX2dlb19wYXRoQnVmZmVyQ2lyY2xlKDQuNSksIGJ1ZmZlciA9IFtdO1xyXG4gICAgdmFyIHN0cmVhbSA9IHtcclxuICAgICAgcG9pbnQ6IHBvaW50LFxyXG4gICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZVN0YXJ0O1xyXG4gICAgICB9LFxyXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxyXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZFBvbHlnb247XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZDtcclxuICAgICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludDtcclxuICAgICAgfSxcclxuICAgICAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgICBwb2ludENpcmNsZSA9IGQzX2dlb19wYXRoQnVmZmVyQ2lyY2xlKF8pO1xyXG4gICAgICAgIHJldHVybiBzdHJlYW07XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc3VsdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHtcclxuICAgICAgICAgIHZhciByZXN1bHQgPSBidWZmZXIuam9pbihcIlwiKTtcclxuICAgICAgICAgIGJ1ZmZlciA9IFtdO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7XHJcbiAgICAgIGJ1ZmZlci5wdXNoKFwiTVwiLCB4LCBcIixcIiwgeSwgcG9pbnRDaXJjbGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcG9pbnRMaW5lU3RhcnQoeCwgeSkge1xyXG4gICAgICBidWZmZXIucHVzaChcIk1cIiwgeCwgXCIsXCIsIHkpO1xyXG4gICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludExpbmU7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBwb2ludExpbmUoeCwgeSkge1xyXG4gICAgICBidWZmZXIucHVzaChcIkxcIiwgeCwgXCIsXCIsIHkpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcclxuICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBsaW5lRW5kUG9seWdvbigpIHtcclxuICAgICAgYnVmZmVyLnB1c2goXCJaXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cmVhbTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhCdWZmZXJDaXJjbGUocmFkaXVzKSB7XHJcbiAgICByZXR1cm4gXCJtMCxcIiArIHJhZGl1cyArIFwiYVwiICsgcmFkaXVzICsgXCIsXCIgKyByYWRpdXMgKyBcIiAwIDEsMSAwLFwiICsgLTIgKiByYWRpdXMgKyBcImFcIiArIHJhZGl1cyArIFwiLFwiICsgcmFkaXVzICsgXCIgMCAxLDEgMCxcIiArIDIgKiByYWRpdXMgKyBcInpcIjtcclxuICB9XHJcbiAgdmFyIGQzX2dlb19wYXRoQ2VudHJvaWQgPSB7XHJcbiAgICBwb2ludDogZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50LFxyXG4gICAgbGluZVN0YXJ0OiBkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0LFxyXG4gICAgbGluZUVuZDogZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVFbmQsXHJcbiAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQ2VudHJvaWRSaW5nU3RhcnQ7XHJcbiAgICB9LFxyXG4gICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQ7XHJcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVTdGFydDtcclxuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lRW5kID0gZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVFbmQ7XHJcbiAgICB9XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeCwgeSkge1xyXG4gICAgZDNfZ2VvX2NlbnRyb2lkWDAgKz0geDtcclxuICAgIGQzX2dlb19jZW50cm9pZFkwICs9IHk7XHJcbiAgICArK2QzX2dlb19jZW50cm9pZFowO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0KCkge1xyXG4gICAgdmFyIHgwLCB5MDtcclxuICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbih4LCB5KSB7XHJcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBuZXh0UG9pbnQ7XHJcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4MCA9IHgsIHkwID0geSk7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gbmV4dFBvaW50KHgsIHkpIHtcclxuICAgICAgdmFyIGR4ID0geCAtIHgwLCBkeSA9IHkgLSB5MCwgeiA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XHJcbiAgICAgIGQzX2dlb19jZW50cm9pZFgxICs9IHogKiAoeDAgKyB4KSAvIDI7XHJcbiAgICAgIGQzX2dlb19jZW50cm9pZFkxICs9IHogKiAoeTAgKyB5KSAvIDI7XHJcbiAgICAgIGQzX2dlb19jZW50cm9pZFoxICs9IHo7XHJcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4MCA9IHgsIHkwID0geSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lRW5kKCkge1xyXG4gICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludDtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhDZW50cm9pZFJpbmdTdGFydCgpIHtcclxuICAgIHZhciB4MDAsIHkwMCwgeDAsIHkwO1xyXG4gICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDtcclxuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50KHgwMCA9IHgwID0geCwgeTAwID0geTAgPSB5KTtcclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQoeCwgeSkge1xyXG4gICAgICB2YXIgZHggPSB4IC0geDAsIGR5ID0geSAtIHkwLCB6ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkWDEgKz0geiAqICh4MCArIHgpIC8gMjtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0geiAqICh5MCArIHkpIC8gMjtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkWjEgKz0gejtcclxuICAgICAgeiA9IHkwICogeCAtIHgwICogeTtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkWDIgKz0geiAqICh4MCArIHgpO1xyXG4gICAgICBkM19nZW9fY2VudHJvaWRZMiArPSB6ICogKHkwICsgeSk7XHJcbiAgICAgIGQzX2dlb19jZW50cm9pZFoyICs9IHogKiAzO1xyXG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeDAgPSB4LCB5MCA9IHkpO1xyXG4gICAgfVxyXG4gICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lRW5kID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIG5leHRQb2ludCh4MDAsIHkwMCk7XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fcGF0aENvbnRleHQoY29udGV4dCkge1xyXG4gICAgdmFyIHBvaW50UmFkaXVzID0gNC41O1xyXG4gICAgdmFyIHN0cmVhbSA9IHtcclxuICAgICAgcG9pbnQ6IHBvaW50LFxyXG4gICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZVN0YXJ0O1xyXG4gICAgICB9LFxyXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxyXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZFBvbHlnb247XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZDtcclxuICAgICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludDtcclxuICAgICAgfSxcclxuICAgICAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgICBwb2ludFJhZGl1cyA9IF87XHJcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcclxuICAgICAgfSxcclxuICAgICAgcmVzdWx0OiBkM19ub29wXHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xyXG4gICAgICBjb250ZXh0Lm1vdmVUbyh4ICsgcG9pbnRSYWRpdXMsIHkpO1xyXG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCBwb2ludFJhZGl1cywgMCwgz4QpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcG9pbnRMaW5lU3RhcnQoeCwgeSkge1xyXG4gICAgICBjb250ZXh0Lm1vdmVUbyh4LCB5KTtcclxuICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnRMaW5lO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcG9pbnRMaW5lKHgsIHkpIHtcclxuICAgICAgY29udGV4dC5saW5lVG8oeCwgeSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xyXG4gICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGxpbmVFbmRQb2x5Z29uKCkge1xyXG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cmVhbTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3Jlc2FtcGxlKHByb2plY3QpIHtcclxuICAgIHZhciDOtDIgPSAuNSwgY29zTWluRGlzdGFuY2UgPSBNYXRoLmNvcygzMCAqIGQzX3JhZGlhbnMpLCBtYXhEZXB0aCA9IDE2O1xyXG4gICAgZnVuY3Rpb24gcmVzYW1wbGUoc3RyZWFtKSB7XHJcbiAgICAgIHJldHVybiAobWF4RGVwdGggPyByZXNhbXBsZVJlY3Vyc2l2ZSA6IHJlc2FtcGxlTm9uZSkoc3RyZWFtKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlc2FtcGxlTm9uZShzdHJlYW0pIHtcclxuICAgICAgcmV0dXJuIGQzX2dlb190cmFuc2Zvcm1Qb2ludChzdHJlYW0sIGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgICB4ID0gcHJvamVjdCh4LCB5KTtcclxuICAgICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVzYW1wbGVSZWN1cnNpdmUoc3RyZWFtKSB7XHJcbiAgICAgIHZhciDOuzAwLCDPhjAwLCB4MDAsIHkwMCwgYTAwLCBiMDAsIGMwMCwgzrswLCB4MCwgeTAsIGEwLCBiMCwgYzA7XHJcbiAgICAgIHZhciByZXNhbXBsZSA9IHtcclxuICAgICAgICBwb2ludDogcG9pbnQsXHJcbiAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXHJcbiAgICAgICAgbGluZUVuZDogbGluZUVuZCxcclxuICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpO1xyXG4gICAgICAgICAgcmVzYW1wbGUubGluZVN0YXJ0ID0gcmluZ1N0YXJ0O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBzdHJlYW0ucG9seWdvbkVuZCgpO1xyXG4gICAgICAgICAgcmVzYW1wbGUubGluZVN0YXJ0ID0gbGluZVN0YXJ0O1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xyXG4gICAgICAgIHggPSBwcm9qZWN0KHgsIHkpO1xyXG4gICAgICAgIHN0cmVhbS5wb2ludCh4WzBdLCB4WzFdKTtcclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XHJcbiAgICAgICAgeDAgPSBOYU47XHJcbiAgICAgICAgcmVzYW1wbGUucG9pbnQgPSBsaW5lUG9pbnQ7XHJcbiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGZ1bmN0aW9uIGxpbmVQb2ludCjOuywgz4YpIHtcclxuICAgICAgICB2YXIgYyA9IGQzX2dlb19jYXJ0ZXNpYW4oWyDOuywgz4YgXSksIHAgPSBwcm9qZWN0KM67LCDPhik7XHJcbiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgwID0gcFswXSwgeTAgPSBwWzFdLCDOuzAgPSDOuywgYTAgPSBjWzBdLCBiMCA9IGNbMV0sIGMwID0gY1syXSwgbWF4RGVwdGgsIHN0cmVhbSk7XHJcbiAgICAgICAgc3RyZWFtLnBvaW50KHgwLCB5MCk7XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcclxuICAgICAgICByZXNhbXBsZS5wb2ludCA9IHBvaW50O1xyXG4gICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xyXG4gICAgICAgIGxpbmVTdGFydCgpO1xyXG4gICAgICAgIHJlc2FtcGxlLnBvaW50ID0gcmluZ1BvaW50O1xyXG4gICAgICAgIHJlc2FtcGxlLmxpbmVFbmQgPSByaW5nRW5kO1xyXG4gICAgICB9XHJcbiAgICAgIGZ1bmN0aW9uIHJpbmdQb2ludCjOuywgz4YpIHtcclxuICAgICAgICBsaW5lUG9pbnQozrswMCA9IM67LCDPhjAwID0gz4YpLCB4MDAgPSB4MCwgeTAwID0geTAsIGEwMCA9IGEwLCBiMDAgPSBiMCwgYzAwID0gYzA7XHJcbiAgICAgICAgcmVzYW1wbGUucG9pbnQgPSBsaW5lUG9pbnQ7XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcclxuICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIM67MCwgYTAsIGIwLCBjMCwgeDAwLCB5MDAsIM67MDAsIGEwMCwgYjAwLCBjMDAsIG1heERlcHRoLCBzdHJlYW0pO1xyXG4gICAgICAgIHJlc2FtcGxlLmxpbmVFbmQgPSBsaW5lRW5kO1xyXG4gICAgICAgIGxpbmVFbmQoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzYW1wbGU7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIM67MCwgYTAsIGIwLCBjMCwgeDEsIHkxLCDOuzEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pIHtcclxuICAgICAgdmFyIGR4ID0geDEgLSB4MCwgZHkgPSB5MSAtIHkwLCBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xyXG4gICAgICBpZiAoZDIgPiA0ICogzrQyICYmIGRlcHRoLS0pIHtcclxuICAgICAgICB2YXIgYSA9IGEwICsgYTEsIGIgPSBiMCArIGIxLCBjID0gYzAgKyBjMSwgbSA9IE1hdGguc3FydChhICogYSArIGIgKiBiICsgYyAqIGMpLCDPhjIgPSBNYXRoLmFzaW4oYyAvPSBtKSwgzrsyID0gYWJzKGFicyhjKSAtIDEpIDwgzrUgfHwgYWJzKM67MCAtIM67MSkgPCDOtSA/ICjOuzAgKyDOuzEpIC8gMiA6IE1hdGguYXRhbjIoYiwgYSksIHAgPSBwcm9qZWN0KM67Miwgz4YyKSwgeDIgPSBwWzBdLCB5MiA9IHBbMV0sIGR4MiA9IHgyIC0geDAsIGR5MiA9IHkyIC0geTAsIGR6ID0gZHkgKiBkeDIgLSBkeCAqIGR5MjtcclxuICAgICAgICBpZiAoZHogKiBkeiAvIGQyID4gzrQyIHx8IGFicygoZHggKiBkeDIgKyBkeSAqIGR5MikgLyBkMiAtIC41KSA+IC4zIHx8IGEwICogYTEgKyBiMCAqIGIxICsgYzAgKiBjMSA8IGNvc01pbkRpc3RhbmNlKSB7XHJcbiAgICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIM67MCwgYTAsIGIwLCBjMCwgeDIsIHkyLCDOuzIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTtcclxuICAgICAgICAgIHN0cmVhbS5wb2ludCh4MiwgeTIpO1xyXG4gICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDIsIHkyLCDOuzIsIGEsIGIsIGMsIHgxLCB5MSwgzrsxLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJlc2FtcGxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gTWF0aC5zcXJ0KM60Mik7XHJcbiAgICAgIG1heERlcHRoID0gKM60MiA9IF8gKiBfKSA+IDAgJiYgMTY7XHJcbiAgICAgIHJldHVybiByZXNhbXBsZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVzYW1wbGU7XHJcbiAgfVxyXG4gIGQzLmdlby5wYXRoID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgcG9pbnRSYWRpdXMgPSA0LjUsIHByb2plY3Rpb24sIGNvbnRleHQsIHByb2plY3RTdHJlYW0sIGNvbnRleHRTdHJlYW0sIGNhY2hlU3RyZWFtO1xyXG4gICAgZnVuY3Rpb24gcGF0aChvYmplY3QpIHtcclxuICAgICAgaWYgKG9iamVjdCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgPT09IFwiZnVuY3Rpb25cIikgY29udGV4dFN0cmVhbS5wb2ludFJhZGl1cygrcG9pbnRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XHJcbiAgICAgICAgaWYgKCFjYWNoZVN0cmVhbSB8fCAhY2FjaGVTdHJlYW0udmFsaWQpIGNhY2hlU3RyZWFtID0gcHJvamVjdFN0cmVhbShjb250ZXh0U3RyZWFtKTtcclxuICAgICAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgY2FjaGVTdHJlYW0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb250ZXh0U3RyZWFtLnJlc3VsdCgpO1xyXG4gICAgfVxyXG4gICAgcGF0aC5hcmVhID0gZnVuY3Rpb24ob2JqZWN0KSB7XHJcbiAgICAgIGQzX2dlb19wYXRoQXJlYVN1bSA9IDA7XHJcbiAgICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBwcm9qZWN0U3RyZWFtKGQzX2dlb19wYXRoQXJlYSkpO1xyXG4gICAgICByZXR1cm4gZDNfZ2VvX3BhdGhBcmVhU3VtO1xyXG4gICAgfTtcclxuICAgIHBhdGguY2VudHJvaWQgPSBmdW5jdGlvbihvYmplY3QpIHtcclxuICAgICAgZDNfZ2VvX2NlbnRyb2lkWDAgPSBkM19nZW9fY2VudHJvaWRZMCA9IGQzX2dlb19jZW50cm9pZFowID0gZDNfZ2VvX2NlbnRyb2lkWDEgPSBkM19nZW9fY2VudHJvaWRZMSA9IGQzX2dlb19jZW50cm9pZFoxID0gZDNfZ2VvX2NlbnRyb2lkWDIgPSBkM19nZW9fY2VudHJvaWRZMiA9IGQzX2dlb19jZW50cm9pZFoyID0gMDtcclxuICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIHByb2plY3RTdHJlYW0oZDNfZ2VvX3BhdGhDZW50cm9pZCkpO1xyXG4gICAgICByZXR1cm4gZDNfZ2VvX2NlbnRyb2lkWjIgPyBbIGQzX2dlb19jZW50cm9pZFgyIC8gZDNfZ2VvX2NlbnRyb2lkWjIsIGQzX2dlb19jZW50cm9pZFkyIC8gZDNfZ2VvX2NlbnRyb2lkWjIgXSA6IGQzX2dlb19jZW50cm9pZFoxID8gWyBkM19nZW9fY2VudHJvaWRYMSAvIGQzX2dlb19jZW50cm9pZFoxLCBkM19nZW9fY2VudHJvaWRZMSAvIGQzX2dlb19jZW50cm9pZFoxIF0gOiBkM19nZW9fY2VudHJvaWRaMCA/IFsgZDNfZ2VvX2NlbnRyb2lkWDAgLyBkM19nZW9fY2VudHJvaWRaMCwgZDNfZ2VvX2NlbnRyb2lkWTAgLyBkM19nZW9fY2VudHJvaWRaMCBdIDogWyBOYU4sIE5hTiBdO1xyXG4gICAgfTtcclxuICAgIHBhdGguYm91bmRzID0gZnVuY3Rpb24ob2JqZWN0KSB7XHJcbiAgICAgIGQzX2dlb19wYXRoQm91bmRzWDEgPSBkM19nZW9fcGF0aEJvdW5kc1kxID0gLShkM19nZW9fcGF0aEJvdW5kc1gwID0gZDNfZ2VvX3BhdGhCb3VuZHNZMCA9IEluZmluaXR5KTtcclxuICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIHByb2plY3RTdHJlYW0oZDNfZ2VvX3BhdGhCb3VuZHMpKTtcclxuICAgICAgcmV0dXJuIFsgWyBkM19nZW9fcGF0aEJvdW5kc1gwLCBkM19nZW9fcGF0aEJvdW5kc1kwIF0sIFsgZDNfZ2VvX3BhdGhCb3VuZHNYMSwgZDNfZ2VvX3BhdGhCb3VuZHNZMSBdIF07XHJcbiAgICB9O1xyXG4gICAgcGF0aC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcm9qZWN0aW9uO1xyXG4gICAgICBwcm9qZWN0U3RyZWFtID0gKHByb2plY3Rpb24gPSBfKSA/IF8uc3RyZWFtIHx8IGQzX2dlb19wYXRoUHJvamVjdFN0cmVhbShfKSA6IGQzX2lkZW50aXR5O1xyXG4gICAgICByZXR1cm4gcmVzZXQoKTtcclxuICAgIH07XHJcbiAgICBwYXRoLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNvbnRleHQ7XHJcbiAgICAgIGNvbnRleHRTdHJlYW0gPSAoY29udGV4dCA9IF8pID09IG51bGwgPyBuZXcgZDNfZ2VvX3BhdGhCdWZmZXIoKSA6IG5ldyBkM19nZW9fcGF0aENvbnRleHQoXyk7XHJcbiAgICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgIT09IFwiZnVuY3Rpb25cIikgY29udGV4dFN0cmVhbS5wb2ludFJhZGl1cyhwb2ludFJhZGl1cyk7XHJcbiAgICAgIHJldHVybiByZXNldCgpO1xyXG4gICAgfTtcclxuICAgIHBhdGgucG9pbnRSYWRpdXMgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBvaW50UmFkaXVzO1xyXG4gICAgICBwb2ludFJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogKGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMoK18pLCArXyk7XHJcbiAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xyXG4gICAgICBjYWNoZVN0cmVhbSA9IG51bGw7XHJcbiAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGgucHJvamVjdGlvbihkMy5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fcGF0aFByb2plY3RTdHJlYW0ocHJvamVjdCkge1xyXG4gICAgdmFyIHJlc2FtcGxlID0gZDNfZ2VvX3Jlc2FtcGxlKGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgcmV0dXJuIHByb2plY3QoWyB4ICogZDNfZGVncmVlcywgeSAqIGQzX2RlZ3JlZXMgXSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHtcclxuICAgICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uUmFkaWFucyhyZXNhbXBsZShzdHJlYW0pKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzLmdlby50cmFuc2Zvcm0gPSBmdW5jdGlvbihtZXRob2RzKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdHJlYW06IGZ1bmN0aW9uKHN0cmVhbSkge1xyXG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgZDNfZ2VvX3RyYW5zZm9ybShzdHJlYW0pO1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gbWV0aG9kcykgdHJhbnNmb3JtW2tdID0gbWV0aG9kc1trXTtcclxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3RyYW5zZm9ybShzdHJlYW0pIHtcclxuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xyXG4gIH1cclxuICBkM19nZW9fdHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcclxuICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XHJcbiAgICAgIHRoaXMuc3RyZWFtLnBvaW50KHgsIHkpO1xyXG4gICAgfSxcclxuICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMuc3RyZWFtLnNwaGVyZSgpO1xyXG4gICAgfSxcclxuICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMuc3RyZWFtLmxpbmVTdGFydCgpO1xyXG4gICAgfSxcclxuICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB0aGlzLnN0cmVhbS5saW5lRW5kKCk7XHJcbiAgICB9LFxyXG4gICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCk7XHJcbiAgICB9LFxyXG4gICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMuc3RyZWFtLnBvbHlnb25FbmQoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2dlb190cmFuc2Zvcm1Qb2ludChzdHJlYW0sIHBvaW50KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwb2ludDogcG9pbnQsXHJcbiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgc3RyZWFtLnNwaGVyZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcclxuICAgICAgfSxcclxuICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcclxuICAgICAgfSxcclxuICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIGQzLmdlby5wcm9qZWN0aW9uID0gZDNfZ2VvX3Byb2plY3Rpb247XHJcbiAgZDMuZ2VvLnByb2plY3Rpb25NdXRhdG9yID0gZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yO1xyXG4gIGZ1bmN0aW9uIGQzX2dlb19wcm9qZWN0aW9uKHByb2plY3QpIHtcclxuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbk11dGF0b3IoZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBwcm9qZWN0O1xyXG4gICAgfSkoKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCkge1xyXG4gICAgdmFyIHByb2plY3QsIHJvdGF0ZSwgcHJvamVjdFJvdGF0ZSwgcHJvamVjdFJlc2FtcGxlID0gZDNfZ2VvX3Jlc2FtcGxlKGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgeCA9IHByb2plY3QoeCwgeSk7XHJcbiAgICAgIHJldHVybiBbIHhbMF0gKiBrICsgzrR4LCDOtHkgLSB4WzFdICogayBdO1xyXG4gICAgfSksIGsgPSAxNTAsIHggPSA0ODAsIHkgPSAyNTAsIM67ID0gMCwgz4YgPSAwLCDOtM67ID0gMCwgzrTPhiA9IDAsIM60zrMgPSAwLCDOtHgsIM60eSwgcHJlY2xpcCA9IGQzX2dlb19jbGlwQW50aW1lcmlkaWFuLCBwb3N0Y2xpcCA9IGQzX2lkZW50aXR5LCBjbGlwQW5nbGUgPSBudWxsLCBjbGlwRXh0ZW50ID0gbnVsbCwgc3RyZWFtO1xyXG4gICAgZnVuY3Rpb24gcHJvamVjdGlvbihwb2ludCkge1xyXG4gICAgICBwb2ludCA9IHByb2plY3RSb3RhdGUocG9pbnRbMF0gKiBkM19yYWRpYW5zLCBwb2ludFsxXSAqIGQzX3JhZGlhbnMpO1xyXG4gICAgICByZXR1cm4gWyBwb2ludFswXSAqIGsgKyDOtHgsIM60eSAtIHBvaW50WzFdICogayBdO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW52ZXJ0KHBvaW50KSB7XHJcbiAgICAgIHBvaW50ID0gcHJvamVjdFJvdGF0ZS5pbnZlcnQoKHBvaW50WzBdIC0gzrR4KSAvIGssICjOtHkgLSBwb2ludFsxXSkgLyBrKTtcclxuICAgICAgcmV0dXJuIHBvaW50ICYmIFsgcG9pbnRbMF0gKiBkM19kZWdyZWVzLCBwb2ludFsxXSAqIGQzX2RlZ3JlZXMgXTtcclxuICAgIH1cclxuICAgIHByb2plY3Rpb24uc3RyZWFtID0gZnVuY3Rpb24ob3V0cHV0KSB7XHJcbiAgICAgIGlmIChzdHJlYW0pIHN0cmVhbS52YWxpZCA9IGZhbHNlO1xyXG4gICAgICBzdHJlYW0gPSBkM19nZW9fcHJvamVjdGlvblJhZGlhbnMocHJlY2xpcChyb3RhdGUsIHByb2plY3RSZXNhbXBsZShwb3N0Y2xpcChvdXRwdXQpKSkpO1xyXG4gICAgICBzdHJlYW0udmFsaWQgPSB0cnVlO1xyXG4gICAgICByZXR1cm4gc3RyZWFtO1xyXG4gICAgfTtcclxuICAgIHByb2plY3Rpb24uY2xpcEFuZ2xlID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwQW5nbGU7XHJcbiAgICAgIHByZWNsaXAgPSBfID09IG51bGwgPyAoY2xpcEFuZ2xlID0gXywgZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW4pIDogZDNfZ2VvX2NsaXBDaXJjbGUoKGNsaXBBbmdsZSA9ICtfKSAqIGQzX3JhZGlhbnMpO1xyXG4gICAgICByZXR1cm4gaW52YWxpZGF0ZSgpO1xyXG4gICAgfTtcclxuICAgIHByb2plY3Rpb24uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xpcEV4dGVudDtcclxuICAgICAgY2xpcEV4dGVudCA9IF87XHJcbiAgICAgIHBvc3RjbGlwID0gXyA/IGQzX2dlb19jbGlwRXh0ZW50KF9bMF1bMF0sIF9bMF1bMV0sIF9bMV1bMF0sIF9bMV1bMV0pIDogZDNfaWRlbnRpdHk7XHJcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlKCk7XHJcbiAgICB9O1xyXG4gICAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaztcclxuICAgICAgayA9ICtfO1xyXG4gICAgICByZXR1cm4gcmVzZXQoKTtcclxuICAgIH07XHJcbiAgICBwcm9qZWN0aW9uLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyB4LCB5IF07XHJcbiAgICAgIHggPSArX1swXTtcclxuICAgICAgeSA9ICtfWzFdO1xyXG4gICAgICByZXR1cm4gcmVzZXQoKTtcclxuICAgIH07XHJcbiAgICBwcm9qZWN0aW9uLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyDOuyAqIGQzX2RlZ3JlZXMsIM+GICogZDNfZGVncmVlcyBdO1xyXG4gICAgICDOuyA9IF9bMF0gJSAzNjAgKiBkM19yYWRpYW5zO1xyXG4gICAgICDPhiA9IF9bMV0gJSAzNjAgKiBkM19yYWRpYW5zO1xyXG4gICAgICByZXR1cm4gcmVzZXQoKTtcclxuICAgIH07XHJcbiAgICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyDOtM67ICogZDNfZGVncmVlcywgzrTPhiAqIGQzX2RlZ3JlZXMsIM60zrMgKiBkM19kZWdyZWVzIF07XHJcbiAgICAgIM60zrsgPSBfWzBdICUgMzYwICogZDNfcmFkaWFucztcclxuICAgICAgzrTPhiA9IF9bMV0gJSAzNjAgKiBkM19yYWRpYW5zO1xyXG4gICAgICDOtM6zID0gXy5sZW5ndGggPiAyID8gX1syXSAlIDM2MCAqIGQzX3JhZGlhbnMgOiAwO1xyXG4gICAgICByZXR1cm4gcmVzZXQoKTtcclxuICAgIH07XHJcbiAgICBkMy5yZWJpbmQocHJvamVjdGlvbiwgcHJvamVjdFJlc2FtcGxlLCBcInByZWNpc2lvblwiKTtcclxuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xyXG4gICAgICBwcm9qZWN0Um90YXRlID0gZDNfZ2VvX2NvbXBvc2Uocm90YXRlID0gZDNfZ2VvX3JvdGF0aW9uKM60zrssIM60z4YsIM60zrMpLCBwcm9qZWN0KTtcclxuICAgICAgdmFyIGNlbnRlciA9IHByb2plY3QozrssIM+GKTtcclxuICAgICAgzrR4ID0geCAtIGNlbnRlclswXSAqIGs7XHJcbiAgICAgIM60eSA9IHkgKyBjZW50ZXJbMV0gKiBrO1xyXG4gICAgICByZXR1cm4gaW52YWxpZGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW52YWxpZGF0ZSgpIHtcclxuICAgICAgaWYgKHN0cmVhbSkgc3RyZWFtLnZhbGlkID0gZmFsc2UsIHN0cmVhbSA9IG51bGw7XHJcbiAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICBwcm9qZWN0ID0gcHJvamVjdEF0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgIHByb2plY3Rpb24uaW52ZXJ0ID0gcHJvamVjdC5pbnZlcnQgJiYgaW52ZXJ0O1xyXG4gICAgICByZXR1cm4gcmVzZXQoKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19wcm9qZWN0aW9uUmFkaWFucyhzdHJlYW0pIHtcclxuICAgIHJldHVybiBkM19nZW9fdHJhbnNmb3JtUG9pbnQoc3RyZWFtLCBmdW5jdGlvbih4LCB5KSB7XHJcbiAgICAgIHN0cmVhbS5wb2ludCh4ICogZDNfcmFkaWFucywgeSAqIGQzX3JhZGlhbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19lcXVpcmVjdGFuZ3VsYXIozrssIM+GKSB7XHJcbiAgICByZXR1cm4gWyDOuywgz4YgXTtcclxuICB9XHJcbiAgKGQzLmdlby5lcXVpcmVjdGFuZ3VsYXIgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fZXF1aXJlY3Rhbmd1bGFyKTtcclxuICB9KS5yYXcgPSBkM19nZW9fZXF1aXJlY3Rhbmd1bGFyLmludmVydCA9IGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7XHJcbiAgZDMuZ2VvLnJvdGF0aW9uID0gZnVuY3Rpb24ocm90YXRlKSB7XHJcbiAgICByb3RhdGUgPSBkM19nZW9fcm90YXRpb24ocm90YXRlWzBdICUgMzYwICogZDNfcmFkaWFucywgcm90YXRlWzFdICogZDNfcmFkaWFucywgcm90YXRlLmxlbmd0aCA+IDIgPyByb3RhdGVbMl0gKiBkM19yYWRpYW5zIDogMCk7XHJcbiAgICBmdW5jdGlvbiBmb3J3YXJkKGNvb3JkaW5hdGVzKSB7XHJcbiAgICAgIGNvb3JkaW5hdGVzID0gcm90YXRlKGNvb3JkaW5hdGVzWzBdICogZDNfcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiBkM19yYWRpYW5zKTtcclxuICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGQzX2RlZ3JlZXMsIGNvb3JkaW5hdGVzWzFdICo9IGQzX2RlZ3JlZXMsIGNvb3JkaW5hdGVzO1xyXG4gICAgfVxyXG4gICAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykge1xyXG4gICAgICBjb29yZGluYXRlcyA9IHJvdGF0ZS5pbnZlcnQoY29vcmRpbmF0ZXNbMF0gKiBkM19yYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIGQzX3JhZGlhbnMpO1xyXG4gICAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXM7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGZvcndhcmQ7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9faWRlbnRpdHlSb3RhdGlvbijOuywgz4YpIHtcclxuICAgIHJldHVybiBbIM67ID4gz4AgPyDOuyAtIM+EIDogzrsgPCAtz4AgPyDOuyArIM+EIDogzrssIM+GIF07XHJcbiAgfVxyXG4gIGQzX2dlb19pZGVudGl0eVJvdGF0aW9uLmludmVydCA9IGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX3JvdGF0aW9uKM60zrssIM60z4YsIM60zrMpIHtcclxuICAgIHJldHVybiDOtM67ID8gzrTPhiB8fCDOtM6zID8gZDNfZ2VvX2NvbXBvc2UoZDNfZ2VvX3JvdGF0aW9uzrsozrTOuyksIGQzX2dlb19yb3RhdGlvbs+GzrMozrTPhiwgzrTOsykpIDogZDNfZ2VvX3JvdGF0aW9uzrsozrTOuykgOiDOtM+GIHx8IM60zrMgPyBkM19nZW9fcm90YXRpb27Phs6zKM60z4YsIM60zrMpIDogZDNfZ2VvX2lkZW50aXR5Um90YXRpb247XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19mb3J3YXJkUm90YXRpb27OuyjOtM67KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24ozrssIM+GKSB7XHJcbiAgICAgIHJldHVybiDOuyArPSDOtM67LCBbIM67ID4gz4AgPyDOuyAtIM+EIDogzrsgPCAtz4AgPyDOuyArIM+EIDogzrssIM+GIF07XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fcm90YXRpb27OuyjOtM67KSB7XHJcbiAgICB2YXIgcm90YXRpb24gPSBkM19nZW9fZm9yd2FyZFJvdGF0aW9uzrsozrTOuyk7XHJcbiAgICByb3RhdGlvbi5pbnZlcnQgPSBkM19nZW9fZm9yd2FyZFJvdGF0aW9uzrsoLc60zrspO1xyXG4gICAgcmV0dXJuIHJvdGF0aW9uO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fcm90YXRpb27Phs6zKM60z4YsIM60zrMpIHtcclxuICAgIHZhciBjb3POtM+GID0gTWF0aC5jb3MozrTPhiksIHNpbs60z4YgPSBNYXRoLnNpbijOtM+GKSwgY29zzrTOsyA9IE1hdGguY29zKM60zrMpLCBzaW7OtM6zID0gTWF0aC5zaW4ozrTOsyk7XHJcbiAgICBmdW5jdGlvbiByb3RhdGlvbijOuywgz4YpIHtcclxuICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YpLCB4ID0gTWF0aC5jb3MozrspICogY29zz4YsIHkgPSBNYXRoLnNpbijOuykgKiBjb3PPhiwgeiA9IE1hdGguc2luKM+GKSwgayA9IHogKiBjb3POtM+GICsgeCAqIHNpbs60z4Y7XHJcbiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeSAqIGNvc860zrMgLSBrICogc2luzrTOsywgeCAqIGNvc860z4YgLSB6ICogc2luzrTPhiksIGQzX2FzaW4oayAqIGNvc860zrMgKyB5ICogc2luzrTOsykgXTtcclxuICAgIH1cclxuICAgIHJvdGF0aW9uLmludmVydCA9IGZ1bmN0aW9uKM67LCDPhikge1xyXG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiksIHggPSBNYXRoLmNvcyjOuykgKiBjb3PPhiwgeSA9IE1hdGguc2luKM67KSAqIGNvc8+GLCB6ID0gTWF0aC5zaW4oz4YpLCBrID0geiAqIGNvc860zrMgLSB5ICogc2luzrTOsztcclxuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih5ICogY29zzrTOsyArIHogKiBzaW7OtM6zLCB4ICogY29zzrTPhiArIGsgKiBzaW7OtM+GKSwgZDNfYXNpbihrICogY29zzrTPhiAtIHggKiBzaW7OtM+GKSBdO1xyXG4gICAgfTtcclxuICAgIHJldHVybiByb3RhdGlvbjtcclxuICB9XHJcbiAgZDMuZ2VvLmNpcmNsZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIG9yaWdpbiA9IFsgMCwgMCBdLCBhbmdsZSwgcHJlY2lzaW9uID0gNiwgaW50ZXJwb2xhdGU7XHJcbiAgICBmdW5jdGlvbiBjaXJjbGUoKSB7XHJcbiAgICAgIHZhciBjZW50ZXIgPSB0eXBlb2Ygb3JpZ2luID09PSBcImZ1bmN0aW9uXCIgPyBvcmlnaW4uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IG9yaWdpbiwgcm90YXRlID0gZDNfZ2VvX3JvdGF0aW9uKC1jZW50ZXJbMF0gKiBkM19yYWRpYW5zLCAtY2VudGVyWzFdICogZDNfcmFkaWFucywgMCkuaW52ZXJ0LCByaW5nID0gW107XHJcbiAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHtcclxuICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xyXG4gICAgICAgICAgcmluZy5wdXNoKHggPSByb3RhdGUoeCwgeSkpO1xyXG4gICAgICAgICAgeFswXSAqPSBkM19kZWdyZWVzLCB4WzFdICo9IGQzX2RlZ3JlZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBcIlBvbHlnb25cIixcclxuICAgICAgICBjb29yZGluYXRlczogWyByaW5nIF1cclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGNpcmNsZS5vcmlnaW4gPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjtcclxuICAgICAgb3JpZ2luID0geDtcclxuICAgICAgcmV0dXJuIGNpcmNsZTtcclxuICAgIH07XHJcbiAgICBjaXJjbGUuYW5nbGUgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFuZ2xlO1xyXG4gICAgICBpbnRlcnBvbGF0ZSA9IGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZSgoYW5nbGUgPSAreCkgKiBkM19yYWRpYW5zLCBwcmVjaXNpb24gKiBkM19yYWRpYW5zKTtcclxuICAgICAgcmV0dXJuIGNpcmNsZTtcclxuICAgIH07XHJcbiAgICBjaXJjbGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcmVjaXNpb247XHJcbiAgICAgIGludGVycG9sYXRlID0gZDNfZ2VvX2NpcmNsZUludGVycG9sYXRlKGFuZ2xlICogZDNfcmFkaWFucywgKHByZWNpc2lvbiA9ICtfKSAqIGQzX3JhZGlhbnMpO1xyXG4gICAgICByZXR1cm4gY2lyY2xlO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBjaXJjbGUuYW5nbGUoOTApO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NpcmNsZUludGVycG9sYXRlKHJhZGl1cywgcHJlY2lzaW9uKSB7XHJcbiAgICB2YXIgY3IgPSBNYXRoLmNvcyhyYWRpdXMpLCBzciA9IE1hdGguc2luKHJhZGl1cyk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oZnJvbSwgdG8sIGRpcmVjdGlvbiwgbGlzdGVuZXIpIHtcclxuICAgICAgdmFyIHN0ZXAgPSBkaXJlY3Rpb24gKiBwcmVjaXNpb247XHJcbiAgICAgIGlmIChmcm9tICE9IG51bGwpIHtcclxuICAgICAgICBmcm9tID0gZDNfZ2VvX2NpcmNsZUFuZ2xlKGNyLCBmcm9tKTtcclxuICAgICAgICB0byA9IGQzX2dlb19jaXJjbGVBbmdsZShjciwgdG8pO1xyXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPiAwID8gZnJvbSA8IHRvIDogZnJvbSA+IHRvKSBmcm9tICs9IGRpcmVjdGlvbiAqIM+EO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZyb20gPSByYWRpdXMgKyBkaXJlY3Rpb24gKiDPhDtcclxuICAgICAgICB0byA9IHJhZGl1cyAtIC41ICogc3RlcDtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKHZhciBwb2ludCwgdCA9IGZyb207IGRpcmVjdGlvbiA+IDAgPyB0ID4gdG8gOiB0IDwgdG87IHQgLT0gc3RlcCkge1xyXG4gICAgICAgIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IGQzX2dlb19zcGhlcmljYWwoWyBjciwgLXNyICogTWF0aC5jb3ModCksIC1zciAqIE1hdGguc2luKHQpIF0pKVswXSwgcG9pbnRbMV0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9fY2lyY2xlQW5nbGUoY3IsIHBvaW50KSB7XHJcbiAgICB2YXIgYSA9IGQzX2dlb19jYXJ0ZXNpYW4ocG9pbnQpO1xyXG4gICAgYVswXSAtPSBjcjtcclxuICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoYSk7XHJcbiAgICB2YXIgYW5nbGUgPSBkM19hY29zKC1hWzFdKTtcclxuICAgIHJldHVybiAoKC1hWzJdIDwgMCA/IC1hbmdsZSA6IGFuZ2xlKSArIDIgKiBNYXRoLlBJIC0gzrUpICUgKDIgKiBNYXRoLlBJKTtcclxuICB9XHJcbiAgZDMuZ2VvLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xyXG4gICAgdmFyIM6UzrsgPSAoYlswXSAtIGFbMF0pICogZDNfcmFkaWFucywgz4YwID0gYVsxXSAqIGQzX3JhZGlhbnMsIM+GMSA9IGJbMV0gKiBkM19yYWRpYW5zLCBzaW7OlM67ID0gTWF0aC5zaW4ozpTOuyksIGNvc86UzrsgPSBNYXRoLmNvcyjOlM67KSwgc2luz4YwID0gTWF0aC5zaW4oz4YwKSwgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgc2luz4YxID0gTWF0aC5zaW4oz4YxKSwgY29zz4YxID0gTWF0aC5jb3Moz4YxKSwgdDtcclxuICAgIHJldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgodCA9IGNvc8+GMSAqIHNpbs6UzrspICogdCArICh0ID0gY29zz4YwICogc2luz4YxIC0gc2luz4YwICogY29zz4YxICogY29zzpTOuykgKiB0KSwgc2luz4YwICogc2luz4YxICsgY29zz4YwICogY29zz4YxICogY29zzpTOuyk7XHJcbiAgfTtcclxuICBkMy5nZW8uZ3JhdGljdWxlID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgeDEsIHgwLCBYMSwgWDAsIHkxLCB5MCwgWTEsIFkwLCBkeCA9IDEwLCBkeSA9IGR4LCBEWCA9IDkwLCBEWSA9IDM2MCwgeCwgeSwgWCwgWSwgcHJlY2lzaW9uID0gMi41O1xyXG4gICAgZnVuY3Rpb24gZ3JhdGljdWxlKCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFwiTXVsdGlMaW5lU3RyaW5nXCIsXHJcbiAgICAgICAgY29vcmRpbmF0ZXM6IGxpbmVzKClcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGxpbmVzKCkge1xyXG4gICAgICByZXR1cm4gZDMucmFuZ2UoTWF0aC5jZWlsKFgwIC8gRFgpICogRFgsIFgxLCBEWCkubWFwKFgpLmNvbmNhdChkMy5yYW5nZShNYXRoLmNlaWwoWTAgLyBEWSkgKiBEWSwgWTEsIERZKS5tYXAoWSkpLmNvbmNhdChkMy5yYW5nZShNYXRoLmNlaWwoeDAgLyBkeCkgKiBkeCwgeDEsIGR4KS5maWx0ZXIoZnVuY3Rpb24oeCkge1xyXG4gICAgICAgIHJldHVybiBhYnMoeCAlIERYKSA+IM61O1xyXG4gICAgICB9KS5tYXAoeCkpLmNvbmNhdChkMy5yYW5nZShNYXRoLmNlaWwoeTAgLyBkeSkgKiBkeSwgeTEsIGR5KS5maWx0ZXIoZnVuY3Rpb24oeSkge1xyXG4gICAgICAgIHJldHVybiBhYnMoeSAlIERZKSA+IM61O1xyXG4gICAgICB9KS5tYXAoeSkpO1xyXG4gICAgfVxyXG4gICAgZ3JhdGljdWxlLmxpbmVzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBsaW5lcygpLm1hcChmdW5jdGlvbihjb29yZGluYXRlcykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0eXBlOiBcIkxpbmVTdHJpbmdcIixcclxuICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIGdyYXRpY3VsZS5vdXRsaW5lID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdHlwZTogXCJQb2x5Z29uXCIsXHJcbiAgICAgICAgY29vcmRpbmF0ZXM6IFsgWChYMCkuY29uY2F0KFkoWTEpLnNsaWNlKDEpLCBYKFgxKS5yZXZlcnNlKCkuc2xpY2UoMSksIFkoWTApLnJldmVyc2UoKS5zbGljZSgxKSkgXVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICAgIGdyYXRpY3VsZS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5taW5vckV4dGVudCgpO1xyXG4gICAgICByZXR1cm4gZ3JhdGljdWxlLm1ham9yRXh0ZW50KF8pLm1pbm9yRXh0ZW50KF8pO1xyXG4gICAgfTtcclxuICAgIGdyYXRpY3VsZS5tYWpvckV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBbIFgwLCBZMCBdLCBbIFgxLCBZMSBdIF07XHJcbiAgICAgIFgwID0gK19bMF1bMF0sIFgxID0gK19bMV1bMF07XHJcbiAgICAgIFkwID0gK19bMF1bMV0sIFkxID0gK19bMV1bMV07XHJcbiAgICAgIGlmIChYMCA+IFgxKSBfID0gWDAsIFgwID0gWDEsIFgxID0gXztcclxuICAgICAgaWYgKFkwID4gWTEpIF8gPSBZMCwgWTAgPSBZMSwgWTEgPSBfO1xyXG4gICAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pO1xyXG4gICAgfTtcclxuICAgIGdyYXRpY3VsZS5taW5vckV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBbIHgwLCB5MCBdLCBbIHgxLCB5MSBdIF07XHJcbiAgICAgIHgwID0gK19bMF1bMF0sIHgxID0gK19bMV1bMF07XHJcbiAgICAgIHkwID0gK19bMF1bMV0sIHkxID0gK19bMV1bMV07XHJcbiAgICAgIGlmICh4MCA+IHgxKSBfID0geDAsIHgwID0geDEsIHgxID0gXztcclxuICAgICAgaWYgKHkwID4geTEpIF8gPSB5MCwgeTAgPSB5MSwgeTEgPSBfO1xyXG4gICAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pO1xyXG4gICAgfTtcclxuICAgIGdyYXRpY3VsZS5zdGVwID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF0aWN1bGUubWlub3JTdGVwKCk7XHJcbiAgICAgIHJldHVybiBncmF0aWN1bGUubWFqb3JTdGVwKF8pLm1pbm9yU3RlcChfKTtcclxuICAgIH07XHJcbiAgICBncmF0aWN1bGUubWFqb3JTdGVwID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIERYLCBEWSBdO1xyXG4gICAgICBEWCA9ICtfWzBdLCBEWSA9ICtfWzFdO1xyXG4gICAgICByZXR1cm4gZ3JhdGljdWxlO1xyXG4gICAgfTtcclxuICAgIGdyYXRpY3VsZS5taW5vclN0ZXAgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgZHgsIGR5IF07XHJcbiAgICAgIGR4ID0gK19bMF0sIGR5ID0gK19bMV07XHJcbiAgICAgIHJldHVybiBncmF0aWN1bGU7XHJcbiAgICB9O1xyXG4gICAgZ3JhdGljdWxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJlY2lzaW9uO1xyXG4gICAgICBwcmVjaXNpb24gPSArXztcclxuICAgICAgeCA9IGQzX2dlb19ncmF0aWN1bGVYKHkwLCB5MSwgOTApO1xyXG4gICAgICB5ID0gZDNfZ2VvX2dyYXRpY3VsZVkoeDAsIHgxLCBwcmVjaXNpb24pO1xyXG4gICAgICBYID0gZDNfZ2VvX2dyYXRpY3VsZVgoWTAsIFkxLCA5MCk7XHJcbiAgICAgIFkgPSBkM19nZW9fZ3JhdGljdWxlWShYMCwgWDEsIHByZWNpc2lvbik7XHJcbiAgICAgIHJldHVybiBncmF0aWN1bGU7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGdyYXRpY3VsZS5tYWpvckV4dGVudChbIFsgLTE4MCwgLTkwICsgzrUgXSwgWyAxODAsIDkwIC0gzrUgXSBdKS5taW5vckV4dGVudChbIFsgLTE4MCwgLTgwIC0gzrUgXSwgWyAxODAsIDgwICsgzrUgXSBdKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2dlb19ncmF0aWN1bGVYKHkwLCB5MSwgZHkpIHtcclxuICAgIHZhciB5ID0gZDMucmFuZ2UoeTAsIHkxIC0gzrUsIGR5KS5jb25jYXQoeTEpO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcclxuICAgICAgcmV0dXJuIHkubWFwKGZ1bmN0aW9uKHkpIHtcclxuICAgICAgICByZXR1cm4gWyB4LCB5IF07XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2dyYXRpY3VsZVkoeDAsIHgxLCBkeCkge1xyXG4gICAgdmFyIHggPSBkMy5yYW5nZSh4MCwgeDEgLSDOtSwgZHgpLmNvbmNhdCh4MSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oeSkge1xyXG4gICAgICByZXR1cm4geC5tYXAoZnVuY3Rpb24oeCkge1xyXG4gICAgICAgIHJldHVybiBbIHgsIHkgXTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zb3VyY2UoZCkge1xyXG4gICAgcmV0dXJuIGQuc291cmNlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190YXJnZXQoZCkge1xyXG4gICAgcmV0dXJuIGQudGFyZ2V0O1xyXG4gIH1cclxuICBkMy5nZW8uZ3JlYXRBcmMgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBzb3VyY2UgPSBkM19zb3VyY2UsIHNvdXJjZV8sIHRhcmdldCA9IGQzX3RhcmdldCwgdGFyZ2V0XztcclxuICAgIGZ1bmN0aW9uIGdyZWF0QXJjKCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFwiTGluZVN0cmluZ1wiLFxyXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbIHNvdXJjZV8gfHwgc291cmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRhcmdldF8gfHwgdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgZ3JlYXRBcmMuZGlzdGFuY2UgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzLmdlby5kaXN0YW5jZShzb3VyY2VfIHx8IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0YXJnZXRfIHx8IHRhcmdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcclxuICAgIH07XHJcbiAgICBncmVhdEFyYy5zb3VyY2UgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgc291cmNlID0gXywgc291cmNlXyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBudWxsIDogXztcclxuICAgICAgcmV0dXJuIGdyZWF0QXJjO1xyXG4gICAgfTtcclxuICAgIGdyZWF0QXJjLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0O1xyXG4gICAgICB0YXJnZXQgPSBfLCB0YXJnZXRfID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IG51bGwgOiBfO1xyXG4gICAgICByZXR1cm4gZ3JlYXRBcmM7XHJcbiAgICB9O1xyXG4gICAgZ3JlYXRBcmMucHJlY2lzaW9uID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZ3JlYXRBcmMgOiAwO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBncmVhdEFyYztcclxuICB9O1xyXG4gIGQzLmdlby5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KSB7XHJcbiAgICByZXR1cm4gZDNfZ2VvX2ludGVycG9sYXRlKHNvdXJjZVswXSAqIGQzX3JhZGlhbnMsIHNvdXJjZVsxXSAqIGQzX3JhZGlhbnMsIHRhcmdldFswXSAqIGQzX3JhZGlhbnMsIHRhcmdldFsxXSAqIGQzX3JhZGlhbnMpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2ludGVycG9sYXRlKHgwLCB5MCwgeDEsIHkxKSB7XHJcbiAgICB2YXIgY3kwID0gTWF0aC5jb3MoeTApLCBzeTAgPSBNYXRoLnNpbih5MCksIGN5MSA9IE1hdGguY29zKHkxKSwgc3kxID0gTWF0aC5zaW4oeTEpLCBreDAgPSBjeTAgKiBNYXRoLmNvcyh4MCksIGt5MCA9IGN5MCAqIE1hdGguc2luKHgwKSwga3gxID0gY3kxICogTWF0aC5jb3MoeDEpLCBreTEgPSBjeTEgKiBNYXRoLnNpbih4MSksIGQgPSAyICogTWF0aC5hc2luKE1hdGguc3FydChkM19oYXZlcnNpbih5MSAtIHkwKSArIGN5MCAqIGN5MSAqIGQzX2hhdmVyc2luKHgxIC0geDApKSksIGsgPSAxIC8gTWF0aC5zaW4oZCk7XHJcbiAgICB2YXIgaW50ZXJwb2xhdGUgPSBkID8gZnVuY3Rpb24odCkge1xyXG4gICAgICB2YXIgQiA9IE1hdGguc2luKHQgKj0gZCkgKiBrLCBBID0gTWF0aC5zaW4oZCAtIHQpICogaywgeCA9IEEgKiBreDAgKyBCICoga3gxLCB5ID0gQSAqIGt5MCArIEIgKiBreTEsIHogPSBBICogc3kwICsgQiAqIHN5MTtcclxuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih5LCB4KSAqIGQzX2RlZ3JlZXMsIE1hdGguYXRhbjIoeiwgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpKSAqIGQzX2RlZ3JlZXMgXTtcclxuICAgIH0gOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIFsgeDAgKiBkM19kZWdyZWVzLCB5MCAqIGQzX2RlZ3JlZXMgXTtcclxuICAgIH07XHJcbiAgICBpbnRlcnBvbGF0ZS5kaXN0YW5jZSA9IGQ7XHJcbiAgICByZXR1cm4gaW50ZXJwb2xhdGU7XHJcbiAgfVxyXG4gIGQzLmdlby5sZW5ndGggPSBmdW5jdGlvbihvYmplY3QpIHtcclxuICAgIGQzX2dlb19sZW5ndGhTdW0gPSAwO1xyXG4gICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGQzX2dlb19sZW5ndGgpO1xyXG4gICAgcmV0dXJuIGQzX2dlb19sZW5ndGhTdW07XHJcbiAgfTtcclxuICB2YXIgZDNfZ2VvX2xlbmd0aFN1bTtcclxuICB2YXIgZDNfZ2VvX2xlbmd0aCA9IHtcclxuICAgIHNwaGVyZTogZDNfbm9vcCxcclxuICAgIHBvaW50OiBkM19ub29wLFxyXG4gICAgbGluZVN0YXJ0OiBkM19nZW9fbGVuZ3RoTGluZVN0YXJ0LFxyXG4gICAgbGluZUVuZDogZDNfbm9vcCxcclxuICAgIHBvbHlnb25TdGFydDogZDNfbm9vcCxcclxuICAgIHBvbHlnb25FbmQ6IGQzX25vb3BcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2dlb19sZW5ndGhMaW5lU3RhcnQoKSB7XHJcbiAgICB2YXIgzrswLCBzaW7PhjAsIGNvc8+GMDtcclxuICAgIGQzX2dlb19sZW5ndGgucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHtcclxuICAgICAgzrswID0gzrsgKiBkM19yYWRpYW5zLCBzaW7PhjAgPSBNYXRoLnNpbijPhiAqPSBkM19yYWRpYW5zKSwgY29zz4YwID0gTWF0aC5jb3Moz4YpO1xyXG4gICAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gbmV4dFBvaW50O1xyXG4gICAgfTtcclxuICAgIGQzX2dlb19sZW5ndGgubGluZUVuZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gZDNfZ2VvX2xlbmd0aC5saW5lRW5kID0gZDNfbm9vcDtcclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQozrssIM+GKSB7XHJcbiAgICAgIHZhciBzaW7PhiA9IE1hdGguc2luKM+GICo9IGQzX3JhZGlhbnMpLCBjb3PPhiA9IE1hdGguY29zKM+GKSwgdCA9IGFicygozrsgKj0gZDNfcmFkaWFucykgLSDOuzApLCBjb3POlM67ID0gTWF0aC5jb3ModCk7XHJcbiAgICAgIGQzX2dlb19sZW5ndGhTdW0gKz0gTWF0aC5hdGFuMihNYXRoLnNxcnQoKHQgPSBjb3PPhiAqIE1hdGguc2luKHQpKSAqIHQgKyAodCA9IGNvc8+GMCAqIHNpbs+GIC0gc2luz4YwICogY29zz4YgKiBjb3POlM67KSAqIHQpLCBzaW7PhjAgKiBzaW7PhiArIGNvc8+GMCAqIGNvc8+GICogY29zzpTOuyk7XHJcbiAgICAgIM67MCA9IM67LCBzaW7PhjAgPSBzaW7PhiwgY29zz4YwID0gY29zz4Y7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb19hemltdXRoYWwoc2NhbGUsIGFuZ2xlKSB7XHJcbiAgICBmdW5jdGlvbiBhemltdXRoYWwozrssIM+GKSB7XHJcbiAgICAgIHZhciBjb3POuyA9IE1hdGguY29zKM67KSwgY29zz4YgPSBNYXRoLmNvcyjPhiksIGsgPSBzY2FsZShjb3POuyAqIGNvc8+GKTtcclxuICAgICAgcmV0dXJuIFsgayAqIGNvc8+GICogTWF0aC5zaW4ozrspLCBrICogTWF0aC5zaW4oz4YpIF07XHJcbiAgICB9XHJcbiAgICBhemltdXRoYWwuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xyXG4gICAgICB2YXIgz4EgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSksIGMgPSBhbmdsZSjPgSksIHNpbmMgPSBNYXRoLnNpbihjKSwgY29zYyA9IE1hdGguY29zKGMpO1xyXG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHggKiBzaW5jLCDPgSAqIGNvc2MpLCBNYXRoLmFzaW4oz4EgJiYgeSAqIHNpbmMgLyDPgSkgXTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gYXppbXV0aGFsO1xyXG4gIH1cclxuICB2YXIgZDNfZ2VvX2F6aW11dGhhbEVxdWFsQXJlYSA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oY29zzrtjb3PPhikge1xyXG4gICAgcmV0dXJuIE1hdGguc3FydCgyIC8gKDEgKyBjb3POu2Nvc8+GKSk7XHJcbiAgfSwgZnVuY3Rpb24oz4EpIHtcclxuICAgIHJldHVybiAyICogTWF0aC5hc2luKM+BIC8gMik7XHJcbiAgfSk7XHJcbiAgKGQzLmdlby5hemltdXRoYWxFcXVhbEFyZWEgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fYXppbXV0aGFsRXF1YWxBcmVhKTtcclxuICB9KS5yYXcgPSBkM19nZW9fYXppbXV0aGFsRXF1YWxBcmVhO1xyXG4gIHZhciBkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHtcclxuICAgIHZhciBjID0gTWF0aC5hY29zKGNvc867Y29zz4YpO1xyXG4gICAgcmV0dXJuIGMgJiYgYyAvIE1hdGguc2luKGMpO1xyXG4gIH0sIGQzX2lkZW50aXR5KTtcclxuICAoZDMuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50ID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX2F6aW11dGhhbEVxdWlkaXN0YW50KTtcclxuICB9KS5yYXcgPSBkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQ7XHJcbiAgZnVuY3Rpb24gZDNfZ2VvX2NvbmljQ29uZm9ybWFsKM+GMCwgz4YxKSB7XHJcbiAgICB2YXIgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgdCA9IGZ1bmN0aW9uKM+GKSB7XHJcbiAgICAgIHJldHVybiBNYXRoLnRhbijPgCAvIDQgKyDPhiAvIDIpO1xyXG4gICAgfSwgbiA9IM+GMCA9PT0gz4YxID8gTWF0aC5zaW4oz4YwKSA6IE1hdGgubG9nKGNvc8+GMCAvIE1hdGguY29zKM+GMSkpIC8gTWF0aC5sb2codCjPhjEpIC8gdCjPhjApKSwgRiA9IGNvc8+GMCAqIE1hdGgucG93KHQoz4YwKSwgbikgLyBuO1xyXG4gICAgaWYgKCFuKSByZXR1cm4gZDNfZ2VvX21lcmNhdG9yO1xyXG4gICAgZnVuY3Rpb24gZm9yd2FyZCjOuywgz4YpIHtcclxuICAgICAgaWYgKEYgPiAwKSB7XHJcbiAgICAgICAgaWYgKM+GIDwgLWhhbGbPgCArIM61KSDPhiA9IC1oYWxmz4AgKyDOtTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoz4YgPiBoYWxmz4AgLSDOtSkgz4YgPSBoYWxmz4AgLSDOtTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgz4EgPSBGIC8gTWF0aC5wb3codCjPhiksIG4pO1xyXG4gICAgICByZXR1cm4gWyDPgSAqIE1hdGguc2luKG4gKiDOuyksIEYgLSDPgSAqIE1hdGguY29zKG4gKiDOuykgXTtcclxuICAgIH1cclxuICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xyXG4gICAgICB2YXIgz4EwX3kgPSBGIC0geSwgz4EgPSBkM19zZ24obikgKiBNYXRoLnNxcnQoeCAqIHggKyDPgTBfeSAqIM+BMF95KTtcclxuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih4LCDPgTBfeSkgLyBuLCAyICogTWF0aC5hdGFuKE1hdGgucG93KEYgLyDPgSwgMSAvIG4pKSAtIGhhbGbPgCBdO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBmb3J3YXJkO1xyXG4gIH1cclxuICAoZDMuZ2VvLmNvbmljQ29uZm9ybWFsID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfZ2VvX2NvbmljKGQzX2dlb19jb25pY0NvbmZvcm1hbCk7XHJcbiAgfSkucmF3ID0gZDNfZ2VvX2NvbmljQ29uZm9ybWFsO1xyXG4gIGZ1bmN0aW9uIGQzX2dlb19jb25pY0VxdWlkaXN0YW50KM+GMCwgz4YxKSB7XHJcbiAgICB2YXIgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgbiA9IM+GMCA9PT0gz4YxID8gTWF0aC5zaW4oz4YwKSA6IChjb3PPhjAgLSBNYXRoLmNvcyjPhjEpKSAvICjPhjEgLSDPhjApLCBHID0gY29zz4YwIC8gbiArIM+GMDtcclxuICAgIGlmIChhYnMobikgPCDOtSkgcmV0dXJuIGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7XHJcbiAgICBmdW5jdGlvbiBmb3J3YXJkKM67LCDPhikge1xyXG4gICAgICB2YXIgz4EgPSBHIC0gz4Y7XHJcbiAgICAgIHJldHVybiBbIM+BICogTWF0aC5zaW4obiAqIM67KSwgRyAtIM+BICogTWF0aC5jb3MobiAqIM67KSBdO1xyXG4gICAgfVxyXG4gICAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XHJcbiAgICAgIHZhciDPgTBfeSA9IEcgLSB5O1xyXG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIEcgLSBkM19zZ24obikgKiBNYXRoLnNxcnQoeCAqIHggKyDPgTBfeSAqIM+BMF95KSBdO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBmb3J3YXJkO1xyXG4gIH1cclxuICAoZDMuZ2VvLmNvbmljRXF1aWRpc3RhbnQgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19nZW9fY29uaWMoZDNfZ2VvX2NvbmljRXF1aWRpc3RhbnQpO1xyXG4gIH0pLnJhdyA9IGQzX2dlb19jb25pY0VxdWlkaXN0YW50O1xyXG4gIHZhciBkM19nZW9fZ25vbW9uaWMgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHtcclxuICAgIHJldHVybiAxIC8gY29zzrtjb3PPhjtcclxuICB9LCBNYXRoLmF0YW4pO1xyXG4gIChkMy5nZW8uZ25vbW9uaWMgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fZ25vbW9uaWMpO1xyXG4gIH0pLnJhdyA9IGQzX2dlb19nbm9tb25pYztcclxuICBmdW5jdGlvbiBkM19nZW9fbWVyY2F0b3IozrssIM+GKSB7XHJcbiAgICByZXR1cm4gWyDOuywgTWF0aC5sb2coTWF0aC50YW4oz4AgLyA0ICsgz4YgLyAyKSkgXTtcclxuICB9XHJcbiAgZDNfZ2VvX21lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgIHJldHVybiBbIHgsIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeSkpIC0gaGFsZs+AIF07XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19nZW9fbWVyY2F0b3JQcm9qZWN0aW9uKHByb2plY3QpIHtcclxuICAgIHZhciBtID0gZDNfZ2VvX3Byb2plY3Rpb24ocHJvamVjdCksIHNjYWxlID0gbS5zY2FsZSwgdHJhbnNsYXRlID0gbS50cmFuc2xhdGUsIGNsaXBFeHRlbnQgPSBtLmNsaXBFeHRlbnQsIGNsaXBBdXRvO1xyXG4gICAgbS5zY2FsZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgdiA9IHNjYWxlLmFwcGx5KG0sIGFyZ3VtZW50cyk7XHJcbiAgICAgIHJldHVybiB2ID09PSBtID8gY2xpcEF1dG8gPyBtLmNsaXBFeHRlbnQobnVsbCkgOiBtIDogdjtcclxuICAgIH07XHJcbiAgICBtLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgdiA9IHRyYW5zbGF0ZS5hcHBseShtLCBhcmd1bWVudHMpO1xyXG4gICAgICByZXR1cm4gdiA9PT0gbSA/IGNsaXBBdXRvID8gbS5jbGlwRXh0ZW50KG51bGwpIDogbSA6IHY7XHJcbiAgICB9O1xyXG4gICAgbS5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICB2YXIgdiA9IGNsaXBFeHRlbnQuYXBwbHkobSwgYXJndW1lbnRzKTtcclxuICAgICAgaWYgKHYgPT09IG0pIHtcclxuICAgICAgICBpZiAoY2xpcEF1dG8gPSBfID09IG51bGwpIHtcclxuICAgICAgICAgIHZhciBrID0gz4AgKiBzY2FsZSgpLCB0ID0gdHJhbnNsYXRlKCk7XHJcbiAgICAgICAgICBjbGlwRXh0ZW50KFsgWyB0WzBdIC0gaywgdFsxXSAtIGsgXSwgWyB0WzBdICsgaywgdFsxXSArIGsgXSBdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY2xpcEF1dG8pIHtcclxuICAgICAgICB2ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbS5jbGlwRXh0ZW50KG51bGwpO1xyXG4gIH1cclxuICAoZDMuZ2VvLm1lcmNhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihkM19nZW9fbWVyY2F0b3IpO1xyXG4gIH0pLnJhdyA9IGQzX2dlb19tZXJjYXRvcjtcclxuICB2YXIgZDNfZ2VvX29ydGhvZ3JhcGhpYyA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gMTtcclxuICB9LCBNYXRoLmFzaW4pO1xyXG4gIChkMy5nZW8ub3J0aG9ncmFwaGljID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX29ydGhvZ3JhcGhpYyk7XHJcbiAgfSkucmF3ID0gZDNfZ2VvX29ydGhvZ3JhcGhpYztcclxuICB2YXIgZDNfZ2VvX3N0ZXJlb2dyYXBoaWMgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHtcclxuICAgIHJldHVybiAxIC8gKDEgKyBjb3POu2Nvc8+GKTtcclxuICB9LCBmdW5jdGlvbijPgSkge1xyXG4gICAgcmV0dXJuIDIgKiBNYXRoLmF0YW4oz4EpO1xyXG4gIH0pO1xyXG4gIChkMy5nZW8uc3RlcmVvZ3JhcGhpYyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19zdGVyZW9ncmFwaGljKTtcclxuICB9KS5yYXcgPSBkM19nZW9fc3RlcmVvZ3JhcGhpYztcclxuICBmdW5jdGlvbiBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yKM67LCDPhikge1xyXG4gICAgcmV0dXJuIFsgTWF0aC5sb2coTWF0aC50YW4oz4AgLyA0ICsgz4YgLyAyKSksIC3OuyBdO1xyXG4gIH1cclxuICBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgIHJldHVybiBbIC15LCAyICogTWF0aC5hdGFuKE1hdGguZXhwKHgpKSAtIGhhbGbPgCBdO1xyXG4gIH07XHJcbiAgKGQzLmdlby50cmFuc3ZlcnNlTWVyY2F0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBwcm9qZWN0aW9uID0gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yKSwgY2VudGVyID0gcHJvamVjdGlvbi5jZW50ZXIsIHJvdGF0ZSA9IHByb2plY3Rpb24ucm90YXRlO1xyXG4gICAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIHJldHVybiBfID8gY2VudGVyKFsgLV9bMV0sIF9bMF0gXSkgOiAoXyA9IGNlbnRlcigpLCBbIF9bMV0sIC1fWzBdIF0pO1xyXG4gICAgfTtcclxuICAgIHByb2plY3Rpb24ucm90YXRlID0gZnVuY3Rpb24oXykge1xyXG4gICAgICByZXR1cm4gXyA/IHJvdGF0ZShbIF9bMF0sIF9bMV0sIF8ubGVuZ3RoID4gMiA/IF9bMl0gKyA5MCA6IDkwIF0pIDogKF8gPSByb3RhdGUoKSwgXHJcbiAgICAgIFsgX1swXSwgX1sxXSwgX1syXSAtIDkwIF0pO1xyXG4gICAgfTtcclxuICAgIHJldHVybiByb3RhdGUoWyAwLCAwLCA5MCBdKTtcclxuICB9KS5yYXcgPSBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yO1xyXG4gIGQzLmdlb20gPSB7fTtcclxuICBmdW5jdGlvbiBkM19nZW9tX3BvaW50WChkKSB7XHJcbiAgICByZXR1cm4gZFswXTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2ludFkoZCkge1xyXG4gICAgcmV0dXJuIGRbMV07XHJcbiAgfVxyXG4gIGQzLmdlb20uaHVsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XHJcbiAgICB2YXIgeCA9IGQzX2dlb21fcG9pbnRYLCB5ID0gZDNfZ2VvbV9wb2ludFk7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGh1bGwodmVydGljZXMpO1xyXG4gICAgZnVuY3Rpb24gaHVsbChkYXRhKSB7XHJcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDMpIHJldHVybiBbXTtcclxuICAgICAgdmFyIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCBpLCBuID0gZGF0YS5sZW5ndGgsIHBvaW50cyA9IFtdLCBmbGlwcGVkUG9pbnRzID0gW107XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBwb2ludHMucHVzaChbICtmeC5jYWxsKHRoaXMsIGRhdGFbaV0sIGkpLCArZnkuY2FsbCh0aGlzLCBkYXRhW2ldLCBpKSwgaSBdKTtcclxuICAgICAgfVxyXG4gICAgICBwb2ludHMuc29ydChkM19nZW9tX2h1bGxPcmRlcik7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGZsaXBwZWRQb2ludHMucHVzaChbIHBvaW50c1tpXVswXSwgLXBvaW50c1tpXVsxXSBdKTtcclxuICAgICAgdmFyIHVwcGVyID0gZDNfZ2VvbV9odWxsVXBwZXIocG9pbnRzKSwgbG93ZXIgPSBkM19nZW9tX2h1bGxVcHBlcihmbGlwcGVkUG9pbnRzKTtcclxuICAgICAgdmFyIHNraXBMZWZ0ID0gbG93ZXJbMF0gPT09IHVwcGVyWzBdLCBza2lwUmlnaHQgPSBsb3dlcltsb3dlci5sZW5ndGggLSAxXSA9PT0gdXBwZXJbdXBwZXIubGVuZ3RoIC0gMV0sIHBvbHlnb24gPSBbXTtcclxuICAgICAgZm9yIChpID0gdXBwZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHBvbHlnb24ucHVzaChkYXRhW3BvaW50c1t1cHBlcltpXV1bMl1dKTtcclxuICAgICAgZm9yIChpID0gK3NraXBMZWZ0OyBpIDwgbG93ZXIubGVuZ3RoIC0gc2tpcFJpZ2h0OyArK2kpIHBvbHlnb24ucHVzaChkYXRhW3BvaW50c1tsb3dlcltpXV1bMl1dKTtcclxuICAgICAgcmV0dXJuIHBvbHlnb247XHJcbiAgICB9XHJcbiAgICBodWxsLnggPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSBfLCBodWxsKSA6IHg7XHJcbiAgICB9O1xyXG4gICAgaHVsbC55ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gXywgaHVsbCkgOiB5O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBodWxsO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV9odWxsVXBwZXIocG9pbnRzKSB7XHJcbiAgICB2YXIgbiA9IHBvaW50cy5sZW5ndGgsIGh1bGwgPSBbIDAsIDEgXSwgaHMgPSAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBuOyBpKyspIHtcclxuICAgICAgd2hpbGUgKGhzID4gMSAmJiBkM19jcm9zczJkKHBvaW50c1todWxsW2hzIC0gMl1dLCBwb2ludHNbaHVsbFtocyAtIDFdXSwgcG9pbnRzW2ldKSA8PSAwKSAtLWhzO1xyXG4gICAgICBodWxsW2hzKytdID0gaTtcclxuICAgIH1cclxuICAgIHJldHVybiBodWxsLnNsaWNlKDAsIGhzKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV9odWxsT3JkZXIoYSwgYikge1xyXG4gICAgcmV0dXJuIGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdO1xyXG4gIH1cclxuICBkMy5nZW9tLnBvbHlnb24gPSBmdW5jdGlvbihjb29yZGluYXRlcykge1xyXG4gICAgZDNfc3ViY2xhc3MoY29vcmRpbmF0ZXMsIGQzX2dlb21fcG9seWdvblByb3RvdHlwZSk7XHJcbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XHJcbiAgfTtcclxuICB2YXIgZDNfZ2VvbV9wb2x5Z29uUHJvdG90eXBlID0gZDMuZ2VvbS5wb2x5Z29uLnByb3RvdHlwZSA9IFtdO1xyXG4gIGQzX2dlb21fcG9seWdvblByb3RvdHlwZS5hcmVhID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIGEsIGIgPSB0aGlzW24gLSAxXSwgYXJlYSA9IDA7XHJcbiAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICBhID0gYjtcclxuICAgICAgYiA9IHRoaXNbaV07XHJcbiAgICAgIGFyZWEgKz0gYVsxXSAqIGJbMF0gLSBhWzBdICogYlsxXTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcmVhICogLjU7XHJcbiAgfTtcclxuICBkM19nZW9tX3BvbHlnb25Qcm90b3R5cGUuY2VudHJvaWQgPSBmdW5jdGlvbihrKSB7XHJcbiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIHggPSAwLCB5ID0gMCwgYSwgYiA9IHRoaXNbbiAtIDFdLCBjO1xyXG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSBrID0gLTEgLyAoNiAqIHRoaXMuYXJlYSgpKTtcclxuICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgIGEgPSBiO1xyXG4gICAgICBiID0gdGhpc1tpXTtcclxuICAgICAgYyA9IGFbMF0gKiBiWzFdIC0gYlswXSAqIGFbMV07XHJcbiAgICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7XHJcbiAgICAgIHkgKz0gKGFbMV0gKyBiWzFdKSAqIGM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gWyB4ICogaywgeSAqIGsgXTtcclxuICB9O1xyXG4gIGQzX2dlb21fcG9seWdvblByb3RvdHlwZS5jbGlwID0gZnVuY3Rpb24oc3ViamVjdCkge1xyXG4gICAgdmFyIGlucHV0LCBjbG9zZWQgPSBkM19nZW9tX3BvbHlnb25DbG9zZWQoc3ViamVjdCksIGkgPSAtMSwgbiA9IHRoaXMubGVuZ3RoIC0gZDNfZ2VvbV9wb2x5Z29uQ2xvc2VkKHRoaXMpLCBqLCBtLCBhID0gdGhpc1tuIC0gMV0sIGIsIGMsIGQ7XHJcbiAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICBpbnB1dCA9IHN1YmplY3Quc2xpY2UoKTtcclxuICAgICAgc3ViamVjdC5sZW5ndGggPSAwO1xyXG4gICAgICBiID0gdGhpc1tpXTtcclxuICAgICAgYyA9IGlucHV0WyhtID0gaW5wdXQubGVuZ3RoIC0gY2xvc2VkKSAtIDFdO1xyXG4gICAgICBqID0gLTE7XHJcbiAgICAgIHdoaWxlICgrK2ogPCBtKSB7XHJcbiAgICAgICAgZCA9IGlucHV0W2pdO1xyXG4gICAgICAgIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoZCwgYSwgYikpIHtcclxuICAgICAgICAgIGlmICghZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGMsIGEsIGIpKSB7XHJcbiAgICAgICAgICAgIHN1YmplY3QucHVzaChkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc3ViamVjdC5wdXNoKGQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGMsIGEsIGIpKSB7XHJcbiAgICAgICAgICBzdWJqZWN0LnB1c2goZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0KGMsIGQsIGEsIGIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYyA9IGQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNsb3NlZCkgc3ViamVjdC5wdXNoKHN1YmplY3RbMF0pO1xyXG4gICAgICBhID0gYjtcclxuICAgIH1cclxuICAgIHJldHVybiBzdWJqZWN0O1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKHAsIGEsIGIpIHtcclxuICAgIHJldHVybiAoYlswXSAtIGFbMF0pICogKHBbMV0gLSBhWzFdKSA8IChiWzFdIC0gYVsxXSkgKiAocFswXSAtIGFbMF0pO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikge1xyXG4gICAgdmFyIHgxID0gY1swXSwgeDMgPSBhWzBdLCB4MjEgPSBkWzBdIC0geDEsIHg0MyA9IGJbMF0gLSB4MywgeTEgPSBjWzFdLCB5MyA9IGFbMV0sIHkyMSA9IGRbMV0gLSB5MSwgeTQzID0gYlsxXSAtIHkzLCB1YSA9ICh4NDMgKiAoeTEgLSB5MykgLSB5NDMgKiAoeDEgLSB4MykpIC8gKHk0MyAqIHgyMSAtIHg0MyAqIHkyMSk7XHJcbiAgICByZXR1cm4gWyB4MSArIHVhICogeDIxLCB5MSArIHVhICogeTIxIF07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fcG9seWdvbkNsb3NlZChjb29yZGluYXRlcykge1xyXG4gICAgdmFyIGEgPSBjb29yZGluYXRlc1swXSwgYiA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgcmV0dXJuICEoYVswXSAtIGJbMF0gfHwgYVsxXSAtIGJbMV0pO1xyXG4gIH1cclxuICB2YXIgZDNfZ2VvbV92b3Jvbm9pRWRnZXMsIGQzX2dlb21fdm9yb25vaUNlbGxzLCBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLCBkM19nZW9tX3Zvcm9ub2lCZWFjaFBvb2wgPSBbXSwgZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGUsIGQzX2dlb21fdm9yb25vaUNpcmNsZXMsIGQzX2dlb21fdm9yb25vaUNpcmNsZVBvb2wgPSBbXTtcclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lCZWFjaCgpIHtcclxuICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrTm9kZSh0aGlzKTtcclxuICAgIHRoaXMuZWRnZSA9IHRoaXMuc2l0ZSA9IHRoaXMuY2lyY2xlID0gbnVsbDtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQmVhY2goc2l0ZSkge1xyXG4gICAgdmFyIGJlYWNoID0gZDNfZ2VvbV92b3Jvbm9pQmVhY2hQb29sLnBvcCgpIHx8IG5ldyBkM19nZW9tX3Zvcm9ub2lCZWFjaCgpO1xyXG4gICAgYmVhY2guc2l0ZSA9IHNpdGU7XHJcbiAgICByZXR1cm4gYmVhY2g7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaURldGFjaEJlYWNoKGJlYWNoKSB7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUoYmVhY2gpO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcy5yZW1vdmUoYmVhY2gpO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hQb29sLnB1c2goYmVhY2gpO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKGJlYWNoKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVtb3ZlQmVhY2goYmVhY2gpIHtcclxuICAgIHZhciBjaXJjbGUgPSBiZWFjaC5jaXJjbGUsIHggPSBjaXJjbGUueCwgeSA9IGNpcmNsZS5jeSwgdmVydGV4ID0ge1xyXG4gICAgICB4OiB4LFxyXG4gICAgICB5OiB5XHJcbiAgICB9LCBwcmV2aW91cyA9IGJlYWNoLlAsIG5leHQgPSBiZWFjaC5OLCBkaXNhcHBlYXJpbmcgPSBbIGJlYWNoIF07XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaChiZWFjaCk7XHJcbiAgICB2YXIgbEFyYyA9IHByZXZpb3VzO1xyXG4gICAgd2hpbGUgKGxBcmMuY2lyY2xlICYmIGFicyh4IC0gbEFyYy5jaXJjbGUueCkgPCDOtSAmJiBhYnMoeSAtIGxBcmMuY2lyY2xlLmN5KSA8IM61KSB7XHJcbiAgICAgIHByZXZpb3VzID0gbEFyYy5QO1xyXG4gICAgICBkaXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTtcclxuICAgICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQmVhY2gobEFyYyk7XHJcbiAgICAgIGxBcmMgPSBwcmV2aW91cztcclxuICAgIH1cclxuICAgIGRpc2FwcGVhcmluZy51bnNoaWZ0KGxBcmMpO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKGxBcmMpO1xyXG4gICAgdmFyIHJBcmMgPSBuZXh0O1xyXG4gICAgd2hpbGUgKHJBcmMuY2lyY2xlICYmIGFicyh4IC0gckFyYy5jaXJjbGUueCkgPCDOtSAmJiBhYnMoeSAtIHJBcmMuY2lyY2xlLmN5KSA8IM61KSB7XHJcbiAgICAgIG5leHQgPSByQXJjLk47XHJcbiAgICAgIGRpc2FwcGVhcmluZy5wdXNoKHJBcmMpO1xyXG4gICAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaChyQXJjKTtcclxuICAgICAgckFyYyA9IG5leHQ7XHJcbiAgICB9XHJcbiAgICBkaXNhcHBlYXJpbmcucHVzaChyQXJjKTtcclxuICAgIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShyQXJjKTtcclxuICAgIHZhciBuQXJjcyA9IGRpc2FwcGVhcmluZy5sZW5ndGgsIGlBcmM7XHJcbiAgICBmb3IgKGlBcmMgPSAxOyBpQXJjIDwgbkFyY3M7ICsraUFyYykge1xyXG4gICAgICByQXJjID0gZGlzYXBwZWFyaW5nW2lBcmNdO1xyXG4gICAgICBsQXJjID0gZGlzYXBwZWFyaW5nW2lBcmMgLSAxXTtcclxuICAgICAgZDNfZ2VvbV92b3Jvbm9pU2V0RWRnZUVuZChyQXJjLmVkZ2UsIGxBcmMuc2l0ZSwgckFyYy5zaXRlLCB2ZXJ0ZXgpO1xyXG4gICAgfVxyXG4gICAgbEFyYyA9IGRpc2FwcGVhcmluZ1swXTtcclxuICAgIHJBcmMgPSBkaXNhcHBlYXJpbmdbbkFyY3MgLSAxXTtcclxuICAgIHJBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobEFyYy5zaXRlLCByQXJjLnNpdGUsIG51bGwsIHZlcnRleCk7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUobEFyYyk7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUockFyYyk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUFkZEJlYWNoKHNpdGUpIHtcclxuICAgIHZhciB4ID0gc2l0ZS54LCBkaXJlY3RyaXggPSBzaXRlLnksIGxBcmMsIHJBcmMsIGR4bCwgZHhyLCBub2RlID0gZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcy5fO1xyXG4gICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgZHhsID0gZDNfZ2VvbV92b3Jvbm9pTGVmdEJyZWFrUG9pbnQobm9kZSwgZGlyZWN0cml4KSAtIHg7XHJcbiAgICAgIGlmIChkeGwgPiDOtSkgbm9kZSA9IG5vZGUuTDsgZWxzZSB7XHJcbiAgICAgICAgZHhyID0geCAtIGQzX2dlb21fdm9yb25vaVJpZ2h0QnJlYWtQb2ludChub2RlLCBkaXJlY3RyaXgpO1xyXG4gICAgICAgIGlmIChkeHIgPiDOtSkge1xyXG4gICAgICAgICAgaWYgKCFub2RlLlIpIHtcclxuICAgICAgICAgICAgbEFyYyA9IG5vZGU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbm9kZSA9IG5vZGUuUjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGR4bCA+IC3OtSkge1xyXG4gICAgICAgICAgICBsQXJjID0gbm9kZS5QO1xyXG4gICAgICAgICAgICByQXJjID0gbm9kZTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZHhyID4gLc61KSB7XHJcbiAgICAgICAgICAgIGxBcmMgPSBub2RlO1xyXG4gICAgICAgICAgICByQXJjID0gbm9kZS5OO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbEFyYyA9IHJBcmMgPSBub2RlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgbmV3QXJjID0gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQmVhY2goc2l0ZSk7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLmluc2VydChsQXJjLCBuZXdBcmMpO1xyXG4gICAgaWYgKCFsQXJjICYmICFyQXJjKSByZXR1cm47XHJcbiAgICBpZiAobEFyYyA9PT0gckFyYykge1xyXG4gICAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUobEFyYyk7XHJcbiAgICAgIHJBcmMgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVCZWFjaChsQXJjLnNpdGUpO1xyXG4gICAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLmluc2VydChuZXdBcmMsIHJBcmMpO1xyXG4gICAgICBuZXdBcmMuZWRnZSA9IHJBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobEFyYy5zaXRlLCBuZXdBcmMuc2l0ZSk7XHJcbiAgICAgIGQzX2dlb21fdm9yb25vaUF0dGFjaENpcmNsZShsQXJjKTtcclxuICAgICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKHJBcmMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXJBcmMpIHtcclxuICAgICAgbmV3QXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUobEFyYyk7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUockFyYyk7XHJcbiAgICB2YXIgbFNpdGUgPSBsQXJjLnNpdGUsIGF4ID0gbFNpdGUueCwgYXkgPSBsU2l0ZS55LCBieCA9IHNpdGUueCAtIGF4LCBieSA9IHNpdGUueSAtIGF5LCByU2l0ZSA9IHJBcmMuc2l0ZSwgY3ggPSByU2l0ZS54IC0gYXgsIGN5ID0gclNpdGUueSAtIGF5LCBkID0gMiAqIChieCAqIGN5IC0gYnkgKiBjeCksIGhiID0gYnggKiBieCArIGJ5ICogYnksIGhjID0gY3ggKiBjeCArIGN5ICogY3ksIHZlcnRleCA9IHtcclxuICAgICAgeDogKGN5ICogaGIgLSBieSAqIGhjKSAvIGQgKyBheCxcclxuICAgICAgeTogKGJ4ICogaGMgLSBjeCAqIGhiKSAvIGQgKyBheVxyXG4gICAgfTtcclxuICAgIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQockFyYy5lZGdlLCBsU2l0ZSwgclNpdGUsIHZlcnRleCk7XHJcbiAgICBuZXdBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobFNpdGUsIHNpdGUsIG51bGwsIHZlcnRleCk7XHJcbiAgICByQXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKHNpdGUsIHJTaXRlLCBudWxsLCB2ZXJ0ZXgpO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKGxBcmMpO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKHJBcmMpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lMZWZ0QnJlYWtQb2ludChhcmMsIGRpcmVjdHJpeCkge1xyXG4gICAgdmFyIHNpdGUgPSBhcmMuc2l0ZSwgcmZvY3ggPSBzaXRlLngsIHJmb2N5ID0gc2l0ZS55LCBwYnkyID0gcmZvY3kgLSBkaXJlY3RyaXg7XHJcbiAgICBpZiAoIXBieTIpIHJldHVybiByZm9jeDtcclxuICAgIHZhciBsQXJjID0gYXJjLlA7XHJcbiAgICBpZiAoIWxBcmMpIHJldHVybiAtSW5maW5pdHk7XHJcbiAgICBzaXRlID0gbEFyYy5zaXRlO1xyXG4gICAgdmFyIGxmb2N4ID0gc2l0ZS54LCBsZm9jeSA9IHNpdGUueSwgcGxieTIgPSBsZm9jeSAtIGRpcmVjdHJpeDtcclxuICAgIGlmICghcGxieTIpIHJldHVybiBsZm9jeDtcclxuICAgIHZhciBobCA9IGxmb2N4IC0gcmZvY3gsIGFieTIgPSAxIC8gcGJ5MiAtIDEgLyBwbGJ5MiwgYiA9IGhsIC8gcGxieTI7XHJcbiAgICBpZiAoYWJ5MikgcmV0dXJuICgtYiArIE1hdGguc3FydChiICogYiAtIDIgKiBhYnkyICogKGhsICogaGwgLyAoLTIgKiBwbGJ5MikgLSBsZm9jeSArIHBsYnkyIC8gMiArIHJmb2N5IC0gcGJ5MiAvIDIpKSkgLyBhYnkyICsgcmZvY3g7XHJcbiAgICByZXR1cm4gKHJmb2N4ICsgbGZvY3gpIC8gMjtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmlnaHRCcmVha1BvaW50KGFyYywgZGlyZWN0cml4KSB7XHJcbiAgICB2YXIgckFyYyA9IGFyYy5OO1xyXG4gICAgaWYgKHJBcmMpIHJldHVybiBkM19nZW9tX3Zvcm9ub2lMZWZ0QnJlYWtQb2ludChyQXJjLCBkaXJlY3RyaXgpO1xyXG4gICAgdmFyIHNpdGUgPSBhcmMuc2l0ZTtcclxuICAgIHJldHVybiBzaXRlLnkgPT09IGRpcmVjdHJpeCA/IHNpdGUueCA6IEluZmluaXR5O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDZWxsKHNpdGUpIHtcclxuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XHJcbiAgICB0aGlzLmVkZ2VzID0gW107XHJcbiAgfVxyXG4gIGQzX2dlb21fdm9yb25vaUNlbGwucHJvdG90eXBlLnByZXBhcmUgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBoYWxmRWRnZXMgPSB0aGlzLmVkZ2VzLCBpSGFsZkVkZ2UgPSBoYWxmRWRnZXMubGVuZ3RoLCBlZGdlO1xyXG4gICAgd2hpbGUgKGlIYWxmRWRnZS0tKSB7XHJcbiAgICAgIGVkZ2UgPSBoYWxmRWRnZXNbaUhhbGZFZGdlXS5lZGdlO1xyXG4gICAgICBpZiAoIWVkZ2UuYiB8fCAhZWRnZS5hKSBoYWxmRWRnZXMuc3BsaWNlKGlIYWxmRWRnZSwgMSk7XHJcbiAgICB9XHJcbiAgICBoYWxmRWRnZXMuc29ydChkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZU9yZGVyKTtcclxuICAgIHJldHVybiBoYWxmRWRnZXMubGVuZ3RoO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ2xvc2VDZWxscyhleHRlbnQpIHtcclxuICAgIHZhciB4MCA9IGV4dGVudFswXVswXSwgeDEgPSBleHRlbnRbMV1bMF0sIHkwID0gZXh0ZW50WzBdWzFdLCB5MSA9IGV4dGVudFsxXVsxXSwgeDIsIHkyLCB4MywgeTMsIGNlbGxzID0gZDNfZ2VvbV92b3Jvbm9pQ2VsbHMsIGlDZWxsID0gY2VsbHMubGVuZ3RoLCBjZWxsLCBpSGFsZkVkZ2UsIGhhbGZFZGdlcywgbkhhbGZFZGdlcywgc3RhcnQsIGVuZDtcclxuICAgIHdoaWxlIChpQ2VsbC0tKSB7XHJcbiAgICAgIGNlbGwgPSBjZWxsc1tpQ2VsbF07XHJcbiAgICAgIGlmICghY2VsbCB8fCAhY2VsbC5wcmVwYXJlKCkpIGNvbnRpbnVlO1xyXG4gICAgICBoYWxmRWRnZXMgPSBjZWxsLmVkZ2VzO1xyXG4gICAgICBuSGFsZkVkZ2VzID0gaGFsZkVkZ2VzLmxlbmd0aDtcclxuICAgICAgaUhhbGZFZGdlID0gMDtcclxuICAgICAgd2hpbGUgKGlIYWxmRWRnZSA8IG5IYWxmRWRnZXMpIHtcclxuICAgICAgICBlbmQgPSBoYWxmRWRnZXNbaUhhbGZFZGdlXS5lbmQoKSwgeDMgPSBlbmQueCwgeTMgPSBlbmQueTtcclxuICAgICAgICBzdGFydCA9IGhhbGZFZGdlc1srK2lIYWxmRWRnZSAlIG5IYWxmRWRnZXNdLnN0YXJ0KCksIHgyID0gc3RhcnQueCwgeTIgPSBzdGFydC55O1xyXG4gICAgICAgIGlmIChhYnMoeDMgLSB4MikgPiDOtSB8fCBhYnMoeTMgLSB5MikgPiDOtSkge1xyXG4gICAgICAgICAgaGFsZkVkZ2VzLnNwbGljZShpSGFsZkVkZ2UsIDAsIG5ldyBkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZShkM19nZW9tX3Zvcm9ub2lDcmVhdGVCb3JkZXJFZGdlKGNlbGwuc2l0ZSwgZW5kLCBhYnMoeDMgLSB4MCkgPCDOtSAmJiB5MSAtIHkzID4gzrUgPyB7XHJcbiAgICAgICAgICAgIHg6IHgwLFxyXG4gICAgICAgICAgICB5OiBhYnMoeDIgLSB4MCkgPCDOtSA/IHkyIDogeTFcclxuICAgICAgICAgIH0gOiBhYnMoeTMgLSB5MSkgPCDOtSAmJiB4MSAtIHgzID4gzrUgPyB7XHJcbiAgICAgICAgICAgIHg6IGFicyh5MiAtIHkxKSA8IM61ID8geDIgOiB4MSxcclxuICAgICAgICAgICAgeTogeTFcclxuICAgICAgICAgIH0gOiBhYnMoeDMgLSB4MSkgPCDOtSAmJiB5MyAtIHkwID4gzrUgPyB7XHJcbiAgICAgICAgICAgIHg6IHgxLFxyXG4gICAgICAgICAgICB5OiBhYnMoeDIgLSB4MSkgPCDOtSA/IHkyIDogeTBcclxuICAgICAgICAgIH0gOiBhYnMoeTMgLSB5MCkgPCDOtSAmJiB4MyAtIHgwID4gzrUgPyB7XHJcbiAgICAgICAgICAgIHg6IGFicyh5MiAtIHkwKSA8IM61ID8geDIgOiB4MCxcclxuICAgICAgICAgICAgeTogeTBcclxuICAgICAgICAgIH0gOiBudWxsKSwgY2VsbC5zaXRlLCBudWxsKSk7XHJcbiAgICAgICAgICArK25IYWxmRWRnZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUhhbGZFZGdlT3JkZXIoYSwgYikge1xyXG4gICAgcmV0dXJuIGIuYW5nbGUgLSBhLmFuZ2xlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDaXJjbGUoKSB7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUodGhpcyk7XHJcbiAgICB0aGlzLnggPSB0aGlzLnkgPSB0aGlzLmFyYyA9IHRoaXMuc2l0ZSA9IHRoaXMuY3kgPSBudWxsO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUoYXJjKSB7XHJcbiAgICB2YXIgbEFyYyA9IGFyYy5QLCByQXJjID0gYXJjLk47XHJcbiAgICBpZiAoIWxBcmMgfHwgIXJBcmMpIHJldHVybjtcclxuICAgIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwgY1NpdGUgPSBhcmMuc2l0ZSwgclNpdGUgPSByQXJjLnNpdGU7XHJcbiAgICBpZiAobFNpdGUgPT09IHJTaXRlKSByZXR1cm47XHJcbiAgICB2YXIgYnggPSBjU2l0ZS54LCBieSA9IGNTaXRlLnksIGF4ID0gbFNpdGUueCAtIGJ4LCBheSA9IGxTaXRlLnkgLSBieSwgY3ggPSByU2l0ZS54IC0gYngsIGN5ID0gclNpdGUueSAtIGJ5O1xyXG4gICAgdmFyIGQgPSAyICogKGF4ICogY3kgLSBheSAqIGN4KTtcclxuICAgIGlmIChkID49IC3OtTIpIHJldHVybjtcclxuICAgIHZhciBoYSA9IGF4ICogYXggKyBheSAqIGF5LCBoYyA9IGN4ICogY3ggKyBjeSAqIGN5LCB4ID0gKGN5ICogaGEgLSBheSAqIGhjKSAvIGQsIHkgPSAoYXggKiBoYyAtIGN4ICogaGEpIC8gZCwgY3kgPSB5ICsgYnk7XHJcbiAgICB2YXIgY2lyY2xlID0gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlUG9vbC5wb3AoKSB8fCBuZXcgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlKCk7XHJcbiAgICBjaXJjbGUuYXJjID0gYXJjO1xyXG4gICAgY2lyY2xlLnNpdGUgPSBjU2l0ZTtcclxuICAgIGNpcmNsZS54ID0geCArIGJ4O1xyXG4gICAgY2lyY2xlLnkgPSBjeSArIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcclxuICAgIGNpcmNsZS5jeSA9IGN5O1xyXG4gICAgYXJjLmNpcmNsZSA9IGNpcmNsZTtcclxuICAgIHZhciBiZWZvcmUgPSBudWxsLCBub2RlID0gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlcy5fO1xyXG4gICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgaWYgKGNpcmNsZS55IDwgbm9kZS55IHx8IGNpcmNsZS55ID09PSBub2RlLnkgJiYgY2lyY2xlLnggPD0gbm9kZS54KSB7XHJcbiAgICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDsgZWxzZSB7XHJcbiAgICAgICAgICBiZWZvcmUgPSBub2RlLlA7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKG5vZGUuUikgbm9kZSA9IG5vZGUuUjsgZWxzZSB7XHJcbiAgICAgICAgICBiZWZvcmUgPSBub2RlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzLmluc2VydChiZWZvcmUsIGNpcmNsZSk7XHJcbiAgICBpZiAoIWJlZm9yZSkgZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGUgPSBjaXJjbGU7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShhcmMpIHtcclxuICAgIHZhciBjaXJjbGUgPSBhcmMuY2lyY2xlO1xyXG4gICAgaWYgKGNpcmNsZSkge1xyXG4gICAgICBpZiAoIWNpcmNsZS5QKSBkM19nZW9tX3Zvcm9ub2lGaXJzdENpcmNsZSA9IGNpcmNsZS5OO1xyXG4gICAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzLnJlbW92ZShjaXJjbGUpO1xyXG4gICAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVQb29sLnB1c2goY2lyY2xlKTtcclxuICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKGNpcmNsZSk7XHJcbiAgICAgIGFyYy5jaXJjbGUgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDbGlwRWRnZXMoZXh0ZW50KSB7XHJcbiAgICB2YXIgZWRnZXMgPSBkM19nZW9tX3Zvcm9ub2lFZGdlcywgY2xpcCA9IGQzX2dlb21fY2xpcExpbmUoZXh0ZW50WzBdWzBdLCBleHRlbnRbMF1bMV0sIGV4dGVudFsxXVswXSwgZXh0ZW50WzFdWzFdKSwgaSA9IGVkZ2VzLmxlbmd0aCwgZTtcclxuICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgZSA9IGVkZ2VzW2ldO1xyXG4gICAgICBpZiAoIWQzX2dlb21fdm9yb25vaUNvbm5lY3RFZGdlKGUsIGV4dGVudCkgfHwgIWNsaXAoZSkgfHwgYWJzKGUuYS54IC0gZS5iLngpIDwgzrUgJiYgYWJzKGUuYS55IC0gZS5iLnkpIDwgzrUpIHtcclxuICAgICAgICBlLmEgPSBlLmIgPSBudWxsO1xyXG4gICAgICAgIGVkZ2VzLnNwbGljZShpLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDb25uZWN0RWRnZShlZGdlLCBleHRlbnQpIHtcclxuICAgIHZhciB2YiA9IGVkZ2UuYjtcclxuICAgIGlmICh2YikgcmV0dXJuIHRydWU7XHJcbiAgICB2YXIgdmEgPSBlZGdlLmEsIHgwID0gZXh0ZW50WzBdWzBdLCB4MSA9IGV4dGVudFsxXVswXSwgeTAgPSBleHRlbnRbMF1bMV0sIHkxID0gZXh0ZW50WzFdWzFdLCBsU2l0ZSA9IGVkZ2UubCwgclNpdGUgPSBlZGdlLnIsIGx4ID0gbFNpdGUueCwgbHkgPSBsU2l0ZS55LCByeCA9IHJTaXRlLngsIHJ5ID0gclNpdGUueSwgZnggPSAobHggKyByeCkgLyAyLCBmeSA9IChseSArIHJ5KSAvIDIsIGZtLCBmYjtcclxuICAgIGlmIChyeSA9PT0gbHkpIHtcclxuICAgICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjtcclxuICAgICAgaWYgKGx4ID4gcngpIHtcclxuICAgICAgICBpZiAoIXZhKSB2YSA9IHtcclxuICAgICAgICAgIHg6IGZ4LFxyXG4gICAgICAgICAgeTogeTBcclxuICAgICAgICB9OyBlbHNlIGlmICh2YS55ID49IHkxKSByZXR1cm47XHJcbiAgICAgICAgdmIgPSB7XHJcbiAgICAgICAgICB4OiBmeCxcclxuICAgICAgICAgIHk6IHkxXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIXZhKSB2YSA9IHtcclxuICAgICAgICAgIHg6IGZ4LFxyXG4gICAgICAgICAgeTogeTFcclxuICAgICAgICB9OyBlbHNlIGlmICh2YS55IDwgeTApIHJldHVybjtcclxuICAgICAgICB2YiA9IHtcclxuICAgICAgICAgIHg6IGZ4LFxyXG4gICAgICAgICAgeTogeTBcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmbSA9IChseCAtIHJ4KSAvIChyeSAtIGx5KTtcclxuICAgICAgZmIgPSBmeSAtIGZtICogZng7XHJcbiAgICAgIGlmIChmbSA8IC0xIHx8IGZtID4gMSkge1xyXG4gICAgICAgIGlmIChseCA+IHJ4KSB7XHJcbiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHtcclxuICAgICAgICAgICAgeDogKHkwIC0gZmIpIC8gZm0sXHJcbiAgICAgICAgICAgIHk6IHkwXHJcbiAgICAgICAgICB9OyBlbHNlIGlmICh2YS55ID49IHkxKSByZXR1cm47XHJcbiAgICAgICAgICB2YiA9IHtcclxuICAgICAgICAgICAgeDogKHkxIC0gZmIpIC8gZm0sXHJcbiAgICAgICAgICAgIHk6IHkxXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHtcclxuICAgICAgICAgICAgeDogKHkxIC0gZmIpIC8gZm0sXHJcbiAgICAgICAgICAgIHk6IHkxXHJcbiAgICAgICAgICB9OyBlbHNlIGlmICh2YS55IDwgeTApIHJldHVybjtcclxuICAgICAgICAgIHZiID0ge1xyXG4gICAgICAgICAgICB4OiAoeTAgLSBmYikgLyBmbSxcclxuICAgICAgICAgICAgeTogeTBcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChseSA8IHJ5KSB7XHJcbiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHtcclxuICAgICAgICAgICAgeDogeDAsXHJcbiAgICAgICAgICAgIHk6IGZtICogeDAgKyBmYlxyXG4gICAgICAgICAgfTsgZWxzZSBpZiAodmEueCA+PSB4MSkgcmV0dXJuO1xyXG4gICAgICAgICAgdmIgPSB7XHJcbiAgICAgICAgICAgIHg6IHgxLFxyXG4gICAgICAgICAgICB5OiBmbSAqIHgxICsgZmJcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICghdmEpIHZhID0ge1xyXG4gICAgICAgICAgICB4OiB4MSxcclxuICAgICAgICAgICAgeTogZm0gKiB4MSArIGZiXHJcbiAgICAgICAgICB9OyBlbHNlIGlmICh2YS54IDwgeDApIHJldHVybjtcclxuICAgICAgICAgIHZiID0ge1xyXG4gICAgICAgICAgICB4OiB4MCxcclxuICAgICAgICAgICAgeTogZm0gKiB4MCArIGZiXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWRnZS5hID0gdmE7XHJcbiAgICBlZGdlLmIgPSB2YjtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lFZGdlKGxTaXRlLCByU2l0ZSkge1xyXG4gICAgdGhpcy5sID0gbFNpdGU7XHJcbiAgICB0aGlzLnIgPSByU2l0ZTtcclxuICAgIHRoaXMuYSA9IHRoaXMuYiA9IG51bGw7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobFNpdGUsIHJTaXRlLCB2YSwgdmIpIHtcclxuICAgIHZhciBlZGdlID0gbmV3IGQzX2dlb21fdm9yb25vaUVkZ2UobFNpdGUsIHJTaXRlKTtcclxuICAgIGQzX2dlb21fdm9yb25vaUVkZ2VzLnB1c2goZWRnZSk7XHJcbiAgICBpZiAodmEpIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQoZWRnZSwgbFNpdGUsIHJTaXRlLCB2YSk7XHJcbiAgICBpZiAodmIpIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQoZWRnZSwgclNpdGUsIGxTaXRlLCB2Yik7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lDZWxsc1tsU2l0ZS5pXS5lZGdlcy5wdXNoKG5ldyBkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZShlZGdlLCBsU2l0ZSwgclNpdGUpKTtcclxuICAgIGQzX2dlb21fdm9yb25vaUNlbGxzW3JTaXRlLmldLmVkZ2VzLnB1c2gobmV3IGQzX2dlb21fdm9yb25vaUhhbGZFZGdlKGVkZ2UsIHJTaXRlLCBsU2l0ZSkpO1xyXG4gICAgcmV0dXJuIGVkZ2U7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNyZWF0ZUJvcmRlckVkZ2UobFNpdGUsIHZhLCB2Yikge1xyXG4gICAgdmFyIGVkZ2UgPSBuZXcgZDNfZ2VvbV92b3Jvbm9pRWRnZShsU2l0ZSwgbnVsbCk7XHJcbiAgICBlZGdlLmEgPSB2YTtcclxuICAgIGVkZ2UuYiA9IHZiO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pRWRnZXMucHVzaChlZGdlKTtcclxuICAgIHJldHVybiBlZGdlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lTZXRFZGdlRW5kKGVkZ2UsIGxTaXRlLCByU2l0ZSwgdmVydGV4KSB7XHJcbiAgICBpZiAoIWVkZ2UuYSAmJiAhZWRnZS5iKSB7XHJcbiAgICAgIGVkZ2UuYSA9IHZlcnRleDtcclxuICAgICAgZWRnZS5sID0gbFNpdGU7XHJcbiAgICAgIGVkZ2UuciA9IHJTaXRlO1xyXG4gICAgfSBlbHNlIGlmIChlZGdlLmwgPT09IHJTaXRlKSB7XHJcbiAgICAgIGVkZ2UuYiA9IHZlcnRleDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVkZ2UuYSA9IHZlcnRleDtcclxuICAgIH1cclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UoZWRnZSwgbFNpdGUsIHJTaXRlKSB7XHJcbiAgICB2YXIgdmEgPSBlZGdlLmEsIHZiID0gZWRnZS5iO1xyXG4gICAgdGhpcy5lZGdlID0gZWRnZTtcclxuICAgIHRoaXMuc2l0ZSA9IGxTaXRlO1xyXG4gICAgdGhpcy5hbmdsZSA9IHJTaXRlID8gTWF0aC5hdGFuMihyU2l0ZS55IC0gbFNpdGUueSwgclNpdGUueCAtIGxTaXRlLngpIDogZWRnZS5sID09PSBsU2l0ZSA/IE1hdGguYXRhbjIodmIueCAtIHZhLngsIHZhLnkgLSB2Yi55KSA6IE1hdGguYXRhbjIodmEueCAtIHZiLngsIHZiLnkgLSB2YS55KTtcclxuICB9XHJcbiAgZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UucHJvdG90eXBlID0ge1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5lZGdlLmwgPT09IHRoaXMuc2l0ZSA/IHRoaXMuZWRnZS5hIDogdGhpcy5lZGdlLmI7XHJcbiAgICB9LFxyXG4gICAgZW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWRnZS5sID09PSB0aGlzLnNpdGUgPyB0aGlzLmVkZ2UuYiA6IHRoaXMuZWRnZS5hO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tUcmVlKCkge1xyXG4gICAgdGhpcy5fID0gbnVsbDtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKG5vZGUpIHtcclxuICAgIG5vZGUuVSA9IG5vZGUuQyA9IG5vZGUuTCA9IG5vZGUuUiA9IG5vZGUuUCA9IG5vZGUuTiA9IG51bGw7XHJcbiAgfVxyXG4gIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZS5wcm90b3R5cGUgPSB7XHJcbiAgICBpbnNlcnQ6IGZ1bmN0aW9uKGFmdGVyLCBub2RlKSB7XHJcbiAgICAgIHZhciBwYXJlbnQsIGdyYW5kcGEsIHVuY2xlO1xyXG4gICAgICBpZiAoYWZ0ZXIpIHtcclxuICAgICAgICBub2RlLlAgPSBhZnRlcjtcclxuICAgICAgICBub2RlLk4gPSBhZnRlci5OO1xyXG4gICAgICAgIGlmIChhZnRlci5OKSBhZnRlci5OLlAgPSBub2RlO1xyXG4gICAgICAgIGFmdGVyLk4gPSBub2RlO1xyXG4gICAgICAgIGlmIChhZnRlci5SKSB7XHJcbiAgICAgICAgICBhZnRlciA9IGFmdGVyLlI7XHJcbiAgICAgICAgICB3aGlsZSAoYWZ0ZXIuTCkgYWZ0ZXIgPSBhZnRlci5MO1xyXG4gICAgICAgICAgYWZ0ZXIuTCA9IG5vZGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFmdGVyLlIgPSBub2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJlbnQgPSBhZnRlcjtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl8pIHtcclxuICAgICAgICBhZnRlciA9IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrRmlyc3QodGhpcy5fKTtcclxuICAgICAgICBub2RlLlAgPSBudWxsO1xyXG4gICAgICAgIG5vZGUuTiA9IGFmdGVyO1xyXG4gICAgICAgIGFmdGVyLlAgPSBhZnRlci5MID0gbm9kZTtcclxuICAgICAgICBwYXJlbnQgPSBhZnRlcjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub2RlLlAgPSBub2RlLk4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuXyA9IG5vZGU7XHJcbiAgICAgICAgcGFyZW50ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBub2RlLkwgPSBub2RlLlIgPSBudWxsO1xyXG4gICAgICBub2RlLlUgPSBwYXJlbnQ7XHJcbiAgICAgIG5vZGUuQyA9IHRydWU7XHJcbiAgICAgIGFmdGVyID0gbm9kZTtcclxuICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuQykge1xyXG4gICAgICAgIGdyYW5kcGEgPSBwYXJlbnQuVTtcclxuICAgICAgICBpZiAocGFyZW50ID09PSBncmFuZHBhLkwpIHtcclxuICAgICAgICAgIHVuY2xlID0gZ3JhbmRwYS5SO1xyXG4gICAgICAgICAgaWYgKHVuY2xlICYmIHVuY2xlLkMpIHtcclxuICAgICAgICAgICAgcGFyZW50LkMgPSB1bmNsZS5DID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7XHJcbiAgICAgICAgICAgIGFmdGVyID0gZ3JhbmRwYTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LlIpIHtcclxuICAgICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTtcclxuICAgICAgICAgICAgICBhZnRlciA9IHBhcmVudDtcclxuICAgICAgICAgICAgICBwYXJlbnQgPSBhZnRlci5VO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmVudC5DID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7XHJcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgZ3JhbmRwYSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHVuY2xlID0gZ3JhbmRwYS5MO1xyXG4gICAgICAgICAgaWYgKHVuY2xlICYmIHVuY2xlLkMpIHtcclxuICAgICAgICAgICAgcGFyZW50LkMgPSB1bmNsZS5DID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7XHJcbiAgICAgICAgICAgIGFmdGVyID0gZ3JhbmRwYTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LkwpIHtcclxuICAgICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIHBhcmVudCk7XHJcbiAgICAgICAgICAgICAgYWZ0ZXIgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnQuQyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlO1xyXG4gICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgZ3JhbmRwYSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmVudCA9IGFmdGVyLlU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fLkMgPSBmYWxzZTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgaWYgKG5vZGUuTikgbm9kZS5OLlAgPSBub2RlLlA7XHJcbiAgICAgIGlmIChub2RlLlApIG5vZGUuUC5OID0gbm9kZS5OO1xyXG4gICAgICBub2RlLk4gPSBub2RlLlAgPSBudWxsO1xyXG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5VLCBzaWJsaW5nLCBsZWZ0ID0gbm9kZS5MLCByaWdodCA9IG5vZGUuUiwgbmV4dCwgcmVkO1xyXG4gICAgICBpZiAoIWxlZnQpIG5leHQgPSByaWdodDsgZWxzZSBpZiAoIXJpZ2h0KSBuZXh0ID0gbGVmdDsgZWxzZSBuZXh0ID0gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tGaXJzdChyaWdodCk7XHJcbiAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICBpZiAocGFyZW50LkwgPT09IG5vZGUpIHBhcmVudC5MID0gbmV4dDsgZWxzZSBwYXJlbnQuUiA9IG5leHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fID0gbmV4dDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdCAmJiByaWdodCkge1xyXG4gICAgICAgIHJlZCA9IG5leHQuQztcclxuICAgICAgICBuZXh0LkMgPSBub2RlLkM7XHJcbiAgICAgICAgbmV4dC5MID0gbGVmdDtcclxuICAgICAgICBsZWZ0LlUgPSBuZXh0O1xyXG4gICAgICAgIGlmIChuZXh0ICE9PSByaWdodCkge1xyXG4gICAgICAgICAgcGFyZW50ID0gbmV4dC5VO1xyXG4gICAgICAgICAgbmV4dC5VID0gbm9kZS5VO1xyXG4gICAgICAgICAgbm9kZSA9IG5leHQuUjtcclxuICAgICAgICAgIHBhcmVudC5MID0gbm9kZTtcclxuICAgICAgICAgIG5leHQuUiA9IHJpZ2h0O1xyXG4gICAgICAgICAgcmlnaHQuVSA9IG5leHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5leHQuVSA9IHBhcmVudDtcclxuICAgICAgICAgIHBhcmVudCA9IG5leHQ7XHJcbiAgICAgICAgICBub2RlID0gbmV4dC5SO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWQgPSBub2RlLkM7XHJcbiAgICAgICAgbm9kZSA9IG5leHQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUpIG5vZGUuVSA9IHBhcmVudDtcclxuICAgICAgaWYgKHJlZCkgcmV0dXJuO1xyXG4gICAgICBpZiAobm9kZSAmJiBub2RlLkMpIHtcclxuICAgICAgICBub2RlLkMgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZG8ge1xyXG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl8pIGJyZWFrO1xyXG4gICAgICAgIGlmIChub2RlID09PSBwYXJlbnQuTCkge1xyXG4gICAgICAgICAgc2libGluZyA9IHBhcmVudC5SO1xyXG4gICAgICAgICAgaWYgKHNpYmxpbmcuQykge1xyXG4gICAgICAgICAgICBzaWJsaW5nLkMgPSBmYWxzZTtcclxuICAgICAgICAgICAgcGFyZW50LkMgPSB0cnVlO1xyXG4gICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTtcclxuICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5SO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHNpYmxpbmcuTCAmJiBzaWJsaW5nLkwuQyB8fCBzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpIHtcclxuICAgICAgICAgICAgaWYgKCFzaWJsaW5nLlIgfHwgIXNpYmxpbmcuUi5DKSB7XHJcbiAgICAgICAgICAgICAgc2libGluZy5MLkMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgc2libGluZyk7XHJcbiAgICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5SO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNpYmxpbmcuQyA9IHBhcmVudC5DO1xyXG4gICAgICAgICAgICBwYXJlbnQuQyA9IHNpYmxpbmcuUi5DID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICBub2RlID0gdGhpcy5fO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2libGluZyA9IHBhcmVudC5MO1xyXG4gICAgICAgICAgaWYgKHNpYmxpbmcuQykge1xyXG4gICAgICAgICAgICBzaWJsaW5nLkMgPSBmYWxzZTtcclxuICAgICAgICAgICAgcGFyZW50LkMgPSB0cnVlO1xyXG4gICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuTDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMgfHwgc2libGluZy5SICYmIHNpYmxpbmcuUi5DKSB7XHJcbiAgICAgICAgICAgIGlmICghc2libGluZy5MIHx8ICFzaWJsaW5nLkwuQykge1xyXG4gICAgICAgICAgICAgIHNpYmxpbmcuUi5DID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgc2libGluZy5DID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgc2libGluZyk7XHJcbiAgICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5MO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNpYmxpbmcuQyA9IHBhcmVudC5DO1xyXG4gICAgICAgICAgICBwYXJlbnQuQyA9IHNpYmxpbmcuTC5DID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTtcclxuICAgICAgICAgICAgbm9kZSA9IHRoaXMuXztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNpYmxpbmcuQyA9IHRydWU7XHJcbiAgICAgICAgbm9kZSA9IHBhcmVudDtcclxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuVTtcclxuICAgICAgfSB3aGlsZSAoIW5vZGUuQyk7XHJcbiAgICAgIGlmIChub2RlKSBub2RlLkMgPSBmYWxzZTtcclxuICAgIH1cclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0cmVlLCBub2RlKSB7XHJcbiAgICB2YXIgcCA9IG5vZGUsIHEgPSBub2RlLlIsIHBhcmVudCA9IHAuVTtcclxuICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgaWYgKHBhcmVudC5MID09PSBwKSBwYXJlbnQuTCA9IHE7IGVsc2UgcGFyZW50LlIgPSBxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJlZS5fID0gcTtcclxuICAgIH1cclxuICAgIHEuVSA9IHBhcmVudDtcclxuICAgIHAuVSA9IHE7XHJcbiAgICBwLlIgPSBxLkw7XHJcbiAgICBpZiAocC5SKSBwLlIuVSA9IHA7XHJcbiAgICBxLkwgPSBwO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0KHRyZWUsIG5vZGUpIHtcclxuICAgIHZhciBwID0gbm9kZSwgcSA9IG5vZGUuTCwgcGFyZW50ID0gcC5VO1xyXG4gICAgaWYgKHBhcmVudCkge1xyXG4gICAgICBpZiAocGFyZW50LkwgPT09IHApIHBhcmVudC5MID0gcTsgZWxzZSBwYXJlbnQuUiA9IHE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0cmVlLl8gPSBxO1xyXG4gICAgfVxyXG4gICAgcS5VID0gcGFyZW50O1xyXG4gICAgcC5VID0gcTtcclxuICAgIHAuTCA9IHEuUjtcclxuICAgIGlmIChwLkwpIHAuTC5VID0gcDtcclxuICAgIHEuUiA9IHA7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrRmlyc3Qobm9kZSkge1xyXG4gICAgd2hpbGUgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDtcclxuICAgIHJldHVybiBub2RlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2koc2l0ZXMsIGJib3gpIHtcclxuICAgIHZhciBzaXRlID0gc2l0ZXMuc29ydChkM19nZW9tX3Zvcm9ub2lWZXJ0ZXhPcmRlcikucG9wKCksIHgwLCB5MCwgY2lyY2xlO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pRWRnZXMgPSBbXTtcclxuICAgIGQzX2dlb21fdm9yb25vaUNlbGxzID0gbmV3IEFycmF5KHNpdGVzLmxlbmd0aCk7XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzID0gbmV3IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZSgpO1xyXG4gICAgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlcyA9IG5ldyBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1RyZWUoKTtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgIGNpcmNsZSA9IGQzX2dlb21fdm9yb25vaUZpcnN0Q2lyY2xlO1xyXG4gICAgICBpZiAoc2l0ZSAmJiAoIWNpcmNsZSB8fCBzaXRlLnkgPCBjaXJjbGUueSB8fCBzaXRlLnkgPT09IGNpcmNsZS55ICYmIHNpdGUueCA8IGNpcmNsZS54KSkge1xyXG4gICAgICAgIGlmIChzaXRlLnggIT09IHgwIHx8IHNpdGUueSAhPT0geTApIHtcclxuICAgICAgICAgIGQzX2dlb21fdm9yb25vaUNlbGxzW3NpdGUuaV0gPSBuZXcgZDNfZ2VvbV92b3Jvbm9pQ2VsbChzaXRlKTtcclxuICAgICAgICAgIGQzX2dlb21fdm9yb25vaUFkZEJlYWNoKHNpdGUpO1xyXG4gICAgICAgICAgeDAgPSBzaXRlLngsIHkwID0gc2l0ZS55O1xyXG4gICAgICAgIH1cclxuICAgICAgICBzaXRlID0gc2l0ZXMucG9wKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2lyY2xlKSB7XHJcbiAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVtb3ZlQmVhY2goY2lyY2xlLmFyYyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChiYm94KSBkM19nZW9tX3Zvcm9ub2lDbGlwRWRnZXMoYmJveCksIGQzX2dlb21fdm9yb25vaUNsb3NlQ2VsbHMoYmJveCk7XHJcbiAgICB2YXIgZGlhZ3JhbSA9IHtcclxuICAgICAgY2VsbHM6IGQzX2dlb21fdm9yb25vaUNlbGxzLFxyXG4gICAgICBlZGdlczogZDNfZ2VvbV92b3Jvbm9pRWRnZXNcclxuICAgIH07XHJcbiAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzID0gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlcyA9IGQzX2dlb21fdm9yb25vaUVkZ2VzID0gZDNfZ2VvbV92b3Jvbm9pQ2VsbHMgPSBudWxsO1xyXG4gICAgcmV0dXJuIGRpYWdyYW07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVZlcnRleE9yZGVyKGEsIGIpIHtcclxuICAgIHJldHVybiBiLnkgLSBhLnkgfHwgYi54IC0gYS54O1xyXG4gIH1cclxuICBkMy5nZW9tLnZvcm9ub2kgPSBmdW5jdGlvbihwb2ludHMpIHtcclxuICAgIHZhciB4ID0gZDNfZ2VvbV9wb2ludFgsIHkgPSBkM19nZW9tX3BvaW50WSwgZnggPSB4LCBmeSA9IHksIGNsaXBFeHRlbnQgPSBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50O1xyXG4gICAgaWYgKHBvaW50cykgcmV0dXJuIHZvcm9ub2kocG9pbnRzKTtcclxuICAgIGZ1bmN0aW9uIHZvcm9ub2koZGF0YSkge1xyXG4gICAgICB2YXIgcG9seWdvbnMgPSBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpLCB4MCA9IGNsaXBFeHRlbnRbMF1bMF0sIHkwID0gY2xpcEV4dGVudFswXVsxXSwgeDEgPSBjbGlwRXh0ZW50WzFdWzBdLCB5MSA9IGNsaXBFeHRlbnRbMV1bMV07XHJcbiAgICAgIGQzX2dlb21fdm9yb25vaShzaXRlcyhkYXRhKSwgY2xpcEV4dGVudCkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihjZWxsLCBpKSB7XHJcbiAgICAgICAgdmFyIGVkZ2VzID0gY2VsbC5lZGdlcywgc2l0ZSA9IGNlbGwuc2l0ZSwgcG9seWdvbiA9IHBvbHlnb25zW2ldID0gZWRnZXMubGVuZ3RoID8gZWRnZXMubWFwKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgIHZhciBzID0gZS5zdGFydCgpO1xyXG4gICAgICAgICAgcmV0dXJuIFsgcy54LCBzLnkgXTtcclxuICAgICAgICB9KSA6IHNpdGUueCA+PSB4MCAmJiBzaXRlLnggPD0geDEgJiYgc2l0ZS55ID49IHkwICYmIHNpdGUueSA8PSB5MSA/IFsgWyB4MCwgeTEgXSwgWyB4MSwgeTEgXSwgWyB4MSwgeTAgXSwgWyB4MCwgeTAgXSBdIDogW107XHJcbiAgICAgICAgcG9seWdvbi5wb2ludCA9IGRhdGFbaV07XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gcG9seWdvbnM7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzaXRlcyhkYXRhKSB7XHJcbiAgICAgIHJldHVybiBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHg6IE1hdGgucm91bmQoZngoZCwgaSkgLyDOtSkgKiDOtSxcclxuICAgICAgICAgIHk6IE1hdGgucm91bmQoZnkoZCwgaSkgLyDOtSkgKiDOtSxcclxuICAgICAgICAgIGk6IGlcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHZvcm9ub2kubGlua3MgPSBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICAgIHJldHVybiBkM19nZW9tX3Zvcm9ub2koc2l0ZXMoZGF0YSkpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihlZGdlKSB7XHJcbiAgICAgICAgcmV0dXJuIGVkZ2UubCAmJiBlZGdlLnI7XHJcbiAgICAgIH0pLm1hcChmdW5jdGlvbihlZGdlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNvdXJjZTogZGF0YVtlZGdlLmwuaV0sXHJcbiAgICAgICAgICB0YXJnZXQ6IGRhdGFbZWRnZS5yLmldXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgdm9yb25vaS50cmlhbmdsZXMgPSBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICAgIHZhciB0cmlhbmdsZXMgPSBbXTtcclxuICAgICAgZDNfZ2VvbV92b3Jvbm9pKHNpdGVzKGRhdGEpKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIGkpIHtcclxuICAgICAgICB2YXIgc2l0ZSA9IGNlbGwuc2l0ZSwgZWRnZXMgPSBjZWxsLmVkZ2VzLnNvcnQoZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2VPcmRlciksIGogPSAtMSwgbSA9IGVkZ2VzLmxlbmd0aCwgZTAsIHMwLCBlMSA9IGVkZ2VzW20gLSAxXS5lZGdlLCBzMSA9IGUxLmwgPT09IHNpdGUgPyBlMS5yIDogZTEubDtcclxuICAgICAgICB3aGlsZSAoKytqIDwgbSkge1xyXG4gICAgICAgICAgZTAgPSBlMTtcclxuICAgICAgICAgIHMwID0gczE7XHJcbiAgICAgICAgICBlMSA9IGVkZ2VzW2pdLmVkZ2U7XHJcbiAgICAgICAgICBzMSA9IGUxLmwgPT09IHNpdGUgPyBlMS5yIDogZTEubDtcclxuICAgICAgICAgIGlmIChpIDwgczAuaSAmJiBpIDwgczEuaSAmJiBkM19nZW9tX3Zvcm9ub2lUcmlhbmdsZUFyZWEoc2l0ZSwgczAsIHMxKSA8IDApIHtcclxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goWyBkYXRhW2ldLCBkYXRhW3MwLmldLCBkYXRhW3MxLmldIF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB0cmlhbmdsZXM7XHJcbiAgICB9O1xyXG4gICAgdm9yb25vaS54ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmeCA9IGQzX2Z1bmN0b3IoeCA9IF8pLCB2b3Jvbm9pKSA6IHg7XHJcbiAgICB9O1xyXG4gICAgdm9yb25vaS55ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmeSA9IGQzX2Z1bmN0b3IoeSA9IF8pLCB2b3Jvbm9pKSA6IHk7XHJcbiAgICB9O1xyXG4gICAgdm9yb25vaS5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwRXh0ZW50ID09PSBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50ID8gbnVsbCA6IGNsaXBFeHRlbnQ7XHJcbiAgICAgIGNsaXBFeHRlbnQgPSBfID09IG51bGwgPyBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50IDogXztcclxuICAgICAgcmV0dXJuIHZvcm9ub2k7XHJcbiAgICB9O1xyXG4gICAgdm9yb25vaS5zaXplID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwRXh0ZW50ID09PSBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50ID8gbnVsbCA6IGNsaXBFeHRlbnQgJiYgY2xpcEV4dGVudFsxXTtcclxuICAgICAgcmV0dXJuIHZvcm9ub2kuY2xpcEV4dGVudChfICYmIFsgWyAwLCAwIF0sIF8gXSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHZvcm9ub2k7XHJcbiAgfTtcclxuICB2YXIgZDNfZ2VvbV92b3Jvbm9pQ2xpcEV4dGVudCA9IFsgWyAtMWU2LCAtMWU2IF0sIFsgMWU2LCAxZTYgXSBdO1xyXG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVRyaWFuZ2xlQXJlYShhLCBiLCBjKSB7XHJcbiAgICByZXR1cm4gKGEueCAtIGMueCkgKiAoYi55IC0gYS55KSAtIChhLnggLSBiLngpICogKGMueSAtIGEueSk7XHJcbiAgfVxyXG4gIGQzLmdlb20uZGVsYXVuYXkgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xyXG4gICAgcmV0dXJuIGQzLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyh2ZXJ0aWNlcyk7XHJcbiAgfTtcclxuICBkMy5nZW9tLnF1YWR0cmVlID0gZnVuY3Rpb24ocG9pbnRzLCB4MSwgeTEsIHgyLCB5Mikge1xyXG4gICAgdmFyIHggPSBkM19nZW9tX3BvaW50WCwgeSA9IGQzX2dlb21fcG9pbnRZLCBjb21wYXQ7XHJcbiAgICBpZiAoY29tcGF0ID0gYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICB4ID0gZDNfZ2VvbV9xdWFkdHJlZUNvbXBhdFg7XHJcbiAgICAgIHkgPSBkM19nZW9tX3F1YWR0cmVlQ29tcGF0WTtcclxuICAgICAgaWYgKGNvbXBhdCA9PT0gMykge1xyXG4gICAgICAgIHkyID0geTE7XHJcbiAgICAgICAgeDIgPSB4MTtcclxuICAgICAgICB5MSA9IHgxID0gMDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcXVhZHRyZWUocG9pbnRzKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHF1YWR0cmVlKGRhdGEpIHtcclxuICAgICAgdmFyIGQsIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCB4cywgeXMsIGksIG4sIHgxXywgeTFfLCB4Ml8sIHkyXztcclxuICAgICAgaWYgKHgxICE9IG51bGwpIHtcclxuICAgICAgICB4MV8gPSB4MSwgeTFfID0geTEsIHgyXyA9IHgyLCB5Ml8gPSB5MjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB4Ml8gPSB5Ml8gPSAtKHgxXyA9IHkxXyA9IEluZmluaXR5KTtcclxuICAgICAgICB4cyA9IFtdLCB5cyA9IFtdO1xyXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aDtcclxuICAgICAgICBpZiAoY29tcGF0KSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgICAgICBkID0gZGF0YVtpXTtcclxuICAgICAgICAgIGlmIChkLnggPCB4MV8pIHgxXyA9IGQueDtcclxuICAgICAgICAgIGlmIChkLnkgPCB5MV8pIHkxXyA9IGQueTtcclxuICAgICAgICAgIGlmIChkLnggPiB4Ml8pIHgyXyA9IGQueDtcclxuICAgICAgICAgIGlmIChkLnkgPiB5Ml8pIHkyXyA9IGQueTtcclxuICAgICAgICAgIHhzLnB1c2goZC54KTtcclxuICAgICAgICAgIHlzLnB1c2goZC55KTtcclxuICAgICAgICB9IGVsc2UgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgICAgdmFyIHhfID0gK2Z4KGQgPSBkYXRhW2ldLCBpKSwgeV8gPSArZnkoZCwgaSk7XHJcbiAgICAgICAgICBpZiAoeF8gPCB4MV8pIHgxXyA9IHhfO1xyXG4gICAgICAgICAgaWYgKHlfIDwgeTFfKSB5MV8gPSB5XztcclxuICAgICAgICAgIGlmICh4XyA+IHgyXykgeDJfID0geF87XHJcbiAgICAgICAgICBpZiAoeV8gPiB5Ml8pIHkyXyA9IHlfO1xyXG4gICAgICAgICAgeHMucHVzaCh4Xyk7XHJcbiAgICAgICAgICB5cy5wdXNoKHlfKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdmFyIGR4ID0geDJfIC0geDFfLCBkeSA9IHkyXyAtIHkxXztcclxuICAgICAgaWYgKGR4ID4gZHkpIHkyXyA9IHkxXyArIGR4OyBlbHNlIHgyXyA9IHgxXyArIGR5O1xyXG4gICAgICBmdW5jdGlvbiBpbnNlcnQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcclxuICAgICAgICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybjtcclxuICAgICAgICBpZiAobi5sZWFmKSB7XHJcbiAgICAgICAgICB2YXIgbnggPSBuLngsIG55ID0gbi55O1xyXG4gICAgICAgICAgaWYgKG54ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFicyhueCAtIHgpICsgYWJzKG55IC0geSkgPCAuMDEpIHtcclxuICAgICAgICAgICAgICBpbnNlcnRDaGlsZChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5Mik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdmFyIG5Qb2ludCA9IG4ucG9pbnQ7XHJcbiAgICAgICAgICAgICAgbi54ID0gbi55ID0gbi5wb2ludCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgaW5zZXJ0Q2hpbGQobiwgblBvaW50LCBueCwgbnksIHgxLCB5MSwgeDIsIHkyKTtcclxuICAgICAgICAgICAgICBpbnNlcnRDaGlsZChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5Mik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG4ueCA9IHgsIG4ueSA9IHksIG4ucG9pbnQgPSBkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpbnNlcnRDaGlsZChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5Mik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGZ1bmN0aW9uIGluc2VydENoaWxkKG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKSB7XHJcbiAgICAgICAgdmFyIHhtID0gKHgxICsgeDIpICogLjUsIHltID0gKHkxICsgeTIpICogLjUsIHJpZ2h0ID0geCA+PSB4bSwgYmVsb3cgPSB5ID49IHltLCBpID0gYmVsb3cgPDwgMSB8IHJpZ2h0O1xyXG4gICAgICAgIG4ubGVhZiA9IGZhbHNlO1xyXG4gICAgICAgIG4gPSBuLm5vZGVzW2ldIHx8IChuLm5vZGVzW2ldID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSk7XHJcbiAgICAgICAgaWYgKHJpZ2h0KSB4MSA9IHhtOyBlbHNlIHgyID0geG07XHJcbiAgICAgICAgaWYgKGJlbG93KSB5MSA9IHltOyBlbHNlIHkyID0geW07XHJcbiAgICAgICAgaW5zZXJ0KG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgcm9vdCA9IGQzX2dlb21fcXVhZHRyZWVOb2RlKCk7XHJcbiAgICAgIHJvb3QuYWRkID0gZnVuY3Rpb24oZCkge1xyXG4gICAgICAgIGluc2VydChyb290LCBkLCArZngoZCwgKytpKSwgK2Z5KGQsIGkpLCB4MV8sIHkxXywgeDJfLCB5Ml8pO1xyXG4gICAgICB9O1xyXG4gICAgICByb290LnZpc2l0ID0gZnVuY3Rpb24oZikge1xyXG4gICAgICAgIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCByb290LCB4MV8sIHkxXywgeDJfLCB5Ml8pO1xyXG4gICAgICB9O1xyXG4gICAgICByb290LmZpbmQgPSBmdW5jdGlvbihwb2ludCkge1xyXG4gICAgICAgIHJldHVybiBkM19nZW9tX3F1YWR0cmVlRmluZChyb290LCBwb2ludFswXSwgcG9pbnRbMV0sIHgxXywgeTFfLCB4Ml8sIHkyXyk7XHJcbiAgICAgIH07XHJcbiAgICAgIGkgPSAtMTtcclxuICAgICAgaWYgKHgxID09IG51bGwpIHtcclxuICAgICAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICAgICAgaW5zZXJ0KHJvb3QsIGRhdGFbaV0sIHhzW2ldLCB5c1tpXSwgeDFfLCB5MV8sIHgyXywgeTJfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLS1pO1xyXG4gICAgICB9IGVsc2UgZGF0YS5mb3JFYWNoKHJvb3QuYWRkKTtcclxuICAgICAgeHMgPSB5cyA9IGRhdGEgPSBkID0gbnVsbDtcclxuICAgICAgcmV0dXJuIHJvb3Q7XHJcbiAgICB9XHJcbiAgICBxdWFkdHJlZS54ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gXywgcXVhZHRyZWUpIDogeDtcclxuICAgIH07XHJcbiAgICBxdWFkdHJlZS55ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gXywgcXVhZHRyZWUpIDogeTtcclxuICAgIH07XHJcbiAgICBxdWFkdHJlZS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxID09IG51bGwgPyBudWxsIDogWyBbIHgxLCB5MSBdLCBbIHgyLCB5MiBdIF07XHJcbiAgICAgIGlmIChfID09IG51bGwpIHgxID0geTEgPSB4MiA9IHkyID0gbnVsbDsgZWxzZSB4MSA9ICtfWzBdWzBdLCB5MSA9ICtfWzBdWzFdLCB4MiA9ICtfWzFdWzBdLCBcclxuICAgICAgeTIgPSArX1sxXVsxXTtcclxuICAgICAgcmV0dXJuIHF1YWR0cmVlO1xyXG4gICAgfTtcclxuICAgIHF1YWR0cmVlLnNpemUgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxID09IG51bGwgPyBudWxsIDogWyB4MiAtIHgxLCB5MiAtIHkxIF07XHJcbiAgICAgIGlmIChfID09IG51bGwpIHgxID0geTEgPSB4MiA9IHkyID0gbnVsbDsgZWxzZSB4MSA9IHkxID0gMCwgeDIgPSArX1swXSwgeTIgPSArX1sxXTtcclxuICAgICAgcmV0dXJuIHF1YWR0cmVlO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBxdWFkdHJlZTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVDb21wYXRYKGQpIHtcclxuICAgIHJldHVybiBkLng7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVDb21wYXRZKGQpIHtcclxuICAgIHJldHVybiBkLnk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVOb2RlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGVhZjogdHJ1ZSxcclxuICAgICAgbm9kZXM6IFtdLFxyXG4gICAgICBwb2ludDogbnVsbCxcclxuICAgICAgeDogbnVsbCxcclxuICAgICAgeTogbnVsbFxyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIG5vZGUsIHgxLCB5MSwgeDIsIHkyKSB7XHJcbiAgICBpZiAoIWYobm9kZSwgeDEsIHkxLCB4MiwgeTIpKSB7XHJcbiAgICAgIHZhciBzeCA9ICh4MSArIHgyKSAqIC41LCBzeSA9ICh5MSArIHkyKSAqIC41LCBjaGlsZHJlbiA9IG5vZGUubm9kZXM7XHJcbiAgICAgIGlmIChjaGlsZHJlblswXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzBdLCB4MSwgeTEsIHN4LCBzeSk7XHJcbiAgICAgIGlmIChjaGlsZHJlblsxXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzFdLCBzeCwgeTEsIHgyLCBzeSk7XHJcbiAgICAgIGlmIChjaGlsZHJlblsyXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzJdLCB4MSwgc3ksIHN4LCB5Mik7XHJcbiAgICAgIGlmIChjaGlsZHJlblszXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzNdLCBzeCwgc3ksIHgyLCB5Mik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVGaW5kKHJvb3QsIHgsIHksIHgwLCB5MCwgeDMsIHkzKSB7XHJcbiAgICB2YXIgbWluRGlzdGFuY2UyID0gSW5maW5pdHksIGNsb3Nlc3RQb2ludDtcclxuICAgIChmdW5jdGlvbiBmaW5kKG5vZGUsIHgxLCB5MSwgeDIsIHkyKSB7XHJcbiAgICAgIGlmICh4MSA+IHgzIHx8IHkxID4geTMgfHwgeDIgPCB4MCB8fCB5MiA8IHkwKSByZXR1cm47XHJcbiAgICAgIGlmIChwb2ludCA9IG5vZGUucG9pbnQpIHtcclxuICAgICAgICB2YXIgcG9pbnQsIGR4ID0geCAtIG5vZGUueCwgZHkgPSB5IC0gbm9kZS55LCBkaXN0YW5jZTIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcclxuICAgICAgICBpZiAoZGlzdGFuY2UyIDwgbWluRGlzdGFuY2UyKSB7XHJcbiAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQobWluRGlzdGFuY2UyID0gZGlzdGFuY2UyKTtcclxuICAgICAgICAgIHgwID0geCAtIGRpc3RhbmNlLCB5MCA9IHkgLSBkaXN0YW5jZTtcclxuICAgICAgICAgIHgzID0geCArIGRpc3RhbmNlLCB5MyA9IHkgKyBkaXN0YW5jZTtcclxuICAgICAgICAgIGNsb3Nlc3RQb2ludCA9IHBvaW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLm5vZGVzLCB4bSA9ICh4MSArIHgyKSAqIC41LCB5bSA9ICh5MSArIHkyKSAqIC41LCByaWdodCA9IHggPj0geG0sIGJlbG93ID0geSA+PSB5bTtcclxuICAgICAgZm9yICh2YXIgaSA9IGJlbG93IDw8IDEgfCByaWdodCwgaiA9IGkgKyA0OyBpIDwgajsgKytpKSB7XHJcbiAgICAgICAgaWYgKG5vZGUgPSBjaGlsZHJlbltpICYgM10pIHN3aXRjaCAoaSAmIDMpIHtcclxuICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZmluZChub2RlLCB4MSwgeTEsIHhtLCB5bSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGZpbmQobm9kZSwgeG0sIHkxLCB4MiwgeW0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBmaW5kKG5vZGUsIHgxLCB5bSwgeG0sIHkyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgZmluZChub2RlLCB4bSwgeW0sIHgyLCB5Mik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pKHJvb3QsIHgwLCB5MCwgeDMsIHkzKTtcclxuICAgIHJldHVybiBjbG9zZXN0UG9pbnQ7XHJcbiAgfVxyXG4gIGQzLmludGVycG9sYXRlUmdiID0gZDNfaW50ZXJwb2xhdGVSZ2I7XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSZ2IoYSwgYikge1xyXG4gICAgYSA9IGQzLnJnYihhKTtcclxuICAgIGIgPSBkMy5yZ2IoYik7XHJcbiAgICB2YXIgYXIgPSBhLnIsIGFnID0gYS5nLCBhYiA9IGEuYiwgYnIgPSBiLnIgLSBhciwgYmcgPSBiLmcgLSBhZywgYmIgPSBiLmIgLSBhYjtcclxuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XHJcbiAgICAgIHJldHVybiBcIiNcIiArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhciArIGJyICogdCkpICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFnICsgYmcgKiB0KSkgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYWIgKyBiYiAqIHQpKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzLmludGVycG9sYXRlT2JqZWN0ID0gZDNfaW50ZXJwb2xhdGVPYmplY3Q7XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVPYmplY3QoYSwgYikge1xyXG4gICAgdmFyIGkgPSB7fSwgYyA9IHt9LCBrO1xyXG4gICAgZm9yIChrIGluIGEpIHtcclxuICAgICAgaWYgKGsgaW4gYikge1xyXG4gICAgICAgIGlba10gPSBkM19pbnRlcnBvbGF0ZShhW2tdLCBiW2tdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjW2tdID0gYVtrXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChrIGluIGIpIHtcclxuICAgICAgaWYgKCEoayBpbiBhKSkge1xyXG4gICAgICAgIGNba10gPSBiW2tdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xyXG4gICAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7XHJcbiAgICAgIHJldHVybiBjO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZDMuaW50ZXJwb2xhdGVOdW1iZXIgPSBkM19pbnRlcnBvbGF0ZU51bWJlcjtcclxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZU51bWJlcihhLCBiKSB7XHJcbiAgICBhID0gK2EsIGIgPSArYjtcclxuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XHJcbiAgICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xyXG4gICAgfTtcclxuICB9XHJcbiAgZDMuaW50ZXJwb2xhdGVTdHJpbmcgPSBkM19pbnRlcnBvbGF0ZVN0cmluZztcclxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVN0cmluZyhhLCBiKSB7XHJcbiAgICB2YXIgYmkgPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJBLmxhc3RJbmRleCA9IGQzX2ludGVycG9sYXRlX251bWJlckIubGFzdEluZGV4ID0gMCwgYW0sIGJtLCBicywgaSA9IC0xLCBzID0gW10sIHEgPSBbXTtcclxuICAgIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xyXG4gICAgd2hpbGUgKChhbSA9IGQzX2ludGVycG9sYXRlX251bWJlckEuZXhlYyhhKSkgJiYgKGJtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyQi5leGVjKGIpKSkge1xyXG4gICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHtcclxuICAgICAgICBicyA9IGIuc2xpY2UoYmksIGJzKTtcclxuICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgZWxzZSBzWysraV0gPSBicztcclxuICAgICAgfVxyXG4gICAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHtcclxuICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgZWxzZSBzWysraV0gPSBibTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzWysraV0gPSBudWxsO1xyXG4gICAgICAgIHEucHVzaCh7XHJcbiAgICAgICAgICBpOiBpLFxyXG4gICAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIoYW0sIGJtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGJpID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyQi5sYXN0SW5kZXg7XHJcbiAgICB9XHJcbiAgICBpZiAoYmkgPCBiLmxlbmd0aCkge1xyXG4gICAgICBicyA9IGIuc2xpY2UoYmkpO1xyXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgZWxzZSBzWysraV0gPSBicztcclxuICAgIH1cclxuICAgIHJldHVybiBzLmxlbmd0aCA8IDIgPyBxWzBdID8gKGIgPSBxWzBdLngsIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgcmV0dXJuIGIodCkgKyBcIlwiO1xyXG4gICAgfSkgOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGI7XHJcbiAgICB9IDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xyXG4gICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xyXG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHZhciBkM19pbnRlcnBvbGF0ZV9udW1iZXJBID0gL1stK10/KD86XFxkK1xcLj9cXGQqfFxcLj9cXGQrKSg/OltlRV1bLStdP1xcZCspPy9nLCBkM19pbnRlcnBvbGF0ZV9udW1iZXJCID0gbmV3IFJlZ0V4cChkM19pbnRlcnBvbGF0ZV9udW1iZXJBLnNvdXJjZSwgXCJnXCIpO1xyXG4gIGQzLmludGVycG9sYXRlID0gZDNfaW50ZXJwb2xhdGU7XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGUoYSwgYikge1xyXG4gICAgdmFyIGkgPSBkMy5pbnRlcnBvbGF0b3JzLmxlbmd0aCwgZjtcclxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAhKGYgPSBkMy5pbnRlcnBvbGF0b3JzW2ldKGEsIGIpKSkgO1xyXG4gICAgcmV0dXJuIGY7XHJcbiAgfVxyXG4gIGQzLmludGVycG9sYXRvcnMgPSBbIGZ1bmN0aW9uKGEsIGIpIHtcclxuICAgIHZhciB0ID0gdHlwZW9mIGI7XHJcbiAgICByZXR1cm4gKHQgPT09IFwic3RyaW5nXCIgPyBkM19yZ2JfbmFtZXMuaGFzKGIudG9Mb3dlckNhc2UoKSkgfHwgL14oI3xyZ2JcXCh8aHNsXFwoKS9pLnRlc3QoYikgPyBkM19pbnRlcnBvbGF0ZVJnYiA6IGQzX2ludGVycG9sYXRlU3RyaW5nIDogYiBpbnN0YW5jZW9mIGQzX2NvbG9yID8gZDNfaW50ZXJwb2xhdGVSZ2IgOiBBcnJheS5pc0FycmF5KGIpID8gZDNfaW50ZXJwb2xhdGVBcnJheSA6IHQgPT09IFwib2JqZWN0XCIgJiYgaXNOYU4oYikgPyBkM19pbnRlcnBvbGF0ZU9iamVjdCA6IGQzX2ludGVycG9sYXRlTnVtYmVyKShhLCBiKTtcclxuICB9IF07XHJcbiAgZDMuaW50ZXJwb2xhdGVBcnJheSA9IGQzX2ludGVycG9sYXRlQXJyYXk7XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVBcnJheShhLCBiKSB7XHJcbiAgICB2YXIgeCA9IFtdLCBjID0gW10sIG5hID0gYS5sZW5ndGgsIG5iID0gYi5sZW5ndGgsIG4wID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKSwgaTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBuMDsgKytpKSB4LnB1c2goZDNfaW50ZXJwb2xhdGUoYVtpXSwgYltpXSkpO1xyXG4gICAgZm9yICg7aSA8IG5hOyArK2kpIGNbaV0gPSBhW2ldO1xyXG4gICAgZm9yICg7aSA8IG5iOyArK2kpIGNbaV0gPSBiW2ldO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IG4wOyArK2kpIGNbaV0gPSB4W2ldKHQpO1xyXG4gICAgICByZXR1cm4gYztcclxuICAgIH07XHJcbiAgfVxyXG4gIHZhciBkM19lYXNlX2RlZmF1bHQgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19pZGVudGl0eTtcclxuICB9O1xyXG4gIHZhciBkM19lYXNlID0gZDMubWFwKHtcclxuICAgIGxpbmVhcjogZDNfZWFzZV9kZWZhdWx0LFxyXG4gICAgcG9seTogZDNfZWFzZV9wb2x5LFxyXG4gICAgcXVhZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBkM19lYXNlX3F1YWQ7XHJcbiAgICB9LFxyXG4gICAgY3ViaWM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gZDNfZWFzZV9jdWJpYztcclxuICAgIH0sXHJcbiAgICBzaW46IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gZDNfZWFzZV9zaW47XHJcbiAgICB9LFxyXG4gICAgZXhwOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX2Vhc2VfZXhwO1xyXG4gICAgfSxcclxuICAgIGNpcmNsZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBkM19lYXNlX2NpcmNsZTtcclxuICAgIH0sXHJcbiAgICBlbGFzdGljOiBkM19lYXNlX2VsYXN0aWMsXHJcbiAgICBiYWNrOiBkM19lYXNlX2JhY2ssXHJcbiAgICBib3VuY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gZDNfZWFzZV9ib3VuY2U7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgdmFyIGQzX2Vhc2VfbW9kZSA9IGQzLm1hcCh7XHJcbiAgICBcImluXCI6IGQzX2lkZW50aXR5LFxyXG4gICAgb3V0OiBkM19lYXNlX3JldmVyc2UsXHJcbiAgICBcImluLW91dFwiOiBkM19lYXNlX3JlZmxlY3QsXHJcbiAgICBcIm91dC1pblwiOiBmdW5jdGlvbihmKSB7XHJcbiAgICAgIHJldHVybiBkM19lYXNlX3JlZmxlY3QoZDNfZWFzZV9yZXZlcnNlKGYpKTtcclxuICAgIH1cclxuICB9KTtcclxuICBkMy5lYXNlID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoXCItXCIpLCB0ID0gaSA+PSAwID8gbmFtZS5zbGljZSgwLCBpKSA6IG5hbWUsIG0gPSBpID49IDAgPyBuYW1lLnNsaWNlKGkgKyAxKSA6IFwiaW5cIjtcclxuICAgIHQgPSBkM19lYXNlLmdldCh0KSB8fCBkM19lYXNlX2RlZmF1bHQ7XHJcbiAgICBtID0gZDNfZWFzZV9tb2RlLmdldChtKSB8fCBkM19pZGVudGl0eTtcclxuICAgIHJldHVybiBkM19lYXNlX2NsYW1wKG0odC5hcHBseShudWxsLCBkM19hcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSkpKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2Vhc2VfY2xhbXAoZikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgcmV0dXJuIHQgPD0gMCA/IDAgOiB0ID49IDEgPyAxIDogZih0KTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2Vhc2VfcmV2ZXJzZShmKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xyXG4gICAgICByZXR1cm4gMSAtIGYoMSAtIHQpO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZWFzZV9yZWZsZWN0KGYpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XHJcbiAgICAgIHJldHVybiAuNSAqICh0IDwgLjUgPyBmKDIgKiB0KSA6IDIgLSBmKDIgLSAyICogdCkpO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZWFzZV9xdWFkKHQpIHtcclxuICAgIHJldHVybiB0ICogdDtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZWFzZV9jdWJpYyh0KSB7XHJcbiAgICByZXR1cm4gdCAqIHQgKiB0O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19lYXNlX2N1YmljSW5PdXQodCkge1xyXG4gICAgaWYgKHQgPD0gMCkgcmV0dXJuIDA7XHJcbiAgICBpZiAodCA+PSAxKSByZXR1cm4gMTtcclxuICAgIHZhciB0MiA9IHQgKiB0LCB0MyA9IHQyICogdDtcclxuICAgIHJldHVybiA0ICogKHQgPCAuNSA/IHQzIDogMyAqICh0IC0gdDIpICsgdDMgLSAuNzUpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19lYXNlX3BvbHkoZSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgcmV0dXJuIE1hdGgucG93KHQsIGUpO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZWFzZV9zaW4odCkge1xyXG4gICAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogaGFsZs+AKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfZWFzZV9leHAodCkge1xyXG4gICAgcmV0dXJuIE1hdGgucG93KDIsIDEwICogKHQgLSAxKSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2Vhc2VfY2lyY2xlKHQpIHtcclxuICAgIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2Vhc2VfZWxhc3RpYyhhLCBwKSB7XHJcbiAgICB2YXIgcztcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcCA9IC40NTtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSBzID0gcCAvIM+EICogTWF0aC5hc2luKDEgLyBhKTsgZWxzZSBhID0gMSwgcyA9IHAgLyA0O1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgcmV0dXJuIDEgKyBhICogTWF0aC5wb3coMiwgLTEwICogdCkgKiBNYXRoLnNpbigodCAtIHMpICogz4QgLyBwKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2Vhc2VfYmFjayhzKSB7XHJcbiAgICBpZiAoIXMpIHMgPSAxLjcwMTU4O1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgcmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19lYXNlX2JvdW5jZSh0KSB7XHJcbiAgICByZXR1cm4gdCA8IDEgLyAyLjc1ID8gNy41NjI1ICogdCAqIHQgOiB0IDwgMiAvIDIuNzUgPyA3LjU2MjUgKiAodCAtPSAxLjUgLyAyLjc1KSAqIHQgKyAuNzUgOiB0IDwgMi41IC8gMi43NSA/IDcuNTYyNSAqICh0IC09IDIuMjUgLyAyLjc1KSAqIHQgKyAuOTM3NSA6IDcuNTYyNSAqICh0IC09IDIuNjI1IC8gMi43NSkgKiB0ICsgLjk4NDM3NTtcclxuICB9XHJcbiAgZDMuaW50ZXJwb2xhdGVIY2wgPSBkM19pbnRlcnBvbGF0ZUhjbDtcclxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUhjbChhLCBiKSB7XHJcbiAgICBhID0gZDMuaGNsKGEpO1xyXG4gICAgYiA9IGQzLmhjbChiKTtcclxuICAgIHZhciBhaCA9IGEuaCwgYWMgPSBhLmMsIGFsID0gYS5sLCBiaCA9IGIuaCAtIGFoLCBiYyA9IGIuYyAtIGFjLCBibCA9IGIubCAtIGFsO1xyXG4gICAgaWYgKGlzTmFOKGJjKSkgYmMgPSAwLCBhYyA9IGlzTmFOKGFjKSA/IGIuYyA6IGFjO1xyXG4gICAgaWYgKGlzTmFOKGJoKSkgYmggPSAwLCBhaCA9IGlzTmFOKGFoKSA/IGIuaCA6IGFoOyBlbHNlIGlmIChiaCA+IDE4MCkgYmggLT0gMzYwOyBlbHNlIGlmIChiaCA8IC0xODApIGJoICs9IDM2MDtcclxuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XHJcbiAgICAgIHJldHVybiBkM19oY2xfbGFiKGFoICsgYmggKiB0LCBhYyArIGJjICogdCwgYWwgKyBibCAqIHQpICsgXCJcIjtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzLmludGVycG9sYXRlSHNsID0gZDNfaW50ZXJwb2xhdGVIc2w7XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVIc2woYSwgYikge1xyXG4gICAgYSA9IGQzLmhzbChhKTtcclxuICAgIGIgPSBkMy5oc2woYik7XHJcbiAgICB2YXIgYWggPSBhLmgsIGFzID0gYS5zLCBhbCA9IGEubCwgYmggPSBiLmggLSBhaCwgYnMgPSBiLnMgLSBhcywgYmwgPSBiLmwgLSBhbDtcclxuICAgIGlmIChpc05hTihicykpIGJzID0gMCwgYXMgPSBpc05hTihhcykgPyBiLnMgOiBhcztcclxuICAgIGlmIChpc05hTihiaCkpIGJoID0gMCwgYWggPSBpc05hTihhaCkgPyBiLmggOiBhaDsgZWxzZSBpZiAoYmggPiAxODApIGJoIC09IDM2MDsgZWxzZSBpZiAoYmggPCAtMTgwKSBiaCArPSAzNjA7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xyXG4gICAgICByZXR1cm4gZDNfaHNsX3JnYihhaCArIGJoICogdCwgYXMgKyBicyAqIHQsIGFsICsgYmwgKiB0KSArIFwiXCI7XHJcbiAgICB9O1xyXG4gIH1cclxuICBkMy5pbnRlcnBvbGF0ZUxhYiA9IGQzX2ludGVycG9sYXRlTGFiO1xyXG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlTGFiKGEsIGIpIHtcclxuICAgIGEgPSBkMy5sYWIoYSk7XHJcbiAgICBiID0gZDMubGFiKGIpO1xyXG4gICAgdmFyIGFsID0gYS5sLCBhYSA9IGEuYSwgYWIgPSBhLmIsIGJsID0gYi5sIC0gYWwsIGJhID0gYi5hIC0gYWEsIGJiID0gYi5iIC0gYWI7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xyXG4gICAgICByZXR1cm4gZDNfbGFiX3JnYihhbCArIGJsICogdCwgYWEgKyBiYSAqIHQsIGFiICsgYmIgKiB0KSArIFwiXCI7XHJcbiAgICB9O1xyXG4gIH1cclxuICBkMy5pbnRlcnBvbGF0ZVJvdW5kID0gZDNfaW50ZXJwb2xhdGVSb3VuZDtcclxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVJvdW5kKGEsIGIpIHtcclxuICAgIGIgLT0gYTtcclxuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XHJcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKyBiICogdCk7XHJcbiAgICB9O1xyXG4gIH1cclxuICBkMy50cmFuc2Zvcm0gPSBmdW5jdGlvbihzdHJpbmcpIHtcclxuICAgIHZhciBnID0gZDNfZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQzLm5zLnByZWZpeC5zdmcsIFwiZ1wiKTtcclxuICAgIHJldHVybiAoZDMudHJhbnNmb3JtID0gZnVuY3Rpb24oc3RyaW5nKSB7XHJcbiAgICAgIGlmIChzdHJpbmcgIT0gbnVsbCkge1xyXG4gICAgICAgIGcuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHN0cmluZyk7XHJcbiAgICAgICAgdmFyIHQgPSBnLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ldyBkM190cmFuc2Zvcm0odCA/IHQubWF0cml4IDogZDNfdHJhbnNmb3JtSWRlbnRpdHkpO1xyXG4gICAgfSkoc3RyaW5nKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3RyYW5zZm9ybShtKSB7XHJcbiAgICB2YXIgcjAgPSBbIG0uYSwgbS5iIF0sIHIxID0gWyBtLmMsIG0uZCBdLCBreCA9IGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShyMCksIGt6ID0gZDNfdHJhbnNmb3JtRG90KHIwLCByMSksIGt5ID0gZDNfdHJhbnNmb3JtTm9ybWFsaXplKGQzX3RyYW5zZm9ybUNvbWJpbmUocjEsIHIwLCAta3opKSB8fCAwO1xyXG4gICAgaWYgKHIwWzBdICogcjFbMV0gPCByMVswXSAqIHIwWzFdKSB7XHJcbiAgICAgIHIwWzBdICo9IC0xO1xyXG4gICAgICByMFsxXSAqPSAtMTtcclxuICAgICAga3ggKj0gLTE7XHJcbiAgICAgIGt6ICo9IC0xO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3RhdGUgPSAoa3ggPyBNYXRoLmF0YW4yKHIwWzFdLCByMFswXSkgOiBNYXRoLmF0YW4yKC1yMVswXSwgcjFbMV0pKSAqIGQzX2RlZ3JlZXM7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZSA9IFsgbS5lLCBtLmYgXTtcclxuICAgIHRoaXMuc2NhbGUgPSBbIGt4LCBreSBdO1xyXG4gICAgdGhpcy5za2V3ID0ga3kgPyBNYXRoLmF0YW4yKGt6LCBreSkgKiBkM19kZWdyZWVzIDogMDtcclxuICB9XHJcbiAgZDNfdHJhbnNmb3JtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy50cmFuc2xhdGUgKyBcIilyb3RhdGUoXCIgKyB0aGlzLnJvdGF0ZSArIFwiKXNrZXdYKFwiICsgdGhpcy5za2V3ICsgXCIpc2NhbGUoXCIgKyB0aGlzLnNjYWxlICsgXCIpXCI7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM190cmFuc2Zvcm1Eb3QoYSwgYikge1xyXG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShhKSB7XHJcbiAgICB2YXIgayA9IE1hdGguc3FydChkM190cmFuc2Zvcm1Eb3QoYSwgYSkpO1xyXG4gICAgaWYgKGspIHtcclxuICAgICAgYVswXSAvPSBrO1xyXG4gICAgICBhWzFdIC89IGs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaztcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfdHJhbnNmb3JtQ29tYmluZShhLCBiLCBrKSB7XHJcbiAgICBhWzBdICs9IGsgKiBiWzBdO1xyXG4gICAgYVsxXSArPSBrICogYlsxXTtcclxuICAgIHJldHVybiBhO1xyXG4gIH1cclxuICB2YXIgZDNfdHJhbnNmb3JtSWRlbnRpdHkgPSB7XHJcbiAgICBhOiAxLFxyXG4gICAgYjogMCxcclxuICAgIGM6IDAsXHJcbiAgICBkOiAxLFxyXG4gICAgZTogMCxcclxuICAgIGY6IDBcclxuICB9O1xyXG4gIGQzLmludGVycG9sYXRlVHJhbnNmb3JtID0gZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm07XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3Aocykge1xyXG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiLFwiIDogXCJcIjtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVUcmFuc2xhdGUodGEsIHRiLCBzLCBxKSB7XHJcbiAgICBpZiAodGFbMF0gIT09IHRiWzBdIHx8IHRhWzFdICE9PSB0YlsxXSkge1xyXG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcclxuICAgICAgcS5wdXNoKHtcclxuICAgICAgICBpOiBpIC0gNCxcclxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcih0YVswXSwgdGJbMF0pXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBpOiBpIC0gMixcclxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcih0YVsxXSwgdGJbMV0pXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0YlswXSB8fCB0YlsxXSkge1xyXG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB0YiArIFwiKVwiKTtcclxuICAgIH1cclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSb3RhdGUocmEsIHJiLCBzLCBxKSB7XHJcbiAgICBpZiAocmEgIT09IHJiKSB7XHJcbiAgICAgIGlmIChyYSAtIHJiID4gMTgwKSByYiArPSAzNjA7IGVsc2UgaWYgKHJiIC0gcmEgPiAxODApIHJhICs9IDM2MDtcclxuICAgICAgcS5wdXNoKHtcclxuICAgICAgICBpOiBzLnB1c2goZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgXCIpXCIpIC0gMixcclxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihyYSwgcmIpXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChyYikge1xyXG4gICAgICBzLnB1c2goZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3AocykgKyBcInJvdGF0ZShcIiArIHJiICsgXCIpXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVNrZXcod2EsIHdiLCBzLCBxKSB7XHJcbiAgICBpZiAod2EgIT09IHdiKSB7XHJcbiAgICAgIHEucHVzaCh7XHJcbiAgICAgICAgaTogcy5wdXNoKGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgXCIpXCIpIC0gMixcclxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcih3YSwgd2IpXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh3Yikge1xyXG4gICAgICBzLnB1c2goZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3AocykgKyBcInNrZXdYKFwiICsgd2IgKyBcIilcIik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlU2NhbGUoa2EsIGtiLCBzLCBxKSB7XHJcbiAgICBpZiAoa2FbMF0gIT09IGtiWzBdIHx8IGthWzFdICE9PSBrYlsxXSkge1xyXG4gICAgICB2YXIgaSA9IHMucHVzaChkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybVBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XHJcbiAgICAgIHEucHVzaCh7XHJcbiAgICAgICAgaTogaSAtIDQsXHJcbiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIoa2FbMF0sIGtiWzBdKVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgaTogaSAtIDIsXHJcbiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIoa2FbMV0sIGtiWzFdKVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoa2JbMF0gIT09IDEgfHwga2JbMV0gIT09IDEpIHtcclxuICAgICAgcy5wdXNoKGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpICsgXCJzY2FsZShcIiArIGtiICsgXCIpXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybShhLCBiKSB7XHJcbiAgICB2YXIgcyA9IFtdLCBxID0gW107XHJcbiAgICBhID0gZDMudHJhbnNmb3JtKGEpLCBiID0gZDMudHJhbnNmb3JtKGIpO1xyXG4gICAgZDNfaW50ZXJwb2xhdGVUcmFuc2xhdGUoYS50cmFuc2xhdGUsIGIudHJhbnNsYXRlLCBzLCBxKTtcclxuICAgIGQzX2ludGVycG9sYXRlUm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XHJcbiAgICBkM19pbnRlcnBvbGF0ZVNrZXcoYS5za2V3LCBiLnNrZXcsIHMsIHEpO1xyXG4gICAgZDNfaW50ZXJwb2xhdGVTY2FsZShhLnNjYWxlLCBiLnNjYWxlLCBzLCBxKTtcclxuICAgIGEgPSBiID0gbnVsbDtcclxuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XHJcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcclxuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3VuaW50ZXJwb2xhdGVOdW1iZXIoYSwgYikge1xyXG4gICAgYiA9IChiIC09IGEgPSArYSkgfHwgMSAvIGI7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4gKHggLSBhKSAvIGI7XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM191bmludGVycG9sYXRlQ2xhbXAoYSwgYikge1xyXG4gICAgYiA9IChiIC09IGEgPSArYSkgfHwgMSAvIGI7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHggLSBhKSAvIGIpKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzLmxheW91dCA9IHt9O1xyXG4gIGQzLmxheW91dC5idW5kbGUgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbihsaW5rcykge1xyXG4gICAgICB2YXIgcGF0aHMgPSBbXSwgaSA9IC0xLCBuID0gbGlua3MubGVuZ3RoO1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikgcGF0aHMucHVzaChkM19sYXlvdXRfYnVuZGxlUGF0aChsaW5rc1tpXSkpO1xyXG4gICAgICByZXR1cm4gcGF0aHM7XHJcbiAgICB9O1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZVBhdGgobGluaykge1xyXG4gICAgdmFyIHN0YXJ0ID0gbGluay5zb3VyY2UsIGVuZCA9IGxpbmsudGFyZ2V0LCBsY2EgPSBkM19sYXlvdXRfYnVuZGxlTGVhc3RDb21tb25BbmNlc3RvcihzdGFydCwgZW5kKSwgcG9pbnRzID0gWyBzdGFydCBdO1xyXG4gICAgd2hpbGUgKHN0YXJ0ICE9PSBsY2EpIHtcclxuICAgICAgc3RhcnQgPSBzdGFydC5wYXJlbnQ7XHJcbiAgICAgIHBvaW50cy5wdXNoKHN0YXJ0KTtcclxuICAgIH1cclxuICAgIHZhciBrID0gcG9pbnRzLmxlbmd0aDtcclxuICAgIHdoaWxlIChlbmQgIT09IGxjYSkge1xyXG4gICAgICBwb2ludHMuc3BsaWNlKGssIDAsIGVuZCk7XHJcbiAgICAgIGVuZCA9IGVuZC5wYXJlbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG9pbnRzO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfYnVuZGxlQW5jZXN0b3JzKG5vZGUpIHtcclxuICAgIHZhciBhbmNlc3RvcnMgPSBbXSwgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XHJcbiAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHtcclxuICAgICAgYW5jZXN0b3JzLnB1c2gobm9kZSk7XHJcbiAgICAgIG5vZGUgPSBwYXJlbnQ7XHJcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XHJcbiAgICB9XHJcbiAgICBhbmNlc3RvcnMucHVzaChub2RlKTtcclxuICAgIHJldHVybiBhbmNlc3RvcnM7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHtcclxuICAgIGlmIChhID09PSBiKSByZXR1cm4gYTtcclxuICAgIHZhciBhTm9kZXMgPSBkM19sYXlvdXRfYnVuZGxlQW5jZXN0b3JzKGEpLCBiTm9kZXMgPSBkM19sYXlvdXRfYnVuZGxlQW5jZXN0b3JzKGIpLCBhTm9kZSA9IGFOb2Rlcy5wb3AoKSwgYk5vZGUgPSBiTm9kZXMucG9wKCksIHNoYXJlZE5vZGUgPSBudWxsO1xyXG4gICAgd2hpbGUgKGFOb2RlID09PSBiTm9kZSkge1xyXG4gICAgICBzaGFyZWROb2RlID0gYU5vZGU7XHJcbiAgICAgIGFOb2RlID0gYU5vZGVzLnBvcCgpO1xyXG4gICAgICBiTm9kZSA9IGJOb2Rlcy5wb3AoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzaGFyZWROb2RlO1xyXG4gIH1cclxuICBkMy5sYXlvdXQuY2hvcmQgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBjaG9yZCA9IHt9LCBjaG9yZHMsIGdyb3VwcywgbWF0cml4LCBuLCBwYWRkaW5nID0gMCwgc29ydEdyb3Vwcywgc29ydFN1Ymdyb3Vwcywgc29ydENob3JkcztcclxuICAgIGZ1bmN0aW9uIHJlbGF5b3V0KCkge1xyXG4gICAgICB2YXIgc3ViZ3JvdXBzID0ge30sIGdyb3VwU3VtcyA9IFtdLCBncm91cEluZGV4ID0gZDMucmFuZ2UobiksIHN1Ymdyb3VwSW5kZXggPSBbXSwgaywgeCwgeDAsIGksIGo7XHJcbiAgICAgIGNob3JkcyA9IFtdO1xyXG4gICAgICBncm91cHMgPSBbXTtcclxuICAgICAgayA9IDAsIGkgPSAtMTtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICB4ID0gMCwgaiA9IC0xO1xyXG4gICAgICAgIHdoaWxlICgrK2ogPCBuKSB7XHJcbiAgICAgICAgICB4ICs9IG1hdHJpeFtpXVtqXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7XHJcbiAgICAgICAgc3ViZ3JvdXBJbmRleC5wdXNoKGQzLnJhbmdlKG4pKTtcclxuICAgICAgICBrICs9IHg7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNvcnRHcm91cHMpIHtcclxuICAgICAgICBncm91cEluZGV4LnNvcnQoZnVuY3Rpb24oYSwgYikge1xyXG4gICAgICAgICAgcmV0dXJuIHNvcnRHcm91cHMoZ3JvdXBTdW1zW2FdLCBncm91cFN1bXNbYl0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzb3J0U3ViZ3JvdXBzKSB7XHJcbiAgICAgICAgc3ViZ3JvdXBJbmRleC5mb3JFYWNoKGZ1bmN0aW9uKGQsIGkpIHtcclxuICAgICAgICAgIGQuc29ydChmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzb3J0U3ViZ3JvdXBzKG1hdHJpeFtpXVthXSwgbWF0cml4W2ldW2JdKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGsgPSAoz4QgLSBwYWRkaW5nICogbikgLyBrO1xyXG4gICAgICB4ID0gMCwgaSA9IC0xO1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICAgIHgwID0geCwgaiA9IC0xO1xyXG4gICAgICAgIHdoaWxlICgrK2ogPCBuKSB7XHJcbiAgICAgICAgICB2YXIgZGkgPSBncm91cEluZGV4W2ldLCBkaiA9IHN1Ymdyb3VwSW5kZXhbZGldW2pdLCB2ID0gbWF0cml4W2RpXVtkal0sIGEwID0geCwgYTEgPSB4ICs9IHYgKiBrO1xyXG4gICAgICAgICAgc3ViZ3JvdXBzW2RpICsgXCItXCIgKyBkal0gPSB7XHJcbiAgICAgICAgICAgIGluZGV4OiBkaSxcclxuICAgICAgICAgICAgc3ViaW5kZXg6IGRqLFxyXG4gICAgICAgICAgICBzdGFydEFuZ2xlOiBhMCxcclxuICAgICAgICAgICAgZW5kQW5nbGU6IGExLFxyXG4gICAgICAgICAgICB2YWx1ZTogdlxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ3JvdXBzW2RpXSA9IHtcclxuICAgICAgICAgIGluZGV4OiBkaSxcclxuICAgICAgICAgIHN0YXJ0QW5nbGU6IHgwLFxyXG4gICAgICAgICAgZW5kQW5nbGU6IHgsXHJcbiAgICAgICAgICB2YWx1ZTogZ3JvdXBTdW1zW2RpXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgeCArPSBwYWRkaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGkgPSAtMTtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICBqID0gaSAtIDE7XHJcbiAgICAgICAgd2hpbGUgKCsraiA8IG4pIHtcclxuICAgICAgICAgIHZhciBzb3VyY2UgPSBzdWJncm91cHNbaSArIFwiLVwiICsgal0sIHRhcmdldCA9IHN1Ymdyb3Vwc1tqICsgXCItXCIgKyBpXTtcclxuICAgICAgICAgIGlmIChzb3VyY2UudmFsdWUgfHwgdGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNob3Jkcy5wdXNoKHNvdXJjZS52YWx1ZSA8IHRhcmdldC52YWx1ZSA/IHtcclxuICAgICAgICAgICAgICBzb3VyY2U6IHRhcmdldCxcclxuICAgICAgICAgICAgICB0YXJnZXQ6IHNvdXJjZVxyXG4gICAgICAgICAgICB9IDoge1xyXG4gICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxyXG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoc29ydENob3JkcykgcmVzb3J0KCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNvcnQoKSB7XHJcbiAgICAgIGNob3Jkcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcclxuICAgICAgICByZXR1cm4gc29ydENob3JkcygoYS5zb3VyY2UudmFsdWUgKyBhLnRhcmdldC52YWx1ZSkgLyAyLCAoYi5zb3VyY2UudmFsdWUgKyBiLnRhcmdldC52YWx1ZSkgLyAyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjaG9yZC5tYXRyaXggPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1hdHJpeDtcclxuICAgICAgbiA9IChtYXRyaXggPSB4KSAmJiBtYXRyaXgubGVuZ3RoO1xyXG4gICAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsO1xyXG4gICAgICByZXR1cm4gY2hvcmQ7XHJcbiAgICB9O1xyXG4gICAgY2hvcmQucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZztcclxuICAgICAgcGFkZGluZyA9IHg7XHJcbiAgICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7XHJcbiAgICAgIHJldHVybiBjaG9yZDtcclxuICAgIH07XHJcbiAgICBjaG9yZC5zb3J0R3JvdXBzID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0R3JvdXBzO1xyXG4gICAgICBzb3J0R3JvdXBzID0geDtcclxuICAgICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDtcclxuICAgICAgcmV0dXJuIGNob3JkO1xyXG4gICAgfTtcclxuICAgIGNob3JkLnNvcnRTdWJncm91cHMgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRTdWJncm91cHM7XHJcbiAgICAgIHNvcnRTdWJncm91cHMgPSB4O1xyXG4gICAgICBjaG9yZHMgPSBudWxsO1xyXG4gICAgICByZXR1cm4gY2hvcmQ7XHJcbiAgICB9O1xyXG4gICAgY2hvcmQuc29ydENob3JkcyA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydENob3JkcztcclxuICAgICAgc29ydENob3JkcyA9IHg7XHJcbiAgICAgIGlmIChjaG9yZHMpIHJlc29ydCgpO1xyXG4gICAgICByZXR1cm4gY2hvcmQ7XHJcbiAgICB9O1xyXG4gICAgY2hvcmQuY2hvcmRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIGlmICghY2hvcmRzKSByZWxheW91dCgpO1xyXG4gICAgICByZXR1cm4gY2hvcmRzO1xyXG4gICAgfTtcclxuICAgIGNob3JkLmdyb3VwcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICBpZiAoIWdyb3VwcykgcmVsYXlvdXQoKTtcclxuICAgICAgcmV0dXJuIGdyb3VwcztcclxuICAgIH07XHJcbiAgICByZXR1cm4gY2hvcmQ7XHJcbiAgfTtcclxuICBkMy5sYXlvdXQuZm9yY2UgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBmb3JjZSA9IHt9LCBldmVudCA9IGQzLmRpc3BhdGNoKFwic3RhcnRcIiwgXCJ0aWNrXCIsIFwiZW5kXCIpLCB0aW1lciwgc2l6ZSA9IFsgMSwgMSBdLCBkcmFnLCBhbHBoYSwgZnJpY3Rpb24gPSAuOSwgbGlua0Rpc3RhbmNlID0gZDNfbGF5b3V0X2ZvcmNlTGlua0Rpc3RhbmNlLCBsaW5rU3RyZW5ndGggPSBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgsIGNoYXJnZSA9IC0zMCwgY2hhcmdlRGlzdGFuY2UyID0gZDNfbGF5b3V0X2ZvcmNlQ2hhcmdlRGlzdGFuY2UyLCBncmF2aXR5ID0gLjEsIHRoZXRhMiA9IC42NCwgbm9kZXMgPSBbXSwgbGlua3MgPSBbXSwgZGlzdGFuY2VzLCBzdHJlbmd0aHMsIGNoYXJnZXM7XHJcbiAgICBmdW5jdGlvbiByZXB1bHNlKG5vZGUpIHtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHF1YWQsIHgxLCBfLCB4Mikge1xyXG4gICAgICAgIGlmIChxdWFkLnBvaW50ICE9PSBub2RlKSB7XHJcbiAgICAgICAgICB2YXIgZHggPSBxdWFkLmN4IC0gbm9kZS54LCBkeSA9IHF1YWQuY3kgLSBub2RlLnksIGR3ID0geDIgLSB4MSwgZG4gPSBkeCAqIGR4ICsgZHkgKiBkeTtcclxuICAgICAgICAgIGlmIChkdyAqIGR3IC8gdGhldGEyIDwgZG4pIHtcclxuICAgICAgICAgICAgaWYgKGRuIDwgY2hhcmdlRGlzdGFuY2UyKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGsgPSBxdWFkLmNoYXJnZSAvIGRuO1xyXG4gICAgICAgICAgICAgIG5vZGUucHggLT0gZHggKiBrO1xyXG4gICAgICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHF1YWQucG9pbnQgJiYgZG4gJiYgZG4gPCBjaGFyZ2VEaXN0YW5jZTIpIHtcclxuICAgICAgICAgICAgdmFyIGsgPSBxdWFkLnBvaW50Q2hhcmdlIC8gZG47XHJcbiAgICAgICAgICAgIG5vZGUucHggLT0gZHggKiBrO1xyXG4gICAgICAgICAgICBub2RlLnB5IC09IGR5ICogaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICFxdWFkLmNoYXJnZTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGZvcmNlLnRpY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgaWYgKChhbHBoYSAqPSAuOTkpIDwgLjAwNSkge1xyXG4gICAgICAgIHRpbWVyID0gbnVsbDtcclxuICAgICAgICBldmVudC5lbmQoe1xyXG4gICAgICAgICAgdHlwZTogXCJlbmRcIixcclxuICAgICAgICAgIGFscGhhOiBhbHBoYSA9IDBcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgbiA9IG5vZGVzLmxlbmd0aCwgbSA9IGxpbmtzLmxlbmd0aCwgcSwgaSwgbywgcywgdCwgbCwgaywgeCwgeTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkge1xyXG4gICAgICAgIG8gPSBsaW5rc1tpXTtcclxuICAgICAgICBzID0gby5zb3VyY2U7XHJcbiAgICAgICAgdCA9IG8udGFyZ2V0O1xyXG4gICAgICAgIHggPSB0LnggLSBzLng7XHJcbiAgICAgICAgeSA9IHQueSAtIHMueTtcclxuICAgICAgICBpZiAobCA9IHggKiB4ICsgeSAqIHkpIHtcclxuICAgICAgICAgIGwgPSBhbHBoYSAqIHN0cmVuZ3Roc1tpXSAqICgobCA9IE1hdGguc3FydChsKSkgLSBkaXN0YW5jZXNbaV0pIC8gbDtcclxuICAgICAgICAgIHggKj0gbDtcclxuICAgICAgICAgIHkgKj0gbDtcclxuICAgICAgICAgIHQueCAtPSB4ICogKGsgPSBzLndlaWdodCArIHQud2VpZ2h0ID8gcy53ZWlnaHQgLyAocy53ZWlnaHQgKyB0LndlaWdodCkgOiAuNSk7XHJcbiAgICAgICAgICB0LnkgLT0geSAqIGs7XHJcbiAgICAgICAgICBzLnggKz0geCAqIChrID0gMSAtIGspO1xyXG4gICAgICAgICAgcy55ICs9IHkgKiBrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoayA9IGFscGhhICogZ3Jhdml0eSkge1xyXG4gICAgICAgIHggPSBzaXplWzBdIC8gMjtcclxuICAgICAgICB5ID0gc2l6ZVsxXSAvIDI7XHJcbiAgICAgICAgaSA9IC0xO1xyXG4gICAgICAgIGlmIChrKSB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICAgICAgbyA9IG5vZGVzW2ldO1xyXG4gICAgICAgICAgby54ICs9ICh4IC0gby54KSAqIGs7XHJcbiAgICAgICAgICBvLnkgKz0gKHkgLSBvLnkpICogaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoYXJnZSkge1xyXG4gICAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUocSA9IGQzLmdlb20ucXVhZHRyZWUobm9kZXMpLCBhbHBoYSwgY2hhcmdlcyk7XHJcbiAgICAgICAgaSA9IC0xO1xyXG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgICAgICBpZiAoIShvID0gbm9kZXNbaV0pLmZpeGVkKSB7XHJcbiAgICAgICAgICAgIHEudmlzaXQocmVwdWxzZShvKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGkgPSAtMTtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICBvID0gbm9kZXNbaV07XHJcbiAgICAgICAgaWYgKG8uZml4ZWQpIHtcclxuICAgICAgICAgIG8ueCA9IG8ucHg7XHJcbiAgICAgICAgICBvLnkgPSBvLnB5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvLnggLT0gKG8ucHggLSAoby5weCA9IG8ueCkpICogZnJpY3Rpb247XHJcbiAgICAgICAgICBvLnkgLT0gKG8ucHkgLSAoby5weSA9IG8ueSkpICogZnJpY3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGV2ZW50LnRpY2soe1xyXG4gICAgICAgIHR5cGU6IFwidGlja1wiLFxyXG4gICAgICAgIGFscGhhOiBhbHBoYVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICBmb3JjZS5ub2RlcyA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZXM7XHJcbiAgICAgIG5vZGVzID0geDtcclxuICAgICAgcmV0dXJuIGZvcmNlO1xyXG4gICAgfTtcclxuICAgIGZvcmNlLmxpbmtzID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rcztcclxuICAgICAgbGlua3MgPSB4O1xyXG4gICAgICByZXR1cm4gZm9yY2U7XHJcbiAgICB9O1xyXG4gICAgZm9yY2Uuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcclxuICAgICAgc2l6ZSA9IHg7XHJcbiAgICAgIHJldHVybiBmb3JjZTtcclxuICAgIH07XHJcbiAgICBmb3JjZS5saW5rRGlzdGFuY2UgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtEaXN0YW5jZTtcclxuICAgICAgbGlua0Rpc3RhbmNlID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiAreDtcclxuICAgICAgcmV0dXJuIGZvcmNlO1xyXG4gICAgfTtcclxuICAgIGZvcmNlLmRpc3RhbmNlID0gZm9yY2UubGlua0Rpc3RhbmNlO1xyXG4gICAgZm9yY2UubGlua1N0cmVuZ3RoID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rU3RyZW5ndGg7XHJcbiAgICAgIGxpbmtTdHJlbmd0aCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogK3g7XHJcbiAgICAgIHJldHVybiBmb3JjZTtcclxuICAgIH07XHJcbiAgICBmb3JjZS5mcmljdGlvbiA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZnJpY3Rpb247XHJcbiAgICAgIGZyaWN0aW9uID0gK3g7XHJcbiAgICAgIHJldHVybiBmb3JjZTtcclxuICAgIH07XHJcbiAgICBmb3JjZS5jaGFyZ2UgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNoYXJnZTtcclxuICAgICAgY2hhcmdlID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiAreDtcclxuICAgICAgcmV0dXJuIGZvcmNlO1xyXG4gICAgfTtcclxuICAgIGZvcmNlLmNoYXJnZURpc3RhbmNlID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBNYXRoLnNxcnQoY2hhcmdlRGlzdGFuY2UyKTtcclxuICAgICAgY2hhcmdlRGlzdGFuY2UyID0geCAqIHg7XHJcbiAgICAgIHJldHVybiBmb3JjZTtcclxuICAgIH07XHJcbiAgICBmb3JjZS5ncmF2aXR5ID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF2aXR5O1xyXG4gICAgICBncmF2aXR5ID0gK3g7XHJcbiAgICAgIHJldHVybiBmb3JjZTtcclxuICAgIH07XHJcbiAgICBmb3JjZS50aGV0YSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gTWF0aC5zcXJ0KHRoZXRhMik7XHJcbiAgICAgIHRoZXRhMiA9IHggKiB4O1xyXG4gICAgICByZXR1cm4gZm9yY2U7XHJcbiAgICB9O1xyXG4gICAgZm9yY2UuYWxwaGEgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFscGhhO1xyXG4gICAgICB4ID0gK3g7XHJcbiAgICAgIGlmIChhbHBoYSkge1xyXG4gICAgICAgIGlmICh4ID4gMCkge1xyXG4gICAgICAgICAgYWxwaGEgPSB4O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aW1lci5jID0gbnVsbCwgdGltZXIudCA9IE5hTiwgdGltZXIgPSBudWxsO1xyXG4gICAgICAgICAgZXZlbnQuZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogXCJlbmRcIixcclxuICAgICAgICAgICAgYWxwaGE6IGFscGhhID0gMFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHggPiAwKSB7XHJcbiAgICAgICAgZXZlbnQuc3RhcnQoe1xyXG4gICAgICAgICAgdHlwZTogXCJzdGFydFwiLFxyXG4gICAgICAgICAgYWxwaGE6IGFscGhhID0geFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRpbWVyID0gZDNfdGltZXIoZm9yY2UudGljayk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZvcmNlO1xyXG4gICAgfTtcclxuICAgIGZvcmNlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBtID0gbGlua3MubGVuZ3RoLCB3ID0gc2l6ZVswXSwgaCA9IHNpemVbMV0sIG5laWdoYm9ycywgbztcclxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgIChvID0gbm9kZXNbaV0pLmluZGV4ID0gaTtcclxuICAgICAgICBvLndlaWdodCA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkge1xyXG4gICAgICAgIG8gPSBsaW5rc1tpXTtcclxuICAgICAgICBpZiAodHlwZW9mIG8uc291cmNlID09IFwibnVtYmVyXCIpIG8uc291cmNlID0gbm9kZXNbby5zb3VyY2VdO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygby50YXJnZXQgPT0gXCJudW1iZXJcIikgby50YXJnZXQgPSBub2Rlc1tvLnRhcmdldF07XHJcbiAgICAgICAgKytvLnNvdXJjZS53ZWlnaHQ7XHJcbiAgICAgICAgKytvLnRhcmdldC53ZWlnaHQ7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgIG8gPSBub2Rlc1tpXTtcclxuICAgICAgICBpZiAoaXNOYU4oby54KSkgby54ID0gcG9zaXRpb24oXCJ4XCIsIHcpO1xyXG4gICAgICAgIGlmIChpc05hTihvLnkpKSBvLnkgPSBwb3NpdGlvbihcInlcIiwgaCk7XHJcbiAgICAgICAgaWYgKGlzTmFOKG8ucHgpKSBvLnB4ID0gby54O1xyXG4gICAgICAgIGlmIChpc05hTihvLnB5KSkgby5weSA9IG8ueTtcclxuICAgICAgfVxyXG4gICAgICBkaXN0YW5jZXMgPSBbXTtcclxuICAgICAgaWYgKHR5cGVvZiBsaW5rRGlzdGFuY2UgPT09IFwiZnVuY3Rpb25cIikgZm9yIChpID0gMDsgaSA8IG07ICsraSkgZGlzdGFuY2VzW2ldID0gK2xpbmtEaXN0YW5jZS5jYWxsKHRoaXMsIGxpbmtzW2ldLCBpKTsgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBkaXN0YW5jZXNbaV0gPSBsaW5rRGlzdGFuY2U7XHJcbiAgICAgIHN0cmVuZ3RocyA9IFtdO1xyXG4gICAgICBpZiAodHlwZW9mIGxpbmtTdHJlbmd0aCA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBzdHJlbmd0aHNbaV0gPSArbGlua1N0cmVuZ3RoLmNhbGwodGhpcywgbGlua3NbaV0sIGkpOyBlbHNlIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHN0cmVuZ3Roc1tpXSA9IGxpbmtTdHJlbmd0aDtcclxuICAgICAgY2hhcmdlcyA9IFtdO1xyXG4gICAgICBpZiAodHlwZW9mIGNoYXJnZSA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGFyZ2VzW2ldID0gK2NoYXJnZS5jYWxsKHRoaXMsIG5vZGVzW2ldLCBpKTsgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGFyZ2VzW2ldID0gY2hhcmdlO1xyXG4gICAgICBmdW5jdGlvbiBwb3NpdGlvbihkaW1lbnNpb24sIHNpemUpIHtcclxuICAgICAgICBpZiAoIW5laWdoYm9ycykge1xyXG4gICAgICAgICAgbmVpZ2hib3JzID0gbmV3IEFycmF5KG4pO1xyXG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikge1xyXG4gICAgICAgICAgICBuZWlnaGJvcnNbal0gPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcclxuICAgICAgICAgICAgdmFyIG8gPSBsaW5rc1tqXTtcclxuICAgICAgICAgICAgbmVpZ2hib3JzW28uc291cmNlLmluZGV4XS5wdXNoKG8udGFyZ2V0KTtcclxuICAgICAgICAgICAgbmVpZ2hib3JzW28udGFyZ2V0LmluZGV4XS5wdXNoKG8uc291cmNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNhbmRpZGF0ZXMgPSBuZWlnaGJvcnNbaV0sIGogPSAtMSwgbCA9IGNhbmRpZGF0ZXMubGVuZ3RoLCB4O1xyXG4gICAgICAgIHdoaWxlICgrK2ogPCBsKSBpZiAoIWlzTmFOKHggPSBjYW5kaWRhdGVzW2pdW2RpbWVuc2lvbl0pKSByZXR1cm4geDtcclxuICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIHNpemU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZvcmNlLnJlc3VtZSgpO1xyXG4gICAgfTtcclxuICAgIGZvcmNlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gZm9yY2UuYWxwaGEoLjEpO1xyXG4gICAgfTtcclxuICAgIGZvcmNlLnN0b3AgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGZvcmNlLmFscGhhKDApO1xyXG4gICAgfTtcclxuICAgIGZvcmNlLmRyYWcgPSBmdW5jdGlvbigpIHtcclxuICAgICAgaWYgKCFkcmFnKSBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpLm9yaWdpbihkM19pZGVudGl0eSkub24oXCJkcmFnc3RhcnQuZm9yY2VcIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZ3N0YXJ0KS5vbihcImRyYWcuZm9yY2VcIiwgZHJhZ21vdmUpLm9uKFwiZHJhZ2VuZC5mb3JjZVwiLCBkM19sYXlvdXRfZm9yY2VEcmFnZW5kKTtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZHJhZztcclxuICAgICAgdGhpcy5vbihcIm1vdXNlb3Zlci5mb3JjZVwiLCBkM19sYXlvdXRfZm9yY2VNb3VzZW92ZXIpLm9uKFwibW91c2VvdXQuZm9yY2VcIiwgZDNfbGF5b3V0X2ZvcmNlTW91c2VvdXQpLmNhbGwoZHJhZyk7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gZHJhZ21vdmUoZCkge1xyXG4gICAgICBkLnB4ID0gZDMuZXZlbnQueCwgZC5weSA9IGQzLmV2ZW50Lnk7XHJcbiAgICAgIGZvcmNlLnJlc3VtZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGQzLnJlYmluZChmb3JjZSwgZXZlbnQsIFwib25cIik7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnc3RhcnQoZCkge1xyXG4gICAgZC5maXhlZCB8PSAyO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnZW5kKGQpIHtcclxuICAgIGQuZml4ZWQgJj0gfjY7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZU1vdXNlb3ZlcihkKSB7XHJcbiAgICBkLmZpeGVkIHw9IDQ7XHJcbiAgICBkLnB4ID0gZC54LCBkLnB5ID0gZC55O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VNb3VzZW91dChkKSB7XHJcbiAgICBkLmZpeGVkICY9IH40O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKHF1YWQsIGFscGhhLCBjaGFyZ2VzKSB7XHJcbiAgICB2YXIgY3ggPSAwLCBjeSA9IDA7XHJcbiAgICBxdWFkLmNoYXJnZSA9IDA7XHJcbiAgICBpZiAoIXF1YWQubGVhZikge1xyXG4gICAgICB2YXIgbm9kZXMgPSBxdWFkLm5vZGVzLCBuID0gbm9kZXMubGVuZ3RoLCBpID0gLTEsIGM7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgICAgYyA9IG5vZGVzW2ldO1xyXG4gICAgICAgIGlmIChjID09IG51bGwpIGNvbnRpbnVlO1xyXG4gICAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUoYywgYWxwaGEsIGNoYXJnZXMpO1xyXG4gICAgICAgIHF1YWQuY2hhcmdlICs9IGMuY2hhcmdlO1xyXG4gICAgICAgIGN4ICs9IGMuY2hhcmdlICogYy5jeDtcclxuICAgICAgICBjeSArPSBjLmNoYXJnZSAqIGMuY3k7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChxdWFkLnBvaW50KSB7XHJcbiAgICAgIGlmICghcXVhZC5sZWFmKSB7XHJcbiAgICAgICAgcXVhZC5wb2ludC54ICs9IE1hdGgucmFuZG9tKCkgLSAuNTtcclxuICAgICAgICBxdWFkLnBvaW50LnkgKz0gTWF0aC5yYW5kb20oKSAtIC41O1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBrID0gYWxwaGEgKiBjaGFyZ2VzW3F1YWQucG9pbnQuaW5kZXhdO1xyXG4gICAgICBxdWFkLmNoYXJnZSArPSBxdWFkLnBvaW50Q2hhcmdlID0gaztcclxuICAgICAgY3ggKz0gayAqIHF1YWQucG9pbnQueDtcclxuICAgICAgY3kgKz0gayAqIHF1YWQucG9pbnQueTtcclxuICAgIH1cclxuICAgIHF1YWQuY3ggPSBjeCAvIHF1YWQuY2hhcmdlO1xyXG4gICAgcXVhZC5jeSA9IGN5IC8gcXVhZC5jaGFyZ2U7XHJcbiAgfVxyXG4gIHZhciBkM19sYXlvdXRfZm9yY2VMaW5rRGlzdGFuY2UgPSAyMCwgZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoID0gMSwgZDNfbGF5b3V0X2ZvcmNlQ2hhcmdlRGlzdGFuY2UyID0gSW5maW5pdHk7XHJcbiAgZDMubGF5b3V0LmhpZXJhcmNoeSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIHNvcnQgPSBkM19sYXlvdXRfaGllcmFyY2h5U29ydCwgY2hpbGRyZW4gPSBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4sIHZhbHVlID0gZDNfbGF5b3V0X2hpZXJhcmNoeVZhbHVlO1xyXG4gICAgZnVuY3Rpb24gaGllcmFyY2h5KHJvb3QpIHtcclxuICAgICAgdmFyIHN0YWNrID0gWyByb290IF0sIG5vZGVzID0gW10sIG5vZGU7XHJcbiAgICAgIHJvb3QuZGVwdGggPSAwO1xyXG4gICAgICB3aGlsZSAoKG5vZGUgPSBzdGFjay5wb3AoKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICAgICAgaWYgKChjaGlsZHMgPSBjaGlsZHJlbi5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkpICYmIChuID0gY2hpbGRzLmxlbmd0aCkpIHtcclxuICAgICAgICAgIHZhciBuLCBjaGlsZHMsIGNoaWxkO1xyXG4gICAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7XHJcbiAgICAgICAgICAgIHN0YWNrLnB1c2goY2hpbGQgPSBjaGlsZHNbbl0pO1xyXG4gICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlKSBub2RlLnZhbHVlID0gMDtcclxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkgfHwgMDtcclxuICAgICAgICAgIGRlbGV0ZSBub2RlLmNoaWxkcmVuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgICAgdmFyIGNoaWxkcywgcGFyZW50O1xyXG4gICAgICAgIGlmIChzb3J0ICYmIChjaGlsZHMgPSBub2RlLmNoaWxkcmVuKSkgY2hpbGRzLnNvcnQoc29ydCk7XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIChwYXJlbnQgPSBub2RlLnBhcmVudCkpIHBhcmVudC52YWx1ZSArPSBub2RlLnZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIG5vZGVzO1xyXG4gICAgfVxyXG4gICAgaGllcmFyY2h5LnNvcnQgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7XHJcbiAgICAgIHNvcnQgPSB4O1xyXG4gICAgICByZXR1cm4gaGllcmFyY2h5O1xyXG4gICAgfTtcclxuICAgIGhpZXJhcmNoeS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hpbGRyZW47XHJcbiAgICAgIGNoaWxkcmVuID0geDtcclxuICAgICAgcmV0dXJuIGhpZXJhcmNoeTtcclxuICAgIH07XHJcbiAgICBoaWVyYXJjaHkudmFsdWUgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB2YWx1ZSA9IHg7XHJcbiAgICAgIHJldHVybiBoaWVyYXJjaHk7XHJcbiAgICB9O1xyXG4gICAgaGllcmFyY2h5LnJldmFsdWUgPSBmdW5jdGlvbihyb290KSB7XHJcbiAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290LCBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbikgbm9kZS52YWx1ZSA9IDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkge1xyXG4gICAgICAgICAgdmFyIHBhcmVudDtcclxuICAgICAgICAgIGlmICghbm9kZS5jaGlsZHJlbikgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkgfHwgMDtcclxuICAgICAgICAgIGlmIChwYXJlbnQgPSBub2RlLnBhcmVudCkgcGFyZW50LnZhbHVlICs9IG5vZGUudmFsdWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJvb3Q7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGhpZXJhcmNoeTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQob2JqZWN0LCBoaWVyYXJjaHkpIHtcclxuICAgIGQzLnJlYmluZChvYmplY3QsIGhpZXJhcmNoeSwgXCJzb3J0XCIsIFwiY2hpbGRyZW5cIiwgXCJ2YWx1ZVwiKTtcclxuICAgIG9iamVjdC5ub2RlcyA9IG9iamVjdDtcclxuICAgIG9iamVjdC5saW5rcyA9IGQzX2xheW91dF9oaWVyYXJjaHlMaW5rcztcclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShub2RlLCBjYWxsYmFjaykge1xyXG4gICAgdmFyIG5vZGVzID0gWyBub2RlIF07XHJcbiAgICB3aGlsZSAoKG5vZGUgPSBub2Rlcy5wb3AoKSkgIT0gbnVsbCkge1xyXG4gICAgICBjYWxsYmFjayhub2RlKTtcclxuICAgICAgaWYgKChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkge1xyXG4gICAgICAgIHZhciBuLCBjaGlsZHJlbjtcclxuICAgICAgICB3aGlsZSAoLS1uID49IDApIG5vZGVzLnB1c2goY2hpbGRyZW5bbl0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICB2YXIgbm9kZXMgPSBbIG5vZGUgXSwgbm9kZXMyID0gW107XHJcbiAgICB3aGlsZSAoKG5vZGUgPSBub2Rlcy5wb3AoKSkgIT0gbnVsbCkge1xyXG4gICAgICBub2RlczIucHVzaChub2RlKTtcclxuICAgICAgaWYgKChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkge1xyXG4gICAgICAgIHZhciBpID0gLTEsIG4sIGNoaWxkcmVuO1xyXG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgd2hpbGUgKChub2RlID0gbm9kZXMyLnBvcCgpKSAhPSBudWxsKSB7XHJcbiAgICAgIGNhbGxiYWNrKG5vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4oZCkge1xyXG4gICAgcmV0dXJuIGQuY2hpbGRyZW47XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWYWx1ZShkKSB7XHJcbiAgICByZXR1cm4gZC52YWx1ZTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQoYSwgYikge1xyXG4gICAgcmV0dXJuIGIudmFsdWUgLSBhLnZhbHVlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5TGlua3Mobm9kZXMpIHtcclxuICAgIHJldHVybiBkMy5tZXJnZShub2Rlcy5tYXAoZnVuY3Rpb24ocGFyZW50KSB7XHJcbiAgICAgIHJldHVybiAocGFyZW50LmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24oY2hpbGQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgc291cmNlOiBwYXJlbnQsXHJcbiAgICAgICAgICB0YXJnZXQ6IGNoaWxkXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG4gIGQzLmxheW91dC5wYXJ0aXRpb24gPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCksIHNpemUgPSBbIDEsIDEgXTtcclxuICAgIGZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUsIHgsIGR4LCBkeSkge1xyXG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgICBub2RlLnggPSB4O1xyXG4gICAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7XHJcbiAgICAgIG5vZGUuZHggPSBkeDtcclxuICAgICAgbm9kZS5keSA9IGR5O1xyXG4gICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7XHJcbiAgICAgICAgdmFyIGkgPSAtMSwgbiwgYywgZDtcclxuICAgICAgICBkeCA9IG5vZGUudmFsdWUgPyBkeCAvIG5vZGUudmFsdWUgOiAwO1xyXG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbihjID0gY2hpbGRyZW5baV0sIHgsIGQgPSBjLnZhbHVlICogZHgsIGR5KTtcclxuICAgICAgICAgIHggKz0gZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGRlcHRoKG5vZGUpIHtcclxuICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgZCA9IDA7XHJcbiAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHtcclxuICAgICAgICB2YXIgaSA9IC0xLCBuO1xyXG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSBkID0gTWF0aC5tYXgoZCwgZGVwdGgoY2hpbGRyZW5baV0pKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMSArIGQ7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBwYXJ0aXRpb24oZCwgaSkge1xyXG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKTtcclxuICAgICAgcG9zaXRpb24obm9kZXNbMF0sIDAsIHNpemVbMF0sIHNpemVbMV0gLyBkZXB0aChub2Rlc1swXSkpO1xyXG4gICAgICByZXR1cm4gbm9kZXM7XHJcbiAgICB9XHJcbiAgICBwYXJ0aXRpb24uc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcclxuICAgICAgc2l6ZSA9IHg7XHJcbiAgICAgIHJldHVybiBwYXJ0aXRpb247XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFydGl0aW9uLCBoaWVyYXJjaHkpO1xyXG4gIH07XHJcbiAgZDMubGF5b3V0LnBpZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIHZhbHVlID0gTnVtYmVyLCBzb3J0ID0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlLCBzdGFydEFuZ2xlID0gMCwgZW5kQW5nbGUgPSDPhCwgcGFkQW5nbGUgPSAwO1xyXG4gICAgZnVuY3Rpb24gcGllKGRhdGEpIHtcclxuICAgICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwgdmFsdWVzID0gZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkge1xyXG4gICAgICAgIHJldHVybiArdmFsdWUuY2FsbChwaWUsIGQsIGkpO1xyXG4gICAgICB9KSwgYSA9ICsodHlwZW9mIHN0YXJ0QW5nbGUgPT09IFwiZnVuY3Rpb25cIiA/IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHN0YXJ0QW5nbGUpLCBkYSA9ICh0eXBlb2YgZW5kQW5nbGUgPT09IFwiZnVuY3Rpb25cIiA/IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBlbmRBbmdsZSkgLSBhLCBwID0gTWF0aC5taW4oTWF0aC5hYnMoZGEpIC8gbiwgKyh0eXBlb2YgcGFkQW5nbGUgPT09IFwiZnVuY3Rpb25cIiA/IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwYWRBbmdsZSkpLCBwYSA9IHAgKiAoZGEgPCAwID8gLTEgOiAxKSwgc3VtID0gZDMuc3VtKHZhbHVlcyksIGsgPSBzdW0gPyAoZGEgLSBuICogcGEpIC8gc3VtIDogMCwgaW5kZXggPSBkMy5yYW5nZShuKSwgYXJjcyA9IFtdLCB2O1xyXG4gICAgICBpZiAoc29ydCAhPSBudWxsKSBpbmRleC5zb3J0KHNvcnQgPT09IGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSA/IGZ1bmN0aW9uKGksIGopIHtcclxuICAgICAgICByZXR1cm4gdmFsdWVzW2pdIC0gdmFsdWVzW2ldO1xyXG4gICAgICB9IDogZnVuY3Rpb24oaSwgaikge1xyXG4gICAgICAgIHJldHVybiBzb3J0KGRhdGFbaV0sIGRhdGFbal0pO1xyXG4gICAgICB9KTtcclxuICAgICAgaW5kZXguZm9yRWFjaChmdW5jdGlvbihpKSB7XHJcbiAgICAgICAgYXJjc1tpXSA9IHtcclxuICAgICAgICAgIGRhdGE6IGRhdGFbaV0sXHJcbiAgICAgICAgICB2YWx1ZTogdiA9IHZhbHVlc1tpXSxcclxuICAgICAgICAgIHN0YXJ0QW5nbGU6IGEsXHJcbiAgICAgICAgICBlbmRBbmdsZTogYSArPSB2ICogayArIHBhLFxyXG4gICAgICAgICAgcGFkQW5nbGU6IHBcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGFyY3M7XHJcbiAgICB9XHJcbiAgICBwaWUudmFsdWUgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB2YWx1ZSA9IF87XHJcbiAgICAgIHJldHVybiBwaWU7XHJcbiAgICB9O1xyXG4gICAgcGllLnNvcnQgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7XHJcbiAgICAgIHNvcnQgPSBfO1xyXG4gICAgICByZXR1cm4gcGllO1xyXG4gICAgfTtcclxuICAgIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGFydEFuZ2xlO1xyXG4gICAgICBzdGFydEFuZ2xlID0gXztcclxuICAgICAgcmV0dXJuIHBpZTtcclxuICAgIH07XHJcbiAgICBwaWUuZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlO1xyXG4gICAgICBlbmRBbmdsZSA9IF87XHJcbiAgICAgIHJldHVybiBwaWU7XHJcbiAgICB9O1xyXG4gICAgcGllLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRBbmdsZTtcclxuICAgICAgcGFkQW5nbGUgPSBfO1xyXG4gICAgICByZXR1cm4gcGllO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBwaWU7XHJcbiAgfTtcclxuICB2YXIgZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID0ge307XHJcbiAgZDMubGF5b3V0LnN0YWNrID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgdmFsdWVzID0gZDNfaWRlbnRpdHksIG9yZGVyID0gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0LCBvZmZzZXQgPSBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvLCBvdXQgPSBkM19sYXlvdXRfc3RhY2tPdXQsIHggPSBkM19sYXlvdXRfc3RhY2tYLCB5ID0gZDNfbGF5b3V0X3N0YWNrWTtcclxuICAgIGZ1bmN0aW9uIHN0YWNrKGRhdGEsIGluZGV4KSB7XHJcbiAgICAgIGlmICghKG4gPSBkYXRhLmxlbmd0aCkpIHJldHVybiBkYXRhO1xyXG4gICAgICB2YXIgc2VyaWVzID0gZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZXMuY2FsbChzdGFjaywgZCwgaSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB2YXIgcG9pbnRzID0gc2VyaWVzLm1hcChmdW5jdGlvbihkKSB7XHJcbiAgICAgICAgcmV0dXJuIGQubWFwKGZ1bmN0aW9uKHYsIGkpIHtcclxuICAgICAgICAgIHJldHVybiBbIHguY2FsbChzdGFjaywgdiwgaSksIHkuY2FsbChzdGFjaywgdiwgaSkgXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHZhciBvcmRlcnMgPSBvcmRlci5jYWxsKHN0YWNrLCBwb2ludHMsIGluZGV4KTtcclxuICAgICAgc2VyaWVzID0gZDMucGVybXV0ZShzZXJpZXMsIG9yZGVycyk7XHJcbiAgICAgIHBvaW50cyA9IGQzLnBlcm11dGUocG9pbnRzLCBvcmRlcnMpO1xyXG4gICAgICB2YXIgb2Zmc2V0cyA9IG9mZnNldC5jYWxsKHN0YWNrLCBwb2ludHMsIGluZGV4KTtcclxuICAgICAgdmFyIG0gPSBzZXJpZXNbMF0ubGVuZ3RoLCBuLCBpLCBqLCBvO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7XHJcbiAgICAgICAgb3V0LmNhbGwoc3RhY2ssIHNlcmllc1swXVtqXSwgbyA9IG9mZnNldHNbal0sIHBvaW50c1swXVtqXVsxXSk7XHJcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG47ICsraSkge1xyXG4gICAgICAgICAgb3V0LmNhbGwoc3RhY2ssIHNlcmllc1tpXVtqXSwgbyArPSBwb2ludHNbaSAtIDFdW2pdWzFdLCBwb2ludHNbaV1bal1bMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICAgIHN0YWNrLnZhbHVlcyA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVzO1xyXG4gICAgICB2YWx1ZXMgPSB4O1xyXG4gICAgICByZXR1cm4gc3RhY2s7XHJcbiAgICB9O1xyXG4gICAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yZGVyO1xyXG4gICAgICBvcmRlciA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogZDNfbGF5b3V0X3N0YWNrT3JkZXJzLmdldCh4KSB8fCBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQ7XHJcbiAgICAgIHJldHVybiBzdGFjaztcclxuICAgIH07XHJcbiAgICBzdGFjay5vZmZzZXQgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9mZnNldDtcclxuICAgICAgb2Zmc2V0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRzLmdldCh4KSB8fCBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvO1xyXG4gICAgICByZXR1cm4gc3RhY2s7XHJcbiAgICB9O1xyXG4gICAgc3RhY2sueCA9IGZ1bmN0aW9uKHopIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDtcclxuICAgICAgeCA9IHo7XHJcbiAgICAgIHJldHVybiBzdGFjaztcclxuICAgIH07XHJcbiAgICBzdGFjay55ID0gZnVuY3Rpb24oeikge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5O1xyXG4gICAgICB5ID0gejtcclxuICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfTtcclxuICAgIHN0YWNrLm91dCA9IGZ1bmN0aW9uKHopIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0O1xyXG4gICAgICBvdXQgPSB6O1xyXG4gICAgICByZXR1cm4gc3RhY2s7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN0YWNrO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWChkKSB7XHJcbiAgICByZXR1cm4gZC54O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tZKGQpIHtcclxuICAgIHJldHVybiBkLnk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja091dChkLCB5MCwgeSkge1xyXG4gICAgZC55MCA9IHkwO1xyXG4gICAgZC55ID0geTtcclxuICB9XHJcbiAgdmFyIGQzX2xheW91dF9zdGFja09yZGVycyA9IGQzLm1hcCh7XHJcbiAgICBcImluc2lkZS1vdXRcIjogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCBpLCBqLCBtYXggPSBkYXRhLm1hcChkM19sYXlvdXRfc3RhY2tNYXhJbmRleCksIHN1bXMgPSBkYXRhLm1hcChkM19sYXlvdXRfc3RhY2tSZWR1Y2VTdW0pLCBpbmRleCA9IGQzLnJhbmdlKG4pLnNvcnQoZnVuY3Rpb24oYSwgYikge1xyXG4gICAgICAgIHJldHVybiBtYXhbYV0gLSBtYXhbYl07XHJcbiAgICAgIH0pLCB0b3AgPSAwLCBib3R0b20gPSAwLCB0b3BzID0gW10sIGJvdHRvbXMgPSBbXTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgIGogPSBpbmRleFtpXTtcclxuICAgICAgICBpZiAodG9wIDwgYm90dG9tKSB7XHJcbiAgICAgICAgICB0b3AgKz0gc3Vtc1tqXTtcclxuICAgICAgICAgIHRvcHMucHVzaChqKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYm90dG9tICs9IHN1bXNbal07XHJcbiAgICAgICAgICBib3R0b21zLnB1c2goaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBib3R0b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyk7XHJcbiAgICB9LFxyXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpLnJldmVyc2UoKTtcclxuICAgIH0sXHJcbiAgICBcImRlZmF1bHRcIjogZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0XHJcbiAgfSk7XHJcbiAgdmFyIGQzX2xheW91dF9zdGFja09mZnNldHMgPSBkMy5tYXAoe1xyXG4gICAgc2lsaG91ZXR0ZTogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCBtID0gZGF0YVswXS5sZW5ndGgsIHN1bXMgPSBbXSwgbWF4ID0gMCwgaSwgaiwgbywgeTAgPSBbXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikge1xyXG4gICAgICAgIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbjsgaSsrKSBvICs9IGRhdGFbaV1bal1bMV07XHJcbiAgICAgICAgaWYgKG8gPiBtYXgpIG1heCA9IG87XHJcbiAgICAgICAgc3Vtcy5wdXNoKG8pO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcclxuICAgICAgICB5MFtqXSA9IChtYXggLSBzdW1zW2pdKSAvIDI7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHkwO1xyXG4gICAgfSxcclxuICAgIHdpZ2dsZTogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCB4ID0gZGF0YVswXSwgbSA9IHgubGVuZ3RoLCBpLCBqLCBrLCBzMSwgczIsIHMzLCBkeCwgbywgbzAsIHkwID0gW107XHJcbiAgICAgIHkwWzBdID0gbyA9IG8wID0gMDtcclxuICAgICAgZm9yIChqID0gMTsgaiA8IG07ICsraikge1xyXG4gICAgICAgIGZvciAoaSA9IDAsIHMxID0gMDsgaSA8IG47ICsraSkgczEgKz0gZGF0YVtpXVtqXVsxXTtcclxuICAgICAgICBmb3IgKGkgPSAwLCBzMiA9IDAsIGR4ID0geFtqXVswXSAtIHhbaiAtIDFdWzBdOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgICAgICBmb3IgKGsgPSAwLCBzMyA9IChkYXRhW2ldW2pdWzFdIC0gZGF0YVtpXVtqIC0gMV1bMV0pIC8gKDIgKiBkeCk7IGsgPCBpOyArK2spIHtcclxuICAgICAgICAgICAgczMgKz0gKGRhdGFba11bal1bMV0gLSBkYXRhW2tdW2ogLSAxXVsxXSkgLyBkeDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHMyICs9IHMzICogZGF0YVtpXVtqXVsxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgeTBbal0gPSBvIC09IHMxID8gczIgLyBzMSAqIGR4IDogMDtcclxuICAgICAgICBpZiAobyA8IG8wKSBvMCA9IG87XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgeTBbal0gLT0gbzA7XHJcbiAgICAgIHJldHVybiB5MDtcclxuICAgIH0sXHJcbiAgICBleHBhbmQ6IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwgbSA9IGRhdGFbMF0ubGVuZ3RoLCBrID0gMSAvIG4sIGksIGosIG8sIHkwID0gW107XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcclxuICAgICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdO1xyXG4gICAgICAgIGlmIChvKSBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkYXRhW2ldW2pdWzFdIC89IG87IGVsc2UgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZGF0YVtpXVtqXVsxXSA9IGs7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgeTBbal0gPSAwO1xyXG4gICAgICByZXR1cm4geTA7XHJcbiAgICB9LFxyXG4gICAgemVybzogZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVyb1xyXG4gIH0pO1xyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdChkYXRhKSB7XHJcbiAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvKGRhdGEpIHtcclxuICAgIHZhciBqID0gLTEsIG0gPSBkYXRhWzBdLmxlbmd0aCwgeTAgPSBbXTtcclxuICAgIHdoaWxlICgrK2ogPCBtKSB5MFtqXSA9IDA7XHJcbiAgICByZXR1cm4geTA7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja01heEluZGV4KGFycmF5KSB7XHJcbiAgICB2YXIgaSA9IDEsIGogPSAwLCB2ID0gYXJyYXlbMF1bMV0sIGssIG4gPSBhcnJheS5sZW5ndGg7XHJcbiAgICBmb3IgKDtpIDwgbjsgKytpKSB7XHJcbiAgICAgIGlmICgoayA9IGFycmF5W2ldWzFdKSA+IHYpIHtcclxuICAgICAgICBqID0gaTtcclxuICAgICAgICB2ID0gaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGo7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1JlZHVjZVN1bShkKSB7XHJcbiAgICByZXR1cm4gZC5yZWR1Y2UoZDNfbGF5b3V0X3N0YWNrU3VtLCAwKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrU3VtKHAsIGQpIHtcclxuICAgIHJldHVybiBwICsgZFsxXTtcclxuICB9XHJcbiAgZDMubGF5b3V0Lmhpc3RvZ3JhbSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGZyZXF1ZW5jeSA9IHRydWUsIHZhbHVlciA9IE51bWJlciwgcmFuZ2VyID0gZDNfbGF5b3V0X2hpc3RvZ3JhbVJhbmdlLCBiaW5uZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtQmluU3R1cmdlcztcclxuICAgIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhLCBpKSB7XHJcbiAgICAgIHZhciBiaW5zID0gW10sIHZhbHVlcyA9IGRhdGEubWFwKHZhbHVlciwgdGhpcyksIHJhbmdlID0gcmFuZ2VyLmNhbGwodGhpcywgdmFsdWVzLCBpKSwgdGhyZXNob2xkcyA9IGJpbm5lci5jYWxsKHRoaXMsIHJhbmdlLCB2YWx1ZXMsIGkpLCBiaW4sIGkgPSAtMSwgbiA9IHZhbHVlcy5sZW5ndGgsIG0gPSB0aHJlc2hvbGRzLmxlbmd0aCAtIDEsIGsgPSBmcmVxdWVuY3kgPyAxIDogMSAvIG4sIHg7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBtKSB7XHJcbiAgICAgICAgYmluID0gYmluc1tpXSA9IFtdO1xyXG4gICAgICAgIGJpbi5keCA9IHRocmVzaG9sZHNbaSArIDFdIC0gKGJpbi54ID0gdGhyZXNob2xkc1tpXSk7XHJcbiAgICAgICAgYmluLnkgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtID4gMCkge1xyXG4gICAgICAgIGkgPSAtMTtcclxuICAgICAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICAgICAgeCA9IHZhbHVlc1tpXTtcclxuICAgICAgICAgIGlmICh4ID49IHJhbmdlWzBdICYmIHggPD0gcmFuZ2VbMV0pIHtcclxuICAgICAgICAgICAgYmluID0gYmluc1tkMy5iaXNlY3QodGhyZXNob2xkcywgeCwgMSwgbSkgLSAxXTtcclxuICAgICAgICAgICAgYmluLnkgKz0gaztcclxuICAgICAgICAgICAgYmluLnB1c2goZGF0YVtpXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBiaW5zO1xyXG4gICAgfVxyXG4gICAgaGlzdG9ncmFtLnZhbHVlID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZXI7XHJcbiAgICAgIHZhbHVlciA9IHg7XHJcbiAgICAgIHJldHVybiBoaXN0b2dyYW07XHJcbiAgICB9O1xyXG4gICAgaGlzdG9ncmFtLnJhbmdlID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZXI7XHJcbiAgICAgIHJhbmdlciA9IGQzX2Z1bmN0b3IoeCk7XHJcbiAgICAgIHJldHVybiBoaXN0b2dyYW07XHJcbiAgICB9O1xyXG4gICAgaGlzdG9ncmFtLmJpbnMgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGJpbm5lcjtcclxuICAgICAgYmlubmVyID0gdHlwZW9mIHggPT09IFwibnVtYmVyXCIgPyBmdW5jdGlvbihyYW5nZSkge1xyXG4gICAgICAgIHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIHgpO1xyXG4gICAgICB9IDogZDNfZnVuY3Rvcih4KTtcclxuICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcclxuICAgIH07XHJcbiAgICBoaXN0b2dyYW0uZnJlcXVlbmN5ID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmVxdWVuY3k7XHJcbiAgICAgIGZyZXF1ZW5jeSA9ICEheDtcclxuICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gaGlzdG9ncmFtO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpblN0dXJnZXMocmFuZ2UsIHZhbHVlcykge1xyXG4gICAgcmV0dXJuIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIgKyAxKSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgbikge1xyXG4gICAgdmFyIHggPSAtMSwgYiA9ICtyYW5nZVswXSwgbSA9IChyYW5nZVsxXSAtIGIpIC8gbiwgZiA9IFtdO1xyXG4gICAgd2hpbGUgKCsreCA8PSBuKSBmW3hdID0gbSAqIHggKyBiO1xyXG4gICAgcmV0dXJuIGY7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1SYW5nZSh2YWx1ZXMpIHtcclxuICAgIHJldHVybiBbIGQzLm1pbih2YWx1ZXMpLCBkMy5tYXgodmFsdWVzKSBdO1xyXG4gIH1cclxuICBkMy5sYXlvdXQucGFjayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KGQzX2xheW91dF9wYWNrU29ydCksIHBhZGRpbmcgPSAwLCBzaXplID0gWyAxLCAxIF0sIHJhZGl1cztcclxuICAgIGZ1bmN0aW9uIHBhY2soZCwgaSkge1xyXG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwgcm9vdCA9IG5vZGVzWzBdLCB3ID0gc2l6ZVswXSwgaCA9IHNpemVbMV0sIHIgPSByYWRpdXMgPT0gbnVsbCA/IE1hdGguc3FydCA6IHR5cGVvZiByYWRpdXMgPT09IFwiZnVuY3Rpb25cIiA/IHJhZGl1cyA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiByYWRpdXM7XHJcbiAgICAgIH07XHJcbiAgICAgIHJvb3QueCA9IHJvb3QueSA9IDA7XHJcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKGQpIHtcclxuICAgICAgICBkLnIgPSArcihkLnZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGQzX2xheW91dF9wYWNrU2libGluZ3MpO1xyXG4gICAgICBpZiAocGFkZGluZykge1xyXG4gICAgICAgIHZhciBkciA9IHBhZGRpbmcgKiAocmFkaXVzID8gMSA6IE1hdGgubWF4KDIgKiByb290LnIgLyB3LCAyICogcm9vdC5yIC8gaCkpIC8gMjtcclxuICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7XHJcbiAgICAgICAgICBkLnIgKz0gZHI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZDNfbGF5b3V0X3BhY2tTaWJsaW5ncyk7XHJcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24oZCkge1xyXG4gICAgICAgICAgZC5yIC09IGRyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKHJvb3QsIHcgLyAyLCBoIC8gMiwgcmFkaXVzID8gMSA6IDEgLyBNYXRoLm1heCgyICogcm9vdC5yIC8gdywgMiAqIHJvb3QuciAvIGgpKTtcclxuICAgICAgcmV0dXJuIG5vZGVzO1xyXG4gICAgfVxyXG4gICAgcGFjay5zaXplID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplO1xyXG4gICAgICBzaXplID0gXztcclxuICAgICAgcmV0dXJuIHBhY2s7XHJcbiAgICB9O1xyXG4gICAgcGFjay5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhZGl1cztcclxuICAgICAgcmFkaXVzID0gXyA9PSBudWxsIHx8IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogK187XHJcbiAgICAgIHJldHVybiBwYWNrO1xyXG4gICAgfTtcclxuICAgIHBhY2sucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZztcclxuICAgICAgcGFkZGluZyA9ICtfO1xyXG4gICAgICByZXR1cm4gcGFjaztcclxuICAgIH07XHJcbiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChwYWNrLCBoaWVyYXJjaHkpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTb3J0KGEsIGIpIHtcclxuICAgIHJldHVybiBhLnZhbHVlIC0gYi52YWx1ZTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYikge1xyXG4gICAgdmFyIGMgPSBhLl9wYWNrX25leHQ7XHJcbiAgICBhLl9wYWNrX25leHQgPSBiO1xyXG4gICAgYi5fcGFja19wcmV2ID0gYTtcclxuICAgIGIuX3BhY2tfbmV4dCA9IGM7XHJcbiAgICBjLl9wYWNrX3ByZXYgPSBiO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1NwbGljZShhLCBiKSB7XHJcbiAgICBhLl9wYWNrX25leHQgPSBiO1xyXG4gICAgYi5fcGFja19wcmV2ID0gYTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGEsIGIpIHtcclxuICAgIHZhciBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnksIGRyID0gYS5yICsgYi5yO1xyXG4gICAgcmV0dXJuIC45OTkgKiBkciAqIGRyID4gZHggKiBkeCArIGR5ICogZHk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrU2libGluZ3Mobm9kZSkge1xyXG4gICAgaWYgKCEobm9kZXMgPSBub2RlLmNoaWxkcmVuKSB8fCAhKG4gPSBub2Rlcy5sZW5ndGgpKSByZXR1cm47XHJcbiAgICB2YXIgbm9kZXMsIHhNaW4gPSBJbmZpbml0eSwgeE1heCA9IC1JbmZpbml0eSwgeU1pbiA9IEluZmluaXR5LCB5TWF4ID0gLUluZmluaXR5LCBhLCBiLCBjLCBpLCBqLCBrLCBuO1xyXG4gICAgZnVuY3Rpb24gYm91bmQobm9kZSkge1xyXG4gICAgICB4TWluID0gTWF0aC5taW4obm9kZS54IC0gbm9kZS5yLCB4TWluKTtcclxuICAgICAgeE1heCA9IE1hdGgubWF4KG5vZGUueCArIG5vZGUuciwgeE1heCk7XHJcbiAgICAgIHlNaW4gPSBNYXRoLm1pbihub2RlLnkgLSBub2RlLnIsIHlNaW4pO1xyXG4gICAgICB5TWF4ID0gTWF0aC5tYXgobm9kZS55ICsgbm9kZS5yLCB5TWF4KTtcclxuICAgIH1cclxuICAgIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tMaW5rKTtcclxuICAgIGEgPSBub2Rlc1swXTtcclxuICAgIGEueCA9IC1hLnI7XHJcbiAgICBhLnkgPSAwO1xyXG4gICAgYm91bmQoYSk7XHJcbiAgICBpZiAobiA+IDEpIHtcclxuICAgICAgYiA9IG5vZGVzWzFdO1xyXG4gICAgICBiLnggPSBiLnI7XHJcbiAgICAgIGIueSA9IDA7XHJcbiAgICAgIGJvdW5kKGIpO1xyXG4gICAgICBpZiAobiA+IDIpIHtcclxuICAgICAgICBjID0gbm9kZXNbMl07XHJcbiAgICAgICAgZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjKTtcclxuICAgICAgICBib3VuZChjKTtcclxuICAgICAgICBkM19sYXlvdXRfcGFja0luc2VydChhLCBjKTtcclxuICAgICAgICBhLl9wYWNrX3ByZXYgPSBjO1xyXG4gICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGMsIGIpO1xyXG4gICAgICAgIGIgPSBhLl9wYWNrX25leHQ7XHJcbiAgICAgICAgZm9yIChpID0gMzsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjID0gbm9kZXNbaV0pO1xyXG4gICAgICAgICAgdmFyIGlzZWN0ID0gMCwgczEgPSAxLCBzMiA9IDE7XHJcbiAgICAgICAgICBmb3IgKGogPSBiLl9wYWNrX25leHQ7IGogIT09IGI7IGogPSBqLl9wYWNrX25leHQsIHMxKyspIHtcclxuICAgICAgICAgICAgaWYgKGQzX2xheW91dF9wYWNrSW50ZXJzZWN0cyhqLCBjKSkge1xyXG4gICAgICAgICAgICAgIGlzZWN0ID0gMTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGlzZWN0ID09IDEpIHtcclxuICAgICAgICAgICAgZm9yIChrID0gYS5fcGFja19wcmV2OyBrICE9PSBqLl9wYWNrX3ByZXY7IGsgPSBrLl9wYWNrX3ByZXYsIHMyKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGssIGMpKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpc2VjdCkge1xyXG4gICAgICAgICAgICBpZiAoczEgPCBzMiB8fCBzMSA9PSBzMiAmJiBiLnIgPCBhLnIpIGQzX2xheW91dF9wYWNrU3BsaWNlKGEsIGIgPSBqKTsgZWxzZSBkM19sYXlvdXRfcGFja1NwbGljZShhID0gaywgYik7XHJcbiAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpO1xyXG4gICAgICAgICAgICBiID0gYztcclxuICAgICAgICAgICAgYm91bmQoYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgY3ggPSAoeE1pbiArIHhNYXgpIC8gMiwgY3kgPSAoeU1pbiArIHlNYXgpIC8gMiwgY3IgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xyXG4gICAgICBjID0gbm9kZXNbaV07XHJcbiAgICAgIGMueCAtPSBjeDtcclxuICAgICAgYy55IC09IGN5O1xyXG4gICAgICBjciA9IE1hdGgubWF4KGNyLCBjLnIgKyBNYXRoLnNxcnQoYy54ICogYy54ICsgYy55ICogYy55KSk7XHJcbiAgICB9XHJcbiAgICBub2RlLnIgPSBjcjtcclxuICAgIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tVbmxpbmspO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja0xpbmsobm9kZSkge1xyXG4gICAgbm9kZS5fcGFja19uZXh0ID0gbm9kZS5fcGFja19wcmV2ID0gbm9kZTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tVbmxpbmsobm9kZSkge1xyXG4gICAgZGVsZXRlIG5vZGUuX3BhY2tfbmV4dDtcclxuICAgIGRlbGV0ZSBub2RlLl9wYWNrX3ByZXY7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKG5vZGUsIHgsIHksIGspIHtcclxuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICBub2RlLnggPSB4ICs9IGsgKiBub2RlLng7XHJcbiAgICBub2RlLnkgPSB5ICs9IGsgKiBub2RlLnk7XHJcbiAgICBub2RlLnIgKj0gaztcclxuICAgIGlmIChjaGlsZHJlbikge1xyXG4gICAgICB2YXIgaSA9IC0xLCBuID0gY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikgZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0oY2hpbGRyZW5baV0sIHgsIHksIGspO1xyXG4gICAgfVxyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMpIHtcclxuICAgIHZhciBkYiA9IGEuciArIGMuciwgZHggPSBiLnggLSBhLngsIGR5ID0gYi55IC0gYS55O1xyXG4gICAgaWYgKGRiICYmIChkeCB8fCBkeSkpIHtcclxuICAgICAgdmFyIGRhID0gYi5yICsgYy5yLCBkYyA9IGR4ICogZHggKyBkeSAqIGR5O1xyXG4gICAgICBkYSAqPSBkYTtcclxuICAgICAgZGIgKj0gZGI7XHJcbiAgICAgIHZhciB4ID0gLjUgKyAoZGIgLSBkYSkgLyAoMiAqIGRjKSwgeSA9IE1hdGguc3FydChNYXRoLm1heCgwLCAyICogZGEgKiAoZGIgKyBkYykgLSAoZGIgLT0gZGMpICogZGIgLSBkYSAqIGRhKSkgLyAoMiAqIGRjKTtcclxuICAgICAgYy54ID0gYS54ICsgeCAqIGR4ICsgeSAqIGR5O1xyXG4gICAgICBjLnkgPSBhLnkgKyB4ICogZHkgLSB5ICogZHg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjLnggPSBhLnggKyBkYjtcclxuICAgICAgYy55ID0gYS55O1xyXG4gICAgfVxyXG4gIH1cclxuICBkMy5sYXlvdXQudHJlZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLCBzZXBhcmF0aW9uID0gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uLCBzaXplID0gWyAxLCAxIF0sIG5vZGVTaXplID0gbnVsbDtcclxuICAgIGZ1bmN0aW9uIHRyZWUoZCwgaSkge1xyXG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwgcm9vdDAgPSBub2Rlc1swXSwgcm9vdDEgPSB3cmFwVHJlZShyb290MCk7XHJcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QxLCBmaXJzdFdhbGspLCByb290MS5wYXJlbnQubSA9IC1yb290MS56O1xyXG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdDEsIHNlY29uZFdhbGspO1xyXG4gICAgICBpZiAobm9kZVNpemUpIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290MCwgc2l6ZU5vZGUpOyBlbHNlIHtcclxuICAgICAgICB2YXIgbGVmdCA9IHJvb3QwLCByaWdodCA9IHJvb3QwLCBib3R0b20gPSByb290MDtcclxuICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdDAsIGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgICAgIGlmIChub2RlLnggPCBsZWZ0LngpIGxlZnQgPSBub2RlO1xyXG4gICAgICAgICAgaWYgKG5vZGUueCA+IHJpZ2h0LngpIHJpZ2h0ID0gbm9kZTtcclxuICAgICAgICAgIGlmIChub2RlLmRlcHRoID4gYm90dG9tLmRlcHRoKSBib3R0b20gPSBub2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciB0eCA9IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiAtIGxlZnQueCwga3ggPSBzaXplWzBdIC8gKHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDIgKyB0eCksIGt5ID0gc2l6ZVsxXSAvIChib3R0b20uZGVwdGggfHwgMSk7XHJcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QmVmb3JlKHJvb3QwLCBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgICAgICBub2RlLnggPSAobm9kZS54ICsgdHgpICoga3g7XHJcbiAgICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoICoga3k7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5vZGVzO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gd3JhcFRyZWUocm9vdDApIHtcclxuICAgICAgdmFyIHJvb3QxID0ge1xyXG4gICAgICAgIEE6IG51bGwsXHJcbiAgICAgICAgY2hpbGRyZW46IFsgcm9vdDAgXVxyXG4gICAgICB9LCBxdWV1ZSA9IFsgcm9vdDEgXSwgbm9kZTE7XHJcbiAgICAgIHdoaWxlICgobm9kZTEgPSBxdWV1ZS5wb3AoKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gbm9kZTEuY2hpbGRyZW4sIGNoaWxkLCBpID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgICAgcXVldWUucHVzaCgoY2hpbGRyZW5baV0gPSBjaGlsZCA9IHtcclxuICAgICAgICAgICAgXzogY2hpbGRyZW5baV0sXHJcbiAgICAgICAgICAgIHBhcmVudDogbm9kZTEsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiAoY2hpbGQgPSBjaGlsZHJlbltpXS5jaGlsZHJlbikgJiYgY2hpbGQuc2xpY2UoKSB8fCBbXSxcclxuICAgICAgICAgICAgQTogbnVsbCxcclxuICAgICAgICAgICAgYTogbnVsbCxcclxuICAgICAgICAgICAgejogMCxcclxuICAgICAgICAgICAgbTogMCxcclxuICAgICAgICAgICAgYzogMCxcclxuICAgICAgICAgICAgczogMCxcclxuICAgICAgICAgICAgdDogbnVsbCxcclxuICAgICAgICAgICAgaTogaVxyXG4gICAgICAgICAgfSkuYSA9IGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJvb3QxLmNoaWxkcmVuWzBdO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZmlyc3RXYWxrKHYpIHtcclxuICAgICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwgc2libGluZ3MgPSB2LnBhcmVudC5jaGlsZHJlbiwgdyA9IHYuaSA/IHNpYmxpbmdzW3YuaSAtIDFdIDogbnVsbDtcclxuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIGQzX2xheW91dF90cmVlU2hpZnQodik7XHJcbiAgICAgICAgdmFyIG1pZHBvaW50ID0gKGNoaWxkcmVuWzBdLnogKyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS56KSAvIDI7XHJcbiAgICAgICAgaWYgKHcpIHtcclxuICAgICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pO1xyXG4gICAgICAgICAgdi5tID0gdi56IC0gbWlkcG9pbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHYueiA9IG1pZHBvaW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh3KSB7XHJcbiAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7XHJcbiAgICAgIH1cclxuICAgICAgdi5wYXJlbnQuQSA9IGFwcG9ydGlvbih2LCB3LCB2LnBhcmVudC5BIHx8IHNpYmxpbmdzWzBdKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNlY29uZFdhbGsodikge1xyXG4gICAgICB2Ll8ueCA9IHYueiArIHYucGFyZW50Lm07XHJcbiAgICAgIHYubSArPSB2LnBhcmVudC5tO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXBwb3J0aW9uKHYsIHcsIGFuY2VzdG9yKSB7XHJcbiAgICAgIGlmICh3KSB7XHJcbiAgICAgICAgdmFyIHZpcCA9IHYsIHZvcCA9IHYsIHZpbSA9IHcsIHZvbSA9IHZpcC5wYXJlbnQuY2hpbGRyZW5bMF0sIHNpcCA9IHZpcC5tLCBzb3AgPSB2b3AubSwgc2ltID0gdmltLm0sIHNvbSA9IHZvbS5tLCBzaGlmdDtcclxuICAgICAgICB3aGlsZSAodmltID0gZDNfbGF5b3V0X3RyZWVSaWdodCh2aW0pLCB2aXAgPSBkM19sYXlvdXRfdHJlZUxlZnQodmlwKSwgdmltICYmIHZpcCkge1xyXG4gICAgICAgICAgdm9tID0gZDNfbGF5b3V0X3RyZWVMZWZ0KHZvbSk7XHJcbiAgICAgICAgICB2b3AgPSBkM19sYXlvdXRfdHJlZVJpZ2h0KHZvcCk7XHJcbiAgICAgICAgICB2b3AuYSA9IHY7XHJcbiAgICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7XHJcbiAgICAgICAgICBpZiAoc2hpZnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGQzX2xheW91dF90cmVlTW92ZShkM19sYXlvdXRfdHJlZUFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpLCB2LCBzaGlmdCk7XHJcbiAgICAgICAgICAgIHNpcCArPSBzaGlmdDtcclxuICAgICAgICAgICAgc29wICs9IHNoaWZ0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2ltICs9IHZpbS5tO1xyXG4gICAgICAgICAgc2lwICs9IHZpcC5tO1xyXG4gICAgICAgICAgc29tICs9IHZvbS5tO1xyXG4gICAgICAgICAgc29wICs9IHZvcC5tO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmltICYmICFkM19sYXlvdXRfdHJlZVJpZ2h0KHZvcCkpIHtcclxuICAgICAgICAgIHZvcC50ID0gdmltO1xyXG4gICAgICAgICAgdm9wLm0gKz0gc2ltIC0gc29wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmlwICYmICFkM19sYXlvdXRfdHJlZUxlZnQodm9tKSkge1xyXG4gICAgICAgICAgdm9tLnQgPSB2aXA7XHJcbiAgICAgICAgICB2b20ubSArPSBzaXAgLSBzb207XHJcbiAgICAgICAgICBhbmNlc3RvciA9IHY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhbmNlc3RvcjtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNpemVOb2RlKG5vZGUpIHtcclxuICAgICAgbm9kZS54ICo9IHNpemVbMF07XHJcbiAgICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBzaXplWzFdO1xyXG4gICAgfVxyXG4gICAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uO1xyXG4gICAgICBzZXBhcmF0aW9uID0geDtcclxuICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICB9O1xyXG4gICAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlU2l6ZSA/IG51bGwgOiBzaXplO1xyXG4gICAgICBub2RlU2l6ZSA9IChzaXplID0geCkgPT0gbnVsbCA/IHNpemVOb2RlIDogbnVsbDtcclxuICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICB9O1xyXG4gICAgdHJlZS5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVNpemUgPyBzaXplIDogbnVsbDtcclxuICAgICAgbm9kZVNpemUgPSAoc2l6ZSA9IHgpID09IG51bGwgPyBudWxsIDogc2l6ZU5vZGU7XHJcbiAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHRyZWUsIGhpZXJhcmNoeSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb24oYSwgYikge1xyXG4gICAgcmV0dXJuIGEucGFyZW50ID09IGIucGFyZW50ID8gMSA6IDI7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlTGVmdCh2KSB7XHJcbiAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuO1xyXG4gICAgcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuWzBdIDogdi50O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVJpZ2h0KHYpIHtcclxuICAgIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sIG47XHJcbiAgICByZXR1cm4gKG4gPSBjaGlsZHJlbi5sZW5ndGgpID8gY2hpbGRyZW5bbiAtIDFdIDogdi50O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZU1vdmUod20sIHdwLCBzaGlmdCkge1xyXG4gICAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKHdwLmkgLSB3bS5pKTtcclxuICAgIHdwLmMgLT0gY2hhbmdlO1xyXG4gICAgd3AucyArPSBzaGlmdDtcclxuICAgIHdtLmMgKz0gY2hhbmdlO1xyXG4gICAgd3AueiArPSBzaGlmdDtcclxuICAgIHdwLm0gKz0gc2hpZnQ7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2hpZnQodikge1xyXG4gICAgdmFyIHNoaWZ0ID0gMCwgY2hhbmdlID0gMCwgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLCBpID0gY2hpbGRyZW4ubGVuZ3RoLCB3O1xyXG4gICAgd2hpbGUgKC0taSA+PSAwKSB7XHJcbiAgICAgIHcgPSBjaGlsZHJlbltpXTtcclxuICAgICAgdy56ICs9IHNoaWZ0O1xyXG4gICAgICB3Lm0gKz0gc2hpZnQ7XHJcbiAgICAgIHNoaWZ0ICs9IHcucyArIChjaGFuZ2UgKz0gdy5jKTtcclxuICAgIH1cclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSB7XHJcbiAgICByZXR1cm4gdmltLmEucGFyZW50ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7XHJcbiAgfVxyXG4gIGQzLmxheW91dC5jbHVzdGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksIHNlcGFyYXRpb24gPSBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb24sIHNpemUgPSBbIDEsIDEgXSwgbm9kZVNpemUgPSBmYWxzZTtcclxuICAgIGZ1bmN0aW9uIGNsdXN0ZXIoZCwgaSkge1xyXG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwgcm9vdCA9IG5vZGVzWzBdLCBwcmV2aW91c05vZGUsIHggPSAwO1xyXG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcclxuICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBub2RlLnggPSBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pO1xyXG4gICAgICAgICAgbm9kZS55ID0gZDNfbGF5b3V0X2NsdXN0ZXJZKGNoaWxkcmVuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwO1xyXG4gICAgICAgICAgbm9kZS55ID0gMDtcclxuICAgICAgICAgIHByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdmFyIGxlZnQgPSBkM19sYXlvdXRfY2x1c3RlckxlZnQocm9vdCksIHJpZ2h0ID0gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChyb290KSwgeDAgPSBsZWZ0LnggLSBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIsIHgxID0gcmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMjtcclxuICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgbm9kZVNpemUgPyBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHJvb3QueCkgKiBzaXplWzBdO1xyXG4gICAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogc2l6ZVsxXTtcclxuICAgICAgfSA6IGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogc2l6ZVswXTtcclxuICAgICAgICBub2RlLnkgPSAoMSAtIChyb290LnkgPyBub2RlLnkgLyByb290LnkgOiAxKSkgKiBzaXplWzFdO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIG5vZGVzO1xyXG4gICAgfVxyXG4gICAgY2x1c3Rlci5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uO1xyXG4gICAgICBzZXBhcmF0aW9uID0geDtcclxuICAgICAgcmV0dXJuIGNsdXN0ZXI7XHJcbiAgICB9O1xyXG4gICAgY2x1c3Rlci5zaXplID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlU2l6ZSA/IG51bGwgOiBzaXplO1xyXG4gICAgICBub2RlU2l6ZSA9IChzaXplID0geCkgPT0gbnVsbDtcclxuICAgICAgcmV0dXJuIGNsdXN0ZXI7XHJcbiAgICB9O1xyXG4gICAgY2x1c3Rlci5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVNpemUgPyBzaXplIDogbnVsbDtcclxuICAgICAgbm9kZVNpemUgPSAoc2l6ZSA9IHgpICE9IG51bGw7XHJcbiAgICAgIHJldHVybiBjbHVzdGVyO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKGNsdXN0ZXIsIGhpZXJhcmNoeSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pIHtcclxuICAgIHJldHVybiAxICsgZDMubWF4KGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xyXG4gICAgICByZXR1cm4gY2hpbGQueTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pIHtcclxuICAgIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24oeCwgY2hpbGQpIHtcclxuICAgICAgcmV0dXJuIHggKyBjaGlsZC54O1xyXG4gICAgfSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyTGVmdChub2RlKSB7XHJcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA/IGQzX2xheW91dF9jbHVzdGVyTGVmdChjaGlsZHJlblswXSkgOiBub2RlO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KG5vZGUpIHtcclxuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIG47XHJcbiAgICByZXR1cm4gY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpID8gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChjaGlsZHJlbltuIC0gMV0pIDogbm9kZTtcclxuICB9XHJcbiAgZDMubGF5b3V0LnRyZWVtYXAgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCksIHJvdW5kID0gTWF0aC5yb3VuZCwgc2l6ZSA9IFsgMSwgMSBdLCBwYWRkaW5nID0gbnVsbCwgcGFkID0gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsLCBzdGlja3kgPSBmYWxzZSwgc3RpY2tpZXMsIG1vZGUgPSBcInNxdWFyaWZ5XCIsIHJhdGlvID0gLjUgKiAoMSArIE1hdGguc3FydCg1KSk7XHJcbiAgICBmdW5jdGlvbiBzY2FsZShjaGlsZHJlbiwgaykge1xyXG4gICAgICB2YXIgaSA9IC0xLCBuID0gY2hpbGRyZW4ubGVuZ3RoLCBjaGlsZCwgYXJlYTtcclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICBhcmVhID0gKGNoaWxkID0gY2hpbGRyZW5baV0pLnZhbHVlICogKGsgPCAwID8gMCA6IGspO1xyXG4gICAgICAgIGNoaWxkLmFyZWEgPSBpc05hTihhcmVhKSB8fCBhcmVhIDw9IDAgPyAwIDogYXJlYTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gc3F1YXJpZnkobm9kZSkge1xyXG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksIHJvdyA9IFtdLCByZW1haW5pbmcgPSBjaGlsZHJlbi5zbGljZSgpLCBjaGlsZCwgYmVzdCA9IEluZmluaXR5LCBzY29yZSwgdSA9IG1vZGUgPT09IFwic2xpY2VcIiA/IHJlY3QuZHggOiBtb2RlID09PSBcImRpY2VcIiA/IHJlY3QuZHkgOiBtb2RlID09PSBcInNsaWNlLWRpY2VcIiA/IG5vZGUuZGVwdGggJiAxID8gcmVjdC5keSA6IHJlY3QuZHggOiBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KSwgbjtcclxuICAgICAgICBzY2FsZShyZW1haW5pbmcsIHJlY3QuZHggKiByZWN0LmR5IC8gbm9kZS52YWx1ZSk7XHJcbiAgICAgICAgcm93LmFyZWEgPSAwO1xyXG4gICAgICAgIHdoaWxlICgobiA9IHJlbWFpbmluZy5sZW5ndGgpID4gMCkge1xyXG4gICAgICAgICAgcm93LnB1c2goY2hpbGQgPSByZW1haW5pbmdbbiAtIDFdKTtcclxuICAgICAgICAgIHJvdy5hcmVhICs9IGNoaWxkLmFyZWE7XHJcbiAgICAgICAgICBpZiAobW9kZSAhPT0gXCJzcXVhcmlmeVwiIHx8IChzY29yZSA9IHdvcnN0KHJvdywgdSkpIDw9IGJlc3QpIHtcclxuICAgICAgICAgICAgcmVtYWluaW5nLnBvcCgpO1xyXG4gICAgICAgICAgICBiZXN0ID0gc2NvcmU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByb3cuYXJlYSAtPSByb3cucG9wKCkuYXJlYTtcclxuICAgICAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHUgPSBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KTtcclxuICAgICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDtcclxuICAgICAgICAgICAgYmVzdCA9IEluZmluaXR5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCB0cnVlKTtcclxuICAgICAgICAgIHJvdy5sZW5ndGggPSByb3cuYXJlYSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goc3F1YXJpZnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzdGlja2lmeShub2RlKSB7XHJcbiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XHJcbiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICB2YXIgcmVjdCA9IHBhZChub2RlKSwgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgY2hpbGQsIHJvdyA9IFtdO1xyXG4gICAgICAgIHNjYWxlKHJlbWFpbmluZywgcmVjdC5keCAqIHJlY3QuZHkgLyBub2RlLnZhbHVlKTtcclxuICAgICAgICByb3cuYXJlYSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKGNoaWxkID0gcmVtYWluaW5nLnBvcCgpKSB7XHJcbiAgICAgICAgICByb3cucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICByb3cuYXJlYSArPSBjaGlsZC5hcmVhO1xyXG4gICAgICAgICAgaWYgKGNoaWxkLnogIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvbihyb3csIGNoaWxkLnogPyByZWN0LmR4IDogcmVjdC5keSwgcmVjdCwgIXJlbWFpbmluZy5sZW5ndGgpO1xyXG4gICAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKHN0aWNraWZ5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gd29yc3Qocm93LCB1KSB7XHJcbiAgICAgIHZhciBzID0gcm93LmFyZWEsIHIsIHJtYXggPSAwLCBybWluID0gSW5maW5pdHksIGkgPSAtMSwgbiA9IHJvdy5sZW5ndGg7XHJcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgICAgaWYgKCEociA9IHJvd1tpXS5hcmVhKSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHIgPCBybWluKSBybWluID0gcjtcclxuICAgICAgICBpZiAociA+IHJtYXgpIHJtYXggPSByO1xyXG4gICAgICB9XHJcbiAgICAgIHMgKj0gcztcclxuICAgICAgdSAqPSB1O1xyXG4gICAgICByZXR1cm4gcyA/IE1hdGgubWF4KHUgKiBybWF4ICogcmF0aW8gLyBzLCBzIC8gKHUgKiBybWluICogcmF0aW8pKSA6IEluZmluaXR5O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcG9zaXRpb24ocm93LCB1LCByZWN0LCBmbHVzaCkge1xyXG4gICAgICB2YXIgaSA9IC0xLCBuID0gcm93Lmxlbmd0aCwgeCA9IHJlY3QueCwgeSA9IHJlY3QueSwgdiA9IHUgPyByb3VuZChyb3cuYXJlYSAvIHUpIDogMCwgbztcclxuICAgICAgaWYgKHUgPT0gcmVjdC5keCkge1xyXG4gICAgICAgIGlmIChmbHVzaCB8fCB2ID4gcmVjdC5keSkgdiA9IHJlY3QuZHk7XHJcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICAgIG8gPSByb3dbaV07XHJcbiAgICAgICAgICBvLnggPSB4O1xyXG4gICAgICAgICAgby55ID0geTtcclxuICAgICAgICAgIG8uZHkgPSB2O1xyXG4gICAgICAgICAgeCArPSBvLmR4ID0gTWF0aC5taW4ocmVjdC54ICsgcmVjdC5keCAtIHgsIHYgPyByb3VuZChvLmFyZWEgLyB2KSA6IDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnogPSB0cnVlO1xyXG4gICAgICAgIG8uZHggKz0gcmVjdC54ICsgcmVjdC5keCAtIHg7XHJcbiAgICAgICAgcmVjdC55ICs9IHY7XHJcbiAgICAgICAgcmVjdC5keSAtPSB2O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChmbHVzaCB8fCB2ID4gcmVjdC5keCkgdiA9IHJlY3QuZHg7XHJcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICAgIG8gPSByb3dbaV07XHJcbiAgICAgICAgICBvLnggPSB4O1xyXG4gICAgICAgICAgby55ID0geTtcclxuICAgICAgICAgIG8uZHggPSB2O1xyXG4gICAgICAgICAgeSArPSBvLmR5ID0gTWF0aC5taW4ocmVjdC55ICsgcmVjdC5keSAtIHksIHYgPyByb3VuZChvLmFyZWEgLyB2KSA6IDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnogPSBmYWxzZTtcclxuICAgICAgICBvLmR5ICs9IHJlY3QueSArIHJlY3QuZHkgLSB5O1xyXG4gICAgICAgIHJlY3QueCArPSB2O1xyXG4gICAgICAgIHJlY3QuZHggLT0gdjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdHJlZW1hcChkKSB7XHJcbiAgICAgIHZhciBub2RlcyA9IHN0aWNraWVzIHx8IGhpZXJhcmNoeShkKSwgcm9vdCA9IG5vZGVzWzBdO1xyXG4gICAgICByb290LnggPSByb290LnkgPSAwO1xyXG4gICAgICBpZiAocm9vdC52YWx1ZSkgcm9vdC5keCA9IHNpemVbMF0sIHJvb3QuZHkgPSBzaXplWzFdOyBlbHNlIHJvb3QuZHggPSByb290LmR5ID0gMDtcclxuICAgICAgaWYgKHN0aWNraWVzKSBoaWVyYXJjaHkucmV2YWx1ZShyb290KTtcclxuICAgICAgc2NhbGUoWyByb290IF0sIHJvb3QuZHggKiByb290LmR5IC8gcm9vdC52YWx1ZSk7XHJcbiAgICAgIChzdGlja2llcyA/IHN0aWNraWZ5IDogc3F1YXJpZnkpKHJvb3QpO1xyXG4gICAgICBpZiAoc3RpY2t5KSBzdGlja2llcyA9IG5vZGVzO1xyXG4gICAgICByZXR1cm4gbm9kZXM7XHJcbiAgICB9XHJcbiAgICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7XHJcbiAgICAgIHNpemUgPSB4O1xyXG4gICAgICByZXR1cm4gdHJlZW1hcDtcclxuICAgIH07XHJcbiAgICB0cmVlbWFwLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhZGRpbmc7XHJcbiAgICAgIGZ1bmN0aW9uIHBhZEZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgICB2YXIgcCA9IHguY2FsbCh0cmVlbWFwLCBub2RlLCBub2RlLmRlcHRoKTtcclxuICAgICAgICByZXR1cm4gcCA9PSBudWxsID8gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsKG5vZGUpIDogZDNfbGF5b3V0X3RyZWVtYXBQYWQobm9kZSwgdHlwZW9mIHAgPT09IFwibnVtYmVyXCIgPyBbIHAsIHAsIHAsIHAgXSA6IHApO1xyXG4gICAgICB9XHJcbiAgICAgIGZ1bmN0aW9uIHBhZENvbnN0YW50KG5vZGUpIHtcclxuICAgICAgICByZXR1cm4gZDNfbGF5b3V0X3RyZWVtYXBQYWQobm9kZSwgeCk7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHR5cGU7XHJcbiAgICAgIHBhZCA9IChwYWRkaW5nID0geCkgPT0gbnVsbCA/IGQzX2xheW91dF90cmVlbWFwUGFkTnVsbCA6ICh0eXBlID0gdHlwZW9mIHgpID09PSBcImZ1bmN0aW9uXCIgPyBwYWRGdW5jdGlvbiA6IHR5cGUgPT09IFwibnVtYmVyXCIgPyAoeCA9IFsgeCwgeCwgeCwgeCBdLCBcclxuICAgICAgcGFkQ29uc3RhbnQpIDogcGFkQ29uc3RhbnQ7XHJcbiAgICAgIHJldHVybiB0cmVlbWFwO1xyXG4gICAgfTtcclxuICAgIHRyZWVtYXAucm91bmQgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJvdW5kICE9IE51bWJlcjtcclxuICAgICAgcm91bmQgPSB4ID8gTWF0aC5yb3VuZCA6IE51bWJlcjtcclxuICAgICAgcmV0dXJuIHRyZWVtYXA7XHJcbiAgICB9O1xyXG4gICAgdHJlZW1hcC5zdGlja3kgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0aWNreTtcclxuICAgICAgc3RpY2t5ID0geDtcclxuICAgICAgc3RpY2tpZXMgPSBudWxsO1xyXG4gICAgICByZXR1cm4gdHJlZW1hcDtcclxuICAgIH07XHJcbiAgICB0cmVlbWFwLnJhdGlvID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYXRpbztcclxuICAgICAgcmF0aW8gPSB4O1xyXG4gICAgICByZXR1cm4gdHJlZW1hcDtcclxuICAgIH07XHJcbiAgICB0cmVlbWFwLm1vZGUgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1vZGU7XHJcbiAgICAgIG1vZGUgPSB4ICsgXCJcIjtcclxuICAgICAgcmV0dXJuIHRyZWVtYXA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZW1hcCwgaGllcmFyY2h5KTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiBub2RlLngsXHJcbiAgICAgIHk6IG5vZGUueSxcclxuICAgICAgZHg6IG5vZGUuZHgsXHJcbiAgICAgIGR5OiBub2RlLmR5XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCBwYWRkaW5nKSB7XHJcbiAgICB2YXIgeCA9IG5vZGUueCArIHBhZGRpbmdbM10sIHkgPSBub2RlLnkgKyBwYWRkaW5nWzBdLCBkeCA9IG5vZGUuZHggLSBwYWRkaW5nWzFdIC0gcGFkZGluZ1szXSwgZHkgPSBub2RlLmR5IC0gcGFkZGluZ1swXSAtIHBhZGRpbmdbMl07XHJcbiAgICBpZiAoZHggPCAwKSB7XHJcbiAgICAgIHggKz0gZHggLyAyO1xyXG4gICAgICBkeCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAoZHkgPCAwKSB7XHJcbiAgICAgIHkgKz0gZHkgLyAyO1xyXG4gICAgICBkeSA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiB4LFxyXG4gICAgICB5OiB5LFxyXG4gICAgICBkeDogZHgsXHJcbiAgICAgIGR5OiBkeVxyXG4gICAgfTtcclxuICB9XHJcbiAgZDMucmFuZG9tID0ge1xyXG4gICAgbm9ybWFsOiBmdW5jdGlvbijCtSwgz4MpIHtcclxuICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xyXG4gICAgICBpZiAobiA8IDIpIM+DID0gMTtcclxuICAgICAgaWYgKG4gPCAxKSDCtSA9IDA7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgeCwgeSwgcjtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICB4ID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxO1xyXG4gICAgICAgICAgeSA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTtcclxuICAgICAgICAgIHIgPSB4ICogeCArIHkgKiB5O1xyXG4gICAgICAgIH0gd2hpbGUgKCFyIHx8IHIgPiAxKTtcclxuICAgICAgICByZXR1cm4gwrUgKyDPgyAqIHggKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xyXG4gICAgICB9O1xyXG4gICAgfSxcclxuICAgIGxvZ05vcm1hbDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciByYW5kb20gPSBkMy5yYW5kb20ubm9ybWFsLmFwcGx5KGQzLCBhcmd1bWVudHMpO1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguZXhwKHJhbmRvbSgpKTtcclxuICAgICAgfTtcclxuICAgIH0sXHJcbiAgICBiYXRlczogZnVuY3Rpb24obSkge1xyXG4gICAgICB2YXIgcmFuZG9tID0gZDMucmFuZG9tLmlyd2luSGFsbChtKTtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiByYW5kb20oKSAvIG07XHJcbiAgICAgIH07XHJcbiAgICB9LFxyXG4gICAgaXJ3aW5IYWxsOiBmdW5jdGlvbihtKSB7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICBmb3IgKHZhciBzID0gMCwgaiA9IDA7IGogPCBtOyBqKyspIHMgKz0gTWF0aC5yYW5kb20oKTtcclxuICAgICAgICByZXR1cm4gcztcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9O1xyXG4gIGQzLnNjYWxlID0ge307XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSB7XHJcbiAgICB2YXIgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xyXG4gICAgcmV0dXJuIHN0YXJ0IDwgc3RvcCA/IFsgc3RhcnQsIHN0b3AgXSA6IFsgc3RvcCwgc3RhcnQgXTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVSYW5nZShzY2FsZSkge1xyXG4gICAgcmV0dXJuIHNjYWxlLnJhbmdlRXh0ZW50ID8gc2NhbGUucmFuZ2VFeHRlbnQoKSA6IGQzX3NjYWxlRXh0ZW50KHNjYWxlLnJhbmdlKCkpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zY2FsZV9iaWxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSkge1xyXG4gICAgdmFyIHUgPSB1bmludGVycG9sYXRlKGRvbWFpblswXSwgZG9tYWluWzFdKSwgaSA9IGludGVycG9sYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4gaSh1KHgpKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3NjYWxlX25pY2UoZG9tYWluLCBuaWNlKSB7XHJcbiAgICB2YXIgaTAgPSAwLCBpMSA9IGRvbWFpbi5sZW5ndGggLSAxLCB4MCA9IGRvbWFpbltpMF0sIHgxID0gZG9tYWluW2kxXSwgZHg7XHJcbiAgICBpZiAoeDEgPCB4MCkge1xyXG4gICAgICBkeCA9IGkwLCBpMCA9IGkxLCBpMSA9IGR4O1xyXG4gICAgICBkeCA9IHgwLCB4MCA9IHgxLCB4MSA9IGR4O1xyXG4gICAgfVxyXG4gICAgZG9tYWluW2kwXSA9IG5pY2UuZmxvb3IoeDApO1xyXG4gICAgZG9tYWluW2kxXSA9IG5pY2UuY2VpbCh4MSk7XHJcbiAgICByZXR1cm4gZG9tYWluO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zY2FsZV9uaWNlU3RlcChzdGVwKSB7XHJcbiAgICByZXR1cm4gc3RlcCA/IHtcclxuICAgICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih4IC8gc3RlcCkgKiBzdGVwO1xyXG4gICAgICB9LFxyXG4gICAgICBjZWlsOiBmdW5jdGlvbih4KSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh4IC8gc3RlcCkgKiBzdGVwO1xyXG4gICAgICB9XHJcbiAgICB9IDogZDNfc2NhbGVfbmljZUlkZW50aXR5O1xyXG4gIH1cclxuICB2YXIgZDNfc2NhbGVfbmljZUlkZW50aXR5ID0ge1xyXG4gICAgZmxvb3I6IGQzX2lkZW50aXR5LFxyXG4gICAgY2VpbDogZDNfaWRlbnRpdHlcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3NjYWxlX3BvbHlsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpIHtcclxuICAgIHZhciB1ID0gW10sIGkgPSBbXSwgaiA9IDAsIGsgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpIC0gMTtcclxuICAgIGlmIChkb21haW5ba10gPCBkb21haW5bMF0pIHtcclxuICAgICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpO1xyXG4gICAgICByYW5nZSA9IHJhbmdlLnNsaWNlKCkucmV2ZXJzZSgpO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKCsraiA8PSBrKSB7XHJcbiAgICAgIHUucHVzaCh1bmludGVycG9sYXRlKGRvbWFpbltqIC0gMV0sIGRvbWFpbltqXSkpO1xyXG4gICAgICBpLnB1c2goaW50ZXJwb2xhdGUocmFuZ2VbaiAtIDFdLCByYW5nZVtqXSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcclxuICAgICAgdmFyIGogPSBkMy5iaXNlY3QoZG9tYWluLCB4LCAxLCBrKSAtIDE7XHJcbiAgICAgIHJldHVybiBpW2pdKHVbal0oeCkpO1xyXG4gICAgfTtcclxuICB9XHJcbiAgZDMuc2NhbGUubGluZWFyID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKFsgMCwgMSBdLCBbIDAsIDEgXSwgZDNfaW50ZXJwb2xhdGUsIGZhbHNlKTtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApIHtcclxuICAgIHZhciBvdXRwdXQsIGlucHV0O1xyXG4gICAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcclxuICAgICAgdmFyIGxpbmVhciA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgPiAyID8gZDNfc2NhbGVfcG9seWxpbmVhciA6IGQzX3NjYWxlX2JpbGluZWFyLCB1bmludGVycG9sYXRlID0gY2xhbXAgPyBkM191bmludGVycG9sYXRlQ2xhbXAgOiBkM191bmludGVycG9sYXRlTnVtYmVyO1xyXG4gICAgICBvdXRwdXQgPSBsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpO1xyXG4gICAgICBpbnB1dCA9IGxpbmVhcihyYW5nZSwgZG9tYWluLCB1bmludGVycG9sYXRlLCBkM19pbnRlcnBvbGF0ZSk7XHJcbiAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcclxuICAgICAgcmV0dXJuIG91dHB1dCh4KTtcclxuICAgIH1cclxuICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHtcclxuICAgICAgcmV0dXJuIGlucHV0KHkpO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xyXG4gICAgICBkb21haW4gPSB4Lm1hcChOdW1iZXIpO1xyXG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTtcclxuICAgICAgcmFuZ2UgPSB4O1xyXG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIHJldHVybiBzY2FsZS5yYW5nZSh4KS5pbnRlcnBvbGF0ZShkM19pbnRlcnBvbGF0ZVJvdW5kKTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xhbXA7XHJcbiAgICAgIGNsYW1wID0geDtcclxuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGU7XHJcbiAgICAgIGludGVycG9sYXRlID0geDtcclxuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcclxuICAgIH07XHJcbiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0pIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKGRvbWFpbiwgbSk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKG0sIGZvcm1hdCkge1xyXG4gICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKG0pIHtcclxuICAgICAgZDNfc2NhbGVfbGluZWFyTmljZShkb21haW4sIG0pO1xyXG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApO1xyXG4gICAgfTtcclxuICAgIHJldHVybiByZXNjYWxlKCk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKSB7XHJcbiAgICByZXR1cm4gZDMucmViaW5kKHNjYWxlLCBsaW5lYXIsIFwicmFuZ2VcIiwgXCJyYW5nZVJvdW5kXCIsIFwiaW50ZXJwb2xhdGVcIiwgXCJjbGFtcFwiKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyTmljZShkb21haW4sIG0pIHtcclxuICAgIGQzX3NjYWxlX25pY2UoZG9tYWluLCBkM19zY2FsZV9uaWNlU3RlcChkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKVsyXSkpO1xyXG4gICAgZDNfc2NhbGVfbmljZShkb21haW4sIGQzX3NjYWxlX25pY2VTdGVwKGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pWzJdKSk7XHJcbiAgICByZXR1cm4gZG9tYWluO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKSB7XHJcbiAgICBpZiAobSA9PSBudWxsKSBtID0gMTA7XHJcbiAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSwgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwgc3RlcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHNwYW4gLyBtKSAvIE1hdGguTE4xMCkpLCBlcnIgPSBtIC8gc3BhbiAqIHN0ZXA7XHJcbiAgICBpZiAoZXJyIDw9IC4xNSkgc3RlcCAqPSAxMDsgZWxzZSBpZiAoZXJyIDw9IC4zNSkgc3RlcCAqPSA1OyBlbHNlIGlmIChlcnIgPD0gLjc1KSBzdGVwICo9IDI7XHJcbiAgICBleHRlbnRbMF0gPSBNYXRoLmNlaWwoZXh0ZW50WzBdIC8gc3RlcCkgKiBzdGVwO1xyXG4gICAgZXh0ZW50WzFdID0gTWF0aC5mbG9vcihleHRlbnRbMV0gLyBzdGVwKSAqIHN0ZXAgKyBzdGVwICogLjU7XHJcbiAgICBleHRlbnRbMl0gPSBzdGVwO1xyXG4gICAgcmV0dXJuIGV4dGVudDtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKSB7XHJcbiAgICByZXR1cm4gZDMucmFuZ2UuYXBwbHkoZDMsIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCkge1xyXG4gICAgdmFyIHJhbmdlID0gZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSk7XHJcbiAgICBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIHZhciBtYXRjaCA9IGQzX2Zvcm1hdF9yZS5leGVjKGZvcm1hdCk7XHJcbiAgICAgIG1hdGNoLnNoaWZ0KCk7XHJcbiAgICAgIGlmIChtYXRjaFs4XSA9PT0gXCJzXCIpIHtcclxuICAgICAgICB2YXIgcHJlZml4ID0gZDMuZm9ybWF0UHJlZml4KE1hdGgubWF4KGFicyhyYW5nZVswXSksIGFicyhyYW5nZVsxXSkpKTtcclxuICAgICAgICBpZiAoIW1hdGNoWzddKSBtYXRjaFs3XSA9IFwiLlwiICsgZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKHByZWZpeC5zY2FsZShyYW5nZVsyXSkpO1xyXG4gICAgICAgIG1hdGNoWzhdID0gXCJmXCI7XHJcbiAgICAgICAgZm9ybWF0ID0gZDMuZm9ybWF0KG1hdGNoLmpvaW4oXCJcIikpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZm9ybWF0KHByZWZpeC5zY2FsZShkKSkgKyBwcmVmaXguc3ltYm9sO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFtYXRjaFs3XSkgbWF0Y2hbN10gPSBcIi5cIiArIGQzX3NjYWxlX2xpbmVhckZvcm1hdFByZWNpc2lvbihtYXRjaFs4XSwgcmFuZ2UpO1xyXG4gICAgICBmb3JtYXQgPSBtYXRjaC5qb2luKFwiXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9ybWF0ID0gXCIsLlwiICsgZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKHJhbmdlWzJdKSArIFwiZlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGQzLmZvcm1hdChmb3JtYXQpO1xyXG4gIH1cclxuICB2YXIgZDNfc2NhbGVfbGluZWFyRm9ybWF0U2lnbmlmaWNhbnQgPSB7XHJcbiAgICBzOiAxLFxyXG4gICAgZzogMSxcclxuICAgIHA6IDEsXHJcbiAgICByOiAxLFxyXG4gICAgZTogMVxyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gLU1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjEwICsgLjAxKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyRm9ybWF0UHJlY2lzaW9uKHR5cGUsIHJhbmdlKSB7XHJcbiAgICB2YXIgcCA9IGQzX3NjYWxlX2xpbmVhclByZWNpc2lvbihyYW5nZVsyXSk7XHJcbiAgICByZXR1cm4gdHlwZSBpbiBkM19zY2FsZV9saW5lYXJGb3JtYXRTaWduaWZpY2FudCA/IE1hdGguYWJzKHAgLSBkM19zY2FsZV9saW5lYXJQcmVjaXNpb24oTWF0aC5tYXgoYWJzKHJhbmdlWzBdKSwgYWJzKHJhbmdlWzFdKSkpKSArICsodHlwZSAhPT0gXCJlXCIpIDogcCAtICh0eXBlID09PSBcIiVcIikgKiAyO1xyXG4gIH1cclxuICBkMy5zY2FsZS5sb2cgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19zY2FsZV9sb2coZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKFsgMCwgMSBdKSwgMTAsIHRydWUsIFsgMSwgMTAgXSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zY2FsZV9sb2cobGluZWFyLCBiYXNlLCBwb3NpdGl2ZSwgZG9tYWluKSB7XHJcbiAgICBmdW5jdGlvbiBsb2coeCkge1xyXG4gICAgICByZXR1cm4gKHBvc2l0aXZlID8gTWF0aC5sb2coeCA8IDAgPyAwIDogeCkgOiAtTWF0aC5sb2coeCA+IDAgPyAwIDogLXgpKSAvIE1hdGgubG9nKGJhc2UpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcG93KHgpIHtcclxuICAgICAgcmV0dXJuIHBvc2l0aXZlID8gTWF0aC5wb3coYmFzZSwgeCkgOiAtTWF0aC5wb3coYmFzZSwgLXgpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xyXG4gICAgICByZXR1cm4gbGluZWFyKGxvZyh4KSk7XHJcbiAgICB9XHJcbiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIHJldHVybiBwb3cobGluZWFyLmludmVydCh4KSk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47XHJcbiAgICAgIHBvc2l0aXZlID0geFswXSA+PSAwO1xyXG4gICAgICBsaW5lYXIuZG9tYWluKChkb21haW4gPSB4Lm1hcChOdW1iZXIpKS5tYXAobG9nKSk7XHJcbiAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBiYXNlO1xyXG4gICAgICBiYXNlID0gK187XHJcbiAgICAgIGxpbmVhci5kb21haW4oZG9tYWluLm1hcChsb2cpKTtcclxuICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIG5pY2VkID0gZDNfc2NhbGVfbmljZShkb21haW4ubWFwKGxvZyksIHBvc2l0aXZlID8gTWF0aCA6IGQzX3NjYWxlX2xvZ05pY2VOZWdhdGl2ZSk7XHJcbiAgICAgIGxpbmVhci5kb21haW4obmljZWQpO1xyXG4gICAgICBkb21haW4gPSBuaWNlZC5tYXAocG93KTtcclxuICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBleHRlbnQgPSBkM19zY2FsZUV4dGVudChkb21haW4pLCB0aWNrcyA9IFtdLCB1ID0gZXh0ZW50WzBdLCB2ID0gZXh0ZW50WzFdLCBpID0gTWF0aC5mbG9vcihsb2codSkpLCBqID0gTWF0aC5jZWlsKGxvZyh2KSksIG4gPSBiYXNlICUgMSA/IDIgOiBiYXNlO1xyXG4gICAgICBpZiAoaXNGaW5pdGUoaiAtIGkpKSB7XHJcbiAgICAgICAgaWYgKHBvc2l0aXZlKSB7XHJcbiAgICAgICAgICBmb3IgKDtpIDwgajsgaSsrKSBmb3IgKHZhciBrID0gMTsgayA8IG47IGsrKykgdGlja3MucHVzaChwb3coaSkgKiBrKTtcclxuICAgICAgICAgIHRpY2tzLnB1c2gocG93KGkpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGlja3MucHVzaChwb3coaSkpO1xyXG4gICAgICAgICAgZm9yICg7aSsrIDwgajsgKSBmb3IgKHZhciBrID0gbiAtIDE7IGsgPiAwOyBrLS0pIHRpY2tzLnB1c2gocG93KGkpICogayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoaSA9IDA7IHRpY2tzW2ldIDwgdTsgaSsrKSB7fVxyXG4gICAgICAgIGZvciAoaiA9IHRpY2tzLmxlbmd0aDsgdGlja3NbaiAtIDFdID4gdjsgai0tKSB7fVxyXG4gICAgICAgIHRpY2tzID0gdGlja3Muc2xpY2UoaSwgaik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRpY2tzO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihuLCBmb3JtYXQpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZDNfc2NhbGVfbG9nRm9ybWF0O1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGZvcm1hdCA9IGQzX3NjYWxlX2xvZ0Zvcm1hdDsgZWxzZSBpZiAodHlwZW9mIGZvcm1hdCAhPT0gXCJmdW5jdGlvblwiKSBmb3JtYXQgPSBkMy5mb3JtYXQoZm9ybWF0KTtcclxuICAgICAgdmFyIGsgPSBNYXRoLm1heCgxLCBiYXNlICogbiAvIHNjYWxlLnRpY2tzKCkubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHtcclxuICAgICAgICB2YXIgaSA9IGQgLyBwb3coTWF0aC5yb3VuZChsb2coZCkpKTtcclxuICAgICAgICBpZiAoaSAqIGJhc2UgPCBiYXNlIC0gLjUpIGkgKj0gYmFzZTtcclxuICAgICAgICByZXR1cm4gaSA8PSBrID8gZm9ybWF0KGQpIDogXCJcIjtcclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBkM19zY2FsZV9sb2cobGluZWFyLmNvcHkoKSwgYmFzZSwgcG9zaXRpdmUsIGRvbWFpbik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTtcclxuICB9XHJcbiAgdmFyIGQzX3NjYWxlX2xvZ0Zvcm1hdCA9IGQzLmZvcm1hdChcIi4wZVwiKSwgZDNfc2NhbGVfbG9nTmljZU5lZ2F0aXZlID0ge1xyXG4gICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgcmV0dXJuIC1NYXRoLmNlaWwoLXgpO1xyXG4gICAgfSxcclxuICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgcmV0dXJuIC1NYXRoLmZsb29yKC14KTtcclxuICAgIH1cclxuICB9O1xyXG4gIGQzLnNjYWxlLnBvdyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX3NjYWxlX3BvdyhkMy5zY2FsZS5saW5lYXIoKSwgMSwgWyAwLCAxIF0pO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfcG93KGxpbmVhciwgZXhwb25lbnQsIGRvbWFpbikge1xyXG4gICAgdmFyIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQpLCBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7XHJcbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XHJcbiAgICAgIHJldHVybiBsaW5lYXIocG93cCh4KSk7XHJcbiAgICB9XHJcbiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIHJldHVybiBwb3diKGxpbmVhci5pbnZlcnQoeCkpO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xyXG4gICAgICBsaW5lYXIuZG9tYWluKChkb21haW4gPSB4Lm1hcChOdW1iZXIpKS5tYXAocG93cCkpO1xyXG4gICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihtKSB7XHJcbiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtLCBmb3JtYXQpIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihtKSB7XHJcbiAgICAgIHJldHVybiBzY2FsZS5kb21haW4oZDNfc2NhbGVfbGluZWFyTmljZShkb21haW4sIG0pKTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5leHBvbmVudCA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZXhwb25lbnQ7XHJcbiAgICAgIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQgPSB4KTtcclxuICAgICAgcG93YiA9IGQzX3NjYWxlX3Bvd1BvdygxIC8gZXhwb25lbnQpO1xyXG4gICAgICBsaW5lYXIuZG9tYWluKGRvbWFpbi5tYXAocG93cCkpO1xyXG4gICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gZDNfc2NhbGVfcG93KGxpbmVhci5jb3B5KCksIGV4cG9uZW50LCBkb21haW4pO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJSZWJpbmQoc2NhbGUsIGxpbmVhcik7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3NjYWxlX3Bvd1BvdyhlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4geCA8IDAgPyAtTWF0aC5wb3coLXgsIGUpIDogTWF0aC5wb3coeCwgZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuICBkMy5zY2FsZS5zcXJ0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDMuc2NhbGUucG93KCkuZXhwb25lbnQoLjUpO1xyXG4gIH07XHJcbiAgZDMuc2NhbGUub3JkaW5hbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX3NjYWxlX29yZGluYWwoW10sIHtcclxuICAgICAgdDogXCJyYW5nZVwiLFxyXG4gICAgICBhOiBbIFtdIF1cclxuICAgIH0pO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfb3JkaW5hbChkb21haW4sIHJhbmdlcikge1xyXG4gICAgdmFyIGluZGV4LCByYW5nZSwgcmFuZ2VCYW5kO1xyXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xyXG4gICAgICByZXR1cm4gcmFuZ2VbKChpbmRleC5nZXQoeCkgfHwgKHJhbmdlci50ID09PSBcInJhbmdlXCIgPyBpbmRleC5zZXQoeCwgZG9tYWluLnB1c2goeCkpIDogTmFOKSkgLSAxKSAlIHJhbmdlLmxlbmd0aF07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzdGVwcyhzdGFydCwgc3RlcCkge1xyXG4gICAgICByZXR1cm4gZDMucmFuZ2UoZG9tYWluLmxlbmd0aCkubWFwKGZ1bmN0aW9uKGkpIHtcclxuICAgICAgICByZXR1cm4gc3RhcnQgKyBzdGVwICogaTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjtcclxuICAgICAgZG9tYWluID0gW107XHJcbiAgICAgIGluZGV4ID0gbmV3IGQzX01hcCgpO1xyXG4gICAgICB2YXIgaSA9IC0xLCBuID0geC5sZW5ndGgsIHhpO1xyXG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoeGkgPSB4W2ldKSkgaW5kZXguc2V0KHhpLCBkb21haW4ucHVzaCh4aSkpO1xyXG4gICAgICByZXR1cm4gc2NhbGVbcmFuZ2VyLnRdLmFwcGx5KHNjYWxlLCByYW5nZXIuYSk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlO1xyXG4gICAgICByYW5nZSA9IHg7XHJcbiAgICAgIHJhbmdlQmFuZCA9IDA7XHJcbiAgICAgIHJhbmdlciA9IHtcclxuICAgICAgICB0OiBcInJhbmdlXCIsXHJcbiAgICAgICAgYTogYXJndW1lbnRzXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5yYW5nZVBvaW50cyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcpIHtcclxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwYWRkaW5nID0gMDtcclxuICAgICAgdmFyIHN0YXJ0ID0geFswXSwgc3RvcCA9IHhbMV0sIHN0ZXAgPSBkb21haW4ubGVuZ3RoIDwgMiA/IChzdGFydCA9IChzdGFydCArIHN0b3ApIC8gMiwgXHJcbiAgICAgIDApIDogKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCAtIDEgKyBwYWRkaW5nKTtcclxuICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIHN0ZXAgKiBwYWRkaW5nIC8gMiwgc3RlcCk7XHJcbiAgICAgIHJhbmdlQmFuZCA9IDA7XHJcbiAgICAgIHJhbmdlciA9IHtcclxuICAgICAgICB0OiBcInJhbmdlUG9pbnRzXCIsXHJcbiAgICAgICAgYTogYXJndW1lbnRzXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5yYW5nZVJvdW5kUG9pbnRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykge1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwO1xyXG4gICAgICB2YXIgc3RhcnQgPSB4WzBdLCBzdG9wID0geFsxXSwgc3RlcCA9IGRvbWFpbi5sZW5ndGggPCAyID8gKHN0YXJ0ID0gc3RvcCA9IE1hdGgucm91bmQoKHN0YXJ0ICsgc3RvcCkgLyAyKSwgXHJcbiAgICAgIDApIDogKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCAtIDEgKyBwYWRkaW5nKSB8IDA7XHJcbiAgICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBNYXRoLnJvdW5kKHN0ZXAgKiBwYWRkaW5nIC8gMiArIChzdG9wIC0gc3RhcnQgLSAoZG9tYWluLmxlbmd0aCAtIDEgKyBwYWRkaW5nKSAqIHN0ZXApIC8gMiksIHN0ZXApO1xyXG4gICAgICByYW5nZUJhbmQgPSAwO1xyXG4gICAgICByYW5nZXIgPSB7XHJcbiAgICAgICAgdDogXCJyYW5nZVJvdW5kUG9pbnRzXCIsXHJcbiAgICAgICAgYTogYXJndW1lbnRzXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5yYW5nZUJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZywgb3V0ZXJQYWRkaW5nKSB7XHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7XHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgb3V0ZXJQYWRkaW5nID0gcGFkZGluZztcclxuICAgICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwgc3RvcCA9IHhbMSAtIHJldmVyc2VdLCBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCAtIHBhZGRpbmcgKyAyICogb3V0ZXJQYWRkaW5nKTtcclxuICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIHN0ZXAgKiBvdXRlclBhZGRpbmcsIHN0ZXApO1xyXG4gICAgICBpZiAocmV2ZXJzZSkgcmFuZ2UucmV2ZXJzZSgpO1xyXG4gICAgICByYW5nZUJhbmQgPSBzdGVwICogKDEgLSBwYWRkaW5nKTtcclxuICAgICAgcmFuZ2VyID0ge1xyXG4gICAgICAgIHQ6IFwicmFuZ2VCYW5kc1wiLFxyXG4gICAgICAgIGE6IGFyZ3VtZW50c1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUucmFuZ2VSb3VuZEJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZywgb3V0ZXJQYWRkaW5nKSB7XHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7XHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgb3V0ZXJQYWRkaW5nID0gcGFkZGluZztcclxuICAgICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwgc3RvcCA9IHhbMSAtIHJldmVyc2VdLCBzdGVwID0gTWF0aC5mbG9vcigoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZyArIDIgKiBvdXRlclBhZGRpbmcpKTtcclxuICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIE1hdGgucm91bmQoKHN0b3AgLSBzdGFydCAtIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZykgKiBzdGVwKSAvIDIpLCBzdGVwKTtcclxuICAgICAgaWYgKHJldmVyc2UpIHJhbmdlLnJldmVyc2UoKTtcclxuICAgICAgcmFuZ2VCYW5kID0gTWF0aC5yb3VuZChzdGVwICogKDEgLSBwYWRkaW5nKSk7XHJcbiAgICAgIHJhbmdlciA9IHtcclxuICAgICAgICB0OiBcInJhbmdlUm91bmRCYW5kc1wiLFxyXG4gICAgICAgIGE6IGFyZ3VtZW50c1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUucmFuZ2VCYW5kID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiByYW5nZUJhbmQ7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUucmFuZ2VFeHRlbnQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlRXh0ZW50KHJhbmdlci5hWzBdKTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKGRvbWFpbiwgcmFuZ2VyKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2NhbGUuZG9tYWluKGRvbWFpbik7XHJcbiAgfVxyXG4gIGQzLnNjYWxlLmNhdGVnb3J5MTAgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkxMCk7XHJcbiAgfTtcclxuICBkMy5zY2FsZS5jYXRlZ29yeTIwID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjApO1xyXG4gIH07XHJcbiAgZDMuc2NhbGUuY2F0ZWdvcnkyMGIgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGIpO1xyXG4gIH07XHJcbiAgZDMuc2NhbGUuY2F0ZWdvcnkyMGMgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGMpO1xyXG4gIH07XHJcbiAgdmFyIGQzX2NhdGVnb3J5MTAgPSBbIDIwNjIyNjAsIDE2NzQ0MjA2LCAyOTI0NTg4LCAxNDAzNDcyOCwgOTcyNTg4NSwgOTE5NzEzMSwgMTQ5MDczMzAsIDgzNTU3MTEsIDEyMzY5MTg2LCAxNTU2MTc1IF0ubWFwKGQzX3JnYlN0cmluZyk7XHJcbiAgdmFyIGQzX2NhdGVnb3J5MjAgPSBbIDIwNjIyNjAsIDExNDU0NDQwLCAxNjc0NDIwNiwgMTY3NTk2NzIsIDI5MjQ1ODgsIDEwMDE4Njk4LCAxNDAzNDcyOCwgMTY3NTA3NDIsIDk3MjU4ODUsIDEyOTU1ODYxLCA5MTk3MTMxLCAxMjg4NTE0MCwgMTQ5MDczMzAsIDE2MjM0MTk0LCA4MzU1NzExLCAxMzA5MjgwNywgMTIzNjkxODYsIDE0NDA4NTg5LCAxNTU2MTc1LCAxMDQxMDcyNSBdLm1hcChkM19yZ2JTdHJpbmcpO1xyXG4gIHZhciBkM19jYXRlZ29yeTIwYiA9IFsgMzc1MDc3NywgNTM5NTYxOSwgNzA0MDcxOSwgMTAyNjQyODYsIDY1MTkwOTcsIDkyMTY1OTQsIDExOTE1MTE1LCAxMzU1NjYzNiwgOTIwMjk5MywgMTI0MjY4MDksIDE1MTg2NTE0LCAxNTE5MDkzMiwgODY2NjE2OSwgMTEzNTY0OTAsIDE0MDQ5NjQzLCAxNTE3NzM3MiwgODA3NzY4MywgMTA4MzQzMjQsIDEzNTI4NTA5LCAxNDU4OTY1NCBdLm1hcChkM19yZ2JTdHJpbmcpO1xyXG4gIHZhciBkM19jYXRlZ29yeTIwYyA9IFsgMzI0NDczMywgNzA1NzExMCwgMTA0MDY2MjUsIDEzMDMyNDMxLCAxNTA5NTA1MywgMTY2MTY3NjQsIDE2NjI1MjU5LCAxNjYzNDAxOCwgMzI1MzA3NiwgNzY1MjQ3MCwgMTA2MDcwMDMsIDEzMTAxNTA0LCA3Njk1MjgxLCAxMDM5NDMxMiwgMTIzNjkzNzIsIDE0MzQyODkxLCA2NTEzNTA3LCA5ODY4OTUwLCAxMjQzNDg3NywgMTQyNzcwODEgXS5tYXAoZDNfcmdiU3RyaW5nKTtcclxuICBkMy5zY2FsZS5xdWFudGlsZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aWxlKFtdLCBbXSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zY2FsZV9xdWFudGlsZShkb21haW4sIHJhbmdlKSB7XHJcbiAgICB2YXIgdGhyZXNob2xkcztcclxuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XHJcbiAgICAgIHZhciBrID0gMCwgcSA9IHJhbmdlLmxlbmd0aDtcclxuICAgICAgdGhyZXNob2xkcyA9IFtdO1xyXG4gICAgICB3aGlsZSAoKytrIDwgcSkgdGhyZXNob2xkc1trIC0gMV0gPSBkMy5xdWFudGlsZShkb21haW4sIGsgLyBxKTtcclxuICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xyXG4gICAgICBpZiAoIWlzTmFOKHggPSAreCkpIHJldHVybiByYW5nZVtkMy5iaXNlY3QodGhyZXNob2xkcywgeCldO1xyXG4gICAgfVxyXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47XHJcbiAgICAgIGRvbWFpbiA9IHgubWFwKGQzX251bWJlcikuZmlsdGVyKGQzX251bWVyaWMpLnNvcnQoZDNfYXNjZW5kaW5nKTtcclxuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7XHJcbiAgICAgIHJhbmdlID0geDtcclxuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRocmVzaG9sZHM7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkge1xyXG4gICAgICB5ID0gcmFuZ2UuaW5kZXhPZih5KTtcclxuICAgICAgcmV0dXJuIHkgPCAwID8gWyBOYU4sIE5hTiBdIDogWyB5ID4gMCA/IHRocmVzaG9sZHNbeSAtIDFdIDogZG9tYWluWzBdLCB5IDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW3ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSBdO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aWxlKGRvbWFpbiwgcmFuZ2UpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiByZXNjYWxlKCk7XHJcbiAgfVxyXG4gIGQzLnNjYWxlLnF1YW50aXplID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpemUoMCwgMSwgWyAwLCAxIF0pO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSkge1xyXG4gICAgdmFyIGt4LCBpO1xyXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xyXG4gICAgICByZXR1cm4gcmFuZ2VbTWF0aC5tYXgoMCwgTWF0aC5taW4oaSwgTWF0aC5mbG9vcihreCAqICh4IC0geDApKSkpXTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XHJcbiAgICAgIGt4ID0gcmFuZ2UubGVuZ3RoIC8gKHgxIC0geDApO1xyXG4gICAgICBpID0gcmFuZ2UubGVuZ3RoIC0gMTtcclxuICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgfVxyXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIHgwLCB4MSBdO1xyXG4gICAgICB4MCA9ICt4WzBdO1xyXG4gICAgICB4MSA9ICt4W3gubGVuZ3RoIC0gMV07XHJcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlO1xyXG4gICAgICByYW5nZSA9IHg7XHJcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkge1xyXG4gICAgICB5ID0gcmFuZ2UuaW5kZXhPZih5KTtcclxuICAgICAgeSA9IHkgPCAwID8gTmFOIDogeSAvIGt4ICsgeDA7XHJcbiAgICAgIHJldHVybiBbIHksIHkgKyAxIC8ga3ggXTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSh4MCwgeDEsIHJhbmdlKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xyXG4gIH1cclxuICBkMy5zY2FsZS50aHJlc2hvbGQgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19zY2FsZV90aHJlc2hvbGQoWyAuNSBdLCBbIDAsIDEgXSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zY2FsZV90aHJlc2hvbGQoZG9tYWluLCByYW5nZSkge1xyXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xyXG4gICAgICBpZiAoeCA8PSB4KSByZXR1cm4gcmFuZ2VbZDMuYmlzZWN0KGRvbWFpbiwgeCldO1xyXG4gICAgfVxyXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47XHJcbiAgICAgIGRvbWFpbiA9IF87XHJcbiAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH07XHJcbiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7XHJcbiAgICAgIHJhbmdlID0gXztcclxuICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcclxuICAgICAgeSA9IHJhbmdlLmluZGV4T2YoeSk7XHJcbiAgICAgIHJldHVybiBbIGRvbWFpblt5IC0gMV0sIGRvbWFpblt5XSBdO1xyXG4gICAgfTtcclxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlX3RocmVzaG9sZChkb21haW4sIHJhbmdlKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gc2NhbGU7XHJcbiAgfVxyXG4gIGQzLnNjYWxlLmlkZW50aXR5ID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfc2NhbGVfaWRlbnRpdHkoWyAwLCAxIF0pO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKSB7XHJcbiAgICBmdW5jdGlvbiBpZGVudGl0eSh4KSB7XHJcbiAgICAgIHJldHVybiAreDtcclxuICAgIH1cclxuICAgIGlkZW50aXR5LmludmVydCA9IGlkZW50aXR5O1xyXG4gICAgaWRlbnRpdHkuZG9tYWluID0gaWRlbnRpdHkucmFuZ2UgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjtcclxuICAgICAgZG9tYWluID0geC5tYXAoaWRlbnRpdHkpO1xyXG4gICAgICByZXR1cm4gaWRlbnRpdHk7XHJcbiAgICB9O1xyXG4gICAgaWRlbnRpdHkudGlja3MgPSBmdW5jdGlvbihtKSB7XHJcbiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pO1xyXG4gICAgfTtcclxuICAgIGlkZW50aXR5LnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtLCBmb3JtYXQpIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpO1xyXG4gICAgfTtcclxuICAgIGlkZW50aXR5LmNvcHkgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3NjYWxlX2lkZW50aXR5KGRvbWFpbik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGlkZW50aXR5O1xyXG4gIH1cclxuICBkMy5zdmcgPSB7fTtcclxuICBmdW5jdGlvbiBkM196ZXJvKCkge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG4gIGQzLnN2Zy5hcmMgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBpbm5lclJhZGl1cyA9IGQzX3N2Z19hcmNJbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMgPSBkM19zdmdfYXJjT3V0ZXJSYWRpdXMsIGNvcm5lclJhZGl1cyA9IGQzX3plcm8sIHBhZFJhZGl1cyA9IGQzX3N2Z19hcmNBdXRvLCBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlLCBwYWRBbmdsZSA9IGQzX3N2Z19hcmNQYWRBbmdsZTtcclxuICAgIGZ1bmN0aW9uIGFyYygpIHtcclxuICAgICAgdmFyIHIwID0gTWF0aC5tYXgoMCwgK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLCByMSA9IE1hdGgubWF4KDAsICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSwgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmz4AsIGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGbPgCwgZGEgPSBNYXRoLmFicyhhMSAtIGEwKSwgY3cgPSBhMCA+IGExID8gMCA6IDE7XHJcbiAgICAgIGlmIChyMSA8IHIwKSByYyA9IHIxLCByMSA9IHIwLCByMCA9IHJjO1xyXG4gICAgICBpZiAoZGEgPj0gz4TOtSkgcmV0dXJuIGNpcmNsZVNlZ21lbnQocjEsIGN3KSArIChyMCA/IGNpcmNsZVNlZ21lbnQocjAsIDEgLSBjdykgOiBcIlwiKSArIFwiWlwiO1xyXG4gICAgICB2YXIgcmMsIGNyLCBycCwgYXAsIHAwID0gMCwgcDEgPSAwLCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHBhdGggPSBbXTtcclxuICAgICAgaWYgKGFwID0gKCtwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDApIC8gMikge1xyXG4gICAgICAgIHJwID0gcGFkUmFkaXVzID09PSBkM19zdmdfYXJjQXV0byA/IE1hdGguc3FydChyMCAqIHIwICsgcjEgKiByMSkgOiArcGFkUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgaWYgKCFjdykgcDEgKj0gLTE7XHJcbiAgICAgICAgaWYgKHIxKSBwMSA9IGQzX2FzaW4ocnAgLyByMSAqIE1hdGguc2luKGFwKSk7XHJcbiAgICAgICAgaWYgKHIwKSBwMCA9IGQzX2FzaW4ocnAgLyByMCAqIE1hdGguc2luKGFwKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHIxKSB7XHJcbiAgICAgICAgeDAgPSByMSAqIE1hdGguY29zKGEwICsgcDEpO1xyXG4gICAgICAgIHkwID0gcjEgKiBNYXRoLnNpbihhMCArIHAxKTtcclxuICAgICAgICB4MSA9IHIxICogTWF0aC5jb3MoYTEgLSBwMSk7XHJcbiAgICAgICAgeTEgPSByMSAqIE1hdGguc2luKGExIC0gcDEpO1xyXG4gICAgICAgIHZhciBsMSA9IE1hdGguYWJzKGExIC0gYTAgLSAyICogcDEpIDw9IM+AID8gMCA6IDE7XHJcbiAgICAgICAgaWYgKHAxICYmIGQzX3N2Z19hcmNTd2VlcCh4MCwgeTAsIHgxLCB5MSkgPT09IGN3IF4gbDEpIHtcclxuICAgICAgICAgIHZhciBoMSA9IChhMCArIGExKSAvIDI7XHJcbiAgICAgICAgICB4MCA9IHIxICogTWF0aC5jb3MoaDEpO1xyXG4gICAgICAgICAgeTAgPSByMSAqIE1hdGguc2luKGgxKTtcclxuICAgICAgICAgIHgxID0geTEgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB4MCA9IHkwID0gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAocjApIHtcclxuICAgICAgICB4MiA9IHIwICogTWF0aC5jb3MoYTEgLSBwMCk7XHJcbiAgICAgICAgeTIgPSByMCAqIE1hdGguc2luKGExIC0gcDApO1xyXG4gICAgICAgIHgzID0gcjAgKiBNYXRoLmNvcyhhMCArIHAwKTtcclxuICAgICAgICB5MyA9IHIwICogTWF0aC5zaW4oYTAgKyBwMCk7XHJcbiAgICAgICAgdmFyIGwwID0gTWF0aC5hYnMoYTAgLSBhMSArIDIgKiBwMCkgPD0gz4AgPyAwIDogMTtcclxuICAgICAgICBpZiAocDAgJiYgZDNfc3ZnX2FyY1N3ZWVwKHgyLCB5MiwgeDMsIHkzKSA9PT0gMSAtIGN3IF4gbDApIHtcclxuICAgICAgICAgIHZhciBoMCA9IChhMCArIGExKSAvIDI7XHJcbiAgICAgICAgICB4MiA9IHIwICogTWF0aC5jb3MoaDApO1xyXG4gICAgICAgICAgeTIgPSByMCAqIE1hdGguc2luKGgwKTtcclxuICAgICAgICAgIHgzID0geTMgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB4MiA9IHkyID0gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGEgPiDOtSAmJiAocmMgPSBNYXRoLm1pbihNYXRoLmFicyhyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpID4gLjAwMSkge1xyXG4gICAgICAgIGNyID0gcjAgPCByMSBeIGN3ID8gMCA6IDE7XHJcbiAgICAgICAgdmFyIHJjMSA9IHJjLCByYzAgPSByYztcclxuICAgICAgICBpZiAoZGEgPCDPgCkge1xyXG4gICAgICAgICAgdmFyIG9jID0geDMgPT0gbnVsbCA/IFsgeDIsIHkyIF0gOiB4MSA9PSBudWxsID8gWyB4MCwgeTAgXSA6IGQzX2dlb21fcG9seWdvbkludGVyc2VjdChbIHgwLCB5MCBdLCBbIHgzLCB5MyBdLCBbIHgxLCB5MSBdLCBbIHgyLCB5MiBdKSwgYXggPSB4MCAtIG9jWzBdLCBheSA9IHkwIC0gb2NbMV0sIGJ4ID0geDEgLSBvY1swXSwgYnkgPSB5MSAtIG9jWzFdLCBrYyA9IDEgLyBNYXRoLnNpbihNYXRoLmFjb3MoKGF4ICogYnggKyBheSAqIGJ5KSAvIChNYXRoLnNxcnQoYXggKiBheCArIGF5ICogYXkpICogTWF0aC5zcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksIGxjID0gTWF0aC5zcXJ0KG9jWzBdICogb2NbMF0gKyBvY1sxXSAqIG9jWzFdKTtcclxuICAgICAgICAgIHJjMCA9IE1hdGgubWluKHJjLCAocjAgLSBsYykgLyAoa2MgLSAxKSk7XHJcbiAgICAgICAgICByYzEgPSBNYXRoLm1pbihyYywgKHIxIC0gbGMpIC8gKGtjICsgMSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoeDEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdmFyIHQzMCA9IGQzX3N2Z19hcmNDb3JuZXJUYW5nZW50cyh4MyA9PSBudWxsID8gWyB4MiwgeTIgXSA6IFsgeDMsIHkzIF0sIFsgeDAsIHkwIF0sIHIxLCByYzEsIGN3KSwgdDEyID0gZDNfc3ZnX2FyY0Nvcm5lclRhbmdlbnRzKFsgeDEsIHkxIF0sIFsgeDIsIHkyIF0sIHIxLCByYzEsIGN3KTtcclxuICAgICAgICAgIGlmIChyYyA9PT0gcmMxKSB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChcIk1cIiwgdDMwWzBdLCBcIkFcIiwgcmMxLCBcIixcIiwgcmMxLCBcIiAwIDAsXCIsIGNyLCBcIiBcIiwgdDMwWzFdLCBcIkFcIiwgcjEsIFwiLFwiLCByMSwgXCIgMCBcIiwgMSAtIGN3IF4gZDNfc3ZnX2FyY1N3ZWVwKHQzMFsxXVswXSwgdDMwWzFdWzFdLCB0MTJbMV1bMF0sIHQxMlsxXVsxXSksIFwiLFwiLCBjdywgXCIgXCIsIHQxMlsxXSwgXCJBXCIsIHJjMSwgXCIsXCIsIHJjMSwgXCIgMCAwLFwiLCBjciwgXCIgXCIsIHQxMlswXSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXRoLnB1c2goXCJNXCIsIHQzMFswXSwgXCJBXCIsIHJjMSwgXCIsXCIsIHJjMSwgXCIgMCAxLFwiLCBjciwgXCIgXCIsIHQxMlswXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBhdGgucHVzaChcIk1cIiwgeDAsIFwiLFwiLCB5MCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh4MyAhPSBudWxsKSB7XHJcbiAgICAgICAgICB2YXIgdDAzID0gZDNfc3ZnX2FyY0Nvcm5lclRhbmdlbnRzKFsgeDAsIHkwIF0sIFsgeDMsIHkzIF0sIHIwLCAtcmMwLCBjdyksIHQyMSA9IGQzX3N2Z19hcmNDb3JuZXJUYW5nZW50cyhbIHgyLCB5MiBdLCB4MSA9PSBudWxsID8gWyB4MCwgeTAgXSA6IFsgeDEsIHkxIF0sIHIwLCAtcmMwLCBjdyk7XHJcbiAgICAgICAgICBpZiAocmMgPT09IHJjMCkge1xyXG4gICAgICAgICAgICBwYXRoLnB1c2goXCJMXCIsIHQyMVswXSwgXCJBXCIsIHJjMCwgXCIsXCIsIHJjMCwgXCIgMCAwLFwiLCBjciwgXCIgXCIsIHQyMVsxXSwgXCJBXCIsIHIwLCBcIixcIiwgcjAsIFwiIDAgXCIsIGN3IF4gZDNfc3ZnX2FyY1N3ZWVwKHQyMVsxXVswXSwgdDIxWzFdWzFdLCB0MDNbMV1bMF0sIHQwM1sxXVsxXSksIFwiLFwiLCAxIC0gY3csIFwiIFwiLCB0MDNbMV0sIFwiQVwiLCByYzAsIFwiLFwiLCByYzAsIFwiIDAgMCxcIiwgY3IsIFwiIFwiLCB0MDNbMF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF0aC5wdXNoKFwiTFwiLCB0MjFbMF0sIFwiQVwiLCByYzAsIFwiLFwiLCByYzAsIFwiIDAgMCxcIiwgY3IsIFwiIFwiLCB0MDNbMF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXRoLnB1c2goXCJMXCIsIHgyLCBcIixcIiwgeTIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXRoLnB1c2goXCJNXCIsIHgwLCBcIixcIiwgeTApO1xyXG4gICAgICAgIGlmICh4MSAhPSBudWxsKSBwYXRoLnB1c2goXCJBXCIsIHIxLCBcIixcIiwgcjEsIFwiIDAgXCIsIGwxLCBcIixcIiwgY3csIFwiIFwiLCB4MSwgXCIsXCIsIHkxKTtcclxuICAgICAgICBwYXRoLnB1c2goXCJMXCIsIHgyLCBcIixcIiwgeTIpO1xyXG4gICAgICAgIGlmICh4MyAhPSBudWxsKSBwYXRoLnB1c2goXCJBXCIsIHIwLCBcIixcIiwgcjAsIFwiIDAgXCIsIGwwLCBcIixcIiwgMSAtIGN3LCBcIiBcIiwgeDMsIFwiLFwiLCB5Myk7XHJcbiAgICAgIH1cclxuICAgICAgcGF0aC5wdXNoKFwiWlwiKTtcclxuICAgICAgcmV0dXJuIHBhdGguam9pbihcIlwiKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGNpcmNsZVNlZ21lbnQocjEsIGN3KSB7XHJcbiAgICAgIHJldHVybiBcIk0wLFwiICsgcjEgKyBcIkFcIiArIHIxICsgXCIsXCIgKyByMSArIFwiIDAgMSxcIiArIGN3ICsgXCIgMCxcIiArIC1yMSArIFwiQVwiICsgcjEgKyBcIixcIiArIHIxICsgXCIgMCAxLFwiICsgY3cgKyBcIiAwLFwiICsgcjE7XHJcbiAgICB9XHJcbiAgICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGlubmVyUmFkaXVzO1xyXG4gICAgICBpbm5lclJhZGl1cyA9IGQzX2Z1bmN0b3Iodik7XHJcbiAgICAgIHJldHVybiBhcmM7XHJcbiAgICB9O1xyXG4gICAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24odikge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvdXRlclJhZGl1cztcclxuICAgICAgb3V0ZXJSYWRpdXMgPSBkM19mdW5jdG9yKHYpO1xyXG4gICAgICByZXR1cm4gYXJjO1xyXG4gICAgfTtcclxuICAgIGFyYy5jb3JuZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNvcm5lclJhZGl1cztcclxuICAgICAgY29ybmVyUmFkaXVzID0gZDNfZnVuY3Rvcih2KTtcclxuICAgICAgcmV0dXJuIGFyYztcclxuICAgIH07XHJcbiAgICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24odikge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRSYWRpdXM7XHJcbiAgICAgIHBhZFJhZGl1cyA9IHYgPT0gZDNfc3ZnX2FyY0F1dG8gPyBkM19zdmdfYXJjQXV0byA6IGQzX2Z1bmN0b3Iodik7XHJcbiAgICAgIHJldHVybiBhcmM7XHJcbiAgICB9O1xyXG4gICAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7XHJcbiAgICAgIHN0YXJ0QW5nbGUgPSBkM19mdW5jdG9yKHYpO1xyXG4gICAgICByZXR1cm4gYXJjO1xyXG4gICAgfTtcclxuICAgIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKHYpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7XHJcbiAgICAgIGVuZEFuZ2xlID0gZDNfZnVuY3Rvcih2KTtcclxuICAgICAgcmV0dXJuIGFyYztcclxuICAgIH07XHJcbiAgICBhcmMucGFkQW5nbGUgPSBmdW5jdGlvbih2KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhZEFuZ2xlO1xyXG4gICAgICBwYWRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7XHJcbiAgICAgIHJldHVybiBhcmM7XHJcbiAgICB9O1xyXG4gICAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciByID0gKCtpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiwgYSA9ICgrc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK2VuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiAtIGhhbGbPgDtcclxuICAgICAgcmV0dXJuIFsgTWF0aC5jb3MoYSkgKiByLCBNYXRoLnNpbihhKSAqIHIgXTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gYXJjO1xyXG4gIH07XHJcbiAgdmFyIGQzX3N2Z19hcmNBdXRvID0gXCJhdXRvXCI7XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2FyY0lubmVyUmFkaXVzKGQpIHtcclxuICAgIHJldHVybiBkLmlubmVyUmFkaXVzO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfYXJjT3V0ZXJSYWRpdXMoZCkge1xyXG4gICAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNTdGFydEFuZ2xlKGQpIHtcclxuICAgIHJldHVybiBkLnN0YXJ0QW5nbGU7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNFbmRBbmdsZShkKSB7XHJcbiAgICByZXR1cm4gZC5lbmRBbmdsZTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2FyY1BhZEFuZ2xlKGQpIHtcclxuICAgIHJldHVybiBkICYmIGQucGFkQW5nbGU7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNTd2VlcCh4MCwgeTAsIHgxLCB5MSkge1xyXG4gICAgcmV0dXJuICh4MCAtIHgxKSAqIHkwIC0gKHkwIC0geTEpICogeDAgPiAwID8gMCA6IDE7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNDb3JuZXJUYW5nZW50cyhwMCwgcDEsIHIxLCByYywgY3cpIHtcclxuICAgIHZhciB4MDEgPSBwMFswXSAtIHAxWzBdLCB5MDEgPSBwMFsxXSAtIHAxWzFdLCBsbyA9IChjdyA/IHJjIDogLXJjKSAvIE1hdGguc3FydCh4MDEgKiB4MDEgKyB5MDEgKiB5MDEpLCBveCA9IGxvICogeTAxLCBveSA9IC1sbyAqIHgwMSwgeDEgPSBwMFswXSArIG94LCB5MSA9IHAwWzFdICsgb3ksIHgyID0gcDFbMF0gKyBveCwgeTIgPSBwMVsxXSArIG95LCB4MyA9ICh4MSArIHgyKSAvIDIsIHkzID0gKHkxICsgeTIpIC8gMiwgZHggPSB4MiAtIHgxLCBkeSA9IHkyIC0geTEsIGQyID0gZHggKiBkeCArIGR5ICogZHksIHIgPSByMSAtIHJjLCBEID0geDEgKiB5MiAtIHgyICogeTEsIGQgPSAoZHkgPCAwID8gLTEgOiAxKSAqIE1hdGguc3FydChNYXRoLm1heCgwLCByICogciAqIGQyIC0gRCAqIEQpKSwgY3gwID0gKEQgKiBkeSAtIGR4ICogZCkgLyBkMiwgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsIGN4MSA9IChEICogZHkgKyBkeCAqIGQpIC8gZDIsIGN5MSA9ICgtRCAqIGR4ICsgZHkgKiBkKSAvIGQyLCBkeDAgPSBjeDAgLSB4MywgZHkwID0gY3kwIC0geTMsIGR4MSA9IGN4MSAtIHgzLCBkeTEgPSBjeTEgLSB5MztcclxuICAgIGlmIChkeDAgKiBkeDAgKyBkeTAgKiBkeTAgPiBkeDEgKiBkeDEgKyBkeTEgKiBkeTEpIGN4MCA9IGN4MSwgY3kwID0gY3kxO1xyXG4gICAgcmV0dXJuIFsgWyBjeDAgLSBveCwgY3kwIC0gb3kgXSwgWyBjeDAgKiByMSAvIHIsIGN5MCAqIHIxIC8gciBdIF07XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lKHByb2plY3Rpb24pIHtcclxuICAgIHZhciB4ID0gZDNfZ2VvbV9wb2ludFgsIHkgPSBkM19nZW9tX3BvaW50WSwgZGVmaW5lZCA9IGQzX3RydWUsIGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVMaW5lYXIsIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUua2V5LCB0ZW5zaW9uID0gLjc7XHJcbiAgICBmdW5jdGlvbiBsaW5lKGRhdGEpIHtcclxuICAgICAgdmFyIHNlZ21lbnRzID0gW10sIHBvaW50cyA9IFtdLCBpID0gLTEsIG4gPSBkYXRhLmxlbmd0aCwgZCwgZnggPSBkM19mdW5jdG9yKHgpLCBmeSA9IGQzX2Z1bmN0b3IoeSk7XHJcbiAgICAgIGZ1bmN0aW9uIHNlZ21lbnQoKSB7XHJcbiAgICAgICAgc2VnbWVudHMucHVzaChcIk1cIiwgaW50ZXJwb2xhdGUocHJvamVjdGlvbihwb2ludHMpLCB0ZW5zaW9uKSk7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICBpZiAoZGVmaW5lZC5jYWxsKHRoaXMsIGQgPSBkYXRhW2ldLCBpKSkge1xyXG4gICAgICAgICAgcG9pbnRzLnB1c2goWyArZnguY2FsbCh0aGlzLCBkLCBpKSwgK2Z5LmNhbGwodGhpcywgZCwgaSkgXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBzZWdtZW50KCk7XHJcbiAgICAgICAgICBwb2ludHMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHBvaW50cy5sZW5ndGgpIHNlZ21lbnQoKTtcclxuICAgICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA/IHNlZ21lbnRzLmpvaW4oXCJcIikgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgbGluZS54ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4O1xyXG4gICAgICB4ID0gXztcclxuICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9O1xyXG4gICAgbGluZS55ID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5O1xyXG4gICAgICB5ID0gXztcclxuICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9O1xyXG4gICAgbGluZS5kZWZpbmVkID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkZWZpbmVkO1xyXG4gICAgICBkZWZpbmVkID0gXztcclxuICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9O1xyXG4gICAgbGluZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGVLZXk7XHJcbiAgICAgIGlmICh0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiKSBpbnRlcnBvbGF0ZUtleSA9IGludGVycG9sYXRlID0gXzsgZWxzZSBpbnRlcnBvbGF0ZUtleSA9IChpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5nZXQoXykgfHwgZDNfc3ZnX2xpbmVMaW5lYXIpLmtleTtcclxuICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9O1xyXG4gICAgbGluZS50ZW5zaW9uID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uO1xyXG4gICAgICB0ZW5zaW9uID0gXztcclxuICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGxpbmU7XHJcbiAgfVxyXG4gIGQzLnN2Zy5saW5lID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZDNfc3ZnX2xpbmUoZDNfaWRlbnRpdHkpO1xyXG4gIH07XHJcbiAgdmFyIGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycyA9IGQzLm1hcCh7XHJcbiAgICBsaW5lYXI6IGQzX3N2Z19saW5lTGluZWFyLFxyXG4gICAgXCJsaW5lYXItY2xvc2VkXCI6IGQzX3N2Z19saW5lTGluZWFyQ2xvc2VkLFxyXG4gICAgc3RlcDogZDNfc3ZnX2xpbmVTdGVwLFxyXG4gICAgXCJzdGVwLWJlZm9yZVwiOiBkM19zdmdfbGluZVN0ZXBCZWZvcmUsXHJcbiAgICBcInN0ZXAtYWZ0ZXJcIjogZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIsXHJcbiAgICBiYXNpczogZDNfc3ZnX2xpbmVCYXNpcyxcclxuICAgIFwiYmFzaXMtb3BlblwiOiBkM19zdmdfbGluZUJhc2lzT3BlbixcclxuICAgIFwiYmFzaXMtY2xvc2VkXCI6IGQzX3N2Z19saW5lQmFzaXNDbG9zZWQsXHJcbiAgICBidW5kbGU6IGQzX3N2Z19saW5lQnVuZGxlLFxyXG4gICAgY2FyZGluYWw6IGQzX3N2Z19saW5lQ2FyZGluYWwsXHJcbiAgICBcImNhcmRpbmFsLW9wZW5cIjogZDNfc3ZnX2xpbmVDYXJkaW5hbE9wZW4sXHJcbiAgICBcImNhcmRpbmFsLWNsb3NlZFwiOiBkM19zdmdfbGluZUNhcmRpbmFsQ2xvc2VkLFxyXG4gICAgbW9ub3RvbmU6IGQzX3N2Z19saW5lTW9ub3RvbmVcclxuICB9KTtcclxuICBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICB2YWx1ZS5rZXkgPSBrZXk7XHJcbiAgICB2YWx1ZS5jbG9zZWQgPSAvLWNsb3NlZCQvLnRlc3Qoa2V5KTtcclxuICB9KTtcclxuICBmdW5jdGlvbiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIHtcclxuICAgIHJldHVybiBwb2ludHMubGVuZ3RoID4gMSA/IHBvaW50cy5qb2luKFwiTFwiKSA6IHBvaW50cyArIFwiWlwiO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfbGluZUxpbmVhckNsb3NlZChwb2ludHMpIHtcclxuICAgIHJldHVybiBwb2ludHMuam9pbihcIkxcIikgKyBcIlpcIjtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVTdGVwKHBvaW50cykge1xyXG4gICAgdmFyIGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aCwgcCA9IHBvaW50c1swXSwgcGF0aCA9IFsgcFswXSwgXCIsXCIsIHBbMV0gXTtcclxuICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goXCJIXCIsIChwWzBdICsgKHAgPSBwb2ludHNbaV0pWzBdKSAvIDIsIFwiVlwiLCBwWzFdKTtcclxuICAgIGlmIChuID4gMSkgcGF0aC5wdXNoKFwiSFwiLCBwWzBdKTtcclxuICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEJlZm9yZShwb2ludHMpIHtcclxuICAgIHZhciBpID0gMCwgbiA9IHBvaW50cy5sZW5ndGgsIHAgPSBwb2ludHNbMF0sIHBhdGggPSBbIHBbMF0sIFwiLFwiLCBwWzFdIF07XHJcbiAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKFwiVlwiLCAocCA9IHBvaW50c1tpXSlbMV0sIFwiSFwiLCBwWzBdKTtcclxuICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEFmdGVyKHBvaW50cykge1xyXG4gICAgdmFyIGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aCwgcCA9IHBvaW50c1swXSwgcGF0aCA9IFsgcFswXSwgXCIsXCIsIHBbMV0gXTtcclxuICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goXCJIXCIsIChwID0gcG9pbnRzW2ldKVswXSwgXCJWXCIsIHBbMV0pO1xyXG4gICAgcmV0dXJuIHBhdGguam9pbihcIlwiKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbE9wZW4ocG9pbnRzLCB0ZW5zaW9uKSB7XHJcbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDQgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzFdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cy5zbGljZSgxLCAtMSksIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbENsb3NlZChwb2ludHMsIHRlbnNpb24pIHtcclxuICAgIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMyA/IGQzX3N2Z19saW5lTGluZWFyQ2xvc2VkKHBvaW50cykgOiBwb2ludHNbMF0gKyBkM19zdmdfbGluZUhlcm1pdGUoKHBvaW50cy5wdXNoKHBvaW50c1swXSksIFxyXG4gICAgcG9pbnRzKSwgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKFsgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXSBdLmNvbmNhdChwb2ludHMsIFsgcG9pbnRzWzFdIF0pLCB0ZW5zaW9uKSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWwocG9pbnRzLCB0ZW5zaW9uKSB7XHJcbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLCB0YW5nZW50cykge1xyXG4gICAgaWYgKHRhbmdlbnRzLmxlbmd0aCA8IDEgfHwgcG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGggJiYgcG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGggKyAyKSB7XHJcbiAgICAgIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpO1xyXG4gICAgfVxyXG4gICAgdmFyIHF1YWQgPSBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCwgcGF0aCA9IFwiXCIsIHAwID0gcG9pbnRzWzBdLCBwID0gcG9pbnRzWzFdLCB0MCA9IHRhbmdlbnRzWzBdLCB0ID0gdDAsIHBpID0gMTtcclxuICAgIGlmIChxdWFkKSB7XHJcbiAgICAgIHBhdGggKz0gXCJRXCIgKyAocFswXSAtIHQwWzBdICogMiAvIDMpICsgXCIsXCIgKyAocFsxXSAtIHQwWzFdICogMiAvIDMpICsgXCIsXCIgKyBwWzBdICsgXCIsXCIgKyBwWzFdO1xyXG4gICAgICBwMCA9IHBvaW50c1sxXTtcclxuICAgICAgcGkgPSAyO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhbmdlbnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdCA9IHRhbmdlbnRzWzFdO1xyXG4gICAgICBwID0gcG9pbnRzW3BpXTtcclxuICAgICAgcGkrKztcclxuICAgICAgcGF0aCArPSBcIkNcIiArIChwMFswXSArIHQwWzBdKSArIFwiLFwiICsgKHAwWzFdICsgdDBbMV0pICsgXCIsXCIgKyAocFswXSAtIHRbMF0pICsgXCIsXCIgKyAocFsxXSAtIHRbMV0pICsgXCIsXCIgKyBwWzBdICsgXCIsXCIgKyBwWzFdO1xyXG4gICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHRhbmdlbnRzLmxlbmd0aDsgaSsrLCBwaSsrKSB7XHJcbiAgICAgICAgcCA9IHBvaW50c1twaV07XHJcbiAgICAgICAgdCA9IHRhbmdlbnRzW2ldO1xyXG4gICAgICAgIHBhdGggKz0gXCJTXCIgKyAocFswXSAtIHRbMF0pICsgXCIsXCIgKyAocFsxXSAtIHRbMV0pICsgXCIsXCIgKyBwWzBdICsgXCIsXCIgKyBwWzFdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocXVhZCkge1xyXG4gICAgICB2YXIgbHAgPSBwb2ludHNbcGldO1xyXG4gICAgICBwYXRoICs9IFwiUVwiICsgKHBbMF0gKyB0WzBdICogMiAvIDMpICsgXCIsXCIgKyAocFsxXSArIHRbMV0gKiAyIC8gMykgKyBcIixcIiArIGxwWzBdICsgXCIsXCIgKyBscFsxXTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsVGFuZ2VudHMocG9pbnRzLCB0ZW5zaW9uKSB7XHJcbiAgICB2YXIgdGFuZ2VudHMgPSBbXSwgYSA9ICgxIC0gdGVuc2lvbikgLyAyLCBwMCwgcDEgPSBwb2ludHNbMF0sIHAyID0gcG9pbnRzWzFdLCBpID0gMSwgbiA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICB3aGlsZSAoKytpIDwgbikge1xyXG4gICAgICBwMCA9IHAxO1xyXG4gICAgICBwMSA9IHAyO1xyXG4gICAgICBwMiA9IHBvaW50c1tpXTtcclxuICAgICAgdGFuZ2VudHMucHVzaChbIGEgKiAocDJbMF0gLSBwMFswXSksIGEgKiAocDJbMV0gLSBwMFsxXSkgXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFuZ2VudHM7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXMocG9pbnRzKSB7XHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpO1xyXG4gICAgdmFyIGkgPSAxLCBuID0gcG9pbnRzLmxlbmd0aCwgcGkgPSBwb2ludHNbMF0sIHgwID0gcGlbMF0sIHkwID0gcGlbMV0sIHB4ID0gWyB4MCwgeDAsIHgwLCAocGkgPSBwb2ludHNbMV0pWzBdIF0sIHB5ID0gWyB5MCwgeTAsIHkwLCBwaVsxXSBdLCBwYXRoID0gWyB4MCwgXCIsXCIsIHkwLCBcIkxcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB5KSBdO1xyXG4gICAgcG9pbnRzLnB1c2gocG9pbnRzW24gLSAxXSk7XHJcbiAgICB3aGlsZSAoKytpIDw9IG4pIHtcclxuICAgICAgcGkgPSBwb2ludHNbaV07XHJcbiAgICAgIHB4LnNoaWZ0KCk7XHJcbiAgICAgIHB4LnB1c2gocGlbMF0pO1xyXG4gICAgICBweS5zaGlmdCgpO1xyXG4gICAgICBweS5wdXNoKHBpWzFdKTtcclxuICAgICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpO1xyXG4gICAgfVxyXG4gICAgcG9pbnRzLnBvcCgpO1xyXG4gICAgcGF0aC5wdXNoKFwiTFwiLCBwaSk7XHJcbiAgICByZXR1cm4gcGF0aC5qb2luKFwiXCIpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzT3Blbihwb2ludHMpIHtcclxuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgNCkgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7XHJcbiAgICB2YXIgcGF0aCA9IFtdLCBpID0gLTEsIG4gPSBwb2ludHMubGVuZ3RoLCBwaSwgcHggPSBbIDAgXSwgcHkgPSBbIDAgXTtcclxuICAgIHdoaWxlICgrK2kgPCAzKSB7XHJcbiAgICAgIHBpID0gcG9pbnRzW2ldO1xyXG4gICAgICBweC5wdXNoKHBpWzBdKTtcclxuICAgICAgcHkucHVzaChwaVsxXSk7XHJcbiAgICB9XHJcbiAgICBwYXRoLnB1c2goZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCkgKyBcIixcIiArIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHkpKTtcclxuICAgIC0taTtcclxuICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgIHBpID0gcG9pbnRzW2ldO1xyXG4gICAgICBweC5zaGlmdCgpO1xyXG4gICAgICBweC5wdXNoKHBpWzBdKTtcclxuICAgICAgcHkuc2hpZnQoKTtcclxuICAgICAgcHkucHVzaChwaVsxXSk7XHJcbiAgICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNDbG9zZWQocG9pbnRzKSB7XHJcbiAgICB2YXIgcGF0aCwgaSA9IC0xLCBuID0gcG9pbnRzLmxlbmd0aCwgbSA9IG4gKyA0LCBwaSwgcHggPSBbXSwgcHkgPSBbXTtcclxuICAgIHdoaWxlICgrK2kgPCA0KSB7XHJcbiAgICAgIHBpID0gcG9pbnRzW2kgJSBuXTtcclxuICAgICAgcHgucHVzaChwaVswXSk7XHJcbiAgICAgIHB5LnB1c2gocGlbMV0pO1xyXG4gICAgfVxyXG4gICAgcGF0aCA9IFsgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB5KSBdO1xyXG4gICAgLS1pO1xyXG4gICAgd2hpbGUgKCsraSA8IG0pIHtcclxuICAgICAgcGkgPSBwb2ludHNbaSAlIG5dO1xyXG4gICAgICBweC5zaGlmdCgpO1xyXG4gICAgICBweC5wdXNoKHBpWzBdKTtcclxuICAgICAgcHkuc2hpZnQoKTtcclxuICAgICAgcHkucHVzaChwaVsxXSk7XHJcbiAgICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQnVuZGxlKHBvaW50cywgdGVuc2lvbikge1xyXG4gICAgdmFyIG4gPSBwb2ludHMubGVuZ3RoIC0gMTtcclxuICAgIGlmIChuKSB7XHJcbiAgICAgIHZhciB4MCA9IHBvaW50c1swXVswXSwgeTAgPSBwb2ludHNbMF1bMV0sIGR4ID0gcG9pbnRzW25dWzBdIC0geDAsIGR5ID0gcG9pbnRzW25dWzFdIC0geTAsIGkgPSAtMSwgcCwgdDtcclxuICAgICAgd2hpbGUgKCsraSA8PSBuKSB7XHJcbiAgICAgICAgcCA9IHBvaW50c1tpXTtcclxuICAgICAgICB0ID0gaSAvIG47XHJcbiAgICAgICAgcFswXSA9IHRlbnNpb24gKiBwWzBdICsgKDEgLSB0ZW5zaW9uKSAqICh4MCArIHQgKiBkeCk7XHJcbiAgICAgICAgcFsxXSA9IHRlbnNpb24gKiBwWzFdICsgKDEgLSB0ZW5zaW9uKSAqICh5MCArIHQgKiBkeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkM19zdmdfbGluZUJhc2lzKHBvaW50cyk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lRG90NChhLCBiKSB7XHJcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XHJcbiAgfVxyXG4gIHZhciBkM19zdmdfbGluZUJhc2lzQmV6aWVyMSA9IFsgMCwgMiAvIDMsIDEgLyAzLCAwIF0sIGQzX3N2Z19saW5lQmFzaXNCZXppZXIyID0gWyAwLCAxIC8gMywgMiAvIDMsIDAgXSwgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMgPSBbIDAsIDEgLyA2LCAyIC8gMywgMSAvIDYgXTtcclxuICBmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHgsIHkpIHtcclxuICAgIHBhdGgucHVzaChcIkNcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB4KSwgXCIsXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMSwgeSksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIsIHgpLCBcIixcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB5KSwgXCIsXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgeCksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHkpKTtcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVTbG9wZShwMCwgcDEpIHtcclxuICAgIHJldHVybiAocDFbMV0gLSBwMFsxXSkgLyAocDFbMF0gLSBwMFswXSk7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lRmluaXRlRGlmZmVyZW5jZXMocG9pbnRzKSB7XHJcbiAgICB2YXIgaSA9IDAsIGogPSBwb2ludHMubGVuZ3RoIC0gMSwgbSA9IFtdLCBwMCA9IHBvaW50c1swXSwgcDEgPSBwb2ludHNbMV0sIGQgPSBtWzBdID0gZDNfc3ZnX2xpbmVTbG9wZShwMCwgcDEpO1xyXG4gICAgd2hpbGUgKCsraSA8IGopIHtcclxuICAgICAgbVtpXSA9IChkICsgKGQgPSBkM19zdmdfbGluZVNsb3BlKHAwID0gcDEsIHAxID0gcG9pbnRzW2kgKyAxXSkpKSAvIDI7XHJcbiAgICB9XHJcbiAgICBtW2ldID0gZDtcclxuICAgIHJldHVybiBtO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfbGluZU1vbm90b25lVGFuZ2VudHMocG9pbnRzKSB7XHJcbiAgICB2YXIgdGFuZ2VudHMgPSBbXSwgZCwgYSwgYiwgcywgbSA9IGQzX3N2Z19saW5lRmluaXRlRGlmZmVyZW5jZXMocG9pbnRzKSwgaSA9IC0xLCBqID0gcG9pbnRzLmxlbmd0aCAtIDE7XHJcbiAgICB3aGlsZSAoKytpIDwgaikge1xyXG4gICAgICBkID0gZDNfc3ZnX2xpbmVTbG9wZShwb2ludHNbaV0sIHBvaW50c1tpICsgMV0pO1xyXG4gICAgICBpZiAoYWJzKGQpIDwgzrUpIHtcclxuICAgICAgICBtW2ldID0gbVtpICsgMV0gPSAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGEgPSBtW2ldIC8gZDtcclxuICAgICAgICBiID0gbVtpICsgMV0gLyBkO1xyXG4gICAgICAgIHMgPSBhICogYSArIGIgKiBiO1xyXG4gICAgICAgIGlmIChzID4gOSkge1xyXG4gICAgICAgICAgcyA9IGQgKiAzIC8gTWF0aC5zcXJ0KHMpO1xyXG4gICAgICAgICAgbVtpXSA9IHMgKiBhO1xyXG4gICAgICAgICAgbVtpICsgMV0gPSBzICogYjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGkgPSAtMTtcclxuICAgIHdoaWxlICgrK2kgPD0gaikge1xyXG4gICAgICBzID0gKHBvaW50c1tNYXRoLm1pbihqLCBpICsgMSldWzBdIC0gcG9pbnRzW01hdGgubWF4KDAsIGkgLSAxKV1bMF0pIC8gKDYgKiAoMSArIG1baV0gKiBtW2ldKSk7XHJcbiAgICAgIHRhbmdlbnRzLnB1c2goWyBzIHx8IDAsIG1baV0gKiBzIHx8IDAgXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFuZ2VudHM7XHJcbiAgfVxyXG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmUocG9pbnRzKSB7XHJcbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywgZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzKHBvaW50cykpO1xyXG4gIH1cclxuICBkMy5zdmcubGluZS5yYWRpYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBsaW5lID0gZDNfc3ZnX2xpbmUoZDNfc3ZnX2xpbmVSYWRpYWwpO1xyXG4gICAgbGluZS5yYWRpdXMgPSBsaW5lLngsIGRlbGV0ZSBsaW5lLng7XHJcbiAgICBsaW5lLmFuZ2xlID0gbGluZS55LCBkZWxldGUgbGluZS55O1xyXG4gICAgcmV0dXJuIGxpbmU7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zdmdfbGluZVJhZGlhbChwb2ludHMpIHtcclxuICAgIHZhciBwb2ludCwgaSA9IC0xLCBuID0gcG9pbnRzLmxlbmd0aCwgciwgYTtcclxuICAgIHdoaWxlICgrK2kgPCBuKSB7XHJcbiAgICAgIHBvaW50ID0gcG9pbnRzW2ldO1xyXG4gICAgICByID0gcG9pbnRbMF07XHJcbiAgICAgIGEgPSBwb2ludFsxXSAtIGhhbGbPgDtcclxuICAgICAgcG9pbnRbMF0gPSByICogTWF0aC5jb3MoYSk7XHJcbiAgICAgIHBvaW50WzFdID0gciAqIE1hdGguc2luKGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBvaW50cztcclxuICB9XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2FyZWEocHJvamVjdGlvbikge1xyXG4gICAgdmFyIHgwID0gZDNfZ2VvbV9wb2ludFgsIHgxID0gZDNfZ2VvbV9wb2ludFgsIHkwID0gMCwgeTEgPSBkM19nZW9tX3BvaW50WSwgZGVmaW5lZCA9IGQzX3RydWUsIGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVMaW5lYXIsIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUua2V5LCBpbnRlcnBvbGF0ZVJldmVyc2UgPSBpbnRlcnBvbGF0ZSwgTCA9IFwiTFwiLCB0ZW5zaW9uID0gLjc7XHJcbiAgICBmdW5jdGlvbiBhcmVhKGRhdGEpIHtcclxuICAgICAgdmFyIHNlZ21lbnRzID0gW10sIHBvaW50czAgPSBbXSwgcG9pbnRzMSA9IFtdLCBpID0gLTEsIG4gPSBkYXRhLmxlbmd0aCwgZCwgZngwID0gZDNfZnVuY3Rvcih4MCksIGZ5MCA9IGQzX2Z1bmN0b3IoeTApLCBmeDEgPSB4MCA9PT0geDEgPyBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4geDtcclxuICAgICAgfSA6IGQzX2Z1bmN0b3IoeDEpLCBmeTEgPSB5MCA9PT0geTEgPyBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4geTtcclxuICAgICAgfSA6IGQzX2Z1bmN0b3IoeTEpLCB4LCB5O1xyXG4gICAgICBmdW5jdGlvbiBzZWdtZW50KCkge1xyXG4gICAgICAgIHNlZ21lbnRzLnB1c2goXCJNXCIsIGludGVycG9sYXRlKHByb2plY3Rpb24ocG9pbnRzMSksIHRlbnNpb24pLCBMLCBpbnRlcnBvbGF0ZVJldmVyc2UocHJvamVjdGlvbihwb2ludHMwLnJldmVyc2UoKSksIHRlbnNpb24pLCBcIlpcIik7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcclxuICAgICAgICBpZiAoZGVmaW5lZC5jYWxsKHRoaXMsIGQgPSBkYXRhW2ldLCBpKSkge1xyXG4gICAgICAgICAgcG9pbnRzMC5wdXNoKFsgeCA9ICtmeDAuY2FsbCh0aGlzLCBkLCBpKSwgeSA9ICtmeTAuY2FsbCh0aGlzLCBkLCBpKSBdKTtcclxuICAgICAgICAgIHBvaW50czEucHVzaChbICtmeDEuY2FsbCh0aGlzLCBkLCBpKSwgK2Z5MS5jYWxsKHRoaXMsIGQsIGkpIF0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzMC5sZW5ndGgpIHtcclxuICAgICAgICAgIHNlZ21lbnQoKTtcclxuICAgICAgICAgIHBvaW50czAgPSBbXTtcclxuICAgICAgICAgIHBvaW50czEgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHBvaW50czAubGVuZ3RoKSBzZWdtZW50KCk7XHJcbiAgICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPyBzZWdtZW50cy5qb2luKFwiXCIpIDogbnVsbDtcclxuICAgIH1cclxuICAgIGFyZWEueCA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7XHJcbiAgICAgIHgwID0geDEgPSBfO1xyXG4gICAgICByZXR1cm4gYXJlYTtcclxuICAgIH07XHJcbiAgICBhcmVhLngwID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MDtcclxuICAgICAgeDAgPSBfO1xyXG4gICAgICByZXR1cm4gYXJlYTtcclxuICAgIH07XHJcbiAgICBhcmVhLngxID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MTtcclxuICAgICAgeDEgPSBfO1xyXG4gICAgICByZXR1cm4gYXJlYTtcclxuICAgIH07XHJcbiAgICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxO1xyXG4gICAgICB5MCA9IHkxID0gXztcclxuICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9O1xyXG4gICAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTA7XHJcbiAgICAgIHkwID0gXztcclxuICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9O1xyXG4gICAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7XHJcbiAgICAgIHkxID0gXztcclxuICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9O1xyXG4gICAgYXJlYS5kZWZpbmVkID0gZnVuY3Rpb24oXykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkZWZpbmVkO1xyXG4gICAgICBkZWZpbmVkID0gXztcclxuICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9O1xyXG4gICAgYXJlYS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGVLZXk7XHJcbiAgICAgIGlmICh0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiKSBpbnRlcnBvbGF0ZUtleSA9IGludGVycG9sYXRlID0gXzsgZWxzZSBpbnRlcnBvbGF0ZUtleSA9IChpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5nZXQoXykgfHwgZDNfc3ZnX2xpbmVMaW5lYXIpLmtleTtcclxuICAgICAgaW50ZXJwb2xhdGVSZXZlcnNlID0gaW50ZXJwb2xhdGUucmV2ZXJzZSB8fCBpbnRlcnBvbGF0ZTtcclxuICAgICAgTCA9IGludGVycG9sYXRlLmNsb3NlZCA/IFwiTVwiIDogXCJMXCI7XHJcbiAgICAgIHJldHVybiBhcmVhO1xyXG4gICAgfTtcclxuICAgIGFyZWEudGVuc2lvbiA9IGZ1bmN0aW9uKF8pIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGVuc2lvbjtcclxuICAgICAgdGVuc2lvbiA9IF87XHJcbiAgICAgIHJldHVybiBhcmVhO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBhcmVhO1xyXG4gIH1cclxuICBkM19zdmdfbGluZVN0ZXBCZWZvcmUucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEFmdGVyO1xyXG4gIGQzX3N2Z19saW5lU3RlcEFmdGVyLnJldmVyc2UgPSBkM19zdmdfbGluZVN0ZXBCZWZvcmU7XHJcbiAgZDMuc3ZnLmFyZWEgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBkM19zdmdfYXJlYShkM19pZGVudGl0eSk7XHJcbiAgfTtcclxuICBkMy5zdmcuYXJlYS5yYWRpYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBhcmVhID0gZDNfc3ZnX2FyZWEoZDNfc3ZnX2xpbmVSYWRpYWwpO1xyXG4gICAgYXJlYS5yYWRpdXMgPSBhcmVhLngsIGRlbGV0ZSBhcmVhLng7XHJcbiAgICBhcmVhLmlubmVyUmFkaXVzID0gYXJlYS54MCwgZGVsZXRlIGFyZWEueDA7XHJcbiAgICBhcmVhLm91dGVyUmFkaXVzID0gYXJlYS54MSwgZGVsZXRlIGFyZWEueDE7XHJcbiAgICBhcmVhLmFuZ2xlID0gYXJlYS55LCBkZWxldGUgYXJlYS55O1xyXG4gICAgYXJlYS5zdGFydEFuZ2xlID0gYXJlYS55MCwgZGVsZXRlIGFyZWEueTA7XHJcbiAgICBhcmVhLmVuZEFuZ2xlID0gYXJlYS55MSwgZGVsZXRlIGFyZWEueTE7XHJcbiAgICByZXR1cm4gYXJlYTtcclxuICB9O1xyXG4gIGQzLnN2Zy5jaG9yZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIHNvdXJjZSA9IGQzX3NvdXJjZSwgdGFyZ2V0ID0gZDNfdGFyZ2V0LCByYWRpdXMgPSBkM19zdmdfY2hvcmRSYWRpdXMsIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwgZW5kQW5nbGUgPSBkM19zdmdfYXJjRW5kQW5nbGU7XHJcbiAgICBmdW5jdGlvbiBjaG9yZChkLCBpKSB7XHJcbiAgICAgIHZhciBzID0gc3ViZ3JvdXAodGhpcywgc291cmNlLCBkLCBpKSwgdCA9IHN1Ymdyb3VwKHRoaXMsIHRhcmdldCwgZCwgaSk7XHJcbiAgICAgIHJldHVybiBcIk1cIiArIHMucDAgKyBhcmMocy5yLCBzLnAxLCBzLmExIC0gcy5hMCkgKyAoZXF1YWxzKHMsIHQpID8gY3VydmUocy5yLCBzLnAxLCBzLnIsIHMucDApIDogY3VydmUocy5yLCBzLnAxLCB0LnIsIHQucDApICsgYXJjKHQuciwgdC5wMSwgdC5hMSAtIHQuYTApICsgY3VydmUodC5yLCB0LnAxLCBzLnIsIHMucDApKSArIFwiWlwiO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gc3ViZ3JvdXAoc2VsZiwgZiwgZCwgaSkge1xyXG4gICAgICB2YXIgc3ViZ3JvdXAgPSBmLmNhbGwoc2VsZiwgZCwgaSksIHIgPSByYWRpdXMuY2FsbChzZWxmLCBzdWJncm91cCwgaSksIGEwID0gc3RhcnRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSAtIGhhbGbPgCwgYTEgPSBlbmRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSAtIGhhbGbPgDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICByOiByLFxyXG4gICAgICAgIGEwOiBhMCxcclxuICAgICAgICBhMTogYTEsXHJcbiAgICAgICAgcDA6IFsgciAqIE1hdGguY29zKGEwKSwgciAqIE1hdGguc2luKGEwKSBdLFxyXG4gICAgICAgIHAxOiBbIHIgKiBNYXRoLmNvcyhhMSksIHIgKiBNYXRoLnNpbihhMSkgXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcclxuICAgICAgcmV0dXJuIGEuYTAgPT0gYi5hMCAmJiBhLmExID09IGIuYTE7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhcmMociwgcCwgYSkge1xyXG4gICAgICByZXR1cm4gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIgMCBcIiArICsoYSA+IM+AKSArIFwiLDEgXCIgKyBwO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY3VydmUocjAsIHAwLCByMSwgcDEpIHtcclxuICAgICAgcmV0dXJuIFwiUSAwLDAgXCIgKyBwMTtcclxuICAgIH1cclxuICAgIGNob3JkLnJhZGl1cyA9IGZ1bmN0aW9uKHYpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFkaXVzO1xyXG4gICAgICByYWRpdXMgPSBkM19mdW5jdG9yKHYpO1xyXG4gICAgICByZXR1cm4gY2hvcmQ7XHJcbiAgICB9O1xyXG4gICAgY2hvcmQuc291cmNlID0gZnVuY3Rpb24odikge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7XHJcbiAgICAgIHNvdXJjZSA9IGQzX2Z1bmN0b3Iodik7XHJcbiAgICAgIHJldHVybiBjaG9yZDtcclxuICAgIH07XHJcbiAgICBjaG9yZC50YXJnZXQgPSBmdW5jdGlvbih2KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDtcclxuICAgICAgdGFyZ2V0ID0gZDNfZnVuY3Rvcih2KTtcclxuICAgICAgcmV0dXJuIGNob3JkO1xyXG4gICAgfTtcclxuICAgIGNob3JkLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7XHJcbiAgICAgIHN0YXJ0QW5nbGUgPSBkM19mdW5jdG9yKHYpO1xyXG4gICAgICByZXR1cm4gY2hvcmQ7XHJcbiAgICB9O1xyXG4gICAgY2hvcmQuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlO1xyXG4gICAgICBlbmRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7XHJcbiAgICAgIHJldHVybiBjaG9yZDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gY2hvcmQ7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zdmdfY2hvcmRSYWRpdXMoZCkge1xyXG4gICAgcmV0dXJuIGQucmFkaXVzO1xyXG4gIH1cclxuICBkMy5zdmcuZGlhZ29uYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBzb3VyY2UgPSBkM19zb3VyY2UsIHRhcmdldCA9IGQzX3RhcmdldCwgcHJvamVjdGlvbiA9IGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb247XHJcbiAgICBmdW5jdGlvbiBkaWFnb25hbChkLCBpKSB7XHJcbiAgICAgIHZhciBwMCA9IHNvdXJjZS5jYWxsKHRoaXMsIGQsIGkpLCBwMyA9IHRhcmdldC5jYWxsKHRoaXMsIGQsIGkpLCBtID0gKHAwLnkgKyBwMy55KSAvIDIsIHAgPSBbIHAwLCB7XHJcbiAgICAgICAgeDogcDAueCxcclxuICAgICAgICB5OiBtXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB4OiBwMy54LFxyXG4gICAgICAgIHk6IG1cclxuICAgICAgfSwgcDMgXTtcclxuICAgICAgcCA9IHAubWFwKHByb2plY3Rpb24pO1xyXG4gICAgICByZXR1cm4gXCJNXCIgKyBwWzBdICsgXCJDXCIgKyBwWzFdICsgXCIgXCIgKyBwWzJdICsgXCIgXCIgKyBwWzNdO1xyXG4gICAgfVxyXG4gICAgZGlhZ29uYWwuc291cmNlID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7XHJcbiAgICAgIHNvdXJjZSA9IGQzX2Z1bmN0b3IoeCk7XHJcbiAgICAgIHJldHVybiBkaWFnb25hbDtcclxuICAgIH07XHJcbiAgICBkaWFnb25hbC50YXJnZXQgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDtcclxuICAgICAgdGFyZ2V0ID0gZDNfZnVuY3Rvcih4KTtcclxuICAgICAgcmV0dXJuIGRpYWdvbmFsO1xyXG4gICAgfTtcclxuICAgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByb2plY3Rpb247XHJcbiAgICAgIHByb2plY3Rpb24gPSB4O1xyXG4gICAgICByZXR1cm4gZGlhZ29uYWw7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGRpYWdvbmFsO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbihkKSB7XHJcbiAgICByZXR1cm4gWyBkLngsIGQueSBdO1xyXG4gIH1cclxuICBkMy5zdmcuZGlhZ29uYWwucmFkaWFsID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwoKSwgcHJvamVjdGlvbiA9IGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb24sIHByb2plY3Rpb25fID0gZGlhZ29uYWwucHJvamVjdGlvbjtcclxuICAgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gcHJvamVjdGlvbl8oZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uID0geCkpIDogcHJvamVjdGlvbjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gZGlhZ29uYWw7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19zdmdfZGlhZ29uYWxSYWRpYWxQcm9qZWN0aW9uKHByb2plY3Rpb24pIHtcclxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIGQgPSBwcm9qZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHIgPSBkWzBdLCBhID0gZFsxXSAtIGhhbGbPgDtcclxuICAgICAgcmV0dXJuIFsgciAqIE1hdGguY29zKGEpLCByICogTWF0aC5zaW4oYSkgXTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzLnN2Zy5zeW1ib2wgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciB0eXBlID0gZDNfc3ZnX3N5bWJvbFR5cGUsIHNpemUgPSBkM19zdmdfc3ltYm9sU2l6ZTtcclxuICAgIGZ1bmN0aW9uIHN5bWJvbChkLCBpKSB7XHJcbiAgICAgIHJldHVybiAoZDNfc3ZnX3N5bWJvbHMuZ2V0KHR5cGUuY2FsbCh0aGlzLCBkLCBpKSkgfHwgZDNfc3ZnX3N5bWJvbENpcmNsZSkoc2l6ZS5jYWxsKHRoaXMsIGQsIGkpKTtcclxuICAgIH1cclxuICAgIHN5bWJvbC50eXBlID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0eXBlO1xyXG4gICAgICB0eXBlID0gZDNfZnVuY3Rvcih4KTtcclxuICAgICAgcmV0dXJuIHN5bWJvbDtcclxuICAgIH07XHJcbiAgICBzeW1ib2wuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcclxuICAgICAgc2l6ZSA9IGQzX2Z1bmN0b3IoeCk7XHJcbiAgICAgIHJldHVybiBzeW1ib2w7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN5bWJvbDtcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xTaXplKCkge1xyXG4gICAgcmV0dXJuIDY0O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfc3ltYm9sVHlwZSgpIHtcclxuICAgIHJldHVybiBcImNpcmNsZVwiO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfc3ltYm9sQ2lyY2xlKHNpemUpIHtcclxuICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyDPgCk7XHJcbiAgICByZXR1cm4gXCJNMCxcIiArIHIgKyBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiAwIDEsMSAwLFwiICsgLXIgKyBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiAwIDEsMSAwLFwiICsgciArIFwiWlwiO1xyXG4gIH1cclxuICB2YXIgZDNfc3ZnX3N5bWJvbHMgPSBkMy5tYXAoe1xyXG4gICAgY2lyY2xlOiBkM19zdmdfc3ltYm9sQ2lyY2xlLFxyXG4gICAgY3Jvc3M6IGZ1bmN0aW9uKHNpemUpIHtcclxuICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjtcclxuICAgICAgcmV0dXJuIFwiTVwiICsgLTMgKiByICsgXCIsXCIgKyAtciArIFwiSFwiICsgLXIgKyBcIlZcIiArIC0zICogciArIFwiSFwiICsgciArIFwiVlwiICsgLXIgKyBcIkhcIiArIDMgKiByICsgXCJWXCIgKyByICsgXCJIXCIgKyByICsgXCJWXCIgKyAzICogciArIFwiSFwiICsgLXIgKyBcIlZcIiArIHIgKyBcIkhcIiArIC0zICogciArIFwiWlwiO1xyXG4gICAgfSxcclxuICAgIGRpYW1vbmQ6IGZ1bmN0aW9uKHNpemUpIHtcclxuICAgICAgdmFyIHJ5ID0gTWF0aC5zcXJ0KHNpemUgLyAoMiAqIGQzX3N2Z19zeW1ib2xUYW4zMCkpLCByeCA9IHJ5ICogZDNfc3ZnX3N5bWJvbFRhbjMwO1xyXG4gICAgICByZXR1cm4gXCJNMCxcIiArIC1yeSArIFwiTFwiICsgcnggKyBcIiwwXCIgKyBcIiAwLFwiICsgcnkgKyBcIiBcIiArIC1yeCArIFwiLDBcIiArIFwiWlwiO1xyXG4gICAgfSxcclxuICAgIHNxdWFyZTogZnVuY3Rpb24oc2l6ZSkge1xyXG4gICAgICB2YXIgciA9IE1hdGguc3FydChzaXplKSAvIDI7XHJcbiAgICAgIHJldHVybiBcIk1cIiArIC1yICsgXCIsXCIgKyAtciArIFwiTFwiICsgciArIFwiLFwiICsgLXIgKyBcIiBcIiArIHIgKyBcIixcIiArIHIgKyBcIiBcIiArIC1yICsgXCIsXCIgKyByICsgXCJaXCI7XHJcbiAgICB9LFxyXG4gICAgXCJ0cmlhbmdsZS1kb3duXCI6IGZ1bmN0aW9uKHNpemUpIHtcclxuICAgICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLCByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjtcclxuICAgICAgcmV0dXJuIFwiTTAsXCIgKyByeSArIFwiTFwiICsgcnggKyBcIixcIiArIC1yeSArIFwiIFwiICsgLXJ4ICsgXCIsXCIgKyAtcnkgKyBcIlpcIjtcclxuICAgIH0sXHJcbiAgICBcInRyaWFuZ2xlLXVwXCI6IGZ1bmN0aW9uKHNpemUpIHtcclxuICAgICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLCByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjtcclxuICAgICAgcmV0dXJuIFwiTTAsXCIgKyAtcnkgKyBcIkxcIiArIHJ4ICsgXCIsXCIgKyByeSArIFwiIFwiICsgLXJ4ICsgXCIsXCIgKyByeSArIFwiWlwiO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGQzLnN2Zy5zeW1ib2xUeXBlcyA9IGQzX3N2Z19zeW1ib2xzLmtleXMoKTtcclxuICB2YXIgZDNfc3ZnX3N5bWJvbFNxcnQzID0gTWF0aC5zcXJ0KDMpLCBkM19zdmdfc3ltYm9sVGFuMzAgPSBNYXRoLnRhbigzMCAqIGQzX3JhZGlhbnMpO1xyXG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS50cmFuc2l0aW9uID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgdmFyIGlkID0gZDNfdHJhbnNpdGlvbkluaGVyaXRJZCB8fCArK2QzX3RyYW5zaXRpb25JZCwgbnMgPSBkM190cmFuc2l0aW9uTmFtZXNwYWNlKG5hbWUpLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGUsIHRyYW5zaXRpb24gPSBkM190cmFuc2l0aW9uSW5oZXJpdCB8fCB7XHJcbiAgICAgIHRpbWU6IERhdGUubm93KCksXHJcbiAgICAgIGVhc2U6IGQzX2Vhc2VfY3ViaWNJbk91dCxcclxuICAgICAgZGVsYXk6IDAsXHJcbiAgICAgIGR1cmF0aW9uOiAyNTBcclxuICAgIH07XHJcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XHJcbiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pO1xyXG4gICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7XHJcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgZDNfdHJhbnNpdGlvbk5vZGUobm9kZSwgaSwgbnMsIGlkLCB0cmFuc2l0aW9uKTtcclxuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIG5zLCBpZCk7XHJcbiAgfTtcclxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW50ZXJydXB0ID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChuYW1lID09IG51bGwgPyBkM19zZWxlY3Rpb25faW50ZXJydXB0IDogZDNfc2VsZWN0aW9uX2ludGVycnVwdE5TKGQzX3RyYW5zaXRpb25OYW1lc3BhY2UobmFtZSkpKTtcclxuICB9O1xyXG4gIHZhciBkM19zZWxlY3Rpb25faW50ZXJydXB0ID0gZDNfc2VsZWN0aW9uX2ludGVycnVwdE5TKGQzX3RyYW5zaXRpb25OYW1lc3BhY2UoKSk7XHJcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2ludGVycnVwdE5TKG5zKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBsb2NrLCBhY3RpdmVJZCwgYWN0aXZlO1xyXG4gICAgICBpZiAoKGxvY2sgPSB0aGlzW25zXSkgJiYgKGFjdGl2ZSA9IGxvY2tbYWN0aXZlSWQgPSBsb2NrLmFjdGl2ZV0pKSB7XHJcbiAgICAgICAgYWN0aXZlLnRpbWVyLmMgPSBudWxsO1xyXG4gICAgICAgIGFjdGl2ZS50aW1lci50ID0gTmFOO1xyXG4gICAgICAgIGlmICgtLWxvY2suY291bnQpIGRlbGV0ZSBsb2NrW2FjdGl2ZUlkXTsgZWxzZSBkZWxldGUgdGhpc1tuc107XHJcbiAgICAgICAgbG9jay5hY3RpdmUgKz0gLjU7XHJcbiAgICAgICAgYWN0aXZlLmV2ZW50ICYmIGFjdGl2ZS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLCB0aGlzLl9fZGF0YV9fLCBhY3RpdmUuaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190cmFuc2l0aW9uKGdyb3VwcywgbnMsIGlkKSB7XHJcbiAgICBkM19zdWJjbGFzcyhncm91cHMsIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUpO1xyXG4gICAgZ3JvdXBzLm5hbWVzcGFjZSA9IG5zO1xyXG4gICAgZ3JvdXBzLmlkID0gaWQ7XHJcbiAgICByZXR1cm4gZ3JvdXBzO1xyXG4gIH1cclxuICB2YXIgZDNfdHJhbnNpdGlvblByb3RvdHlwZSA9IFtdLCBkM190cmFuc2l0aW9uSWQgPSAwLCBkM190cmFuc2l0aW9uSW5oZXJpdElkLCBkM190cmFuc2l0aW9uSW5oZXJpdDtcclxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmNhbGwgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuY2FsbDtcclxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmVtcHR5ID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5O1xyXG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUubm9kZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5ub2RlO1xyXG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2l6ZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5zaXplO1xyXG4gIGQzLnRyYW5zaXRpb24gPSBmdW5jdGlvbihzZWxlY3Rpb24sIG5hbWUpIHtcclxuICAgIHJldHVybiBzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRyYW5zaXRpb24gPyBkM190cmFuc2l0aW9uSW5oZXJpdElkID8gc2VsZWN0aW9uLnRyYW5zaXRpb24obmFtZSkgOiBzZWxlY3Rpb24gOiBkMy5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKHNlbGVjdGlvbik7XHJcbiAgfTtcclxuICBkMy50cmFuc2l0aW9uLnByb3RvdHlwZSA9IGQzX3RyYW5zaXRpb25Qcm90b3R5cGU7XHJcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3Rvcikge1xyXG4gICAgdmFyIGlkID0gdGhpcy5pZCwgbnMgPSB0aGlzLm5hbWVzcGFjZSwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBzdWJub2RlLCBub2RlO1xyXG4gICAgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkge1xyXG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcclxuICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47ICkge1xyXG4gICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpKSB7XHJcbiAgICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xyXG4gICAgICAgICAgZDNfdHJhbnNpdGlvbk5vZGUoc3Vibm9kZSwgaSwgbnMsIGlkLCBub2RlW25zXVtpZF0pO1xyXG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChzdWJub2RlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgbnMsIGlkKTtcclxuICB9O1xyXG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgIHZhciBpZCA9IHRoaXMuaWQsIG5zID0gdGhpcy5uYW1lc3BhY2UsIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgc3Vibm9kZXMsIG5vZGUsIHN1Ym5vZGUsIHRyYW5zaXRpb247XHJcbiAgICBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7XHJcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XHJcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHtcclxuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XHJcbiAgICAgICAgICB0cmFuc2l0aW9uID0gbm9kZVtuc11baWRdO1xyXG4gICAgICAgICAgc3Vibm9kZXMgPSBzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopO1xyXG4gICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XHJcbiAgICAgICAgICBmb3IgKHZhciBrID0gLTEsIG8gPSBzdWJub2Rlcy5sZW5ndGg7ICsrayA8IG87ICkge1xyXG4gICAgICAgICAgICBpZiAoc3Vibm9kZSA9IHN1Ym5vZGVzW2tdKSBkM190cmFuc2l0aW9uTm9kZShzdWJub2RlLCBrLCBucywgaWQsIHRyYW5zaXRpb24pO1xyXG4gICAgICAgICAgICBzdWJncm91cC5wdXNoKHN1Ym5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBucywgaWQpO1xyXG4gIH07XHJcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIGdyb3VwLCBub2RlO1xyXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09IFwiZnVuY3Rpb25cIikgZmlsdGVyID0gZDNfc2VsZWN0aW9uX2ZpbHRlcihmaWx0ZXIpO1xyXG4gICAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykge1xyXG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcclxuICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBmaWx0ZXIuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSkge1xyXG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5uYW1lc3BhY2UsIHRoaXMuaWQpO1xyXG4gIH07XHJcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS50d2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHR3ZWVuKSB7XHJcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcy5ub2RlKClbbnNdW2lkXS50d2Vlbi5nZXQobmFtZSk7XHJcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgdHdlZW4gPT0gbnVsbCA/IGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgbm9kZVtuc11baWRdLnR3ZWVuLnJlbW92ZShuYW1lKTtcclxuICAgIH0gOiBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgIG5vZGVbbnNdW2lkXS50d2Vlbi5zZXQobmFtZSwgdHdlZW4pO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM190cmFuc2l0aW9uX3R3ZWVuKGdyb3VwcywgbmFtZSwgdmFsdWUsIHR3ZWVuKSB7XHJcbiAgICB2YXIgaWQgPSBncm91cHMuaWQsIG5zID0gZ3JvdXBzLm5hbWVzcGFjZTtcclxuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaChncm91cHMsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZnVuY3Rpb24obm9kZSwgaSwgaikge1xyXG4gICAgICBub2RlW25zXVtpZF0udHdlZW4uc2V0KG5hbWUsIHR3ZWVuKHZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpKTtcclxuICAgIH0gOiAodmFsdWUgPSB0d2Vlbih2YWx1ZSksIGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgbm9kZVtuc11baWRdLnR3ZWVuLnNldChuYW1lLCB2YWx1ZSk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWVOUywgdmFsdWUpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xyXG4gICAgICBmb3IgKHZhbHVlIGluIG5hbWVOUykgdGhpcy5hdHRyKHZhbHVlLCBuYW1lTlNbdmFsdWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICB2YXIgaW50ZXJwb2xhdGUgPSBuYW1lTlMgPT0gXCJ0cmFuc2Zvcm1cIiA/IGQzX2ludGVycG9sYXRlVHJhbnNmb3JtIDogZDNfaW50ZXJwb2xhdGUsIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7XHJcbiAgICBmdW5jdGlvbiBhdHRyTnVsbCgpIHtcclxuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhdHRyTnVsbE5TKCkge1xyXG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXR0clR3ZWVuKGIpIHtcclxuICAgICAgcmV0dXJuIGIgPT0gbnVsbCA/IGF0dHJOdWxsIDogKGIgKz0gXCJcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKSwgaTtcclxuICAgICAgICByZXR1cm4gYSAhPT0gYiAmJiAoaSA9IGludGVycG9sYXRlKGEsIGIpLCBmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpKHQpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhdHRyVHdlZW5OUyhiKSB7XHJcbiAgICAgIHJldHVybiBiID09IG51bGwgPyBhdHRyTnVsbE5TIDogKGIgKz0gXCJcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpLCBpO1xyXG4gICAgICAgIHJldHVybiBhICE9PSBiICYmIChpID0gaW50ZXJwb2xhdGUoYSwgYiksIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgaSh0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb25fdHdlZW4odGhpcywgXCJhdHRyLlwiICsgbmFtZU5TLCB2YWx1ZSwgbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKTtcclxuICB9O1xyXG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuYXR0clR3ZWVuID0gZnVuY3Rpb24obmFtZU5TLCB0d2Vlbikge1xyXG4gICAgdmFyIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7XHJcbiAgICBmdW5jdGlvbiBhdHRyVHdlZW4oZCwgaSkge1xyXG4gICAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSkpO1xyXG4gICAgICByZXR1cm4gZiAmJiBmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgZih0KSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhdHRyVHdlZW5OUyhkLCBpKSB7XHJcbiAgICAgIHZhciBmID0gdHdlZW4uY2FsbCh0aGlzLCBkLCBpLCB0aGlzLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpKTtcclxuICAgICAgcmV0dXJuIGYgJiYgZnVuY3Rpb24odCkge1xyXG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgZih0KSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50d2VlbihcImF0dHIuXCIgKyBuYW1lTlMsIG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2Vlbik7XHJcbiAgfTtcclxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnN0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XHJcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XHJcbiAgICBpZiAobiA8IDMpIHtcclxuICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgaWYgKG4gPCAyKSB2YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChwcmlvcml0eSBpbiBuYW1lKSB0aGlzLnN0eWxlKHByaW9yaXR5LCBuYW1lW3ByaW9yaXR5XSwgdmFsdWUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcbiAgICAgIHByaW9yaXR5ID0gXCJcIjtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHN0eWxlTnVsbCgpIHtcclxuICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHN0eWxlU3RyaW5nKGIpIHtcclxuICAgICAgcmV0dXJuIGIgPT0gbnVsbCA/IHN0eWxlTnVsbCA6IChiICs9IFwiXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBhID0gZDNfd2luZG93KHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcywgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSwgaTtcclxuICAgICAgICByZXR1cm4gYSAhPT0gYiAmJiAoaSA9IGQzX2ludGVycG9sYXRlKGEsIGIpLCBmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkodCksIHByaW9yaXR5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbl90d2Vlbih0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUsIHN0eWxlU3RyaW5nKTtcclxuICB9O1xyXG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc3R5bGVUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHR3ZWVuLCBwcmlvcml0eSkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBwcmlvcml0eSA9IFwiXCI7XHJcbiAgICBmdW5jdGlvbiBzdHlsZVR3ZWVuKGQsIGkpIHtcclxuICAgICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIGQzX3dpbmRvdyh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSkpO1xyXG4gICAgICByZXR1cm4gZiAmJiBmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBmKHQpLCBwcmlvcml0eSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50d2VlbihcInN0eWxlLlwiICsgbmFtZSwgc3R5bGVUd2Vlbik7XHJcbiAgfTtcclxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb25fdHdlZW4odGhpcywgXCJ0ZXh0XCIsIHZhbHVlLCBkM190cmFuc2l0aW9uX3RleHQpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl90ZXh0KGIpIHtcclxuICAgIGlmIChiID09IG51bGwpIGIgPSBcIlwiO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICB0aGlzLnRleHRDb250ZW50ID0gYjtcclxuICAgIH07XHJcbiAgfVxyXG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgbnMgPSB0aGlzLm5hbWVzcGFjZTtcclxuICAgIHJldHVybiB0aGlzLmVhY2goXCJlbmQudHJhbnNpdGlvblwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHA7XHJcbiAgICAgIGlmICh0aGlzW25zXS5jb3VudCA8IDIgJiYgKHAgPSB0aGlzLnBhcmVudE5vZGUpKSBwLnJlbW92ZUNoaWxkKHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmVhc2UgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgdmFyIGlkID0gdGhpcy5pZCwgbnMgPSB0aGlzLm5hbWVzcGFjZTtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIHRoaXMubm9kZSgpW25zXVtpZF0uZWFzZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBkMy5lYXNlLmFwcGx5KGQzLCBhcmd1bWVudHMpO1xyXG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgbm9kZVtuc11baWRdLmVhc2UgPSB2YWx1ZTtcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5kZWxheSA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gdGhpcy5ub2RlKClbbnNdW2lkXS5kZWxheTtcclxuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGZ1bmN0aW9uKG5vZGUsIGksIGopIHtcclxuICAgICAgbm9kZVtuc11baWRdLmRlbGF5ID0gK3ZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7XHJcbiAgICB9IDogKHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgIG5vZGVbbnNdW2lkXS5kZWxheSA9IHZhbHVlO1xyXG4gICAgfSkpO1xyXG4gIH07XHJcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gdGhpcy5ub2RlKClbbnNdW2lkXS5kdXJhdGlvbjtcclxuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGZ1bmN0aW9uKG5vZGUsIGksIGopIHtcclxuICAgICAgbm9kZVtuc11baWRdLmR1cmF0aW9uID0gTWF0aC5tYXgoMSwgdmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSk7XHJcbiAgICB9IDogKHZhbHVlID0gTWF0aC5tYXgoMSwgdmFsdWUpLCBmdW5jdGlvbihub2RlKSB7XHJcbiAgICAgIG5vZGVbbnNdW2lkXS5kdXJhdGlvbiA9IHZhbHVlO1xyXG4gICAgfSkpO1xyXG4gIH07XHJcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcclxuICAgIHZhciBpZCA9IHRoaXMuaWQsIG5zID0gdGhpcy5uYW1lc3BhY2U7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgdmFyIGluaGVyaXQgPSBkM190cmFuc2l0aW9uSW5oZXJpdCwgaW5oZXJpdElkID0gZDNfdHJhbnNpdGlvbkluaGVyaXRJZDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkM190cmFuc2l0aW9uSW5oZXJpdElkID0gaWQ7XHJcbiAgICAgICAgZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSwgaSwgaikge1xyXG4gICAgICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXQgPSBub2RlW25zXVtpZF07XHJcbiAgICAgICAgICB0eXBlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXQgPSBpbmhlcml0O1xyXG4gICAgICAgIGQzX3RyYW5zaXRpb25Jbmhlcml0SWQgPSBpbmhlcml0SWQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IG5vZGVbbnNdW2lkXTtcclxuICAgICAgICAodHJhbnNpdGlvbi5ldmVudCB8fCAodHJhbnNpdGlvbi5ldmVudCA9IGQzLmRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJpbnRlcnJ1cHRcIikpKS5vbih0eXBlLCBsaXN0ZW5lcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBpZDAgPSB0aGlzLmlkLCBpZDEgPSArK2QzX3RyYW5zaXRpb25JZCwgbnMgPSB0aGlzLm5hbWVzcGFjZSwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBncm91cCwgbm9kZSwgdHJhbnNpdGlvbjtcclxuICAgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHtcclxuICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XHJcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XHJcbiAgICAgICAgICB0cmFuc2l0aW9uID0gbm9kZVtuc11baWQwXTtcclxuICAgICAgICAgIGQzX3RyYW5zaXRpb25Ob2RlKG5vZGUsIGksIG5zLCBpZDEsIHtcclxuICAgICAgICAgICAgdGltZTogdHJhbnNpdGlvbi50aW1lLFxyXG4gICAgICAgICAgICBlYXNlOiB0cmFuc2l0aW9uLmVhc2UsXHJcbiAgICAgICAgICAgIGRlbGF5OiB0cmFuc2l0aW9uLmRlbGF5ICsgdHJhbnNpdGlvbi5kdXJhdGlvbixcclxuICAgICAgICAgICAgZHVyYXRpb246IHRyYW5zaXRpb24uZHVyYXRpb25cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIG5zLCBpZDEpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbk5hbWVzcGFjZShuYW1lKSB7XHJcbiAgICByZXR1cm4gbmFtZSA9PSBudWxsID8gXCJfX3RyYW5zaXRpb25fX1wiIDogXCJfX3RyYW5zaXRpb25fXCIgKyBuYW1lICsgXCJfX1wiO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBucywgaWQsIGluaGVyaXQpIHtcclxuICAgIHZhciBsb2NrID0gbm9kZVtuc10gfHwgKG5vZGVbbnNdID0ge1xyXG4gICAgICBhY3RpdmU6IDAsXHJcbiAgICAgIGNvdW50OiAwXHJcbiAgICB9KSwgdHJhbnNpdGlvbiA9IGxvY2tbaWRdLCB0aW1lLCB0aW1lciwgZHVyYXRpb24sIGVhc2UsIHR3ZWVucztcclxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcclxuICAgICAgdmFyIGRlbGF5ID0gdHJhbnNpdGlvbi5kZWxheTtcclxuICAgICAgdGltZXIudCA9IGRlbGF5ICsgdGltZTtcclxuICAgICAgaWYgKGRlbGF5IDw9IGVsYXBzZWQpIHJldHVybiBzdGFydChlbGFwc2VkIC0gZGVsYXkpO1xyXG4gICAgICB0aW1lci5jID0gc3RhcnQ7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XHJcbiAgICAgIHZhciBhY3RpdmVJZCA9IGxvY2suYWN0aXZlLCBhY3RpdmUgPSBsb2NrW2FjdGl2ZUlkXTtcclxuICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgIGFjdGl2ZS50aW1lci5jID0gbnVsbDtcclxuICAgICAgICBhY3RpdmUudGltZXIudCA9IE5hTjtcclxuICAgICAgICAtLWxvY2suY291bnQ7XHJcbiAgICAgICAgZGVsZXRlIGxvY2tbYWN0aXZlSWRdO1xyXG4gICAgICAgIGFjdGl2ZS5ldmVudCAmJiBhY3RpdmUuZXZlbnQuaW50ZXJydXB0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgYWN0aXZlLmluZGV4KTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKHZhciBjYW5jZWxJZCBpbiBsb2NrKSB7XHJcbiAgICAgICAgaWYgKCtjYW5jZWxJZCA8IGlkKSB7XHJcbiAgICAgICAgICB2YXIgY2FuY2VsID0gbG9ja1tjYW5jZWxJZF07XHJcbiAgICAgICAgICBjYW5jZWwudGltZXIuYyA9IG51bGw7XHJcbiAgICAgICAgICBjYW5jZWwudGltZXIudCA9IE5hTjtcclxuICAgICAgICAgIC0tbG9jay5jb3VudDtcclxuICAgICAgICAgIGRlbGV0ZSBsb2NrW2NhbmNlbElkXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGltZXIuYyA9IHRpY2s7XHJcbiAgICAgIGQzX3RpbWVyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aW1lci5jICYmIHRpY2soZWxhcHNlZCB8fCAxKSkge1xyXG4gICAgICAgICAgdGltZXIuYyA9IG51bGw7XHJcbiAgICAgICAgICB0aW1lci50ID0gTmFOO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMTtcclxuICAgICAgfSwgMCwgdGltZSk7XHJcbiAgICAgIGxvY2suYWN0aXZlID0gaWQ7XHJcbiAgICAgIHRyYW5zaXRpb24uZXZlbnQgJiYgdHJhbnNpdGlvbi5ldmVudC5zdGFydC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpO1xyXG4gICAgICB0d2VlbnMgPSBbXTtcclxuICAgICAgdHJhbnNpdGlvbi50d2Vlbi5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUgPSB2YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpKSB7XHJcbiAgICAgICAgICB0d2VlbnMucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgZWFzZSA9IHRyYW5zaXRpb24uZWFzZTtcclxuICAgICAgZHVyYXRpb24gPSB0cmFuc2l0aW9uLmR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XHJcbiAgICAgIHZhciB0ID0gZWxhcHNlZCAvIGR1cmF0aW9uLCBlID0gZWFzZSh0KSwgbiA9IHR3ZWVucy5sZW5ndGg7XHJcbiAgICAgIHdoaWxlIChuID4gMCkge1xyXG4gICAgICAgIHR3ZWVuc1stLW5dLmNhbGwobm9kZSwgZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHQgPj0gMSkge1xyXG4gICAgICAgIHRyYW5zaXRpb24uZXZlbnQgJiYgdHJhbnNpdGlvbi5ldmVudC5lbmQuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKTtcclxuICAgICAgICBpZiAoLS1sb2NrLmNvdW50KSBkZWxldGUgbG9ja1tpZF07IGVsc2UgZGVsZXRlIG5vZGVbbnNdO1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXRyYW5zaXRpb24pIHtcclxuICAgICAgdGltZSA9IGluaGVyaXQudGltZTtcclxuICAgICAgdGltZXIgPSBkM190aW1lcihzY2hlZHVsZSwgMCwgdGltZSk7XHJcbiAgICAgIHRyYW5zaXRpb24gPSBsb2NrW2lkXSA9IHtcclxuICAgICAgICB0d2VlbjogbmV3IGQzX01hcCgpLFxyXG4gICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgdGltZXI6IHRpbWVyLFxyXG4gICAgICAgIGRlbGF5OiBpbmhlcml0LmRlbGF5LFxyXG4gICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxyXG4gICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZSxcclxuICAgICAgICBpbmRleDogaVxyXG4gICAgICB9O1xyXG4gICAgICBpbmhlcml0ID0gbnVsbDtcclxuICAgICAgKytsb2NrLmNvdW50O1xyXG4gICAgfVxyXG4gIH1cclxuICBkMy5zdmcuYXhpcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIHNjYWxlID0gZDMuc2NhbGUubGluZWFyKCksIG9yaWVudCA9IGQzX3N2Z19heGlzRGVmYXVsdE9yaWVudCwgaW5uZXJUaWNrU2l6ZSA9IDYsIG91dGVyVGlja1NpemUgPSA2LCB0aWNrUGFkZGluZyA9IDMsIHRpY2tBcmd1bWVudHNfID0gWyAxMCBdLCB0aWNrVmFsdWVzID0gbnVsbCwgdGlja0Zvcm1hdF87XHJcbiAgICBmdW5jdGlvbiBheGlzKGcpIHtcclxuICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBnID0gZDMuc2VsZWN0KHRoaXMpO1xyXG4gICAgICAgIHZhciBzY2FsZTAgPSB0aGlzLl9fY2hhcnRfXyB8fCBzY2FsZSwgc2NhbGUxID0gdGhpcy5fX2NoYXJ0X18gPSBzY2FsZS5jb3B5KCk7XHJcbiAgICAgICAgdmFyIHRpY2tzID0gdGlja1ZhbHVlcyA9PSBudWxsID8gc2NhbGUxLnRpY2tzID8gc2NhbGUxLnRpY2tzLmFwcGx5KHNjYWxlMSwgdGlja0FyZ3VtZW50c18pIDogc2NhbGUxLmRvbWFpbigpIDogdGlja1ZhbHVlcywgdGlja0Zvcm1hdCA9IHRpY2tGb3JtYXRfID09IG51bGwgPyBzY2FsZTEudGlja0Zvcm1hdCA/IHNjYWxlMS50aWNrRm9ybWF0LmFwcGx5KHNjYWxlMSwgdGlja0FyZ3VtZW50c18pIDogZDNfaWRlbnRpdHkgOiB0aWNrRm9ybWF0XywgdGljayA9IGcuc2VsZWN0QWxsKFwiLnRpY2tcIikuZGF0YSh0aWNrcywgc2NhbGUxKSwgdGlja0VudGVyID0gdGljay5lbnRlcigpLmluc2VydChcImdcIiwgXCIuZG9tYWluXCIpLmF0dHIoXCJjbGFzc1wiLCBcInRpY2tcIikuc3R5bGUoXCJvcGFjaXR5XCIsIM61KSwgdGlja0V4aXQgPSBkMy50cmFuc2l0aW9uKHRpY2suZXhpdCgpKS5zdHlsZShcIm9wYWNpdHlcIiwgzrUpLnJlbW92ZSgpLCB0aWNrVXBkYXRlID0gZDMudHJhbnNpdGlvbih0aWNrLm9yZGVyKCkpLnN0eWxlKFwib3BhY2l0eVwiLCAxKSwgdGlja1NwYWNpbmcgPSBNYXRoLm1heChpbm5lclRpY2tTaXplLCAwKSArIHRpY2tQYWRkaW5nLCB0aWNrVHJhbnNmb3JtO1xyXG4gICAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUxKSwgcGF0aCA9IGcuc2VsZWN0QWxsKFwiLmRvbWFpblwiKS5kYXRhKFsgMCBdKSwgcGF0aFVwZGF0ZSA9IChwYXRoLmVudGVyKCkuYXBwZW5kKFwicGF0aFwiKS5hdHRyKFwiY2xhc3NcIiwgXCJkb21haW5cIiksIFxyXG4gICAgICAgIGQzLnRyYW5zaXRpb24ocGF0aCkpO1xyXG4gICAgICAgIHRpY2tFbnRlci5hcHBlbmQoXCJsaW5lXCIpO1xyXG4gICAgICAgIHRpY2tFbnRlci5hcHBlbmQoXCJ0ZXh0XCIpO1xyXG4gICAgICAgIHZhciBsaW5lRW50ZXIgPSB0aWNrRW50ZXIuc2VsZWN0KFwibGluZVwiKSwgbGluZVVwZGF0ZSA9IHRpY2tVcGRhdGUuc2VsZWN0KFwibGluZVwiKSwgdGV4dCA9IHRpY2suc2VsZWN0KFwidGV4dFwiKS50ZXh0KHRpY2tGb3JtYXQpLCB0ZXh0RW50ZXIgPSB0aWNrRW50ZXIuc2VsZWN0KFwidGV4dFwiKSwgdGV4dFVwZGF0ZSA9IHRpY2tVcGRhdGUuc2VsZWN0KFwidGV4dFwiKSwgc2lnbiA9IG9yaWVudCA9PT0gXCJ0b3BcIiB8fCBvcmllbnQgPT09IFwibGVmdFwiID8gLTEgOiAxLCB4MSwgeDIsIHkxLCB5MjtcclxuICAgICAgICBpZiAob3JpZW50ID09PSBcImJvdHRvbVwiIHx8IG9yaWVudCA9PT0gXCJ0b3BcIikge1xyXG4gICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWCwgeDEgPSBcInhcIiwgeTEgPSBcInlcIiwgeDIgPSBcIngyXCIsIHkyID0gXCJ5MlwiO1xyXG4gICAgICAgICAgdGV4dC5hdHRyKFwiZHlcIiwgc2lnbiA8IDAgPyBcIjBlbVwiIDogXCIuNzFlbVwiKS5zdHlsZShcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpO1xyXG4gICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKFwiZFwiLCBcIk1cIiArIHJhbmdlWzBdICsgXCIsXCIgKyBzaWduICogb3V0ZXJUaWNrU2l6ZSArIFwiVjBIXCIgKyByYW5nZVsxXSArIFwiVlwiICsgc2lnbiAqIG91dGVyVGlja1NpemUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNZLCB4MSA9IFwieVwiLCB5MSA9IFwieFwiLCB4MiA9IFwieTJcIiwgeTIgPSBcIngyXCI7XHJcbiAgICAgICAgICB0ZXh0LmF0dHIoXCJkeVwiLCBcIi4zMmVtXCIpLnN0eWxlKFwidGV4dC1hbmNob3JcIiwgc2lnbiA8IDAgPyBcImVuZFwiIDogXCJzdGFydFwiKTtcclxuICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cihcImRcIiwgXCJNXCIgKyBzaWduICogb3V0ZXJUaWNrU2l6ZSArIFwiLFwiICsgcmFuZ2VbMF0gKyBcIkgwVlwiICsgcmFuZ2VbMV0gKyBcIkhcIiArIHNpZ24gKiBvdXRlclRpY2tTaXplKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGluZUVudGVyLmF0dHIoeTIsIHNpZ24gKiBpbm5lclRpY2tTaXplKTtcclxuICAgICAgICB0ZXh0RW50ZXIuYXR0cih5MSwgc2lnbiAqIHRpY2tTcGFjaW5nKTtcclxuICAgICAgICBsaW5lVXBkYXRlLmF0dHIoeDIsIDApLmF0dHIoeTIsIHNpZ24gKiBpbm5lclRpY2tTaXplKTtcclxuICAgICAgICB0ZXh0VXBkYXRlLmF0dHIoeDEsIDApLmF0dHIoeTEsIHNpZ24gKiB0aWNrU3BhY2luZyk7XHJcbiAgICAgICAgaWYgKHNjYWxlMS5yYW5nZUJhbmQpIHtcclxuICAgICAgICAgIHZhciB4ID0gc2NhbGUxLCBkeCA9IHgucmFuZ2VCYW5kKCkgLyAyO1xyXG4gICAgICAgICAgc2NhbGUwID0gc2NhbGUxID0gZnVuY3Rpb24oZCkge1xyXG4gICAgICAgICAgICByZXR1cm4geChkKSArIGR4O1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNjYWxlMC5yYW5nZUJhbmQpIHtcclxuICAgICAgICAgIHNjYWxlMCA9IHNjYWxlMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGlja0V4aXQuY2FsbCh0aWNrVHJhbnNmb3JtLCBzY2FsZTEsIHNjYWxlMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMCwgc2NhbGUxKTtcclxuICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxLCBzY2FsZTEpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGF4aXMuc2NhbGUgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlO1xyXG4gICAgICBzY2FsZSA9IHg7XHJcbiAgICAgIHJldHVybiBheGlzO1xyXG4gICAgfTtcclxuICAgIGF4aXMub3JpZW50ID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmllbnQ7XHJcbiAgICAgIG9yaWVudCA9IHggaW4gZDNfc3ZnX2F4aXNPcmllbnRzID8geCArIFwiXCIgOiBkM19zdmdfYXhpc0RlZmF1bHRPcmllbnQ7XHJcbiAgICAgIHJldHVybiBheGlzO1xyXG4gICAgfTtcclxuICAgIGF4aXMudGlja3MgPSBmdW5jdGlvbigpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0FyZ3VtZW50c187XHJcbiAgICAgIHRpY2tBcmd1bWVudHNfID0gZDNfYXJyYXkoYXJndW1lbnRzKTtcclxuICAgICAgcmV0dXJuIGF4aXM7XHJcbiAgICB9O1xyXG4gICAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrVmFsdWVzO1xyXG4gICAgICB0aWNrVmFsdWVzID0geDtcclxuICAgICAgcmV0dXJuIGF4aXM7XHJcbiAgICB9O1xyXG4gICAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrRm9ybWF0XztcclxuICAgICAgdGlja0Zvcm1hdF8gPSB4O1xyXG4gICAgICByZXR1cm4gYXhpcztcclxuICAgIH07XHJcbiAgICBheGlzLnRpY2tTaXplID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XHJcbiAgICAgIGlmICghbikgcmV0dXJuIGlubmVyVGlja1NpemU7XHJcbiAgICAgIGlubmVyVGlja1NpemUgPSAreDtcclxuICAgICAgb3V0ZXJUaWNrU2l6ZSA9ICthcmd1bWVudHNbbiAtIDFdO1xyXG4gICAgICByZXR1cm4gYXhpcztcclxuICAgIH07XHJcbiAgICBheGlzLmlubmVyVGlja1NpemUgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGlubmVyVGlja1NpemU7XHJcbiAgICAgIGlubmVyVGlja1NpemUgPSAreDtcclxuICAgICAgcmV0dXJuIGF4aXM7XHJcbiAgICB9O1xyXG4gICAgYXhpcy5vdXRlclRpY2tTaXplID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvdXRlclRpY2tTaXplO1xyXG4gICAgICBvdXRlclRpY2tTaXplID0gK3g7XHJcbiAgICAgIHJldHVybiBheGlzO1xyXG4gICAgfTtcclxuICAgIGF4aXMudGlja1BhZGRpbmcgPSBmdW5jdGlvbih4KSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tQYWRkaW5nO1xyXG4gICAgICB0aWNrUGFkZGluZyA9ICt4O1xyXG4gICAgICByZXR1cm4gYXhpcztcclxuICAgIH07XHJcbiAgICBheGlzLnRpY2tTdWJkaXZpZGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggJiYgYXhpcztcclxuICAgIH07XHJcbiAgICByZXR1cm4gYXhpcztcclxuICB9O1xyXG4gIHZhciBkM19zdmdfYXhpc0RlZmF1bHRPcmllbnQgPSBcImJvdHRvbVwiLCBkM19zdmdfYXhpc09yaWVudHMgPSB7XHJcbiAgICB0b3A6IDEsXHJcbiAgICByaWdodDogMSxcclxuICAgIGJvdHRvbTogMSxcclxuICAgIGxlZnQ6IDFcclxuICB9O1xyXG4gIGZ1bmN0aW9uIGQzX3N2Z19heGlzWChzZWxlY3Rpb24sIHgwLCB4MSkge1xyXG4gICAgc2VsZWN0aW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24oZCkge1xyXG4gICAgICB2YXIgdjAgPSB4MChkKTtcclxuICAgICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgKGlzRmluaXRlKHYwKSA/IHYwIDogeDEoZCkpICsgXCIsMClcIjtcclxuICAgIH0pO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM19zdmdfYXhpc1koc2VsZWN0aW9uLCB5MCwgeTEpIHtcclxuICAgIHNlbGVjdGlvbi5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgICAgdmFyIHYwID0geTAoZCk7XHJcbiAgICAgIHJldHVybiBcInRyYW5zbGF0ZSgwLFwiICsgKGlzRmluaXRlKHYwKSA/IHYwIDogeTEoZCkpICsgXCIpXCI7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZDMuc3ZnLmJydXNoID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKGJydXNoLCBcImJydXNoc3RhcnRcIiwgXCJicnVzaFwiLCBcImJydXNoZW5kXCIpLCB4ID0gbnVsbCwgeSA9IG51bGwsIHhFeHRlbnQgPSBbIDAsIDAgXSwgeUV4dGVudCA9IFsgMCwgMCBdLCB4RXh0ZW50RG9tYWluLCB5RXh0ZW50RG9tYWluLCB4Q2xhbXAgPSB0cnVlLCB5Q2xhbXAgPSB0cnVlLCByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXTtcclxuICAgIGZ1bmN0aW9uIGJydXNoKGcpIHtcclxuICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBnID0gZDMuc2VsZWN0KHRoaXMpLnN0eWxlKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIikuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpLm9uKFwibW91c2Vkb3duLmJydXNoXCIsIGJydXNoc3RhcnQpLm9uKFwidG91Y2hzdGFydC5icnVzaFwiLCBicnVzaHN0YXJ0KTtcclxuICAgICAgICB2YXIgYmFja2dyb3VuZCA9IGcuc2VsZWN0QWxsKFwiLmJhY2tncm91bmRcIikuZGF0YShbIDAgXSk7XHJcbiAgICAgICAgYmFja2dyb3VuZC5lbnRlcigpLmFwcGVuZChcInJlY3RcIikuYXR0cihcImNsYXNzXCIsIFwiYmFja2dyb3VuZFwiKS5zdHlsZShcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIikuc3R5bGUoXCJjdXJzb3JcIiwgXCJjcm9zc2hhaXJcIik7XHJcbiAgICAgICAgZy5zZWxlY3RBbGwoXCIuZXh0ZW50XCIpLmRhdGEoWyAwIF0pLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKS5hdHRyKFwiY2xhc3NcIiwgXCJleHRlbnRcIikuc3R5bGUoXCJjdXJzb3JcIiwgXCJtb3ZlXCIpO1xyXG4gICAgICAgIHZhciByZXNpemUgPSBnLnNlbGVjdEFsbChcIi5yZXNpemVcIikuZGF0YShyZXNpemVzLCBkM19pZGVudGl0eSk7XHJcbiAgICAgICAgcmVzaXplLmV4aXQoKS5yZW1vdmUoKTtcclxuICAgICAgICByZXNpemUuZW50ZXIoKS5hcHBlbmQoXCJnXCIpLmF0dHIoXCJjbGFzc1wiLCBmdW5jdGlvbihkKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJyZXNpemUgXCIgKyBkO1xyXG4gICAgICAgIH0pLnN0eWxlKFwiY3Vyc29yXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgICAgICAgIHJldHVybiBkM19zdmdfYnJ1c2hDdXJzb3JbZF07XHJcbiAgICAgICAgfSkuYXBwZW5kKFwicmVjdFwiKS5hdHRyKFwieFwiLCBmdW5jdGlvbihkKSB7XHJcbiAgICAgICAgICByZXR1cm4gL1tld10kLy50ZXN0KGQpID8gLTMgOiBudWxsO1xyXG4gICAgICAgIH0pLmF0dHIoXCJ5XCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgICAgICAgIHJldHVybiAvXltuc10vLnRlc3QoZCkgPyAtMyA6IG51bGw7XHJcbiAgICAgICAgfSkuYXR0cihcIndpZHRoXCIsIDYpLmF0dHIoXCJoZWlnaHRcIiwgNikuc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xyXG4gICAgICAgIHJlc2l6ZS5zdHlsZShcImRpc3BsYXlcIiwgYnJ1c2guZW1wdHkoKSA/IFwibm9uZVwiIDogbnVsbCk7XHJcbiAgICAgICAgdmFyIGdVcGRhdGUgPSBkMy50cmFuc2l0aW9uKGcpLCBiYWNrZ3JvdW5kVXBkYXRlID0gZDMudHJhbnNpdGlvbihiYWNrZ3JvdW5kKSwgcmFuZ2U7XHJcbiAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgIHJhbmdlID0gZDNfc2NhbGVSYW5nZSh4KTtcclxuICAgICAgICAgIGJhY2tncm91bmRVcGRhdGUuYXR0cihcInhcIiwgcmFuZ2VbMF0pLmF0dHIoXCJ3aWR0aFwiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTtcclxuICAgICAgICAgIHJlZHJhd1goZ1VwZGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh5KSB7XHJcbiAgICAgICAgICByYW5nZSA9IGQzX3NjYWxlUmFuZ2UoeSk7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlLmF0dHIoXCJ5XCIsIHJhbmdlWzBdKS5hdHRyKFwiaGVpZ2h0XCIsIHJhbmdlWzFdIC0gcmFuZ2VbMF0pO1xyXG4gICAgICAgICAgcmVkcmF3WShnVXBkYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVkcmF3KGdVcGRhdGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGJydXNoLmV2ZW50ID0gZnVuY3Rpb24oZykge1xyXG4gICAgICBnLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGV2ZW50XyA9IGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cyksIGV4dGVudDEgPSB7XHJcbiAgICAgICAgICB4OiB4RXh0ZW50LFxyXG4gICAgICAgICAgeTogeUV4dGVudCxcclxuICAgICAgICAgIGk6IHhFeHRlbnREb21haW4sXHJcbiAgICAgICAgICBqOiB5RXh0ZW50RG9tYWluXHJcbiAgICAgICAgfSwgZXh0ZW50MCA9IHRoaXMuX19jaGFydF9fIHx8IGV4dGVudDE7XHJcbiAgICAgICAgdGhpcy5fX2NoYXJ0X18gPSBleHRlbnQxO1xyXG4gICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7XHJcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goXCJzdGFydC5icnVzaFwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgeEV4dGVudERvbWFpbiA9IGV4dGVudDAuaTtcclxuICAgICAgICAgICAgeUV4dGVudERvbWFpbiA9IGV4dGVudDAuajtcclxuICAgICAgICAgICAgeEV4dGVudCA9IGV4dGVudDAueDtcclxuICAgICAgICAgICAgeUV4dGVudCA9IGV4dGVudDAueTtcclxuICAgICAgICAgICAgZXZlbnRfKHtcclxuICAgICAgICAgICAgICB0eXBlOiBcImJydXNoc3RhcnRcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pLnR3ZWVuKFwiYnJ1c2g6YnJ1c2hcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciB4aSA9IGQzX2ludGVycG9sYXRlQXJyYXkoeEV4dGVudCwgZXh0ZW50MS54KSwgeWkgPSBkM19pbnRlcnBvbGF0ZUFycmF5KHlFeHRlbnQsIGV4dGVudDEueSk7XHJcbiAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSB5RXh0ZW50RG9tYWluID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcclxuICAgICAgICAgICAgICB4RXh0ZW50ID0gZXh0ZW50MS54ID0geGkodCk7XHJcbiAgICAgICAgICAgICAgeUV4dGVudCA9IGV4dGVudDEueSA9IHlpKHQpO1xyXG4gICAgICAgICAgICAgIGV2ZW50Xyh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcImJydXNoXCIsXHJcbiAgICAgICAgICAgICAgICBtb2RlOiBcInJlc2l6ZVwiXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KS5lYWNoKFwiZW5kLmJydXNoXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB4RXh0ZW50RG9tYWluID0gZXh0ZW50MS5pO1xyXG4gICAgICAgICAgICB5RXh0ZW50RG9tYWluID0gZXh0ZW50MS5qO1xyXG4gICAgICAgICAgICBldmVudF8oe1xyXG4gICAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hcIixcclxuICAgICAgICAgICAgICBtb2RlOiBcInJlc2l6ZVwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBldmVudF8oe1xyXG4gICAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hlbmRcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBldmVudF8oe1xyXG4gICAgICAgICAgICB0eXBlOiBcImJydXNoc3RhcnRcIlxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBldmVudF8oe1xyXG4gICAgICAgICAgICB0eXBlOiBcImJydXNoXCIsXHJcbiAgICAgICAgICAgIG1vZGU6IFwicmVzaXplXCJcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZXZlbnRfKHtcclxuICAgICAgICAgICAgdHlwZTogXCJicnVzaGVuZFwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIHJlZHJhdyhnKSB7XHJcbiAgICAgIGcuc2VsZWN0QWxsKFwiLnJlc2l6ZVwiKS5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgICAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB4RXh0ZW50WysvZSQvLnRlc3QoZCldICsgXCIsXCIgKyB5RXh0ZW50WysvXnMvLnRlc3QoZCldICsgXCIpXCI7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVkcmF3WChnKSB7XHJcbiAgICAgIGcuc2VsZWN0KFwiLmV4dGVudFwiKS5hdHRyKFwieFwiLCB4RXh0ZW50WzBdKTtcclxuICAgICAgZy5zZWxlY3RBbGwoXCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdFwiKS5hdHRyKFwid2lkdGhcIiwgeEV4dGVudFsxXSAtIHhFeHRlbnRbMF0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVkcmF3WShnKSB7XHJcbiAgICAgIGcuc2VsZWN0KFwiLmV4dGVudFwiKS5hdHRyKFwieVwiLCB5RXh0ZW50WzBdKTtcclxuICAgICAgZy5zZWxlY3RBbGwoXCIuZXh0ZW50LC5lPnJlY3QsLnc+cmVjdFwiKS5hdHRyKFwiaGVpZ2h0XCIsIHlFeHRlbnRbMV0gLSB5RXh0ZW50WzBdKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGJydXNoc3RhcnQoKSB7XHJcbiAgICAgIHZhciB0YXJnZXQgPSB0aGlzLCBldmVudFRhcmdldCA9IGQzLnNlbGVjdChkMy5ldmVudC50YXJnZXQpLCBldmVudF8gPSBldmVudC5vZih0YXJnZXQsIGFyZ3VtZW50cyksIGcgPSBkMy5zZWxlY3QodGFyZ2V0KSwgcmVzaXppbmcgPSBldmVudFRhcmdldC5kYXR1bSgpLCByZXNpemluZ1ggPSAhL14obnxzKSQvLnRlc3QocmVzaXppbmcpICYmIHgsIHJlc2l6aW5nWSA9ICEvXihlfHcpJC8udGVzdChyZXNpemluZykgJiYgeSwgZHJhZ2dpbmcgPSBldmVudFRhcmdldC5jbGFzc2VkKFwiZXh0ZW50XCIpLCBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0YXJnZXQpLCBjZW50ZXIsIG9yaWdpbiA9IGQzLm1vdXNlKHRhcmdldCksIG9mZnNldDtcclxuICAgICAgdmFyIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KHRhcmdldCkpLm9uKFwia2V5ZG93bi5icnVzaFwiLCBrZXlkb3duKS5vbihcImtleXVwLmJydXNoXCIsIGtleXVwKTtcclxuICAgICAgaWYgKGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XHJcbiAgICAgICAgdy5vbihcInRvdWNobW92ZS5icnVzaFwiLCBicnVzaG1vdmUpLm9uKFwidG91Y2hlbmQuYnJ1c2hcIiwgYnJ1c2hlbmQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHcub24oXCJtb3VzZW1vdmUuYnJ1c2hcIiwgYnJ1c2htb3ZlKS5vbihcIm1vdXNldXAuYnJ1c2hcIiwgYnJ1c2hlbmQpO1xyXG4gICAgICB9XHJcbiAgICAgIGcuaW50ZXJydXB0KCkuc2VsZWN0QWxsKFwiKlwiKS5pbnRlcnJ1cHQoKTtcclxuICAgICAgaWYgKGRyYWdnaW5nKSB7XHJcbiAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFswXSAtIG9yaWdpblswXTtcclxuICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50WzBdIC0gb3JpZ2luWzFdO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc2l6aW5nKSB7XHJcbiAgICAgICAgdmFyIGV4ID0gKy93JC8udGVzdChyZXNpemluZyksIGV5ID0gKy9ebi8udGVzdChyZXNpemluZyk7XHJcbiAgICAgICAgb2Zmc2V0ID0gWyB4RXh0ZW50WzEgLSBleF0gLSBvcmlnaW5bMF0sIHlFeHRlbnRbMSAtIGV5XSAtIG9yaWdpblsxXSBdO1xyXG4gICAgICAgIG9yaWdpblswXSA9IHhFeHRlbnRbZXhdO1xyXG4gICAgICAgIG9yaWdpblsxXSA9IHlFeHRlbnRbZXldO1xyXG4gICAgICB9IGVsc2UgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7XHJcbiAgICAgIGcuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIikuc2VsZWN0QWxsKFwiLnJlc2l6ZVwiKS5zdHlsZShcImRpc3BsYXlcIiwgbnVsbCk7XHJcbiAgICAgIGQzLnNlbGVjdChcImJvZHlcIikuc3R5bGUoXCJjdXJzb3JcIiwgZXZlbnRUYXJnZXQuc3R5bGUoXCJjdXJzb3JcIikpO1xyXG4gICAgICBldmVudF8oe1xyXG4gICAgICAgIHR5cGU6IFwiYnJ1c2hzdGFydFwiXHJcbiAgICAgIH0pO1xyXG4gICAgICBicnVzaG1vdmUoKTtcclxuICAgICAgZnVuY3Rpb24ga2V5ZG93bigpIHtcclxuICAgICAgICBpZiAoZDMuZXZlbnQua2V5Q29kZSA9PSAzMikge1xyXG4gICAgICAgICAgaWYgKCFkcmFnZ2luZykge1xyXG4gICAgICAgICAgICBjZW50ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICBvcmlnaW5bMF0gLT0geEV4dGVudFsxXTtcclxuICAgICAgICAgICAgb3JpZ2luWzFdIC09IHlFeHRlbnRbMV07XHJcbiAgICAgICAgICAgIGRyYWdnaW5nID0gMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24ga2V5dXAoKSB7XHJcbiAgICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIgJiYgZHJhZ2dpbmcgPT0gMikge1xyXG4gICAgICAgICAgb3JpZ2luWzBdICs9IHhFeHRlbnRbMV07XHJcbiAgICAgICAgICBvcmlnaW5bMV0gKz0geUV4dGVudFsxXTtcclxuICAgICAgICAgIGRyYWdnaW5nID0gMDtcclxuICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gYnJ1c2htb3ZlKCkge1xyXG4gICAgICAgIHZhciBwb2ludCA9IGQzLm1vdXNlKHRhcmdldCksIG1vdmVkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9mZnNldCkge1xyXG4gICAgICAgICAgcG9pbnRbMF0gKz0gb2Zmc2V0WzBdO1xyXG4gICAgICAgICAgcG9pbnRbMV0gKz0gb2Zmc2V0WzFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWRyYWdnaW5nKSB7XHJcbiAgICAgICAgICBpZiAoZDMuZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbICh4RXh0ZW50WzBdICsgeEV4dGVudFsxXSkgLyAyLCAoeUV4dGVudFswXSArIHlFeHRlbnRbMV0pIC8gMiBdO1xyXG4gICAgICAgICAgICBvcmlnaW5bMF0gPSB4RXh0ZW50WysocG9pbnRbMF0gPCBjZW50ZXJbMF0pXTtcclxuICAgICAgICAgICAgb3JpZ2luWzFdID0geUV4dGVudFsrKHBvaW50WzFdIDwgY2VudGVyWzFdKV07XHJcbiAgICAgICAgICB9IGVsc2UgY2VudGVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHtcclxuICAgICAgICAgIHJlZHJhd1goZyk7XHJcbiAgICAgICAgICBtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXNpemluZ1kgJiYgbW92ZTEocG9pbnQsIHksIDEpKSB7XHJcbiAgICAgICAgICByZWRyYXdZKGcpO1xyXG4gICAgICAgICAgbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobW92ZWQpIHtcclxuICAgICAgICAgIHJlZHJhdyhnKTtcclxuICAgICAgICAgIGV2ZW50Xyh7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hcIixcclxuICAgICAgICAgICAgbW9kZTogZHJhZ2dpbmcgPyBcIm1vdmVcIiA6IFwicmVzaXplXCJcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmdW5jdGlvbiBtb3ZlMShwb2ludCwgc2NhbGUsIGkpIHtcclxuICAgICAgICB2YXIgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHNjYWxlKSwgcjAgPSByYW5nZVswXSwgcjEgPSByYW5nZVsxXSwgcG9zaXRpb24gPSBvcmlnaW5baV0sIGV4dGVudCA9IGkgPyB5RXh0ZW50IDogeEV4dGVudCwgc2l6ZSA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwgbWluLCBtYXg7XHJcbiAgICAgICAgaWYgKGRyYWdnaW5nKSB7XHJcbiAgICAgICAgICByMCAtPSBwb3NpdGlvbjtcclxuICAgICAgICAgIHIxIC09IHNpemUgKyBwb3NpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWluID0gKGkgPyB5Q2xhbXAgOiB4Q2xhbXApID8gTWF0aC5tYXgocjAsIE1hdGgubWluKHIxLCBwb2ludFtpXSkpIDogcG9pbnRbaV07XHJcbiAgICAgICAgaWYgKGRyYWdnaW5nKSB7XHJcbiAgICAgICAgICBtYXggPSAobWluICs9IHBvc2l0aW9uKSArIHNpemU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChjZW50ZXIpIHBvc2l0aW9uID0gTWF0aC5tYXgocjAsIE1hdGgubWluKHIxLCAyICogY2VudGVyW2ldIC0gbWluKSk7XHJcbiAgICAgICAgICBpZiAocG9zaXRpb24gPCBtaW4pIHtcclxuICAgICAgICAgICAgbWF4ID0gbWluO1xyXG4gICAgICAgICAgICBtaW4gPSBwb3NpdGlvbjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1heCA9IHBvc2l0aW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXh0ZW50WzBdICE9IG1pbiB8fCBleHRlbnRbMV0gIT0gbWF4KSB7XHJcbiAgICAgICAgICBpZiAoaSkgeUV4dGVudERvbWFpbiA9IG51bGw7IGVsc2UgeEV4dGVudERvbWFpbiA9IG51bGw7XHJcbiAgICAgICAgICBleHRlbnRbMF0gPSBtaW47XHJcbiAgICAgICAgICBleHRlbnRbMV0gPSBtYXg7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gYnJ1c2hlbmQoKSB7XHJcbiAgICAgICAgYnJ1c2htb3ZlKCk7XHJcbiAgICAgICAgZy5zdHlsZShcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpLnNlbGVjdEFsbChcIi5yZXNpemVcIikuc3R5bGUoXCJkaXNwbGF5XCIsIGJydXNoLmVtcHR5KCkgPyBcIm5vbmVcIiA6IG51bGwpO1xyXG4gICAgICAgIGQzLnNlbGVjdChcImJvZHlcIikuc3R5bGUoXCJjdXJzb3JcIiwgbnVsbCk7XHJcbiAgICAgICAgdy5vbihcIm1vdXNlbW92ZS5icnVzaFwiLCBudWxsKS5vbihcIm1vdXNldXAuYnJ1c2hcIiwgbnVsbCkub24oXCJ0b3VjaG1vdmUuYnJ1c2hcIiwgbnVsbCkub24oXCJ0b3VjaGVuZC5icnVzaFwiLCBudWxsKS5vbihcImtleWRvd24uYnJ1c2hcIiwgbnVsbCkub24oXCJrZXl1cC5icnVzaFwiLCBudWxsKTtcclxuICAgICAgICBkcmFnUmVzdG9yZSgpO1xyXG4gICAgICAgIGV2ZW50Xyh7XHJcbiAgICAgICAgICB0eXBlOiBcImJydXNoZW5kXCJcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYnJ1c2gueCA9IGZ1bmN0aW9uKHopIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDtcclxuICAgICAgeCA9IHo7XHJcbiAgICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWyF4IDw8IDEgfCAheV07XHJcbiAgICAgIHJldHVybiBicnVzaDtcclxuICAgIH07XHJcbiAgICBicnVzaC55ID0gZnVuY3Rpb24oeikge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5O1xyXG4gICAgICB5ID0gejtcclxuICAgICAgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbIXggPDwgMSB8ICF5XTtcclxuICAgICAgcmV0dXJuIGJydXNoO1xyXG4gICAgfTtcclxuICAgIGJydXNoLmNsYW1wID0gZnVuY3Rpb24oeikge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4ICYmIHkgPyBbIHhDbGFtcCwgeUNsYW1wIF0gOiB4ID8geENsYW1wIDogeSA/IHlDbGFtcCA6IG51bGw7XHJcbiAgICAgIGlmICh4ICYmIHkpIHhDbGFtcCA9ICEhelswXSwgeUNsYW1wID0gISF6WzFdOyBlbHNlIGlmICh4KSB4Q2xhbXAgPSAhIXo7IGVsc2UgaWYgKHkpIHlDbGFtcCA9ICEhejtcclxuICAgICAgcmV0dXJuIGJydXNoO1xyXG4gICAgfTtcclxuICAgIGJydXNoLmV4dGVudCA9IGZ1bmN0aW9uKHopIHtcclxuICAgICAgdmFyIHgwLCB4MSwgeTAsIHkxLCB0O1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgaWYgKHhFeHRlbnREb21haW4pIHtcclxuICAgICAgICAgICAgeDAgPSB4RXh0ZW50RG9tYWluWzBdLCB4MSA9IHhFeHRlbnREb21haW5bMV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB4MCA9IHhFeHRlbnRbMF0sIHgxID0geEV4dGVudFsxXTtcclxuICAgICAgICAgICAgaWYgKHguaW52ZXJ0KSB4MCA9IHguaW52ZXJ0KHgwKSwgeDEgPSB4LmludmVydCh4MSk7XHJcbiAgICAgICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHkpIHtcclxuICAgICAgICAgIGlmICh5RXh0ZW50RG9tYWluKSB7XHJcbiAgICAgICAgICAgIHkwID0geUV4dGVudERvbWFpblswXSwgeTEgPSB5RXh0ZW50RG9tYWluWzFdO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgeTAgPSB5RXh0ZW50WzBdLCB5MSA9IHlFeHRlbnRbMV07XHJcbiAgICAgICAgICAgIGlmICh5LmludmVydCkgeTAgPSB5LmludmVydCh5MCksIHkxID0geS5pbnZlcnQoeTEpO1xyXG4gICAgICAgICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB4ICYmIHkgPyBbIFsgeDAsIHkwIF0sIFsgeDEsIHkxIF0gXSA6IHggPyBbIHgwLCB4MSBdIDogeSAmJiBbIHkwLCB5MSBdO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgeDAgPSB6WzBdLCB4MSA9IHpbMV07XHJcbiAgICAgICAgaWYgKHkpIHgwID0geDBbMF0sIHgxID0geDFbMF07XHJcbiAgICAgICAgeEV4dGVudERvbWFpbiA9IFsgeDAsIHgxIF07XHJcbiAgICAgICAgaWYgKHguaW52ZXJ0KSB4MCA9IHgoeDApLCB4MSA9IHgoeDEpO1xyXG4gICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDtcclxuICAgICAgICBpZiAoeDAgIT0geEV4dGVudFswXSB8fCB4MSAhPSB4RXh0ZW50WzFdKSB4RXh0ZW50ID0gWyB4MCwgeDEgXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoeSkge1xyXG4gICAgICAgIHkwID0gelswXSwgeTEgPSB6WzFdO1xyXG4gICAgICAgIGlmICh4KSB5MCA9IHkwWzFdLCB5MSA9IHkxWzFdO1xyXG4gICAgICAgIHlFeHRlbnREb21haW4gPSBbIHkwLCB5MSBdO1xyXG4gICAgICAgIGlmICh5LmludmVydCkgeTAgPSB5KHkwKSwgeTEgPSB5KHkxKTtcclxuICAgICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7XHJcbiAgICAgICAgaWYgKHkwICE9IHlFeHRlbnRbMF0gfHwgeTEgIT0geUV4dGVudFsxXSkgeUV4dGVudCA9IFsgeTAsIHkxIF07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGJydXNoO1xyXG4gICAgfTtcclxuICAgIGJydXNoLmNsZWFyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIGlmICghYnJ1c2guZW1wdHkoKSkge1xyXG4gICAgICAgIHhFeHRlbnQgPSBbIDAsIDAgXSwgeUV4dGVudCA9IFsgMCwgMCBdO1xyXG4gICAgICAgIHhFeHRlbnREb21haW4gPSB5RXh0ZW50RG9tYWluID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYnJ1c2g7XHJcbiAgICB9O1xyXG4gICAgYnJ1c2guZW1wdHkgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuICEheCAmJiB4RXh0ZW50WzBdID09IHhFeHRlbnRbMV0gfHwgISF5ICYmIHlFeHRlbnRbMF0gPT0geUV4dGVudFsxXTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gZDMucmViaW5kKGJydXNoLCBldmVudCwgXCJvblwiKTtcclxuICB9O1xyXG4gIHZhciBkM19zdmdfYnJ1c2hDdXJzb3IgPSB7XHJcbiAgICBuOiBcIm5zLXJlc2l6ZVwiLFxyXG4gICAgZTogXCJldy1yZXNpemVcIixcclxuICAgIHM6IFwibnMtcmVzaXplXCIsXHJcbiAgICB3OiBcImV3LXJlc2l6ZVwiLFxyXG4gICAgbnc6IFwibndzZS1yZXNpemVcIixcclxuICAgIG5lOiBcIm5lc3ctcmVzaXplXCIsXHJcbiAgICBzZTogXCJud3NlLXJlc2l6ZVwiLFxyXG4gICAgc3c6IFwibmVzdy1yZXNpemVcIlxyXG4gIH07XHJcbiAgdmFyIGQzX3N2Z19icnVzaFJlc2l6ZXMgPSBbIFsgXCJuXCIsIFwiZVwiLCBcInNcIiwgXCJ3XCIsIFwibndcIiwgXCJuZVwiLCBcInNlXCIsIFwic3dcIiBdLCBbIFwiZVwiLCBcIndcIiBdLCBbIFwiblwiLCBcInNcIiBdLCBbXSBdO1xyXG4gIHZhciBkM190aW1lX2Zvcm1hdCA9IGQzX3RpbWUuZm9ybWF0ID0gZDNfbG9jYWxlX2VuVVMudGltZUZvcm1hdDtcclxuICB2YXIgZDNfdGltZV9mb3JtYXRVdGMgPSBkM190aW1lX2Zvcm1hdC51dGM7XHJcbiAgdmFyIGQzX3RpbWVfZm9ybWF0SXNvID0gZDNfdGltZV9mb3JtYXRVdGMoXCIlWS0lbS0lZFQlSDolTTolUy4lTFpcIik7XHJcbiAgZDNfdGltZV9mb3JtYXQuaXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgJiYgK25ldyBEYXRlKFwiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaXCIpID8gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUgOiBkM190aW1lX2Zvcm1hdElzbztcclxuICBmdW5jdGlvbiBkM190aW1lX2Zvcm1hdElzb05hdGl2ZShkYXRlKSB7XHJcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xyXG4gIH1cclxuICBkM190aW1lX2Zvcm1hdElzb05hdGl2ZS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykge1xyXG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpO1xyXG4gICAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7XHJcbiAgfTtcclxuICBkM190aW1lX2Zvcm1hdElzb05hdGl2ZS50b1N0cmluZyA9IGQzX3RpbWVfZm9ybWF0SXNvLnRvU3RyaW5nO1xyXG4gIGQzX3RpbWUuc2Vjb25kID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XHJcbiAgICByZXR1cm4gbmV3IGQzX2RhdGUoTWF0aC5mbG9vcihkYXRlIC8gMWUzKSAqIDFlMyk7XHJcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XHJcbiAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiAxZTMpO1xyXG4gIH0sIGZ1bmN0aW9uKGRhdGUpIHtcclxuICAgIHJldHVybiBkYXRlLmdldFNlY29uZHMoKTtcclxuICB9KTtcclxuICBkM190aW1lLnNlY29uZHMgPSBkM190aW1lLnNlY29uZC5yYW5nZTtcclxuICBkM190aW1lLnNlY29uZHMudXRjID0gZDNfdGltZS5zZWNvbmQudXRjLnJhbmdlO1xyXG4gIGQzX3RpbWUubWludXRlID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XHJcbiAgICByZXR1cm4gbmV3IGQzX2RhdGUoTWF0aC5mbG9vcihkYXRlIC8gNmU0KSAqIDZlNCk7XHJcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XHJcbiAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiA2ZTQpO1xyXG4gIH0sIGZ1bmN0aW9uKGRhdGUpIHtcclxuICAgIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTtcclxuICB9KTtcclxuICBkM190aW1lLm1pbnV0ZXMgPSBkM190aW1lLm1pbnV0ZS5yYW5nZTtcclxuICBkM190aW1lLm1pbnV0ZXMudXRjID0gZDNfdGltZS5taW51dGUudXRjLnJhbmdlO1xyXG4gIGQzX3RpbWUuaG91ciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgdmFyIHRpbWV6b25lID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjA7XHJcbiAgICByZXR1cm4gbmV3IGQzX2RhdGUoKE1hdGguZmxvb3IoZGF0ZSAvIDM2ZTUgLSB0aW1lem9uZSkgKyB0aW1lem9uZSkgKiAzNmU1KTtcclxuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcclxuICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDM2ZTUpO1xyXG4gIH0sIGZ1bmN0aW9uKGRhdGUpIHtcclxuICAgIHJldHVybiBkYXRlLmdldEhvdXJzKCk7XHJcbiAgfSk7XHJcbiAgZDNfdGltZS5ob3VycyA9IGQzX3RpbWUuaG91ci5yYW5nZTtcclxuICBkM190aW1lLmhvdXJzLnV0YyA9IGQzX3RpbWUuaG91ci51dGMucmFuZ2U7XHJcbiAgZDNfdGltZS5tb250aCA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgZGF0ZSA9IGQzX3RpbWUuZGF5KGRhdGUpO1xyXG4gICAgZGF0ZS5zZXREYXRlKDEpO1xyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XHJcbiAgICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIG9mZnNldCk7XHJcbiAgfSwgZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTtcclxuICB9KTtcclxuICBkM190aW1lLm1vbnRocyA9IGQzX3RpbWUubW9udGgucmFuZ2U7XHJcbiAgZDNfdGltZS5tb250aHMudXRjID0gZDNfdGltZS5tb250aC51dGMucmFuZ2U7XHJcbiAgZnVuY3Rpb24gZDNfdGltZV9zY2FsZShsaW5lYXIsIG1ldGhvZHMsIGZvcm1hdCkge1xyXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xyXG4gICAgICByZXR1cm4gbGluZWFyKHgpO1xyXG4gICAgfVxyXG4gICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICByZXR1cm4gZDNfdGltZV9zY2FsZURhdGUobGluZWFyLmludmVydCh4KSk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5lYXIuZG9tYWluKCkubWFwKGQzX3RpbWVfc2NhbGVEYXRlKTtcclxuICAgICAgbGluZWFyLmRvbWFpbih4KTtcclxuICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIHRpY2tNZXRob2QoZXh0ZW50LCBjb3VudCkge1xyXG4gICAgICB2YXIgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwgdGFyZ2V0ID0gc3BhbiAvIGNvdW50LCBpID0gZDMuYmlzZWN0KGQzX3RpbWVfc2NhbGVTdGVwcywgdGFyZ2V0KTtcclxuICAgICAgcmV0dXJuIGkgPT0gZDNfdGltZV9zY2FsZVN0ZXBzLmxlbmd0aCA/IFsgbWV0aG9kcy55ZWFyLCBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZXh0ZW50Lm1hcChmdW5jdGlvbihkKSB7XHJcbiAgICAgICAgcmV0dXJuIGQgLyAzMTUzNmU2O1xyXG4gICAgICB9KSwgY291bnQpWzJdIF0gOiAhaSA/IFsgZDNfdGltZV9zY2FsZU1pbGxpc2Vjb25kcywgZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGV4dGVudCwgY291bnQpWzJdIF0gOiBtZXRob2RzW3RhcmdldCAvIGQzX3RpbWVfc2NhbGVTdGVwc1tpIC0gMV0gPCBkM190aW1lX3NjYWxlU3RlcHNbaV0gLyB0YXJnZXQgPyBpIC0gMSA6IGldO1xyXG4gICAgfVxyXG4gICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsLCBza2lwKSB7XHJcbiAgICAgIHZhciBkb21haW4gPSBzY2FsZS5kb21haW4oKSwgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSwgbWV0aG9kID0gaW50ZXJ2YWwgPT0gbnVsbCA/IHRpY2tNZXRob2QoZXh0ZW50LCAxMCkgOiB0eXBlb2YgaW50ZXJ2YWwgPT09IFwibnVtYmVyXCIgJiYgdGlja01ldGhvZChleHRlbnQsIGludGVydmFsKTtcclxuICAgICAgaWYgKG1ldGhvZCkgaW50ZXJ2YWwgPSBtZXRob2RbMF0sIHNraXAgPSBtZXRob2RbMV07XHJcbiAgICAgIGZ1bmN0aW9uIHNraXBwZWQoZGF0ZSkge1xyXG4gICAgICAgIHJldHVybiAhaXNOYU4oZGF0ZSkgJiYgIWludGVydmFsLnJhbmdlKGRhdGUsIGQzX3RpbWVfc2NhbGVEYXRlKCtkYXRlICsgMSksIHNraXApLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gc2NhbGUuZG9tYWluKGQzX3NjYWxlX25pY2UoZG9tYWluLCBza2lwID4gMSA/IHtcclxuICAgICAgICBmbG9vcjogZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgICAgICAgd2hpbGUgKHNraXBwZWQoZGF0ZSA9IGludGVydmFsLmZsb29yKGRhdGUpKSkgZGF0ZSA9IGQzX3RpbWVfc2NhbGVEYXRlKGRhdGUgLSAxKTtcclxuICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2VpbDogZnVuY3Rpb24oZGF0ZSkge1xyXG4gICAgICAgICAgd2hpbGUgKHNraXBwZWQoZGF0ZSA9IGludGVydmFsLmNlaWwoZGF0ZSkpKSBkYXRlID0gZDNfdGltZV9zY2FsZURhdGUoK2RhdGUgKyAxKTtcclxuICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSA6IGludGVydmFsKSk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihpbnRlcnZhbCwgc2tpcCkge1xyXG4gICAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpLCBtZXRob2QgPSBpbnRlcnZhbCA9PSBudWxsID8gdGlja01ldGhvZChleHRlbnQsIDEwKSA6IHR5cGVvZiBpbnRlcnZhbCA9PT0gXCJudW1iZXJcIiA/IHRpY2tNZXRob2QoZXh0ZW50LCBpbnRlcnZhbCkgOiAhaW50ZXJ2YWwucmFuZ2UgJiYgWyB7XHJcbiAgICAgICAgcmFuZ2U6IGludGVydmFsXHJcbiAgICAgIH0sIHNraXAgXTtcclxuICAgICAgaWYgKG1ldGhvZCkgaW50ZXJ2YWwgPSBtZXRob2RbMF0sIHNraXAgPSBtZXRob2RbMV07XHJcbiAgICAgIHJldHVybiBpbnRlcnZhbC5yYW5nZShleHRlbnRbMF0sIGQzX3RpbWVfc2NhbGVEYXRlKCtleHRlbnRbMV0gKyAxKSwgc2tpcCA8IDEgPyAxIDogc2tpcCk7XHJcbiAgICB9O1xyXG4gICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gZm9ybWF0O1xyXG4gICAgfTtcclxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIGQzX3RpbWVfc2NhbGUobGluZWFyLmNvcHkoKSwgbWV0aG9kcywgZm9ybWF0KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpO1xyXG4gIH1cclxuICBmdW5jdGlvbiBkM190aW1lX3NjYWxlRGF0ZSh0KSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUodCk7XHJcbiAgfVxyXG4gIHZhciBkM190aW1lX3NjYWxlU3RlcHMgPSBbIDFlMywgNWUzLCAxNWUzLCAzZTQsIDZlNCwgM2U1LCA5ZTUsIDE4ZTUsIDM2ZTUsIDEwOGU1LCAyMTZlNSwgNDMyZTUsIDg2NGU1LCAxNzI4ZTUsIDYwNDhlNSwgMjU5MmU2LCA3Nzc2ZTYsIDMxNTM2ZTYgXTtcclxuICB2YXIgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcyA9IFsgWyBkM190aW1lLnNlY29uZCwgMSBdLCBbIGQzX3RpbWUuc2Vjb25kLCA1IF0sIFsgZDNfdGltZS5zZWNvbmQsIDE1IF0sIFsgZDNfdGltZS5zZWNvbmQsIDMwIF0sIFsgZDNfdGltZS5taW51dGUsIDEgXSwgWyBkM190aW1lLm1pbnV0ZSwgNSBdLCBbIGQzX3RpbWUubWludXRlLCAxNSBdLCBbIGQzX3RpbWUubWludXRlLCAzMCBdLCBbIGQzX3RpbWUuaG91ciwgMSBdLCBbIGQzX3RpbWUuaG91ciwgMyBdLCBbIGQzX3RpbWUuaG91ciwgNiBdLCBbIGQzX3RpbWUuaG91ciwgMTIgXSwgWyBkM190aW1lLmRheSwgMSBdLCBbIGQzX3RpbWUuZGF5LCAyIF0sIFsgZDNfdGltZS53ZWVrLCAxIF0sIFsgZDNfdGltZS5tb250aCwgMSBdLCBbIGQzX3RpbWUubW9udGgsIDMgXSwgWyBkM190aW1lLnllYXIsIDEgXSBdO1xyXG4gIHZhciBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXQgPSBkM190aW1lX2Zvcm1hdC5tdWx0aShbIFsgXCIuJUxcIiwgZnVuY3Rpb24oZCkge1xyXG4gICAgcmV0dXJuIGQuZ2V0TWlsbGlzZWNvbmRzKCk7XHJcbiAgfSBdLCBbIFwiOiVTXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgIHJldHVybiBkLmdldFNlY29uZHMoKTtcclxuICB9IF0sIFsgXCIlSTolTVwiLCBmdW5jdGlvbihkKSB7XHJcbiAgICByZXR1cm4gZC5nZXRNaW51dGVzKCk7XHJcbiAgfSBdLCBbIFwiJUkgJXBcIiwgZnVuY3Rpb24oZCkge1xyXG4gICAgcmV0dXJuIGQuZ2V0SG91cnMoKTtcclxuICB9IF0sIFsgXCIlYSAlZFwiLCBmdW5jdGlvbihkKSB7XHJcbiAgICByZXR1cm4gZC5nZXREYXkoKSAmJiBkLmdldERhdGUoKSAhPSAxO1xyXG4gIH0gXSwgWyBcIiViICVkXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgIHJldHVybiBkLmdldERhdGUoKSAhPSAxO1xyXG4gIH0gXSwgWyBcIiVCXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgIHJldHVybiBkLmdldE1vbnRoKCk7XHJcbiAgfSBdLCBbIFwiJVlcIiwgZDNfdHJ1ZSBdIF0pO1xyXG4gIHZhciBkM190aW1lX3NjYWxlTWlsbGlzZWNvbmRzID0ge1xyXG4gICAgcmFuZ2U6IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XHJcbiAgICAgIHJldHVybiBkMy5yYW5nZShNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKSAqIHN0ZXAsICtzdG9wLCBzdGVwKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpO1xyXG4gICAgfSxcclxuICAgIGZsb29yOiBkM19pZGVudGl0eSxcclxuICAgIGNlaWw6IGQzX2lkZW50aXR5XHJcbiAgfTtcclxuICBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLnllYXIgPSBkM190aW1lLnllYXI7XHJcbiAgZDNfdGltZS5zY2FsZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMsIGQzX3RpbWVfc2NhbGVMb2NhbEZvcm1hdCk7XHJcbiAgfTtcclxuICB2YXIgZDNfdGltZV9zY2FsZVV0Y01ldGhvZHMgPSBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLm1hcChmdW5jdGlvbihtKSB7XHJcbiAgICByZXR1cm4gWyBtWzBdLnV0YywgbVsxXSBdO1xyXG4gIH0pO1xyXG4gIHZhciBkM190aW1lX3NjYWxlVXRjRm9ybWF0ID0gZDNfdGltZV9mb3JtYXRVdGMubXVsdGkoWyBbIFwiLiVMXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgIHJldHVybiBkLmdldFVUQ01pbGxpc2Vjb25kcygpO1xyXG4gIH0gXSwgWyBcIjolU1wiLCBmdW5jdGlvbihkKSB7XHJcbiAgICByZXR1cm4gZC5nZXRVVENTZWNvbmRzKCk7XHJcbiAgfSBdLCBbIFwiJUk6JU1cIiwgZnVuY3Rpb24oZCkge1xyXG4gICAgcmV0dXJuIGQuZ2V0VVRDTWludXRlcygpO1xyXG4gIH0gXSwgWyBcIiVJICVwXCIsIGZ1bmN0aW9uKGQpIHtcclxuICAgIHJldHVybiBkLmdldFVUQ0hvdXJzKCk7XHJcbiAgfSBdLCBbIFwiJWEgJWRcIiwgZnVuY3Rpb24oZCkge1xyXG4gICAgcmV0dXJuIGQuZ2V0VVRDRGF5KCkgJiYgZC5nZXRVVENEYXRlKCkgIT0gMTtcclxuICB9IF0sIFsgXCIlYiAlZFwiLCBmdW5jdGlvbihkKSB7XHJcbiAgICByZXR1cm4gZC5nZXRVVENEYXRlKCkgIT0gMTtcclxuICB9IF0sIFsgXCIlQlwiLCBmdW5jdGlvbihkKSB7XHJcbiAgICByZXR1cm4gZC5nZXRVVENNb250aCgpO1xyXG4gIH0gXSwgWyBcIiVZXCIsIGQzX3RydWUgXSBdKTtcclxuICBkM190aW1lX3NjYWxlVXRjTWV0aG9kcy55ZWFyID0gZDNfdGltZS55ZWFyLnV0YztcclxuICBkM190aW1lLnNjYWxlLnV0YyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVVdGNNZXRob2RzLCBkM190aW1lX3NjYWxlVXRjRm9ybWF0KTtcclxuICB9O1xyXG4gIGQzLnRleHQgPSBkM194aHJUeXBlKGZ1bmN0aW9uKHJlcXVlc3QpIHtcclxuICAgIHJldHVybiByZXF1ZXN0LnJlc3BvbnNlVGV4dDtcclxuICB9KTtcclxuICBkMy5qc29uID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xyXG4gICAgcmV0dXJuIGQzX3hocih1cmwsIFwiYXBwbGljYXRpb24vanNvblwiLCBkM19qc29uLCBjYWxsYmFjayk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19qc29uKHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcclxuICB9XHJcbiAgZDMuaHRtbCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcclxuICAgIHJldHVybiBkM194aHIodXJsLCBcInRleHQvaHRtbFwiLCBkM19odG1sLCBjYWxsYmFjayk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBkM19odG1sKHJlcXVlc3QpIHtcclxuICAgIHZhciByYW5nZSA9IGQzX2RvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICByYW5nZS5zZWxlY3ROb2RlKGQzX2RvY3VtZW50LmJvZHkpO1xyXG4gICAgcmV0dXJuIHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgfVxyXG4gIGQzLnhtbCA9IGQzX3hoclR5cGUoZnVuY3Rpb24ocmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIHJlcXVlc3QucmVzcG9uc2VYTUw7XHJcbiAgfSk7XHJcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB0aGlzLmQzID0gZDMsIGRlZmluZShkMyk7IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZDM7IGVsc2UgdGhpcy5kMyA9IGQzO1xyXG59KCk7IiwiLyoqXHJcbiAqIFN0YXRlLWJhc2VkIHJvdXRpbmcgZm9yIEFuZ3VsYXJKU1xyXG4gKiBAdmVyc2lvbiB2MC4zLjJcclxuICogQGxpbmsgaHR0cDovL2FuZ3VsYXItdWkuZ2l0aHViLmNvbS9cclxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2UsIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXHJcbiAqL1xyXG5cclxuLyogY29tbW9uanMgcGFja2FnZSBtYW5hZ2VyIHN1cHBvcnQgKGVnIGNvbXBvbmVudGpzKSAqL1xyXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgZXhwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cyA9PT0gZXhwb3J0cyl7XHJcbiAgbW9kdWxlLmV4cG9ydHMgPSAndWkucm91dGVyJztcclxufVxyXG5cclxuKGZ1bmN0aW9uICh3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkge1xyXG4vKmpzaGludCBnbG9iYWxzdHJpY3Q6dHJ1ZSovXHJcbi8qZ2xvYmFsIGFuZ3VsYXI6ZmFsc2UqL1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgaXNEZWZpbmVkID0gYW5ndWxhci5pc0RlZmluZWQsXHJcbiAgICBpc0Z1bmN0aW9uID0gYW5ndWxhci5pc0Z1bmN0aW9uLFxyXG4gICAgaXNTdHJpbmcgPSBhbmd1bGFyLmlzU3RyaW5nLFxyXG4gICAgaXNPYmplY3QgPSBhbmd1bGFyLmlzT2JqZWN0LFxyXG4gICAgaXNBcnJheSA9IGFuZ3VsYXIuaXNBcnJheSxcclxuICAgIGZvckVhY2ggPSBhbmd1bGFyLmZvckVhY2gsXHJcbiAgICBleHRlbmQgPSBhbmd1bGFyLmV4dGVuZCxcclxuICAgIGNvcHkgPSBhbmd1bGFyLmNvcHksXHJcbiAgICB0b0pzb24gPSBhbmd1bGFyLnRvSnNvbjtcclxuXHJcbmZ1bmN0aW9uIGluaGVyaXQocGFyZW50LCBleHRyYSkge1xyXG4gIHJldHVybiBleHRlbmQobmV3IChleHRlbmQoZnVuY3Rpb24oKSB7fSwgeyBwcm90b3R5cGU6IHBhcmVudCB9KSkoKSwgZXh0cmEpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZShkc3QpIHtcclxuICBmb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24ob2JqKSB7XHJcbiAgICBpZiAob2JqICE9PSBkc3QpIHtcclxuICAgICAgZm9yRWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcclxuICAgICAgICBpZiAoIWRzdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSBkc3Rba2V5XSA9IHZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gZHN0O1xyXG59XHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGNvbW1vbiBhbmNlc3RvciBwYXRoIGJldHdlZW4gdHdvIHN0YXRlcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGZpcnN0IFRoZSBmaXJzdCBzdGF0ZS5cclxuICogQHBhcmFtIHtPYmplY3R9IHNlY29uZCBUaGUgc2Vjb25kIHN0YXRlLlxyXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBzdGF0ZSBuYW1lcyBpbiBkZXNjZW5kaW5nIG9yZGVyLCBub3QgaW5jbHVkaW5nIHRoZSByb290LlxyXG4gKi9cclxuZnVuY3Rpb24gYW5jZXN0b3JzKGZpcnN0LCBzZWNvbmQpIHtcclxuICB2YXIgcGF0aCA9IFtdO1xyXG5cclxuICBmb3IgKHZhciBuIGluIGZpcnN0LnBhdGgpIHtcclxuICAgIGlmIChmaXJzdC5wYXRoW25dICE9PSBzZWNvbmQucGF0aFtuXSkgYnJlYWs7XHJcbiAgICBwYXRoLnB1c2goZmlyc3QucGF0aFtuXSk7XHJcbiAgfVxyXG4gIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG4vKipcclxuICogSUU4LXNhZmUgd3JhcHBlciBmb3IgYE9iamVjdC5rZXlzKClgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IEEgSmF2YVNjcmlwdCBvYmplY3QuXHJcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QgYXMgYW4gYXJyYXkuXHJcbiAqL1xyXG5mdW5jdGlvbiBvYmplY3RLZXlzKG9iamVjdCkge1xyXG4gIGlmIChPYmplY3Qua2V5cykge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7XHJcbiAgfVxyXG4gIHZhciByZXN1bHQgPSBbXTtcclxuXHJcbiAgZm9yRWFjaChvYmplY3QsIGZ1bmN0aW9uKHZhbCwga2V5KSB7XHJcbiAgICByZXN1bHQucHVzaChrZXkpO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJRTgtc2FmZSB3cmFwcGVyIGZvciBgQXJyYXkucHJvdG90eXBlLmluZGV4T2YoKWAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IEEgSmF2YVNjcmlwdCBhcnJheS5cclxuICogQHBhcmFtIHsqfSB2YWx1ZSBBIHZhbHVlIHRvIHNlYXJjaCB0aGUgYXJyYXkgZm9yLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFJldHVybnMgdGhlIGFycmF5IGluZGV4IHZhbHVlIG9mIGB2YWx1ZWAsIG9yIGAtMWAgaWYgbm90IHByZXNlbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSkge1xyXG4gIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xyXG4gICAgcmV0dXJuIGFycmF5LmluZGV4T2YodmFsdWUsIE51bWJlcihhcmd1bWVudHNbMl0pIHx8IDApO1xyXG4gIH1cclxuICB2YXIgbGVuID0gYXJyYXkubGVuZ3RoID4+PiAwLCBmcm9tID0gTnVtYmVyKGFyZ3VtZW50c1syXSkgfHwgMDtcclxuICBmcm9tID0gKGZyb20gPCAwKSA/IE1hdGguY2VpbChmcm9tKSA6IE1hdGguZmxvb3IoZnJvbSk7XHJcblxyXG4gIGlmIChmcm9tIDwgMCkgZnJvbSArPSBsZW47XHJcblxyXG4gIGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspIHtcclxuICAgIGlmIChmcm9tIGluIGFycmF5ICYmIGFycmF5W2Zyb21dID09PSB2YWx1ZSkgcmV0dXJuIGZyb207XHJcbiAgfVxyXG4gIHJldHVybiAtMTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1lcmdlcyBhIHNldCBvZiBwYXJhbWV0ZXJzIHdpdGggYWxsIHBhcmFtZXRlcnMgaW5oZXJpdGVkIGJldHdlZW4gdGhlIGNvbW1vbiBwYXJlbnRzIG9mIHRoZVxyXG4gKiBjdXJyZW50IHN0YXRlIGFuZCBhIGdpdmVuIGRlc3RpbmF0aW9uIHN0YXRlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3VycmVudFBhcmFtcyBUaGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgc3RhdGUgcGFyYW1ldGVycyAoJHN0YXRlUGFyYW1zKS5cclxuICogQHBhcmFtIHtPYmplY3R9IG5ld1BhcmFtcyBUaGUgc2V0IG9mIHBhcmFtZXRlcnMgd2hpY2ggd2lsbCBiZSBjb21wb3NpdGVkIHdpdGggaW5oZXJpdGVkIHBhcmFtcy5cclxuICogQHBhcmFtIHtPYmplY3R9ICRjdXJyZW50IEludGVybmFsIGRlZmluaXRpb24gb2Ygb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZS5cclxuICogQHBhcmFtIHtPYmplY3R9ICR0byBJbnRlcm5hbCBkZWZpbml0aW9uIG9mIG9iamVjdCByZXByZXNlbnRpbmcgc3RhdGUgdG8gdHJhbnNpdGlvbiB0by5cclxuICovXHJcbmZ1bmN0aW9uIGluaGVyaXRQYXJhbXMoY3VycmVudFBhcmFtcywgbmV3UGFyYW1zLCAkY3VycmVudCwgJHRvKSB7XHJcbiAgdmFyIHBhcmVudHMgPSBhbmNlc3RvcnMoJGN1cnJlbnQsICR0byksIHBhcmVudFBhcmFtcywgaW5oZXJpdGVkID0ge30sIGluaGVyaXRMaXN0ID0gW107XHJcblxyXG4gIGZvciAodmFyIGkgaW4gcGFyZW50cykge1xyXG4gICAgaWYgKCFwYXJlbnRzW2ldIHx8ICFwYXJlbnRzW2ldLnBhcmFtcykgY29udGludWU7XHJcbiAgICBwYXJlbnRQYXJhbXMgPSBvYmplY3RLZXlzKHBhcmVudHNbaV0ucGFyYW1zKTtcclxuICAgIGlmICghcGFyZW50UGFyYW1zLmxlbmd0aCkgY29udGludWU7XHJcblxyXG4gICAgZm9yICh2YXIgaiBpbiBwYXJlbnRQYXJhbXMpIHtcclxuICAgICAgaWYgKGluZGV4T2YoaW5oZXJpdExpc3QsIHBhcmVudFBhcmFtc1tqXSkgPj0gMCkgY29udGludWU7XHJcbiAgICAgIGluaGVyaXRMaXN0LnB1c2gocGFyZW50UGFyYW1zW2pdKTtcclxuICAgICAgaW5oZXJpdGVkW3BhcmVudFBhcmFtc1tqXV0gPSBjdXJyZW50UGFyYW1zW3BhcmVudFBhcmFtc1tqXV07XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBleHRlbmQoe30sIGluaGVyaXRlZCwgbmV3UGFyYW1zKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbm9uLXN0cmljdCBjb21wYXJpc29uIG9mIHRoZSBzdWJzZXQgb2YgdHdvIG9iamVjdHMsIGRlZmluZWQgYnkgYSBsaXN0IG9mIGtleXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBmaXJzdCBvYmplY3QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBzZWNvbmQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBsaXN0IG9mIGtleXMgd2l0aGluIGVhY2ggb2JqZWN0IHRvIGNvbXBhcmUuIElmIHRoZSBsaXN0IGlzIGVtcHR5IG9yIG5vdCBzcGVjaWZpZWQsXHJcbiAqICAgICAgICAgICAgICAgICAgICAgaXQgZGVmYXVsdHMgdG8gdGhlIGxpc3Qgb2Yga2V5cyBpbiBgYWAuXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBrZXlzIG1hdGNoLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbmZ1bmN0aW9uIGVxdWFsRm9yS2V5cyhhLCBiLCBrZXlzKSB7XHJcbiAgaWYgKCFrZXlzKSB7XHJcbiAgICBrZXlzID0gW107XHJcbiAgICBmb3IgKHZhciBuIGluIGEpIGtleXMucHVzaChuKTsgLy8gVXNlZCBpbnN0ZWFkIG9mIE9iamVjdC5rZXlzKCkgZm9yIElFOCBjb21wYXRpYmlsaXR5XHJcbiAgfVxyXG5cclxuICBmb3IgKHZhciBpPTA7IGk8a2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgdmFyIGsgPSBrZXlzW2ldO1xyXG4gICAgaWYgKGFba10gIT0gYltrXSkgcmV0dXJuIGZhbHNlOyAvLyBOb3QgJz09PScsIHZhbHVlcyBhcmVuJ3QgbmVjZXNzYXJpbHkgbm9ybWFsaXplZFxyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1YnNldCBvZiBhbiBvYmplY3QsIGJhc2VkIG9uIGEgbGlzdCBvZiBrZXlzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXNcclxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyBhIHN1YnNldCBvZiBgdmFsdWVzYC5cclxuICovXHJcbmZ1bmN0aW9uIGZpbHRlckJ5S2V5cyhrZXlzLCB2YWx1ZXMpIHtcclxuICB2YXIgZmlsdGVyZWQgPSB7fTtcclxuXHJcbiAgZm9yRWFjaChrZXlzLCBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgZmlsdGVyZWRbbmFtZV0gPSB2YWx1ZXNbbmFtZV07XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGZpbHRlcmVkO1xyXG59XHJcblxyXG4vLyBsaWtlIF8uaW5kZXhCeVxyXG4vLyB3aGVuIHlvdSBrbm93IHRoYXQgeW91ciBpbmRleCB2YWx1ZXMgd2lsbCBiZSB1bmlxdWUsIG9yIHlvdSB3YW50IGxhc3Qtb25lLWluIHRvIHdpblxyXG5mdW5jdGlvbiBpbmRleEJ5KGFycmF5LCBwcm9wTmFtZSkge1xyXG4gIHZhciByZXN1bHQgPSB7fTtcclxuICBmb3JFYWNoKGFycmF5LCBmdW5jdGlvbihpdGVtKSB7XHJcbiAgICByZXN1bHRbaXRlbVtwcm9wTmFtZV1dID0gaXRlbTtcclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vLyBleHRyYWN0ZWQgZnJvbSB1bmRlcnNjb3JlLmpzXHJcbi8vIFJldHVybiBhIGNvcHkgb2YgdGhlIG9iamVjdCBvbmx5IGNvbnRhaW5pbmcgdGhlIHdoaXRlbGlzdGVkIHByb3BlcnRpZXMuXHJcbmZ1bmN0aW9uIHBpY2sob2JqKSB7XHJcbiAgdmFyIGNvcHkgPSB7fTtcclxuICB2YXIga2V5cyA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoQXJyYXkucHJvdG90eXBlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcclxuICBmb3JFYWNoKGtleXMsIGZ1bmN0aW9uKGtleSkge1xyXG4gICAgaWYgKGtleSBpbiBvYmopIGNvcHlba2V5XSA9IG9ialtrZXldO1xyXG4gIH0pO1xyXG4gIHJldHVybiBjb3B5O1xyXG59XHJcblxyXG4vLyBleHRyYWN0ZWQgZnJvbSB1bmRlcnNjb3JlLmpzXHJcbi8vIFJldHVybiBhIGNvcHkgb2YgdGhlIG9iamVjdCBvbWl0dGluZyB0aGUgYmxhY2tsaXN0ZWQgcHJvcGVydGllcy5cclxuZnVuY3Rpb24gb21pdChvYmopIHtcclxuICB2YXIgY29weSA9IHt9O1xyXG4gIHZhciBrZXlzID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShBcnJheS5wcm90b3R5cGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xyXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcclxuICAgIGlmIChpbmRleE9mKGtleXMsIGtleSkgPT0gLTEpIGNvcHlba2V5XSA9IG9ialtrZXldO1xyXG4gIH1cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGx1Y2soY29sbGVjdGlvbiwga2V5KSB7XHJcbiAgdmFyIHJlc3VsdCA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBbXSA6IHt9O1xyXG5cclxuICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbCwgaSkge1xyXG4gICAgcmVzdWx0W2ldID0gaXNGdW5jdGlvbihrZXkpID8ga2V5KHZhbCkgOiB2YWxba2V5XTtcclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgY2FsbGJhY2spIHtcclxuICB2YXIgYXJyYXkgPSBpc0FycmF5KGNvbGxlY3Rpb24pO1xyXG4gIHZhciByZXN1bHQgPSBhcnJheSA/IFtdIDoge307XHJcbiAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWwsIGkpIHtcclxuICAgIGlmIChjYWxsYmFjayh2YWwsIGkpKSB7XHJcbiAgICAgIHJlc3VsdFthcnJheSA/IHJlc3VsdC5sZW5ndGggOiBpXSA9IHZhbDtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgY2FsbGJhY2spIHtcclxuICB2YXIgcmVzdWx0ID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IFtdIDoge307XHJcblxyXG4gIGZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsLCBpKSB7XHJcbiAgICByZXN1bHRbaV0gPSBjYWxsYmFjayh2YWwsIGkpO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8vIGlzc3VlICMyNjc2ICMyODg5XHJcbmZ1bmN0aW9uIHNpbGVuY2VVbmNhdWdodEluUHJvbWlzZSAocHJvbWlzZSkge1xyXG4gIHJldHVybiBwcm9taXNlLnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbigpIHt9KSAmJiBwcm9taXNlO1xyXG59XHJcblxyXG4vKipcclxuICogQG5nZG9jIG92ZXJ2aWV3XHJcbiAqIEBuYW1lIHVpLnJvdXRlci51dGlsXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiAjIHVpLnJvdXRlci51dGlsIHN1Yi1tb2R1bGVcclxuICpcclxuICogVGhpcyBtb2R1bGUgaXMgYSBkZXBlbmRlbmN5IG9mIG90aGVyIHN1Yi1tb2R1bGVzLiBEbyBub3QgaW5jbHVkZSB0aGlzIG1vZHVsZSBhcyBhIGRlcGVuZGVuY3lcclxuICogaW4geW91ciBhbmd1bGFyIGFwcCAodXNlIHtAbGluayB1aS5yb3V0ZXJ9IG1vZHVsZSBpbnN0ZWFkKS5cclxuICpcclxuICovXHJcbmFuZ3VsYXIubW9kdWxlKCd1aS5yb3V0ZXIudXRpbCcsIFsnbmcnXSk7XHJcblxyXG4vKipcclxuICogQG5nZG9jIG92ZXJ2aWV3XHJcbiAqIEBuYW1lIHVpLnJvdXRlci5yb3V0ZXJcclxuICogXHJcbiAqIEByZXF1aXJlcyB1aS5yb3V0ZXIudXRpbFxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogIyB1aS5yb3V0ZXIucm91dGVyIHN1Yi1tb2R1bGVcclxuICpcclxuICogVGhpcyBtb2R1bGUgaXMgYSBkZXBlbmRlbmN5IG9mIG90aGVyIHN1Yi1tb2R1bGVzLiBEbyBub3QgaW5jbHVkZSB0aGlzIG1vZHVsZSBhcyBhIGRlcGVuZGVuY3lcclxuICogaW4geW91ciBhbmd1bGFyIGFwcCAodXNlIHtAbGluayB1aS5yb3V0ZXJ9IG1vZHVsZSBpbnN0ZWFkKS5cclxuICovXHJcbmFuZ3VsYXIubW9kdWxlKCd1aS5yb3V0ZXIucm91dGVyJywgWyd1aS5yb3V0ZXIudXRpbCddKTtcclxuXHJcbi8qKlxyXG4gKiBAbmdkb2Mgb3ZlcnZpZXdcclxuICogQG5hbWUgdWkucm91dGVyLnN0YXRlXHJcbiAqIFxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnJvdXRlclxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnV0aWxcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqICMgdWkucm91dGVyLnN0YXRlIHN1Yi1tb2R1bGVcclxuICpcclxuICogVGhpcyBtb2R1bGUgaXMgYSBkZXBlbmRlbmN5IG9mIHRoZSBtYWluIHVpLnJvdXRlciBtb2R1bGUuIERvIG5vdCBpbmNsdWRlIHRoaXMgbW9kdWxlIGFzIGEgZGVwZW5kZW5jeVxyXG4gKiBpbiB5b3VyIGFuZ3VsYXIgYXBwICh1c2Uge0BsaW5rIHVpLnJvdXRlcn0gbW9kdWxlIGluc3RlYWQpLlxyXG4gKiBcclxuICovXHJcbmFuZ3VsYXIubW9kdWxlKCd1aS5yb3V0ZXIuc3RhdGUnLCBbJ3VpLnJvdXRlci5yb3V0ZXInLCAndWkucm91dGVyLnV0aWwnXSk7XHJcblxyXG4vKipcclxuICogQG5nZG9jIG92ZXJ2aWV3XHJcbiAqIEBuYW1lIHVpLnJvdXRlclxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnN0YXRlXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiAjIHVpLnJvdXRlclxyXG4gKiBcclxuICogIyMgVGhlIG1haW4gbW9kdWxlIGZvciB1aS5yb3V0ZXIgXHJcbiAqIFRoZXJlIGFyZSBzZXZlcmFsIHN1Yi1tb2R1bGVzIGluY2x1ZGVkIHdpdGggdGhlIHVpLnJvdXRlciBtb2R1bGUsIGhvd2V2ZXIgb25seSB0aGlzIG1vZHVsZSBpcyBuZWVkZWRcclxuICogYXMgYSBkZXBlbmRlbmN5IHdpdGhpbiB5b3VyIGFuZ3VsYXIgYXBwLiBUaGUgb3RoZXIgbW9kdWxlcyBhcmUgZm9yIG9yZ2FuaXphdGlvbiBwdXJwb3Nlcy4gXHJcbiAqXHJcbiAqIFRoZSBtb2R1bGVzIGFyZTpcclxuICogKiB1aS5yb3V0ZXIgLSB0aGUgbWFpbiBcInVtYnJlbGxhXCIgbW9kdWxlXHJcbiAqICogdWkucm91dGVyLnJvdXRlciAtIFxyXG4gKiBcclxuICogKllvdSdsbCBuZWVkIHRvIGluY2x1ZGUgKipvbmx5KiogdGhpcyBtb2R1bGUgYXMgdGhlIGRlcGVuZGVuY3kgd2l0aGluIHlvdXIgYW5ndWxhciBhcHAuKlxyXG4gKiBcclxuICogPHByZT5cclxuICogPCFkb2N0eXBlIGh0bWw+XHJcbiAqIDxodG1sIG5nLWFwcD1cIm15QXBwXCI+XHJcbiAqIDxoZWFkPlxyXG4gKiAgIDxzY3JpcHQgc3JjPVwianMvYW5ndWxhci5qc1wiPjwvc2NyaXB0PlxyXG4gKiAgIDwhLS0gSW5jbHVkZSB0aGUgdWktcm91dGVyIHNjcmlwdCAtLT5cclxuICogICA8c2NyaXB0IHNyYz1cImpzL2FuZ3VsYXItdWktcm91dGVyLm1pbi5qc1wiPjwvc2NyaXB0PlxyXG4gKiAgIDxzY3JpcHQ+XHJcbiAqICAgICAvLyAuLi5hbmQgYWRkICd1aS5yb3V0ZXInIGFzIGEgZGVwZW5kZW5jeVxyXG4gKiAgICAgdmFyIG15QXBwID0gYW5ndWxhci5tb2R1bGUoJ215QXBwJywgWyd1aS5yb3V0ZXInXSk7XHJcbiAqICAgPC9zY3JpcHQ+XHJcbiAqIDwvaGVhZD5cclxuICogPGJvZHk+XHJcbiAqIDwvYm9keT5cclxuICogPC9odG1sPlxyXG4gKiA8L3ByZT5cclxuICovXHJcbmFuZ3VsYXIubW9kdWxlKCd1aS5yb3V0ZXInLCBbJ3VpLnJvdXRlci5zdGF0ZSddKTtcclxuXHJcbmFuZ3VsYXIubW9kdWxlKCd1aS5yb3V0ZXIuY29tcGF0JywgWyd1aS5yb3V0ZXInXSk7XHJcblxyXG4vKipcclxuICogQG5nZG9jIG9iamVjdFxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC4kcmVzb2x2ZVxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgJHFcclxuICogQHJlcXVpcmVzICRpbmplY3RvclxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogTWFuYWdlcyByZXNvbHV0aW9uIG9mIChhY3ljbGljKSBncmFwaHMgb2YgcHJvbWlzZXMuXHJcbiAqL1xyXG4kUmVzb2x2ZS4kaW5qZWN0ID0gWyckcScsICckaW5qZWN0b3InXTtcclxuZnVuY3Rpb24gJFJlc29sdmUoICAkcSwgICAgJGluamVjdG9yKSB7XHJcbiAgXHJcbiAgdmFyIFZJU0lUX0lOX1BST0dSRVNTID0gMSxcclxuICAgICAgVklTSVRfRE9ORSA9IDIsXHJcbiAgICAgIE5PVEhJTkcgPSB7fSxcclxuICAgICAgTk9fREVQRU5ERU5DSUVTID0gW10sXHJcbiAgICAgIE5PX0xPQ0FMUyA9IE5PVEhJTkcsXHJcbiAgICAgIE5PX1BBUkVOVCA9IGV4dGVuZCgkcS53aGVuKE5PVEhJTkcpLCB7ICQkcHJvbWlzZXM6IE5PVEhJTkcsICQkdmFsdWVzOiBOT1RISU5HIH0pO1xyXG4gIFxyXG5cclxuICAvKipcclxuICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC4kcmVzb2x2ZSNzdHVkeVxyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kcmVzb2x2ZVxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogU3R1ZGllcyBhIHNldCBvZiBpbnZvY2FibGVzIHRoYXQgYXJlIGxpa2VseSB0byBiZSB1c2VkIG11bHRpcGxlIHRpbWVzLlxyXG4gICAqIDxwcmU+XHJcbiAgICogJHJlc29sdmUuc3R1ZHkoaW52b2NhYmxlcykobG9jYWxzLCBwYXJlbnQsIHNlbGYpXHJcbiAgICogPC9wcmU+XHJcbiAgICogaXMgZXF1aXZhbGVudCB0b1xyXG4gICAqIDxwcmU+XHJcbiAgICogJHJlc29sdmUucmVzb2x2ZShpbnZvY2FibGVzLCBsb2NhbHMsIHBhcmVudCwgc2VsZilcclxuICAgKiA8L3ByZT5cclxuICAgKiBidXQgdGhlIGZvcm1lciBpcyBtb3JlIGVmZmljaWVudCAoaW4gZmFjdCBgcmVzb2x2ZWAganVzdCBjYWxscyBgc3R1ZHlgIFxyXG4gICAqIGludGVybmFsbHkpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IGludm9jYWJsZXMgSW52b2NhYmxlIG9iamVjdHNcclxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gYSBmdW5jdGlvbiB0byBwYXNzIGluIGxvY2FscywgcGFyZW50IGFuZCBzZWxmXHJcbiAgICovXHJcbiAgdGhpcy5zdHVkeSA9IGZ1bmN0aW9uIChpbnZvY2FibGVzKSB7XHJcbiAgICBpZiAoIWlzT2JqZWN0KGludm9jYWJsZXMpKSB0aHJvdyBuZXcgRXJyb3IoXCInaW52b2NhYmxlcycgbXVzdCBiZSBhbiBvYmplY3RcIik7XHJcbiAgICB2YXIgaW52b2NhYmxlS2V5cyA9IG9iamVjdEtleXMoaW52b2NhYmxlcyB8fCB7fSk7XHJcbiAgICBcclxuICAgIC8vIFBlcmZvcm0gYSB0b3BvbG9naWNhbCBzb3J0IG9mIGludm9jYWJsZXMgdG8gYnVpbGQgYW4gb3JkZXJlZCBwbGFuXHJcbiAgICB2YXIgcGxhbiA9IFtdLCBjeWNsZSA9IFtdLCB2aXNpdGVkID0ge307XHJcbiAgICBmdW5jdGlvbiB2aXNpdCh2YWx1ZSwga2V5KSB7XHJcbiAgICAgIGlmICh2aXNpdGVkW2tleV0gPT09IFZJU0lUX0RPTkUpIHJldHVybjtcclxuICAgICAgXHJcbiAgICAgIGN5Y2xlLnB1c2goa2V5KTtcclxuICAgICAgaWYgKHZpc2l0ZWRba2V5XSA9PT0gVklTSVRfSU5fUFJPR1JFU1MpIHtcclxuICAgICAgICBjeWNsZS5zcGxpY2UoMCwgaW5kZXhPZihjeWNsZSwga2V5KSk7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3ljbGljIGRlcGVuZGVuY3k6IFwiICsgY3ljbGUuam9pbihcIiAtPiBcIikpO1xyXG4gICAgICB9XHJcbiAgICAgIHZpc2l0ZWRba2V5XSA9IFZJU0lUX0lOX1BST0dSRVNTO1xyXG4gICAgICBcclxuICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xyXG4gICAgICAgIHBsYW4ucHVzaChrZXksIFsgZnVuY3Rpb24oKSB7IHJldHVybiAkaW5qZWN0b3IuZ2V0KHZhbHVlKTsgfV0sIE5PX0RFUEVOREVOQ0lFUyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFyIHBhcmFtcyA9ICRpbmplY3Rvci5hbm5vdGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIChwYXJhbSkge1xyXG4gICAgICAgICAgaWYgKHBhcmFtICE9PSBrZXkgJiYgaW52b2NhYmxlcy5oYXNPd25Qcm9wZXJ0eShwYXJhbSkpIHZpc2l0KGludm9jYWJsZXNbcGFyYW1dLCBwYXJhbSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcGxhbi5wdXNoKGtleSwgdmFsdWUsIHBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGN5Y2xlLnBvcCgpO1xyXG4gICAgICB2aXNpdGVkW2tleV0gPSBWSVNJVF9ET05FO1xyXG4gICAgfVxyXG4gICAgZm9yRWFjaChpbnZvY2FibGVzLCB2aXNpdCk7XHJcbiAgICBpbnZvY2FibGVzID0gY3ljbGUgPSB2aXNpdGVkID0gbnVsbDsgLy8gcGxhbiBpcyBhbGwgdGhhdCdzIHJlcXVpcmVkXHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIGlzUmVzb2x2ZSh2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIHZhbHVlLnRoZW4gJiYgdmFsdWUuJCRwcm9taXNlcztcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChsb2NhbHMsIHBhcmVudCwgc2VsZikge1xyXG4gICAgICBpZiAoaXNSZXNvbHZlKGxvY2FscykgJiYgc2VsZiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgc2VsZiA9IHBhcmVudDsgcGFyZW50ID0gbG9jYWxzOyBsb2NhbHMgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghbG9jYWxzKSBsb2NhbHMgPSBOT19MT0NBTFM7XHJcbiAgICAgIGVsc2UgaWYgKCFpc09iamVjdChsb2NhbHMpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2xvY2FscycgbXVzdCBiZSBhbiBvYmplY3RcIik7XHJcbiAgICAgIH0gICAgICAgXHJcbiAgICAgIGlmICghcGFyZW50KSBwYXJlbnQgPSBOT19QQVJFTlQ7XHJcbiAgICAgIGVsc2UgaWYgKCFpc1Jlc29sdmUocGFyZW50KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIidwYXJlbnQnIG11c3QgYmUgYSBwcm9taXNlIHJldHVybmVkIGJ5ICRyZXNvbHZlLnJlc29sdmUoKVwiKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gVG8gY29tcGxldGUgdGhlIG92ZXJhbGwgcmVzb2x1dGlvbiwgd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgcGFyZW50XHJcbiAgICAgIC8vIHByb21pc2UgYW5kIGZvciB0aGUgcHJvbWlzZSBmb3IgZWFjaCBpbnZva2FibGUgaW4gb3VyIHBsYW4uXHJcbiAgICAgIHZhciByZXNvbHV0aW9uID0gJHEuZGVmZXIoKSxcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc29sdXRpb24ucHJvbWlzZSxcclxuICAgICAgICAgIHByb21pc2VzID0gcmVzdWx0LiQkcHJvbWlzZXMgPSB7fSxcclxuICAgICAgICAgIHZhbHVlcyA9IGV4dGVuZCh7fSwgbG9jYWxzKSxcclxuICAgICAgICAgIHdhaXQgPSAxICsgcGxhbi5sZW5ndGgvMyxcclxuICAgICAgICAgIG1lcmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XHJcbiAgICAgICAgLy8gTWVyZ2UgcGFyZW50IHZhbHVlcyB3ZSBoYXZlbid0IGdvdCB5ZXQgYW5kIHB1Ymxpc2ggb3VyIG93biAkJHZhbHVlc1xyXG4gICAgICAgIGlmICghLS13YWl0KSB7XHJcbiAgICAgICAgICBpZiAoIW1lcmdlZCkgbWVyZ2UodmFsdWVzLCBwYXJlbnQuJCR2YWx1ZXMpOyBcclxuICAgICAgICAgIHJlc3VsdC4kJHZhbHVlcyA9IHZhbHVlcztcclxuICAgICAgICAgIHJlc3VsdC4kJHByb21pc2VzID0gcmVzdWx0LiQkcHJvbWlzZXMgfHwgdHJ1ZTsgLy8ga2VlcCBmb3IgaXNSZXNvbHZlKClcclxuICAgICAgICAgIGRlbGV0ZSByZXN1bHQuJCRpbmhlcml0ZWRWYWx1ZXM7XHJcbiAgICAgICAgICByZXNvbHV0aW9uLnJlc29sdmUodmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGZ1bmN0aW9uIGZhaWwocmVhc29uKSB7XHJcbiAgICAgICAgcmVzdWx0LiQkZmFpbHVyZSA9IHJlYXNvbjtcclxuICAgICAgICByZXNvbHV0aW9uLnJlamVjdChyZWFzb24pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIHBhcmVudCBoYXMgYWxyZWFkeSBmYWlsZWRcclxuICAgICAgaWYgKGlzRGVmaW5lZChwYXJlbnQuJCRmYWlsdXJlKSkge1xyXG4gICAgICAgIGZhaWwocGFyZW50LiQkZmFpbHVyZSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgaWYgKHBhcmVudC4kJGluaGVyaXRlZFZhbHVlcykge1xyXG4gICAgICAgIG1lcmdlKHZhbHVlcywgb21pdChwYXJlbnQuJCRpbmhlcml0ZWRWYWx1ZXMsIGludm9jYWJsZUtleXMpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTWVyZ2UgcGFyZW50IHZhbHVlcyBpZiB0aGUgcGFyZW50IGhhcyBhbHJlYWR5IHJlc29sdmVkLCBvciBtZXJnZVxyXG4gICAgICAvLyBwYXJlbnQgcHJvbWlzZXMgYW5kIHdhaXQgaWYgdGhlIHBhcmVudCByZXNvbHZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxyXG4gICAgICBleHRlbmQocHJvbWlzZXMsIHBhcmVudC4kJHByb21pc2VzKTtcclxuICAgICAgaWYgKHBhcmVudC4kJHZhbHVlcykge1xyXG4gICAgICAgIG1lcmdlZCA9IG1lcmdlKHZhbHVlcywgb21pdChwYXJlbnQuJCR2YWx1ZXMsIGludm9jYWJsZUtleXMpKTtcclxuICAgICAgICByZXN1bHQuJCRpbmhlcml0ZWRWYWx1ZXMgPSBvbWl0KHBhcmVudC4kJHZhbHVlcywgaW52b2NhYmxlS2V5cyk7XHJcbiAgICAgICAgZG9uZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChwYXJlbnQuJCRpbmhlcml0ZWRWYWx1ZXMpIHtcclxuICAgICAgICAgIHJlc3VsdC4kJGluaGVyaXRlZFZhbHVlcyA9IG9taXQocGFyZW50LiQkaW5oZXJpdGVkVmFsdWVzLCBpbnZvY2FibGVLZXlzKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICBwYXJlbnQudGhlbihkb25lLCBmYWlsKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUHJvY2VzcyBlYWNoIGludm9jYWJsZSBpbiB0aGUgcGxhbiwgYnV0IGlnbm9yZSBhbnkgd2hlcmUgYSBsb2NhbCBvZiB0aGUgc2FtZSBuYW1lIGV4aXN0cy5cclxuICAgICAgZm9yICh2YXIgaT0wLCBpaT1wbGFuLmxlbmd0aDsgaTxpaTsgaSs9Mykge1xyXG4gICAgICAgIGlmIChsb2NhbHMuaGFzT3duUHJvcGVydHkocGxhbltpXSkpIGRvbmUoKTtcclxuICAgICAgICBlbHNlIGludm9rZShwbGFuW2ldLCBwbGFuW2krMV0sIHBsYW5baSsyXSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGZ1bmN0aW9uIGludm9rZShrZXksIGludm9jYWJsZSwgcGFyYW1zKSB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgZGVmZXJyZWQgZm9yIHRoaXMgaW52b2NhdGlvbi4gRmFpbHVyZXMgd2lsbCBwcm9wYWdhdGUgdG8gdGhlIHJlc29sdXRpb24gYXMgd2VsbC5cclxuICAgICAgICB2YXIgaW52b2NhdGlvbiA9ICRxLmRlZmVyKCksIHdhaXRQYXJhbXMgPSAwO1xyXG4gICAgICAgIGZ1bmN0aW9uIG9uZmFpbHVyZShyZWFzb24pIHtcclxuICAgICAgICAgIGludm9jYXRpb24ucmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICBmYWlsKHJlYXNvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFdhaXQgZm9yIGFueSBwYXJhbWV0ZXIgdGhhdCB3ZSBoYXZlIGEgcHJvbWlzZSBmb3IgKGVpdGhlciBmcm9tIHBhcmVudCBvciBmcm9tIHRoaXNcclxuICAgICAgICAvLyByZXNvbHZlOyBpbiB0aGF0IGNhc2Ugc3R1ZHkoKSB3aWxsIGhhdmUgbWFkZSBzdXJlIGl0J3Mgb3JkZXJlZCBiZWZvcmUgdXMgaW4gdGhlIHBsYW4pLlxyXG4gICAgICAgIGZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiAoZGVwKSB7XHJcbiAgICAgICAgICBpZiAocHJvbWlzZXMuaGFzT3duUHJvcGVydHkoZGVwKSAmJiAhbG9jYWxzLmhhc093blByb3BlcnR5KGRlcCkpIHtcclxuICAgICAgICAgICAgd2FpdFBhcmFtcysrO1xyXG4gICAgICAgICAgICBwcm9taXNlc1tkZXBdLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgIHZhbHVlc1tkZXBdID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgIGlmICghKC0td2FpdFBhcmFtcykpIHByb2NlZWQoKTtcclxuICAgICAgICAgICAgfSwgb25mYWlsdXJlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIXdhaXRQYXJhbXMpIHByb2NlZWQoKTtcclxuICAgICAgICBmdW5jdGlvbiBwcm9jZWVkKCkge1xyXG4gICAgICAgICAgaWYgKGlzRGVmaW5lZChyZXN1bHQuJCRmYWlsdXJlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaW52b2NhdGlvbi5yZXNvbHZlKCRpbmplY3Rvci5pbnZva2UoaW52b2NhYmxlLCBzZWxmLCB2YWx1ZXMpKTtcclxuICAgICAgICAgICAgaW52b2NhdGlvbi5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgIHZhbHVlc1trZXldID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgIGRvbmUoKTtcclxuICAgICAgICAgICAgfSwgb25mYWlsdXJlKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25mYWlsdXJlKGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQdWJsaXNoIHByb21pc2Ugc3luY2hyb25vdXNseTsgaW52b2NhdGlvbnMgZnVydGhlciBkb3duIGluIHRoZSBwbGFuIG1heSBkZXBlbmQgb24gaXQuXHJcbiAgICAgICAgcHJvbWlzZXNba2V5XSA9IGludm9jYXRpb24ucHJvbWlzZTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgfTtcclxuICBcclxuICAvKipcclxuICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC4kcmVzb2x2ZSNyZXNvbHZlXHJcbiAgICogQG1ldGhvZE9mIHVpLnJvdXRlci51dGlsLiRyZXNvbHZlXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBSZXNvbHZlcyBhIHNldCBvZiBpbnZvY2FibGVzLiBBbiBpbnZvY2FibGUgaXMgYSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHZpYSBcclxuICAgKiBgJGluamVjdG9yLmludm9rZSgpYCwgYW5kIGNhbiBoYXZlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzLiBcclxuICAgKiBBbiBpbnZvY2FibGUgY2FuIGVpdGhlciByZXR1cm4gYSB2YWx1ZSBkaXJlY3RseSxcclxuICAgKiBvciBhIGAkcWAgcHJvbWlzZS4gSWYgYSBwcm9taXNlIGlzIHJldHVybmVkIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYW5kIHRoZSBcclxuICAgKiByZXN1bHRpbmcgdmFsdWUgd2lsbCBiZSB1c2VkIGluc3RlYWQuIERlcGVuZGVuY2llcyBvZiBpbnZvY2FibGVzIGFyZSByZXNvbHZlZCBcclxuICAgKiAoaW4gdGhpcyBvcmRlciBvZiBwcmVjZWRlbmNlKVxyXG4gICAqXHJcbiAgICogLSBmcm9tIHRoZSBzcGVjaWZpZWQgYGxvY2Fsc2BcclxuICAgKiAtIGZyb20gYW5vdGhlciBpbnZvY2FibGUgdGhhdCBpcyBwYXJ0IG9mIHRoaXMgYCRyZXNvbHZlYCBjYWxsXHJcbiAgICogLSBmcm9tIGFuIGludm9jYWJsZSB0aGF0IGlzIGluaGVyaXRlZCBmcm9tIGEgYHBhcmVudGAgY2FsbCB0byBgJHJlc29sdmVgIFxyXG4gICAqICAgKG9yIHJlY3Vyc2l2ZWx5XHJcbiAgICogLSBmcm9tIGFueSBhbmNlc3RvciBgJHJlc29sdmVgIG9mIHRoYXQgcGFyZW50KS5cclxuICAgKlxyXG4gICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYCRyZXNvbHZlYCBpcyBhIHByb21pc2UgZm9yIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIFxyXG4gICAqIChpbiB0aGlzIG9yZGVyIG9mIHByZWNlZGVuY2UpXHJcbiAgICpcclxuICAgKiAtIGFueSBgbG9jYWxzYCAoaWYgc3BlY2lmaWVkKVxyXG4gICAqIC0gdGhlIHJlc29sdmVkIHJldHVybiB2YWx1ZXMgb2YgYWxsIGluamVjdGFibGVzXHJcbiAgICogLSBhbnkgdmFsdWVzIGluaGVyaXRlZCBmcm9tIGEgYHBhcmVudGAgY2FsbCB0byBgJHJlc29sdmVgIChpZiBzcGVjaWZpZWQpXHJcbiAgICpcclxuICAgKiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIGBwYXJlbnRgIHByb21pc2UgKGlmIGFueSkgYW5kIGFsbCBwcm9taXNlcyBcclxuICAgKiByZXR1cm5lZCBieSBpbmplY3RhYmxlcyBoYXZlIGJlZW4gcmVzb2x2ZWQuIElmIGFueSBpbnZvY2FibGUgXHJcbiAgICogKG9yIGAkaW5qZWN0b3IuaW52b2tlYCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgb3IgaWYgYSBwcm9taXNlIHJldHVybmVkIGJ5IGFuIFxyXG4gICAqIGludm9jYWJsZSBpcyByZWplY3RlZCwgdGhlIGAkcmVzb2x2ZWAgcHJvbWlzZSBpcyBpbW1lZGlhdGVseSByZWplY3RlZCB3aXRoIHRoZSBcclxuICAgKiBzYW1lIGVycm9yLiBBIHJlamVjdGlvbiBvZiBhIGBwYXJlbnRgIHByb21pc2UgKGlmIHNwZWNpZmllZCkgd2lsbCBsaWtld2lzZSBiZSBcclxuICAgKiBwcm9wYWdhdGVkIGltbWVkaWF0ZWx5LiBPbmNlIHRoZSBgJHJlc29sdmVgIHByb21pc2UgaGFzIGJlZW4gcmVqZWN0ZWQsIG5vIFxyXG4gICAqIGZ1cnRoZXIgaW52b2NhYmxlcyB3aWxsIGJlIGNhbGxlZC5cclxuICAgKiBcclxuICAgKiBDeWNsaWMgZGVwZW5kZW5jaWVzIGJldHdlZW4gaW52b2NhYmxlcyBhcmUgbm90IHBlcm1pdHRlZCBhbmQgd2lsbCBjYXVzZSBgJHJlc29sdmVgXHJcbiAgICogdG8gdGhyb3cgYW4gZXJyb3IuIEFzIGEgc3BlY2lhbCBjYXNlLCBhbiBpbmplY3RhYmxlIGNhbiBkZXBlbmQgb24gYSBwYXJhbWV0ZXIgXHJcbiAgICogd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBpbmplY3RhYmxlLCB3aGljaCB3aWxsIGJlIGZ1bGZpbGxlZCBmcm9tIHRoZSBgcGFyZW50YCBcclxuICAgKiBpbmplY3RhYmxlIG9mIHRoZSBzYW1lIG5hbWUuIFRoaXMgYWxsb3dzIGluaGVyaXRlZCB2YWx1ZXMgdG8gYmUgZGVjb3JhdGVkLiBcclxuICAgKiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIGFueSBvdGhlciBpbmplY3RhYmxlIGluIHRoZSBzYW1lIGAkcmVzb2x2ZWAgd2l0aCB0aGUgc2FtZVxyXG4gICAqIGRlcGVuZGVuY3kgd291bGQgc2VlIHRoZSBkZWNvcmF0ZWQgdmFsdWUsIG5vdCB0aGUgaW5oZXJpdGVkIHZhbHVlLlxyXG4gICAqXHJcbiAgICogTm90ZSB0aGF0IG1pc3NpbmcgZGVwZW5kZW5jaWVzIC0tIHVubGlrZSBjeWNsaWMgZGVwZW5kZW5jaWVzIC0tIHdpbGwgY2F1c2UgYW4gXHJcbiAgICogKGFzeW5jaHJvbm91cykgcmVqZWN0aW9uIG9mIHRoZSBgJHJlc29sdmVgIHByb21pc2UgcmF0aGVyIHRoYW4gYSAoc3luY2hyb25vdXMpIFxyXG4gICAqIGV4Y2VwdGlvbi5cclxuICAgKlxyXG4gICAqIEludm9jYWJsZXMgYXJlIGludm9rZWQgZWFnZXJseSBhcyBzb29uIGFzIGFsbCBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4gXHJcbiAgICogVGhpcyBpcyB0cnVlIGV2ZW4gZm9yIGRlcGVuZGVuY2llcyBpbmhlcml0ZWQgZnJvbSBhIGBwYXJlbnRgIGNhbGwgdG8gYCRyZXNvbHZlYC5cclxuICAgKlxyXG4gICAqIEFzIGEgc3BlY2lhbCBjYXNlLCBhbiBpbnZvY2FibGUgY2FuIGJlIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IGlzIHRha2VuIHRvIFxyXG4gICAqIGJlIGEgc2VydmljZSBuYW1lIHRvIGJlIHBhc3NlZCB0byBgJGluamVjdG9yLmdldCgpYC4gVGhpcyBpcyBzdXBwb3J0ZWQgcHJpbWFyaWx5IFxyXG4gICAqIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBgcmVzb2x2ZWAgcHJvcGVydHkgb2YgYCRyb3V0ZVByb3ZpZGVyYCBcclxuICAgKiByb3V0ZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gaW52b2NhYmxlcyBmdW5jdGlvbnMgdG8gaW52b2tlIG9yIFxyXG4gICAqIGAkaW5qZWN0b3JgIHNlcnZpY2VzIHRvIGZldGNoLlxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBsb2NhbHMgIHZhbHVlcyB0byBtYWtlIGF2YWlsYWJsZSB0byB0aGUgaW5qZWN0YWJsZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyZW50ICBhIHByb21pc2UgcmV0dXJuZWQgYnkgYW5vdGhlciBjYWxsIHRvIGAkcmVzb2x2ZWAuXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IHNlbGYgIHRoZSBgdGhpc2AgZm9yIHRoZSBpbnZva2VkIG1ldGhvZHNcclxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFByb21pc2UgZm9yIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZXNvbHZlZCByZXR1cm4gdmFsdWVcclxuICAgKiBvZiBhbGwgaW52b2NhYmxlcywgYXMgd2VsbCBhcyBhbnkgaW5oZXJpdGVkIGFuZCBsb2NhbCB2YWx1ZXMuXHJcbiAgICovXHJcbiAgdGhpcy5yZXNvbHZlID0gZnVuY3Rpb24gKGludm9jYWJsZXMsIGxvY2FscywgcGFyZW50LCBzZWxmKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHVkeShpbnZvY2FibGVzKShsb2NhbHMsIHBhcmVudCwgc2VsZik7XHJcbiAgfTtcclxufVxyXG5cclxuYW5ndWxhci5tb2R1bGUoJ3VpLnJvdXRlci51dGlsJykuc2VydmljZSgnJHJlc29sdmUnLCAkUmVzb2x2ZSk7XHJcblxyXG5cclxuLyoqXHJcbiAqIEBuZ2RvYyBvYmplY3RcclxuICogQG5hbWUgdWkucm91dGVyLnV0aWwuJHRlbXBsYXRlRmFjdG9yeVxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgJGh0dHBcclxuICogQHJlcXVpcmVzICR0ZW1wbGF0ZUNhY2hlXHJcbiAqIEByZXF1aXJlcyAkaW5qZWN0b3JcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIFNlcnZpY2UuIE1hbmFnZXMgbG9hZGluZyBvZiB0ZW1wbGF0ZXMuXHJcbiAqL1xyXG4kVGVtcGxhdGVGYWN0b3J5LiRpbmplY3QgPSBbJyRodHRwJywgJyR0ZW1wbGF0ZUNhY2hlJywgJyRpbmplY3RvciddO1xyXG5mdW5jdGlvbiAkVGVtcGxhdGVGYWN0b3J5KCAgJGh0dHAsICAgJHRlbXBsYXRlQ2FjaGUsICAgJGluamVjdG9yKSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gICAqIEBuYW1lIHVpLnJvdXRlci51dGlsLiR0ZW1wbGF0ZUZhY3RvcnkjZnJvbUNvbmZpZ1xyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kdGVtcGxhdGVGYWN0b3J5XHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBDcmVhdGVzIGEgdGVtcGxhdGUgZnJvbSBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHdoaWNoIHRvIGxvYWQgYSB0ZW1wbGF0ZS4gXHJcbiAgICogVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBzZWFyY2ggaW4gdGhlIHNwZWNpZmllZCBvcmRlciwgYW5kIHRoZSBmaXJzdCBvbmUgXHJcbiAgICogdGhhdCBpcyBkZWZpbmVkIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSB0ZW1wbGF0ZTpcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gY29uZmlnLnRlbXBsYXRlIGh0bWwgc3RyaW5nIHRlbXBsYXRlIG9yIGZ1bmN0aW9uIHRvIFxyXG4gICAqIGxvYWQgdmlhIHtAbGluayB1aS5yb3V0ZXIudXRpbC4kdGVtcGxhdGVGYWN0b3J5I2Zyb21TdHJpbmcgZnJvbVN0cmluZ30uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBjb25maWcudGVtcGxhdGVVcmwgdXJsIHRvIGxvYWQgb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgXHJcbiAgICogdGhlIHVybCB0byBsb2FkIHZpYSB7QGxpbmsgdWkucm91dGVyLnV0aWwuJHRlbXBsYXRlRmFjdG9yeSNmcm9tVXJsIGZyb21Vcmx9LlxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmZpZy50ZW1wbGF0ZVByb3ZpZGVyIGZ1bmN0aW9uIHRvIGludm9rZSB2aWEgXHJcbiAgICoge0BsaW5rIHVpLnJvdXRlci51dGlsLiR0ZW1wbGF0ZUZhY3RvcnkjZnJvbVByb3ZpZGVyIGZyb21Qcm92aWRlcn0uXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAgUGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbi5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gbG9jYWxzIExvY2FscyB0byBwYXNzIHRvIGBpbnZva2VgIGlmIHRoZSB0ZW1wbGF0ZSBpcyBsb2FkZWQgXHJcbiAgICogdmlhIGEgYHRlbXBsYXRlUHJvdmlkZXJgLiBEZWZhdWx0cyB0byBgeyBwYXJhbXM6IHBhcmFtcyB9YC5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ3xvYmplY3R9ICBUaGUgdGVtcGxhdGUgaHRtbCBhcyBhIHN0cmluZywgb3IgYSBwcm9taXNlIGZvciBcclxuICAgKiB0aGF0IHN0cmluZyxvciBgbnVsbGAgaWYgbm8gdGVtcGxhdGUgaXMgY29uZmlndXJlZC5cclxuICAgKi9cclxuICB0aGlzLmZyb21Db25maWcgPSBmdW5jdGlvbiAoY29uZmlnLCBwYXJhbXMsIGxvY2Fscykge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgaXNEZWZpbmVkKGNvbmZpZy50ZW1wbGF0ZSkgPyB0aGlzLmZyb21TdHJpbmcoY29uZmlnLnRlbXBsYXRlLCBwYXJhbXMpIDpcclxuICAgICAgaXNEZWZpbmVkKGNvbmZpZy50ZW1wbGF0ZVVybCkgPyB0aGlzLmZyb21VcmwoY29uZmlnLnRlbXBsYXRlVXJsLCBwYXJhbXMpIDpcclxuICAgICAgaXNEZWZpbmVkKGNvbmZpZy50ZW1wbGF0ZVByb3ZpZGVyKSA/IHRoaXMuZnJvbVByb3ZpZGVyKGNvbmZpZy50ZW1wbGF0ZVByb3ZpZGVyLCBwYXJhbXMsIGxvY2FscykgOlxyXG4gICAgICBudWxsXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gICAqIEBuYW1lIHVpLnJvdXRlci51dGlsLiR0ZW1wbGF0ZUZhY3RvcnkjZnJvbVN0cmluZ1xyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kdGVtcGxhdGVGYWN0b3J5XHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBDcmVhdGVzIGEgdGVtcGxhdGUgZnJvbSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHN0cmluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gdGVtcGxhdGUgaHRtbCB0ZW1wbGF0ZSBhcyBhIHN0cmluZyBvciBmdW5jdGlvbiB0aGF0IFxyXG4gICAqIHJldHVybnMgYW4gaHRtbCB0ZW1wbGF0ZSBhcyBhIHN0cmluZy5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgdGVtcGxhdGUgZnVuY3Rpb24uXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd8b2JqZWN0fSBUaGUgdGVtcGxhdGUgaHRtbCBhcyBhIHN0cmluZywgb3IgYSBwcm9taXNlIGZvciB0aGF0IFxyXG4gICAqIHN0cmluZy5cclxuICAgKi9cclxuICB0aGlzLmZyb21TdHJpbmcgPSBmdW5jdGlvbiAodGVtcGxhdGUsIHBhcmFtcykge1xyXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24odGVtcGxhdGUpID8gdGVtcGxhdGUocGFyYW1zKSA6IHRlbXBsYXRlO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gICAqIEBuYW1lIHVpLnJvdXRlci51dGlsLiR0ZW1wbGF0ZUZhY3RvcnkjZnJvbVVybFxyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kdGVtcGxhdGVGYWN0b3J5XHJcbiAgICogXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogTG9hZHMgYSB0ZW1wbGF0ZSBmcm9tIHRoZSBhIFVSTCB2aWEgYCRodHRwYCBhbmQgYCR0ZW1wbGF0ZUNhY2hlYC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSB1cmwgdXJsIG9mIHRoZSB0ZW1wbGF0ZSB0byBsb2FkLCBvciBhIGZ1bmN0aW9uIFxyXG4gICAqIHRoYXQgcmV0dXJucyBhIHVybC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgdXJsIGZ1bmN0aW9uLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ3xQcm9taXNlLjxzdHJpbmc+fSBUaGUgdGVtcGxhdGUgaHRtbCBhcyBhIHN0cmluZywgb3IgYSBwcm9taXNlIFxyXG4gICAqIGZvciB0aGF0IHN0cmluZy5cclxuICAgKi9cclxuICB0aGlzLmZyb21VcmwgPSBmdW5jdGlvbiAodXJsLCBwYXJhbXMpIHtcclxuICAgIGlmIChpc0Z1bmN0aW9uKHVybCkpIHVybCA9IHVybChwYXJhbXMpO1xyXG4gICAgaWYgKHVybCA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICAgIGVsc2UgcmV0dXJuICRodHRwXHJcbiAgICAgICAgLmdldCh1cmwsIHsgY2FjaGU6ICR0ZW1wbGF0ZUNhY2hlLCBoZWFkZXJzOiB7IEFjY2VwdDogJ3RleHQvaHRtbCcgfX0pXHJcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsgcmV0dXJuIHJlc3BvbnNlLmRhdGE7IH0pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gICAqIEBuYW1lIHVpLnJvdXRlci51dGlsLiR0ZW1wbGF0ZUZhY3RvcnkjZnJvbVByb3ZpZGVyXHJcbiAgICogQG1ldGhvZE9mIHVpLnJvdXRlci51dGlsLiR0ZW1wbGF0ZUZhY3RvcnlcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIENyZWF0ZXMgYSB0ZW1wbGF0ZSBieSBpbnZva2luZyBhbiBpbmplY3RhYmxlIHByb3ZpZGVyIGZ1bmN0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJvdmlkZXIgRnVuY3Rpb24gdG8gaW52b2tlIHZpYSBgJGluamVjdG9yLmludm9rZWBcclxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFBhcmFtZXRlcnMgZm9yIHRoZSB0ZW1wbGF0ZS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gbG9jYWxzIExvY2FscyB0byBwYXNzIHRvIGBpbnZva2VgLiBEZWZhdWx0cyB0byBcclxuICAgKiBgeyBwYXJhbXM6IHBhcmFtcyB9YC5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd8UHJvbWlzZS48c3RyaW5nPn0gVGhlIHRlbXBsYXRlIGh0bWwgYXMgYSBzdHJpbmcsIG9yIGEgcHJvbWlzZSBcclxuICAgKiBmb3IgdGhhdCBzdHJpbmcuXHJcbiAgICovXHJcbiAgdGhpcy5mcm9tUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIsIHBhcmFtcywgbG9jYWxzKSB7XHJcbiAgICByZXR1cm4gJGluamVjdG9yLmludm9rZShwcm92aWRlciwgbnVsbCwgbG9jYWxzIHx8IHsgcGFyYW1zOiBwYXJhbXMgfSk7XHJcbiAgfTtcclxufVxyXG5cclxuYW5ndWxhci5tb2R1bGUoJ3VpLnJvdXRlci51dGlsJykuc2VydmljZSgnJHRlbXBsYXRlRmFjdG9yeScsICRUZW1wbGF0ZUZhY3RvcnkpO1xyXG5cclxudmFyICQkVU1GUDsgLy8gcmVmZXJlbmNlIHRvICRVcmxNYXRjaGVyRmFjdG9yeVByb3ZpZGVyXHJcblxyXG4vKipcclxuICogQG5nZG9jIG9iamVjdFxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXJcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIE1hdGNoZXMgVVJMcyBhZ2FpbnN0IHBhdHRlcm5zIGFuZCBleHRyYWN0cyBuYW1lZCBwYXJhbWV0ZXJzIGZyb20gdGhlIHBhdGggb3IgdGhlIHNlYXJjaFxyXG4gKiBwYXJ0IG9mIHRoZSBVUkwuIEEgVVJMIHBhdHRlcm4gY29uc2lzdHMgb2YgYSBwYXRoIHBhdHRlcm4sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgJz8nIGFuZCBhIGxpc3RcclxuICogb2Ygc2VhcmNoIHBhcmFtZXRlcnMuIE11bHRpcGxlIHNlYXJjaCBwYXJhbWV0ZXIgbmFtZXMgYXJlIHNlcGFyYXRlZCBieSAnJicuIFNlYXJjaCBwYXJhbWV0ZXJzXHJcbiAqIGRvIG5vdCBpbmZsdWVuY2Ugd2hldGhlciBvciBub3QgYSBVUkwgaXMgbWF0Y2hlZCwgYnV0IHRoZWlyIHZhbHVlcyBhcmUgcGFzc2VkIHRocm91Z2ggaW50b1xyXG4gKiB0aGUgbWF0Y2hlZCBwYXJhbWV0ZXJzIHJldHVybmVkIGJ5IHtAbGluayB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIjbWV0aG9kc19leGVjIGV4ZWN9LlxyXG4gKlxyXG4gKiBQYXRoIHBhcmFtZXRlciBwbGFjZWhvbGRlcnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyBzaW1wbGUgY29sb24vY2F0Y2gtYWxsIHN5bnRheCBvciBjdXJseSBicmFjZVxyXG4gKiBzeW50YXgsIHdoaWNoIG9wdGlvbmFsbHkgYWxsb3dzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciB0aGUgcGFyYW1ldGVyIHRvIGJlIHNwZWNpZmllZDpcclxuICpcclxuICogKiBgJzonYCBuYW1lIC0gY29sb24gcGxhY2Vob2xkZXJcclxuICogKiBgJyonYCBuYW1lIC0gY2F0Y2gtYWxsIHBsYWNlaG9sZGVyXHJcbiAqICogYCd7JyBuYW1lICd9J2AgLSBjdXJseSBwbGFjZWhvbGRlclxyXG4gKiAqIGAneycgbmFtZSAnOicgcmVnZXhwfHR5cGUgJ30nYCAtIGN1cmx5IHBsYWNlaG9sZGVyIHdpdGggcmVnZXhwIG9yIHR5cGUgbmFtZS4gU2hvdWxkIHRoZVxyXG4gKiAgIHJlZ2V4cCBpdHNlbGYgY29udGFpbiBjdXJseSBicmFjZXMsIHRoZXkgbXVzdCBiZSBpbiBtYXRjaGVkIHBhaXJzIG9yIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaC5cclxuICpcclxuICogUGFyYW1ldGVyIG5hbWVzIG1heSBjb250YWluIG9ubHkgd29yZCBjaGFyYWN0ZXJzIChsYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3JlKSBhbmRcclxuICogbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBwYXR0ZXJuIChhY3Jvc3MgYm90aCBwYXRoIGFuZCBzZWFyY2ggcGFyYW1ldGVycykuIEZvciBjb2xvblxyXG4gKiBwbGFjZWhvbGRlcnMgb3IgY3VybHkgcGxhY2Vob2xkZXJzIHdpdGhvdXQgYW4gZXhwbGljaXQgcmVnZXhwLCBhIHBhdGggcGFyYW1ldGVyIG1hdGNoZXMgYW55XHJcbiAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gJy8nLiBGb3IgY2F0Y2gtYWxsIHBsYWNlaG9sZGVycyB0aGUgcGF0aCBwYXJhbWV0ZXIgbWF0Y2hlc1xyXG4gKiBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMuXHJcbiAqXHJcbiAqIEV4YW1wbGVzOlxyXG4gKlxyXG4gKiAqIGAnL2hlbGxvLydgIC0gTWF0Y2hlcyBvbmx5IGlmIHRoZSBwYXRoIGlzIGV4YWN0bHkgJy9oZWxsby8nLiBUaGVyZSBpcyBubyBzcGVjaWFsIHRyZWF0bWVudCBmb3JcclxuICogICB0cmFpbGluZyBzbGFzaGVzLCBhbmQgcGF0dGVybnMgaGF2ZSB0byBtYXRjaCB0aGUgZW50aXJlIHBhdGgsIG5vdCBqdXN0IGEgcHJlZml4LlxyXG4gKiAqIGAnL3VzZXIvOmlkJ2AgLSBNYXRjaGVzICcvdXNlci9ib2InIG9yICcvdXNlci8xMjM0ISEhJyBvciBldmVuICcvdXNlci8nIGJ1dCBub3QgJy91c2VyJyBvclxyXG4gKiAgICcvdXNlci9ib2IvZGV0YWlscycuIFRoZSBzZWNvbmQgcGF0aCBzZWdtZW50IHdpbGwgYmUgY2FwdHVyZWQgYXMgdGhlIHBhcmFtZXRlciAnaWQnLlxyXG4gKiAqIGAnL3VzZXIve2lkfSdgIC0gU2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHVzaW5nIGN1cmx5IGJyYWNlIHN5bnRheC5cclxuICogKiBgJy91c2VyL3tpZDpbXi9dKn0nYCAtIFNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUuXHJcbiAqICogYCcvdXNlci97aWQ6WzAtOWEtZkEtRl17MSw4fX0nYCAtIFNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCBvbmx5IG1hdGNoZXMgaWYgdGhlIGlkXHJcbiAqICAgcGFyYW1ldGVyIGNvbnNpc3RzIG9mIDEgdG8gOCBoZXggZGlnaXRzLlxyXG4gKiAqIGAnL2ZpbGVzL3twYXRoOi4qfSdgIC0gTWF0Y2hlcyBhbnkgVVJMIHN0YXJ0aW5nIHdpdGggJy9maWxlcy8nIGFuZCBjYXB0dXJlcyB0aGUgcmVzdCBvZiB0aGVcclxuICogICBwYXRoIGludG8gdGhlIHBhcmFtZXRlciAncGF0aCcuXHJcbiAqICogYCcvZmlsZXMvKnBhdGgnYCAtIGRpdHRvLlxyXG4gKiAqIGAnL2NhbGVuZGFyL3tzdGFydDpkYXRlfSdgIC0gTWF0Y2hlcyBcIi9jYWxlbmRhci8yMDE0LTExLTEyXCIgKGJlY2F1c2UgdGhlIHBhdHRlcm4gZGVmaW5lZFxyXG4gKiAgIGluIHRoZSBidWlsdC1pbiAgYGRhdGVgIFR5cGUgbWF0Y2hlcyBgMjAxNC0xMS0xMmApIGFuZCBwcm92aWRlcyBhIERhdGUgb2JqZWN0IGluICRzdGF0ZVBhcmFtcy5zdGFydFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAgVGhlIHBhdHRlcm4gdG8gY29tcGlsZSBpbnRvIGEgbWF0Y2hlci5cclxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyAgQSBjb25maWd1cmF0aW9uIG9iamVjdCBoYXNoOlxyXG4gKiBAcGFyYW0ge09iamVjdD19IHBhcmVudE1hdGNoZXIgVXNlZCB0byBjb25jYXRlbmF0ZSB0aGUgcGF0dGVybi9jb25maWcgb250b1xyXG4gKiAgIGFuIGV4aXN0aW5nIFVybE1hdGNoZXJcclxuICpcclxuICogKiBgY2FzZUluc2Vuc2l0aXZlYCAtIGB0cnVlYCBpZiBVUkwgbWF0Y2hpbmcgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUsIG90aGVyd2lzZSBgZmFsc2VgLCB0aGUgZGVmYXVsdCB2YWx1ZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpIGlzIGBmYWxzZWAuXHJcbiAqICogYHN0cmljdGAgLSBgZmFsc2VgIGlmIG1hdGNoaW5nIGFnYWluc3QgYSBVUkwgd2l0aCBhIHRyYWlsaW5nIHNsYXNoIHNob3VsZCBiZSB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYSBVUkwgd2l0aG91dCBhIHRyYWlsaW5nIHNsYXNoLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcmVmaXggIEEgc3RhdGljIHByZWZpeCBvZiB0aGlzIHBhdHRlcm4uIFRoZSBtYXRjaGVyIGd1YXJhbnRlZXMgdGhhdCBhbnlcclxuICogICBVUkwgbWF0Y2hpbmcgdGhpcyBtYXRjaGVyIChpLmUuIGFueSBzdHJpbmcgZm9yIHdoaWNoIHtAbGluayB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIjbWV0aG9kc19leGVjIGV4ZWMoKX0gcmV0dXJuc1xyXG4gKiAgIG5vbi1udWxsKSB3aWxsIHN0YXJ0IHdpdGggdGhpcyBwcmVmaXguXHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2UgIFRoZSBwYXR0ZXJuIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvclxyXG4gKlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUGF0aCAgVGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgc291cmNlIHByb3BlcnR5XHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VTZWFyY2ggIFRoZSBzZWFyY2ggcG9ydGlvbiBvZiB0aGUgc291cmNlIHByb3BlcnR5XHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWdleCAgVGhlIGNvbnN0cnVjdGVkIHJlZ2V4IHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1hdGNoIGFnYWluc3QgdGhlIHVybCB3aGVuXHJcbiAqICAgaXQgaXMgdGltZSB0byBkZXRlcm1pbmUgd2hpY2ggdXJsIHdpbGwgbWF0Y2guXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9ICBOZXcgYFVybE1hdGNoZXJgIG9iamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gVXJsTWF0Y2hlcihwYXR0ZXJuLCBjb25maWcsIHBhcmVudE1hdGNoZXIpIHtcclxuICBjb25maWcgPSBleHRlbmQoeyBwYXJhbXM6IHt9IH0sIGlzT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fSk7XHJcblxyXG4gIC8vIEZpbmQgYWxsIHBsYWNlaG9sZGVycyBhbmQgY3JlYXRlIGEgY29tcGlsZWQgcGF0dGVybiwgdXNpbmcgZWl0aGVyIGNsYXNzaWMgb3IgY3VybHkgc3ludGF4OlxyXG4gIC8vICAgJyonIG5hbWVcclxuICAvLyAgICc6JyBuYW1lXHJcbiAgLy8gICAneycgbmFtZSAnfSdcclxuICAvLyAgICd7JyBuYW1lICc6JyByZWdleHAgJ30nXHJcbiAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBzb21ld2hhdCBjb21wbGljYXRlZCBkdWUgdG8gdGhlIG5lZWQgdG8gYWxsb3cgY3VybHkgYnJhY2VzXHJcbiAgLy8gaW5zaWRlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uIFRoZSBwbGFjZWhvbGRlciByZWdleHAgYnJlYWtzIGRvd24gYXMgZm9sbG93czpcclxuICAvLyAgICAoWzoqXSkoW1xcd1xcW1xcXV0rKSAgICAgICAgICAgICAgLSBjbGFzc2ljIHBsYWNlaG9sZGVyICgkMSAvICQyKSAoc2VhcmNoIHZlcnNpb24gaGFzIC0gZm9yIHNuYWtlLWNhc2UpXHJcbiAgLy8gICAgXFx7KFtcXHdcXFtcXF1dKykoPzpcXDpcXHMqKCAuLi4gKSk/XFx9ICAtIGN1cmx5IGJyYWNlIHBsYWNlaG9sZGVyICgkMykgd2l0aCBvcHRpb25hbCByZWdleHAvdHlwZSAuLi4gKCQ0KSAoc2VhcmNoIHZlcnNpb24gaGFzIC0gZm9yIHNuYWtlLWNhc2VcclxuICAvLyAgICAoPzogLi4uIHwgLi4uIHwgLi4uICkrICAgICAgICAgLSB0aGUgcmVnZXhwIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgYXRvbXMsIGFuIGF0b20gYmVpbmcgZWl0aGVyXHJcbiAgLy8gICAgW157fVxcXFxdKyAgICAgICAgICAgICAgICAgICAgICAgLSBhbnl0aGluZyBvdGhlciB0aGFuIGN1cmx5IGJyYWNlcyBvciBiYWNrc2xhc2hcclxuICAvLyAgICBcXFxcLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGEgYmFja3NsYXNoIGVzY2FwZVxyXG4gIC8vICAgIFxceyg/Oltee31cXFxcXSt8XFxcXC4pKlxcfSAgICAgICAgICAtIGEgbWF0Y2hlZCBzZXQgb2YgY3VybHkgYnJhY2VzIGNvbnRhaW5pbmcgb3RoZXIgYXRvbXNcclxuICB2YXIgcGxhY2Vob2xkZXIgICAgICAgPSAvKFs6Kl0pKFtcXHdcXFtcXF1dKyl8XFx7KFtcXHdcXFtcXF1dKykoPzpcXDpcXHMqKCg/Oltee31cXFxcXSt8XFxcXC58XFx7KD86W157fVxcXFxdK3xcXFxcLikqXFx9KSspKT9cXH0vZyxcclxuICAgICAgc2VhcmNoUGxhY2Vob2xkZXIgPSAvKFs6XT8pKFtcXHdcXFtcXF0uLV0rKXxcXHsoW1xcd1xcW1xcXS4tXSspKD86XFw6XFxzKigoPzpbXnt9XFxcXF0rfFxcXFwufFxceyg/Oltee31cXFxcXSt8XFxcXC4pKlxcfSkrKSk/XFx9L2csXHJcbiAgICAgIGNvbXBpbGVkID0gJ14nLCBsYXN0ID0gMCwgbSxcclxuICAgICAgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzID0gW10sXHJcbiAgICAgIHBhcmVudFBhcmFtcyA9IHBhcmVudE1hdGNoZXIgPyBwYXJlbnRNYXRjaGVyLnBhcmFtcyA6IHt9LFxyXG4gICAgICBwYXJhbXMgPSB0aGlzLnBhcmFtcyA9IHBhcmVudE1hdGNoZXIgPyBwYXJlbnRNYXRjaGVyLnBhcmFtcy4kJG5ldygpIDogbmV3ICQkVU1GUC5QYXJhbVNldCgpLFxyXG4gICAgICBwYXJhbU5hbWVzID0gW107XHJcblxyXG4gIGZ1bmN0aW9uIGFkZFBhcmFtZXRlcihpZCwgdHlwZSwgY29uZmlnLCBsb2NhdGlvbikge1xyXG4gICAgcGFyYW1OYW1lcy5wdXNoKGlkKTtcclxuICAgIGlmIChwYXJlbnRQYXJhbXNbaWRdKSByZXR1cm4gcGFyZW50UGFyYW1zW2lkXTtcclxuICAgIGlmICghL15cXHcrKFstLl0rXFx3KykqKD86XFxbXFxdKT8kLy50ZXN0KGlkKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgbmFtZSAnXCIgKyBpZCArIFwiJyBpbiBwYXR0ZXJuICdcIiArIHBhdHRlcm4gKyBcIidcIik7XHJcbiAgICBpZiAocGFyYW1zW2lkXSkgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIHBhcmFtZXRlciBuYW1lICdcIiArIGlkICsgXCInIGluIHBhdHRlcm4gJ1wiICsgcGF0dGVybiArIFwiJ1wiKTtcclxuICAgIHBhcmFtc1tpZF0gPSBuZXcgJCRVTUZQLlBhcmFtKGlkLCB0eXBlLCBjb25maWcsIGxvY2F0aW9uKTtcclxuICAgIHJldHVybiBwYXJhbXNbaWRdO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcXVvdGVSZWdFeHAoc3RyaW5nLCBwYXR0ZXJuLCBzcXVhc2gsIG9wdGlvbmFsKSB7XHJcbiAgICB2YXIgc3Vycm91bmRQYXR0ZXJuID0gWycnLCcnXSwgcmVzdWx0ID0gc3RyaW5nLnJlcGxhY2UoL1tcXFxcXFxbXFxdXFxeJCorPy4oKXx7fV0vZywgXCJcXFxcJCZcIik7XHJcbiAgICBpZiAoIXBhdHRlcm4pIHJldHVybiByZXN1bHQ7XHJcbiAgICBzd2l0Y2goc3F1YXNoKSB7XHJcbiAgICAgIGNhc2UgZmFsc2U6IHN1cnJvdW5kUGF0dGVybiA9IFsnKCcsICcpJyArIChvcHRpb25hbCA/IFwiP1wiIDogXCJcIildOyBicmVhaztcclxuICAgICAgY2FzZSB0cnVlOlxyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXC8kLywgJycpO1xyXG4gICAgICAgIHN1cnJvdW5kUGF0dGVybiA9IFsnKD86XFwvKCcsICcpfFxcLyk/J107XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OiAgICBzdXJyb3VuZFBhdHRlcm4gPSBbJygnICsgc3F1YXNoICsgXCJ8XCIsICcpPyddOyBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQgKyBzdXJyb3VuZFBhdHRlcm5bMF0gKyBwYXR0ZXJuICsgc3Vycm91bmRQYXR0ZXJuWzFdO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5zb3VyY2UgPSBwYXR0ZXJuO1xyXG5cclxuICAvLyBTcGxpdCBpbnRvIHN0YXRpYyBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgcGF0aCBwYXJhbWV0ZXIgcGxhY2Vob2xkZXJzLlxyXG4gIC8vIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgaXMgYWx3YXlzIDEgbW9yZSB0aGFuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycy5cclxuICBmdW5jdGlvbiBtYXRjaERldGFpbHMobSwgaXNTZWFyY2gpIHtcclxuICAgIHZhciBpZCwgcmVnZXhwLCBzZWdtZW50LCB0eXBlLCBjZmcsIGFycmF5TW9kZTtcclxuICAgIGlkICAgICAgICAgID0gbVsyXSB8fCBtWzNdOyAvLyBJRVs3OF0gcmV0dXJucyAnJyBmb3IgdW5tYXRjaGVkIGdyb3VwcyBpbnN0ZWFkIG9mIG51bGxcclxuICAgIGNmZyAgICAgICAgID0gY29uZmlnLnBhcmFtc1tpZF07XHJcbiAgICBzZWdtZW50ICAgICA9IHBhdHRlcm4uc3Vic3RyaW5nKGxhc3QsIG0uaW5kZXgpO1xyXG4gICAgcmVnZXhwICAgICAgPSBpc1NlYXJjaCA/IG1bNF0gOiBtWzRdIHx8IChtWzFdID09ICcqJyA/ICcuKicgOiBudWxsKTtcclxuXHJcbiAgICBpZiAocmVnZXhwKSB7XHJcbiAgICAgIHR5cGUgICAgICA9ICQkVU1GUC50eXBlKHJlZ2V4cCkgfHwgaW5oZXJpdCgkJFVNRlAudHlwZShcInN0cmluZ1wiKSwgeyBwYXR0ZXJuOiBuZXcgUmVnRXhwKHJlZ2V4cCwgY29uZmlnLmNhc2VJbnNlbnNpdGl2ZSA/ICdpJyA6IHVuZGVmaW5lZCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGlkLCByZWdleHA6IHJlZ2V4cCwgc2VnbWVudDogc2VnbWVudCwgdHlwZTogdHlwZSwgY2ZnOiBjZmdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB2YXIgcCwgcGFyYW0sIHNlZ21lbnQ7XHJcbiAgd2hpbGUgKChtID0gcGxhY2Vob2xkZXIuZXhlYyhwYXR0ZXJuKSkpIHtcclxuICAgIHAgPSBtYXRjaERldGFpbHMobSwgZmFsc2UpO1xyXG4gICAgaWYgKHAuc2VnbWVudC5pbmRleE9mKCc/JykgPj0gMCkgYnJlYWs7IC8vIHdlJ3JlIGludG8gdGhlIHNlYXJjaCBwYXJ0XHJcblxyXG4gICAgcGFyYW0gPSBhZGRQYXJhbWV0ZXIocC5pZCwgcC50eXBlLCBwLmNmZywgXCJwYXRoXCIpO1xyXG4gICAgY29tcGlsZWQgKz0gcXVvdGVSZWdFeHAocC5zZWdtZW50LCBwYXJhbS50eXBlLnBhdHRlcm4uc291cmNlLCBwYXJhbS5zcXVhc2gsIHBhcmFtLmlzT3B0aW9uYWwpO1xyXG4gICAgc2VnbWVudHMucHVzaChwLnNlZ21lbnQpO1xyXG4gICAgbGFzdCA9IHBsYWNlaG9sZGVyLmxhc3RJbmRleDtcclxuICB9XHJcbiAgc2VnbWVudCA9IHBhdHRlcm4uc3Vic3RyaW5nKGxhc3QpO1xyXG5cclxuICAvLyBGaW5kIGFueSBzZWFyY2ggcGFyYW1ldGVyIG5hbWVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBsYXN0IHNlZ21lbnRcclxuICB2YXIgaSA9IHNlZ21lbnQuaW5kZXhPZignPycpO1xyXG5cclxuICBpZiAoaSA+PSAwKSB7XHJcbiAgICB2YXIgc2VhcmNoID0gdGhpcy5zb3VyY2VTZWFyY2ggPSBzZWdtZW50LnN1YnN0cmluZyhpKTtcclxuICAgIHNlZ21lbnQgPSBzZWdtZW50LnN1YnN0cmluZygwLCBpKTtcclxuICAgIHRoaXMuc291cmNlUGF0aCA9IHBhdHRlcm4uc3Vic3RyaW5nKDAsIGxhc3QgKyBpKTtcclxuXHJcbiAgICBpZiAoc2VhcmNoLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGFzdCA9IDA7XHJcbiAgICAgIHdoaWxlICgobSA9IHNlYXJjaFBsYWNlaG9sZGVyLmV4ZWMoc2VhcmNoKSkpIHtcclxuICAgICAgICBwID0gbWF0Y2hEZXRhaWxzKG0sIHRydWUpO1xyXG4gICAgICAgIHBhcmFtID0gYWRkUGFyYW1ldGVyKHAuaWQsIHAudHlwZSwgcC5jZmcsIFwic2VhcmNoXCIpO1xyXG4gICAgICAgIGxhc3QgPSBwbGFjZWhvbGRlci5sYXN0SW5kZXg7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgPyZcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBwYXR0ZXJuO1xyXG4gICAgdGhpcy5zb3VyY2VTZWFyY2ggPSAnJztcclxuICB9XHJcblxyXG4gIGNvbXBpbGVkICs9IHF1b3RlUmVnRXhwKHNlZ21lbnQpICsgKGNvbmZpZy5zdHJpY3QgPT09IGZhbHNlID8gJ1xcLz8nIDogJycpICsgJyQnO1xyXG4gIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XHJcblxyXG4gIHRoaXMucmVnZXhwID0gbmV3IFJlZ0V4cChjb21waWxlZCwgY29uZmlnLmNhc2VJbnNlbnNpdGl2ZSA/ICdpJyA6IHVuZGVmaW5lZCk7XHJcbiAgdGhpcy5wcmVmaXggPSBzZWdtZW50c1swXTtcclxuICB0aGlzLiQkcGFyYW1OYW1lcyA9IHBhcmFtTmFtZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAbmdkb2MgZnVuY3Rpb25cclxuICogQG5hbWUgdWkucm91dGVyLnV0aWwudHlwZTpVcmxNYXRjaGVyI2NvbmNhdFxyXG4gKiBAbWV0aG9kT2YgdWkucm91dGVyLnV0aWwudHlwZTpVcmxNYXRjaGVyXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBSZXR1cm5zIGEgbmV3IG1hdGNoZXIgZm9yIGEgcGF0dGVybiBjb25zdHJ1Y3RlZCBieSBhcHBlbmRpbmcgdGhlIHBhdGggcGFydCBhbmQgYWRkaW5nIHRoZVxyXG4gKiBzZWFyY2ggcGFyYW1ldGVycyBvZiB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gdG8gdGhpcyBwYXR0ZXJuLiBUaGUgY3VycmVudCBwYXR0ZXJuIGlzIG5vdFxyXG4gKiBtb2RpZmllZC4gVGhpcyBjYW4gYmUgdW5kZXJzdG9vZCBhcyBjcmVhdGluZyBhIHBhdHRlcm4gZm9yIFVSTHMgdGhhdCBhcmUgcmVsYXRpdmUgdG8gKG9yXHJcbiAqIHN1ZmZpeGVzIG9mKSB0aGUgY3VycmVudCBwYXR0ZXJuLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBUaGUgZm9sbG93aW5nIHR3byBtYXRjaGVycyBhcmUgZXF1aXZhbGVudDpcclxuICogPHByZT5cclxuICogbmV3IFVybE1hdGNoZXIoJy91c2VyL3tpZH0/cScpLmNvbmNhdCgnL2RldGFpbHM/ZGF0ZScpO1xyXG4gKiBuZXcgVXJsTWF0Y2hlcignL3VzZXIve2lkfS9kZXRhaWxzP3EmZGF0ZScpO1xyXG4gKiA8L3ByZT5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gIFRoZSBwYXR0ZXJuIHRvIGFwcGVuZC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyAgQW4gb2JqZWN0IGhhc2ggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtYXRjaGVyLlxyXG4gKiBAcmV0dXJucyB7VXJsTWF0Y2hlcn0gIEEgbWF0Y2hlciBmb3IgdGhlIGNvbmNhdGVuYXRlZCBwYXR0ZXJuLlxyXG4gKi9cclxuVXJsTWF0Y2hlci5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKHBhdHRlcm4sIGNvbmZpZykge1xyXG4gIC8vIEJlY2F1c2Ugb3JkZXIgb2Ygc2VhcmNoIHBhcmFtZXRlcnMgaXMgaXJyZWxldmFudCwgd2UgY2FuIGFkZCBvdXIgb3duIHNlYXJjaFxyXG4gIC8vIHBhcmFtZXRlcnMgdG8gdGhlIGVuZCBvZiB0aGUgbmV3IHBhdHRlcm4uIFBhcnNlIHRoZSBuZXcgcGF0dGVybiBieSBpdHNlbGZcclxuICAvLyBhbmQgdGhlbiBqb2luIHRoZSBiaXRzIHRvZ2V0aGVyLCBidXQgaXQncyBtdWNoIGVhc2llciB0byBkbyB0aGlzIG9uIGEgc3RyaW5nIGxldmVsLlxyXG4gIHZhciBkZWZhdWx0Q29uZmlnID0ge1xyXG4gICAgY2FzZUluc2Vuc2l0aXZlOiAkJFVNRlAuY2FzZUluc2Vuc2l0aXZlKCksXHJcbiAgICBzdHJpY3Q6ICQkVU1GUC5zdHJpY3RNb2RlKCksXHJcbiAgICBzcXVhc2g6ICQkVU1GUC5kZWZhdWx0U3F1YXNoUG9saWN5KClcclxuICB9O1xyXG4gIHJldHVybiBuZXcgVXJsTWF0Y2hlcih0aGlzLnNvdXJjZVBhdGggKyBwYXR0ZXJuICsgdGhpcy5zb3VyY2VTZWFyY2gsIGV4dGVuZChkZWZhdWx0Q29uZmlnLCBjb25maWcpLCB0aGlzKTtcclxufTtcclxuXHJcblVybE1hdGNoZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xyXG4gIHJldHVybiB0aGlzLnNvdXJjZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAbmdkb2MgZnVuY3Rpb25cclxuICogQG5hbWUgdWkucm91dGVyLnV0aWwudHlwZTpVcmxNYXRjaGVyI2V4ZWNcclxuICogQG1ldGhvZE9mIHVpLnJvdXRlci51dGlsLnR5cGU6VXJsTWF0Y2hlclxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogVGVzdHMgdGhlIHNwZWNpZmllZCBwYXRoIGFnYWluc3QgdGhpcyBtYXRjaGVyLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgY2FwdHVyZWRcclxuICogcGFyYW1ldGVyIHZhbHVlcywgb3IgbnVsbCBpZiB0aGUgcGF0aCBkb2VzIG5vdCBtYXRjaC4gVGhlIHJldHVybmVkIG9iamVjdCBjb250YWlucyB0aGUgdmFsdWVzXHJcbiAqIG9mIGFueSBzZWFyY2ggcGFyYW1ldGVycyB0aGF0IGFyZSBtZW50aW9uZWQgaW4gdGhlIHBhdHRlcm4sIGJ1dCB0aGVpciB2YWx1ZSBtYXkgYmUgbnVsbCBpZlxyXG4gKiB0aGV5IGFyZSBub3QgcHJlc2VudCBpbiBgc2VhcmNoUGFyYW1zYC4gVGhpcyBtZWFucyB0aGF0IHNlYXJjaCBwYXJhbWV0ZXJzIGFyZSBhbHdheXMgdHJlYXRlZFxyXG4gKiBhcyBvcHRpb25hbC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogPHByZT5cclxuICogbmV3IFVybE1hdGNoZXIoJy91c2VyL3tpZH0/cSZyJykuZXhlYygnL3VzZXIvYm9iJywge1xyXG4gKiAgIHg6ICcxJywgcTogJ2hlbGxvJ1xyXG4gKiB9KTtcclxuICogLy8gcmV0dXJucyB7IGlkOiAnYm9iJywgcTogJ2hlbGxvJywgcjogbnVsbCB9XHJcbiAqIDwvcHJlPlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAgVGhlIFVSTCBwYXRoIHRvIG1hdGNoLCBlLmcuIGAkbG9jYXRpb24ucGF0aCgpYC5cclxuICogQHBhcmFtIHtPYmplY3R9IHNlYXJjaFBhcmFtcyAgVVJMIHNlYXJjaCBwYXJhbWV0ZXJzLCBlLmcuIGAkbG9jYXRpb24uc2VhcmNoKClgLlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAgVGhlIGNhcHR1cmVkIHBhcmFtZXRlciB2YWx1ZXMuXHJcbiAqL1xyXG5VcmxNYXRjaGVyLnByb3RvdHlwZS5leGVjID0gZnVuY3Rpb24gKHBhdGgsIHNlYXJjaFBhcmFtcykge1xyXG4gIHZhciBtID0gdGhpcy5yZWdleHAuZXhlYyhwYXRoKTtcclxuICBpZiAoIW0pIHJldHVybiBudWxsO1xyXG4gIHNlYXJjaFBhcmFtcyA9IHNlYXJjaFBhcmFtcyB8fCB7fTtcclxuXHJcbiAgdmFyIHBhcmFtTmFtZXMgPSB0aGlzLnBhcmFtZXRlcnMoKSwgblRvdGFsID0gcGFyYW1OYW1lcy5sZW5ndGgsXHJcbiAgICBuUGF0aCA9IHRoaXMuc2VnbWVudHMubGVuZ3RoIC0gMSxcclxuICAgIHZhbHVlcyA9IHt9LCBpLCBqLCBjZmcsIHBhcmFtTmFtZTtcclxuXHJcbiAgaWYgKG5QYXRoICE9PSBtLmxlbmd0aCAtIDEpIHRocm93IG5ldyBFcnJvcihcIlVuYmFsYW5jZWQgY2FwdHVyZSBncm91cCBpbiByb3V0ZSAnXCIgKyB0aGlzLnNvdXJjZSArIFwiJ1wiKTtcclxuXHJcbiAgZnVuY3Rpb24gZGVjb2RlUGF0aEFycmF5KHN0cmluZykge1xyXG4gICAgZnVuY3Rpb24gcmV2ZXJzZVN0cmluZyhzdHIpIHsgcmV0dXJuIHN0ci5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKTsgfVxyXG4gICAgZnVuY3Rpb24gdW5xdW90ZURhc2hlcyhzdHIpIHsgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXFxcLS9nLCBcIi1cIik7IH1cclxuXHJcbiAgICB2YXIgc3BsaXQgPSByZXZlcnNlU3RyaW5nKHN0cmluZykuc3BsaXQoLy0oPyFcXFxcKS8pO1xyXG4gICAgdmFyIGFsbFJldmVyc2VkID0gbWFwKHNwbGl0LCByZXZlcnNlU3RyaW5nKTtcclxuICAgIHJldHVybiBtYXAoYWxsUmV2ZXJzZWQsIHVucXVvdGVEYXNoZXMpLnJldmVyc2UoKTtcclxuICB9XHJcblxyXG4gIHZhciBwYXJhbSwgcGFyYW1WYWw7XHJcbiAgZm9yIChpID0gMDsgaSA8IG5QYXRoOyBpKyspIHtcclxuICAgIHBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbaV07XHJcbiAgICBwYXJhbSA9IHRoaXMucGFyYW1zW3BhcmFtTmFtZV07XHJcbiAgICBwYXJhbVZhbCA9IG1baSsxXTtcclxuICAgIC8vIGlmIHRoZSBwYXJhbSB2YWx1ZSBtYXRjaGVzIGEgcHJlLXJlcGxhY2UgcGFpciwgcmVwbGFjZSB0aGUgdmFsdWUgYmVmb3JlIGRlY29kaW5nLlxyXG4gICAgZm9yIChqID0gMDsgaiA8IHBhcmFtLnJlcGxhY2UubGVuZ3RoOyBqKyspIHtcclxuICAgICAgaWYgKHBhcmFtLnJlcGxhY2Vbal0uZnJvbSA9PT0gcGFyYW1WYWwpIHBhcmFtVmFsID0gcGFyYW0ucmVwbGFjZVtqXS50bztcclxuICAgIH1cclxuICAgIGlmIChwYXJhbVZhbCAmJiBwYXJhbS5hcnJheSA9PT0gdHJ1ZSkgcGFyYW1WYWwgPSBkZWNvZGVQYXRoQXJyYXkocGFyYW1WYWwpO1xyXG4gICAgaWYgKGlzRGVmaW5lZChwYXJhbVZhbCkpIHBhcmFtVmFsID0gcGFyYW0udHlwZS5kZWNvZGUocGFyYW1WYWwpO1xyXG4gICAgdmFsdWVzW3BhcmFtTmFtZV0gPSBwYXJhbS52YWx1ZShwYXJhbVZhbCk7XHJcbiAgfVxyXG4gIGZvciAoLyoqLzsgaSA8IG5Ub3RhbDsgaSsrKSB7XHJcbiAgICBwYXJhbU5hbWUgPSBwYXJhbU5hbWVzW2ldO1xyXG4gICAgdmFsdWVzW3BhcmFtTmFtZV0gPSB0aGlzLnBhcmFtc1twYXJhbU5hbWVdLnZhbHVlKHNlYXJjaFBhcmFtc1twYXJhbU5hbWVdKTtcclxuICAgIHBhcmFtID0gdGhpcy5wYXJhbXNbcGFyYW1OYW1lXTtcclxuICAgIHBhcmFtVmFsID0gc2VhcmNoUGFyYW1zW3BhcmFtTmFtZV07XHJcbiAgICBmb3IgKGogPSAwOyBqIDwgcGFyYW0ucmVwbGFjZS5sZW5ndGg7IGorKykge1xyXG4gICAgICBpZiAocGFyYW0ucmVwbGFjZVtqXS5mcm9tID09PSBwYXJhbVZhbCkgcGFyYW1WYWwgPSBwYXJhbS5yZXBsYWNlW2pdLnRvO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzRGVmaW5lZChwYXJhbVZhbCkpIHBhcmFtVmFsID0gcGFyYW0udHlwZS5kZWNvZGUocGFyYW1WYWwpO1xyXG4gICAgdmFsdWVzW3BhcmFtTmFtZV0gPSBwYXJhbS52YWx1ZShwYXJhbVZhbCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdmFsdWVzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIjcGFyYW1ldGVyc1xyXG4gKiBAbWV0aG9kT2YgdWkucm91dGVyLnV0aWwudHlwZTpVcmxNYXRjaGVyXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcGF0aCBhbmQgc2VhcmNoIHBhcmFtZXRlcnMgb2YgdGhpcyBwYXR0ZXJuIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPHN0cmluZz59ICBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgbmFtZXMuIE11c3QgYmUgdHJlYXRlZCBhcyByZWFkLW9ubHkuIElmIHRoZVxyXG4gKiAgICBwYXR0ZXJuIGhhcyBubyBwYXJhbWV0ZXJzLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC5cclxuICovXHJcblVybE1hdGNoZXIucHJvdG90eXBlLnBhcmFtZXRlcnMgPSBmdW5jdGlvbiAocGFyYW0pIHtcclxuICBpZiAoIWlzRGVmaW5lZChwYXJhbSkpIHJldHVybiB0aGlzLiQkcGFyYW1OYW1lcztcclxuICByZXR1cm4gdGhpcy5wYXJhbXNbcGFyYW1dIHx8IG51bGw7XHJcbn07XHJcblxyXG4vKipcclxuICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAqIEBuYW1lIHVpLnJvdXRlci51dGlsLnR5cGU6VXJsTWF0Y2hlciN2YWxpZGF0ZXNcclxuICogQG1ldGhvZE9mIHVpLnJvdXRlci51dGlsLnR5cGU6VXJsTWF0Y2hlclxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogQ2hlY2tzIGFuIG9iamVjdCBoYXNoIG9mIHBhcmFtZXRlcnMgdG8gdmFsaWRhdGUgdGhlaXIgY29ycmVjdG5lc3MgYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJcclxuICogdHlwZXMgb2YgdGhpcyBgVXJsTWF0Y2hlcmAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIG9iamVjdCBoYXNoIG9mIHBhcmFtZXRlcnMgdG8gdmFsaWRhdGUuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGFyYW1zYCB2YWxpZGF0ZXMsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxuVXJsTWF0Y2hlci5wcm90b3R5cGUudmFsaWRhdGVzID0gZnVuY3Rpb24gKHBhcmFtcykge1xyXG4gIHJldHVybiB0aGlzLnBhcmFtcy4kJHZhbGlkYXRlcyhwYXJhbXMpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIjZm9ybWF0XHJcbiAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXJcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIENyZWF0ZXMgYSBVUkwgdGhhdCBtYXRjaGVzIHRoaXMgcGF0dGVybiBieSBzdWJzdGl0dXRpbmcgdGhlIHNwZWNpZmllZCB2YWx1ZXNcclxuICogZm9yIHRoZSBwYXRoIGFuZCBzZWFyY2ggcGFyYW1ldGVycy4gTnVsbCB2YWx1ZXMgZm9yIHBhdGggcGFyYW1ldGVycyBhcmVcclxuICogdHJlYXRlZCBhcyBlbXB0eSBzdHJpbmdzLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiA8cHJlPlxyXG4gKiBuZXcgVXJsTWF0Y2hlcignL3VzZXIve2lkfT9xJykuZm9ybWF0KHsgaWQ6J2JvYicsIHE6J3llcycgfSk7XHJcbiAqIC8vIHJldHVybnMgJy91c2VyL2JvYj9xPXllcydcclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgIHRoZSB2YWx1ZXMgdG8gc3Vic3RpdHV0ZSBmb3IgdGhlIHBhcmFtZXRlcnMgaW4gdGhpcyBwYXR0ZXJuLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgdGhlIGZvcm1hdHRlZCBVUkwgKHBhdGggYW5kIG9wdGlvbmFsbHkgc2VhcmNoIHBhcnQpLlxyXG4gKi9cclxuVXJsTWF0Y2hlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlcykge1xyXG4gIHZhbHVlcyA9IHZhbHVlcyB8fCB7fTtcclxuICB2YXIgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzLCBwYXJhbXMgPSB0aGlzLnBhcmFtZXRlcnMoKSwgcGFyYW1zZXQgPSB0aGlzLnBhcmFtcztcclxuICBpZiAoIXRoaXMudmFsaWRhdGVzKHZhbHVlcykpIHJldHVybiBudWxsO1xyXG5cclxuICB2YXIgaSwgc2VhcmNoID0gZmFsc2UsIG5QYXRoID0gc2VnbWVudHMubGVuZ3RoIC0gMSwgblRvdGFsID0gcGFyYW1zLmxlbmd0aCwgcmVzdWx0ID0gc2VnbWVudHNbMF07XHJcblxyXG4gIGZ1bmN0aW9uIGVuY29kZURhc2hlcyhzdHIpIHsgLy8gUmVwbGFjZSBkYXNoZXMgd2l0aCBlbmNvZGVkIFwiXFwtXCJcclxuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC8tL2csIGZ1bmN0aW9uKGMpIHsgcmV0dXJuICclNUMlJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfSk7XHJcbiAgfVxyXG5cclxuICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsOyBpKyspIHtcclxuICAgIHZhciBpc1BhdGhQYXJhbSA9IGkgPCBuUGF0aDtcclxuICAgIHZhciBuYW1lID0gcGFyYW1zW2ldLCBwYXJhbSA9IHBhcmFtc2V0W25hbWVdLCB2YWx1ZSA9IHBhcmFtLnZhbHVlKHZhbHVlc1tuYW1lXSk7XHJcbiAgICB2YXIgaXNEZWZhdWx0VmFsdWUgPSBwYXJhbS5pc09wdGlvbmFsICYmIHBhcmFtLnR5cGUuZXF1YWxzKHBhcmFtLnZhbHVlKCksIHZhbHVlKTtcclxuICAgIHZhciBzcXVhc2ggPSBpc0RlZmF1bHRWYWx1ZSA/IHBhcmFtLnNxdWFzaCA6IGZhbHNlO1xyXG4gICAgdmFyIGVuY29kZWQgPSBwYXJhbS50eXBlLmVuY29kZSh2YWx1ZSk7XHJcblxyXG4gICAgaWYgKGlzUGF0aFBhcmFtKSB7XHJcbiAgICAgIHZhciBuZXh0U2VnbWVudCA9IHNlZ21lbnRzW2kgKyAxXTtcclxuICAgICAgdmFyIGlzRmluYWxQYXRoUGFyYW0gPSBpICsgMSA9PT0gblBhdGg7XHJcblxyXG4gICAgICBpZiAoc3F1YXNoID09PSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChlbmNvZGVkICE9IG51bGwpIHtcclxuICAgICAgICAgIGlmIChpc0FycmF5KGVuY29kZWQpKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBtYXAoZW5jb2RlZCwgZW5jb2RlRGFzaGVzKS5qb2luKFwiLVwiKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBlbmNvZGVVUklDb21wb25lbnQoZW5jb2RlZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCArPSBuZXh0U2VnbWVudDtcclxuICAgICAgfSBlbHNlIGlmIChzcXVhc2ggPT09IHRydWUpIHtcclxuICAgICAgICB2YXIgY2FwdHVyZSA9IHJlc3VsdC5tYXRjaCgvXFwvJC8pID8gL1xcLz8oLiopLyA6IC8oLiopLztcclxuICAgICAgICByZXN1bHQgKz0gbmV4dFNlZ21lbnQubWF0Y2goY2FwdHVyZSlbMV07XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoc3F1YXNoKSkge1xyXG4gICAgICAgIHJlc3VsdCArPSBzcXVhc2ggKyBuZXh0U2VnbWVudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzRmluYWxQYXRoUGFyYW0gJiYgcGFyYW0uc3F1YXNoID09PSB0cnVlICYmIHJlc3VsdC5zbGljZSgtMSkgPT09ICcvJykgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIC0xKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChlbmNvZGVkID09IG51bGwgfHwgKGlzRGVmYXVsdFZhbHVlICYmIHNxdWFzaCAhPT0gZmFsc2UpKSBjb250aW51ZTtcclxuICAgICAgaWYgKCFpc0FycmF5KGVuY29kZWQpKSBlbmNvZGVkID0gWyBlbmNvZGVkIF07XHJcbiAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCA9PT0gMCkgY29udGludWU7XHJcbiAgICAgIGVuY29kZWQgPSBtYXAoZW5jb2RlZCwgZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcmJyArIG5hbWUgKyAnPScpO1xyXG4gICAgICByZXN1bHQgKz0gKHNlYXJjaCA/ICcmJyA6ICc/JykgKyAobmFtZSArICc9JyArIGVuY29kZWQpO1xyXG4gICAgICBzZWFyY2ggPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAbmdkb2Mgb2JqZWN0XHJcbiAqIEBuYW1lIHVpLnJvdXRlci51dGlsLnR5cGU6VHlwZVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogSW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgdG8gZGVmaW5lIGN1c3RvbSBwYXJhbWV0ZXIgdHlwZXMgdGhhdCBjYW4gYmUgZGVjb2RlZCBmcm9tIGFuZCBlbmNvZGVkIHRvXHJcbiAqIHN0cmluZyBwYXJhbWV0ZXJzIG1hdGNoZWQgaW4gYSBVUkwuIFVzZWQgYnkge0BsaW5rIHVpLnJvdXRlci51dGlsLnR5cGU6VXJsTWF0Y2hlciBgVXJsTWF0Y2hlcmB9XHJcbiAqIG9iamVjdHMgd2hlbiBtYXRjaGluZyBvciBmb3JtYXR0aW5nIFVSTHMsIG9yIGNvbXBhcmluZyBvciB2YWxpZGF0aW5nIHBhcmFtZXRlciB2YWx1ZXMuXHJcbiAqXHJcbiAqIFNlZSB7QGxpbmsgdWkucm91dGVyLnV0aWwuJHVybE1hdGNoZXJGYWN0b3J5I21ldGhvZHNfdHlwZSBgJHVybE1hdGNoZXJGYWN0b3J5I3R5cGUoKWB9IGZvciBtb3JlXHJcbiAqIGluZm9ybWF0aW9uIG9uIHJlZ2lzdGVyaW5nIGN1c3RvbSB0eXBlcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyAgQSBjb25maWd1cmF0aW9uIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgY3VzdG9tIHR5cGUgZGVmaW5pdGlvbi4gIFRoZSBvYmplY3Qnc1xyXG4gKiAgICAgICAgcHJvcGVydGllcyB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1ldGhvZHMgYW5kL29yIHBhdHRlcm4gaW4gYFR5cGVgJ3MgcHVibGljIGludGVyZmFjZS5cclxuICogQGV4YW1wbGVcclxuICogPHByZT5cclxuICoge1xyXG4gKiAgIGRlY29kZTogZnVuY3Rpb24odmFsKSB7IHJldHVybiBwYXJzZUludCh2YWwsIDEwKTsgfSxcclxuICogICBlbmNvZGU6IGZ1bmN0aW9uKHZhbCkgeyByZXR1cm4gdmFsICYmIHZhbC50b1N0cmluZygpOyB9LFxyXG4gKiAgIGVxdWFsczogZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gdGhpcy5pcyhhKSAmJiBhID09PSBiOyB9LFxyXG4gKiAgIGlzOiBmdW5jdGlvbih2YWwpIHsgcmV0dXJuIGFuZ3VsYXIuaXNOdW1iZXIodmFsKSBpc0Zpbml0ZSh2YWwpICYmIHZhbCAlIDEgPT09IDA7IH0sXHJcbiAqICAgcGF0dGVybjogL1xcZCsvXHJcbiAqIH1cclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBwYXR0ZXJuIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB1c2VkIHRvIG1hdGNoIHZhbHVlcyBvZiB0aGlzIHR5cGUgd2hlblxyXG4gKiAgICAgICAgICAgY29taW5nIGZyb20gYSBzdWJzdHJpbmcgb2YgYSBVUkwuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9ICBSZXR1cm5zIGEgbmV3IGBUeXBlYCBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBUeXBlKGNvbmZpZykge1xyXG4gIGV4dGVuZCh0aGlzLCBjb25maWcpO1xyXG59XHJcblxyXG4vKipcclxuICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAqIEBuYW1lIHVpLnJvdXRlci51dGlsLnR5cGU6VHlwZSNpc1xyXG4gKiBAbWV0aG9kT2YgdWkucm91dGVyLnV0aWwudHlwZTpUeXBlXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBEZXRlY3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyBvZiBhIHBhcnRpY3VsYXIgdHlwZS4gQWNjZXB0cyBhIG5hdGl2ZSAoZGVjb2RlZCkgdmFsdWVcclxuICogYW5kIGRldGVybWluZXMgd2hldGhlciBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IGBUeXBlYCBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gdmFsICBUaGUgdmFsdWUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgIE9wdGlvbmFsLiBJZiB0aGUgdHlwZSBjaGVjayBpcyBoYXBwZW5pbmcgaW4gdGhlIGNvbnRleHQgb2YgYSBzcGVjaWZpY1xyXG4gKiAgICAgICAge0BsaW5rIHVpLnJvdXRlci51dGlsLnR5cGU6VXJsTWF0Y2hlciBgVXJsTWF0Y2hlcmB9IG9iamVjdCwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGVcclxuICogICAgICAgIHBhcmFtZXRlciBpbiB3aGljaCBgdmFsYCBpcyBzdG9yZWQuIENhbiBiZSB1c2VkIGZvciBtZXRhLXByb2dyYW1taW5nIG9mIGBUeXBlYCBvYmplY3RzLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSB0eXBlLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcblR5cGUucHJvdG90eXBlLmlzID0gZnVuY3Rpb24odmFsLCBrZXkpIHtcclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAbmdkb2MgZnVuY3Rpb25cclxuICogQG5hbWUgdWkucm91dGVyLnV0aWwudHlwZTpUeXBlI2VuY29kZVxyXG4gKiBAbWV0aG9kT2YgdWkucm91dGVyLnV0aWwudHlwZTpUeXBlXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBFbmNvZGVzIGEgY3VzdG9tL25hdGl2ZSB0eXBlIHZhbHVlIHRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluIGEgVVJMLiBOb3RlIHRoYXQgdGhlXHJcbiAqIHJldHVybiB2YWx1ZSBkb2VzICpub3QqIG5lZWQgdG8gYmUgVVJMLXNhZmUgKGkuZS4gcGFzc2VkIHRocm91Z2ggYGVuY29kZVVSSUNvbXBvbmVudCgpYCksIGl0XHJcbiAqIG9ubHkgbmVlZHMgdG8gYmUgYSByZXByZXNlbnRhdGlvbiBvZiBgdmFsYCB0aGF0IGhhcyBiZWVuIGNvZXJjZWQgdG8gYSBzdHJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gdmFsICBUaGUgdmFsdWUgdG8gZW5jb2RlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5ICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGluIHdoaWNoIGB2YWxgIGlzIHN0b3JlZC4gQ2FuIGJlIHVzZWQgZm9yXHJcbiAqICAgICAgICBtZXRhLXByb2dyYW1taW5nIG9mIGBUeXBlYCBvYmplY3RzLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBgdmFsYCB0aGF0IGNhbiBiZSBlbmNvZGVkIGluIGEgVVJMLlxyXG4gKi9cclxuVHlwZS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24odmFsLCBrZXkpIHtcclxuICByZXR1cm4gdmFsO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC50eXBlOlR5cGUjZGVjb2RlXHJcbiAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC50eXBlOlR5cGVcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIENvbnZlcnRzIGEgcGFyYW1ldGVyIHZhbHVlIChmcm9tIFVSTCBzdHJpbmcgb3IgdHJhbnNpdGlvbiBwYXJhbSkgdG8gYSBjdXN0b20vbmF0aXZlIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsICBUaGUgVVJMIHBhcmFtZXRlciB2YWx1ZSB0byBkZWNvZGUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaW4gd2hpY2ggYHZhbGAgaXMgc3RvcmVkLiBDYW4gYmUgdXNlZCBmb3JcclxuICogICAgICAgIG1ldGEtcHJvZ3JhbW1pbmcgb2YgYFR5cGVgIG9iamVjdHMuXHJcbiAqIEByZXR1cm5zIHsqfSAgUmV0dXJucyBhIGN1c3RvbSByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJMIHBhcmFtZXRlciB2YWx1ZS5cclxuICovXHJcblR5cGUucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uKHZhbCwga2V5KSB7XHJcbiAgcmV0dXJuIHZhbDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAbmdkb2MgZnVuY3Rpb25cclxuICogQG5hbWUgdWkucm91dGVyLnV0aWwudHlwZTpUeXBlI2VxdWFsc1xyXG4gKiBAbWV0aG9kT2YgdWkucm91dGVyLnV0aWwudHlwZTpUeXBlXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIGRlY29kZWQgdmFsdWVzIGFyZSBlcXVpdmFsZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IGEgIEEgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0LlxyXG4gKiBAcGFyYW0geyp9IGIgIEEgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQvZXF1YWwsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxuVHlwZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24oYSwgYikge1xyXG4gIHJldHVybiBhID09IGI7XHJcbn07XHJcblxyXG5UeXBlLnByb3RvdHlwZS4kc3ViUGF0dGVybiA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBzdWIgPSB0aGlzLnBhdHRlcm4udG9TdHJpbmcoKTtcclxuICByZXR1cm4gc3ViLnN1YnN0cigxLCBzdWIubGVuZ3RoIC0gMik7XHJcbn07XHJcblxyXG5UeXBlLnByb3RvdHlwZS5wYXR0ZXJuID0gLy4qLztcclxuXHJcblR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBcIntUeXBlOlwiICsgdGhpcy5uYW1lICsgXCJ9XCI7IH07XHJcblxyXG4vKiogR2l2ZW4gYW4gZW5jb2RlZCBzdHJpbmcsIG9yIGEgZGVjb2RlZCBvYmplY3QsIHJldHVybnMgYSBkZWNvZGVkIG9iamVjdCAqL1xyXG5UeXBlLnByb3RvdHlwZS4kbm9ybWFsaXplID0gZnVuY3Rpb24odmFsKSB7XHJcbiAgcmV0dXJuIHRoaXMuaXModmFsKSA/IHZhbCA6IHRoaXMuZGVjb2RlKHZhbCk7XHJcbn07XHJcblxyXG4vKlxyXG4gKiBXcmFwcyBhbiBleGlzdGluZyBjdXN0b20gVHlwZSBhcyBhbiBhcnJheSBvZiBUeXBlLCBkZXBlbmRpbmcgb24gJ21vZGUnLlxyXG4gKiBlLmcuOlxyXG4gKiAtIHVybG1hdGNoZXIgcGF0dGVybiBcIi9wYXRoP3txdWVyeVBhcmFtW106aW50fVwiXHJcbiAqIC0gdXJsOiBcIi9wYXRoP3F1ZXJ5UGFyYW09MSZxdWVyeVBhcmFtPTJcclxuICogLSAkc3RhdGVQYXJhbXMucXVlcnlQYXJhbSB3aWxsIGJlIFsxLCAyXVxyXG4gKiBpZiBgbW9kZWAgaXMgXCJhdXRvXCIsIHRoZW5cclxuICogLSB1cmw6IFwiL3BhdGg/cXVlcnlQYXJhbT0xIHdpbGwgY3JlYXRlICRzdGF0ZVBhcmFtcy5xdWVyeVBhcmFtOiAxXHJcbiAqIC0gdXJsOiBcIi9wYXRoP3F1ZXJ5UGFyYW09MSZxdWVyeVBhcmFtPTIgd2lsbCBjcmVhdGUgJHN0YXRlUGFyYW1zLnF1ZXJ5UGFyYW06IFsxLCAyXVxyXG4gKi9cclxuVHlwZS5wcm90b3R5cGUuJGFzQXJyYXkgPSBmdW5jdGlvbihtb2RlLCBpc1NlYXJjaCkge1xyXG4gIGlmICghbW9kZSkgcmV0dXJuIHRoaXM7XHJcbiAgaWYgKG1vZGUgPT09IFwiYXV0b1wiICYmICFpc1NlYXJjaCkgdGhyb3cgbmV3IEVycm9yKFwiJ2F1dG8nIGFycmF5IG1vZGUgaXMgZm9yIHF1ZXJ5IHBhcmFtZXRlcnMgb25seVwiKTtcclxuXHJcbiAgZnVuY3Rpb24gQXJyYXlUeXBlKHR5cGUsIG1vZGUpIHtcclxuICAgIGZ1bmN0aW9uIGJpbmRUbyh0eXBlLCBjYWxsYmFja05hbWUpIHtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0eXBlW2NhbGxiYWNrTmFtZV0uYXBwbHkodHlwZSwgYXJndW1lbnRzKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXcmFwIG5vbi1hcnJheSB2YWx1ZSBhcyBhcnJheVxyXG4gICAgZnVuY3Rpb24gYXJyYXlXcmFwKHZhbCkgeyByZXR1cm4gaXNBcnJheSh2YWwpID8gdmFsIDogKGlzRGVmaW5lZCh2YWwpID8gWyB2YWwgXSA6IFtdKTsgfVxyXG4gICAgLy8gVW53cmFwIGFycmF5IHZhbHVlIGZvciBcImF1dG9cIiBtb2RlLiBSZXR1cm4gdW5kZWZpbmVkIGZvciBlbXB0eSBhcnJheS5cclxuICAgIGZ1bmN0aW9uIGFycmF5VW53cmFwKHZhbCkge1xyXG4gICAgICBzd2l0Y2godmFsLmxlbmd0aCkge1xyXG4gICAgICAgIGNhc2UgMDogcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICBjYXNlIDE6IHJldHVybiBtb2RlID09PSBcImF1dG9cIiA/IHZhbFswXSA6IHZhbDtcclxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBmYWxzZXkodmFsKSB7IHJldHVybiAhdmFsOyB9XHJcblxyXG4gICAgLy8gV3JhcHMgdHlwZSAoLmlzLy5lbmNvZGUvLmRlY29kZSkgZnVuY3Rpb25zIHRvIG9wZXJhdGUgb24gZWFjaCB2YWx1ZSBvZiBhbiBhcnJheVxyXG4gICAgZnVuY3Rpb24gYXJyYXlIYW5kbGVyKGNhbGxiYWNrLCBhbGxUcnV0aHlNb2RlKSB7XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbiBoYW5kbGVBcnJheSh2YWwpIHtcclxuICAgICAgICBpZiAoaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPT09IDApIHJldHVybiB2YWw7XHJcbiAgICAgICAgdmFsID0gYXJyYXlXcmFwKHZhbCk7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IG1hcCh2YWwsIGNhbGxiYWNrKTtcclxuICAgICAgICBpZiAoYWxsVHJ1dGh5TW9kZSA9PT0gdHJ1ZSlcclxuICAgICAgICAgIHJldHVybiBmaWx0ZXIocmVzdWx0LCBmYWxzZXkpLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICByZXR1cm4gYXJyYXlVbndyYXAocmVzdWx0KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXcmFwcyB0eXBlICguZXF1YWxzKSBmdW5jdGlvbnMgdG8gb3BlcmF0ZSBvbiBlYWNoIHZhbHVlIG9mIGFuIGFycmF5XHJcbiAgICBmdW5jdGlvbiBhcnJheUVxdWFsc0hhbmRsZXIoY2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZUFycmF5KHZhbDEsIHZhbDIpIHtcclxuICAgICAgICB2YXIgbGVmdCA9IGFycmF5V3JhcCh2YWwxKSwgcmlnaHQgPSBhcnJheVdyYXAodmFsMik7XHJcbiAgICAgICAgaWYgKGxlZnQubGVuZ3RoICE9PSByaWdodC5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlZnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICghY2FsbGJhY2sobGVmdFtpXSwgcmlnaHRbaV0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW5jb2RlID0gYXJyYXlIYW5kbGVyKGJpbmRUbyh0eXBlLCAnZW5jb2RlJykpO1xyXG4gICAgdGhpcy5kZWNvZGUgPSBhcnJheUhhbmRsZXIoYmluZFRvKHR5cGUsICdkZWNvZGUnKSk7XHJcbiAgICB0aGlzLmlzICAgICA9IGFycmF5SGFuZGxlcihiaW5kVG8odHlwZSwgJ2lzJyksIHRydWUpO1xyXG4gICAgdGhpcy5lcXVhbHMgPSBhcnJheUVxdWFsc0hhbmRsZXIoYmluZFRvKHR5cGUsICdlcXVhbHMnKSk7XHJcbiAgICB0aGlzLnBhdHRlcm4gPSB0eXBlLnBhdHRlcm47XHJcbiAgICB0aGlzLiRub3JtYWxpemUgPSBhcnJheUhhbmRsZXIoYmluZFRvKHR5cGUsICckbm9ybWFsaXplJykpO1xyXG4gICAgdGhpcy5uYW1lID0gdHlwZS5uYW1lO1xyXG4gICAgdGhpcy4kYXJyYXlNb2RlID0gbW9kZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXcgQXJyYXlUeXBlKHRoaXMsIG1vZGUpO1xyXG59O1xyXG5cclxuXHJcblxyXG4vKipcclxuICogQG5nZG9jIG9iamVjdFxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC4kdXJsTWF0Y2hlckZhY3RvcnlcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIEZhY3RvcnkgZm9yIHtAbGluayB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIgYFVybE1hdGNoZXJgfSBpbnN0YW5jZXMuIFRoZSBmYWN0b3J5XHJcbiAqIGlzIGFsc28gYXZhaWxhYmxlIHRvIHByb3ZpZGVycyB1bmRlciB0aGUgbmFtZSBgJHVybE1hdGNoZXJGYWN0b3J5UHJvdmlkZXJgLlxyXG4gKi9cclxuZnVuY3Rpb24gJFVybE1hdGNoZXJGYWN0b3J5KCkge1xyXG4gICQkVU1GUCA9IHRoaXM7XHJcblxyXG4gIHZhciBpc0Nhc2VJbnNlbnNpdGl2ZSA9IGZhbHNlLCBpc1N0cmljdE1vZGUgPSB0cnVlLCBkZWZhdWx0U3F1YXNoUG9saWN5ID0gZmFsc2U7XHJcblxyXG4gIC8vIFVzZSB0aWxkZXMgdG8gcHJlLWVuY29kZSBzbGFzaGVzLlxyXG4gIC8vIElmIHRoZSBzbGFzaGVzIGFyZSBzaW1wbHkgVVJMRW5jb2RlZCwgdGhlIGJyb3dzZXIgY2FuIGNob29zZSB0byBwcmUtZGVjb2RlIHRoZW0sXHJcbiAgLy8gYW5kIGJpZGlyZWN0aW9uYWwgZW5jb2RpbmcvZGVjb2RpbmcgZmFpbHMuXHJcbiAgLy8gVGlsZGUgd2FzIGNob3NlbiBiZWNhdXNlIGl0J3Mgbm90IGEgUkZDIDM5ODYgc2VjdGlvbiAyLjIgUmVzZXJ2ZWQgQ2hhcmFjdGVyXHJcbiAgZnVuY3Rpb24gdmFsVG9TdHJpbmcodmFsKSB7IHJldHVybiB2YWwgIT0gbnVsbCA/IHZhbC50b1N0cmluZygpLnJlcGxhY2UoLyh+fFxcLykvZywgZnVuY3Rpb24gKG0pIHsgcmV0dXJuIHsnfic6J35+JywgJy8nOid+MkYnfVttXTsgfSkgOiB2YWw7IH1cclxuICBmdW5jdGlvbiB2YWxGcm9tU3RyaW5nKHZhbCkgeyByZXR1cm4gdmFsICE9IG51bGwgPyB2YWwudG9TdHJpbmcoKS5yZXBsYWNlKC8ofn58fjJGKS9nLCBmdW5jdGlvbiAobSkgeyByZXR1cm4geyd+fic6J34nLCAnfjJGJzonLyd9W21dOyB9KSA6IHZhbDsgfVxyXG5cclxuICB2YXIgJHR5cGVzID0ge30sIGVucXVldWUgPSB0cnVlLCB0eXBlUXVldWUgPSBbXSwgaW5qZWN0b3IsIGRlZmF1bHRUeXBlcyA9IHtcclxuICAgIFwic3RyaW5nXCI6IHtcclxuICAgICAgZW5jb2RlOiB2YWxUb1N0cmluZyxcclxuICAgICAgZGVjb2RlOiB2YWxGcm9tU3RyaW5nLFxyXG4gICAgICAvLyBUT0RPOiBpbiAxLjAsIG1ha2Ugc3RyaW5nIC5pcygpIHJldHVybiBmYWxzZSBpZiB2YWx1ZSBpcyB1bmRlZmluZWQvbnVsbCBieSBkZWZhdWx0LlxyXG4gICAgICAvLyBJbiAwLjIueCwgc3RyaW5nIHBhcmFtcyBhcmUgb3B0aW9uYWwgYnkgZGVmYXVsdCBmb3IgYmFja3dhcmRzIGNvbXBhdFxyXG4gICAgICBpczogZnVuY3Rpb24odmFsKSB7IHJldHVybiB2YWwgPT0gbnVsbCB8fCAhaXNEZWZpbmVkKHZhbCkgfHwgdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIjsgfSxcclxuICAgICAgcGF0dGVybjogL1teL10qL1xyXG4gICAgfSxcclxuICAgIFwiaW50XCI6IHtcclxuICAgICAgZW5jb2RlOiB2YWxUb1N0cmluZyxcclxuICAgICAgZGVjb2RlOiBmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTApOyB9LFxyXG4gICAgICBpczogZnVuY3Rpb24odmFsKSB7IHJldHVybiBpc0RlZmluZWQodmFsKSAmJiB0aGlzLmRlY29kZSh2YWwudG9TdHJpbmcoKSkgPT09IHZhbDsgfSxcclxuICAgICAgcGF0dGVybjogL1xcZCsvXHJcbiAgICB9LFxyXG4gICAgXCJib29sXCI6IHtcclxuICAgICAgZW5jb2RlOiBmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHZhbCA/IDEgOiAwOyB9LFxyXG4gICAgICBkZWNvZGU6IGZ1bmN0aW9uKHZhbCkgeyByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCkgIT09IDA7IH0sXHJcbiAgICAgIGlzOiBmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IGZhbHNlOyB9LFxyXG4gICAgICBwYXR0ZXJuOiAvMHwxL1xyXG4gICAgfSxcclxuICAgIFwiZGF0ZVwiOiB7XHJcbiAgICAgIGVuY29kZTogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pcyh2YWwpKVxyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICByZXR1cm4gWyB2YWwuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICAgICgnMCcgKyAodmFsLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpLFxyXG4gICAgICAgICAgKCcwJyArIHZhbC5nZXREYXRlKCkpLnNsaWNlKC0yKVxyXG4gICAgICAgIF0uam9pbihcIi1cIik7XHJcbiAgICAgIH0sXHJcbiAgICAgIGRlY29kZTogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzKHZhbCkpIHJldHVybiB2YWw7XHJcbiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5jYXB0dXJlLmV4ZWModmFsKTtcclxuICAgICAgICByZXR1cm4gbWF0Y2ggPyBuZXcgRGF0ZShtYXRjaFsxXSwgbWF0Y2hbMl0gLSAxLCBtYXRjaFszXSkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGlzOiBmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbC52YWx1ZU9mKCkpOyB9LFxyXG4gICAgICBlcXVhbHM6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiB0aGlzLmlzKGEpICYmIHRoaXMuaXMoYikgJiYgYS50b0lTT1N0cmluZygpID09PSBiLnRvSVNPU3RyaW5nKCk7IH0sXHJcbiAgICAgIHBhdHRlcm46IC9bMC05XXs0fS0oPzowWzEtOV18MVswLTJdKS0oPzowWzEtOV18WzEtMl1bMC05XXwzWzAtMV0pLyxcclxuICAgICAgY2FwdHVyZTogLyhbMC05XXs0fSktKDBbMS05XXwxWzAtMl0pLSgwWzEtOV18WzEtMl1bMC05XXwzWzAtMV0pL1xyXG4gICAgfSxcclxuICAgIFwianNvblwiOiB7XHJcbiAgICAgIGVuY29kZTogYW5ndWxhci50b0pzb24sXHJcbiAgICAgIGRlY29kZTogYW5ndWxhci5mcm9tSnNvbixcclxuICAgICAgaXM6IGFuZ3VsYXIuaXNPYmplY3QsXHJcbiAgICAgIGVxdWFsczogYW5ndWxhci5lcXVhbHMsXHJcbiAgICAgIHBhdHRlcm46IC9bXi9dKi9cclxuICAgIH0sXHJcbiAgICBcImFueVwiOiB7IC8vIGRvZXMgbm90IGVuY29kZS9kZWNvZGVcclxuICAgICAgZW5jb2RlOiBhbmd1bGFyLmlkZW50aXR5LFxyXG4gICAgICBkZWNvZGU6IGFuZ3VsYXIuaWRlbnRpdHksXHJcbiAgICAgIGVxdWFsczogYW5ndWxhci5lcXVhbHMsXHJcbiAgICAgIHBhdHRlcm46IC8uKi9cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBmdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlnKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RyaWN0OiBpc1N0cmljdE1vZGUsXHJcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZTogaXNDYXNlSW5zZW5zaXRpdmVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBpc0luamVjdGFibGUodmFsdWUpIHtcclxuICAgIHJldHVybiAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgKGlzQXJyYXkodmFsdWUpICYmIGlzRnVuY3Rpb24odmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0pKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbSW50ZXJuYWxdIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHBhcmFtZXRlciwgd2hpY2ggbWF5IGJlIGFuIGluamVjdGFibGUgZnVuY3Rpb24uXHJcbiAgICovXHJcbiAgJFVybE1hdGNoZXJGYWN0b3J5LiQkZ2V0RGVmYXVsdFZhbHVlID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBpZiAoIWlzSW5qZWN0YWJsZShjb25maWcudmFsdWUpKSByZXR1cm4gY29uZmlnLnZhbHVlO1xyXG4gICAgaWYgKCFpbmplY3RvcikgdGhyb3cgbmV3IEVycm9yKFwiSW5qZWN0YWJsZSBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBhdCBjb25maWd1cmF0aW9uIHRpbWVcIik7XHJcbiAgICByZXR1cm4gaW5qZWN0b3IuaW52b2tlKGNvbmZpZy52YWx1ZSk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdWkucm91dGVyLnV0aWwuJHVybE1hdGNoZXJGYWN0b3J5I2Nhc2VJbnNlbnNpdGl2ZVxyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kdXJsTWF0Y2hlckZhY3RvcnlcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIERlZmluZXMgd2hldGhlciBVUkwgbWF0Y2hpbmcgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlICh0aGUgZGVmYXVsdCBiZWhhdmlvciksIG9yIG5vdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgYGZhbHNlYCB0byBtYXRjaCBVUkwgaW4gYSBjYXNlIHNlbnNpdGl2ZSBtYW5uZXI7IG90aGVyd2lzZSBgdHJ1ZWA7XHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRoZSBjdXJyZW50IHZhbHVlIG9mIGNhc2VJbnNlbnNpdGl2ZVxyXG4gICAqL1xyXG4gIHRoaXMuY2FzZUluc2Vuc2l0aXZlID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIGlmIChpc0RlZmluZWQodmFsdWUpKVxyXG4gICAgICBpc0Nhc2VJbnNlbnNpdGl2ZSA9IHZhbHVlO1xyXG4gICAgcmV0dXJuIGlzQ2FzZUluc2Vuc2l0aXZlO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gICAqIEBuYW1lIHVpLnJvdXRlci51dGlsLiR1cmxNYXRjaGVyRmFjdG9yeSNzdHJpY3RNb2RlXHJcbiAgICogQG1ldGhvZE9mIHVpLnJvdXRlci51dGlsLiR1cmxNYXRjaGVyRmFjdG9yeVxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogRGVmaW5lcyB3aGV0aGVyIFVSTHMgc2hvdWxkIG1hdGNoIHRyYWlsaW5nIHNsYXNoZXMsIG9yIG5vdCAodGhlIGRlZmF1bHQgYmVoYXZpb3IpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtib29sZWFuPX0gdmFsdWUgYGZhbHNlYCB0byBtYXRjaCB0cmFpbGluZyBzbGFzaGVzIGluIFVSTHMsIG90aGVyd2lzZSBgdHJ1ZWAuXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRoZSBjdXJyZW50IHZhbHVlIG9mIHN0cmljdE1vZGVcclxuICAgKi9cclxuICB0aGlzLnN0cmljdE1vZGUgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpXHJcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHZhbHVlO1xyXG4gICAgcmV0dXJuIGlzU3RyaWN0TW9kZTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC4kdXJsTWF0Y2hlckZhY3RvcnkjZGVmYXVsdFNxdWFzaFBvbGljeVxyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kdXJsTWF0Y2hlckZhY3RvcnlcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIFNldHMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBnZW5lcmF0aW5nIG9yIG1hdGNoaW5nIFVSTHMgd2l0aCBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgQSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBkZWZhdWx0IHBhcmFtZXRlciBVUkwgc3F1YXNoaW5nIGJlaGF2aW9yLlxyXG4gICAqICAgIGBub3NxdWFzaGA6IFdoZW4gZ2VuZXJhdGluZyBhbiBocmVmIHdpdGggYSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZSwgZG8gbm90IHNxdWFzaCB0aGUgcGFyYW1ldGVyIHZhbHVlIGZyb20gdGhlIFVSTFxyXG4gICAqICAgIGBzbGFzaGA6IFdoZW4gZ2VuZXJhdGluZyBhbiBocmVmIHdpdGggYSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZSwgc3F1YXNoIChyZW1vdmUpIHRoZSBwYXJhbWV0ZXIgdmFsdWUsIGFuZCwgaWYgdGhlXHJcbiAgICogICAgICAgICAgICAgcGFyYW1ldGVyIGlzIHN1cnJvdW5kZWQgYnkgc2xhc2hlcywgc3F1YXNoIChyZW1vdmUpIG9uZSBzbGFzaCBmcm9tIHRoZSBVUkxcclxuICAgKiAgICBhbnkgb3RoZXIgc3RyaW5nLCBlLmcuIFwiflwiOiBXaGVuIGdlbmVyYXRpbmcgYW4gaHJlZiB3aXRoIGEgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUsIHNxdWFzaCAocmVtb3ZlKVxyXG4gICAqICAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdmFsdWUgZnJvbSB0aGUgVVJMIGFuZCByZXBsYWNlIGl0IHdpdGggdGhpcyBzdHJpbmcuXHJcbiAgICovXHJcbiAgdGhpcy5kZWZhdWx0U3F1YXNoUG9saWN5ID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIGlmICghaXNEZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGRlZmF1bHRTcXVhc2hQb2xpY3k7XHJcbiAgICBpZiAodmFsdWUgIT09IHRydWUgJiYgdmFsdWUgIT09IGZhbHNlICYmICFpc1N0cmluZyh2YWx1ZSkpXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3F1YXNoIHBvbGljeTogXCIgKyB2YWx1ZSArIFwiLiBWYWxpZCBwb2xpY2llczogZmFsc2UsIHRydWUsIGFyYml0cmFyeS1zdHJpbmdcIik7XHJcbiAgICBkZWZhdWx0U3F1YXNoUG9saWN5ID0gdmFsdWU7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdWkucm91dGVyLnV0aWwuJHVybE1hdGNoZXJGYWN0b3J5I2NvbXBpbGVcclxuICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnV0aWwuJHVybE1hdGNoZXJGYWN0b3J5XHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBDcmVhdGVzIGEge0BsaW5rIHVpLnJvdXRlci51dGlsLnR5cGU6VXJsTWF0Y2hlciBgVXJsTWF0Y2hlcmB9IGZvciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAgVGhlIFVSTCBwYXR0ZXJuLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgIFRoZSBjb25maWcgb2JqZWN0IGhhc2guXHJcbiAgICogQHJldHVybnMge1VybE1hdGNoZXJ9ICBUaGUgVXJsTWF0Y2hlci5cclxuICAgKi9cclxuICB0aGlzLmNvbXBpbGUgPSBmdW5jdGlvbiAocGF0dGVybiwgY29uZmlnKSB7XHJcbiAgICByZXR1cm4gbmV3IFVybE1hdGNoZXIocGF0dGVybiwgZXh0ZW5kKGdldERlZmF1bHRDb25maWcoKSwgY29uZmlnKSk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdWkucm91dGVyLnV0aWwuJHVybE1hdGNoZXJGYWN0b3J5I2lzTWF0Y2hlclxyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kdXJsTWF0Y2hlckZhY3RvcnlcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIGBVcmxNYXRjaGVyYCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAgVGhlIG9iamVjdCB0byBwZXJmb3JtIHRoZSB0eXBlIGNoZWNrIGFnYWluc3QuXHJcbiAgICogQHJldHVybnMge0Jvb2xlYW59ICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0IG1hdGNoZXMgdGhlIGBVcmxNYXRjaGVyYCBpbnRlcmZhY2UsIGJ5XHJcbiAgICogICAgICAgICAgaW1wbGVtZW50aW5nIGFsbCB0aGUgc2FtZSBtZXRob2RzLlxyXG4gICAqL1xyXG4gIHRoaXMuaXNNYXRjaGVyID0gZnVuY3Rpb24gKG8pIHtcclxuICAgIGlmICghaXNPYmplY3QobykpIHJldHVybiBmYWxzZTtcclxuICAgIHZhciByZXN1bHQgPSB0cnVlO1xyXG5cclxuICAgIGZvckVhY2goVXJsTWF0Y2hlci5wcm90b3R5cGUsIGZ1bmN0aW9uKHZhbCwgbmFtZSkge1xyXG4gICAgICBpZiAoaXNGdW5jdGlvbih2YWwpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIChpc0RlZmluZWQob1tuYW1lXSkgJiYgaXNGdW5jdGlvbihvW25hbWVdKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIudXRpbC4kdXJsTWF0Y2hlckZhY3RvcnkjdHlwZVxyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIudXRpbC4kdXJsTWF0Y2hlckZhY3RvcnlcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSB7QGxpbmsgdWkucm91dGVyLnV0aWwudHlwZTpUeXBlIGBUeXBlYH0gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG9cclxuICAgKiBnZW5lcmF0ZSBVUkxzIHdpdGggdHlwZWQgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lICBUaGUgdHlwZSBuYW1lLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBkZWZpbml0aW9uICAgVGhlIHR5cGUgZGVmaW5pdGlvbi4gU2VlXHJcbiAgICogICAgICAgIHtAbGluayB1aS5yb3V0ZXIudXRpbC50eXBlOlR5cGUgYFR5cGVgfSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIHZhbHVlcyBhY2NlcHRlZC5cclxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gZGVmaW5pdGlvbkZuIChvcHRpb25hbCkgQSBmdW5jdGlvbiB0aGF0IGlzIGluamVjdGVkIGJlZm9yZSB0aGUgYXBwXHJcbiAgICogICAgICAgIHJ1bnRpbWUgc3RhcnRzLiAgVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIG1lcmdlZCBpbnRvIHRoZSBleGlzdGluZyBgZGVmaW5pdGlvbmAuXHJcbiAgICogICAgICAgIFNlZSB7QGxpbmsgdWkucm91dGVyLnV0aWwudHlwZTpUeXBlIGBUeXBlYH0gZm9yIGluZm9ybWF0aW9uIG9uIHRoZSB2YWx1ZXMgYWNjZXB0ZWQuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAgUmV0dXJucyBgJHVybE1hdGNoZXJGYWN0b3J5UHJvdmlkZXJgLlxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgYSBjdXN0b20gdHlwZSB0aGF0IGVuY29kZXMgYW5kIGRlY29kZXMgaXRlbXMgZnJvbSBhblxyXG4gICAqIGFycmF5LCB1c2luZyB0aGUgYXJyYXkgaW5kZXggYXMgdGhlIFVSTC1lbmNvZGVkIHZhbHVlOlxyXG4gICAqXHJcbiAgICogPHByZT5cclxuICAgKiB2YXIgbGlzdCA9IFsnSm9obicsICdQYXVsJywgJ0dlb3JnZScsICdSaW5nbyddO1xyXG4gICAqXHJcbiAgICogJHVybE1hdGNoZXJGYWN0b3J5UHJvdmlkZXIudHlwZSgnbGlzdEl0ZW0nLCB7XHJcbiAgICogICBlbmNvZGU6IGZ1bmN0aW9uKGl0ZW0pIHtcclxuICAgKiAgICAgLy8gUmVwcmVzZW50IHRoZSBsaXN0IGl0ZW0gaW4gdGhlIFVSTCB1c2luZyBpdHMgY29ycmVzcG9uZGluZyBpbmRleFxyXG4gICAqICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGl0ZW0pO1xyXG4gICAqICAgfSxcclxuICAgKiAgIGRlY29kZTogZnVuY3Rpb24oaXRlbSkge1xyXG4gICAqICAgICAvLyBMb29rIHVwIHRoZSBsaXN0IGl0ZW0gYnkgaW5kZXhcclxuICAgKiAgICAgcmV0dXJuIGxpc3RbcGFyc2VJbnQoaXRlbSwgMTApXTtcclxuICAgKiAgIH0sXHJcbiAgICogICBpczogZnVuY3Rpb24oaXRlbSkge1xyXG4gICAqICAgICAvLyBFbnN1cmUgdGhlIGl0ZW0gaXMgdmFsaWQgYnkgY2hlY2tpbmcgdG8gc2VlIHRoYXQgaXQgYXBwZWFyc1xyXG4gICAqICAgICAvLyBpbiB0aGUgbGlzdFxyXG4gICAqICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGl0ZW0pID4gLTE7XHJcbiAgICogICB9XHJcbiAgICogfSk7XHJcbiAgICpcclxuICAgKiAkc3RhdGVQcm92aWRlci5zdGF0ZSgnbGlzdCcsIHtcclxuICAgKiAgIHVybDogXCIvbGlzdC97aXRlbTpsaXN0SXRlbX1cIixcclxuICAgKiAgIGNvbnRyb2xsZXI6IGZ1bmN0aW9uKCRzY29wZSwgJHN0YXRlUGFyYW1zKSB7XHJcbiAgICogICAgIGNvbnNvbGUubG9nKCRzdGF0ZVBhcmFtcy5pdGVtKTtcclxuICAgKiAgIH1cclxuICAgKiB9KTtcclxuICAgKlxyXG4gICAqIC8vIC4uLlxyXG4gICAqXHJcbiAgICogLy8gQ2hhbmdlcyBVUkwgdG8gJy9saXN0LzMnLCBsb2dzIFwiUmluZ29cIiB0byB0aGUgY29uc29sZVxyXG4gICAqICRzdGF0ZS5nbygnbGlzdCcsIHsgaXRlbTogXCJSaW5nb1wiIH0pO1xyXG4gICAqIDwvcHJlPlxyXG4gICAqXHJcbiAgICogVGhpcyBpcyBhIG1vcmUgY29tcGxleCBleGFtcGxlIG9mIGEgdHlwZSB0aGF0IHJlbGllcyBvbiBkZXBlbmRlbmN5IGluamVjdGlvbiB0b1xyXG4gICAqIGludGVyYWN0IHdpdGggc2VydmljZXMsIGFuZCB1c2VzIHRoZSBwYXJhbWV0ZXIgbmFtZSBmcm9tIHRoZSBVUkwgdG8gaW5mZXIgaG93IHRvXHJcbiAgICogaGFuZGxlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwYXJhbWV0ZXIgdmFsdWVzOlxyXG4gICAqXHJcbiAgICogPHByZT5cclxuICAgKiAvLyBEZWZpbmVzIGEgY3VzdG9tIHR5cGUgdGhhdCBnZXRzIGEgdmFsdWUgZnJvbSBhIHNlcnZpY2UsXHJcbiAgICogLy8gd2hlcmUgZWFjaCBzZXJ2aWNlIGdldHMgZGlmZmVyZW50IHR5cGVzIG9mIHZhbHVlcyBmcm9tXHJcbiAgICogLy8gYSBiYWNrZW5kIEFQSTpcclxuICAgKiAkdXJsTWF0Y2hlckZhY3RvcnlQcm92aWRlci50eXBlKCdkYk9iamVjdCcsIHt9LCBmdW5jdGlvbihVc2VycywgUG9zdHMpIHtcclxuICAgKlxyXG4gICAqICAgLy8gTWF0Y2hlcyB1cCBzZXJ2aWNlcyB0byBVUkwgcGFyYW1ldGVyIG5hbWVzXHJcbiAgICogICB2YXIgc2VydmljZXMgPSB7XHJcbiAgICogICAgIHVzZXI6IFVzZXJzLFxyXG4gICAqICAgICBwb3N0OiBQb3N0c1xyXG4gICAqICAgfTtcclxuICAgKlxyXG4gICAqICAgcmV0dXJuIHtcclxuICAgKiAgICAgZW5jb2RlOiBmdW5jdGlvbihvYmplY3QpIHtcclxuICAgKiAgICAgICAvLyBSZXByZXNlbnQgdGhlIG9iamVjdCBpbiB0aGUgVVJMIHVzaW5nIGl0cyB1bmlxdWUgSURcclxuICAgKiAgICAgICByZXR1cm4gb2JqZWN0LmlkO1xyXG4gICAqICAgICB9LFxyXG4gICAqICAgICBkZWNvZGU6IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcclxuICAgKiAgICAgICAvLyBMb29rIHVwIHRoZSBvYmplY3QgYnkgSUQsIHVzaW5nIHRoZSBwYXJhbWV0ZXJcclxuICAgKiAgICAgICAvLyBuYW1lIChrZXkpIHRvIGNhbGwgdGhlIGNvcnJlY3Qgc2VydmljZVxyXG4gICAqICAgICAgIHJldHVybiBzZXJ2aWNlc1trZXldLmZpbmRCeUlkKHZhbHVlKTtcclxuICAgKiAgICAgfSxcclxuICAgKiAgICAgaXM6IGZ1bmN0aW9uKG9iamVjdCwga2V5KSB7XHJcbiAgICogICAgICAgLy8gQ2hlY2sgdGhhdCBvYmplY3QgaXMgYSB2YWxpZCBkYk9iamVjdFxyXG4gICAqICAgICAgIHJldHVybiBhbmd1bGFyLmlzT2JqZWN0KG9iamVjdCkgJiYgb2JqZWN0LmlkICYmIHNlcnZpY2VzW2tleV07XHJcbiAgICogICAgIH1cclxuICAgKiAgICAgZXF1YWxzOiBmdW5jdGlvbihhLCBiKSB7XHJcbiAgICogICAgICAgLy8gQ2hlY2sgdGhlIGVxdWFsaXR5IG9mIGRlY29kZWQgb2JqZWN0cyBieSBjb21wYXJpbmdcclxuICAgKiAgICAgICAvLyB0aGVpciB1bmlxdWUgSURzXHJcbiAgICogICAgICAgcmV0dXJuIGEuaWQgPT09IGIuaWQ7XHJcbiAgICogICAgIH1cclxuICAgKiAgIH07XHJcbiAgICogfSk7XHJcbiAgICpcclxuICAgKiAvLyBJbiBhIGNvbmZpZygpIGJsb2NrLCB5b3UgY2FuIHRoZW4gYXR0YWNoIFVSTHMgd2l0aFxyXG4gICAqIC8vIHR5cGUtYW5ub3RhdGVkIHBhcmFtZXRlcnM6XHJcbiAgICogJHN0YXRlUHJvdmlkZXIuc3RhdGUoJ3VzZXJzJywge1xyXG4gICAqICAgdXJsOiBcIi91c2Vyc1wiLFxyXG4gICAqICAgLy8gLi4uXHJcbiAgICogfSkuc3RhdGUoJ3VzZXJzLml0ZW0nLCB7XHJcbiAgICogICB1cmw6IFwiL3t1c2VyOmRiT2JqZWN0fVwiLFxyXG4gICAqICAgY29udHJvbGxlcjogZnVuY3Rpb24oJHNjb3BlLCAkc3RhdGVQYXJhbXMpIHtcclxuICAgKiAgICAgLy8gJHN0YXRlUGFyYW1zLnVzZXIgd2lsbCBub3cgYmUgYW4gb2JqZWN0IHJldHVybmVkIGZyb21cclxuICAgKiAgICAgLy8gdGhlIFVzZXJzIHNlcnZpY2VcclxuICAgKiAgIH0sXHJcbiAgICogICAvLyAuLi5cclxuICAgKiB9KTtcclxuICAgKiA8L3ByZT5cclxuICAgKi9cclxuICB0aGlzLnR5cGUgPSBmdW5jdGlvbiAobmFtZSwgZGVmaW5pdGlvbiwgZGVmaW5pdGlvbkZuKSB7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChkZWZpbml0aW9uKSkgcmV0dXJuICR0eXBlc1tuYW1lXTtcclxuICAgIGlmICgkdHlwZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHRocm93IG5ldyBFcnJvcihcIkEgdHlwZSBuYW1lZCAnXCIgKyBuYW1lICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC5cIik7XHJcblxyXG4gICAgJHR5cGVzW25hbWVdID0gbmV3IFR5cGUoZXh0ZW5kKHsgbmFtZTogbmFtZSB9LCBkZWZpbml0aW9uKSk7XHJcbiAgICBpZiAoZGVmaW5pdGlvbkZuKSB7XHJcbiAgICAgIHR5cGVRdWV1ZS5wdXNoKHsgbmFtZTogbmFtZSwgZGVmOiBkZWZpbml0aW9uRm4gfSk7XHJcbiAgICAgIGlmICghZW5xdWV1ZSkgZmx1c2hUeXBlUXVldWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcblxyXG4gIC8vIGBmbHVzaFR5cGVRdWV1ZSgpYCB3YWl0cyB1bnRpbCBgJHVybE1hdGNoZXJGYWN0b3J5YCBpcyBpbmplY3RlZCBiZWZvcmUgaW52b2tpbmcgdGhlIHF1ZXVlZCBgZGVmaW5pdGlvbkZuYHNcclxuICBmdW5jdGlvbiBmbHVzaFR5cGVRdWV1ZSgpIHtcclxuICAgIHdoaWxlKHR5cGVRdWV1ZS5sZW5ndGgpIHtcclxuICAgICAgdmFyIHR5cGUgPSB0eXBlUXVldWUuc2hpZnQoKTtcclxuICAgICAgaWYgKHR5cGUucGF0dGVybikgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBvdmVycmlkZSBhIHR5cGUncyAucGF0dGVybiBhdCBydW50aW1lLlwiKTtcclxuICAgICAgYW5ndWxhci5leHRlbmQoJHR5cGVzW3R5cGUubmFtZV0sIGluamVjdG9yLmludm9rZSh0eXBlLmRlZikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmVnaXN0ZXIgZGVmYXVsdCB0eXBlcy4gU3RvcmUgdGhlbSBpbiB0aGUgcHJvdG90eXBlIG9mICR0eXBlcy5cclxuICBmb3JFYWNoKGRlZmF1bHRUeXBlcywgZnVuY3Rpb24odHlwZSwgbmFtZSkgeyAkdHlwZXNbbmFtZV0gPSBuZXcgVHlwZShleHRlbmQoe25hbWU6IG5hbWV9LCB0eXBlKSk7IH0pO1xyXG4gICR0eXBlcyA9IGluaGVyaXQoJHR5cGVzLCB7fSk7XHJcblxyXG4gIC8qIE5vIG5lZWQgdG8gZG9jdW1lbnQgJGdldCwgc2luY2UgaXQgcmV0dXJucyB0aGlzICovXHJcbiAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCBmdW5jdGlvbiAoJGluamVjdG9yKSB7XHJcbiAgICBpbmplY3RvciA9ICRpbmplY3RvcjtcclxuICAgIGVucXVldWUgPSBmYWxzZTtcclxuICAgIGZsdXNoVHlwZVF1ZXVlKCk7XHJcblxyXG4gICAgZm9yRWFjaChkZWZhdWx0VHlwZXMsIGZ1bmN0aW9uKHR5cGUsIG5hbWUpIHtcclxuICAgICAgaWYgKCEkdHlwZXNbbmFtZV0pICR0eXBlc1tuYW1lXSA9IG5ldyBUeXBlKHR5cGUpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XTtcclxuXHJcbiAgdGhpcy5QYXJhbSA9IGZ1bmN0aW9uIFBhcmFtKGlkLCB0eXBlLCBjb25maWcsIGxvY2F0aW9uKSB7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25maWcgPSB1bndyYXBTaG9ydGhhbmQoY29uZmlnKTtcclxuICAgIHR5cGUgPSBnZXRUeXBlKGNvbmZpZywgdHlwZSwgbG9jYXRpb24pO1xyXG4gICAgdmFyIGFycmF5TW9kZSA9IGdldEFycmF5TW9kZSgpO1xyXG4gICAgdHlwZSA9IGFycmF5TW9kZSA/IHR5cGUuJGFzQXJyYXkoYXJyYXlNb2RlLCBsb2NhdGlvbiA9PT0gXCJzZWFyY2hcIikgOiB0eXBlO1xyXG4gICAgaWYgKHR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAhYXJyYXlNb2RlICYmIGxvY2F0aW9uID09PSBcInBhdGhcIiAmJiBjb25maWcudmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgY29uZmlnLnZhbHVlID0gXCJcIjsgLy8gZm9yIDAuMi54OyBpbiAwLjMuMCsgZG8gbm90IGF1dG9tYXRpY2FsbHkgZGVmYXVsdCB0byBcIlwiXHJcbiAgICB2YXIgaXNPcHRpb25hbCA9IGNvbmZpZy52YWx1ZSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgdmFyIHNxdWFzaCA9IGdldFNxdWFzaFBvbGljeShjb25maWcsIGlzT3B0aW9uYWwpO1xyXG4gICAgdmFyIHJlcGxhY2UgPSBnZXRSZXBsYWNlKGNvbmZpZywgYXJyYXlNb2RlLCBpc09wdGlvbmFsLCBzcXVhc2gpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHVud3JhcFNob3J0aGFuZChjb25maWcpIHtcclxuICAgICAgdmFyIGtleXMgPSBpc09iamVjdChjb25maWcpID8gb2JqZWN0S2V5cyhjb25maWcpIDogW107XHJcbiAgICAgIHZhciBpc1Nob3J0aGFuZCA9IGluZGV4T2Yoa2V5cywgXCJ2YWx1ZVwiKSA9PT0gLTEgJiYgaW5kZXhPZihrZXlzLCBcInR5cGVcIikgPT09IC0xICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2Yoa2V5cywgXCJzcXVhc2hcIikgPT09IC0xICYmIGluZGV4T2Yoa2V5cywgXCJhcnJheVwiKSA9PT0gLTE7XHJcbiAgICAgIGlmIChpc1Nob3J0aGFuZCkgY29uZmlnID0geyB2YWx1ZTogY29uZmlnIH07XHJcbiAgICAgIGNvbmZpZy4kJGZuID0gaXNJbmplY3RhYmxlKGNvbmZpZy52YWx1ZSkgPyBjb25maWcudmFsdWUgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWcudmFsdWU7IH07XHJcbiAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VHlwZShjb25maWcsIHVybFR5cGUsIGxvY2F0aW9uKSB7XHJcbiAgICAgIGlmIChjb25maWcudHlwZSAmJiB1cmxUeXBlKSB0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbSAnXCIraWQrXCInIGhhcyB0d28gdHlwZSBjb25maWd1cmF0aW9ucy5cIik7XHJcbiAgICAgIGlmICh1cmxUeXBlKSByZXR1cm4gdXJsVHlwZTtcclxuICAgICAgaWYgKCFjb25maWcudHlwZSkgcmV0dXJuIChsb2NhdGlvbiA9PT0gXCJjb25maWdcIiA/ICR0eXBlcy5hbnkgOiAkdHlwZXMuc3RyaW5nKTtcclxuXHJcbiAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKGNvbmZpZy50eXBlKSlcclxuICAgICAgICByZXR1cm4gJHR5cGVzW2NvbmZpZy50eXBlXTtcclxuICAgICAgaWYgKGNvbmZpZy50eXBlIGluc3RhbmNlb2YgVHlwZSlcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGU7XHJcbiAgICAgIHJldHVybiBuZXcgVHlwZShjb25maWcudHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXJyYXkgY29uZmlnOiBwYXJhbSBuYW1lIChwYXJhbVtdKSBvdmVycmlkZXMgZGVmYXVsdCBzZXR0aW5ncy4gIGV4cGxpY2l0IGNvbmZpZyBvdmVycmlkZXMgcGFyYW0gbmFtZS5cclxuICAgIGZ1bmN0aW9uIGdldEFycmF5TW9kZSgpIHtcclxuICAgICAgdmFyIGFycmF5RGVmYXVsdHMgPSB7IGFycmF5OiAobG9jYXRpb24gPT09IFwic2VhcmNoXCIgPyBcImF1dG9cIiA6IGZhbHNlKSB9O1xyXG4gICAgICB2YXIgYXJyYXlQYXJhbU5vbWVuY2xhdHVyZSA9IGlkLm1hdGNoKC9cXFtcXF0kLykgPyB7IGFycmF5OiB0cnVlIH0gOiB7fTtcclxuICAgICAgcmV0dXJuIGV4dGVuZChhcnJheURlZmF1bHRzLCBhcnJheVBhcmFtTm9tZW5jbGF0dXJlLCBjb25maWcpLmFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcmV0dXJucyBmYWxzZSwgdHJ1ZSwgb3IgdGhlIHNxdWFzaCB2YWx1ZSB0byBpbmRpY2F0ZSB0aGUgXCJkZWZhdWx0IHBhcmFtZXRlciB1cmwgc3F1YXNoIHBvbGljeVwiLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBnZXRTcXVhc2hQb2xpY3koY29uZmlnLCBpc09wdGlvbmFsKSB7XHJcbiAgICAgIHZhciBzcXVhc2ggPSBjb25maWcuc3F1YXNoO1xyXG4gICAgICBpZiAoIWlzT3B0aW9uYWwgfHwgc3F1YXNoID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoIWlzRGVmaW5lZChzcXVhc2gpIHx8IHNxdWFzaCA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFNxdWFzaFBvbGljeTtcclxuICAgICAgaWYgKHNxdWFzaCA9PT0gdHJ1ZSB8fCBpc1N0cmluZyhzcXVhc2gpKSByZXR1cm4gc3F1YXNoO1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNxdWFzaCBwb2xpY3k6ICdcIiArIHNxdWFzaCArIFwiJy4gVmFsaWQgcG9saWNpZXM6IGZhbHNlLCB0cnVlLCBvciBhcmJpdHJhcnkgc3RyaW5nXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFJlcGxhY2UoY29uZmlnLCBhcnJheU1vZGUsIGlzT3B0aW9uYWwsIHNxdWFzaCkge1xyXG4gICAgICB2YXIgcmVwbGFjZSwgY29uZmlndXJlZEtleXMsIGRlZmF1bHRQb2xpY3kgPSBbXHJcbiAgICAgICAgeyBmcm9tOiBcIlwiLCAgIHRvOiAoaXNPcHRpb25hbCB8fCBhcnJheU1vZGUgPyB1bmRlZmluZWQgOiBcIlwiKSB9LFxyXG4gICAgICAgIHsgZnJvbTogbnVsbCwgdG86IChpc09wdGlvbmFsIHx8IGFycmF5TW9kZSA/IHVuZGVmaW5lZCA6IFwiXCIpIH1cclxuICAgICAgXTtcclxuICAgICAgcmVwbGFjZSA9IGlzQXJyYXkoY29uZmlnLnJlcGxhY2UpID8gY29uZmlnLnJlcGxhY2UgOiBbXTtcclxuICAgICAgaWYgKGlzU3RyaW5nKHNxdWFzaCkpXHJcbiAgICAgICAgcmVwbGFjZS5wdXNoKHsgZnJvbTogc3F1YXNoLCB0bzogdW5kZWZpbmVkIH0pO1xyXG4gICAgICBjb25maWd1cmVkS2V5cyA9IG1hcChyZXBsYWNlLCBmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtLmZyb207IH0gKTtcclxuICAgICAgcmV0dXJuIGZpbHRlcihkZWZhdWx0UG9saWN5LCBmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpbmRleE9mKGNvbmZpZ3VyZWRLZXlzLCBpdGVtLmZyb20pID09PSAtMTsgfSkuY29uY2F0KHJlcGxhY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW0ludGVybmFsXSBHZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBwYXJhbWV0ZXIsIHdoaWNoIG1heSBiZSBhbiBpbmplY3RhYmxlIGZ1bmN0aW9uLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiAkJGdldERlZmF1bHRWYWx1ZSgpIHtcclxuICAgICAgaWYgKCFpbmplY3RvcikgdGhyb3cgbmV3IEVycm9yKFwiSW5qZWN0YWJsZSBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBhdCBjb25maWd1cmF0aW9uIHRpbWVcIik7XHJcbiAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBpbmplY3Rvci5pbnZva2UoY29uZmlnLiQkZm4pO1xyXG4gICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFzZWxmLnR5cGUuaXMoZGVmYXVsdFZhbHVlKSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZhdWx0IHZhbHVlIChcIiArIGRlZmF1bHRWYWx1ZSArIFwiKSBmb3IgcGFyYW1ldGVyICdcIiArIHNlbGYuaWQgKyBcIicgaXMgbm90IGFuIGluc3RhbmNlIG9mIFR5cGUgKFwiICsgc2VsZi50eXBlLm5hbWUgKyBcIilcIik7XHJcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbSW50ZXJuYWxdIEdldHMgdGhlIGRlY29kZWQgcmVwcmVzZW50YXRpb24gb2YgYSB2YWx1ZSBpZiB0aGUgdmFsdWUgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlLCByZXR1cm5zIHRoZVxyXG4gICAgICogZGVmYXVsdCB2YWx1ZSwgd2hpY2ggbWF5IGJlIHRoZSByZXN1bHQgb2YgYW4gaW5qZWN0YWJsZSBmdW5jdGlvbi5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gJHZhbHVlKHZhbHVlKSB7XHJcbiAgICAgIGZ1bmN0aW9uIGhhc1JlcGxhY2VWYWwodmFsKSB7IHJldHVybiBmdW5jdGlvbihvYmopIHsgcmV0dXJuIG9iai5mcm9tID09PSB2YWw7IH07IH1cclxuICAgICAgZnVuY3Rpb24gJHJlcGxhY2UodmFsdWUpIHtcclxuICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBtYXAoZmlsdGVyKHNlbGYucmVwbGFjZSwgaGFzUmVwbGFjZVZhbCh2YWx1ZSkpLCBmdW5jdGlvbihvYmopIHsgcmV0dXJuIG9iai50bzsgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50Lmxlbmd0aCA/IHJlcGxhY2VtZW50WzBdIDogdmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgdmFsdWUgPSAkcmVwbGFjZSh2YWx1ZSk7XHJcbiAgICAgIHJldHVybiAhaXNEZWZpbmVkKHZhbHVlKSA/ICQkZ2V0RGVmYXVsdFZhbHVlKCkgOiBzZWxmLnR5cGUuJG5vcm1hbGl6ZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcoKSB7IHJldHVybiBcIntQYXJhbTpcIiArIGlkICsgXCIgXCIgKyB0eXBlICsgXCIgc3F1YXNoOiAnXCIgKyBzcXVhc2ggKyBcIicgb3B0aW9uYWw6IFwiICsgaXNPcHRpb25hbCArIFwifVwiOyB9XHJcblxyXG4gICAgZXh0ZW5kKHRoaXMsIHtcclxuICAgICAgaWQ6IGlkLFxyXG4gICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICBsb2NhdGlvbjogbG9jYXRpb24sXHJcbiAgICAgIGFycmF5OiBhcnJheU1vZGUsXHJcbiAgICAgIHNxdWFzaDogc3F1YXNoLFxyXG4gICAgICByZXBsYWNlOiByZXBsYWNlLFxyXG4gICAgICBpc09wdGlvbmFsOiBpc09wdGlvbmFsLFxyXG4gICAgICB2YWx1ZTogJHZhbHVlLFxyXG4gICAgICBkeW5hbWljOiB1bmRlZmluZWQsXHJcbiAgICAgIGNvbmZpZzogY29uZmlnLFxyXG4gICAgICB0b1N0cmluZzogdG9TdHJpbmdcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIFBhcmFtU2V0KHBhcmFtcykge1xyXG4gICAgZXh0ZW5kKHRoaXMsIHBhcmFtcyB8fCB7fSk7XHJcbiAgfVxyXG5cclxuICBQYXJhbVNldC5wcm90b3R5cGUgPSB7XHJcbiAgICAkJG5ldzogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBpbmhlcml0KHRoaXMsIGV4dGVuZChuZXcgUGFyYW1TZXQoKSwgeyAkJHBhcmVudDogdGhpc30pKTtcclxuICAgIH0sXHJcbiAgICAkJGtleXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIGtleXMgPSBbXSwgY2hhaW4gPSBbXSwgcGFyZW50ID0gdGhpcyxcclxuICAgICAgICBpZ25vcmUgPSBvYmplY3RLZXlzKFBhcmFtU2V0LnByb3RvdHlwZSk7XHJcbiAgICAgIHdoaWxlIChwYXJlbnQpIHsgY2hhaW4ucHVzaChwYXJlbnQpOyBwYXJlbnQgPSBwYXJlbnQuJCRwYXJlbnQ7IH1cclxuICAgICAgY2hhaW4ucmV2ZXJzZSgpO1xyXG4gICAgICBmb3JFYWNoKGNoYWluLCBmdW5jdGlvbihwYXJhbXNldCkge1xyXG4gICAgICAgIGZvckVhY2gob2JqZWN0S2V5cyhwYXJhbXNldCksIGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhPZihrZXlzLCBrZXkpID09PSAtMSAmJiBpbmRleE9mKGlnbm9yZSwga2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9LFxyXG4gICAgJCR2YWx1ZXM6IGZ1bmN0aW9uKHBhcmFtVmFsdWVzKSB7XHJcbiAgICAgIHZhciB2YWx1ZXMgPSB7fSwgc2VsZiA9IHRoaXM7XHJcbiAgICAgIGZvckVhY2goc2VsZi4kJGtleXMoKSwgZnVuY3Rpb24oa2V5KSB7XHJcbiAgICAgICAgdmFsdWVzW2tleV0gPSBzZWxmW2tleV0udmFsdWUocGFyYW1WYWx1ZXMgJiYgcGFyYW1WYWx1ZXNba2V5XSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdmFsdWVzO1xyXG4gICAgfSxcclxuICAgICQkZXF1YWxzOiBmdW5jdGlvbihwYXJhbVZhbHVlczEsIHBhcmFtVmFsdWVzMikge1xyXG4gICAgICB2YXIgZXF1YWwgPSB0cnVlLCBzZWxmID0gdGhpcztcclxuICAgICAgZm9yRWFjaChzZWxmLiQka2V5cygpLCBmdW5jdGlvbihrZXkpIHtcclxuICAgICAgICB2YXIgbGVmdCA9IHBhcmFtVmFsdWVzMSAmJiBwYXJhbVZhbHVlczFba2V5XSwgcmlnaHQgPSBwYXJhbVZhbHVlczIgJiYgcGFyYW1WYWx1ZXMyW2tleV07XHJcbiAgICAgICAgaWYgKCFzZWxmW2tleV0udHlwZS5lcXVhbHMobGVmdCwgcmlnaHQpKSBlcXVhbCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGVxdWFsO1xyXG4gICAgfSxcclxuICAgICQkdmFsaWRhdGVzOiBmdW5jdGlvbiAkJHZhbGlkYXRlKHBhcmFtVmFsdWVzKSB7XHJcbiAgICAgIHZhciBrZXlzID0gdGhpcy4kJGtleXMoKSwgaSwgcGFyYW0sIHJhd1ZhbCwgbm9ybWFsaXplZCwgZW5jb2RlZDtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwYXJhbSA9IHRoaXNba2V5c1tpXV07XHJcbiAgICAgICAgcmF3VmFsID0gcGFyYW1WYWx1ZXNba2V5c1tpXV07XHJcbiAgICAgICAgaWYgKChyYXdWYWwgPT09IHVuZGVmaW5lZCB8fCByYXdWYWwgPT09IG51bGwpICYmIHBhcmFtLmlzT3B0aW9uYWwpXHJcbiAgICAgICAgICBicmVhazsgLy8gVGhlcmUgd2FzIG5vIHBhcmFtZXRlciB2YWx1ZSwgYnV0IHRoZSBwYXJhbSBpcyBvcHRpb25hbFxyXG4gICAgICAgIG5vcm1hbGl6ZWQgPSBwYXJhbS50eXBlLiRub3JtYWxpemUocmF3VmFsKTtcclxuICAgICAgICBpZiAoIXBhcmFtLnR5cGUuaXMobm9ybWFsaXplZCkpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFRoZSB2YWx1ZSB3YXMgbm90IG9mIHRoZSBjb3JyZWN0IFR5cGUsIGFuZCBjb3VsZCBub3QgYmUgZGVjb2RlZCB0byB0aGUgY29ycmVjdCBUeXBlXHJcbiAgICAgICAgZW5jb2RlZCA9IHBhcmFtLnR5cGUuZW5jb2RlKG5vcm1hbGl6ZWQpO1xyXG4gICAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKGVuY29kZWQpICYmICFwYXJhbS50eXBlLnBhdHRlcm4uZXhlYyhlbmNvZGVkKSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gVGhlIHZhbHVlIHdhcyBvZiB0aGUgY29ycmVjdCB0eXBlLCBidXQgd2hlbiBlbmNvZGVkLCBkaWQgbm90IG1hdGNoIHRoZSBUeXBlJ3MgcmVnZXhwXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG4gICAgJCRwYXJlbnQ6IHVuZGVmaW5lZFxyXG4gIH07XHJcblxyXG4gIHRoaXMuUGFyYW1TZXQgPSBQYXJhbVNldDtcclxufVxyXG5cclxuLy8gUmVnaXN0ZXIgYXMgYSBwcm92aWRlciBzbyBpdCdzIGF2YWlsYWJsZSB0byBvdGhlciBwcm92aWRlcnNcclxuYW5ndWxhci5tb2R1bGUoJ3VpLnJvdXRlci51dGlsJykucHJvdmlkZXIoJyR1cmxNYXRjaGVyRmFjdG9yeScsICRVcmxNYXRjaGVyRmFjdG9yeSk7XHJcbmFuZ3VsYXIubW9kdWxlKCd1aS5yb3V0ZXIudXRpbCcpLnJ1bihbJyR1cmxNYXRjaGVyRmFjdG9yeScsIGZ1bmN0aW9uKCR1cmxNYXRjaGVyRmFjdG9yeSkgeyB9XSk7XHJcblxyXG4vKipcclxuICogQG5nZG9jIG9iamVjdFxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIucm91dGVyLiR1cmxSb3V0ZXJQcm92aWRlclxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnV0aWwuJHVybE1hdGNoZXJGYWN0b3J5UHJvdmlkZXJcclxuICogQHJlcXVpcmVzICRsb2NhdGlvblByb3ZpZGVyXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBgJHVybFJvdXRlclByb3ZpZGVyYCBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHdhdGNoaW5nIGAkbG9jYXRpb25gLiBcclxuICogV2hlbiBgJGxvY2F0aW9uYCBjaGFuZ2VzIGl0IHJ1bnMgdGhyb3VnaCBhIGxpc3Qgb2YgcnVsZXMgb25lIGJ5IG9uZSB1bnRpbCBhIFxyXG4gKiBtYXRjaCBpcyBmb3VuZC4gYCR1cmxSb3V0ZXJQcm92aWRlcmAgaXMgdXNlZCBiZWhpbmQgdGhlIHNjZW5lcyBhbnl0aW1lIHlvdSBzcGVjaWZ5IFxyXG4gKiBhIHVybCBpbiBhIHN0YXRlIGNvbmZpZ3VyYXRpb24uIEFsbCB1cmxzIGFyZSBjb21waWxlZCBpbnRvIGEgVXJsTWF0Y2hlciBvYmplY3QuXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgb24gYCR1cmxSb3V0ZXJQcm92aWRlcmAgdGhhdCBtYWtlIGl0IHVzZWZ1bCB0byB1c2UgZGlyZWN0bHlcclxuICogaW4geW91ciBtb2R1bGUgY29uZmlnLlxyXG4gKi9cclxuJFVybFJvdXRlclByb3ZpZGVyLiRpbmplY3QgPSBbJyRsb2NhdGlvblByb3ZpZGVyJywgJyR1cmxNYXRjaGVyRmFjdG9yeVByb3ZpZGVyJ107XHJcbmZ1bmN0aW9uICRVcmxSb3V0ZXJQcm92aWRlciggICAkbG9jYXRpb25Qcm92aWRlciwgICAkdXJsTWF0Y2hlckZhY3RvcnkpIHtcclxuICB2YXIgcnVsZXMgPSBbXSwgb3RoZXJ3aXNlID0gbnVsbCwgaW50ZXJjZXB0RGVmZXJyZWQgPSBmYWxzZSwgbGlzdGVuZXI7XHJcblxyXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBhIHByZWZpeCBvZiBhbGwgc3RyaW5ncyBtYXRjaGluZyB0aGUgUmVnRXhwXHJcbiAgZnVuY3Rpb24gcmVnRXhwUHJlZml4KHJlKSB7XHJcbiAgICB2YXIgcHJlZml4ID0gL15cXF4oKD86XFxcXFteYS16QS1aMC05XXxbXlxcXFxcXFtcXF1cXF4kKis/LigpfHt9XSspKikvLmV4ZWMocmUuc291cmNlKTtcclxuICAgIHJldHVybiAocHJlZml4ICE9IG51bGwpID8gcHJlZml4WzFdLnJlcGxhY2UoL1xcXFwoLikvZywgXCIkMVwiKSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gSW50ZXJwb2xhdGVzIG1hdGNoZWQgdmFsdWVzIGludG8gYSBTdHJpbmcucmVwbGFjZSgpLXN0eWxlIHBhdHRlcm5cclxuICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShwYXR0ZXJuLCBtYXRjaCkge1xyXG4gICAgcmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvXFwkKFxcJHxcXGR7MSwyfSkvLCBmdW5jdGlvbiAobSwgd2hhdCkge1xyXG4gICAgICByZXR1cm4gbWF0Y2hbd2hhdCA9PT0gJyQnID8gMCA6IE51bWJlcih3aGF0KV07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gICAqIEBuYW1lIHVpLnJvdXRlci5yb3V0ZXIuJHVybFJvdXRlclByb3ZpZGVyI3J1bGVcclxuICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyUHJvdmlkZXJcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIERlZmluZXMgcnVsZXMgdGhhdCBhcmUgdXNlZCBieSBgJHVybFJvdXRlclByb3ZpZGVyYCB0byBmaW5kIG1hdGNoZXMgZm9yXHJcbiAgICogc3BlY2lmaWMgVVJMcy5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogPHByZT5cclxuICAgKiB2YXIgYXBwID0gYW5ndWxhci5tb2R1bGUoJ2FwcCcsIFsndWkucm91dGVyLnJvdXRlciddKTtcclxuICAgKlxyXG4gICAqIGFwcC5jb25maWcoZnVuY3Rpb24gKCR1cmxSb3V0ZXJQcm92aWRlcikge1xyXG4gICAqICAgLy8gSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHlvdSBtaWdodCBhbGxvdyBjYXNlIGluc2Vuc2l0aXZlIHVybHNcclxuICAgKiAgICR1cmxSb3V0ZXJQcm92aWRlci5ydWxlKGZ1bmN0aW9uICgkaW5qZWN0b3IsICRsb2NhdGlvbikge1xyXG4gICAqICAgICB2YXIgcGF0aCA9ICRsb2NhdGlvbi5wYXRoKCksXHJcbiAgICogICAgICAgICBub3JtYWxpemVkID0gcGF0aC50b0xvd2VyQ2FzZSgpO1xyXG4gICAqXHJcbiAgICogICAgIGlmIChwYXRoICE9PSBub3JtYWxpemVkKSB7XHJcbiAgICogICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XHJcbiAgICogICAgIH1cclxuICAgKiAgIH0pO1xyXG4gICAqIH0pO1xyXG4gICAqIDwvcHJlPlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gcnVsZSBIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYCRpbmplY3RvcmAgYW5kIGAkbG9jYXRpb25gXHJcbiAgICogc2VydmljZXMgYXMgYXJndW1lbnRzLiBZb3UgY2FuIHVzZSB0aGVtIHRvIHJldHVybiBhIHZhbGlkIHBhdGggYXMgYSBzdHJpbmcuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtvYmplY3R9IGAkdXJsUm91dGVyUHJvdmlkZXJgIC0gYCR1cmxSb3V0ZXJQcm92aWRlcmAgaW5zdGFuY2VcclxuICAgKi9cclxuICB0aGlzLnJ1bGUgPSBmdW5jdGlvbiAocnVsZSkge1xyXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHJ1bGUpKSB0aHJvdyBuZXcgRXJyb3IoXCIncnVsZScgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xyXG4gICAgcnVsZXMucHVzaChydWxlKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBvYmplY3RcclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIucm91dGVyLiR1cmxSb3V0ZXJQcm92aWRlciNvdGhlcndpc2VcclxuICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyUHJvdmlkZXJcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIERlZmluZXMgYSBwYXRoIHRoYXQgaXMgdXNlZCB3aGVuIGFuIGludmFsaWQgcm91dGUgaXMgcmVxdWVzdGVkLlxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiA8cHJlPlxyXG4gICAqIHZhciBhcHAgPSBhbmd1bGFyLm1vZHVsZSgnYXBwJywgWyd1aS5yb3V0ZXIucm91dGVyJ10pO1xyXG4gICAqXHJcbiAgICogYXBwLmNvbmZpZyhmdW5jdGlvbiAoJHVybFJvdXRlclByb3ZpZGVyKSB7XHJcbiAgICogICAvLyBpZiB0aGUgcGF0aCBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgdXJscyB5b3UgY29uZmlndXJlZFxyXG4gICAqICAgLy8gb3RoZXJ3aXNlIHdpbGwgdGFrZSBjYXJlIG9mIHJvdXRpbmcgdGhlIHVzZXIgdG8gdGhlXHJcbiAgICogICAvLyBzcGVjaWZpZWQgdXJsXHJcbiAgICogICAkdXJsUm91dGVyUHJvdmlkZXIub3RoZXJ3aXNlKCcvaW5kZXgnKTtcclxuICAgKlxyXG4gICAqICAgLy8gRXhhbXBsZSBvZiB1c2luZyBmdW5jdGlvbiBydWxlIGFzIHBhcmFtXHJcbiAgICogICAkdXJsUm91dGVyUHJvdmlkZXIub3RoZXJ3aXNlKGZ1bmN0aW9uICgkaW5qZWN0b3IsICRsb2NhdGlvbikge1xyXG4gICAqICAgICByZXR1cm4gJy9hL3ZhbGlkL3VybCc7XHJcbiAgICogICB9KTtcclxuICAgKiB9KTtcclxuICAgKiA8L3ByZT5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9ufSBydWxlIFRoZSB1cmwgcGF0aCB5b3Ugd2FudCB0byByZWRpcmVjdCB0byBvciBhIGZ1bmN0aW9uIFxyXG4gICAqIHJ1bGUgdGhhdCByZXR1cm5zIHRoZSB1cmwgcGF0aC4gVGhlIGZ1bmN0aW9uIHZlcnNpb24gaXMgcGFzc2VkIHR3byBwYXJhbXM6IFxyXG4gICAqIGAkaW5qZWN0b3JgIGFuZCBgJGxvY2F0aW9uYCBzZXJ2aWNlcywgYW5kIG11c3QgcmV0dXJuIGEgdXJsIHN0cmluZy5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge29iamVjdH0gYCR1cmxSb3V0ZXJQcm92aWRlcmAgLSBgJHVybFJvdXRlclByb3ZpZGVyYCBpbnN0YW5jZVxyXG4gICAqL1xyXG4gIHRoaXMub3RoZXJ3aXNlID0gZnVuY3Rpb24gKHJ1bGUpIHtcclxuICAgIGlmIChpc1N0cmluZyhydWxlKSkge1xyXG4gICAgICB2YXIgcmVkaXJlY3QgPSBydWxlO1xyXG4gICAgICBydWxlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVkaXJlY3Q7IH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghaXNGdW5jdGlvbihydWxlKSkgdGhyb3cgbmV3IEVycm9yKFwiJ3J1bGUnIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcclxuICAgIG90aGVyd2lzZSA9IHJ1bGU7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9O1xyXG5cclxuXHJcbiAgZnVuY3Rpb24gaGFuZGxlSWZNYXRjaCgkaW5qZWN0b3IsIGhhbmRsZXIsIG1hdGNoKSB7XHJcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gZmFsc2U7XHJcbiAgICB2YXIgcmVzdWx0ID0gJGluamVjdG9yLmludm9rZShoYW5kbGVyLCBoYW5kbGVyLCB7ICRtYXRjaDogbWF0Y2ggfSk7XHJcbiAgICByZXR1cm4gaXNEZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyUHJvdmlkZXIjd2hlblxyXG4gICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIucm91dGVyLiR1cmxSb3V0ZXJQcm92aWRlclxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBnaXZlbiB1cmwgbWF0Y2hpbmcuIFxyXG4gICAqIFxyXG4gICAqIElmIHRoZSBoYW5kbGVyIGlzIGEgc3RyaW5nLCBpdCBpc1xyXG4gICAqIHRyZWF0ZWQgYXMgYSByZWRpcmVjdCwgYW5kIGlzIGludGVycG9sYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHN5bnRheCBvZiBtYXRjaFxyXG4gICAqIChpLmUuIGxpa2UgYFN0cmluZy5yZXBsYWNlKClgIGZvciBgUmVnRXhwYCwgb3IgbGlrZSBhIGBVcmxNYXRjaGVyYCBwYXR0ZXJuIG90aGVyd2lzZSkuXHJcbiAgICpcclxuICAgKiBJZiB0aGUgaGFuZGxlciBpcyBhIGZ1bmN0aW9uLCBpdCBpcyBpbmplY3RhYmxlLiBJdCBnZXRzIGludm9rZWQgaWYgYCRsb2NhdGlvbmBcclxuICAgKiBtYXRjaGVzLiBZb3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGluamVjdCB0aGUgbWF0Y2ggb2JqZWN0IGFzIGAkbWF0Y2hgLlxyXG4gICAqXHJcbiAgICogVGhlIGhhbmRsZXIgY2FuIHJldHVyblxyXG4gICAqXHJcbiAgICogLSAqKmZhbHN5KiogdG8gaW5kaWNhdGUgdGhhdCB0aGUgcnVsZSBkaWRuJ3QgbWF0Y2ggYWZ0ZXIgYWxsLCB0aGVuIGAkdXJsUm91dGVyYFxyXG4gICAqICAgd2lsbCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhbm90aGVyIG9uZSB0aGF0IG1hdGNoZXMuXHJcbiAgICogLSAqKnN0cmluZyoqIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSByZWRpcmVjdCBhbmQgcGFzc2VkIHRvIGAkbG9jYXRpb24udXJsKClgXHJcbiAgICogLSAqKnZvaWQqKiBvciBhbnkgKip0cnV0aHkqKiB2YWx1ZSB0ZWxscyBgJHVybFJvdXRlcmAgdGhhdCB0aGUgdXJsIHdhcyBoYW5kbGVkLlxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiA8cHJlPlxyXG4gICAqIHZhciBhcHAgPSBhbmd1bGFyLm1vZHVsZSgnYXBwJywgWyd1aS5yb3V0ZXIucm91dGVyJ10pO1xyXG4gICAqXHJcbiAgICogYXBwLmNvbmZpZyhmdW5jdGlvbiAoJHVybFJvdXRlclByb3ZpZGVyKSB7XHJcbiAgICogICAkdXJsUm91dGVyUHJvdmlkZXIud2hlbigkc3RhdGUudXJsLCBmdW5jdGlvbiAoJG1hdGNoLCAkc3RhdGVQYXJhbXMpIHtcclxuICAgKiAgICAgaWYgKCRzdGF0ZS4kY3VycmVudC5uYXZpZ2FibGUgIT09IHN0YXRlIHx8XHJcbiAgICogICAgICAgICAhZXF1YWxGb3JLZXlzKCRtYXRjaCwgJHN0YXRlUGFyYW1zKSB7XHJcbiAgICogICAgICAkc3RhdGUudHJhbnNpdGlvblRvKHN0YXRlLCAkbWF0Y2gsIGZhbHNlKTtcclxuICAgKiAgICAgfVxyXG4gICAqICAgfSk7XHJcbiAgICogfSk7XHJcbiAgICogPC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHdoYXQgVGhlIGluY29taW5nIHBhdGggdGhhdCB5b3Ugd2FudCB0byByZWRpcmVjdC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbn0gaGFuZGxlciBUaGUgcGF0aCB5b3Ugd2FudCB0byByZWRpcmVjdCB5b3VyIHVzZXIgdG8uXHJcbiAgICovXHJcbiAgdGhpcy53aGVuID0gZnVuY3Rpb24gKHdoYXQsIGhhbmRsZXIpIHtcclxuICAgIHZhciByZWRpcmVjdCwgaGFuZGxlcklzU3RyaW5nID0gaXNTdHJpbmcoaGFuZGxlcik7XHJcbiAgICBpZiAoaXNTdHJpbmcod2hhdCkpIHdoYXQgPSAkdXJsTWF0Y2hlckZhY3RvcnkuY29tcGlsZSh3aGF0KTtcclxuXHJcbiAgICBpZiAoIWhhbmRsZXJJc1N0cmluZyAmJiAhaXNGdW5jdGlvbihoYW5kbGVyKSAmJiAhaXNBcnJheShoYW5kbGVyKSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCAnaGFuZGxlcicgaW4gd2hlbigpXCIpO1xyXG5cclxuICAgIHZhciBzdHJhdGVnaWVzID0ge1xyXG4gICAgICBtYXRjaGVyOiBmdW5jdGlvbiAod2hhdCwgaGFuZGxlcikge1xyXG4gICAgICAgIGlmIChoYW5kbGVySXNTdHJpbmcpIHtcclxuICAgICAgICAgIHJlZGlyZWN0ID0gJHVybE1hdGNoZXJGYWN0b3J5LmNvbXBpbGUoaGFuZGxlcik7XHJcbiAgICAgICAgICBoYW5kbGVyID0gWyckbWF0Y2gnLCBmdW5jdGlvbiAoJG1hdGNoKSB7IHJldHVybiByZWRpcmVjdC5mb3JtYXQoJG1hdGNoKTsgfV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCRpbmplY3RvciwgJGxvY2F0aW9uKSB7XHJcbiAgICAgICAgICByZXR1cm4gaGFuZGxlSWZNYXRjaCgkaW5qZWN0b3IsIGhhbmRsZXIsIHdoYXQuZXhlYygkbG9jYXRpb24ucGF0aCgpLCAkbG9jYXRpb24uc2VhcmNoKCkpKTtcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICBwcmVmaXg6IGlzU3RyaW5nKHdoYXQucHJlZml4KSA/IHdoYXQucHJlZml4IDogJydcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgcmVnZXg6IGZ1bmN0aW9uICh3aGF0LCBoYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKHdoYXQuZ2xvYmFsIHx8IHdoYXQuc3RpY2t5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3aGVuKCkgUmVnRXhwIG11c3Qgbm90IGJlIGdsb2JhbCBvciBzdGlja3lcIik7XHJcblxyXG4gICAgICAgIGlmIChoYW5kbGVySXNTdHJpbmcpIHtcclxuICAgICAgICAgIHJlZGlyZWN0ID0gaGFuZGxlcjtcclxuICAgICAgICAgIGhhbmRsZXIgPSBbJyRtYXRjaCcsIGZ1bmN0aW9uICgkbWF0Y2gpIHsgcmV0dXJuIGludGVycG9sYXRlKHJlZGlyZWN0LCAkbWF0Y2gpOyB9XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoJGluamVjdG9yLCAkbG9jYXRpb24pIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVJZk1hdGNoKCRpbmplY3RvciwgaGFuZGxlciwgd2hhdC5leGVjKCRsb2NhdGlvbi5wYXRoKCkpKTtcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICBwcmVmaXg6IHJlZ0V4cFByZWZpeCh3aGF0KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHZhciBjaGVjayA9IHsgbWF0Y2hlcjogJHVybE1hdGNoZXJGYWN0b3J5LmlzTWF0Y2hlcih3aGF0KSwgcmVnZXg6IHdoYXQgaW5zdGFuY2VvZiBSZWdFeHAgfTtcclxuXHJcbiAgICBmb3IgKHZhciBuIGluIGNoZWNrKSB7XHJcbiAgICAgIGlmIChjaGVja1tuXSkgcmV0dXJuIHRoaXMucnVsZShzdHJhdGVnaWVzW25dKHdoYXQsIGhhbmRsZXIpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkICd3aGF0JyBpbiB3aGVuKClcIik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyUHJvdmlkZXIjZGVmZXJJbnRlcmNlcHRcclxuICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyUHJvdmlkZXJcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIERpc2FibGVzIChvciBlbmFibGVzKSBkZWZlcnJpbmcgbG9jYXRpb24gY2hhbmdlIGludGVyY2VwdGlvbi5cclxuICAgKlxyXG4gICAqIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2Ygc3luY2luZyB0aGUgVVJMIChmb3IgZXhhbXBsZSwgaWYgeW91IHdpc2ggdG9cclxuICAgKiBkZWZlciBhIHRyYW5zaXRpb24gYnV0IG1haW50YWluIHRoZSBjdXJyZW50IFVSTCksIGNhbGwgdGhpcyBtZXRob2QgYXQgY29uZmlndXJhdGlvbiB0aW1lLlxyXG4gICAqIFRoZW4sIGF0IHJ1biB0aW1lLCBjYWxsIGAkdXJsUm91dGVyLmxpc3RlbigpYCBhZnRlciB5b3UgaGF2ZSBjb25maWd1cmVkIHlvdXIgb3duXHJcbiAgICogYCRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3NgIGV2ZW50IGhhbmRsZXIuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIDxwcmU+XHJcbiAgICogdmFyIGFwcCA9IGFuZ3VsYXIubW9kdWxlKCdhcHAnLCBbJ3VpLnJvdXRlci5yb3V0ZXInXSk7XHJcbiAgICpcclxuICAgKiBhcHAuY29uZmlnKGZ1bmN0aW9uICgkdXJsUm91dGVyUHJvdmlkZXIpIHtcclxuICAgKlxyXG4gICAqICAgLy8gUHJldmVudCAkdXJsUm91dGVyIGZyb20gYXV0b21hdGljYWxseSBpbnRlcmNlcHRpbmcgVVJMIGNoYW5nZXM7XHJcbiAgICogICAvLyB0aGlzIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGN1c3RvbSBiZWhhdmlvciBpbiBiZXR3ZWVuXHJcbiAgICogICAvLyBsb2NhdGlvbiBjaGFuZ2VzIGFuZCByb3V0ZSBzeW5jaHJvbml6YXRpb246XHJcbiAgICogICAkdXJsUm91dGVyUHJvdmlkZXIuZGVmZXJJbnRlcmNlcHQoKTtcclxuICAgKlxyXG4gICAqIH0pLnJ1bihmdW5jdGlvbiAoJHJvb3RTY29wZSwgJHVybFJvdXRlciwgVXNlclNlcnZpY2UpIHtcclxuICAgKlxyXG4gICAqICAgJHJvb3RTY29wZS4kb24oJyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MnLCBmdW5jdGlvbihlKSB7XHJcbiAgICogICAgIC8vIFVzZXJTZXJ2aWNlIGlzIGFuIGV4YW1wbGUgc2VydmljZSBmb3IgbWFuYWdpbmcgdXNlciBzdGF0ZVxyXG4gICAqICAgICBpZiAoVXNlclNlcnZpY2UuaXNMb2dnZWRJbigpKSByZXR1cm47XHJcbiAgICpcclxuICAgKiAgICAgLy8gUHJldmVudCAkdXJsUm91dGVyJ3MgZGVmYXVsdCBoYW5kbGVyIGZyb20gZmlyaW5nXHJcbiAgICogICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgKlxyXG4gICAqICAgICBVc2VyU2VydmljZS5oYW5kbGVMb2dpbigpLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICogICAgICAgLy8gT25jZSB0aGUgdXNlciBoYXMgbG9nZ2VkIGluLCBzeW5jIHRoZSBjdXJyZW50IFVSTFxyXG4gICAqICAgICAgIC8vIHRvIHRoZSByb3V0ZXI6XHJcbiAgICogICAgICAgJHVybFJvdXRlci5zeW5jKCk7XHJcbiAgICogICAgIH0pO1xyXG4gICAqICAgfSk7XHJcbiAgICpcclxuICAgKiAgIC8vIENvbmZpZ3VyZXMgJHVybFJvdXRlcidzIGxpc3RlbmVyICphZnRlciogeW91ciBjdXN0b20gbGlzdGVuZXJcclxuICAgKiAgICR1cmxSb3V0ZXIubGlzdGVuKCk7XHJcbiAgICogfSk7XHJcbiAgICogPC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlZmVyIEluZGljYXRlcyB3aGV0aGVyIHRvIGRlZmVyIGxvY2F0aW9uIGNoYW5nZSBpbnRlcmNlcHRpb24uIFBhc3NpbmdcclxuICAgICAgICAgICAgbm8gcGFyYW1ldGVyIGlzIGVxdWl2YWxlbnQgdG8gYHRydWVgLlxyXG4gICAqL1xyXG4gIHRoaXMuZGVmZXJJbnRlcmNlcHQgPSBmdW5jdGlvbiAoZGVmZXIpIHtcclxuICAgIGlmIChkZWZlciA9PT0gdW5kZWZpbmVkKSBkZWZlciA9IHRydWU7XHJcbiAgICBpbnRlcmNlcHREZWZlcnJlZCA9IGRlZmVyO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBvYmplY3RcclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIucm91dGVyLiR1cmxSb3V0ZXJcclxuICAgKlxyXG4gICAqIEByZXF1aXJlcyAkbG9jYXRpb25cclxuICAgKiBAcmVxdWlyZXMgJHJvb3RTY29wZVxyXG4gICAqIEByZXF1aXJlcyAkaW5qZWN0b3JcclxuICAgKiBAcmVxdWlyZXMgJGJyb3dzZXJcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICovXHJcbiAgdGhpcy4kZ2V0ID0gJGdldDtcclxuICAkZ2V0LiRpbmplY3QgPSBbJyRsb2NhdGlvbicsICckcm9vdFNjb3BlJywgJyRpbmplY3RvcicsICckYnJvd3NlcicsICckc25pZmZlciddO1xyXG4gIGZ1bmN0aW9uICRnZXQoICAgJGxvY2F0aW9uLCAgICRyb290U2NvcGUsICAgJGluamVjdG9yLCAgICRicm93c2VyLCAgICRzbmlmZmVyKSB7XHJcblxyXG4gICAgdmFyIGJhc2VIcmVmID0gJGJyb3dzZXIuYmFzZUhyZWYoKSwgbG9jYXRpb24gPSAkbG9jYXRpb24udXJsKCksIGxhc3RQdXNoZWRVcmw7XHJcblxyXG4gICAgZnVuY3Rpb24gYXBwZW5kQmFzZVBhdGgodXJsLCBpc0h0bWw1LCBhYnNvbHV0ZSkge1xyXG4gICAgICBpZiAoYmFzZUhyZWYgPT09ICcvJykgcmV0dXJuIHVybDtcclxuICAgICAgaWYgKGlzSHRtbDUpIHJldHVybiBiYXNlSHJlZi5zbGljZSgwLCAtMSkgKyB1cmw7XHJcbiAgICAgIGlmIChhYnNvbHV0ZSkgcmV0dXJuIGJhc2VIcmVmLnNsaWNlKDEpICsgdXJsO1xyXG4gICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IE9wdGltaXplIGdyb3VwcyBvZiBydWxlcyB3aXRoIG5vbi1lbXB0eSBwcmVmaXggaW50byBzb21lIHNvcnQgb2YgZGVjaXNpb24gdHJlZVxyXG4gICAgZnVuY3Rpb24gdXBkYXRlKGV2dCkge1xyXG4gICAgICBpZiAoZXZ0ICYmIGV2dC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XHJcbiAgICAgIHZhciBpZ25vcmVVcGRhdGUgPSBsYXN0UHVzaGVkVXJsICYmICRsb2NhdGlvbi51cmwoKSA9PT0gbGFzdFB1c2hlZFVybDtcclxuICAgICAgbGFzdFB1c2hlZFVybCA9IHVuZGVmaW5lZDtcclxuICAgICAgLy8gVE9ETzogUmUtaW1wbGVtZW50IHRoaXMgaW4gMS4wIGZvciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci11aS91aS1yb3V0ZXIvaXNzdWVzLzE1NzNcclxuICAgICAgLy9pZiAoaWdub3JlVXBkYXRlKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNoZWNrKHJ1bGUpIHtcclxuICAgICAgICB2YXIgaGFuZGxlZCA9IHJ1bGUoJGluamVjdG9yLCAkbG9jYXRpb24pO1xyXG5cclxuICAgICAgICBpZiAoIWhhbmRsZWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoaXNTdHJpbmcoaGFuZGxlZCkpICRsb2NhdGlvbi5yZXBsYWNlKCkudXJsKGhhbmRsZWQpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBuID0gcnVsZXMubGVuZ3RoLCBpO1xyXG5cclxuICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIGlmIChjaGVjayhydWxlc1tpXSkpIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyBhbHdheXMgY2hlY2sgb3RoZXJ3aXNlIGxhc3QgdG8gYWxsb3cgZHluYW1pYyB1cGRhdGVzIHRvIHRoZSBzZXQgb2YgcnVsZXNcclxuICAgICAgaWYgKG90aGVyd2lzZSkgY2hlY2sob3RoZXJ3aXNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBsaXN0ZW4oKSB7XHJcbiAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIgfHwgJHJvb3RTY29wZS4kb24oJyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MnLCB1cGRhdGUpO1xyXG4gICAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpbnRlcmNlcHREZWZlcnJlZCkgbGlzdGVuKCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEBuZ2RvYyBmdW5jdGlvblxyXG4gICAgICAgKiBAbmFtZSB1aS5yb3V0ZXIucm91dGVyLiR1cmxSb3V0ZXIjc3luY1xyXG4gICAgICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyXHJcbiAgICAgICAqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICAgKiBUcmlnZ2VycyBhbiB1cGRhdGU7IHRoZSBzYW1lIHVwZGF0ZSB0aGF0IGhhcHBlbnMgd2hlbiB0aGUgYWRkcmVzcyBiYXIgdXJsIGNoYW5nZXMsIGFrYSBgJGxvY2F0aW9uQ2hhbmdlU3VjY2Vzc2AuXHJcbiAgICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHVzZSBgcHJldmVudERlZmF1bHQoKWAgb24gdGhlIGAkbG9jYXRpb25DaGFuZ2VTdWNjZXNzYCBldmVudCxcclxuICAgICAgICogcGVyZm9ybSBzb21lIGN1c3RvbSBsb2dpYyAocm91dGUgcHJvdGVjdGlvbiwgYXV0aCwgY29uZmlnLCByZWRpcmVjdGlvbiwgZXRjKSBhbmQgdGhlbiBmaW5hbGx5IHByb2NlZWRcclxuICAgICAgICogd2l0aCB0aGUgdHJhbnNpdGlvbiBieSBjYWxsaW5nIGAkdXJsUm91dGVyLnN5bmMoKWAuXHJcbiAgICAgICAqXHJcbiAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAqIDxwcmU+XHJcbiAgICAgICAqIGFuZ3VsYXIubW9kdWxlKCdhcHAnLCBbJ3VpLnJvdXRlciddKVxyXG4gICAgICAgKiAgIC5ydW4oZnVuY3Rpb24oJHJvb3RTY29wZSwgJHVybFJvdXRlcikge1xyXG4gICAgICAgKiAgICAgJHJvb3RTY29wZS4kb24oJyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MnLCBmdW5jdGlvbihldnQpIHtcclxuICAgICAgICogICAgICAgLy8gSGFsdCBzdGF0ZSBjaGFuZ2UgZnJvbSBldmVuIHN0YXJ0aW5nXHJcbiAgICAgICAqICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgKiAgICAgICAvLyBQZXJmb3JtIGN1c3RvbSBsb2dpY1xyXG4gICAgICAgKiAgICAgICB2YXIgbWVldHNSZXF1aXJlbWVudCA9IC4uLlxyXG4gICAgICAgKiAgICAgICAvLyBDb250aW51ZSB3aXRoIHRoZSB1cGRhdGUgYW5kIHN0YXRlIHRyYW5zaXRpb24gaWYgbG9naWMgYWxsb3dzXHJcbiAgICAgICAqICAgICAgIGlmIChtZWV0c1JlcXVpcmVtZW50KSAkdXJsUm91dGVyLnN5bmMoKTtcclxuICAgICAgICogICAgIH0pO1xyXG4gICAgICAgKiB9KTtcclxuICAgICAgICogPC9wcmU+XHJcbiAgICAgICAqL1xyXG4gICAgICBzeW5jOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB1cGRhdGUoKTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGxpc3RlbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIGxpc3RlbigpO1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgdXBkYXRlOiBmdW5jdGlvbihyZWFkKSB7XHJcbiAgICAgICAgaWYgKHJlYWQpIHtcclxuICAgICAgICAgIGxvY2F0aW9uID0gJGxvY2F0aW9uLnVybCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJGxvY2F0aW9uLnVybCgpID09PSBsb2NhdGlvbikgcmV0dXJuO1xyXG5cclxuICAgICAgICAkbG9jYXRpb24udXJsKGxvY2F0aW9uKTtcclxuICAgICAgICAkbG9jYXRpb24ucmVwbGFjZSgpO1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgcHVzaDogZnVuY3Rpb24odXJsTWF0Y2hlciwgcGFyYW1zLCBvcHRpb25zKSB7XHJcbiAgICAgICAgIHZhciB1cmwgPSB1cmxNYXRjaGVyLmZvcm1hdChwYXJhbXMgfHwge30pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgaGFzaCBwYXJhbSwgaWYgbmVlZGVkXHJcbiAgICAgICAgaWYgKHVybCAhPT0gbnVsbCAmJiBwYXJhbXMgJiYgcGFyYW1zWycjJ10pIHtcclxuICAgICAgICAgICAgdXJsICs9ICcjJyArIHBhcmFtc1snIyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJGxvY2F0aW9uLnVybCh1cmwpO1xyXG4gICAgICAgIGxhc3RQdXNoZWRVcmwgPSBvcHRpb25zICYmIG9wdGlvbnMuJCRhdm9pZFJlc3luYyA/ICRsb2NhdGlvbi51cmwoKSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlcGxhY2UpICRsb2NhdGlvbi5yZXBsYWNlKCk7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICAvKipcclxuICAgICAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICAgICAqIEBuYW1lIHVpLnJvdXRlci5yb3V0ZXIuJHVybFJvdXRlciNocmVmXHJcbiAgICAgICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIucm91dGVyLiR1cmxSb3V0ZXJcclxuICAgICAgICpcclxuICAgICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgICAqIEEgVVJMIGdlbmVyYXRpb24gbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgY29tcGlsZWQgVVJMIGZvciBhIGdpdmVuXHJcbiAgICAgICAqIHtAbGluayB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIgYFVybE1hdGNoZXJgfSwgcG9wdWxhdGVkIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXHJcbiAgICAgICAqXHJcbiAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAqIDxwcmU+XHJcbiAgICAgICAqICRib2IgPSAkdXJsUm91dGVyLmhyZWYobmV3IFVybE1hdGNoZXIoXCIvYWJvdXQvOnBlcnNvblwiKSwge1xyXG4gICAgICAgKiAgIHBlcnNvbjogXCJib2JcIlxyXG4gICAgICAgKiB9KTtcclxuICAgICAgICogLy8gJGJvYiA9PSBcIi9hYm91dC9ib2JcIjtcclxuICAgICAgICogPC9wcmU+XHJcbiAgICAgICAqXHJcbiAgICAgICAqIEBwYXJhbSB7VXJsTWF0Y2hlcn0gdXJsTWF0Y2hlciBUaGUgYFVybE1hdGNoZXJgIG9iamVjdCB3aGljaCBpcyB1c2VkIGFzIHRoZSB0ZW1wbGF0ZSBvZiB0aGUgVVJMIHRvIGdlbmVyYXRlLlxyXG4gICAgICAgKiBAcGFyYW0ge29iamVjdD19IHBhcmFtcyBBbiBvYmplY3Qgb2YgcGFyYW1ldGVyIHZhbHVlcyB0byBmaWxsIHRoZSBtYXRjaGVyJ3MgcmVxdWlyZWQgcGFyYW1ldGVycy5cclxuICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBUaGUgb3B0aW9ucyBhcmU6XHJcbiAgICAgICAqXHJcbiAgICAgICAqIC0gKipgYWJzb2x1dGVgKiogLSB7Ym9vbGVhbj1mYWxzZX0sICBJZiB0cnVlIHdpbGwgZ2VuZXJhdGUgYW4gYWJzb2x1dGUgdXJsLCBlLmcuIFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9mdWxsdXJsXCIuXHJcbiAgICAgICAqXHJcbiAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGZ1bGx5IGNvbXBpbGVkIFVSTCwgb3IgYG51bGxgIGlmIGBwYXJhbXNgIGZhaWwgdmFsaWRhdGlvbiBhZ2FpbnN0IGB1cmxNYXRjaGVyYFxyXG4gICAgICAgKi9cclxuICAgICAgaHJlZjogZnVuY3Rpb24odXJsTWF0Y2hlciwgcGFyYW1zLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKCF1cmxNYXRjaGVyLnZhbGlkYXRlcyhwYXJhbXMpKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgdmFyIGlzSHRtbDUgPSAkbG9jYXRpb25Qcm92aWRlci5odG1sNU1vZGUoKTtcclxuICAgICAgICBpZiAoYW5ndWxhci5pc09iamVjdChpc0h0bWw1KSkge1xyXG4gICAgICAgICAgaXNIdG1sNSA9IGlzSHRtbDUuZW5hYmxlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlzSHRtbDUgPSBpc0h0bWw1ICYmICRzbmlmZmVyLmhpc3Rvcnk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIHVybCA9IHVybE1hdGNoZXIuZm9ybWF0KHBhcmFtcyk7XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG4gICAgICAgIGlmICghaXNIdG1sNSAmJiB1cmwgIT09IG51bGwpIHtcclxuICAgICAgICAgIHVybCA9IFwiI1wiICsgJGxvY2F0aW9uUHJvdmlkZXIuaGFzaFByZWZpeCgpICsgdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgaGFzaCBwYXJhbSwgaWYgbmVlZGVkXHJcbiAgICAgICAgaWYgKHVybCAhPT0gbnVsbCAmJiBwYXJhbXMgJiYgcGFyYW1zWycjJ10pIHtcclxuICAgICAgICAgIHVybCArPSAnIycgKyBwYXJhbXNbJyMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVybCA9IGFwcGVuZEJhc2VQYXRoKHVybCwgaXNIdG1sNSwgb3B0aW9ucy5hYnNvbHV0ZSk7XHJcblxyXG4gICAgICAgIGlmICghb3B0aW9ucy5hYnNvbHV0ZSB8fCAhdXJsKSB7XHJcbiAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHNsYXNoID0gKCFpc0h0bWw1ICYmIHVybCA/ICcvJyA6ICcnKSwgcG9ydCA9ICRsb2NhdGlvbi5wb3J0KCk7XHJcbiAgICAgICAgcG9ydCA9IChwb3J0ID09PSA4MCB8fCBwb3J0ID09PSA0NDMgPyAnJyA6ICc6JyArIHBvcnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gWyRsb2NhdGlvbi5wcm90b2NvbCgpLCAnOi8vJywgJGxvY2F0aW9uLmhvc3QoKSwgcG9ydCwgc2xhc2gsIHVybF0uam9pbignJyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgndWkucm91dGVyLnJvdXRlcicpLnByb3ZpZGVyKCckdXJsUm91dGVyJywgJFVybFJvdXRlclByb3ZpZGVyKTtcclxuXHJcbi8qKlxyXG4gKiBAbmdkb2Mgb2JqZWN0XHJcbiAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVQcm92aWRlclxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyUHJvdmlkZXJcclxuICogQHJlcXVpcmVzIHVpLnJvdXRlci51dGlsLiR1cmxNYXRjaGVyRmFjdG9yeVByb3ZpZGVyXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBUaGUgbmV3IGAkc3RhdGVQcm92aWRlcmAgd29ya3Mgc2ltaWxhciB0byBBbmd1bGFyJ3MgdjEgcm91dGVyLCBidXQgaXQgZm9jdXNlcyBwdXJlbHlcclxuICogb24gc3RhdGUuXHJcbiAqXHJcbiAqIEEgc3RhdGUgY29ycmVzcG9uZHMgdG8gYSBcInBsYWNlXCIgaW4gdGhlIGFwcGxpY2F0aW9uIGluIHRlcm1zIG9mIHRoZSBvdmVyYWxsIFVJIGFuZFxyXG4gKiBuYXZpZ2F0aW9uLiBBIHN0YXRlIGRlc2NyaWJlcyAodmlhIHRoZSBjb250cm9sbGVyIC8gdGVtcGxhdGUgLyB2aWV3IHByb3BlcnRpZXMpIHdoYXRcclxuICogdGhlIFVJIGxvb2tzIGxpa2UgYW5kIGRvZXMgYXQgdGhhdCBwbGFjZS5cclxuICpcclxuICogU3RhdGVzIG9mdGVuIGhhdmUgdGhpbmdzIGluIGNvbW1vbiwgYW5kIHRoZSBwcmltYXJ5IHdheSBvZiBmYWN0b3Jpbmcgb3V0IHRoZXNlXHJcbiAqIGNvbW1vbmFsaXRpZXMgaW4gdGhpcyBtb2RlbCBpcyB2aWEgdGhlIHN0YXRlIGhpZXJhcmNoeSwgaS5lLiBwYXJlbnQvY2hpbGQgc3RhdGVzIGFrYVxyXG4gKiBuZXN0ZWQgc3RhdGVzLlxyXG4gKlxyXG4gKiBUaGUgYCRzdGF0ZVByb3ZpZGVyYCBwcm92aWRlcyBpbnRlcmZhY2VzIHRvIGRlY2xhcmUgdGhlc2Ugc3RhdGVzIGZvciB5b3VyIGFwcC5cclxuICovXHJcbiRTdGF0ZVByb3ZpZGVyLiRpbmplY3QgPSBbJyR1cmxSb3V0ZXJQcm92aWRlcicsICckdXJsTWF0Y2hlckZhY3RvcnlQcm92aWRlciddO1xyXG5mdW5jdGlvbiAkU3RhdGVQcm92aWRlciggICAkdXJsUm91dGVyUHJvdmlkZXIsICAgJHVybE1hdGNoZXJGYWN0b3J5KSB7XHJcblxyXG4gIHZhciByb290LCBzdGF0ZXMgPSB7fSwgJHN0YXRlLCBxdWV1ZSA9IHt9LCBhYnN0cmFjdEtleSA9ICdhYnN0cmFjdCc7XHJcblxyXG4gIC8vIEJ1aWxkcyBzdGF0ZSBwcm9wZXJ0aWVzIGZyb20gZGVmaW5pdGlvbiBwYXNzZWQgdG8gcmVnaXN0ZXJTdGF0ZSgpXHJcbiAgdmFyIHN0YXRlQnVpbGRlciA9IHtcclxuXHJcbiAgICAvLyBEZXJpdmUgcGFyZW50IHN0YXRlIGZyb20gYSBoaWVyYXJjaGljYWwgbmFtZSBvbmx5IGlmICdwYXJlbnQnIGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQuXHJcbiAgICAvLyBzdGF0ZS5jaGlsZHJlbiA9IFtdO1xyXG4gICAgLy8gaWYgKHBhcmVudCkgcGFyZW50LmNoaWxkcmVuLnB1c2goc3RhdGUpO1xyXG4gICAgcGFyZW50OiBmdW5jdGlvbihzdGF0ZSkge1xyXG4gICAgICBpZiAoaXNEZWZpbmVkKHN0YXRlLnBhcmVudCkgJiYgc3RhdGUucGFyZW50KSByZXR1cm4gZmluZFN0YXRlKHN0YXRlLnBhcmVudCk7XHJcbiAgICAgIC8vIHJlZ2V4IG1hdGNoZXMgYW55IHZhbGlkIGNvbXBvc2l0ZSBzdGF0ZSBuYW1lXHJcbiAgICAgIC8vIHdvdWxkIG1hdGNoIFwiY29udGFjdC5saXN0XCIgYnV0IG5vdCBcImNvbnRhY3RzXCJcclxuICAgICAgdmFyIGNvbXBvc2l0ZU5hbWUgPSAvXiguKylcXC5bXi5dKyQvLmV4ZWMoc3RhdGUubmFtZSk7XHJcbiAgICAgIHJldHVybiBjb21wb3NpdGVOYW1lID8gZmluZFN0YXRlKGNvbXBvc2l0ZU5hbWVbMV0pIDogcm9vdDtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gaW5oZXJpdCAnZGF0YScgZnJvbSBwYXJlbnQgYW5kIG92ZXJyaWRlIGJ5IG93biB2YWx1ZXMgKGlmIGFueSlcclxuICAgIGRhdGE6IGZ1bmN0aW9uKHN0YXRlKSB7XHJcbiAgICAgIGlmIChzdGF0ZS5wYXJlbnQgJiYgc3RhdGUucGFyZW50LmRhdGEpIHtcclxuICAgICAgICBzdGF0ZS5kYXRhID0gc3RhdGUuc2VsZi5kYXRhID0gaW5oZXJpdChzdGF0ZS5wYXJlbnQuZGF0YSwgc3RhdGUuZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHN0YXRlLmRhdGE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEJ1aWxkIGEgVVJMTWF0Y2hlciBpZiBuZWNlc3NhcnksIGVpdGhlciB2aWEgYSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkxcclxuICAgIHVybDogZnVuY3Rpb24oc3RhdGUpIHtcclxuICAgICAgdmFyIHVybCA9IHN0YXRlLnVybCwgY29uZmlnID0geyBwYXJhbXM6IHN0YXRlLnBhcmFtcyB8fCB7fSB9O1xyXG5cclxuICAgICAgaWYgKGlzU3RyaW5nKHVybCkpIHtcclxuICAgICAgICBpZiAodXJsLmNoYXJBdCgwKSA9PSAnXicpIHJldHVybiAkdXJsTWF0Y2hlckZhY3RvcnkuY29tcGlsZSh1cmwuc3Vic3RyaW5nKDEpLCBjb25maWcpO1xyXG4gICAgICAgIHJldHVybiAoc3RhdGUucGFyZW50Lm5hdmlnYWJsZSB8fCByb290KS51cmwuY29uY2F0KHVybCwgY29uZmlnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF1cmwgfHwgJHVybE1hdGNoZXJGYWN0b3J5LmlzTWF0Y2hlcih1cmwpKSByZXR1cm4gdXJsO1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHVybCAnXCIgKyB1cmwgKyBcIicgaW4gc3RhdGUgJ1wiICsgc3RhdGUgKyBcIidcIik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGNsb3Nlc3QgYW5jZXN0b3Igc3RhdGUgdGhhdCBoYXMgYSBVUkwgKGkuZS4gaXMgbmF2aWdhYmxlKVxyXG4gICAgbmF2aWdhYmxlOiBmdW5jdGlvbihzdGF0ZSkge1xyXG4gICAgICByZXR1cm4gc3RhdGUudXJsID8gc3RhdGUgOiAoc3RhdGUucGFyZW50ID8gc3RhdGUucGFyZW50Lm5hdmlnYWJsZSA6IG51bGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBPd24gcGFyYW1ldGVycyBmb3IgdGhpcyBzdGF0ZS4gc3RhdGUudXJsLnBhcmFtcyBpcyBhbHJlYWR5IGJ1aWx0IGF0IHRoaXMgcG9pbnQuIENyZWF0ZSBhbmQgYWRkIG5vbi11cmwgcGFyYW1zXHJcbiAgICBvd25QYXJhbXM6IGZ1bmN0aW9uKHN0YXRlKSB7XHJcbiAgICAgIHZhciBwYXJhbXMgPSBzdGF0ZS51cmwgJiYgc3RhdGUudXJsLnBhcmFtcyB8fCBuZXcgJCRVTUZQLlBhcmFtU2V0KCk7XHJcbiAgICAgIGZvckVhY2goc3RhdGUucGFyYW1zIHx8IHt9LCBmdW5jdGlvbihjb25maWcsIGlkKSB7XHJcbiAgICAgICAgaWYgKCFwYXJhbXNbaWRdKSBwYXJhbXNbaWRdID0gbmV3ICQkVU1GUC5QYXJhbShpZCwgbnVsbCwgY29uZmlnLCBcImNvbmZpZ1wiKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIERlcml2ZSBwYXJhbWV0ZXJzIGZvciB0aGlzIHN0YXRlIGFuZCBlbnN1cmUgdGhleSdyZSBhIHN1cGVyLXNldCBvZiBwYXJlbnQncyBwYXJhbWV0ZXJzXHJcbiAgICBwYXJhbXM6IGZ1bmN0aW9uKHN0YXRlKSB7XHJcbiAgICAgIHZhciBvd25QYXJhbXMgPSBwaWNrKHN0YXRlLm93blBhcmFtcywgc3RhdGUub3duUGFyYW1zLiQka2V5cygpKTtcclxuICAgICAgcmV0dXJuIHN0YXRlLnBhcmVudCAmJiBzdGF0ZS5wYXJlbnQucGFyYW1zID8gZXh0ZW5kKHN0YXRlLnBhcmVudC5wYXJhbXMuJCRuZXcoKSwgb3duUGFyYW1zKSA6IG5ldyAkJFVNRlAuUGFyYW1TZXQoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gZXhwbGljaXQgbXVsdGktdmlldyBjb25maWd1cmF0aW9uLCBtYWtlIG9uZSB1cCBzbyB3ZSBkb24ndCBoYXZlXHJcbiAgICAvLyB0byBoYW5kbGUgYm90aCBjYXNlcyBpbiB0aGUgdmlldyBkaXJlY3RpdmUgbGF0ZXIuIE5vdGUgdGhhdCBoYXZpbmcgYW4gZXhwbGljaXRcclxuICAgIC8vICd2aWV3cycgcHJvcGVydHkgd2lsbCBtZWFuIHRoZSBkZWZhdWx0IHVubmFtZWQgdmlldyBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLiBUaGlzXHJcbiAgICAvLyBpcyBhbHNvIGEgZ29vZCB0aW1lIHRvIHJlc29sdmUgdmlldyBuYW1lcyB0byBhYnNvbHV0ZSBuYW1lcywgc28gZXZlcnl0aGluZyBpcyBhXHJcbiAgICAvLyBzdHJhaWdodCBsb29rdXAgYXQgbGluayB0aW1lLlxyXG4gICAgdmlld3M6IGZ1bmN0aW9uKHN0YXRlKSB7XHJcbiAgICAgIHZhciB2aWV3cyA9IHt9O1xyXG5cclxuICAgICAgZm9yRWFjaChpc0RlZmluZWQoc3RhdGUudmlld3MpID8gc3RhdGUudmlld3MgOiB7ICcnOiBzdGF0ZSB9LCBmdW5jdGlvbiAodmlldywgbmFtZSkge1xyXG4gICAgICAgIGlmIChuYW1lLmluZGV4T2YoJ0AnKSA8IDApIG5hbWUgKz0gJ0AnICsgc3RhdGUucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgdmlldy5yZXNvbHZlQXMgPSB2aWV3LnJlc29sdmVBcyB8fCBzdGF0ZS5yZXNvbHZlQXMgfHwgJyRyZXNvbHZlJztcclxuICAgICAgICB2aWV3c1tuYW1lXSA9IHZpZXc7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdmlld3M7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEtlZXAgYSBmdWxsIHBhdGggZnJvbSB0aGUgcm9vdCBkb3duIHRvIHRoaXMgc3RhdGUgYXMgdGhpcyBpcyBuZWVkZWQgZm9yIHN0YXRlIGFjdGl2YXRpb24uXHJcbiAgICBwYXRoOiBmdW5jdGlvbihzdGF0ZSkge1xyXG4gICAgICByZXR1cm4gc3RhdGUucGFyZW50ID8gc3RhdGUucGFyZW50LnBhdGguY29uY2F0KHN0YXRlKSA6IFtdOyAvLyBleGNsdWRlIHJvb3QgZnJvbSBwYXRoXHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNwZWVkIHVwICRzdGF0ZS5jb250YWlucygpIGFzIGl0J3MgdXNlZCBhIGxvdFxyXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uKHN0YXRlKSB7XHJcbiAgICAgIHZhciBpbmNsdWRlcyA9IHN0YXRlLnBhcmVudCA/IGV4dGVuZCh7fSwgc3RhdGUucGFyZW50LmluY2x1ZGVzKSA6IHt9O1xyXG4gICAgICBpbmNsdWRlc1tzdGF0ZS5uYW1lXSA9IHRydWU7XHJcbiAgICAgIHJldHVybiBpbmNsdWRlcztcclxuICAgIH0sXHJcblxyXG4gICAgJGRlbGVnYXRlczoge31cclxuICB9O1xyXG5cclxuICBmdW5jdGlvbiBpc1JlbGF0aXZlKHN0YXRlTmFtZSkge1xyXG4gICAgcmV0dXJuIHN0YXRlTmFtZS5pbmRleE9mKFwiLlwiKSA9PT0gMCB8fCBzdGF0ZU5hbWUuaW5kZXhPZihcIl5cIikgPT09IDA7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBmaW5kU3RhdGUoc3RhdGVPck5hbWUsIGJhc2UpIHtcclxuICAgIGlmICghc3RhdGVPck5hbWUpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgdmFyIGlzU3RyID0gaXNTdHJpbmcoc3RhdGVPck5hbWUpLFxyXG4gICAgICAgIG5hbWUgID0gaXNTdHIgPyBzdGF0ZU9yTmFtZSA6IHN0YXRlT3JOYW1lLm5hbWUsXHJcbiAgICAgICAgcGF0aCAgPSBpc1JlbGF0aXZlKG5hbWUpO1xyXG5cclxuICAgIGlmIChwYXRoKSB7XHJcbiAgICAgIGlmICghYmFzZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmZXJlbmNlIHBvaW50IGdpdmVuIGZvciBwYXRoICdcIiAgKyBuYW1lICsgXCInXCIpO1xyXG4gICAgICBiYXNlID0gZmluZFN0YXRlKGJhc2UpO1xyXG4gICAgICBcclxuICAgICAgdmFyIHJlbCA9IG5hbWUuc3BsaXQoXCIuXCIpLCBpID0gMCwgcGF0aExlbmd0aCA9IHJlbC5sZW5ndGgsIGN1cnJlbnQgPSBiYXNlO1xyXG5cclxuICAgICAgZm9yICg7IGkgPCBwYXRoTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAocmVsW2ldID09PSBcIlwiICYmIGkgPT09IDApIHtcclxuICAgICAgICAgIGN1cnJlbnQgPSBiYXNlO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWxbaV0gPT09IFwiXlwiKSB7XHJcbiAgICAgICAgICBpZiAoIWN1cnJlbnQucGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoICdcIiArIG5hbWUgKyBcIicgbm90IHZhbGlkIGZvciBzdGF0ZSAnXCIgKyBiYXNlLm5hbWUgKyBcIidcIik7XHJcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmVsID0gcmVsLnNsaWNlKGkpLmpvaW4oXCIuXCIpO1xyXG4gICAgICBuYW1lID0gY3VycmVudC5uYW1lICsgKGN1cnJlbnQubmFtZSAmJiByZWwgPyBcIi5cIiA6IFwiXCIpICsgcmVsO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0YXRlID0gc3RhdGVzW25hbWVdO1xyXG5cclxuICAgIGlmIChzdGF0ZSAmJiAoaXNTdHIgfHwgKCFpc1N0ciAmJiAoc3RhdGUgPT09IHN0YXRlT3JOYW1lIHx8IHN0YXRlLnNlbGYgPT09IHN0YXRlT3JOYW1lKSkpKSB7XHJcbiAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBxdWV1ZVN0YXRlKHBhcmVudE5hbWUsIHN0YXRlKSB7XHJcbiAgICBpZiAoIXF1ZXVlW3BhcmVudE5hbWVdKSB7XHJcbiAgICAgIHF1ZXVlW3BhcmVudE5hbWVdID0gW107XHJcbiAgICB9XHJcbiAgICBxdWV1ZVtwYXJlbnROYW1lXS5wdXNoKHN0YXRlKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGZsdXNoUXVldWVkQ2hpbGRyZW4ocGFyZW50TmFtZSkge1xyXG4gICAgdmFyIHF1ZXVlZCA9IHF1ZXVlW3BhcmVudE5hbWVdIHx8IFtdO1xyXG4gICAgd2hpbGUocXVldWVkLmxlbmd0aCkge1xyXG4gICAgICByZWdpc3RlclN0YXRlKHF1ZXVlZC5zaGlmdCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU3RhdGUoc3RhdGUpIHtcclxuICAgIC8vIFdyYXAgYSBuZXcgb2JqZWN0IGFyb3VuZCB0aGUgc3RhdGUgc28gd2UgY2FuIHN0b3JlIG91ciBwcml2YXRlIGRldGFpbHMgZWFzaWx5LlxyXG4gICAgc3RhdGUgPSBpbmhlcml0KHN0YXRlLCB7XHJcbiAgICAgIHNlbGY6IHN0YXRlLFxyXG4gICAgICByZXNvbHZlOiBzdGF0ZS5yZXNvbHZlIHx8IHt9LFxyXG4gICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLm5hbWU7IH1cclxuICAgIH0pO1xyXG5cclxuICAgIHZhciBuYW1lID0gc3RhdGUubmFtZTtcclxuICAgIGlmICghaXNTdHJpbmcobmFtZSkgfHwgbmFtZS5pbmRleE9mKCdAJykgPj0gMCkgdGhyb3cgbmV3IEVycm9yKFwiU3RhdGUgbXVzdCBoYXZlIGEgdmFsaWQgbmFtZVwiKTtcclxuICAgIGlmIChzdGF0ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHRocm93IG5ldyBFcnJvcihcIlN0YXRlICdcIiArIG5hbWUgKyBcIicgaXMgYWxyZWFkeSBkZWZpbmVkXCIpO1xyXG5cclxuICAgIC8vIEdldCBwYXJlbnQgbmFtZVxyXG4gICAgdmFyIHBhcmVudE5hbWUgPSAobmFtZS5pbmRleE9mKCcuJykgIT09IC0xKSA/IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSlcclxuICAgICAgICA6IChpc1N0cmluZyhzdGF0ZS5wYXJlbnQpKSA/IHN0YXRlLnBhcmVudFxyXG4gICAgICAgIDogKGlzT2JqZWN0KHN0YXRlLnBhcmVudCkgJiYgaXNTdHJpbmcoc3RhdGUucGFyZW50Lm5hbWUpKSA/IHN0YXRlLnBhcmVudC5uYW1lXHJcbiAgICAgICAgOiAnJztcclxuXHJcbiAgICAvLyBJZiBwYXJlbnQgaXMgbm90IHJlZ2lzdGVyZWQgeWV0LCBhZGQgc3RhdGUgdG8gcXVldWUgYW5kIHJlZ2lzdGVyIGxhdGVyXHJcbiAgICBpZiAocGFyZW50TmFtZSAmJiAhc3RhdGVzW3BhcmVudE5hbWVdKSB7XHJcbiAgICAgIHJldHVybiBxdWV1ZVN0YXRlKHBhcmVudE5hbWUsIHN0YXRlLnNlbGYpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGtleSBpbiBzdGF0ZUJ1aWxkZXIpIHtcclxuICAgICAgaWYgKGlzRnVuY3Rpb24oc3RhdGVCdWlsZGVyW2tleV0pKSBzdGF0ZVtrZXldID0gc3RhdGVCdWlsZGVyW2tleV0oc3RhdGUsIHN0YXRlQnVpbGRlci4kZGVsZWdhdGVzW2tleV0pO1xyXG4gICAgfVxyXG4gICAgc3RhdGVzW25hbWVdID0gc3RhdGU7XHJcblxyXG4gICAgLy8gUmVnaXN0ZXIgdGhlIHN0YXRlIGluIHRoZSBnbG9iYWwgc3RhdGUgbGlzdCBhbmQgd2l0aCAkdXJsUm91dGVyIGlmIG5lY2Vzc2FyeS5cclxuICAgIGlmICghc3RhdGVbYWJzdHJhY3RLZXldICYmIHN0YXRlLnVybCkge1xyXG4gICAgICAkdXJsUm91dGVyUHJvdmlkZXIud2hlbihzdGF0ZS51cmwsIFsnJG1hdGNoJywgJyRzdGF0ZVBhcmFtcycsIGZ1bmN0aW9uICgkbWF0Y2gsICRzdGF0ZVBhcmFtcykge1xyXG4gICAgICAgIGlmICgkc3RhdGUuJGN1cnJlbnQubmF2aWdhYmxlICE9IHN0YXRlIHx8ICFlcXVhbEZvcktleXMoJG1hdGNoLCAkc3RhdGVQYXJhbXMpKSB7XHJcbiAgICAgICAgICAkc3RhdGUudHJhbnNpdGlvblRvKHN0YXRlLCAkbWF0Y2gsIHsgaW5oZXJpdDogdHJ1ZSwgbG9jYXRpb246IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlZ2lzdGVyIGFueSBxdWV1ZWQgY2hpbGRyZW5cclxuICAgIGZsdXNoUXVldWVkQ2hpbGRyZW4obmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIHN0YXRlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2tzIHRleHQgdG8gc2VlIGlmIGl0IGxvb2tzIGxpa2UgYSBnbG9iLlxyXG4gIGZ1bmN0aW9uIGlzR2xvYiAodGV4dCkge1xyXG4gICAgcmV0dXJuIHRleHQuaW5kZXhPZignKicpID4gLTE7XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm5zIHRydWUgaWYgZ2xvYiBtYXRjaGVzIGN1cnJlbnQgJHN0YXRlIG5hbWUuXHJcbiAgZnVuY3Rpb24gZG9lc1N0YXRlTWF0Y2hHbG9iIChnbG9iKSB7XHJcbiAgICB2YXIgZ2xvYlNlZ21lbnRzID0gZ2xvYi5zcGxpdCgnLicpLFxyXG4gICAgICAgIHNlZ21lbnRzID0gJHN0YXRlLiRjdXJyZW50Lm5hbWUuc3BsaXQoJy4nKTtcclxuXHJcbiAgICAvL21hdGNoIHNpbmdsZSBzdGFyc1xyXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBnbG9iU2VnbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgIGlmIChnbG9iU2VnbWVudHNbaV0gPT09ICcqJykge1xyXG4gICAgICAgIHNlZ21lbnRzW2ldID0gJyonO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9tYXRjaCBncmVlZHkgc3RhcnRzXHJcbiAgICBpZiAoZ2xvYlNlZ21lbnRzWzBdID09PSAnKionKSB7XHJcbiAgICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLnNsaWNlKGluZGV4T2Yoc2VnbWVudHMsIGdsb2JTZWdtZW50c1sxXSkpO1xyXG4gICAgICAgc2VnbWVudHMudW5zaGlmdCgnKionKTtcclxuICAgIH1cclxuICAgIC8vbWF0Y2ggZ3JlZWR5IGVuZHNcclxuICAgIGlmIChnbG9iU2VnbWVudHNbZ2xvYlNlZ21lbnRzLmxlbmd0aCAtIDFdID09PSAnKionKSB7XHJcbiAgICAgICBzZWdtZW50cy5zcGxpY2UoaW5kZXhPZihzZWdtZW50cywgZ2xvYlNlZ21lbnRzW2dsb2JTZWdtZW50cy5sZW5ndGggLSAyXSkgKyAxLCBOdW1iZXIuTUFYX1ZBTFVFKTtcclxuICAgICAgIHNlZ21lbnRzLnB1c2goJyoqJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdsb2JTZWdtZW50cy5sZW5ndGggIT0gc2VnbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VnbWVudHMuam9pbignJykgPT09IGdsb2JTZWdtZW50cy5qb2luKCcnKTtcclxuICB9XHJcblxyXG5cclxuICAvLyBJbXBsaWNpdCByb290IHN0YXRlIHRoYXQgaXMgYWx3YXlzIGFjdGl2ZVxyXG4gIHJvb3QgPSByZWdpc3RlclN0YXRlKHtcclxuICAgIG5hbWU6ICcnLFxyXG4gICAgdXJsOiAnXicsXHJcbiAgICB2aWV3czogbnVsbCxcclxuICAgICdhYnN0cmFjdCc6IHRydWVcclxuICB9KTtcclxuICByb290Lm5hdmlnYWJsZSA9IG51bGw7XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlUHJvdmlkZXIjZGVjb3JhdG9yXHJcbiAgICogQG1ldGhvZE9mIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVQcm92aWRlclxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogQWxsb3dzIHlvdSB0byBleHRlbmQgKGNhcmVmdWxseSkgb3Igb3ZlcnJpZGUgKGF0IHlvdXIgb3duIHBlcmlsKSB0aGUgXHJcbiAgICogYHN0YXRlQnVpbGRlcmAgb2JqZWN0IHVzZWQgaW50ZXJuYWxseSBieSBgJHN0YXRlUHJvdmlkZXJgLiBUaGlzIGNhbiBiZSB1c2VkIFxyXG4gICAqIHRvIGFkZCBjdXN0b20gZnVuY3Rpb25hbGl0eSB0byB1aS1yb3V0ZXIsIGZvciBleGFtcGxlIGluZmVycmluZyB0ZW1wbGF0ZVVybCBcclxuICAgKiBiYXNlZCBvbiB0aGUgc3RhdGUgbmFtZS5cclxuICAgKlxyXG4gICAqIFdoZW4gcGFzc2luZyBvbmx5IGEgbmFtZSwgaXQgcmV0dXJucyB0aGUgY3VycmVudCAob3JpZ2luYWwgb3IgZGVjb3JhdGVkKSBidWlsZGVyXHJcbiAgICogZnVuY3Rpb24gdGhhdCBtYXRjaGVzIGBuYW1lYC5cclxuICAgKlxyXG4gICAqIFRoZSBidWlsZGVyIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBkZWNvcmF0ZWQgYXJlIGxpc3RlZCBiZWxvdy4gVGhvdWdoIG5vdCBhbGxcclxuICAgKiBuZWNlc3NhcmlseSBoYXZlIGEgZ29vZCB1c2UgY2FzZSBmb3IgZGVjb3JhdGlvbiwgdGhhdCBpcyB1cCB0byB5b3UgdG8gZGVjaWRlLlxyXG4gICAqXHJcbiAgICogSW4gYWRkaXRpb24sIHVzZXJzIGNhbiBhdHRhY2ggY3VzdG9tIGRlY29yYXRvcnMsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgbmV3IFxyXG4gICAqIHByb3BlcnRpZXMgd2l0aGluIHRoZSBzdGF0ZSdzIGludGVybmFsIGRlZmluaXRpb24uIFRoZXJlIGlzIGN1cnJlbnRseSBubyBjbGVhciBcclxuICAgKiB1c2UtY2FzZSBmb3IgdGhpcyBiZXlvbmQgYWNjZXNzaW5nIGludGVybmFsIHN0YXRlcyAoaS5lLiAkc3RhdGUuJGN1cnJlbnQpLCBcclxuICAgKiBob3dldmVyLCBleHBlY3QgdGhpcyB0byBiZWNvbWUgaW5jcmVhc2luZ2x5IHJlbGV2YW50IGFzIHdlIGludHJvZHVjZSBhZGRpdGlvbmFsIFxyXG4gICAqIG1ldGEtcHJvZ3JhbW1pbmcgZmVhdHVyZXMuXHJcbiAgICpcclxuICAgKiAqKldhcm5pbmcqKjogRGVjb3JhdG9ycyBzaG91bGQgbm90IGJlIGludGVyZGVwZW5kZW50IGJlY2F1c2UgdGhlIG9yZGVyIG9mIFxyXG4gICAqIGV4ZWN1dGlvbiBvZiB0aGUgYnVpbGRlciBmdW5jdGlvbnMgaW4gbm9uLWRldGVybWluaXN0aWMuIEJ1aWxkZXIgZnVuY3Rpb25zIFxyXG4gICAqIHNob3VsZCBvbmx5IGJlIGRlcGVuZGVudCBvbiB0aGUgc3RhdGUgZGVmaW5pdGlvbiBvYmplY3QgYW5kIHN1cGVyIGZ1bmN0aW9uLlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBFeGlzdGluZyBidWlsZGVyIGZ1bmN0aW9ucyBhbmQgY3VycmVudCByZXR1cm4gdmFsdWVzOlxyXG4gICAqXHJcbiAgICogLSAqKnBhcmVudCoqIGB7b2JqZWN0fWAgLSByZXR1cm5zIHRoZSBwYXJlbnQgc3RhdGUgb2JqZWN0LlxyXG4gICAqIC0gKipkYXRhKiogYHtvYmplY3R9YCAtIHJldHVybnMgc3RhdGUgZGF0YSwgaW5jbHVkaW5nIGFueSBpbmhlcml0ZWQgZGF0YSB0aGF0IGlzIG5vdFxyXG4gICAqICAgb3ZlcnJpZGRlbiBieSBvd24gdmFsdWVzIChpZiBhbnkpLlxyXG4gICAqIC0gKip1cmwqKiBge29iamVjdH1gIC0gcmV0dXJucyBhIHtAbGluayB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIgVXJsTWF0Y2hlcn1cclxuICAgKiAgIG9yIGBudWxsYC5cclxuICAgKiAtICoqbmF2aWdhYmxlKiogYHtvYmplY3R9YCAtIHJldHVybnMgY2xvc2VzdCBhbmNlc3RvciBzdGF0ZSB0aGF0IGhhcyBhIFVSTCAoYWthIGlzIFxyXG4gICAqICAgbmF2aWdhYmxlKS5cclxuICAgKiAtICoqcGFyYW1zKiogYHtvYmplY3R9YCAtIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RhdGUgcGFyYW1zIHRoYXQgYXJlIGVuc3VyZWQgdG8gXHJcbiAgICogICBiZSBhIHN1cGVyLXNldCBvZiBwYXJlbnQncyBwYXJhbXMuXHJcbiAgICogLSAqKnZpZXdzKiogYHtvYmplY3R9YCAtIHJldHVybnMgYSB2aWV3cyBvYmplY3Qgd2hlcmUgZWFjaCBrZXkgaXMgYW4gYWJzb2x1dGUgdmlldyBcclxuICAgKiAgIG5hbWUgKGkuZS4gXCJ2aWV3TmFtZUBzdGF0ZU5hbWVcIikgYW5kIGVhY2ggdmFsdWUgaXMgdGhlIGNvbmZpZyBvYmplY3QgXHJcbiAgICogICAodGVtcGxhdGUsIGNvbnRyb2xsZXIpIGZvciB0aGUgdmlldy4gRXZlbiB3aGVuIHlvdSBkb24ndCB1c2UgdGhlIHZpZXdzIG9iamVjdCBcclxuICAgKiAgIGV4cGxpY2l0bHkgb24gYSBzdGF0ZSBjb25maWcsIG9uZSBpcyBzdGlsbCBjcmVhdGVkIGZvciB5b3UgaW50ZXJuYWxseS5cclxuICAgKiAgIFNvIGJ5IGRlY29yYXRpbmcgdGhpcyBidWlsZGVyIGZ1bmN0aW9uIHlvdSBoYXZlIGFjY2VzcyB0byBkZWNvcmF0aW5nIHRlbXBsYXRlIFxyXG4gICAqICAgYW5kIGNvbnRyb2xsZXIgcHJvcGVydGllcy5cclxuICAgKiAtICoqb3duUGFyYW1zKiogYHtvYmplY3R9YCAtIHJldHVybnMgYW4gYXJyYXkgb2YgcGFyYW1zIHRoYXQgYmVsb25nIHRvIHRoZSBzdGF0ZSwgXHJcbiAgICogICBub3QgaW5jbHVkaW5nIGFueSBwYXJhbXMgZGVmaW5lZCBieSBhbmNlc3RvciBzdGF0ZXMuXHJcbiAgICogLSAqKnBhdGgqKiBge3N0cmluZ31gIC0gcmV0dXJucyB0aGUgZnVsbCBwYXRoIGZyb20gdGhlIHJvb3QgZG93biB0byB0aGlzIHN0YXRlLiBcclxuICAgKiAgIE5lZWRlZCBmb3Igc3RhdGUgYWN0aXZhdGlvbi5cclxuICAgKiAtICoqaW5jbHVkZXMqKiBge29iamVjdH1gIC0gcmV0dXJucyBhbiBvYmplY3QgdGhhdCBpbmNsdWRlcyBldmVyeSBzdGF0ZSB0aGF0IFxyXG4gICAqICAgd291bGQgcGFzcyBhIGAkc3RhdGUuaW5jbHVkZXMoKWAgdGVzdC5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogPHByZT5cclxuICAgKiAvLyBPdmVycmlkZSB0aGUgaW50ZXJuYWwgJ3ZpZXdzJyBidWlsZGVyIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBzdGF0ZVxyXG4gICAqIC8vIGRlZmluaXRpb24sIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYmVpbmcgb3ZlcnJpZGRlbjpcclxuICAgKiAkc3RhdGVQcm92aWRlci5kZWNvcmF0b3IoJ3ZpZXdzJywgZnVuY3Rpb24gKHN0YXRlLCBwYXJlbnQpIHtcclxuICAgKiAgIHZhciByZXN1bHQgPSB7fSxcclxuICAgKiAgICAgICB2aWV3cyA9IHBhcmVudChzdGF0ZSk7XHJcbiAgICpcclxuICAgKiAgIGFuZ3VsYXIuZm9yRWFjaCh2aWV3cywgZnVuY3Rpb24gKGNvbmZpZywgbmFtZSkge1xyXG4gICAqICAgICB2YXIgYXV0b05hbWUgPSAoc3RhdGUubmFtZSArICcuJyArIG5hbWUpLnJlcGxhY2UoJy4nLCAnLycpO1xyXG4gICAqICAgICBjb25maWcudGVtcGxhdGVVcmwgPSBjb25maWcudGVtcGxhdGVVcmwgfHwgJy9wYXJ0aWFscy8nICsgYXV0b05hbWUgKyAnLmh0bWwnO1xyXG4gICAqICAgICByZXN1bHRbbmFtZV0gPSBjb25maWc7XHJcbiAgICogICB9KTtcclxuICAgKiAgIHJldHVybiByZXN1bHQ7XHJcbiAgICogfSk7XHJcbiAgICpcclxuICAgKiAkc3RhdGVQcm92aWRlci5zdGF0ZSgnaG9tZScsIHtcclxuICAgKiAgIHZpZXdzOiB7XHJcbiAgICogICAgICdjb250YWN0Lmxpc3QnOiB7IGNvbnRyb2xsZXI6ICdMaXN0Q29udHJvbGxlcicgfSxcclxuICAgKiAgICAgJ2NvbnRhY3QuaXRlbSc6IHsgY29udHJvbGxlcjogJ0l0ZW1Db250cm9sbGVyJyB9XHJcbiAgICogICB9XHJcbiAgICogfSk7XHJcbiAgICpcclxuICAgKiAvLyAuLi5cclxuICAgKlxyXG4gICAqICRzdGF0ZS5nbygnaG9tZScpO1xyXG4gICAqIC8vIEF1dG8tcG9wdWxhdGVzIGxpc3QgYW5kIGl0ZW0gdmlld3Mgd2l0aCAvcGFydGlhbHMvaG9tZS9jb250YWN0L2xpc3QuaHRtbCxcclxuICAgKiAvLyBhbmQgL3BhcnRpYWxzL2hvbWUvY29udGFjdC9pdGVtLmh0bWwsIHJlc3BlY3RpdmVseS5cclxuICAgKiA8L3ByZT5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBidWlsZGVyIGZ1bmN0aW9uIHRvIGRlY29yYXRlLiBcclxuICAgKiBAcGFyYW0ge29iamVjdH0gZnVuYyBBIGZ1bmN0aW9uIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGRlY29yYXRpbmcgdGhlIG9yaWdpbmFsIFxyXG4gICAqIGJ1aWxkZXIgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0d28gcGFyYW1ldGVyczpcclxuICAgKlxyXG4gICAqICAgLSBge29iamVjdH1gIC0gc3RhdGUgLSBUaGUgc3RhdGUgY29uZmlnIG9iamVjdC5cclxuICAgKiAgIC0gYHtvYmplY3R9YCAtIHN1cGVyIC0gVGhlIG9yaWdpbmFsIGJ1aWxkZXIgZnVuY3Rpb24uXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtvYmplY3R9ICRzdGF0ZVByb3ZpZGVyIC0gJHN0YXRlUHJvdmlkZXIgaW5zdGFuY2VcclxuICAgKi9cclxuICB0aGlzLmRlY29yYXRvciA9IGRlY29yYXRvcjtcclxuICBmdW5jdGlvbiBkZWNvcmF0b3IobmFtZSwgZnVuYykge1xyXG4gICAgLypqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXHJcbiAgICBpZiAoaXNTdHJpbmcobmFtZSkgJiYgIWlzRGVmaW5lZChmdW5jKSkge1xyXG4gICAgICByZXR1cm4gc3RhdGVCdWlsZGVyW25hbWVdO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpIHx8ICFpc1N0cmluZyhuYW1lKSkge1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIGlmIChzdGF0ZUJ1aWxkZXJbbmFtZV0gJiYgIXN0YXRlQnVpbGRlci4kZGVsZWdhdGVzW25hbWVdKSB7XHJcbiAgICAgIHN0YXRlQnVpbGRlci4kZGVsZWdhdGVzW25hbWVdID0gc3RhdGVCdWlsZGVyW25hbWVdO1xyXG4gICAgfVxyXG4gICAgc3RhdGVCdWlsZGVyW25hbWVdID0gZnVuYztcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdWkucm91dGVyLnN0YXRlLiRzdGF0ZVByb3ZpZGVyI3N0YXRlXHJcbiAgICogQG1ldGhvZE9mIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVQcm92aWRlclxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogUmVnaXN0ZXJzIGEgc3RhdGUgY29uZmlndXJhdGlvbiB1bmRlciBhIGdpdmVuIHN0YXRlIG5hbWUuIFRoZSBzdGF0ZUNvbmZpZyBvYmplY3RcclxuICAgKiBoYXMgdGhlIGZvbGxvd2luZyBhY2NlcHRhYmxlIHByb3BlcnRpZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBBIHVuaXF1ZSBzdGF0ZSBuYW1lLCBlLmcuIFwiaG9tZVwiLCBcImFib3V0XCIsIFwiY29udGFjdHNcIi5cclxuICAgKiBUbyBjcmVhdGUgYSBwYXJlbnQvY2hpbGQgc3RhdGUgdXNlIGEgZG90LCBlLmcuIFwiYWJvdXQuc2FsZXNcIiwgXCJob21lLm5ld2VzdFwiLlxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZUNvbmZpZyBTdGF0ZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbj19IHN0YXRlQ29uZmlnLnRlbXBsYXRlXHJcbiAgICogPGEgaWQ9J3RlbXBsYXRlJz48L2E+XHJcbiAgICogICBodG1sIHRlbXBsYXRlIGFzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXHJcbiAgICogICBhbiBodG1sIHRlbXBsYXRlIGFzIGEgc3RyaW5nIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSB1aVZpZXcgZGlyZWN0aXZlcy4gVGhpcyBwcm9wZXJ0eSBcclxuICAgKiAgIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0ZW1wbGF0ZVVybC5cclxuICAgKiAgIFxyXG4gICAqICAgSWYgYHRlbXBsYXRlYCBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcclxuICAgKlxyXG4gICAqICAgLSB7YXJyYXkuJmx0O29iamVjdCZndDt9IC0gc3RhdGUgcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgY3VycmVudCAkbG9jYXRpb24ucGF0aCgpIGJ5XHJcbiAgICogICAgIGFwcGx5aW5nIHRoZSBjdXJyZW50IHN0YXRlXHJcbiAgICpcclxuICAgKiA8cHJlPnRlbXBsYXRlOlxyXG4gICAqICAgXCI8aDE+aW5saW5lIHRlbXBsYXRlIGRlZmluaXRpb248L2gxPlwiICtcclxuICAgKiAgIFwiPGRpdiB1aS12aWV3PjwvZGl2PlwiPC9wcmU+XHJcbiAgICogPHByZT50ZW1wbGF0ZTogZnVuY3Rpb24ocGFyYW1zKSB7XHJcbiAgICogICAgICAgcmV0dXJuIFwiPGgxPmdlbmVyYXRlZCB0ZW1wbGF0ZTwvaDE+XCI7IH08L3ByZT5cclxuICAgKiA8L2Rpdj5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9uPX0gc3RhdGVDb25maWcudGVtcGxhdGVVcmxcclxuICAgKiA8YSBpZD0ndGVtcGxhdGVVcmwnPjwvYT5cclxuICAgKlxyXG4gICAqICAgcGF0aCBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwYXRoIHRvIGFuIGh0bWxcclxuICAgKiAgIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdWlWaWV3LlxyXG4gICAqICAgXHJcbiAgICogICBJZiBgdGVtcGxhdGVVcmxgIGlzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxyXG4gICAqXHJcbiAgICogICAtIHthcnJheS4mbHQ7b2JqZWN0Jmd0O30gLSBzdGF0ZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBjdXJyZW50ICRsb2NhdGlvbi5wYXRoKCkgYnkgXHJcbiAgICogICAgIGFwcGx5aW5nIHRoZSBjdXJyZW50IHN0YXRlXHJcbiAgICpcclxuICAgKiA8cHJlPnRlbXBsYXRlVXJsOiBcImhvbWUuaHRtbFwiPC9wcmU+XHJcbiAgICogPHByZT50ZW1wbGF0ZVVybDogZnVuY3Rpb24ocGFyYW1zKSB7XHJcbiAgICogICAgIHJldHVybiBteVRlbXBsYXRlc1twYXJhbXMucGFnZUlkXTsgfTwvcHJlPlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbj19IHN0YXRlQ29uZmlnLnRlbXBsYXRlUHJvdmlkZXJcclxuICAgKiA8YSBpZD0ndGVtcGxhdGVQcm92aWRlcic+PC9hPlxyXG4gICAqICAgIFByb3ZpZGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBIVE1MIGNvbnRlbnQgc3RyaW5nLlxyXG4gICAqIDxwcmU+IHRlbXBsYXRlUHJvdmlkZXI6XHJcbiAgICogICAgICAgZnVuY3Rpb24oTXlUZW1wbGF0ZVNlcnZpY2UsIHBhcmFtcykge1xyXG4gICAqICAgICAgICAgcmV0dXJuIE15VGVtcGxhdGVTZXJ2aWNlLmdldFRlbXBsYXRlKHBhcmFtcy5wYWdlSWQpO1xyXG4gICAqICAgICAgIH08L3ByZT5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9uPX0gc3RhdGVDb25maWcuY29udHJvbGxlclxyXG4gICAqIDxhIGlkPSdjb250cm9sbGVyJz48L2E+XHJcbiAgICpcclxuICAgKiAgQ29udHJvbGxlciBmbiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggbmV3bHlcclxuICAgKiAgIHJlbGF0ZWQgc2NvcGUgb3IgdGhlIG5hbWUgb2YgYSByZWdpc3RlcmVkIGNvbnRyb2xsZXIgaWYgcGFzc2VkIGFzIGEgc3RyaW5nLlxyXG4gICAqICAgT3B0aW9uYWxseSwgdGhlIENvbnRyb2xsZXJBcyBtYXkgYmUgZGVjbGFyZWQgaGVyZS5cclxuICAgKiA8cHJlPmNvbnRyb2xsZXI6IFwiTXlSZWdpc3RlcmVkQ29udHJvbGxlclwiPC9wcmU+XHJcbiAgICogPHByZT5jb250cm9sbGVyOlxyXG4gICAqICAgICBcIk15UmVnaXN0ZXJlZENvbnRyb2xsZXIgYXMgZm9vQ3RybFwifTwvcHJlPlxyXG4gICAqIDxwcmU+Y29udHJvbGxlcjogZnVuY3Rpb24oJHNjb3BlLCBNeVNlcnZpY2UpIHtcclxuICAgKiAgICAgJHNjb3BlLmRhdGEgPSBNeVNlcnZpY2UuZ2V0RGF0YSgpOyB9PC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uPX0gc3RhdGVDb25maWcuY29udHJvbGxlclByb3ZpZGVyXHJcbiAgICogPGEgaWQ9J2NvbnRyb2xsZXJQcm92aWRlcic+PC9hPlxyXG4gICAqXHJcbiAgICogSW5qZWN0YWJsZSBwcm92aWRlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGFjdHVhbCBjb250cm9sbGVyIG9yIHN0cmluZy5cclxuICAgKiA8cHJlPmNvbnRyb2xsZXJQcm92aWRlcjpcclxuICAgKiAgIGZ1bmN0aW9uKE15UmVzb2x2ZURhdGEpIHtcclxuICAgKiAgICAgaWYgKE15UmVzb2x2ZURhdGEuZm9vKVxyXG4gICAqICAgICAgIHJldHVybiBcIkZvb0N0cmxcIlxyXG4gICAqICAgICBlbHNlIGlmIChNeVJlc29sdmVEYXRhLmJhcilcclxuICAgKiAgICAgICByZXR1cm4gXCJCYXJDdHJsXCI7XHJcbiAgICogICAgIGVsc2UgcmV0dXJuIGZ1bmN0aW9uKCRzY29wZSkge1xyXG4gICAqICAgICAgICRzY29wZS5iYXogPSBcIlF1eFwiO1xyXG4gICAqICAgICB9XHJcbiAgICogICB9PC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHN0YXRlQ29uZmlnLmNvbnRyb2xsZXJBc1xyXG4gICAqIDxhIGlkPSdjb250cm9sbGVyQXMnPjwvYT5cclxuICAgKiBcclxuICAgKiBBIGNvbnRyb2xsZXIgYWxpYXMgbmFtZS4gSWYgcHJlc2VudCB0aGUgY29udHJvbGxlciB3aWxsIGJlXHJcbiAgICogICBwdWJsaXNoZWQgdG8gc2NvcGUgdW5kZXIgdGhlIGNvbnRyb2xsZXJBcyBuYW1lLlxyXG4gICAqIDxwcmU+Y29udHJvbGxlckFzOiBcIm15Q3RybFwiPC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3Q9fSBzdGF0ZUNvbmZpZy5wYXJlbnRcclxuICAgKiA8YSBpZD0ncGFyZW50Jz48L2E+XHJcbiAgICogT3B0aW9uYWxseSBzcGVjaWZpZXMgdGhlIHBhcmVudCBzdGF0ZSBvZiB0aGlzIHN0YXRlLlxyXG4gICAqXHJcbiAgICogPHByZT5wYXJlbnQ6ICdwYXJlbnRTdGF0ZSc8L3ByZT5cclxuICAgKiA8cHJlPnBhcmVudDogcGFyZW50U3RhdGUgLy8gSlMgdmFyaWFibGU8L3ByZT5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7b2JqZWN0PX0gc3RhdGVDb25maWcucmVzb2x2ZVxyXG4gICAqIDxhIGlkPSdyZXNvbHZlJz48L2E+XHJcbiAgICpcclxuICAgKiBBbiBvcHRpb25hbCBtYXAmbHQ7c3RyaW5nLCBmdW5jdGlvbiZndDsgb2YgZGVwZW5kZW5jaWVzIHdoaWNoXHJcbiAgICogICBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byB0aGUgY29udHJvbGxlci4gSWYgYW55IG9mIHRoZXNlIGRlcGVuZGVuY2llcyBhcmUgcHJvbWlzZXMsIFxyXG4gICAqICAgdGhlIHJvdXRlciB3aWxsIHdhaXQgZm9yIHRoZW0gYWxsIHRvIGJlIHJlc29sdmVkIGJlZm9yZSB0aGUgY29udHJvbGxlciBpcyBpbnN0YW50aWF0ZWQuXHJcbiAgICogICBJZiBhbGwgdGhlIHByb21pc2VzIGFyZSByZXNvbHZlZCBzdWNjZXNzZnVsbHksIHRoZSAkc3RhdGVDaGFuZ2VTdWNjZXNzIGV2ZW50IGlzIGZpcmVkXHJcbiAgICogICBhbmQgdGhlIHZhbHVlcyBvZiB0aGUgcmVzb2x2ZWQgcHJvbWlzZXMgYXJlIGluamVjdGVkIGludG8gYW55IGNvbnRyb2xsZXJzIHRoYXQgcmVmZXJlbmNlIHRoZW0uXHJcbiAgICogICBJZiBhbnkgIG9mIHRoZSBwcm9taXNlcyBhcmUgcmVqZWN0ZWQgdGhlICRzdGF0ZUNoYW5nZUVycm9yIGV2ZW50IGlzIGZpcmVkLlxyXG4gICAqXHJcbiAgICogICBUaGUgbWFwIG9iamVjdCBpczpcclxuICAgKiAgIFxyXG4gICAqICAgLSBrZXkgLSB7c3RyaW5nfTogbmFtZSBvZiBkZXBlbmRlbmN5IHRvIGJlIGluamVjdGVkIGludG8gY29udHJvbGxlclxyXG4gICAqICAgLSBmYWN0b3J5IC0ge3N0cmluZ3xmdW5jdGlvbn06IElmIHN0cmluZyB0aGVuIGl0IGlzIGFsaWFzIGZvciBzZXJ2aWNlLiBPdGhlcndpc2UgaWYgZnVuY3Rpb24sIFxyXG4gICAqICAgICBpdCBpcyBpbmplY3RlZCBhbmQgcmV0dXJuIHZhbHVlIGl0IHRyZWF0ZWQgYXMgZGVwZW5kZW5jeS4gSWYgcmVzdWx0IGlzIGEgcHJvbWlzZSwgaXQgaXMgXHJcbiAgICogICAgIHJlc29sdmVkIGJlZm9yZSBpdHMgdmFsdWUgaXMgaW5qZWN0ZWQgaW50byBjb250cm9sbGVyLlxyXG4gICAqXHJcbiAgICogPHByZT5yZXNvbHZlOiB7XHJcbiAgICogICAgIG15UmVzb2x2ZTE6XHJcbiAgICogICAgICAgZnVuY3Rpb24oJGh0dHAsICRzdGF0ZVBhcmFtcykge1xyXG4gICAqICAgICAgICAgcmV0dXJuICRodHRwLmdldChcIi9hcGkvZm9vcy9cIitzdGF0ZVBhcmFtcy5mb29JRCk7XHJcbiAgICogICAgICAgfVxyXG4gICAqICAgICB9PC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHN0YXRlQ29uZmlnLnVybFxyXG4gICAqIDxhIGlkPSd1cmwnPjwvYT5cclxuICAgKlxyXG4gICAqICAgQSB1cmwgZnJhZ21lbnQgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzLiBXaGVuIGEgc3RhdGUgaXMgbmF2aWdhdGVkIG9yXHJcbiAgICogICB0cmFuc2l0aW9uZWQgdG8sIHRoZSBgJHN0YXRlUGFyYW1zYCBzZXJ2aWNlIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYW55IFxyXG4gICAqICAgcGFyYW1ldGVycyB0aGF0IHdlcmUgcGFzc2VkLlxyXG4gICAqXHJcbiAgICogICAoU2VlIHtAbGluayB1aS5yb3V0ZXIudXRpbC50eXBlOlVybE1hdGNoZXIgVXJsTWF0Y2hlcn0gYFVybE1hdGNoZXJgfSBmb3JcclxuICAgKiAgIG1vcmUgZGV0YWlscyBvbiBhY2NlcHRhYmxlIHBhdHRlcm5zIClcclxuICAgKlxyXG4gICAqIGV4YW1wbGVzOlxyXG4gICAqIDxwcmU+dXJsOiBcIi9ob21lXCJcclxuICAgKiB1cmw6IFwiL3VzZXJzLzp1c2VyaWRcIlxyXG4gICAqIHVybDogXCIvYm9va3Mve2Jvb2tpZDpbYS16QS1aXy1dfVwiXHJcbiAgICogdXJsOiBcIi9ib29rcy97Y2F0ZWdvcnlpZDppbnR9XCJcclxuICAgKiB1cmw6IFwiL2Jvb2tzL3twdWJsaXNoZXJuYW1lOnN0cmluZ30ve2NhdGVnb3J5aWQ6aW50fVwiXHJcbiAgICogdXJsOiBcIi9tZXNzYWdlcz9iZWZvcmUmYWZ0ZXJcIlxyXG4gICAqIHVybDogXCIvbWVzc2FnZXM/e2JlZm9yZTpkYXRlfSZ7YWZ0ZXI6ZGF0ZX1cIlxyXG4gICAqIHVybDogXCIvbWVzc2FnZXMvOm1haWxib3hpZD97YmVmb3JlOmRhdGV9JnthZnRlcjpkYXRlfVwiXHJcbiAgICogPC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdD19IHN0YXRlQ29uZmlnLnZpZXdzXHJcbiAgICogPGEgaWQ9J3ZpZXdzJz48L2E+XHJcbiAgICogYW4gb3B0aW9uYWwgbWFwJmx0O3N0cmluZywgb2JqZWN0Jmd0OyB3aGljaCBkZWZpbmVkIG11bHRpcGxlIHZpZXdzLCBvciB0YXJnZXRzIHZpZXdzXHJcbiAgICogbWFudWFsbHkvZXhwbGljaXRseS5cclxuICAgKlxyXG4gICAqIEV4YW1wbGVzOlxyXG4gICAqXHJcbiAgICogVGFyZ2V0cyB0aHJlZSBuYW1lZCBgdWktdmlld2BzIGluIHRoZSBwYXJlbnQgc3RhdGUncyB0ZW1wbGF0ZVxyXG4gICAqIDxwcmU+dmlld3M6IHtcclxuICAgKiAgICAgaGVhZGVyOiB7XHJcbiAgICogICAgICAgY29udHJvbGxlcjogXCJoZWFkZXJDdHJsXCIsXHJcbiAgICogICAgICAgdGVtcGxhdGVVcmw6IFwiaGVhZGVyLmh0bWxcIlxyXG4gICAqICAgICB9LCBib2R5OiB7XHJcbiAgICogICAgICAgY29udHJvbGxlcjogXCJib2R5Q3RybFwiLFxyXG4gICAqICAgICAgIHRlbXBsYXRlVXJsOiBcImJvZHkuaHRtbFwiXHJcbiAgICogICAgIH0sIGZvb3Rlcjoge1xyXG4gICAqICAgICAgIGNvbnRyb2xsZXI6IFwiZm9vdEN0cmxcIixcclxuICAgKiAgICAgICB0ZW1wbGF0ZVVybDogXCJmb290ZXIuaHRtbFwiXHJcbiAgICogICAgIH1cclxuICAgKiAgIH08L3ByZT5cclxuICAgKlxyXG4gICAqIFRhcmdldHMgbmFtZWQgYHVpLXZpZXc9XCJoZWFkZXJcImAgZnJvbSBncmFuZHBhcmVudCBzdGF0ZSAndG9wJydzIHRlbXBsYXRlLCBhbmQgbmFtZWQgYHVpLXZpZXc9XCJib2R5XCIgZnJvbSBwYXJlbnQgc3RhdGUncyB0ZW1wbGF0ZS5cclxuICAgKiA8cHJlPnZpZXdzOiB7XHJcbiAgICogICAgICdoZWFkZXJAdG9wJzoge1xyXG4gICAqICAgICAgIGNvbnRyb2xsZXI6IFwibXNnSGVhZGVyQ3RybFwiLFxyXG4gICAqICAgICAgIHRlbXBsYXRlVXJsOiBcIm1zZ0hlYWRlci5odG1sXCJcclxuICAgKiAgICAgfSwgJ2JvZHknOiB7XHJcbiAgICogICAgICAgY29udHJvbGxlcjogXCJtZXNzYWdlc0N0cmxcIixcclxuICAgKiAgICAgICB0ZW1wbGF0ZVVybDogXCJtZXNzYWdlcy5odG1sXCJcclxuICAgKiAgICAgfVxyXG4gICAqICAgfTwvcHJlPlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtib29sZWFuPX0gW3N0YXRlQ29uZmlnLmFic3RyYWN0PWZhbHNlXVxyXG4gICAqIDxhIGlkPSdhYnN0cmFjdCc+PC9hPlxyXG4gICAqIEFuIGFic3RyYWN0IHN0YXRlIHdpbGwgbmV2ZXIgYmUgZGlyZWN0bHkgYWN0aXZhdGVkLFxyXG4gICAqICAgYnV0IGNhbiBwcm92aWRlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIGl0cyBjb21tb24gY2hpbGRyZW4gc3RhdGVzLlxyXG4gICAqIDxwcmU+YWJzdHJhY3Q6IHRydWU8L3ByZT5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb249fSBzdGF0ZUNvbmZpZy5vbkVudGVyXHJcbiAgICogPGEgaWQ9J29uRW50ZXInPjwvYT5cclxuICAgKlxyXG4gICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIGEgc3RhdGUgaXMgZW50ZXJlZC4gR29vZCB3YXlcclxuICAgKiAgIHRvIHRyaWdnZXIgYW4gYWN0aW9uIG9yIGRpc3BhdGNoIGFuIGV2ZW50LCBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cuXHJcbiAgICogSWYgbWluaWZ5aW5nIHlvdXIgc2NyaXB0cywgbWFrZSBzdXJlIHRvIGV4cGxpY2l0bHkgYW5ub3RhdGUgdGhpcyBmdW5jdGlvbixcclxuICAgKiBiZWNhdXNlIGl0IHdvbid0IGJlIGF1dG9tYXRpY2FsbHkgYW5ub3RhdGVkIGJ5IHlvdXIgYnVpbGQgdG9vbHMuXHJcbiAgICpcclxuICAgKiA8cHJlPm9uRW50ZXI6IGZ1bmN0aW9uKE15U2VydmljZSwgJHN0YXRlUGFyYW1zKSB7XHJcbiAgICogICAgIE15U2VydmljZS5mb28oJHN0YXRlUGFyYW1zLm15UGFyYW0pO1xyXG4gICAqIH08L3ByZT5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb249fSBzdGF0ZUNvbmZpZy5vbkV4aXRcclxuICAgKiA8YSBpZD0nb25FeGl0Jz48L2E+XHJcbiAgICpcclxuICAgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiBhIHN0YXRlIGlzIGV4aXRlZC4gR29vZCB3YXkgdG9cclxuICAgKiAgIHRyaWdnZXIgYW4gYWN0aW9uIG9yIGRpc3BhdGNoIGFuIGV2ZW50LCBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cuXHJcbiAgICogSWYgbWluaWZ5aW5nIHlvdXIgc2NyaXB0cywgbWFrZSBzdXJlIHRvIGV4cGxpY2l0bHkgYW5ub3RhdGUgdGhpcyBmdW5jdGlvbixcclxuICAgKiBiZWNhdXNlIGl0IHdvbid0IGJlIGF1dG9tYXRpY2FsbHkgYW5ub3RhdGVkIGJ5IHlvdXIgYnVpbGQgdG9vbHMuXHJcbiAgICpcclxuICAgKiA8cHJlPm9uRXhpdDogZnVuY3Rpb24oTXlTZXJ2aWNlLCAkc3RhdGVQYXJhbXMpIHtcclxuICAgKiAgICAgTXlTZXJ2aWNlLmNsZWFudXAoJHN0YXRlUGFyYW1zLm15UGFyYW0pO1xyXG4gICAqIH08L3ByZT5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtzdGF0ZUNvbmZpZy5yZWxvYWRPblNlYXJjaD10cnVlXVxyXG4gICAqIDxhIGlkPSdyZWxvYWRPblNlYXJjaCc+PC9hPlxyXG4gICAqXHJcbiAgICogSWYgYGZhbHNlYCwgd2lsbCBub3QgcmV0cmlnZ2VyIHRoZSBzYW1lIHN0YXRlXHJcbiAgICogICBqdXN0IGJlY2F1c2UgYSBzZWFyY2gvcXVlcnkgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkICh2aWEgJGxvY2F0aW9uLnNlYXJjaCgpIG9yICRsb2NhdGlvbi5oYXNoKCkpLiBcclxuICAgKiAgIFVzZWZ1bCBmb3Igd2hlbiB5b3UnZCBsaWtlIHRvIG1vZGlmeSAkbG9jYXRpb24uc2VhcmNoKCkgd2l0aG91dCB0cmlnZ2VyaW5nIGEgcmVsb2FkLlxyXG4gICAqIDxwcmU+cmVsb2FkT25TZWFyY2g6IGZhbHNlPC9wcmU+XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdD19IHN0YXRlQ29uZmlnLmRhdGFcclxuICAgKiA8YSBpZD0nZGF0YSc+PC9hPlxyXG4gICAqXHJcbiAgICogQXJiaXRyYXJ5IGRhdGEgb2JqZWN0LCB1c2VmdWwgZm9yIGN1c3RvbSBjb25maWd1cmF0aW9uLiAgVGhlIHBhcmVudCBzdGF0ZSdzIGBkYXRhYCBpc1xyXG4gICAqICAgcHJvdG90eXBhbGx5IGluaGVyaXRlZC4gIEluIG90aGVyIHdvcmRzLCBhZGRpbmcgYSBkYXRhIHByb3BlcnR5IHRvIGEgc3RhdGUgYWRkcyBpdCB0b1xyXG4gICAqICAgdGhlIGVudGlyZSBzdWJ0cmVlIHZpYSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLlxyXG4gICAqXHJcbiAgICogPHByZT5kYXRhOiB7XHJcbiAgICogICAgIHJlcXVpcmVkUm9sZTogJ2ZvbydcclxuICAgKiB9IDwvcHJlPlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtvYmplY3Q9fSBzdGF0ZUNvbmZpZy5wYXJhbXNcclxuICAgKiA8YSBpZD0ncGFyYW1zJz48L2E+XHJcbiAgICpcclxuICAgKiBBIG1hcCB3aGljaCBvcHRpb25hbGx5IGNvbmZpZ3VyZXMgcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgYHVybGAsIG9yXHJcbiAgICogICBkZWZpbmVzIGFkZGl0aW9uYWwgbm9uLXVybCBwYXJhbWV0ZXJzLiAgRm9yIGVhY2ggcGFyYW1ldGVyIGJlaW5nXHJcbiAgICogICBjb25maWd1cmVkLCBhZGQgYSBjb25maWd1cmF0aW9uIG9iamVjdCBrZXllZCB0byB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gICAqXHJcbiAgICogICBFYWNoIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIG9iamVjdCBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XHJcbiAgICpcclxuICAgKiAgIC0gKiogdmFsdWUgKiogLSB7b2JqZWN0fGZ1bmN0aW9uPX06IHNwZWNpZmllcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpc1xyXG4gICAqICAgICBwYXJhbWV0ZXIuICBUaGlzIGltcGxpY2l0bHkgc2V0cyB0aGlzIHBhcmFtZXRlciBhcyBvcHRpb25hbC5cclxuICAgKlxyXG4gICAqICAgICBXaGVuIFVJLVJvdXRlciByb3V0ZXMgdG8gYSBzdGF0ZSBhbmQgbm8gdmFsdWUgaXNcclxuICAgKiAgICAgc3BlY2lmaWVkIGZvciB0aGlzIHBhcmFtZXRlciBpbiB0aGUgVVJMIG9yIHRyYW5zaXRpb24sIHRoZVxyXG4gICAqICAgICBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLiAgSWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLFxyXG4gICAqICAgICBpdCB3aWxsIGJlIGluamVjdGVkIGFuZCBpbnZva2VkLCBhbmQgdGhlIHJldHVybiB2YWx1ZSB1c2VkLlxyXG4gICAqXHJcbiAgICogICAgICpOb3RlKjogYHVuZGVmaW5lZGAgaXMgdHJlYXRlZCBhcyBcIm5vIGRlZmF1bHQgdmFsdWVcIiB3aGlsZSBgbnVsbGBcclxuICAgKiAgICAgaXMgdHJlYXRlZCBhcyBcInRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYFwiLlxyXG4gICAqXHJcbiAgICogICAgICpTaG9ydGhhbmQqOiBJZiB5b3Ugb25seSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGVcclxuICAgKiAgICAgcGFyYW1ldGVyLCB5b3UgbWF5IHVzZSBhIHNob3J0aGFuZCBzeW50YXguICAgSW4gdGhlICoqYHBhcmFtc2AqKlxyXG4gICAqICAgICBtYXAsIGluc3RlYWQgbWFwcGluZyB0aGUgcGFyYW0gbmFtZSB0byBhIGZ1bGwgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25cclxuICAgKiAgICAgb2JqZWN0LCBzaW1wbHkgc2V0IG1hcCBpdCB0byB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUsIGUuZy46XHJcbiAgICpcclxuICAgKiA8cHJlPi8vIGRlZmluZSBhIHBhcmFtZXRlcidzIGRlZmF1bHQgdmFsdWVcclxuICAgKiBwYXJhbXM6IHtcclxuICAgKiAgICAgcGFyYW0xOiB7IHZhbHVlOiBcImRlZmF1bHRWYWx1ZVwiIH1cclxuICAgKiB9XHJcbiAgICogLy8gc2hvcnRoYW5kIGRlZmF1bHQgdmFsdWVzXHJcbiAgICogcGFyYW1zOiB7XHJcbiAgICogICAgIHBhcmFtMTogXCJkZWZhdWx0VmFsdWVcIixcclxuICAgKiAgICAgcGFyYW0yOiBcInBhcmFtMkRlZmF1bHRcIlxyXG4gICAqIH08L3ByZT5cclxuICAgKlxyXG4gICAqICAgLSAqKiBhcnJheSAqKiAtIHtib29sZWFuPX06ICooZGVmYXVsdDogZmFsc2UpKiBJZiB0cnVlLCB0aGUgcGFyYW0gdmFsdWUgd2lsbCBiZVxyXG4gICAqICAgICB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIHZhbHVlcy4gIElmIHlvdSBzcGVjaWZpZWQgYSBUeXBlLCB0aGUgdmFsdWUgd2lsbCBiZVxyXG4gICAqICAgICB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIHRoZSBzcGVjaWZpZWQgVHlwZS4gIE5vdGU6IHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXNcclxuICAgKiAgICAgZGVmYXVsdCB0byBhIHNwZWNpYWwgYFwiYXV0b1wiYCBtb2RlLlxyXG4gICAqXHJcbiAgICogICAgIEZvciBxdWVyeSBwYXJhbWV0ZXJzIGluIGBcImF1dG9cImAgbW9kZSwgaWYgbXVsdGlwbGUgIHZhbHVlcyBmb3IgYSBzaW5nbGUgcGFyYW1ldGVyXHJcbiAgICogICAgIGFyZSBwcmVzZW50IGluIHRoZSBVUkwgKGUuZy46IGAvZm9vP2Jhcj0xJmJhcj0yJmJhcj0zYCkgdGhlbiB0aGUgdmFsdWVzXHJcbiAgICogICAgIGFyZSBtYXBwZWQgdG8gYW4gYXJyYXkgKGUuZy46IGB7IGZvbzogWyAnMScsICcyJywgJzMnIF0gfWApLiAgSG93ZXZlciwgaWZcclxuICAgKiAgICAgb25seSBvbmUgdmFsdWUgaXMgcHJlc2VudCAoZS5nLjogYC9mb28/YmFyPTFgKSB0aGVuIHRoZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIHNpbmdsZVxyXG4gICAqICAgICB2YWx1ZSAoZS5nLjogYHsgZm9vOiAnMScgfWApLlxyXG4gICAqXHJcbiAgICogPHByZT5wYXJhbXM6IHtcclxuICAgKiAgICAgcGFyYW0xOiB7IGFycmF5OiB0cnVlIH1cclxuICAgKiB9PC9wcmU+XHJcbiAgICpcclxuICAgKiAgIC0gKiogc3F1YXNoICoqIC0ge2Jvb2x8c3RyaW5nPX06IGBzcXVhc2hgIGNvbmZpZ3VyZXMgaG93IGEgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIFVSTCB3aGVuXHJcbiAgICogICAgIHRoZSBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4gSWYgYHNxdWFzaGAgaXMgbm90IHNldCwgaXQgdXNlcyB0aGVcclxuICAgKiAgICAgY29uZmlndXJlZCBkZWZhdWx0IHNxdWFzaCBwb2xpY3kuXHJcbiAgICogICAgIChTZWUge0BsaW5rIHVpLnJvdXRlci51dGlsLiR1cmxNYXRjaGVyRmFjdG9yeSNtZXRob2RzX2RlZmF1bHRTcXVhc2hQb2xpY3kgYGRlZmF1bHRTcXVhc2hQb2xpY3koKWB9KVxyXG4gICAqXHJcbiAgICogICBUaGVyZSBhcmUgdGhyZWUgc3F1YXNoIHNldHRpbmdzOlxyXG4gICAqXHJcbiAgICogICAgIC0gZmFsc2U6IFRoZSBwYXJhbWV0ZXIncyBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzcXVhc2hlZC4gIEl0IGlzIGVuY29kZWQgYW5kIGluY2x1ZGVkIGluIHRoZSBVUkxcclxuICAgKiAgICAgLSB0cnVlOiBUaGUgcGFyYW1ldGVyJ3MgZGVmYXVsdCB2YWx1ZSBpcyBvbWl0dGVkIGZyb20gdGhlIFVSTC4gIElmIHRoZSBwYXJhbWV0ZXIgaXMgcHJlY2VlZGVkIGFuZCBmb2xsb3dlZFxyXG4gICAqICAgICAgIGJ5IHNsYXNoZXMgaW4gdGhlIHN0YXRlJ3MgYHVybGAgZGVjbGFyYXRpb24sIHRoZW4gb25lIG9mIHRob3NlIHNsYXNoZXMgYXJlIG9taXR0ZWQuXHJcbiAgICogICAgICAgVGhpcyBjYW4gYWxsb3cgZm9yIGNsZWFuZXIgbG9va2luZyBVUkxzLlxyXG4gICAqICAgICAtIGBcIjxhcmJpdHJhcnkgc3RyaW5nPlwiYDogVGhlIHBhcmFtZXRlcidzIGRlZmF1bHQgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBhbiBhcmJpdHJhcnkgcGxhY2Vob2xkZXIgb2YgIHlvdXIgY2hvaWNlLlxyXG4gICAqXHJcbiAgICogPHByZT5wYXJhbXM6IHtcclxuICAgKiAgICAgcGFyYW0xOiB7XHJcbiAgICogICAgICAgdmFsdWU6IFwiZGVmYXVsdElkXCIsXHJcbiAgICogICAgICAgc3F1YXNoOiB0cnVlXHJcbiAgICogfSB9XHJcbiAgICogLy8gc3F1YXNoIFwiZGVmYXVsdFZhbHVlXCIgdG8gXCJ+XCJcclxuICAgKiBwYXJhbXM6IHtcclxuICAgKiAgICAgcGFyYW0xOiB7XHJcbiAgICogICAgICAgdmFsdWU6IFwiZGVmYXVsdFZhbHVlXCIsXHJcbiAgICogICAgICAgc3F1YXNoOiBcIn5cIlxyXG4gICAqIH0gfVxyXG4gICAqIDwvcHJlPlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIDxwcmU+XHJcbiAgICogLy8gU29tZSBzdGF0ZSBuYW1lIGV4YW1wbGVzXHJcbiAgICpcclxuICAgKiAvLyBzdGF0ZU5hbWUgY2FuIGJlIGEgc2luZ2xlIHRvcC1sZXZlbCBuYW1lIChtdXN0IGJlIHVuaXF1ZSkuXHJcbiAgICogJHN0YXRlUHJvdmlkZXIuc3RhdGUoXCJob21lXCIsIHt9KTtcclxuICAgKlxyXG4gICAqIC8vIE9yIGl0IGNhbiBiZSBhIG5lc3RlZCBzdGF0ZSBuYW1lLiBUaGlzIHN0YXRlIGlzIGEgY2hpbGQgb2YgdGhlXHJcbiAgICogLy8gYWJvdmUgXCJob21lXCIgc3RhdGUuXHJcbiAgICogJHN0YXRlUHJvdmlkZXIuc3RhdGUoXCJob21lLm5ld2VzdFwiLCB7fSk7XHJcbiAgICpcclxuICAgKiAvLyBOZXN0IHN0YXRlcyBhcyBkZWVwbHkgYXMgbmVlZGVkLlxyXG4gICAqICRzdGF0ZVByb3ZpZGVyLnN0YXRlKFwiaG9tZS5uZXdlc3QuYWJjLnh5ei5pbmNlcHRpb25cIiwge30pO1xyXG4gICAqXHJcbiAgICogLy8gc3RhdGUoKSByZXR1cm5zICRzdGF0ZVByb3ZpZGVyLCBzbyB5b3UgY2FuIGNoYWluIHN0YXRlIGRlY2xhcmF0aW9ucy5cclxuICAgKiAkc3RhdGVQcm92aWRlclxyXG4gICAqICAgLnN0YXRlKFwiaG9tZVwiLCB7fSlcclxuICAgKiAgIC5zdGF0ZShcImFib3V0XCIsIHt9KVxyXG4gICAqICAgLnN0YXRlKFwiY29udGFjdHNcIiwge30pO1xyXG4gICAqIDwvcHJlPlxyXG4gICAqXHJcbiAgICovXHJcbiAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xyXG4gIGZ1bmN0aW9uIHN0YXRlKG5hbWUsIGRlZmluaXRpb24pIHtcclxuICAgIC8qanNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xyXG4gICAgaWYgKGlzT2JqZWN0KG5hbWUpKSBkZWZpbml0aW9uID0gbmFtZTtcclxuICAgIGVsc2UgZGVmaW5pdGlvbi5uYW1lID0gbmFtZTtcclxuICAgIHJlZ2lzdGVyU3RhdGUoZGVmaW5pdGlvbik7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBuZ2RvYyBvYmplY3RcclxuICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAgICpcclxuICAgKiBAcmVxdWlyZXMgJHJvb3RTY29wZVxyXG4gICAqIEByZXF1aXJlcyAkcVxyXG4gICAqIEByZXF1aXJlcyB1aS5yb3V0ZXIuc3RhdGUuJHZpZXdcclxuICAgKiBAcmVxdWlyZXMgJGluamVjdG9yXHJcbiAgICogQHJlcXVpcmVzIHVpLnJvdXRlci51dGlsLiRyZXNvbHZlXHJcbiAgICogQHJlcXVpcmVzIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVQYXJhbXNcclxuICAgKiBAcmVxdWlyZXMgdWkucm91dGVyLnJvdXRlci4kdXJsUm91dGVyXHJcbiAgICpcclxuICAgKiBAcHJvcGVydHkge29iamVjdH0gcGFyYW1zIEEgcGFyYW0gb2JqZWN0LCBlLmcuIHtzZWN0aW9uSWQ6IHNlY3Rpb24uaWQpfSwgdGhhdCBcclxuICAgKiB5b3UnZCBsaWtlIHRvIHRlc3QgYWdhaW5zdCB0aGUgY3VycmVudCBhY3RpdmUgc3RhdGUuXHJcbiAgICogQHByb3BlcnR5IHtvYmplY3R9IGN1cnJlbnQgQSByZWZlcmVuY2UgdG8gdGhlIHN0YXRlJ3MgY29uZmlnIG9iamVjdC4gSG93ZXZlciBcclxuICAgKiB5b3UgcGFzc2VkIGl0IGluLiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBjdXN0b20gZGF0YS5cclxuICAgKiBAcHJvcGVydHkge29iamVjdH0gdHJhbnNpdGlvbiBDdXJyZW50bHkgcGVuZGluZyB0cmFuc2l0aW9uLiBBIHByb21pc2UgdGhhdCdsbCBcclxuICAgKiByZXNvbHZlIG9yIHJlamVjdC5cclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIGAkc3RhdGVgIHNlcnZpY2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcHJlc2VudGluZyBzdGF0ZXMgYXMgd2VsbCBhcyB0cmFuc2l0aW9uaW5nXHJcbiAgICogYmV0d2VlbiB0aGVtLiBJdCBhbHNvIHByb3ZpZGVzIGludGVyZmFjZXMgdG8gYXNrIGZvciBjdXJyZW50IHN0YXRlIG9yIGV2ZW4gc3RhdGVzXHJcbiAgICogeW91J3JlIGNvbWluZyBmcm9tLlxyXG4gICAqL1xyXG4gIHRoaXMuJGdldCA9ICRnZXQ7XHJcbiAgJGdldC4kaW5qZWN0ID0gWyckcm9vdFNjb3BlJywgJyRxJywgJyR2aWV3JywgJyRpbmplY3RvcicsICckcmVzb2x2ZScsICckc3RhdGVQYXJhbXMnLCAnJHVybFJvdXRlcicsICckbG9jYXRpb24nLCAnJHVybE1hdGNoZXJGYWN0b3J5J107XHJcbiAgZnVuY3Rpb24gJGdldCggICAkcm9vdFNjb3BlLCAgICRxLCAgICR2aWV3LCAgICRpbmplY3RvciwgICAkcmVzb2x2ZSwgICAkc3RhdGVQYXJhbXMsICAgJHVybFJvdXRlciwgICAkbG9jYXRpb24sICAgJHVybE1hdGNoZXJGYWN0b3J5KSB7XHJcblxyXG4gICAgdmFyIFRyYW5zaXRpb25TdXBlcnNlZGVkRXJyb3IgPSBuZXcgRXJyb3IoJ3RyYW5zaXRpb24gc3VwZXJzZWRlZCcpO1xyXG5cclxuICAgIHZhciBUcmFuc2l0aW9uU3VwZXJzZWRlZCA9IHNpbGVuY2VVbmNhdWdodEluUHJvbWlzZSgkcS5yZWplY3QoVHJhbnNpdGlvblN1cGVyc2VkZWRFcnJvcikpO1xyXG4gICAgdmFyIFRyYW5zaXRpb25QcmV2ZW50ZWQgPSBzaWxlbmNlVW5jYXVnaHRJblByb21pc2UoJHEucmVqZWN0KG5ldyBFcnJvcigndHJhbnNpdGlvbiBwcmV2ZW50ZWQnKSkpO1xyXG4gICAgdmFyIFRyYW5zaXRpb25BYm9ydGVkID0gc2lsZW5jZVVuY2F1Z2h0SW5Qcm9taXNlKCRxLnJlamVjdChuZXcgRXJyb3IoJ3RyYW5zaXRpb24gYWJvcnRlZCcpKSk7XHJcbiAgICB2YXIgVHJhbnNpdGlvbkZhaWxlZCA9IHNpbGVuY2VVbmNhdWdodEluUHJvbWlzZSgkcS5yZWplY3QobmV3IEVycm9yKCd0cmFuc2l0aW9uIGZhaWxlZCcpKSk7XHJcblxyXG4gICAgLy8gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBhIHN0YXRlIHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgYSB0cmFuc2l0aW9uIGlzIG5vdCBmb3VuZCwgYW5kIHRoZSB1c2VyXHJcbiAgICAvLyBjYW4gb3B0aW9uYWxseSByZXRyeSBvciBkZWZlciB0aGUgdHJhbnNpdGlvblxyXG4gICAgZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QocmVkaXJlY3QsIHN0YXRlLCBwYXJhbXMsIG9wdGlvbnMpIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEBuZ2RvYyBldmVudFxyXG4gICAgICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlIyRzdGF0ZU5vdEZvdW5kXHJcbiAgICAgICAqIEBldmVudE9mIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVcclxuICAgICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZVxyXG4gICAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAgICogRmlyZWQgd2hlbiBhIHJlcXVlc3RlZCBzdGF0ZSAqKmNhbm5vdCBiZSBmb3VuZCoqIHVzaW5nIHRoZSBwcm92aWRlZCBzdGF0ZSBuYW1lIGR1cmluZyB0cmFuc2l0aW9uLlxyXG4gICAgICAgKiBUaGUgZXZlbnQgaXMgYnJvYWRjYXN0IGFsbG93aW5nIGFueSBoYW5kbGVycyBhIHNpbmdsZSBjaGFuY2UgdG8gZGVhbCB3aXRoIHRoZSBlcnJvciAodXN1YWxseSBieVxyXG4gICAgICAgKiBsYXp5LWxvYWRpbmcgdGhlIHVuZm91bmQgc3RhdGUpLiBBIHNwZWNpYWwgYHVuZm91bmRTdGF0ZWAgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgaGFuZGxlcixcclxuICAgICAgICogeW91IGNhbiBzZWUgaXRzIHRocmVlIHByb3BlcnRpZXMgaW4gdGhlIGV4YW1wbGUuIFlvdSBjYW4gdXNlIGBldmVudC5wcmV2ZW50RGVmYXVsdCgpYCB0byBhYm9ydCB0aGVcclxuICAgICAgICogdHJhbnNpdGlvbiBhbmQgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSBgZ29gIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhIGAndHJhbnNpdGlvbiBhYm9ydGVkJ2AgdmFsdWUuXHJcbiAgICAgICAqXHJcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBFdmVudCBvYmplY3QuXHJcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1bmZvdW5kU3RhdGUgVW5mb3VuZCBTdGF0ZSBpbmZvcm1hdGlvbi4gQ29udGFpbnM6IGB0bywgdG9QYXJhbXMsIG9wdGlvbnNgIHByb3BlcnRpZXMuXHJcbiAgICAgICAqIEBwYXJhbSB7U3RhdGV9IGZyb21TdGF0ZSBDdXJyZW50IHN0YXRlIG9iamVjdC5cclxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZyb21QYXJhbXMgQ3VycmVudCBzdGF0ZSBwYXJhbXMuXHJcbiAgICAgICAqXHJcbiAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAqXHJcbiAgICAgICAqIDxwcmU+XHJcbiAgICAgICAqIC8vIHNvbWV3aGVyZSwgYXNzdW1lIGxhenkuc3RhdGUgaGFzIG5vdCBiZWVuIGRlZmluZWRcclxuICAgICAgICogJHN0YXRlLmdvKFwibGF6eS5zdGF0ZVwiLCB7YToxLCBiOjJ9LCB7aW5oZXJpdDpmYWxzZX0pO1xyXG4gICAgICAgKlxyXG4gICAgICAgKiAvLyBzb21ld2hlcmUgZWxzZVxyXG4gICAgICAgKiAkc2NvcGUuJG9uKCckc3RhdGVOb3RGb3VuZCcsXHJcbiAgICAgICAqIGZ1bmN0aW9uKGV2ZW50LCB1bmZvdW5kU3RhdGUsIGZyb21TdGF0ZSwgZnJvbVBhcmFtcyl7XHJcbiAgICAgICAqICAgICBjb25zb2xlLmxvZyh1bmZvdW5kU3RhdGUudG8pOyAvLyBcImxhenkuc3RhdGVcIlxyXG4gICAgICAgKiAgICAgY29uc29sZS5sb2codW5mb3VuZFN0YXRlLnRvUGFyYW1zKTsgLy8ge2E6MSwgYjoyfVxyXG4gICAgICAgKiAgICAgY29uc29sZS5sb2codW5mb3VuZFN0YXRlLm9wdGlvbnMpOyAvLyB7aW5oZXJpdDpmYWxzZX0gKyBkZWZhdWx0IG9wdGlvbnNcclxuICAgICAgICogfSlcclxuICAgICAgICogPC9wcmU+XHJcbiAgICAgICAqL1xyXG4gICAgICB2YXIgZXZ0ID0gJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckc3RhdGVOb3RGb3VuZCcsIHJlZGlyZWN0LCBzdGF0ZSwgcGFyYW1zKTtcclxuXHJcbiAgICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICAgICR1cmxSb3V0ZXIudXBkYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIFRyYW5zaXRpb25BYm9ydGVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWV2dC5yZXRyeSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBbGxvdyB0aGUgaGFuZGxlciB0byByZXR1cm4gYSBwcm9taXNlIHRvIGRlZmVyIHN0YXRlIGxvb2t1cCByZXRyeVxyXG4gICAgICBpZiAob3B0aW9ucy4kcmV0cnkpIHtcclxuICAgICAgICAkdXJsUm91dGVyLnVwZGF0ZSgpO1xyXG4gICAgICAgIHJldHVybiBUcmFuc2l0aW9uRmFpbGVkO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciByZXRyeVRyYW5zaXRpb24gPSAkc3RhdGUudHJhbnNpdGlvbiA9ICRxLndoZW4oZXZ0LnJldHJ5KTtcclxuXHJcbiAgICAgIHJldHJ5VHJhbnNpdGlvbi50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChyZXRyeVRyYW5zaXRpb24gIT09ICRzdGF0ZS50cmFuc2l0aW9uKSB7XHJcbiAgICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRzdGF0ZUNoYW5nZUNhbmNlbCcsIHJlZGlyZWN0LnRvLCByZWRpcmVjdC50b1BhcmFtcywgc3RhdGUsIHBhcmFtcyk7XHJcbiAgICAgICAgICByZXR1cm4gVHJhbnNpdGlvblN1cGVyc2VkZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlZGlyZWN0Lm9wdGlvbnMuJHJldHJ5ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gJHN0YXRlLnRyYW5zaXRpb25UbyhyZWRpcmVjdC50bywgcmVkaXJlY3QudG9QYXJhbXMsIHJlZGlyZWN0Lm9wdGlvbnMpO1xyXG4gICAgICB9LCBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gVHJhbnNpdGlvbkFib3J0ZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICAkdXJsUm91dGVyLnVwZGF0ZSgpO1xyXG5cclxuICAgICAgcmV0dXJuIHJldHJ5VHJhbnNpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICByb290LmxvY2FscyA9IHsgcmVzb2x2ZTogbnVsbCwgZ2xvYmFsczogeyAkc3RhdGVQYXJhbXM6IHt9IH0gfTtcclxuXHJcbiAgICAkc3RhdGUgPSB7XHJcbiAgICAgIHBhcmFtczoge30sXHJcbiAgICAgIGN1cnJlbnQ6IHJvb3Quc2VsZixcclxuICAgICAgJGN1cnJlbnQ6IHJvb3QsXHJcbiAgICAgIHRyYW5zaXRpb246IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjcmVsb2FkXHJcbiAgICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnN0YXRlLiRzdGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICogQSBtZXRob2QgdGhhdCBmb3JjZSByZWxvYWRzIHRoZSBjdXJyZW50IHN0YXRlLiBBbGwgcmVzb2x2ZXMgYXJlIHJlLXJlc29sdmVkLFxyXG4gICAgICogY29udHJvbGxlcnMgcmVpbnN0YW50aWF0ZWQsIGFuZCBldmVudHMgcmUtZmlyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIDxwcmU+XHJcbiAgICAgKiB2YXIgYXBwIGFuZ3VsYXIubW9kdWxlKCdhcHAnLCBbJ3VpLnJvdXRlciddKTtcclxuICAgICAqXHJcbiAgICAgKiBhcHAuY29udHJvbGxlcignY3RybCcsIGZ1bmN0aW9uICgkc2NvcGUsICRzdGF0ZSkge1xyXG4gICAgICogICAkc2NvcGUucmVsb2FkID0gZnVuY3Rpb24oKXtcclxuICAgICAqICAgICAkc3RhdGUucmVsb2FkKCk7XHJcbiAgICAgKiAgIH1cclxuICAgICAqIH0pO1xyXG4gICAgICogPC9wcmU+XHJcbiAgICAgKlxyXG4gICAgICogYHJlbG9hZCgpYCBpcyBqdXN0IGFuIGFsaWFzIGZvcjpcclxuICAgICAqIDxwcmU+XHJcbiAgICAgKiAkc3RhdGUudHJhbnNpdGlvblRvKCRzdGF0ZS5jdXJyZW50LCAkc3RhdGVQYXJhbXMsIHsgXHJcbiAgICAgKiAgIHJlbG9hZDogdHJ1ZSwgaW5oZXJpdDogZmFsc2UsIG5vdGlmeTogdHJ1ZVxyXG4gICAgICogfSk7XHJcbiAgICAgKiA8L3ByZT5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZz18b2JqZWN0PX0gc3RhdGUgLSBBIHN0YXRlIG5hbWUgb3IgYSBzdGF0ZSBvYmplY3QsIHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSByZXNvbHZlcyB0byBiZSByZS1yZXNvbHZlZC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiA8cHJlPlxyXG4gICAgICogLy9hc3N1bWluZyBhcHAgYXBwbGljYXRpb24gY29uc2lzdHMgb2YgMyBzdGF0ZXM6ICdjb250YWN0cycsICdjb250YWN0cy5kZXRhaWwnLCAnY29udGFjdHMuZGV0YWlsLml0ZW0nIFxyXG4gICAgICogLy9hbmQgY3VycmVudCBzdGF0ZSBpcyAnY29udGFjdHMuZGV0YWlsLml0ZW0nXHJcbiAgICAgKiB2YXIgYXBwIGFuZ3VsYXIubW9kdWxlKCdhcHAnLCBbJ3VpLnJvdXRlciddKTtcclxuICAgICAqXHJcbiAgICAgKiBhcHAuY29udHJvbGxlcignY3RybCcsIGZ1bmN0aW9uICgkc2NvcGUsICRzdGF0ZSkge1xyXG4gICAgICogICAkc2NvcGUucmVsb2FkID0gZnVuY3Rpb24oKXtcclxuICAgICAqICAgICAvL3dpbGwgcmVsb2FkICdjb250YWN0LmRldGFpbCcgYW5kICdjb250YWN0LmRldGFpbC5pdGVtJyBzdGF0ZXNcclxuICAgICAqICAgICAkc3RhdGUucmVsb2FkKCdjb250YWN0LmRldGFpbCcpO1xyXG4gICAgICogICB9XHJcbiAgICAgKiB9KTtcclxuICAgICAqIDwvcHJlPlxyXG4gICAgICpcclxuICAgICAqIGByZWxvYWQoKWAgaXMganVzdCBhbiBhbGlhcyBmb3I6XHJcbiAgICAgKiA8cHJlPlxyXG4gICAgICogJHN0YXRlLnRyYW5zaXRpb25Ubygkc3RhdGUuY3VycmVudCwgJHN0YXRlUGFyYW1zLCB7IFxyXG4gICAgICogICByZWxvYWQ6IHRydWUsIGluaGVyaXQ6IGZhbHNlLCBub3RpZnk6IHRydWVcclxuICAgICAqIH0pO1xyXG4gICAgICogPC9wcmU+XHJcblxyXG4gICAgICogQHJldHVybnMge3Byb21pc2V9IEEgcHJvbWlzZSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBuZXcgdHJhbnNpdGlvbi4gU2VlXHJcbiAgICAgKiB7QGxpbmsgdWkucm91dGVyLnN0YXRlLiRzdGF0ZSNtZXRob2RzX2dvICRzdGF0ZS5nb30uXHJcbiAgICAgKi9cclxuICAgICRzdGF0ZS5yZWxvYWQgPSBmdW5jdGlvbiByZWxvYWQoc3RhdGUpIHtcclxuICAgICAgcmV0dXJuICRzdGF0ZS50cmFuc2l0aW9uVG8oJHN0YXRlLmN1cnJlbnQsICRzdGF0ZVBhcmFtcywgeyByZWxvYWQ6IHN0YXRlIHx8IHRydWUsIGluaGVyaXQ6IGZhbHNlLCBub3RpZnk6IHRydWV9KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjZ29cclxuICAgICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAgICAgKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHRyYW5zaXRpb25pbmcgdG8gYSBuZXcgc3RhdGUuIGAkc3RhdGUuZ29gIGNhbGxzIFxyXG4gICAgICogYCRzdGF0ZS50cmFuc2l0aW9uVG9gIGludGVybmFsbHkgYnV0IGF1dG9tYXRpY2FsbHkgc2V0cyBvcHRpb25zIHRvIFxyXG4gICAgICogYHsgbG9jYXRpb246IHRydWUsIGluaGVyaXQ6IHRydWUsIHJlbGF0aXZlOiAkc3RhdGUuJGN1cnJlbnQsIG5vdGlmeTogdHJ1ZSB9YC4gXHJcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IHVzZSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byBwYXRoIGFuZCBzcGVjaWZ5IFxyXG4gICAgICogb25seSB0aGUgcGFyYW1ldGVycyB5b3UnZCBsaWtlIHRvIHVwZGF0ZSAod2hpbGUgbGV0dGluZyB1bnNwZWNpZmllZCBwYXJhbWV0ZXJzIFxyXG4gICAgICogaW5oZXJpdCBmcm9tIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFuY2VzdG9yIHN0YXRlcykuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIDxwcmU+XHJcbiAgICAgKiB2YXIgYXBwID0gYW5ndWxhci5tb2R1bGUoJ2FwcCcsIFsndWkucm91dGVyJ10pO1xyXG4gICAgICpcclxuICAgICAqIGFwcC5jb250cm9sbGVyKCdjdHJsJywgZnVuY3Rpb24gKCRzY29wZSwgJHN0YXRlKSB7XHJcbiAgICAgKiAgICRzY29wZS5jaGFuZ2VTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAqICAgICAkc3RhdGUuZ28oJ2NvbnRhY3QuZGV0YWlsJyk7XHJcbiAgICAgKiAgIH07XHJcbiAgICAgKiB9KTtcclxuICAgICAqIDwvcHJlPlxyXG4gICAgICogPGltZyBzcmM9Jy4uL25nZG9jX2Fzc2V0cy9TdGF0ZUdvRXhhbXBsZXMucG5nJy8+XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRvIEFic29sdXRlIHN0YXRlIG5hbWUgb3IgcmVsYXRpdmUgc3RhdGUgcGF0aC4gU29tZSBleGFtcGxlczpcclxuICAgICAqXHJcbiAgICAgKiAtIGAkc3RhdGUuZ28oJ2NvbnRhY3QuZGV0YWlsJylgIC0gd2lsbCBnbyB0byB0aGUgYGNvbnRhY3QuZGV0YWlsYCBzdGF0ZVxyXG4gICAgICogLSBgJHN0YXRlLmdvKCdeJylgIC0gd2lsbCBnbyB0byBhIHBhcmVudCBzdGF0ZVxyXG4gICAgICogLSBgJHN0YXRlLmdvKCdeLnNpYmxpbmcnKWAgLSB3aWxsIGdvIHRvIGEgc2libGluZyBzdGF0ZVxyXG4gICAgICogLSBgJHN0YXRlLmdvKCcuY2hpbGQuZ3JhbmRjaGlsZCcpYCAtIHdpbGwgZ28gdG8gZ3JhbmRjaGlsZCBzdGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gcGFyYW1zIEEgbWFwIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBzdGF0ZSwgXHJcbiAgICAgKiB3aWxsIHBvcHVsYXRlICRzdGF0ZVBhcmFtcy4gQW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCB3aWxsIGJlIGluaGVyaXRlZCBmcm9tIGN1cnJlbnRseSBcclxuICAgICAqIGRlZmluZWQgcGFyYW1ldGVycy4gT25seSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RhdGUgZGVmaW5pdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiwgbmV3IFxyXG4gICAgICogcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQuIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgZ29pbmcgdG8gYSBzaWJsaW5nIHN0YXRlIHRoYXQgc2hhcmVzIHBhcmFtZXRlcnNcclxuICAgICAqIHNwZWNpZmllZCBpbiBhIHBhcmVudCBzdGF0ZS4gUGFyYW1ldGVyIGluaGVyaXRhbmNlIG9ubHkgd29ya3MgYmV0d2VlbiBjb21tb24gYW5jZXN0b3Igc3RhdGVzLCBJLmUuXHJcbiAgICAgKiB0cmFuc2l0aW9uaW5nIHRvIGEgc2libGluZyB3aWxsIGdldCB5b3UgdGhlIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJlbnRzLCB0cmFuc2l0aW9uaW5nIHRvIGEgY2hpbGRcclxuICAgICAqIHdpbGwgZ2V0IHlvdSBhbGwgY3VycmVudCBwYXJhbWV0ZXJzLCBldGMuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuIFRoZSBvcHRpb25zIGFyZTpcclxuICAgICAqXHJcbiAgICAgKiAtICoqYGxvY2F0aW9uYCoqIC0ge2Jvb2xlYW49dHJ1ZXxzdHJpbmc9fSAtIElmIGB0cnVlYCB3aWxsIHVwZGF0ZSB0aGUgdXJsIGluIHRoZSBsb2NhdGlvbiBiYXIsIGlmIGBmYWxzZWBcclxuICAgICAqICAgIHdpbGwgbm90LiBJZiBzdHJpbmcsIG11c3QgYmUgYFwicmVwbGFjZVwiYCwgd2hpY2ggd2lsbCB1cGRhdGUgdXJsIGFuZCBhbHNvIHJlcGxhY2UgbGFzdCBoaXN0b3J5IHJlY29yZC5cclxuICAgICAqIC0gKipgaW5oZXJpdGAqKiAtIHtib29sZWFuPXRydWV9LCBJZiBgdHJ1ZWAgd2lsbCBpbmhlcml0IHVybCBwYXJhbWV0ZXJzIGZyb20gY3VycmVudCB1cmwuXHJcbiAgICAgKiAtICoqYHJlbGF0aXZlYCoqIC0ge29iamVjdD0kc3RhdGUuJGN1cnJlbnR9LCBXaGVuIHRyYW5zaXRpb25pbmcgd2l0aCByZWxhdGl2ZSBwYXRoIChlLmcgJ14nKSwgXHJcbiAgICAgKiAgICBkZWZpbmVzIHdoaWNoIHN0YXRlIHRvIGJlIHJlbGF0aXZlIGZyb20uXHJcbiAgICAgKiAtICoqYG5vdGlmeWAqKiAtIHtib29sZWFuPXRydWV9LCBJZiBgdHJ1ZWAgd2lsbCBicm9hZGNhc3QgJHN0YXRlQ2hhbmdlU3RhcnQgYW5kICRzdGF0ZUNoYW5nZVN1Y2Nlc3MgZXZlbnRzLlxyXG4gICAgICogLSAqKmByZWxvYWRgKiogKHYwLjIuNSkgLSB7Ym9vbGVhbj1mYWxzZXxzdHJpbmd8b2JqZWN0fSwgSWYgYHRydWVgIHdpbGwgZm9yY2UgdHJhbnNpdGlvbiBldmVuIGlmIG5vIHN0YXRlIG9yIHBhcmFtc1xyXG4gICAgICogICAgaGF2ZSBjaGFuZ2VkLiAgSXQgd2lsbCByZWxvYWQgdGhlIHJlc29sdmVzIGFuZCB2aWV3cyBvZiB0aGUgY3VycmVudCBzdGF0ZSBhbmQgcGFyZW50IHN0YXRlcy5cclxuICAgICAqICAgIElmIGByZWxvYWRgIGlzIGEgc3RyaW5nIChvciBzdGF0ZSBvYmplY3QpLCB0aGUgc3RhdGUgb2JqZWN0IGlzIGZldGNoZWQgKGJ5IG5hbWUsIG9yIG9iamVjdCByZWZlcmVuY2UpOyBhbmQgXFxcclxuICAgICAqICAgIHRoZSB0cmFuc2l0aW9uIHJlbG9hZHMgdGhlIHJlc29sdmVzIGFuZCB2aWV3cyBmb3IgdGhhdCBtYXRjaGVkIHN0YXRlLCBhbmQgYWxsIGl0cyBjaGlsZHJlbiBzdGF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3Byb21pc2V9IEEgcHJvbWlzZSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBuZXcgdHJhbnNpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBQb3NzaWJsZSBzdWNjZXNzIHZhbHVlczpcclxuICAgICAqXHJcbiAgICAgKiAtICRzdGF0ZS5jdXJyZW50XHJcbiAgICAgKlxyXG4gICAgICogPGJyLz5Qb3NzaWJsZSByZWplY3Rpb24gdmFsdWVzOlxyXG4gICAgICpcclxuICAgICAqIC0gJ3RyYW5zaXRpb24gc3VwZXJzZWRlZCcgLSB3aGVuIGEgbmV3ZXIgdHJhbnNpdGlvbiBoYXMgYmVlbiBzdGFydGVkIGFmdGVyIHRoaXMgb25lXHJcbiAgICAgKiAtICd0cmFuc2l0aW9uIHByZXZlbnRlZCcgLSB3aGVuIGBldmVudC5wcmV2ZW50RGVmYXVsdCgpYCBoYXMgYmVlbiBjYWxsZWQgaW4gYSBgJHN0YXRlQ2hhbmdlU3RhcnRgIGxpc3RlbmVyXHJcbiAgICAgKiAtICd0cmFuc2l0aW9uIGFib3J0ZWQnIC0gd2hlbiBgZXZlbnQucHJldmVudERlZmF1bHQoKWAgaGFzIGJlZW4gY2FsbGVkIGluIGEgYCRzdGF0ZU5vdEZvdW5kYCBsaXN0ZW5lciBvclxyXG4gICAgICogICB3aGVuIGEgYCRzdGF0ZU5vdEZvdW5kYCBgZXZlbnQucmV0cnlgIHByb21pc2UgZXJyb3JzLlxyXG4gICAgICogLSAndHJhbnNpdGlvbiBmYWlsZWQnIC0gd2hlbiBhIHN0YXRlIGhhcyBiZWVuIHVuc3VjY2Vzc2Z1bGx5IGZvdW5kIGFmdGVyIDIgdHJpZXMuXHJcbiAgICAgKiAtICpyZXNvbHZlIGVycm9yKiAtIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkIHdpdGggYSBgcmVzb2x2ZWBcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgICRzdGF0ZS5nbyA9IGZ1bmN0aW9uIGdvKHRvLCBwYXJhbXMsIG9wdGlvbnMpIHtcclxuICAgICAgcmV0dXJuICRzdGF0ZS50cmFuc2l0aW9uVG8odG8sIHBhcmFtcywgZXh0ZW5kKHsgaW5oZXJpdDogdHJ1ZSwgcmVsYXRpdmU6ICRzdGF0ZS4kY3VycmVudCB9LCBvcHRpb25zKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlI3RyYW5zaXRpb25Ub1xyXG4gICAgICogQG1ldGhvZE9mIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVcclxuICAgICAqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIExvdy1sZXZlbCBtZXRob2QgZm9yIHRyYW5zaXRpb25pbmcgdG8gYSBuZXcgc3RhdGUuIHtAbGluayB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlI21ldGhvZHNfZ28gJHN0YXRlLmdvfVxyXG4gICAgICogdXNlcyBgdHJhbnNpdGlvblRvYCBpbnRlcm5hbGx5LiBgJHN0YXRlLmdvYCBpcyByZWNvbW1lbmRlZCBpbiBtb3N0IHNpdHVhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIDxwcmU+XHJcbiAgICAgKiB2YXIgYXBwID0gYW5ndWxhci5tb2R1bGUoJ2FwcCcsIFsndWkucm91dGVyJ10pO1xyXG4gICAgICpcclxuICAgICAqIGFwcC5jb250cm9sbGVyKCdjdHJsJywgZnVuY3Rpb24gKCRzY29wZSwgJHN0YXRlKSB7XHJcbiAgICAgKiAgICRzY29wZS5jaGFuZ2VTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAqICAgICAkc3RhdGUudHJhbnNpdGlvblRvKCdjb250YWN0LmRldGFpbCcpO1xyXG4gICAgICogICB9O1xyXG4gICAgICogfSk7XHJcbiAgICAgKiA8L3ByZT5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG8gU3RhdGUgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gdG9QYXJhbXMgQSBtYXAgb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHN0YXRlLFxyXG4gICAgICogd2lsbCBwb3B1bGF0ZSAkc3RhdGVQYXJhbXMuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuIFRoZSBvcHRpb25zIGFyZTpcclxuICAgICAqXHJcbiAgICAgKiAtICoqYGxvY2F0aW9uYCoqIC0ge2Jvb2xlYW49dHJ1ZXxzdHJpbmc9fSAtIElmIGB0cnVlYCB3aWxsIHVwZGF0ZSB0aGUgdXJsIGluIHRoZSBsb2NhdGlvbiBiYXIsIGlmIGBmYWxzZWBcclxuICAgICAqICAgIHdpbGwgbm90LiBJZiBzdHJpbmcsIG11c3QgYmUgYFwicmVwbGFjZVwiYCwgd2hpY2ggd2lsbCB1cGRhdGUgdXJsIGFuZCBhbHNvIHJlcGxhY2UgbGFzdCBoaXN0b3J5IHJlY29yZC5cclxuICAgICAqIC0gKipgaW5oZXJpdGAqKiAtIHtib29sZWFuPWZhbHNlfSwgSWYgYHRydWVgIHdpbGwgaW5oZXJpdCB1cmwgcGFyYW1ldGVycyBmcm9tIGN1cnJlbnQgdXJsLlxyXG4gICAgICogLSAqKmByZWxhdGl2ZWAqKiAtIHtvYmplY3Q9fSwgV2hlbiB0cmFuc2l0aW9uaW5nIHdpdGggcmVsYXRpdmUgcGF0aCAoZS5nICdeJyksIFxyXG4gICAgICogICAgZGVmaW5lcyB3aGljaCBzdGF0ZSB0byBiZSByZWxhdGl2ZSBmcm9tLlxyXG4gICAgICogLSAqKmBub3RpZnlgKiogLSB7Ym9vbGVhbj10cnVlfSwgSWYgYHRydWVgIHdpbGwgYnJvYWRjYXN0ICRzdGF0ZUNoYW5nZVN0YXJ0IGFuZCAkc3RhdGVDaGFuZ2VTdWNjZXNzIGV2ZW50cy5cclxuICAgICAqIC0gKipgcmVsb2FkYCoqICh2MC4yLjUpIC0ge2Jvb2xlYW49ZmFsc2V8c3RyaW5nPXxvYmplY3Q9fSwgSWYgYHRydWVgIHdpbGwgZm9yY2UgdHJhbnNpdGlvbiBldmVuIGlmIHRoZSBzdGF0ZSBvciBwYXJhbXMgXHJcbiAgICAgKiAgICBoYXZlIG5vdCBjaGFuZ2VkLCBha2EgYSByZWxvYWQgb2YgdGhlIHNhbWUgc3RhdGUuIEl0IGRpZmZlcnMgZnJvbSByZWxvYWRPblNlYXJjaCBiZWNhdXNlIHlvdSdkXHJcbiAgICAgKiAgICB1c2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGZvcmNlIGEgcmVsb2FkIHdoZW4gKmV2ZXJ5dGhpbmcqIGlzIHRoZSBzYW1lLCBpbmNsdWRpbmcgc2VhcmNoIHBhcmFtcy5cclxuICAgICAqICAgIGlmIFN0cmluZywgdGhlbiB3aWxsIHJlbG9hZCB0aGUgc3RhdGUgd2l0aCB0aGUgbmFtZSBnaXZlbiBpbiByZWxvYWQsIGFuZCBhbnkgY2hpbGRyZW4uXHJcbiAgICAgKiAgICBpZiBPYmplY3QsIHRoZW4gYSBzdGF0ZU9iaiBpcyBleHBlY3RlZCwgd2lsbCByZWxvYWQgdGhlIHN0YXRlIGZvdW5kIGluIHN0YXRlT2JqLCBhbmQgYW55IGNoaWxkcmVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtwcm9taXNlfSBBIHByb21pc2UgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgbmV3IHRyYW5zaXRpb24uIFNlZVxyXG4gICAgICoge0BsaW5rIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjbWV0aG9kc19nbyAkc3RhdGUuZ299LlxyXG4gICAgICovXHJcbiAgICAkc3RhdGUudHJhbnNpdGlvblRvID0gZnVuY3Rpb24gdHJhbnNpdGlvblRvKHRvLCB0b1BhcmFtcywgb3B0aW9ucykge1xyXG4gICAgICB0b1BhcmFtcyA9IHRvUGFyYW1zIHx8IHt9O1xyXG4gICAgICBvcHRpb25zID0gZXh0ZW5kKHtcclxuICAgICAgICBsb2NhdGlvbjogdHJ1ZSwgaW5oZXJpdDogZmFsc2UsIHJlbGF0aXZlOiBudWxsLCBub3RpZnk6IHRydWUsIHJlbG9hZDogZmFsc2UsICRyZXRyeTogZmFsc2VcclxuICAgICAgfSwgb3B0aW9ucyB8fCB7fSk7XHJcblxyXG4gICAgICB2YXIgZnJvbSA9ICRzdGF0ZS4kY3VycmVudCwgZnJvbVBhcmFtcyA9ICRzdGF0ZS5wYXJhbXMsIGZyb21QYXRoID0gZnJvbS5wYXRoO1xyXG4gICAgICB2YXIgZXZ0LCB0b1N0YXRlID0gZmluZFN0YXRlKHRvLCBvcHRpb25zLnJlbGF0aXZlKTtcclxuXHJcbiAgICAgIC8vIFN0b3JlIHRoZSBoYXNoIHBhcmFtIGZvciBsYXRlciAoc2luY2UgaXQgd2lsbCBiZSBzdHJpcHBlZCBvdXQgYnkgdmFyaW91cyBtZXRob2RzKVxyXG4gICAgICB2YXIgaGFzaCA9IHRvUGFyYW1zWycjJ107XHJcblxyXG4gICAgICBpZiAoIWlzRGVmaW5lZCh0b1N0YXRlKSkge1xyXG4gICAgICAgIHZhciByZWRpcmVjdCA9IHsgdG86IHRvLCB0b1BhcmFtczogdG9QYXJhbXMsIG9wdGlvbnM6IG9wdGlvbnMgfTtcclxuICAgICAgICB2YXIgcmVkaXJlY3RSZXN1bHQgPSBoYW5kbGVSZWRpcmVjdChyZWRpcmVjdCwgZnJvbS5zZWxmLCBmcm9tUGFyYW1zLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgaWYgKHJlZGlyZWN0UmVzdWx0KSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVkaXJlY3RSZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBbHdheXMgcmV0cnkgb25jZSBpZiB0aGUgJHN0YXRlTm90Rm91bmQgd2FzIG5vdCBwcmV2ZW50ZWRcclxuICAgICAgICAvLyAoaGFuZGxlcyBlaXRoZXIgcmVkaXJlY3QgY2hhbmdlZCBvciBzdGF0ZSBsYXp5LWRlZmluaXRpb24pXHJcbiAgICAgICAgdG8gPSByZWRpcmVjdC50bztcclxuICAgICAgICB0b1BhcmFtcyA9IHJlZGlyZWN0LnRvUGFyYW1zO1xyXG4gICAgICAgIG9wdGlvbnMgPSByZWRpcmVjdC5vcHRpb25zO1xyXG4gICAgICAgIHRvU3RhdGUgPSBmaW5kU3RhdGUodG8sIG9wdGlvbnMucmVsYXRpdmUpO1xyXG5cclxuICAgICAgICBpZiAoIWlzRGVmaW5lZCh0b1N0YXRlKSkge1xyXG4gICAgICAgICAgaWYgKCFvcHRpb25zLnJlbGF0aXZlKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdWNoIHN0YXRlICdcIiArIHRvICsgXCInXCIpO1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHJlc29sdmUgJ1wiICsgdG8gKyBcIicgZnJvbSBzdGF0ZSAnXCIgKyBvcHRpb25zLnJlbGF0aXZlICsgXCInXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodG9TdGF0ZVthYnN0cmFjdEtleV0pIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB0cmFuc2l0aW9uIHRvIGFic3RyYWN0IHN0YXRlICdcIiArIHRvICsgXCInXCIpO1xyXG4gICAgICBpZiAob3B0aW9ucy5pbmhlcml0KSB0b1BhcmFtcyA9IGluaGVyaXRQYXJhbXMoJHN0YXRlUGFyYW1zLCB0b1BhcmFtcyB8fCB7fSwgJHN0YXRlLiRjdXJyZW50LCB0b1N0YXRlKTtcclxuICAgICAgaWYgKCF0b1N0YXRlLnBhcmFtcy4kJHZhbGlkYXRlcyh0b1BhcmFtcykpIHJldHVybiBUcmFuc2l0aW9uRmFpbGVkO1xyXG5cclxuICAgICAgdG9QYXJhbXMgPSB0b1N0YXRlLnBhcmFtcy4kJHZhbHVlcyh0b1BhcmFtcyk7XHJcbiAgICAgIHRvID0gdG9TdGF0ZTtcclxuXHJcbiAgICAgIHZhciB0b1BhdGggPSB0by5wYXRoO1xyXG5cclxuICAgICAgLy8gU3RhcnRpbmcgZnJvbSB0aGUgcm9vdCBvZiB0aGUgcGF0aCwga2VlcCBhbGwgbGV2ZWxzIHRoYXQgaGF2ZW4ndCBjaGFuZ2VkXHJcbiAgICAgIHZhciBrZWVwID0gMCwgc3RhdGUgPSB0b1BhdGhba2VlcF0sIGxvY2FscyA9IHJvb3QubG9jYWxzLCB0b0xvY2FscyA9IFtdO1xyXG5cclxuICAgICAgaWYgKCFvcHRpb25zLnJlbG9hZCkge1xyXG4gICAgICAgIHdoaWxlIChzdGF0ZSAmJiBzdGF0ZSA9PT0gZnJvbVBhdGhba2VlcF0gJiYgc3RhdGUub3duUGFyYW1zLiQkZXF1YWxzKHRvUGFyYW1zLCBmcm9tUGFyYW1zKSkge1xyXG4gICAgICAgICAgbG9jYWxzID0gdG9Mb2NhbHNba2VlcF0gPSBzdGF0ZS5sb2NhbHM7XHJcbiAgICAgICAgICBrZWVwKys7XHJcbiAgICAgICAgICBzdGF0ZSA9IHRvUGF0aFtrZWVwXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcob3B0aW9ucy5yZWxvYWQpIHx8IGlzT2JqZWN0KG9wdGlvbnMucmVsb2FkKSkge1xyXG4gICAgICAgIGlmIChpc09iamVjdChvcHRpb25zLnJlbG9hZCkgJiYgIW9wdGlvbnMucmVsb2FkLm5hbWUpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZWxvYWQgc3RhdGUgb2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciByZWxvYWRTdGF0ZSA9IG9wdGlvbnMucmVsb2FkID09PSB0cnVlID8gZnJvbVBhdGhbMF0gOiBmaW5kU3RhdGUob3B0aW9ucy5yZWxvYWQpO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnJlbG9hZCAmJiAhcmVsb2FkU3RhdGUpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHN1Y2ggcmVsb2FkIHN0YXRlICdcIiArIChpc1N0cmluZyhvcHRpb25zLnJlbG9hZCkgPyBvcHRpb25zLnJlbG9hZCA6IG9wdGlvbnMucmVsb2FkLm5hbWUpICsgXCInXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKHN0YXRlICYmIHN0YXRlID09PSBmcm9tUGF0aFtrZWVwXSAmJiBzdGF0ZSAhPT0gcmVsb2FkU3RhdGUpIHtcclxuICAgICAgICAgIGxvY2FscyA9IHRvTG9jYWxzW2tlZXBdID0gc3RhdGUubG9jYWxzO1xyXG4gICAgICAgICAga2VlcCsrO1xyXG4gICAgICAgICAgc3RhdGUgPSB0b1BhdGhba2VlcF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiB3ZSdyZSBnb2luZyB0byB0aGUgc2FtZSBzdGF0ZSBhbmQgYWxsIGxvY2FscyBhcmUga2VwdCwgd2UndmUgZ290IG5vdGhpbmcgdG8gZG8uXHJcbiAgICAgIC8vIEJ1dCBjbGVhciAndHJhbnNpdGlvbicsIGFzIHdlIHN0aWxsIHdhbnQgdG8gY2FuY2VsIGFueSBvdGhlciBwZW5kaW5nIHRyYW5zaXRpb25zLlxyXG4gICAgICAvLyBUT0RPOiBXZSBtYXkgbm90IHdhbnQgdG8gYnVtcCAndHJhbnNpdGlvbicgaWYgd2UncmUgY2FsbGVkIGZyb20gYSBsb2NhdGlvbiBjaGFuZ2VcclxuICAgICAgLy8gdGhhdCB3ZSd2ZSBpbml0aWF0ZWQgb3Vyc2VsdmVzLCBiZWNhdXNlIHdlIG1pZ2h0IGFjY2lkZW50YWxseSBhYm9ydCBhIGxlZ2l0aW1hdGVcclxuICAgICAgLy8gdHJhbnNpdGlvbiBpbml0aWF0ZWQgZnJvbSBjb2RlP1xyXG4gICAgICBpZiAoc2hvdWxkU2tpcFJlbG9hZCh0bywgdG9QYXJhbXMsIGZyb20sIGZyb21QYXJhbXMsIGxvY2Fscywgb3B0aW9ucykpIHtcclxuICAgICAgICBpZiAoaGFzaCkgdG9QYXJhbXNbJyMnXSA9IGhhc2g7XHJcbiAgICAgICAgJHN0YXRlLnBhcmFtcyA9IHRvUGFyYW1zO1xyXG4gICAgICAgIGNvcHkoJHN0YXRlLnBhcmFtcywgJHN0YXRlUGFyYW1zKTtcclxuICAgICAgICBjb3B5KGZpbHRlckJ5S2V5cyh0by5wYXJhbXMuJCRrZXlzKCksICRzdGF0ZVBhcmFtcyksIHRvLmxvY2Fscy5nbG9iYWxzLiRzdGF0ZVBhcmFtcyk7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMubG9jYXRpb24gJiYgdG8ubmF2aWdhYmxlICYmIHRvLm5hdmlnYWJsZS51cmwpIHtcclxuICAgICAgICAgICR1cmxSb3V0ZXIucHVzaCh0by5uYXZpZ2FibGUudXJsLCB0b1BhcmFtcywge1xyXG4gICAgICAgICAgICAkJGF2b2lkUmVzeW5jOiB0cnVlLCByZXBsYWNlOiBvcHRpb25zLmxvY2F0aW9uID09PSAncmVwbGFjZSdcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgJHVybFJvdXRlci51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICRzdGF0ZS50cmFuc2l0aW9uID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gJHEud2hlbigkc3RhdGUuY3VycmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZpbHRlciBwYXJhbWV0ZXJzIGJlZm9yZSB3ZSBwYXNzIHRoZW0gdG8gZXZlbnQgaGFuZGxlcnMgZXRjLlxyXG4gICAgICB0b1BhcmFtcyA9IGZpbHRlckJ5S2V5cyh0by5wYXJhbXMuJCRrZXlzKCksIHRvUGFyYW1zIHx8IHt9KTtcclxuICAgICAgXHJcbiAgICAgIC8vIFJlLWFkZCB0aGUgc2F2ZWQgaGFzaCBiZWZvcmUgd2Ugc3RhcnQgcmV0dXJuaW5nIHRoaW5ncyBvciBicm9hZGNhc3RpbmcgJHN0YXRlQ2hhbmdlU3RhcnRcclxuICAgICAgaWYgKGhhc2gpIHRvUGFyYW1zWycjJ10gPSBoYXNoO1xyXG4gICAgICBcclxuICAgICAgLy8gQnJvYWRjYXN0IHN0YXJ0IGV2ZW50IGFuZCBjYW5jZWwgdGhlIHRyYW5zaXRpb24gaWYgcmVxdWVzdGVkXHJcbiAgICAgIGlmIChvcHRpb25zLm5vdGlmeSkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBuZ2RvYyBldmVudFxyXG4gICAgICAgICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjJHN0YXRlQ2hhbmdlU3RhcnRcclxuICAgICAgICAgKiBAZXZlbnRPZiB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAgICAgICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZVxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHN0YXRlIHRyYW5zaXRpb24gKipiZWdpbnMqKi4gWW91IGNhbiB1c2UgYGV2ZW50LnByZXZlbnREZWZhdWx0KClgXHJcbiAgICAgICAgICogdG8gcHJldmVudCB0aGUgdHJhbnNpdGlvbiBmcm9tIGhhcHBlbmluZyBhbmQgdGhlbiB0aGUgdHJhbnNpdGlvbiBwcm9taXNlIHdpbGwgYmVcclxuICAgICAgICAgKiByZWplY3RlZCB3aXRoIGEgYCd0cmFuc2l0aW9uIHByZXZlbnRlZCdgIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlfSB0b1N0YXRlIFRoZSBzdGF0ZSBiZWluZyB0cmFuc2l0aW9uZWQgdG8uXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRvUGFyYW1zIFRoZSBwYXJhbXMgc3VwcGxpZWQgdG8gdGhlIGB0b1N0YXRlYC5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlfSBmcm9tU3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUsIHByZS10cmFuc2l0aW9uLlxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmcm9tUGFyYW1zIFRoZSBwYXJhbXMgc3VwcGxpZWQgdG8gdGhlIGBmcm9tU3RhdGVgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIDxwcmU+XHJcbiAgICAgICAgICogJHJvb3RTY29wZS4kb24oJyRzdGF0ZUNoYW5nZVN0YXJ0JyxcclxuICAgICAgICAgKiBmdW5jdGlvbihldmVudCwgdG9TdGF0ZSwgdG9QYXJhbXMsIGZyb21TdGF0ZSwgZnJvbVBhcmFtcyl7XHJcbiAgICAgICAgICogICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICogICAgIC8vIHRyYW5zaXRpb25UbygpIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCB3aXRoXHJcbiAgICAgICAgICogICAgIC8vIGEgJ3RyYW5zaXRpb24gcHJldmVudGVkJyBlcnJvclxyXG4gICAgICAgICAqIH0pXHJcbiAgICAgICAgICogPC9wcmU+XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKCRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHN0YXRlQ2hhbmdlU3RhcnQnLCB0by5zZWxmLCB0b1BhcmFtcywgZnJvbS5zZWxmLCBmcm9tUGFyYW1zLCBvcHRpb25zKS5kZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRzdGF0ZUNoYW5nZUNhbmNlbCcsIHRvLnNlbGYsIHRvUGFyYW1zLCBmcm9tLnNlbGYsIGZyb21QYXJhbXMpO1xyXG4gICAgICAgICAgLy9Eb24ndCB1cGRhdGUgYW5kIHJlc3luYyB1cmwgaWYgdGhlcmUncyBiZWVuIGEgbmV3IHRyYW5zaXRpb24gc3RhcnRlZC4gc2VlIGlzc3VlICMyMjM4LCAjNjAwXHJcbiAgICAgICAgICBpZiAoJHN0YXRlLnRyYW5zaXRpb24gPT0gbnVsbCkgJHVybFJvdXRlci51cGRhdGUoKTtcclxuICAgICAgICAgIHJldHVybiBUcmFuc2l0aW9uUHJldmVudGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVzb2x2ZSBsb2NhbHMgZm9yIHRoZSByZW1haW5pbmcgc3RhdGVzLCBidXQgZG9uJ3QgdXBkYXRlIGFueSBnbG9iYWwgc3RhdGUganVzdFxyXG4gICAgICAvLyB5ZXQgLS0gaWYgYW55dGhpbmcgZmFpbHMgdG8gcmVzb2x2ZSB0aGUgY3VycmVudCBzdGF0ZSBuZWVkcyB0byByZW1haW4gdW50b3VjaGVkLlxyXG4gICAgICAvLyBXZSBhbHNvIHNldCB1cCBhbiBpbmhlcml0YW5jZSBjaGFpbiBmb3IgdGhlIGxvY2FscyBoZXJlLiBUaGlzIGFsbG93cyB0aGUgdmlldyBkaXJlY3RpdmVcclxuICAgICAgLy8gdG8gcXVpY2tseSBsb29rIHVwIHRoZSBjb3JyZWN0IGRlZmluaXRpb24gZm9yIGVhY2ggdmlldyBpbiB0aGUgY3VycmVudCBzdGF0ZS4gRXZlblxyXG4gICAgICAvLyB0aG91Z2ggd2UgY3JlYXRlIHRoZSBsb2NhbHMgb2JqZWN0IGl0c2VsZiBvdXRzaWRlIHJlc29sdmVTdGF0ZSgpLCBpdCBpcyBpbml0aWFsbHlcclxuICAgICAgLy8gZW1wdHkgYW5kIGdldHMgZmlsbGVkIGFzeW5jaHJvbm91c2x5LiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHByb21pc2UgZm9yIHRoZVxyXG4gICAgICAvLyAoZnVsbHkgcmVzb2x2ZWQpIGN1cnJlbnQgbG9jYWxzLCBhbmQgcGFzcyB0aGlzIGRvd24gdGhlIGNoYWluLlxyXG4gICAgICB2YXIgcmVzb2x2ZWQgPSAkcS53aGVuKGxvY2Fscyk7XHJcblxyXG4gICAgICBmb3IgKHZhciBsID0ga2VlcDsgbCA8IHRvUGF0aC5sZW5ndGg7IGwrKywgc3RhdGUgPSB0b1BhdGhbbF0pIHtcclxuICAgICAgICBsb2NhbHMgPSB0b0xvY2Fsc1tsXSA9IGluaGVyaXQobG9jYWxzKTtcclxuICAgICAgICByZXNvbHZlZCA9IHJlc29sdmVTdGF0ZShzdGF0ZSwgdG9QYXJhbXMsIHN0YXRlID09PSB0bywgcmVzb2x2ZWQsIGxvY2Fscywgb3B0aW9ucyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE9uY2UgZXZlcnl0aGluZyBpcyByZXNvbHZlZCwgd2UgYXJlIHJlYWR5IHRvIHBlcmZvcm0gdGhlIGFjdHVhbCB0cmFuc2l0aW9uXHJcbiAgICAgIC8vIGFuZCByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgbmV3IHN0YXRlLiBXZSBhbHNvIGtlZXAgdHJhY2sgb2Ygd2hhdCB0aGVcclxuICAgICAgLy8gY3VycmVudCBwcm9taXNlIGlzLCBzbyB0aGF0IHdlIGNhbiBkZXRlY3Qgb3ZlcmxhcHBpbmcgdHJhbnNpdGlvbnMgYW5kXHJcbiAgICAgIC8vIGtlZXAgb25seSB0aGUgb3V0Y29tZSBvZiB0aGUgbGFzdCB0cmFuc2l0aW9uLlxyXG4gICAgICB2YXIgdHJhbnNpdGlvbiA9ICRzdGF0ZS50cmFuc2l0aW9uID0gcmVzb2x2ZWQudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGwsIGVudGVyaW5nLCBleGl0aW5nO1xyXG5cclxuICAgICAgICBpZiAoJHN0YXRlLnRyYW5zaXRpb24gIT09IHRyYW5zaXRpb24pIHtcclxuICAgICAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHN0YXRlQ2hhbmdlQ2FuY2VsJywgdG8uc2VsZiwgdG9QYXJhbXMsIGZyb20uc2VsZiwgZnJvbVBhcmFtcyk7XHJcbiAgICAgICAgICByZXR1cm4gVHJhbnNpdGlvblN1cGVyc2VkZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFeGl0ICdmcm9tJyBzdGF0ZXMgbm90IGtlcHRcclxuICAgICAgICBmb3IgKGwgPSBmcm9tUGF0aC5sZW5ndGggLSAxOyBsID49IGtlZXA7IGwtLSkge1xyXG4gICAgICAgICAgZXhpdGluZyA9IGZyb21QYXRoW2xdO1xyXG4gICAgICAgICAgaWYgKGV4aXRpbmcuc2VsZi5vbkV4aXQpIHtcclxuICAgICAgICAgICAgJGluamVjdG9yLmludm9rZShleGl0aW5nLnNlbGYub25FeGl0LCBleGl0aW5nLnNlbGYsIGV4aXRpbmcubG9jYWxzLmdsb2JhbHMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZXhpdGluZy5sb2NhbHMgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW50ZXIgJ3RvJyBzdGF0ZXMgbm90IGtlcHRcclxuICAgICAgICBmb3IgKGwgPSBrZWVwOyBsIDwgdG9QYXRoLmxlbmd0aDsgbCsrKSB7XHJcbiAgICAgICAgICBlbnRlcmluZyA9IHRvUGF0aFtsXTtcclxuICAgICAgICAgIGVudGVyaW5nLmxvY2FscyA9IHRvTG9jYWxzW2xdO1xyXG4gICAgICAgICAgaWYgKGVudGVyaW5nLnNlbGYub25FbnRlcikge1xyXG4gICAgICAgICAgICAkaW5qZWN0b3IuaW52b2tlKGVudGVyaW5nLnNlbGYub25FbnRlciwgZW50ZXJpbmcuc2VsZiwgZW50ZXJpbmcubG9jYWxzLmdsb2JhbHMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUnVuIGl0IGFnYWluLCB0byBjYXRjaCBhbnkgdHJhbnNpdGlvbnMgaW4gY2FsbGJhY2tzXHJcbiAgICAgICAgaWYgKCRzdGF0ZS50cmFuc2l0aW9uICE9PSB0cmFuc2l0aW9uKSB7XHJcbiAgICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRzdGF0ZUNoYW5nZUNhbmNlbCcsIHRvLnNlbGYsIHRvUGFyYW1zLCBmcm9tLnNlbGYsIGZyb21QYXJhbXMpO1xyXG4gICAgICAgICAgcmV0dXJuIFRyYW5zaXRpb25TdXBlcnNlZGVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIGdsb2JhbHMgaW4gJHN0YXRlXHJcbiAgICAgICAgJHN0YXRlLiRjdXJyZW50ID0gdG87XHJcbiAgICAgICAgJHN0YXRlLmN1cnJlbnQgPSB0by5zZWxmO1xyXG4gICAgICAgICRzdGF0ZS5wYXJhbXMgPSB0b1BhcmFtcztcclxuICAgICAgICBjb3B5KCRzdGF0ZS5wYXJhbXMsICRzdGF0ZVBhcmFtcyk7XHJcbiAgICAgICAgJHN0YXRlLnRyYW5zaXRpb24gPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5sb2NhdGlvbiAmJiB0by5uYXZpZ2FibGUpIHtcclxuICAgICAgICAgICR1cmxSb3V0ZXIucHVzaCh0by5uYXZpZ2FibGUudXJsLCB0by5uYXZpZ2FibGUubG9jYWxzLmdsb2JhbHMuJHN0YXRlUGFyYW1zLCB7XHJcbiAgICAgICAgICAgICQkYXZvaWRSZXN5bmM6IHRydWUsIHJlcGxhY2U6IG9wdGlvbnMubG9jYXRpb24gPT09ICdyZXBsYWNlJ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5ub3RpZnkpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAbmdkb2MgZXZlbnRcclxuICAgICAgICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlIyRzdGF0ZUNoYW5nZVN1Y2Nlc3NcclxuICAgICAgICAgKiBAZXZlbnRPZiB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAgICAgICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZVxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICAgICAqIEZpcmVkIG9uY2UgdGhlIHN0YXRlIHRyYW5zaXRpb24gaXMgKipjb21wbGV0ZSoqLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlfSB0b1N0YXRlIFRoZSBzdGF0ZSBiZWluZyB0cmFuc2l0aW9uZWQgdG8uXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRvUGFyYW1zIFRoZSBwYXJhbXMgc3VwcGxpZWQgdG8gdGhlIGB0b1N0YXRlYC5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlfSBmcm9tU3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUsIHByZS10cmFuc2l0aW9uLlxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmcm9tUGFyYW1zIFRoZSBwYXJhbXMgc3VwcGxpZWQgdG8gdGhlIGBmcm9tU3RhdGVgLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckc3RhdGVDaGFuZ2VTdWNjZXNzJywgdG8uc2VsZiwgdG9QYXJhbXMsIGZyb20uc2VsZiwgZnJvbVBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICR1cmxSb3V0ZXIudXBkYXRlKHRydWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHN0YXRlLmN1cnJlbnQ7XHJcbiAgICAgIH0pLnRoZW4obnVsbCwgZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgLy8gcHJvcGFnYXRlIFRyYW5zaXRpb25TdXBlcnNlZGVkIGVycm9yIHdpdGhvdXQgZW1pdHRpbmcgJHN0YXRlQ2hhbmdlQ2FuY2VsXHJcbiAgICAgICAgLy8gYXMgaXQgd2FzIGFscmVhZHkgZW1pdHRlZCBpbiB0aGUgc3VjY2VzcyBoYW5kbGVyIGFib3ZlXHJcbiAgICAgICAgaWYgKGVycm9yID09PSBUcmFuc2l0aW9uU3VwZXJzZWRlZEVycm9yKSByZXR1cm4gVHJhbnNpdGlvblN1cGVyc2VkZWQ7XHJcblxyXG4gICAgICAgIGlmICgkc3RhdGUudHJhbnNpdGlvbiAhPT0gdHJhbnNpdGlvbikge1xyXG4gICAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckc3RhdGVDaGFuZ2VDYW5jZWwnLCB0by5zZWxmLCB0b1BhcmFtcywgZnJvbS5zZWxmLCBmcm9tUGFyYW1zKTtcclxuICAgICAgICAgIHJldHVybiBUcmFuc2l0aW9uU3VwZXJzZWRlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRzdGF0ZS50cmFuc2l0aW9uID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAbmdkb2MgZXZlbnRcclxuICAgICAgICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlIyRzdGF0ZUNoYW5nZUVycm9yXHJcbiAgICAgICAgICogQGV2ZW50T2YgdWkucm91dGVyLnN0YXRlLiRzdGF0ZVxyXG4gICAgICAgICAqIEBldmVudFR5cGUgYnJvYWRjYXN0IG9uIHJvb3Qgc2NvcGVcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAgICAgKiBGaXJlZCB3aGVuIGFuICoqZXJyb3Igb2NjdXJzKiogZHVyaW5nIHRyYW5zaXRpb24uIEl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBpZiB5b3VcclxuICAgICAgICAgKiBoYXZlIGFueSBlcnJvcnMgaW4geW91ciByZXNvbHZlIGZ1bmN0aW9ucyAoamF2YXNjcmlwdCBlcnJvcnMsIG5vbi1leGlzdGVudCBzZXJ2aWNlcywgZXRjKVxyXG4gICAgICAgICAqIHRoZXkgd2lsbCBub3QgdGhyb3cgdHJhZGl0aW9uYWxseS4gWW91IG11c3QgbGlzdGVuIGZvciB0aGlzICRzdGF0ZUNoYW5nZUVycm9yIGV2ZW50IHRvXHJcbiAgICAgICAgICogY2F0Y2ggKipBTEwqKiBlcnJvcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGV9IHRvU3RhdGUgVGhlIHN0YXRlIGJlaW5nIHRyYW5zaXRpb25lZCB0by5cclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdG9QYXJhbXMgVGhlIHBhcmFtcyBzdXBwbGllZCB0byB0aGUgYHRvU3RhdGVgLlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGV9IGZyb21TdGF0ZSBUaGUgY3VycmVudCBzdGF0ZSwgcHJlLXRyYW5zaXRpb24uXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGZyb21QYXJhbXMgVGhlIHBhcmFtcyBzdXBwbGllZCB0byB0aGUgYGZyb21TdGF0ZWAuXHJcbiAgICAgICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgVGhlIHJlc29sdmUgZXJyb3Igb2JqZWN0LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGV2dCA9ICRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHN0YXRlQ2hhbmdlRXJyb3InLCB0by5zZWxmLCB0b1BhcmFtcywgZnJvbS5zZWxmLCBmcm9tUGFyYW1zLCBlcnJvcik7XHJcblxyXG4gICAgICAgIGlmICghZXZ0LmRlZmF1bHRQcmV2ZW50ZWQpIHtcclxuICAgICAgICAgICR1cmxSb3V0ZXIudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJHEucmVqZWN0KGVycm9yKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gdHJhbnNpdGlvbjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjaXNcclxuICAgICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAgICAgKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBTaW1pbGFyIHRvIHtAbGluayB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlI21ldGhvZHNfaW5jbHVkZXMgJHN0YXRlLmluY2x1ZGVzfSxcclxuICAgICAqIGJ1dCBvbmx5IGNoZWNrcyBmb3IgdGhlIGZ1bGwgc3RhdGUgbmFtZS4gSWYgcGFyYW1zIGlzIHN1cHBsaWVkIHRoZW4gaXQgd2lsbCBiZVxyXG4gICAgICogdGVzdGVkIGZvciBzdHJpY3QgZXF1YWxpdHkgYWdhaW5zdCB0aGUgY3VycmVudCBhY3RpdmUgcGFyYW1zIG9iamVjdCwgc28gYWxsIHBhcmFtc1xyXG4gICAgICogbXVzdCBtYXRjaCB3aXRoIG5vbmUgbWlzc2luZyBhbmQgbm8gZXh0cmFzLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiA8cHJlPlxyXG4gICAgICogJHN0YXRlLiRjdXJyZW50Lm5hbWUgPSAnY29udGFjdHMuZGV0YWlscy5pdGVtJztcclxuICAgICAqXHJcbiAgICAgKiAvLyBhYnNvbHV0ZSBuYW1lXHJcbiAgICAgKiAkc3RhdGUuaXMoJ2NvbnRhY3QuZGV0YWlscy5pdGVtJyk7IC8vIHJldHVybnMgdHJ1ZVxyXG4gICAgICogJHN0YXRlLmlzKGNvbnRhY3REZXRhaWxJdGVtU3RhdGVPYmplY3QpOyAvLyByZXR1cm5zIHRydWVcclxuICAgICAqXHJcbiAgICAgKiAvLyByZWxhdGl2ZSBuYW1lICguIGFuZCBeKSwgdHlwaWNhbGx5IGZyb20gYSB0ZW1wbGF0ZVxyXG4gICAgICogLy8gRS5nLiBmcm9tIHRoZSAnY29udGFjdHMuZGV0YWlscycgdGVtcGxhdGVcclxuICAgICAqIDxkaXYgbmctY2xhc3M9XCJ7aGlnaGxpZ2h0ZWQ6ICRzdGF0ZS5pcygnLml0ZW0nKX1cIj5JdGVtPC9kaXY+XHJcbiAgICAgKiA8L3ByZT5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHN0YXRlT3JOYW1lIFRoZSBzdGF0ZSBuYW1lIChhYnNvbHV0ZSBvciByZWxhdGl2ZSkgb3Igc3RhdGUgb2JqZWN0IHlvdSdkIGxpa2UgdG8gY2hlY2suXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IHBhcmFtcyBBIHBhcmFtIG9iamVjdCwgZS5nLiBge3NlY3Rpb25JZDogc2VjdGlvbi5pZH1gLCB0aGF0IHlvdSdkIGxpa2VcclxuICAgICAqIHRvIHRlc3QgYWdhaW5zdCB0aGUgY3VycmVudCBhY3RpdmUgc3RhdGUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgQW4gb3B0aW9ucyBvYmplY3QuICBUaGUgb3B0aW9ucyBhcmU6XHJcbiAgICAgKlxyXG4gICAgICogLSAqKmByZWxhdGl2ZWAqKiAtIHtzdHJpbmd8b2JqZWN0fSAtICBJZiBgc3RhdGVPck5hbWVgIGlzIGEgcmVsYXRpdmUgc3RhdGUgbmFtZSBhbmQgYG9wdGlvbnMucmVsYXRpdmVgIGlzIHNldCwgLmlzIHdpbGxcclxuICAgICAqIHRlc3QgcmVsYXRpdmUgdG8gYG9wdGlvbnMucmVsYXRpdmVgIHN0YXRlIChvciBuYW1lKS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGl0IGlzIHRoZSBzdGF0ZS5cclxuICAgICAqL1xyXG4gICAgJHN0YXRlLmlzID0gZnVuY3Rpb24gaXMoc3RhdGVPck5hbWUsIHBhcmFtcywgb3B0aW9ucykge1xyXG4gICAgICBvcHRpb25zID0gZXh0ZW5kKHsgcmVsYXRpdmU6ICRzdGF0ZS4kY3VycmVudCB9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgICAgdmFyIHN0YXRlID0gZmluZFN0YXRlKHN0YXRlT3JOYW1lLCBvcHRpb25zLnJlbGF0aXZlKTtcclxuXHJcbiAgICAgIGlmICghaXNEZWZpbmVkKHN0YXRlKSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XHJcbiAgICAgIGlmICgkc3RhdGUuJGN1cnJlbnQgIT09IHN0YXRlKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zID8gZXF1YWxGb3JLZXlzKHN0YXRlLnBhcmFtcy4kJHZhbHVlcyhwYXJhbXMpLCAkc3RhdGVQYXJhbXMpIDogdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjaW5jbHVkZXNcclxuICAgICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAgICAgKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBBIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgYWN0aXZlIHN0YXRlIGlzIGVxdWFsIHRvIG9yIGlzIHRoZSBjaGlsZCBvZiB0aGVcclxuICAgICAqIHN0YXRlIHN0YXRlTmFtZS4gSWYgYW55IHBhcmFtcyBhcmUgcGFzc2VkIHRoZW4gdGhleSB3aWxsIGJlIHRlc3RlZCBmb3IgYSBtYXRjaCBhcyB3ZWxsLlxyXG4gICAgICogTm90IGFsbCB0aGUgcGFyYW1ldGVycyBuZWVkIHRvIGJlIHBhc3NlZCwganVzdCB0aGUgb25lcyB5b3UnZCBsaWtlIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBQYXJ0aWFsIGFuZCByZWxhdGl2ZSBuYW1lc1xyXG4gICAgICogPHByZT5cclxuICAgICAqICRzdGF0ZS4kY3VycmVudC5uYW1lID0gJ2NvbnRhY3RzLmRldGFpbHMuaXRlbSc7XHJcbiAgICAgKlxyXG4gICAgICogLy8gVXNpbmcgcGFydGlhbCBuYW1lc1xyXG4gICAgICogJHN0YXRlLmluY2x1ZGVzKFwiY29udGFjdHNcIik7IC8vIHJldHVybnMgdHJ1ZVxyXG4gICAgICogJHN0YXRlLmluY2x1ZGVzKFwiY29udGFjdHMuZGV0YWlsc1wiKTsgLy8gcmV0dXJucyB0cnVlXHJcbiAgICAgKiAkc3RhdGUuaW5jbHVkZXMoXCJjb250YWN0cy5kZXRhaWxzLml0ZW1cIik7IC8vIHJldHVybnMgdHJ1ZVxyXG4gICAgICogJHN0YXRlLmluY2x1ZGVzKFwiY29udGFjdHMubGlzdFwiKTsgLy8gcmV0dXJucyBmYWxzZVxyXG4gICAgICogJHN0YXRlLmluY2x1ZGVzKFwiYWJvdXRcIik7IC8vIHJldHVybnMgZmFsc2VcclxuICAgICAqXHJcbiAgICAgKiAvLyBVc2luZyByZWxhdGl2ZSBuYW1lcyAoLiBhbmQgXiksIHR5cGljYWxseSBmcm9tIGEgdGVtcGxhdGVcclxuICAgICAqIC8vIEUuZy4gZnJvbSB0aGUgJ2NvbnRhY3RzLmRldGFpbHMnIHRlbXBsYXRlXHJcbiAgICAgKiA8ZGl2IG5nLWNsYXNzPVwie2hpZ2hsaWdodGVkOiAkc3RhdGUuaW5jbHVkZXMoJy5pdGVtJyl9XCI+SXRlbTwvZGl2PlxyXG4gICAgICogPC9wcmU+XHJcbiAgICAgKlxyXG4gICAgICogQmFzaWMgZ2xvYmJpbmcgcGF0dGVybnNcclxuICAgICAqIDxwcmU+XHJcbiAgICAgKiAkc3RhdGUuJGN1cnJlbnQubmFtZSA9ICdjb250YWN0cy5kZXRhaWxzLml0ZW0udXJsJztcclxuICAgICAqXHJcbiAgICAgKiAkc3RhdGUuaW5jbHVkZXMoXCIqLmRldGFpbHMuKi4qXCIpOyAvLyByZXR1cm5zIHRydWVcclxuICAgICAqICRzdGF0ZS5pbmNsdWRlcyhcIiouZGV0YWlscy4qKlwiKTsgLy8gcmV0dXJucyB0cnVlXHJcbiAgICAgKiAkc3RhdGUuaW5jbHVkZXMoXCIqKi5pdGVtLioqXCIpOyAvLyByZXR1cm5zIHRydWVcclxuICAgICAqICRzdGF0ZS5pbmNsdWRlcyhcIiouZGV0YWlscy5pdGVtLnVybFwiKTsgLy8gcmV0dXJucyB0cnVlXHJcbiAgICAgKiAkc3RhdGUuaW5jbHVkZXMoXCIqLmRldGFpbHMuKi51cmxcIik7IC8vIHJldHVybnMgdHJ1ZVxyXG4gICAgICogJHN0YXRlLmluY2x1ZGVzKFwiKi5kZXRhaWxzLipcIik7IC8vIHJldHVybnMgZmFsc2VcclxuICAgICAqICRzdGF0ZS5pbmNsdWRlcyhcIml0ZW0uKipcIik7IC8vIHJldHVybnMgZmFsc2VcclxuICAgICAqIDwvcHJlPlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZU9yTmFtZSBBIHBhcnRpYWwgbmFtZSwgcmVsYXRpdmUgbmFtZSwgb3IgZ2xvYiBwYXR0ZXJuXHJcbiAgICAgKiB0byBiZSBzZWFyY2hlZCBmb3Igd2l0aGluIHRoZSBjdXJyZW50IHN0YXRlIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IHBhcmFtcyBBIHBhcmFtIG9iamVjdCwgZS5nLiBge3NlY3Rpb25JZDogc2VjdGlvbi5pZH1gLFxyXG4gICAgICogdGhhdCB5b3UnZCBsaWtlIHRvIHRlc3QgYWdhaW5zdCB0aGUgY3VycmVudCBhY3RpdmUgc3RhdGUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgQW4gb3B0aW9ucyBvYmplY3QuICBUaGUgb3B0aW9ucyBhcmU6XHJcbiAgICAgKlxyXG4gICAgICogLSAqKmByZWxhdGl2ZWAqKiAtIHtzdHJpbmd8b2JqZWN0PX0gLSAgSWYgYHN0YXRlT3JOYW1lYCBpcyBhIHJlbGF0aXZlIHN0YXRlIHJlZmVyZW5jZSBhbmQgYG9wdGlvbnMucmVsYXRpdmVgIGlzIHNldCxcclxuICAgICAqIC5pbmNsdWRlcyB3aWxsIHRlc3QgcmVsYXRpdmUgdG8gYG9wdGlvbnMucmVsYXRpdmVgIHN0YXRlIChvciBuYW1lKS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGl0IGRvZXMgaW5jbHVkZSB0aGUgc3RhdGVcclxuICAgICAqL1xyXG4gICAgJHN0YXRlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMoc3RhdGVPck5hbWUsIHBhcmFtcywgb3B0aW9ucykge1xyXG4gICAgICBvcHRpb25zID0gZXh0ZW5kKHsgcmVsYXRpdmU6ICRzdGF0ZS4kY3VycmVudCB9LCBvcHRpb25zIHx8IHt9KTtcclxuICAgICAgaWYgKGlzU3RyaW5nKHN0YXRlT3JOYW1lKSAmJiBpc0dsb2Ioc3RhdGVPck5hbWUpKSB7XHJcbiAgICAgICAgaWYgKCFkb2VzU3RhdGVNYXRjaEdsb2Ioc3RhdGVPck5hbWUpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXRlT3JOYW1lID0gJHN0YXRlLiRjdXJyZW50Lm5hbWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBzdGF0ZSA9IGZpbmRTdGF0ZShzdGF0ZU9yTmFtZSwgb3B0aW9ucy5yZWxhdGl2ZSk7XHJcbiAgICAgIGlmICghaXNEZWZpbmVkKHN0YXRlKSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XHJcbiAgICAgIGlmICghaXNEZWZpbmVkKCRzdGF0ZS4kY3VycmVudC5pbmNsdWRlc1tzdGF0ZS5uYW1lXSkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgIGlmICghcGFyYW1zKSB7IHJldHVybiB0cnVlOyB9XHJcblxyXG4gICAgICB2YXIga2V5cyA9IG9iamVjdEtleXMocGFyYW1zKTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV0sIHBhcmFtRGVmID0gc3RhdGUucGFyYW1zW2tleV07XHJcbiAgICAgICAgaWYgKHBhcmFtRGVmICYmICFwYXJhbURlZi50eXBlLmVxdWFscygkc3RhdGVQYXJhbXNba2V5XSwgcGFyYW1zW2tleV0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlI2hyZWZcclxuICAgICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAgICAgKlxyXG4gICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgKiBBIHVybCBnZW5lcmF0aW9uIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGNvbXBpbGVkIHVybCBmb3IgdGhlIGdpdmVuIHN0YXRlIHBvcHVsYXRlZCB3aXRoIHRoZSBnaXZlbiBwYXJhbXMuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIDxwcmU+XHJcbiAgICAgKiBleHBlY3QoJHN0YXRlLmhyZWYoXCJhYm91dC5wZXJzb25cIiwgeyBwZXJzb246IFwiYm9iXCIgfSkpLnRvRXF1YWwoXCIvYWJvdXQvYm9iXCIpO1xyXG4gICAgICogPC9wcmU+XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBzdGF0ZU9yTmFtZSBUaGUgc3RhdGUgbmFtZSBvciBzdGF0ZSBvYmplY3QgeW91J2QgbGlrZSB0byBnZW5lcmF0ZSBhIHVybCBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBwYXJhbXMgQW4gb2JqZWN0IG9mIHBhcmFtZXRlciB2YWx1ZXMgdG8gZmlsbCB0aGUgc3RhdGUncyByZXF1aXJlZCBwYXJhbWV0ZXJzLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBUaGUgb3B0aW9ucyBhcmU6XHJcbiAgICAgKlxyXG4gICAgICogLSAqKmBsb3NzeWAqKiAtIHtib29sZWFuPXRydWV9IC0gIElmIHRydWUsIGFuZCBpZiB0aGVyZSBpcyBubyB1cmwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0ZSBwcm92aWRlZCBpbiB0aGVcclxuICAgICAqICAgIGZpcnN0IHBhcmFtZXRlciwgdGhlbiB0aGUgY29uc3RydWN0ZWQgaHJlZiB1cmwgd2lsbCBiZSBidWlsdCBmcm9tIHRoZSBmaXJzdCBuYXZpZ2FibGUgYW5jZXN0b3IgKGFrYVxyXG4gICAgICogICAgYW5jZXN0b3Igd2l0aCBhIHZhbGlkIHVybCkuXHJcbiAgICAgKiAtICoqYGluaGVyaXRgKiogLSB7Ym9vbGVhbj10cnVlfSwgSWYgYHRydWVgIHdpbGwgaW5oZXJpdCB1cmwgcGFyYW1ldGVycyBmcm9tIGN1cnJlbnQgdXJsLlxyXG4gICAgICogLSAqKmByZWxhdGl2ZWAqKiAtIHtvYmplY3Q9JHN0YXRlLiRjdXJyZW50fSwgV2hlbiB0cmFuc2l0aW9uaW5nIHdpdGggcmVsYXRpdmUgcGF0aCAoZS5nICdeJyksIFxyXG4gICAgICogICAgZGVmaW5lcyB3aGljaCBzdGF0ZSB0byBiZSByZWxhdGl2ZSBmcm9tLlxyXG4gICAgICogLSAqKmBhYnNvbHV0ZWAqKiAtIHtib29sZWFuPWZhbHNlfSwgIElmIHRydWUgd2lsbCBnZW5lcmF0ZSBhbiBhYnNvbHV0ZSB1cmwsIGUuZy4gXCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Z1bGx1cmxcIi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gY29tcGlsZWQgc3RhdGUgdXJsXHJcbiAgICAgKi9cclxuICAgICRzdGF0ZS5ocmVmID0gZnVuY3Rpb24gaHJlZihzdGF0ZU9yTmFtZSwgcGFyYW1zLCBvcHRpb25zKSB7XHJcbiAgICAgIG9wdGlvbnMgPSBleHRlbmQoe1xyXG4gICAgICAgIGxvc3N5OiAgICB0cnVlLFxyXG4gICAgICAgIGluaGVyaXQ6ICB0cnVlLFxyXG4gICAgICAgIGFic29sdXRlOiBmYWxzZSxcclxuICAgICAgICByZWxhdGl2ZTogJHN0YXRlLiRjdXJyZW50XHJcbiAgICAgIH0sIG9wdGlvbnMgfHwge30pO1xyXG5cclxuICAgICAgdmFyIHN0YXRlID0gZmluZFN0YXRlKHN0YXRlT3JOYW1lLCBvcHRpb25zLnJlbGF0aXZlKTtcclxuXHJcbiAgICAgIGlmICghaXNEZWZpbmVkKHN0YXRlKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgIGlmIChvcHRpb25zLmluaGVyaXQpIHBhcmFtcyA9IGluaGVyaXRQYXJhbXMoJHN0YXRlUGFyYW1zLCBwYXJhbXMgfHwge30sICRzdGF0ZS4kY3VycmVudCwgc3RhdGUpO1xyXG4gICAgICBcclxuICAgICAgdmFyIG5hdiA9IChzdGF0ZSAmJiBvcHRpb25zLmxvc3N5KSA/IHN0YXRlLm5hdmlnYWJsZSA6IHN0YXRlO1xyXG5cclxuICAgICAgaWYgKCFuYXYgfHwgbmF2LnVybCA9PT0gdW5kZWZpbmVkIHx8IG5hdi51cmwgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gJHVybFJvdXRlci5ocmVmKG5hdi51cmwsIGZpbHRlckJ5S2V5cyhzdGF0ZS5wYXJhbXMuJCRrZXlzKCkuY29uY2F0KCcjJyksIHBhcmFtcyB8fCB7fSksIHtcclxuICAgICAgICBhYnNvbHV0ZTogb3B0aW9ucy5hYnNvbHV0ZVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmdkb2MgZnVuY3Rpb25cclxuICAgICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjZ2V0XHJcbiAgICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnN0YXRlLiRzdGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGFueSBzcGVjaWZpYyBzdGF0ZSBvciBhbGwgc3RhdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdD19IHN0YXRlT3JOYW1lIChhYnNvbHV0ZSBvciByZWxhdGl2ZSkgSWYgcHJvdmlkZWQsIHdpbGwgb25seSBnZXQgdGhlIGNvbmZpZyBmb3JcclxuICAgICAqIHRoZSByZXF1ZXN0ZWQgc3RhdGUuIElmIG5vdCBwcm92aWRlZCwgcmV0dXJucyBhbiBhcnJheSBvZiBBTEwgc3RhdGUgY29uZmlncy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdD19IGNvbnRleHQgV2hlbiBzdGF0ZU9yTmFtZSBpcyBhIHJlbGF0aXZlIHN0YXRlIHJlZmVyZW5jZSwgdGhlIHN0YXRlIHdpbGwgYmUgcmV0cmlldmVkIHJlbGF0aXZlIHRvIGNvbnRleHQuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fEFycmF5fSBTdGF0ZSBjb25maWd1cmF0aW9uIG9iamVjdCBvciBhcnJheSBvZiBhbGwgb2JqZWN0cy5cclxuICAgICAqL1xyXG4gICAgJHN0YXRlLmdldCA9IGZ1bmN0aW9uIChzdGF0ZU9yTmFtZSwgY29udGV4dCkge1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1hcChvYmplY3RLZXlzKHN0YXRlcyksIGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIHN0YXRlc1tuYW1lXS5zZWxmOyB9KTtcclxuICAgICAgdmFyIHN0YXRlID0gZmluZFN0YXRlKHN0YXRlT3JOYW1lLCBjb250ZXh0IHx8ICRzdGF0ZS4kY3VycmVudCk7XHJcbiAgICAgIHJldHVybiAoc3RhdGUgJiYgc3RhdGUuc2VsZikgPyBzdGF0ZS5zZWxmIDogbnVsbDtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVN0YXRlKHN0YXRlLCBwYXJhbXMsIHBhcmFtc0FyZUZpbHRlcmVkLCBpbmhlcml0ZWQsIGRzdCwgb3B0aW9ucykge1xyXG4gICAgICAvLyBNYWtlIGEgcmVzdHJpY3RlZCAkc3RhdGVQYXJhbXMgd2l0aCBvbmx5IHRoZSBwYXJhbWV0ZXJzIHRoYXQgYXBwbHkgdG8gdGhpcyBzdGF0ZSBpZlxyXG4gICAgICAvLyBuZWNlc3NhcnkuIEluIGFkZGl0aW9uIHRvIGJlaW5nIGF2YWlsYWJsZSB0byB0aGUgY29udHJvbGxlciBhbmQgb25FbnRlci9vbkV4aXQgY2FsbGJhY2tzLFxyXG4gICAgICAvLyB3ZSBhbHNvIG5lZWQgJHN0YXRlUGFyYW1zIHRvIGJlIGF2YWlsYWJsZSBmb3IgYW55ICRpbmplY3RvciBjYWxscyB3ZSBtYWtlIGR1cmluZyB0aGVcclxuICAgICAgLy8gZGVwZW5kZW5jeSByZXNvbHV0aW9uIHByb2Nlc3MuXHJcbiAgICAgIHZhciAkc3RhdGVQYXJhbXMgPSAocGFyYW1zQXJlRmlsdGVyZWQpID8gcGFyYW1zIDogZmlsdGVyQnlLZXlzKHN0YXRlLnBhcmFtcy4kJGtleXMoKSwgcGFyYW1zKTtcclxuICAgICAgdmFyIGxvY2FscyA9IHsgJHN0YXRlUGFyYW1zOiAkc3RhdGVQYXJhbXMgfTtcclxuXHJcbiAgICAgIC8vIFJlc29sdmUgJ2dsb2JhbCcgZGVwZW5kZW5jaWVzIGZvciB0aGUgc3RhdGUsIGkuZS4gdGhvc2Ugbm90IHNwZWNpZmljIHRvIGEgdmlldy5cclxuICAgICAgLy8gV2UncmUgYWxzbyBpbmNsdWRpbmcgJHN0YXRlUGFyYW1zIGluIHRoaXM7IHRoYXQgd2F5IHRoZSBwYXJhbWV0ZXJzIGFyZSByZXN0cmljdGVkXHJcbiAgICAgIC8vIHRvIHRoZSBzZXQgdGhhdCBzaG91bGQgYmUgdmlzaWJsZSB0byB0aGUgc3RhdGUsIGFuZCBhcmUgaW5kZXBlbmRlbnQgb2Ygd2hlbiB3ZSB1cGRhdGVcclxuICAgICAgLy8gdGhlIGdsb2JhbCAkc3RhdGUgYW5kICRzdGF0ZVBhcmFtcyB2YWx1ZXMuXHJcbiAgICAgIGRzdC5yZXNvbHZlID0gJHJlc29sdmUucmVzb2x2ZShzdGF0ZS5yZXNvbHZlLCBsb2NhbHMsIGRzdC5yZXNvbHZlLCBzdGF0ZSk7XHJcbiAgICAgIHZhciBwcm9taXNlcyA9IFtkc3QucmVzb2x2ZS50aGVuKGZ1bmN0aW9uIChnbG9iYWxzKSB7XHJcbiAgICAgICAgZHN0Lmdsb2JhbHMgPSBnbG9iYWxzO1xyXG4gICAgICB9KV07XHJcbiAgICAgIGlmIChpbmhlcml0ZWQpIHByb21pc2VzLnB1c2goaW5oZXJpdGVkKTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVWaWV3cygpIHtcclxuICAgICAgICB2YXIgdmlld3NQcm9taXNlcyA9IFtdO1xyXG5cclxuICAgICAgICAvLyBSZXNvbHZlIHRlbXBsYXRlIGFuZCBkZXBlbmRlbmNpZXMgZm9yIGFsbCB2aWV3cy5cclxuICAgICAgICBmb3JFYWNoKHN0YXRlLnZpZXdzLCBmdW5jdGlvbiAodmlldywgbmFtZSkge1xyXG4gICAgICAgICAgdmFyIGluamVjdGFibGVzID0gKHZpZXcucmVzb2x2ZSAmJiB2aWV3LnJlc29sdmUgIT09IHN0YXRlLnJlc29sdmUgPyB2aWV3LnJlc29sdmUgOiB7fSk7XHJcbiAgICAgICAgICBpbmplY3RhYmxlcy4kdGVtcGxhdGUgPSBbIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICR2aWV3LmxvYWQobmFtZSwgeyB2aWV3OiB2aWV3LCBsb2NhbHM6IGRzdC5nbG9iYWxzLCBwYXJhbXM6ICRzdGF0ZVBhcmFtcywgbm90aWZ5OiBvcHRpb25zLm5vdGlmeSB9KSB8fCAnJztcclxuICAgICAgICAgIH1dO1xyXG5cclxuICAgICAgICAgIHZpZXdzUHJvbWlzZXMucHVzaCgkcmVzb2x2ZS5yZXNvbHZlKGluamVjdGFibGVzLCBkc3QuZ2xvYmFscywgZHN0LnJlc29sdmUsIHN0YXRlKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgLy8gUmVmZXJlbmNlcyB0byB0aGUgY29udHJvbGxlciAob25seSBpbnN0YW50aWF0ZWQgYXQgbGluayB0aW1lKVxyXG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbih2aWV3LmNvbnRyb2xsZXJQcm92aWRlcikgfHwgaXNBcnJheSh2aWV3LmNvbnRyb2xsZXJQcm92aWRlcikpIHtcclxuICAgICAgICAgICAgICB2YXIgaW5qZWN0TG9jYWxzID0gYW5ndWxhci5leHRlbmQoe30sIGluamVjdGFibGVzLCBkc3QuZ2xvYmFscyk7XHJcbiAgICAgICAgICAgICAgcmVzdWx0LiQkY29udHJvbGxlciA9ICRpbmplY3Rvci5pbnZva2Uodmlldy5jb250cm9sbGVyUHJvdmlkZXIsIG51bGwsIGluamVjdExvY2Fscyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVzdWx0LiQkY29udHJvbGxlciA9IHZpZXcuY29udHJvbGxlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBQcm92aWRlIGFjY2VzcyB0byB0aGUgc3RhdGUgaXRzZWxmIGZvciBpbnRlcm5hbCB1c2VcclxuICAgICAgICAgICAgcmVzdWx0LiQkc3RhdGUgPSBzdGF0ZTtcclxuICAgICAgICAgICAgcmVzdWx0LiQkY29udHJvbGxlckFzID0gdmlldy5jb250cm9sbGVyQXM7XHJcbiAgICAgICAgICAgIHJlc3VsdC4kJHJlc29sdmVBcyA9IHZpZXcucmVzb2x2ZUFzO1xyXG4gICAgICAgICAgICBkc3RbbmFtZV0gPSByZXN1bHQ7XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiAkcS5hbGwodmlld3NQcm9taXNlcykudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgcmV0dXJuIGRzdC5nbG9iYWxzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBXYWl0IGZvciBhbGwgdGhlIHByb21pc2VzIGFuZCB0aGVuIHJldHVybiB0aGUgYWN0aXZhdGlvbiBvYmplY3RcclxuICAgICAgcmV0dXJuICRxLmFsbChwcm9taXNlcykudGhlbihyZXNvbHZlVmlld3MpLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykge1xyXG4gICAgICAgIHJldHVybiBkc3Q7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAkc3RhdGU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBzaG91bGRTa2lwUmVsb2FkKHRvLCB0b1BhcmFtcywgZnJvbSwgZnJvbVBhcmFtcywgbG9jYWxzLCBvcHRpb25zKSB7XHJcbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gZGlmZmVyZW5jZXMgaW4gbm9uLXNlYXJjaCAocGF0aC9vYmplY3QpIHBhcmFtcywgZmFsc2UgaWYgdGhlcmUgYXJlIGRpZmZlcmVuY2VzXHJcbiAgICBmdW5jdGlvbiBub25TZWFyY2hQYXJhbXNFcXVhbChmcm9tQW5kVG9TdGF0ZSwgZnJvbVBhcmFtcywgdG9QYXJhbXMpIHtcclxuICAgICAgLy8gSWRlbnRpZnkgd2hldGhlciBhbGwgdGhlIHBhcmFtZXRlcnMgdGhhdCBkaWZmZXIgYmV0d2VlbiBgZnJvbVBhcmFtc2AgYW5kIGB0b1BhcmFtc2Agd2VyZSBzZWFyY2ggcGFyYW1zLlxyXG4gICAgICBmdW5jdGlvbiBub3RTZWFyY2hQYXJhbShrZXkpIHtcclxuICAgICAgICByZXR1cm4gZnJvbUFuZFRvU3RhdGUucGFyYW1zW2tleV0ubG9jYXRpb24gIT0gXCJzZWFyY2hcIjtcclxuICAgICAgfVxyXG4gICAgICB2YXIgbm9uUXVlcnlQYXJhbUtleXMgPSBmcm9tQW5kVG9TdGF0ZS5wYXJhbXMuJCRrZXlzKCkuZmlsdGVyKG5vdFNlYXJjaFBhcmFtKTtcclxuICAgICAgdmFyIG5vblF1ZXJ5UGFyYW1zID0gcGljay5hcHBseSh7fSwgW2Zyb21BbmRUb1N0YXRlLnBhcmFtc10uY29uY2F0KG5vblF1ZXJ5UGFyYW1LZXlzKSk7XHJcbiAgICAgIHZhciBub25RdWVyeVBhcmFtU2V0ID0gbmV3ICQkVU1GUC5QYXJhbVNldChub25RdWVyeVBhcmFtcyk7XHJcbiAgICAgIHJldHVybiBub25RdWVyeVBhcmFtU2V0LiQkZXF1YWxzKGZyb21QYXJhbXMsIHRvUGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiByZWxvYWQgd2FzIG5vdCBleHBsaWNpdGx5IHJlcXVlc3RlZFxyXG4gICAgLy8gYW5kIHdlJ3JlIHRyYW5zaXRpb25pbmcgdG8gdGhlIHNhbWUgc3RhdGUgd2UncmUgYWxyZWFkeSBpblxyXG4gICAgLy8gYW5kICAgIHRoZSBsb2NhbHMgZGlkbid0IGNoYW5nZVxyXG4gICAgLy8gICAgIG9yIHRoZXkgY2hhbmdlZCBpbiBhIHdheSB0aGF0IGRvZXNuJ3QgbWVyaXQgcmVsb2FkaW5nXHJcbiAgICAvLyAgICAgICAgKHJlbG9hZE9uUGFyYW1zOmZhbHNlLCBvciByZWxvYWRPblNlYXJjaC5mYWxzZSBhbmQgb25seSBzZWFyY2ggcGFyYW1zIGNoYW5nZWQpXHJcbiAgICAvLyBUaGVuIHJldHVybiB0cnVlLlxyXG4gICAgaWYgKCFvcHRpb25zLnJlbG9hZCAmJiB0byA9PT0gZnJvbSAmJlxyXG4gICAgICAobG9jYWxzID09PSBmcm9tLmxvY2FscyB8fCAodG8uc2VsZi5yZWxvYWRPblNlYXJjaCA9PT0gZmFsc2UgJiYgbm9uU2VhcmNoUGFyYW1zRXF1YWwoZnJvbSwgZnJvbVBhcmFtcywgdG9QYXJhbXMpKSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgndWkucm91dGVyLnN0YXRlJylcclxuICAuZmFjdG9yeSgnJHN0YXRlUGFyYW1zJywgZnVuY3Rpb24gKCkgeyByZXR1cm4ge307IH0pXHJcbiAgLmNvbnN0YW50KFwiJHN0YXRlLnJ1bnRpbWVcIiwgeyBhdXRvaW5qZWN0OiB0cnVlIH0pXHJcbiAgLnByb3ZpZGVyKCckc3RhdGUnLCAkU3RhdGVQcm92aWRlcilcclxuICAvLyBJbmplY3QgJHN0YXRlIHRvIGluaXRpYWxpemUgd2hlbiBlbnRlcmluZyBydW50aW1lLiAjMjU3NFxyXG4gIC5ydW4oWyckaW5qZWN0b3InLCBmdW5jdGlvbiAoJGluamVjdG9yKSB7XHJcbiAgICAvLyBBbGxvdyB0ZXN0cyAoc3RhdGVTcGVjLmpzKSB0byB0dXJuIHRoaXMgb2ZmIGJ5IGRlZmluaW5nIHRoaXMgY29uc3RhbnRcclxuICAgIGlmICgkaW5qZWN0b3IuZ2V0KFwiJHN0YXRlLnJ1bnRpbWVcIikuYXV0b2luamVjdCkge1xyXG4gICAgICAkaW5qZWN0b3IuZ2V0KCckc3RhdGUnKTtcclxuICAgIH1cclxuICB9XSk7XHJcblxyXG5cclxuJFZpZXdQcm92aWRlci4kaW5qZWN0ID0gW107XHJcbmZ1bmN0aW9uICRWaWV3UHJvdmlkZXIoKSB7XHJcblxyXG4gIHRoaXMuJGdldCA9ICRnZXQ7XHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIG9iamVjdFxyXG4gICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kdmlld1xyXG4gICAqXHJcbiAgICogQHJlcXVpcmVzIHVpLnJvdXRlci51dGlsLiR0ZW1wbGF0ZUZhY3RvcnlcclxuICAgKiBAcmVxdWlyZXMgJHJvb3RTY29wZVxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKi9cclxuICAkZ2V0LiRpbmplY3QgPSBbJyRyb290U2NvcGUnLCAnJHRlbXBsYXRlRmFjdG9yeSddO1xyXG4gIGZ1bmN0aW9uICRnZXQoICAgJHJvb3RTY29wZSwgICAkdGVtcGxhdGVGYWN0b3J5KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvLyAkdmlldy5sb2FkKCdmdWxsLnZpZXdOYW1lJywgeyB0ZW1wbGF0ZTogLi4uLCBjb250cm9sbGVyOiAuLi4sIHJlc29sdmU6IC4uLiwgYXN5bmM6IGZhbHNlLCBwYXJhbXM6IC4uLiB9KVxyXG4gICAgICAvKipcclxuICAgICAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICAgICAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS4kdmlldyNsb2FkXHJcbiAgICAgICAqIEBtZXRob2RPZiB1aS5yb3V0ZXIuc3RhdGUuJHZpZXdcclxuICAgICAgICpcclxuICAgICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAgICAqXHJcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWVcclxuICAgICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgb3B0aW9uIG9iamVjdC5cclxuICAgICAgICovXHJcbiAgICAgIGxvYWQ6IGZ1bmN0aW9uIGxvYWQobmFtZSwgb3B0aW9ucykge1xyXG4gICAgICAgIHZhciByZXN1bHQsIGRlZmF1bHRzID0ge1xyXG4gICAgICAgICAgdGVtcGxhdGU6IG51bGwsIGNvbnRyb2xsZXI6IG51bGwsIHZpZXc6IG51bGwsIGxvY2FsczogbnVsbCwgbm90aWZ5OiB0cnVlLCBhc3luYzogdHJ1ZSwgcGFyYW1zOiB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLnZpZXcpIHtcclxuICAgICAgICAgIHJlc3VsdCA9ICR0ZW1wbGF0ZUZhY3RvcnkuZnJvbUNvbmZpZyhvcHRpb25zLnZpZXcsIG9wdGlvbnMucGFyYW1zLCBvcHRpb25zLmxvY2Fscyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgndWkucm91dGVyLnN0YXRlJykucHJvdmlkZXIoJyR2aWV3JywgJFZpZXdQcm92aWRlcik7XHJcblxyXG4vKipcclxuICogQG5nZG9jIG9iamVjdFxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuJHVpVmlld1Njcm9sbFByb3ZpZGVyXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBQcm92aWRlciB0aGF0IHJldHVybnMgdGhlIHtAbGluayB1aS5yb3V0ZXIuc3RhdGUuJHVpVmlld1Njcm9sbH0gc2VydmljZSBmdW5jdGlvbi5cclxuICovXHJcbmZ1bmN0aW9uICRWaWV3U2Nyb2xsUHJvdmlkZXIoKSB7XHJcblxyXG4gIHZhciB1c2VBbmNob3JTY3JvbGwgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG5nZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdWkucm91dGVyLnN0YXRlLiR1aVZpZXdTY3JvbGxQcm92aWRlciN1c2VBbmNob3JTY3JvbGxcclxuICAgKiBAbWV0aG9kT2YgdWkucm91dGVyLnN0YXRlLiR1aVZpZXdTY3JvbGxQcm92aWRlclxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogUmV2ZXJ0cyBiYWNrIHRvIHVzaW5nIHRoZSBjb3JlIFtgJGFuY2hvclNjcm9sbGBdKGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRhbmNob3JTY3JvbGwpIHNlcnZpY2UgZm9yXHJcbiAgICogc2Nyb2xsaW5nIGJhc2VkIG9uIHRoZSB1cmwgYW5jaG9yLlxyXG4gICAqL1xyXG4gIHRoaXMudXNlQW5jaG9yU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdXNlQW5jaG9yU2Nyb2xsID0gdHJ1ZTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBAbmdkb2Mgb2JqZWN0XHJcbiAgICogQG5hbWUgdWkucm91dGVyLnN0YXRlLiR1aVZpZXdTY3JvbGxcclxuICAgKlxyXG4gICAqIEByZXF1aXJlcyAkYW5jaG9yU2Nyb2xsXHJcbiAgICogQHJlcXVpcmVzICR0aW1lb3V0XHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBXaGVuIGNhbGxlZCB3aXRoIGEganFMaXRlIGVsZW1lbnQsIGl0IHNjcm9sbHMgdGhlIGVsZW1lbnQgaW50byB2aWV3IChhZnRlciBhXHJcbiAgICogYCR0aW1lb3V0YCBzbyB0aGUgRE9NIGhhcyB0aW1lIHRvIHJlZnJlc2gpLlxyXG4gICAqXHJcbiAgICogSWYgeW91IHByZWZlciB0byByZWx5IG9uIGAkYW5jaG9yU2Nyb2xsYCB0byBzY3JvbGwgdGhlIHZpZXcgdG8gdGhlIGFuY2hvcixcclxuICAgKiB0aGlzIGNhbiBiZSBlbmFibGVkIGJ5IGNhbGxpbmcge0BsaW5rIHVpLnJvdXRlci5zdGF0ZS4kdWlWaWV3U2Nyb2xsUHJvdmlkZXIjbWV0aG9kc191c2VBbmNob3JTY3JvbGwgYCR1aVZpZXdTY3JvbGxQcm92aWRlci51c2VBbmNob3JTY3JvbGwoKWB9LlxyXG4gICAqL1xyXG4gIHRoaXMuJGdldCA9IFsnJGFuY2hvclNjcm9sbCcsICckdGltZW91dCcsIGZ1bmN0aW9uICgkYW5jaG9yU2Nyb2xsLCAkdGltZW91dCkge1xyXG4gICAgaWYgKHVzZUFuY2hvclNjcm9sbCkge1xyXG4gICAgICByZXR1cm4gJGFuY2hvclNjcm9sbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCRlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybiAkdGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJGVsZW1lbnRbMF0uc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgfSwgMCwgZmFsc2UpO1xyXG4gICAgfTtcclxuICB9XTtcclxufVxyXG5cclxuYW5ndWxhci5tb2R1bGUoJ3VpLnJvdXRlci5zdGF0ZScpLnByb3ZpZGVyKCckdWlWaWV3U2Nyb2xsJywgJFZpZXdTY3JvbGxQcm92aWRlcik7XHJcblxyXG4vKipcclxuICogQG5nZG9jIGRpcmVjdGl2ZVxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuZGlyZWN0aXZlOnVpLXZpZXdcclxuICpcclxuICogQHJlcXVpcmVzIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVcclxuICogQHJlcXVpcmVzICRjb21waWxlXHJcbiAqIEByZXF1aXJlcyAkY29udHJvbGxlclxyXG4gKiBAcmVxdWlyZXMgJGluamVjdG9yXHJcbiAqIEByZXF1aXJlcyB1aS5yb3V0ZXIuc3RhdGUuJHVpVmlld1Njcm9sbFxyXG4gKiBAcmVxdWlyZXMgJGRvY3VtZW50XHJcbiAqXHJcbiAqIEByZXN0cmljdCBFQ0FcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIFRoZSB1aS12aWV3IGRpcmVjdGl2ZSB0ZWxscyAkc3RhdGUgd2hlcmUgdG8gcGxhY2UgeW91ciB0ZW1wbGF0ZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBBIHZpZXcgbmFtZS4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhbW9uZ3N0IHRoZSBvdGhlciB2aWV3cyBpbiB0aGVcclxuICogc2FtZSBzdGF0ZS4gWW91IGNhbiBoYXZlIHZpZXdzIG9mIHRoZSBzYW1lIG5hbWUgdGhhdCBsaXZlIGluIGRpZmZlcmVudCBzdGF0ZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gYXV0b3Njcm9sbCBJdCBhbGxvd3MgeW91IHRvIHNldCB0aGUgc2Nyb2xsIGJlaGF2aW9yIG9mIHRoZSBicm93c2VyIHdpbmRvd1xyXG4gKiB3aGVuIGEgdmlldyBpcyBwb3B1bGF0ZWQuIEJ5IGRlZmF1bHQsICRhbmNob3JTY3JvbGwgaXMgb3ZlcnJpZGRlbiBieSB1aS1yb3V0ZXIncyBjdXN0b20gc2Nyb2xsXHJcbiAqIHNlcnZpY2UsIHtAbGluayB1aS5yb3V0ZXIuc3RhdGUuJHVpVmlld1Njcm9sbH0uIFRoaXMgY3VzdG9tIHNlcnZpY2UgbGV0J3MgeW91XHJcbiAqIHNjcm9sbCB1aS12aWV3IGVsZW1lbnRzIGludG8gdmlldyB3aGVuIHRoZXkgYXJlIHBvcHVsYXRlZCBkdXJpbmcgYSBzdGF0ZSBhY3RpdmF0aW9uLlxyXG4gKlxyXG4gKiAqTm90ZTogVG8gcmV2ZXJ0IGJhY2sgdG8gb2xkIFtgJGFuY2hvclNjcm9sbGBdKGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRhbmNob3JTY3JvbGwpXHJcbiAqIGZ1bmN0aW9uYWxpdHksIGNhbGwgYCR1aVZpZXdTY3JvbGxQcm92aWRlci51c2VBbmNob3JTY3JvbGwoKWAuKlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZz19IG9ubG9hZCBFeHByZXNzaW9uIHRvIGV2YWx1YXRlIHdoZW5ldmVyIHRoZSB2aWV3IHVwZGF0ZXMuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIEEgdmlldyBjYW4gYmUgdW5uYW1lZCBvciBuYW1lZC5cclxuICogPHByZT5cclxuICogPCEtLSBVbm5hbWVkIC0tPlxyXG4gKiA8ZGl2IHVpLXZpZXc+PC9kaXY+XHJcbiAqXHJcbiAqIDwhLS0gTmFtZWQgLS0+XHJcbiAqIDxkaXYgdWktdmlldz1cInZpZXdOYW1lXCI+PC9kaXY+XHJcbiAqIDwvcHJlPlxyXG4gKlxyXG4gKiBZb3UgY2FuIG9ubHkgaGF2ZSBvbmUgdW5uYW1lZCB2aWV3IHdpdGhpbiBhbnkgdGVtcGxhdGUgKG9yIHJvb3QgaHRtbCkuIElmIHlvdSBhcmUgb25seSB1c2luZyBhXHJcbiAqIHNpbmdsZSB2aWV3IGFuZCBpdCBpcyB1bm5hbWVkIHRoZW4geW91IGNhbiBwb3B1bGF0ZSBpdCBsaWtlIHNvOlxyXG4gKiA8cHJlPlxyXG4gKiA8ZGl2IHVpLXZpZXc+PC9kaXY+XHJcbiAqICRzdGF0ZVByb3ZpZGVyLnN0YXRlKFwiaG9tZVwiLCB7XHJcbiAqICAgdGVtcGxhdGU6IFwiPGgxPkhFTExPITwvaDE+XCJcclxuICogfSlcclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBpcyBhIGNvbnZlbmllbnQgc2hvcnRjdXQgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHlvdXIgdmlldyBleHBsaWNpdGx5IHdpdGggdGhlIHtAbGluayB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlUHJvdmlkZXIjbWV0aG9kc19zdGF0ZSBgdmlld3NgfVxyXG4gKiBjb25maWcgcHJvcGVydHksIGJ5IG5hbWUsIGluIHRoaXMgY2FzZSBhbiBlbXB0eSBuYW1lOlxyXG4gKiA8cHJlPlxyXG4gKiAkc3RhdGVQcm92aWRlci5zdGF0ZShcImhvbWVcIiwge1xyXG4gKiAgIHZpZXdzOiB7XHJcbiAqICAgICBcIlwiOiB7XHJcbiAqICAgICAgIHRlbXBsYXRlOiBcIjxoMT5IRUxMTyE8L2gxPlwiXHJcbiAqICAgICB9XHJcbiAqICAgfSAgICBcclxuICogfSlcclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIEJ1dCB0eXBpY2FsbHkgeW91J2xsIG9ubHkgdXNlIHRoZSB2aWV3cyBwcm9wZXJ0eSBpZiB5b3UgbmFtZSB5b3VyIHZpZXcgb3IgaGF2ZSBtb3JlIHRoYW4gb25lIHZpZXdcclxuICogaW4gdGhlIHNhbWUgdGVtcGxhdGUuIFRoZXJlJ3Mgbm90IHJlYWxseSBhIGNvbXBlbGxpbmcgcmVhc29uIHRvIG5hbWUgYSB2aWV3IGlmIGl0cyB0aGUgb25seSBvbmUsXHJcbiAqIGJ1dCB5b3UgY291bGQgaWYgeW91IHdhbnRlZCwgbGlrZSBzbzpcclxuICogPHByZT5cclxuICogPGRpdiB1aS12aWV3PVwibWFpblwiPjwvZGl2PlxyXG4gKiA8L3ByZT5cclxuICogPHByZT5cclxuICogJHN0YXRlUHJvdmlkZXIuc3RhdGUoXCJob21lXCIsIHtcclxuICogICB2aWV3czoge1xyXG4gKiAgICAgXCJtYWluXCI6IHtcclxuICogICAgICAgdGVtcGxhdGU6IFwiPGgxPkhFTExPITwvaDE+XCJcclxuICogICAgIH1cclxuICogICB9ICAgIFxyXG4gKiB9KVxyXG4gKiA8L3ByZT5cclxuICpcclxuICogUmVhbGx5IHRob3VnaCwgeW91J2xsIHVzZSB2aWV3cyB0byBzZXQgdXAgbXVsdGlwbGUgdmlld3M6XHJcbiAqIDxwcmU+XHJcbiAqIDxkaXYgdWktdmlldz48L2Rpdj5cclxuICogPGRpdiB1aS12aWV3PVwiY2hhcnRcIj48L2Rpdj5cclxuICogPGRpdiB1aS12aWV3PVwiZGF0YVwiPjwvZGl2PlxyXG4gKiA8L3ByZT5cclxuICpcclxuICogPHByZT5cclxuICogJHN0YXRlUHJvdmlkZXIuc3RhdGUoXCJob21lXCIsIHtcclxuICogICB2aWV3czoge1xyXG4gKiAgICAgXCJcIjoge1xyXG4gKiAgICAgICB0ZW1wbGF0ZTogXCI8aDE+SEVMTE8hPC9oMT5cIlxyXG4gKiAgICAgfSxcclxuICogICAgIFwiY2hhcnRcIjoge1xyXG4gKiAgICAgICB0ZW1wbGF0ZTogXCI8Y2hhcnRfdGhpbmcvPlwiXHJcbiAqICAgICB9LFxyXG4gKiAgICAgXCJkYXRhXCI6IHtcclxuICogICAgICAgdGVtcGxhdGU6IFwiPGRhdGFfdGhpbmcvPlwiXHJcbiAqICAgICB9XHJcbiAqICAgfSAgICBcclxuICogfSlcclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIEV4YW1wbGVzIGZvciBgYXV0b3Njcm9sbGA6XHJcbiAqXHJcbiAqIDxwcmU+XHJcbiAqIDwhLS0gSWYgYXV0b3Njcm9sbCBwcmVzZW50IHdpdGggbm8gZXhwcmVzc2lvbixcclxuICogICAgICB0aGVuIHNjcm9sbCB1aS12aWV3IGludG8gdmlldyAtLT5cclxuICogPHVpLXZpZXcgYXV0b3Njcm9sbC8+XHJcbiAqXHJcbiAqIDwhLS0gSWYgYXV0b3Njcm9sbCBwcmVzZW50IHdpdGggdmFsaWQgZXhwcmVzc2lvbixcclxuICogICAgICB0aGVuIHNjcm9sbCB1aS12aWV3IGludG8gdmlldyBpZiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlIC0tPlxyXG4gKiA8dWktdmlldyBhdXRvc2Nyb2xsPSd0cnVlJy8+XHJcbiAqIDx1aS12aWV3IGF1dG9zY3JvbGw9J2ZhbHNlJy8+XHJcbiAqIDx1aS12aWV3IGF1dG9zY3JvbGw9J3Njb3BlVmFyaWFibGUnLz5cclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIFJlc29sdmUgZGF0YTpcclxuICpcclxuICogVGhlIHJlc29sdmVkIGRhdGEgZnJvbSB0aGUgc3RhdGUncyBgcmVzb2x2ZWAgYmxvY2sgaXMgcGxhY2VkIG9uIHRoZSBzY29wZSBhcyBgJHJlc29sdmVgICh0aGlzXHJcbiAqIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIFtbVmlld0RlY2xhcmF0aW9uLnJlc29sdmVBc11dKS4gIFRoaXMgY2FuIGJlIHRoZW4gYWNjZXNzZWQgZnJvbSB0aGUgdGVtcGxhdGUuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCB3aGVuIGBjb250cm9sbGVyQXNgIGlzIGJlaW5nIHVzZWQsIGAkcmVzb2x2ZWAgaXMgc2V0IG9uIHRoZSBjb250cm9sbGVyIGluc3RhbmNlICphZnRlciogdGhlXHJcbiAqIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkLiAgVGhlIGAkb25Jbml0KClgIGhvb2sgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBpbml0aWFsaXphdGlvbiBjb2RlIHdoaWNoXHJcbiAqIGRlcGVuZHMgb24gYCRyZXNvbHZlYCBkYXRhLlxyXG4gKlxyXG4gKiBFeGFtcGxlIHVzYWdlIG9mICRyZXNvbHZlIGluIGEgdmlldyB0ZW1wbGF0ZVxyXG4gKiA8cHJlPlxyXG4gKiAkc3RhdGVQcm92aWRlci5zdGF0ZSgnaG9tZScsIHtcclxuICogICB0ZW1wbGF0ZTogJzxteS1jb21wb25lbnQgdXNlcj1cIiRyZXNvbHZlLnVzZXJcIj48L215LWNvbXBvbmVudD4nLFxyXG4gKiAgIHJlc29sdmU6IHtcclxuICogICAgIHVzZXI6IGZ1bmN0aW9uKFVzZXJTZXJ2aWNlKSB7IHJldHVybiBVc2VyU2VydmljZS5mZXRjaFVzZXIoKTsgfVxyXG4gKiAgIH1cclxuICogfSk7XHJcbiAqIDwvcHJlPlxyXG4gKi9cclxuJFZpZXdEaXJlY3RpdmUuJGluamVjdCA9IFsnJHN0YXRlJywgJyRpbmplY3RvcicsICckdWlWaWV3U2Nyb2xsJywgJyRpbnRlcnBvbGF0ZScsICckcSddO1xyXG5mdW5jdGlvbiAkVmlld0RpcmVjdGl2ZSggICAkc3RhdGUsICAgJGluamVjdG9yLCAgICR1aVZpZXdTY3JvbGwsICAgJGludGVycG9sYXRlLCAgICRxKSB7XHJcblxyXG4gIGZ1bmN0aW9uIGdldFNlcnZpY2UoKSB7XHJcbiAgICByZXR1cm4gKCRpbmplY3Rvci5oYXMpID8gZnVuY3Rpb24oc2VydmljZSkge1xyXG4gICAgICByZXR1cm4gJGluamVjdG9yLmhhcyhzZXJ2aWNlKSA/ICRpbmplY3Rvci5nZXQoc2VydmljZSkgOiBudWxsO1xyXG4gICAgfSA6IGZ1bmN0aW9uKHNlcnZpY2UpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gJGluamVjdG9yLmdldChzZXJ2aWNlKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgdmFyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCksXHJcbiAgICAgICRhbmltYXRvciA9IHNlcnZpY2UoJyRhbmltYXRvcicpLFxyXG4gICAgICAkYW5pbWF0ZSA9IHNlcnZpY2UoJyRhbmltYXRlJyk7XHJcblxyXG4gIC8vIFJldHVybnMgYSBzZXQgb2YgRE9NIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgYmFzZWQgb24gd2hpY2ggQW5ndWxhciB2ZXJzaW9uXHJcbiAgLy8gaXQgc2hvdWxkIHVzZVxyXG4gIGZ1bmN0aW9uIGdldFJlbmRlcmVyKGF0dHJzLCBzY29wZSkge1xyXG4gICAgdmFyIHN0YXRpY3MgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBlbnRlcjogZnVuY3Rpb24gKGVsZW1lbnQsIHRhcmdldCwgY2IpIHsgdGFyZ2V0LmFmdGVyKGVsZW1lbnQpOyBjYigpOyB9LFxyXG4gICAgICAgIGxlYXZlOiBmdW5jdGlvbiAoZWxlbWVudCwgY2IpIHsgZWxlbWVudC5yZW1vdmUoKTsgY2IoKTsgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoJGFuaW1hdGUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBlbnRlcjogZnVuY3Rpb24oZWxlbWVudCwgdGFyZ2V0LCBjYikge1xyXG4gICAgICAgICAgaWYgKGFuZ3VsYXIudmVyc2lvbi5taW5vciA+IDIpIHtcclxuICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoZWxlbWVudCwgbnVsbCwgdGFyZ2V0KS50aGVuKGNiKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGVsZW1lbnQsIG51bGwsIHRhcmdldCwgY2IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbGVhdmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNiKSB7XHJcbiAgICAgICAgICBpZiAoYW5ndWxhci52ZXJzaW9uLm1pbm9yID4gMikge1xyXG4gICAgICAgICAgICAkYW5pbWF0ZS5sZWF2ZShlbGVtZW50KS50aGVuKGNiKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRhbmltYXRlLmxlYXZlKGVsZW1lbnQsIGNiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCRhbmltYXRvcikge1xyXG4gICAgICB2YXIgYW5pbWF0ZSA9ICRhbmltYXRvciAmJiAkYW5pbWF0b3Ioc2NvcGUsIGF0dHJzKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZW50ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIHRhcmdldCwgY2IpIHthbmltYXRlLmVudGVyKGVsZW1lbnQsIG51bGwsIHRhcmdldCk7IGNiKCk7IH0sXHJcbiAgICAgICAgbGVhdmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNiKSB7IGFuaW1hdGUubGVhdmUoZWxlbWVudCk7IGNiKCk7IH1cclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RhdGljcygpO1xyXG4gIH1cclxuXHJcbiAgdmFyIGRpcmVjdGl2ZSA9IHtcclxuICAgIHJlc3RyaWN0OiAnRUNBJyxcclxuICAgIHRlcm1pbmFsOiB0cnVlLFxyXG4gICAgcHJpb3JpdHk6IDQwMCxcclxuICAgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JyxcclxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uICh0RWxlbWVudCwgdEF0dHJzLCAkdHJhbnNjbHVkZSkge1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCAkZWxlbWVudCwgYXR0cnMpIHtcclxuICAgICAgICB2YXIgcHJldmlvdXNFbCwgY3VycmVudEVsLCBjdXJyZW50U2NvcGUsIGxhdGVzdExvY2FscyxcclxuICAgICAgICAgICAgb25sb2FkRXhwICAgICA9IGF0dHJzLm9ubG9hZCB8fCAnJyxcclxuICAgICAgICAgICAgYXV0b1Njcm9sbEV4cCA9IGF0dHJzLmF1dG9zY3JvbGwsXHJcbiAgICAgICAgICAgIHJlbmRlcmVyICAgICAgPSBnZXRSZW5kZXJlcihhdHRycywgc2NvcGUpLFxyXG4gICAgICAgICAgICBpbmhlcml0ZWQgICAgID0gJGVsZW1lbnQuaW5oZXJpdGVkRGF0YSgnJHVpVmlldycpO1xyXG5cclxuICAgICAgICBzY29wZS4kb24oJyRzdGF0ZUNoYW5nZVN1Y2Nlc3MnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHVwZGF0ZVZpZXcoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVWaWV3KHRydWUpO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjbGVhbnVwTGFzdFZpZXcoKSB7XHJcbiAgICAgICAgICBpZiAocHJldmlvdXNFbCkge1xyXG4gICAgICAgICAgICBwcmV2aW91c0VsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICBwcmV2aW91c0VsID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoY3VycmVudFNjb3BlKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZGVzdHJveSgpO1xyXG4gICAgICAgICAgICBjdXJyZW50U2NvcGUgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjdXJyZW50RWwpIHtcclxuICAgICAgICAgICAgdmFyICR1aVZpZXdEYXRhID0gY3VycmVudEVsLmRhdGEoJyR1aVZpZXdBbmltJyk7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmxlYXZlKGN1cnJlbnRFbCwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgJHVpVmlld0RhdGEuJCRhbmltTGVhdmUucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgIHByZXZpb3VzRWwgPSBudWxsO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHByZXZpb3VzRWwgPSBjdXJyZW50RWw7XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbCA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVWaWV3KGZpcnN0VGltZSkge1xyXG4gICAgICAgICAgdmFyIG5ld1Njb3BlLFxyXG4gICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICA9IGdldFVpVmlld05hbWUoc2NvcGUsIGF0dHJzLCAkZWxlbWVudCwgJGludGVycG9sYXRlKSxcclxuICAgICAgICAgICAgICBwcmV2aW91c0xvY2FscyAgPSBuYW1lICYmICRzdGF0ZS4kY3VycmVudCAmJiAkc3RhdGUuJGN1cnJlbnQubG9jYWxzW25hbWVdO1xyXG5cclxuICAgICAgICAgIGlmICghZmlyc3RUaW1lICYmIHByZXZpb3VzTG9jYWxzID09PSBsYXRlc3RMb2NhbHMpIHJldHVybjsgLy8gbm90aGluZyB0byBkb1xyXG4gICAgICAgICAgbmV3U2NvcGUgPSBzY29wZS4kbmV3KCk7XHJcbiAgICAgICAgICBsYXRlc3RMb2NhbHMgPSAkc3RhdGUuJGN1cnJlbnQubG9jYWxzW25hbWVdO1xyXG5cclxuICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICogQG5nZG9jIGV2ZW50XHJcbiAgICAgICAgICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuZGlyZWN0aXZlOnVpLXZpZXcjJHZpZXdDb250ZW50TG9hZGluZ1xyXG4gICAgICAgICAgICogQGV2ZW50T2YgdWkucm91dGVyLnN0YXRlLmRpcmVjdGl2ZTp1aS12aWV3XHJcbiAgICAgICAgICAgKiBAZXZlbnRUeXBlIGVtaXRzIG9uIHVpLXZpZXcgZGlyZWN0aXZlIHNjb3BlXHJcbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAgICAgICAqXHJcbiAgICAgICAgICAgKiBGaXJlZCBvbmNlIHRoZSB2aWV3ICoqYmVnaW5zIGxvYWRpbmcqKiwgKmJlZm9yZSogdGhlIERPTSBpcyByZW5kZXJlZC5cclxuICAgICAgICAgICAqXHJcbiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0LlxyXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZpZXdOYW1lIE5hbWUgb2YgdGhlIHZpZXcuXHJcbiAgICAgICAgICAgKi9cclxuICAgICAgICAgIG5ld1Njb3BlLiRlbWl0KCckdmlld0NvbnRlbnRMb2FkaW5nJywgbmFtZSk7XHJcblxyXG4gICAgICAgICAgdmFyIGNsb25lID0gJHRyYW5zY2x1ZGUobmV3U2NvcGUsIGZ1bmN0aW9uKGNsb25lKSB7XHJcbiAgICAgICAgICAgIHZhciBhbmltRW50ZXIgPSAkcS5kZWZlcigpLCBhbmltTGVhdmUgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgICAgICB2YXIgdmlld0FuaW1EYXRhID0ge1xyXG4gICAgICAgICAgICAgICRhbmltRW50ZXI6IGFuaW1FbnRlci5wcm9taXNlLFxyXG4gICAgICAgICAgICAgICRhbmltTGVhdmU6IGFuaW1MZWF2ZS5wcm9taXNlLFxyXG4gICAgICAgICAgICAgICQkYW5pbUxlYXZlOiBhbmltTGVhdmVcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNsb25lLmRhdGEoJyR1aVZpZXdBbmltJywgdmlld0FuaW1EYXRhKTtcclxuICAgICAgICAgICAgcmVuZGVyZXIuZW50ZXIoY2xvbmUsICRlbGVtZW50LCBmdW5jdGlvbiBvblVpVmlld0VudGVyKCkge1xyXG4gICAgICAgICAgICAgIGFuaW1FbnRlci5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgaWYoY3VycmVudFNjb3BlKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2NvcGUuJGVtaXQoJyR2aWV3Q29udGVudEFuaW1hdGlvbkVuZGVkJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoYXV0b1Njcm9sbEV4cCkgJiYgIWF1dG9TY3JvbGxFeHAgfHwgc2NvcGUuJGV2YWwoYXV0b1Njcm9sbEV4cCkpIHtcclxuICAgICAgICAgICAgICAgICR1aVZpZXdTY3JvbGwoY2xvbmUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNsZWFudXBMYXN0VmlldygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY3VycmVudEVsID0gY2xvbmU7XHJcbiAgICAgICAgICBjdXJyZW50U2NvcGUgPSBuZXdTY29wZTtcclxuICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICogQG5nZG9jIGV2ZW50XHJcbiAgICAgICAgICAgKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuZGlyZWN0aXZlOnVpLXZpZXcjJHZpZXdDb250ZW50TG9hZGVkXHJcbiAgICAgICAgICAgKiBAZXZlbnRPZiB1aS5yb3V0ZXIuc3RhdGUuZGlyZWN0aXZlOnVpLXZpZXdcclxuICAgICAgICAgICAqIEBldmVudFR5cGUgZW1pdHMgb24gdWktdmlldyBkaXJlY3RpdmUgc2NvcGVcclxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICAgICAgICogRmlyZWQgb25jZSB0aGUgdmlldyBpcyAqKmxvYWRlZCoqLCAqYWZ0ZXIqIHRoZSBET00gaXMgcmVuZGVyZWQuXHJcbiAgICAgICAgICAgKlxyXG4gICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdC5cclxuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3TmFtZSBOYW1lIG9mIHRoZSB2aWV3LlxyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICBjdXJyZW50U2NvcGUuJGVtaXQoJyR2aWV3Q29udGVudExvYWRlZCcsIG5hbWUpO1xyXG4gICAgICAgICAgY3VycmVudFNjb3BlLiRldmFsKG9ubG9hZEV4cCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiBkaXJlY3RpdmU7XHJcbn1cclxuXHJcbiRWaWV3RGlyZWN0aXZlRmlsbC4kaW5qZWN0ID0gWyckY29tcGlsZScsICckY29udHJvbGxlcicsICckc3RhdGUnLCAnJGludGVycG9sYXRlJ107XHJcbmZ1bmN0aW9uICRWaWV3RGlyZWN0aXZlRmlsbCAoICAkY29tcGlsZSwgICAkY29udHJvbGxlciwgICAkc3RhdGUsICAgJGludGVycG9sYXRlKSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlc3RyaWN0OiAnRUNBJyxcclxuICAgIHByaW9yaXR5OiAtNDAwLFxyXG4gICAgY29tcGlsZTogZnVuY3Rpb24gKHRFbGVtZW50KSB7XHJcbiAgICAgIHZhciBpbml0aWFsID0gdEVsZW1lbnQuaHRtbCgpO1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCAkZWxlbWVudCwgYXR0cnMpIHtcclxuICAgICAgICB2YXIgY3VycmVudCA9ICRzdGF0ZS4kY3VycmVudCxcclxuICAgICAgICAgICAgbmFtZSA9IGdldFVpVmlld05hbWUoc2NvcGUsIGF0dHJzLCAkZWxlbWVudCwgJGludGVycG9sYXRlKSxcclxuICAgICAgICAgICAgbG9jYWxzICA9IGN1cnJlbnQgJiYgY3VycmVudC5sb2NhbHNbbmFtZV07XHJcblxyXG4gICAgICAgIGlmICghIGxvY2Fscykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJGVsZW1lbnQuZGF0YSgnJHVpVmlldycsIHsgbmFtZTogbmFtZSwgc3RhdGU6IGxvY2Fscy4kJHN0YXRlIH0pO1xyXG4gICAgICAgICRlbGVtZW50Lmh0bWwobG9jYWxzLiR0ZW1wbGF0ZSA/IGxvY2Fscy4kdGVtcGxhdGUgOiBpbml0aWFsKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc29sdmVEYXRhID0gYW5ndWxhci5leHRlbmQoe30sIGxvY2Fscyk7XHJcbiAgICAgICAgc2NvcGVbbG9jYWxzLiQkcmVzb2x2ZUFzXSA9IHJlc29sdmVEYXRhO1xyXG5cclxuICAgICAgICB2YXIgbGluayA9ICRjb21waWxlKCRlbGVtZW50LmNvbnRlbnRzKCkpO1xyXG5cclxuICAgICAgICBpZiAobG9jYWxzLiQkY29udHJvbGxlcikge1xyXG4gICAgICAgICAgbG9jYWxzLiRzY29wZSA9IHNjb3BlO1xyXG4gICAgICAgICAgbG9jYWxzLiRlbGVtZW50ID0gJGVsZW1lbnQ7XHJcbiAgICAgICAgICB2YXIgY29udHJvbGxlciA9ICRjb250cm9sbGVyKGxvY2Fscy4kJGNvbnRyb2xsZXIsIGxvY2Fscyk7XHJcbiAgICAgICAgICBpZiAobG9jYWxzLiQkY29udHJvbGxlckFzKSB7XHJcbiAgICAgICAgICAgIHNjb3BlW2xvY2Fscy4kJGNvbnRyb2xsZXJBc10gPSBjb250cm9sbGVyO1xyXG4gICAgICAgICAgICBzY29wZVtsb2NhbHMuJCRjb250cm9sbGVyQXNdW2xvY2Fscy4kJHJlc29sdmVBc10gPSByZXNvbHZlRGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRyb2xsZXIuJG9uSW5pdCkpIGNvbnRyb2xsZXIuJG9uSW5pdCgpO1xyXG4gICAgICAgICAgJGVsZW1lbnQuZGF0YSgnJG5nQ29udHJvbGxlckNvbnRyb2xsZXInLCBjb250cm9sbGVyKTtcclxuICAgICAgICAgICRlbGVtZW50LmNoaWxkcmVuKCkuZGF0YSgnJG5nQ29udHJvbGxlckNvbnRyb2xsZXInLCBjb250cm9sbGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxpbmsoc2NvcGUpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaGFyZWQgdWktdmlldyBjb2RlIGZvciBib3RoIGRpcmVjdGl2ZXM6XHJcbiAqIEdpdmVuIHNjb3BlLCBlbGVtZW50LCBhbmQgaXRzIGF0dHJpYnV0ZXMsIHJldHVybiB0aGUgdmlldydzIG5hbWVcclxuICovXHJcbmZ1bmN0aW9uIGdldFVpVmlld05hbWUoc2NvcGUsIGF0dHJzLCBlbGVtZW50LCAkaW50ZXJwb2xhdGUpIHtcclxuICB2YXIgbmFtZSA9ICRpbnRlcnBvbGF0ZShhdHRycy51aVZpZXcgfHwgYXR0cnMubmFtZSB8fCAnJykoc2NvcGUpO1xyXG4gIHZhciB1aVZpZXdDcmVhdGVkQnkgPSBlbGVtZW50LmluaGVyaXRlZERhdGEoJyR1aVZpZXcnKTtcclxuICByZXR1cm4gbmFtZS5pbmRleE9mKCdAJykgPj0gMCA/ICBuYW1lIDogIChuYW1lICsgJ0AnICsgKHVpVmlld0NyZWF0ZWRCeSA/IHVpVmlld0NyZWF0ZWRCeS5zdGF0ZS5uYW1lIDogJycpKTtcclxufVxyXG5cclxuYW5ndWxhci5tb2R1bGUoJ3VpLnJvdXRlci5zdGF0ZScpLmRpcmVjdGl2ZSgndWlWaWV3JywgJFZpZXdEaXJlY3RpdmUpO1xyXG5hbmd1bGFyLm1vZHVsZSgndWkucm91dGVyLnN0YXRlJykuZGlyZWN0aXZlKCd1aVZpZXcnLCAkVmlld0RpcmVjdGl2ZUZpbGwpO1xyXG5cclxuZnVuY3Rpb24gcGFyc2VTdGF0ZVJlZihyZWYsIGN1cnJlbnQpIHtcclxuICB2YXIgcHJlcGFyc2VkID0gcmVmLm1hdGNoKC9eXFxzKih7W159XSp9KVxccyokLyksIHBhcnNlZDtcclxuICBpZiAocHJlcGFyc2VkKSByZWYgPSBjdXJyZW50ICsgJygnICsgcHJlcGFyc2VkWzFdICsgJyknO1xyXG4gIHBhcnNlZCA9IHJlZi5yZXBsYWNlKC9cXG4vZywgXCIgXCIpLm1hdGNoKC9eKFteKF0rPylcXHMqKFxcKCguKilcXCkpPyQvKTtcclxuICBpZiAoIXBhcnNlZCB8fCBwYXJzZWQubGVuZ3RoICE9PSA0KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlIHJlZiAnXCIgKyByZWYgKyBcIidcIik7XHJcbiAgcmV0dXJuIHsgc3RhdGU6IHBhcnNlZFsxXSwgcGFyYW1FeHByOiBwYXJzZWRbM10gfHwgbnVsbCB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdGF0ZUNvbnRleHQoZWwpIHtcclxuICB2YXIgc3RhdGVEYXRhID0gZWwucGFyZW50KCkuaW5oZXJpdGVkRGF0YSgnJHVpVmlldycpO1xyXG5cclxuICBpZiAoc3RhdGVEYXRhICYmIHN0YXRlRGF0YS5zdGF0ZSAmJiBzdGF0ZURhdGEuc3RhdGUubmFtZSkge1xyXG4gICAgcmV0dXJuIHN0YXRlRGF0YS5zdGF0ZTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFR5cGVJbmZvKGVsKSB7XHJcbiAgLy8gU1ZHQUVsZW1lbnQgZG9lcyBub3QgdXNlIHRoZSBocmVmIGF0dHJpYnV0ZSwgYnV0IHJhdGhlciB0aGUgJ3hsaW5rSHJlZicgYXR0cmlidXRlLlxyXG4gIHZhciBpc1N2ZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbC5wcm9wKCdocmVmJykpID09PSAnW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10nO1xyXG4gIHZhciBpc0Zvcm0gPSBlbFswXS5ub2RlTmFtZSA9PT0gXCJGT1JNXCI7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBhdHRyOiBpc0Zvcm0gPyBcImFjdGlvblwiIDogKGlzU3ZnID8gJ3hsaW5rOmhyZWYnIDogJ2hyZWYnKSxcclxuICAgIGlzQW5jaG9yOiBlbC5wcm9wKFwidGFnTmFtZVwiKS50b1VwcGVyQ2FzZSgpID09PSBcIkFcIixcclxuICAgIGNsaWNrYWJsZTogIWlzRm9ybVxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsaWNrSG9vayhlbCwgJHN0YXRlLCAkdGltZW91dCwgdHlwZSwgY3VycmVudCkge1xyXG4gIHJldHVybiBmdW5jdGlvbihlKSB7XHJcbiAgICB2YXIgYnV0dG9uID0gZS53aGljaCB8fCBlLmJ1dHRvbiwgdGFyZ2V0ID0gY3VycmVudCgpO1xyXG5cclxuICAgIGlmICghKGJ1dHRvbiA+IDEgfHwgZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBlLnNoaWZ0S2V5IHx8IGVsLmF0dHIoJ3RhcmdldCcpKSkge1xyXG4gICAgICAvLyBIQUNLOiBUaGlzIGlzIHRvIGFsbG93IG5nLWNsaWNrcyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSB0cmFuc2l0aW9uIGlzIGluaXRpYXRlZDpcclxuICAgICAgdmFyIHRyYW5zaXRpb24gPSAkdGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAkc3RhdGUuZ28odGFyZ2V0LnN0YXRlLCB0YXJnZXQucGFyYW1zLCB0YXJnZXQub3B0aW9ucyk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgc3RhdGUgaGFzIG5vIFVSTCwgaWdub3JlIG9uZSBwcmV2ZW50RGVmYXVsdCBmcm9tIHRoZSA8YT4gZGlyZWN0aXZlLlxyXG4gICAgICB2YXIgaWdub3JlUHJldmVudERlZmF1bHRDb3VudCA9IHR5cGUuaXNBbmNob3IgJiYgIXRhcmdldC5ocmVmID8gMTogMDtcclxuXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoaWdub3JlUHJldmVudERlZmF1bHRDb3VudC0tIDw9IDApICR0aW1lb3V0LmNhbmNlbCh0cmFuc2l0aW9uKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWZhdWx0T3B0cyhlbCwgJHN0YXRlKSB7XHJcbiAgcmV0dXJuIHsgcmVsYXRpdmU6IHN0YXRlQ29udGV4dChlbCkgfHwgJHN0YXRlLiRjdXJyZW50LCBpbmhlcml0OiB0cnVlIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAbmdkb2MgZGlyZWN0aXZlXHJcbiAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS5kaXJlY3RpdmU6dWktc3JlZlxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnN0YXRlLiRzdGF0ZVxyXG4gKiBAcmVxdWlyZXMgJHRpbWVvdXRcclxuICpcclxuICogQHJlc3RyaWN0IEFcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIEEgZGlyZWN0aXZlIHRoYXQgYmluZHMgYSBsaW5rIChgPGE+YCB0YWcpIHRvIGEgc3RhdGUuIElmIHRoZSBzdGF0ZSBoYXMgYW4gYXNzb2NpYXRlZFxyXG4gKiBVUkwsIHRoZSBkaXJlY3RpdmUgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlICYgdXBkYXRlIHRoZSBgaHJlZmAgYXR0cmlidXRlIHZpYVxyXG4gKiB0aGUge0BsaW5rIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjbWV0aG9kc19ocmVmICRzdGF0ZS5ocmVmKCl9IG1ldGhvZC4gQ2xpY2tpbmdcclxuICogdGhlIGxpbmsgd2lsbCB0cmlnZ2VyIGEgc3RhdGUgdHJhbnNpdGlvbiB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMuXHJcbiAqXHJcbiAqIEFsc28gbWlkZGxlLWNsaWNraW5nLCByaWdodC1jbGlja2luZywgYW5kIGN0cmwtY2xpY2tpbmcgb24gdGhlIGxpbmsgd2lsbCBiZVxyXG4gKiBoYW5kbGVkIG5hdGl2ZWx5IGJ5IHRoZSBicm93c2VyLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGFsc28gdXNlIHJlbGF0aXZlIHN0YXRlIHBhdGhzIHdpdGhpbiB1aS1zcmVmLCBqdXN0IGxpa2UgdGhlIHJlbGF0aXZlXHJcbiAqIHBhdGhzIHBhc3NlZCB0byBgJHN0YXRlLmdvKClgLiBZb3UganVzdCBuZWVkIHRvIGJlIGF3YXJlIHRoYXQgdGhlIHBhdGggaXMgcmVsYXRpdmVcclxuICogdG8gdGhlIHN0YXRlIHRoYXQgdGhlIGxpbmsgbGl2ZXMgaW4sIGluIG90aGVyIHdvcmRzIHRoZSBzdGF0ZSB0aGF0IGxvYWRlZCB0aGVcclxuICogdGVtcGxhdGUgY29udGFpbmluZyB0aGUgbGluay5cclxuICpcclxuICogWW91IGNhbiBzcGVjaWZ5IG9wdGlvbnMgdG8gcGFzcyB0byB7QGxpbmsgdWkucm91dGVyLnN0YXRlLiRzdGF0ZSNtZXRob2RzX2dvICRzdGF0ZS5nbygpfVxyXG4gKiB1c2luZyB0aGUgYHVpLXNyZWYtb3B0c2AgYXR0cmlidXRlLiBPcHRpb25zIGFyZSByZXN0cmljdGVkIHRvIGBsb2NhdGlvbmAsIGBpbmhlcml0YCxcclxuICogYW5kIGByZWxvYWRgLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgeW91J2QgdXNlIHVpLXNyZWYgYW5kIGhvdyBpdCB3b3VsZCBjb21waWxlLiBJZiB5b3UgaGF2ZSB0aGVcclxuICogZm9sbG93aW5nIHRlbXBsYXRlOlxyXG4gKiA8cHJlPlxyXG4gKiA8YSB1aS1zcmVmPVwiaG9tZVwiPkhvbWU8L2E+IHwgPGEgdWktc3JlZj1cImFib3V0XCI+QWJvdXQ8L2E+IHwgPGEgdWktc3JlZj1cIntwYWdlOiAyfVwiPk5leHQgcGFnZTwvYT5cclxuICpcclxuICogPHVsPlxyXG4gKiAgICAgPGxpIG5nLXJlcGVhdD1cImNvbnRhY3QgaW4gY29udGFjdHNcIj5cclxuICogICAgICAgICA8YSB1aS1zcmVmPVwiY29udGFjdHMuZGV0YWlsKHsgaWQ6IGNvbnRhY3QuaWQgfSlcIj57eyBjb250YWN0Lm5hbWUgfX08L2E+XHJcbiAqICAgICA8L2xpPlxyXG4gKiA8L3VsPlxyXG4gKiA8L3ByZT5cclxuICpcclxuICogVGhlbiB0aGUgY29tcGlsZWQgaHRtbCB3b3VsZCBiZSAoYXNzdW1pbmcgSHRtbDVNb2RlIGlzIG9mZiBhbmQgY3VycmVudCBzdGF0ZSBpcyBjb250YWN0cyk6XHJcbiAqIDxwcmU+XHJcbiAqIDxhIGhyZWY9XCIjL2hvbWVcIiB1aS1zcmVmPVwiaG9tZVwiPkhvbWU8L2E+IHwgPGEgaHJlZj1cIiMvYWJvdXRcIiB1aS1zcmVmPVwiYWJvdXRcIj5BYm91dDwvYT4gfCA8YSBocmVmPVwiIy9jb250YWN0cz9wYWdlPTJcIiB1aS1zcmVmPVwie3BhZ2U6IDJ9XCI+TmV4dCBwYWdlPC9hPlxyXG4gKlxyXG4gKiA8dWw+XHJcbiAqICAgICA8bGkgbmctcmVwZWF0PVwiY29udGFjdCBpbiBjb250YWN0c1wiPlxyXG4gKiAgICAgICAgIDxhIGhyZWY9XCIjL2NvbnRhY3RzLzFcIiB1aS1zcmVmPVwiY29udGFjdHMuZGV0YWlsKHsgaWQ6IGNvbnRhY3QuaWQgfSlcIj5Kb2U8L2E+XHJcbiAqICAgICA8L2xpPlxyXG4gKiAgICAgPGxpIG5nLXJlcGVhdD1cImNvbnRhY3QgaW4gY29udGFjdHNcIj5cclxuICogICAgICAgICA8YSBocmVmPVwiIy9jb250YWN0cy8yXCIgdWktc3JlZj1cImNvbnRhY3RzLmRldGFpbCh7IGlkOiBjb250YWN0LmlkIH0pXCI+QWxpY2U8L2E+XHJcbiAqICAgICA8L2xpPlxyXG4gKiAgICAgPGxpIG5nLXJlcGVhdD1cImNvbnRhY3QgaW4gY29udGFjdHNcIj5cclxuICogICAgICAgICA8YSBocmVmPVwiIy9jb250YWN0cy8zXCIgdWktc3JlZj1cImNvbnRhY3RzLmRldGFpbCh7IGlkOiBjb250YWN0LmlkIH0pXCI+Qm9iPC9hPlxyXG4gKiAgICAgPC9saT5cclxuICogPC91bD5cclxuICpcclxuICogPGEgdWktc3JlZj1cImhvbWVcIiB1aS1zcmVmLW9wdHM9XCJ7cmVsb2FkOiB0cnVlfVwiPkhvbWU8L2E+XHJcbiAqIDwvcHJlPlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdWktc3JlZiAnc3RhdGVOYW1lJyBjYW4gYmUgYW55IHZhbGlkIGFic29sdXRlIG9yIHJlbGF0aXZlIHN0YXRlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB1aS1zcmVmLW9wdHMgb3B0aW9ucyB0byBwYXNzIHRvIHtAbGluayB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlI21ldGhvZHNfZ28gJHN0YXRlLmdvKCl9XHJcbiAqL1xyXG4kU3RhdGVSZWZEaXJlY3RpdmUuJGluamVjdCA9IFsnJHN0YXRlJywgJyR0aW1lb3V0J107XHJcbmZ1bmN0aW9uICRTdGF0ZVJlZkRpcmVjdGl2ZSgkc3RhdGUsICR0aW1lb3V0KSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlc3RyaWN0OiAnQScsXHJcbiAgICByZXF1aXJlOiBbJz9edWlTcmVmQWN0aXZlJywgJz9edWlTcmVmQWN0aXZlRXEnXSxcclxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgdWlTcmVmQWN0aXZlKSB7XHJcbiAgICAgIHZhciByZWYgICAgPSBwYXJzZVN0YXRlUmVmKGF0dHJzLnVpU3JlZiwgJHN0YXRlLmN1cnJlbnQubmFtZSk7XHJcbiAgICAgIHZhciBkZWYgICAgPSB7IHN0YXRlOiByZWYuc3RhdGUsIGhyZWY6IG51bGwsIHBhcmFtczogbnVsbCB9O1xyXG4gICAgICB2YXIgdHlwZSAgID0gZ2V0VHlwZUluZm8oZWxlbWVudCk7XHJcbiAgICAgIHZhciBhY3RpdmUgPSB1aVNyZWZBY3RpdmVbMV0gfHwgdWlTcmVmQWN0aXZlWzBdO1xyXG4gICAgICB2YXIgdW5saW5rSW5mb0ZuID0gbnVsbDtcclxuICAgICAgdmFyIGhvb2tGbjtcclxuXHJcbiAgICAgIGRlZi5vcHRpb25zID0gZXh0ZW5kKGRlZmF1bHRPcHRzKGVsZW1lbnQsICRzdGF0ZSksIGF0dHJzLnVpU3JlZk9wdHMgPyBzY29wZS4kZXZhbChhdHRycy51aVNyZWZPcHRzKSA6IHt9KTtcclxuXHJcbiAgICAgIHZhciB1cGRhdGUgPSBmdW5jdGlvbih2YWwpIHtcclxuICAgICAgICBpZiAodmFsKSBkZWYucGFyYW1zID0gYW5ndWxhci5jb3B5KHZhbCk7XHJcbiAgICAgICAgZGVmLmhyZWYgPSAkc3RhdGUuaHJlZihyZWYuc3RhdGUsIGRlZi5wYXJhbXMsIGRlZi5vcHRpb25zKTtcclxuXHJcbiAgICAgICAgaWYgKHVubGlua0luZm9GbikgdW5saW5rSW5mb0ZuKCk7XHJcbiAgICAgICAgaWYgKGFjdGl2ZSkgdW5saW5rSW5mb0ZuID0gYWN0aXZlLiQkYWRkU3RhdGVJbmZvKHJlZi5zdGF0ZSwgZGVmLnBhcmFtcyk7XHJcbiAgICAgICAgaWYgKGRlZi5ocmVmICE9PSBudWxsKSBhdHRycy4kc2V0KHR5cGUuYXR0ciwgZGVmLmhyZWYpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKHJlZi5wYXJhbUV4cHIpIHtcclxuICAgICAgICBzY29wZS4kd2F0Y2gocmVmLnBhcmFtRXhwciwgZnVuY3Rpb24odmFsKSB7IGlmICh2YWwgIT09IGRlZi5wYXJhbXMpIHVwZGF0ZSh2YWwpOyB9LCB0cnVlKTtcclxuICAgICAgICBkZWYucGFyYW1zID0gYW5ndWxhci5jb3B5KHNjb3BlLiRldmFsKHJlZi5wYXJhbUV4cHIpKTtcclxuICAgICAgfVxyXG4gICAgICB1cGRhdGUoKTtcclxuXHJcbiAgICAgIGlmICghdHlwZS5jbGlja2FibGUpIHJldHVybjtcclxuICAgICAgaG9va0ZuID0gY2xpY2tIb29rKGVsZW1lbnQsICRzdGF0ZSwgJHRpbWVvdXQsIHR5cGUsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZGVmOyB9KTtcclxuICAgICAgZWxlbWVudFtlbGVtZW50Lm9uID8gJ29uJyA6ICdiaW5kJ10oXCJjbGlja1wiLCBob29rRm4pO1xyXG4gICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgZWxlbWVudFtlbGVtZW50Lm9mZiA/ICdvZmYnIDogJ3VuYmluZCddKFwiY2xpY2tcIiwgaG9va0ZuKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcclxuICogQG5hbWUgdWkucm91dGVyLnN0YXRlLmRpcmVjdGl2ZTp1aS1zdGF0ZVxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnN0YXRlLnVpU3JlZlxyXG4gKlxyXG4gKiBAcmVzdHJpY3QgQVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogTXVjaCBsaWtlIHVpLXNyZWYsIGJ1dCB3aWxsIGFjY2VwdCBuYW1lZCAkc2NvcGUgcHJvcGVydGllcyB0byBldmFsdWF0ZSBmb3IgYSBzdGF0ZSBkZWZpbml0aW9uLFxyXG4gKiBwYXJhbXMgYW5kIG92ZXJyaWRlIG9wdGlvbnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB1aS1zdGF0ZSAnc3RhdGVOYW1lJyBjYW4gYmUgYW55IHZhbGlkIGFic29sdXRlIG9yIHJlbGF0aXZlIHN0YXRlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB1aS1zdGF0ZS1wYXJhbXMgcGFyYW1zIHRvIHBhc3MgdG8ge0BsaW5rIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjbWV0aG9kc19ocmVmICRzdGF0ZS5ocmVmKCl9XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB1aS1zdGF0ZS1vcHRzIG9wdGlvbnMgdG8gcGFzcyB0byB7QGxpbmsgdWkucm91dGVyLnN0YXRlLiRzdGF0ZSNtZXRob2RzX2dvICRzdGF0ZS5nbygpfVxyXG4gKi9cclxuJFN0YXRlUmVmRHluYW1pY0RpcmVjdGl2ZS4kaW5qZWN0ID0gWyckc3RhdGUnLCAnJHRpbWVvdXQnXTtcclxuZnVuY3Rpb24gJFN0YXRlUmVmRHluYW1pY0RpcmVjdGl2ZSgkc3RhdGUsICR0aW1lb3V0KSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlc3RyaWN0OiAnQScsXHJcbiAgICByZXF1aXJlOiBbJz9edWlTcmVmQWN0aXZlJywgJz9edWlTcmVmQWN0aXZlRXEnXSxcclxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgdWlTcmVmQWN0aXZlKSB7XHJcbiAgICAgIHZhciB0eXBlICAgPSBnZXRUeXBlSW5mbyhlbGVtZW50KTtcclxuICAgICAgdmFyIGFjdGl2ZSA9IHVpU3JlZkFjdGl2ZVsxXSB8fCB1aVNyZWZBY3RpdmVbMF07XHJcbiAgICAgIHZhciBncm91cCAgPSBbYXR0cnMudWlTdGF0ZSwgYXR0cnMudWlTdGF0ZVBhcmFtcyB8fCBudWxsLCBhdHRycy51aVN0YXRlT3B0cyB8fCBudWxsXTtcclxuICAgICAgdmFyIHdhdGNoICA9ICdbJyArIGdyb3VwLm1hcChmdW5jdGlvbih2YWwpIHsgcmV0dXJuIHZhbCB8fCAnbnVsbCc7IH0pLmpvaW4oJywgJykgKyAnXSc7XHJcbiAgICAgIHZhciBkZWYgICAgPSB7IHN0YXRlOiBudWxsLCBwYXJhbXM6IG51bGwsIG9wdGlvbnM6IG51bGwsIGhyZWY6IG51bGwgfTtcclxuICAgICAgdmFyIHVubGlua0luZm9GbiA9IG51bGw7XHJcbiAgICAgIHZhciBob29rRm47XHJcblxyXG4gICAgICBmdW5jdGlvbiBydW5TdGF0ZVJlZkxpbmsgKGdyb3VwKSB7XHJcbiAgICAgICAgZGVmLnN0YXRlID0gZ3JvdXBbMF07IGRlZi5wYXJhbXMgPSBncm91cFsxXTsgZGVmLm9wdGlvbnMgPSBncm91cFsyXTtcclxuICAgICAgICBkZWYuaHJlZiA9ICRzdGF0ZS5ocmVmKGRlZi5zdGF0ZSwgZGVmLnBhcmFtcywgZGVmLm9wdGlvbnMpO1xyXG5cclxuICAgICAgICBpZiAodW5saW5rSW5mb0ZuKSB1bmxpbmtJbmZvRm4oKTtcclxuICAgICAgICBpZiAoYWN0aXZlKSB1bmxpbmtJbmZvRm4gPSBhY3RpdmUuJCRhZGRTdGF0ZUluZm8oZGVmLnN0YXRlLCBkZWYucGFyYW1zKTtcclxuICAgICAgICBpZiAoZGVmLmhyZWYpIGF0dHJzLiRzZXQodHlwZS5hdHRyLCBkZWYuaHJlZik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNjb3BlLiR3YXRjaCh3YXRjaCwgcnVuU3RhdGVSZWZMaW5rLCB0cnVlKTtcclxuICAgICAgcnVuU3RhdGVSZWZMaW5rKHNjb3BlLiRldmFsKHdhdGNoKSk7XHJcblxyXG4gICAgICBpZiAoIXR5cGUuY2xpY2thYmxlKSByZXR1cm47XHJcbiAgICAgIGhvb2tGbiA9IGNsaWNrSG9vayhlbGVtZW50LCAkc3RhdGUsICR0aW1lb3V0LCB0eXBlLCBmdW5jdGlvbigpIHsgcmV0dXJuIGRlZjsgfSk7XHJcbiAgICAgIGVsZW1lbnRbZWxlbWVudC5vbiA/ICdvbicgOiAnYmluZCddKFwiY2xpY2tcIiwgaG9va0ZuKTtcclxuICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGVsZW1lbnRbZWxlbWVudC5vZmYgPyAnb2ZmJyA6ICd1bmJpbmQnXShcImNsaWNrXCIsIGhvb2tGbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogQG5nZG9jIGRpcmVjdGl2ZVxyXG4gKiBAbmFtZSB1aS5yb3V0ZXIuc3RhdGUuZGlyZWN0aXZlOnVpLXNyZWYtYWN0aXZlXHJcbiAqXHJcbiAqIEByZXF1aXJlcyB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlXHJcbiAqIEByZXF1aXJlcyB1aS5yb3V0ZXIuc3RhdGUuJHN0YXRlUGFyYW1zXHJcbiAqIEByZXF1aXJlcyAkaW50ZXJwb2xhdGVcclxuICpcclxuICogQHJlc3RyaWN0IEFcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIEEgZGlyZWN0aXZlIHdvcmtpbmcgYWxvbmdzaWRlIHVpLXNyZWYgdG8gYWRkIGNsYXNzZXMgdG8gYW4gZWxlbWVudCB3aGVuIHRoZVxyXG4gKiByZWxhdGVkIHVpLXNyZWYgZGlyZWN0aXZlJ3Mgc3RhdGUgaXMgYWN0aXZlLCBhbmQgcmVtb3ZpbmcgdGhlbSB3aGVuIGl0IGlzIGluYWN0aXZlLlxyXG4gKiBUaGUgcHJpbWFyeSB1c2UtY2FzZSBpcyB0byBzaW1wbGlmeSB0aGUgc3BlY2lhbCBhcHBlYXJhbmNlIG9mIG5hdmlnYXRpb24gbWVudXNcclxuICogcmVseWluZyBvbiBgdWktc3JlZmAsIGJ5IGhhdmluZyB0aGUgXCJhY3RpdmVcIiBzdGF0ZSdzIG1lbnUgYnV0dG9uIGFwcGVhciBkaWZmZXJlbnQsXHJcbiAqIGRpc3Rpbmd1aXNoaW5nIGl0IGZyb20gdGhlIGluYWN0aXZlIG1lbnUgaXRlbXMuXHJcbiAqXHJcbiAqIHVpLXNyZWYtYWN0aXZlIGNhbiBsaXZlIG9uIHRoZSBzYW1lIGVsZW1lbnQgYXMgdWktc3JlZiBvciBvbiBhIHBhcmVudCBlbGVtZW50LiBUaGUgZmlyc3RcclxuICogdWktc3JlZi1hY3RpdmUgZm91bmQgYXQgdGhlIHNhbWUgbGV2ZWwgb3IgYWJvdmUgdGhlIHVpLXNyZWYgd2lsbCBiZSB1c2VkLlxyXG4gKlxyXG4gKiBXaWxsIGFjdGl2YXRlIHdoZW4gdGhlIHVpLXNyZWYncyB0YXJnZXQgc3RhdGUgb3IgYW55IGNoaWxkIHN0YXRlIGlzIGFjdGl2ZS4gSWYgeW91XHJcbiAqIG5lZWQgdG8gYWN0aXZhdGUgb25seSB3aGVuIHRoZSB1aS1zcmVmIHRhcmdldCBzdGF0ZSBpcyBhY3RpdmUgYW5kICpub3QqIGFueSBvZlxyXG4gKiBpdCdzIGNoaWxkcmVuLCB0aGVuIHlvdSB3aWxsIHVzZVxyXG4gKiB7QGxpbmsgdWkucm91dGVyLnN0YXRlLmRpcmVjdGl2ZTp1aS1zcmVmLWFjdGl2ZS1lcSB1aS1zcmVmLWFjdGl2ZS1lcX1cclxuICpcclxuICogQGV4YW1wbGVcclxuICogR2l2ZW4gdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZTpcclxuICogPHByZT5cclxuICogPHVsPlxyXG4gKiAgIDxsaSB1aS1zcmVmLWFjdGl2ZT1cImFjdGl2ZVwiIGNsYXNzPVwiaXRlbVwiPlxyXG4gKiAgICAgPGEgaHJlZiB1aS1zcmVmPVwiYXBwLnVzZXIoe3VzZXI6ICdiaWxib2JhZ2dpbnMnfSlcIj5AYmlsYm9iYWdnaW5zPC9hPlxyXG4gKiAgIDwvbGk+XHJcbiAqIDwvdWw+XHJcbiAqIDwvcHJlPlxyXG4gKlxyXG4gKlxyXG4gKiBXaGVuIHRoZSBhcHAgc3RhdGUgaXMgXCJhcHAudXNlclwiIChvciBhbnkgY2hpbGRyZW4gc3RhdGVzKSwgYW5kIGNvbnRhaW5zIHRoZSBzdGF0ZSBwYXJhbWV0ZXIgXCJ1c2VyXCIgd2l0aCB2YWx1ZSBcImJpbGJvYmFnZ2luc1wiLFxyXG4gKiB0aGUgcmVzdWx0aW5nIEhUTUwgd2lsbCBhcHBlYXIgYXMgKG5vdGUgdGhlICdhY3RpdmUnIGNsYXNzKTpcclxuICogPHByZT5cclxuICogPHVsPlxyXG4gKiAgIDxsaSB1aS1zcmVmLWFjdGl2ZT1cImFjdGl2ZVwiIGNsYXNzPVwiaXRlbSBhY3RpdmVcIj5cclxuICogICAgIDxhIHVpLXNyZWY9XCJhcHAudXNlcih7dXNlcjogJ2JpbGJvYmFnZ2lucyd9KVwiIGhyZWY9XCIvdXNlcnMvYmlsYm9iYWdnaW5zXCI+QGJpbGJvYmFnZ2luczwvYT5cclxuICogICA8L2xpPlxyXG4gKiA8L3VsPlxyXG4gKiA8L3ByZT5cclxuICpcclxuICogVGhlIGNsYXNzIG5hbWUgaXMgaW50ZXJwb2xhdGVkICoqb25jZSoqIGR1cmluZyB0aGUgZGlyZWN0aXZlcyBsaW5rIHRpbWUgKGFueSBmdXJ0aGVyIGNoYW5nZXMgdG8gdGhlXHJcbiAqIGludGVycG9sYXRlZCB2YWx1ZSBhcmUgaWdub3JlZCkuXHJcbiAqXHJcbiAqIE11bHRpcGxlIGNsYXNzZXMgbWF5IGJlIHNwZWNpZmllZCBpbiBhIHNwYWNlLXNlcGFyYXRlZCBmb3JtYXQ6XHJcbiAqIDxwcmU+XHJcbiAqIDx1bD5cclxuICogICA8bGkgdWktc3JlZi1hY3RpdmU9J2NsYXNzMSBjbGFzczIgY2xhc3MzJz5cclxuICogICAgIDxhIHVpLXNyZWY9XCJhcHAudXNlclwiPmxpbms8L2E+XHJcbiAqICAgPC9saT5cclxuICogPC91bD5cclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcGFzcyB1aS1zcmVmLWFjdGl2ZSBhbiBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzXHJcbiAqIHRvIGFuIG9iamVjdCBoYXNoLCB3aG9zZSBrZXlzIHJlcHJlc2VudCBhY3RpdmUgY2xhc3MgbmFtZXMgYW5kIHdob3NlXHJcbiAqIHZhbHVlcyByZXByZXNlbnQgdGhlIHJlc3BlY3RpdmUgc3RhdGUgbmFtZXMvZ2xvYnMuXHJcbiAqIHVpLXNyZWYtYWN0aXZlIHdpbGwgbWF0Y2ggaWYgdGhlIGN1cnJlbnQgYWN0aXZlIHN0YXRlICoqaW5jbHVkZXMqKiBhbnkgb2ZcclxuICogdGhlIHNwZWNpZmllZCBzdGF0ZSBuYW1lcy9nbG9icywgZXZlbiB0aGUgYWJzdHJhY3Qgb25lcy5cclxuICpcclxuICogQEV4YW1wbGVcclxuICogR2l2ZW4gdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSwgd2l0aCBcImFkbWluXCIgYmVpbmcgYW4gYWJzdHJhY3Qgc3RhdGU6XHJcbiAqIDxwcmU+XHJcbiAqIDxkaXYgdWktc3JlZi1hY3RpdmU9XCJ7J2FjdGl2ZSc6ICdhZG1pbi4qJ31cIj5cclxuICogICA8YSB1aS1zcmVmLWFjdGl2ZT1cImFjdGl2ZVwiIHVpLXNyZWY9XCJhZG1pbi5yb2xlc1wiPlJvbGVzPC9hPlxyXG4gKiA8L2Rpdj5cclxuICogPC9wcmU+XHJcbiAqXHJcbiAqIFdoZW4gdGhlIGN1cnJlbnQgc3RhdGUgaXMgXCJhZG1pbi5yb2xlc1wiIHRoZSBcImFjdGl2ZVwiIGNsYXNzIHdpbGwgYmUgYXBwbGllZFxyXG4gKiB0byBib3RoIHRoZSA8ZGl2PiBhbmQgPGE+IGVsZW1lbnRzLiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBzdGF0ZVxyXG4gKiBuYW1lcy9nbG9icyBwYXNzZWQgdG8gdWktc3JlZi1hY3RpdmUgc2hhZG93IHRoZSBzdGF0ZSBwcm92aWRlZCBieSB1aS1zcmVmLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmdkb2MgZGlyZWN0aXZlXHJcbiAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS5kaXJlY3RpdmU6dWktc3JlZi1hY3RpdmUtZXFcclxuICpcclxuICogQHJlcXVpcmVzIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVcclxuICogQHJlcXVpcmVzIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVQYXJhbXNcclxuICogQHJlcXVpcmVzICRpbnRlcnBvbGF0ZVxyXG4gKlxyXG4gKiBAcmVzdHJpY3QgQVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogVGhlIHNhbWUgYXMge0BsaW5rIHVpLnJvdXRlci5zdGF0ZS5kaXJlY3RpdmU6dWktc3JlZi1hY3RpdmUgdWktc3JlZi1hY3RpdmV9IGJ1dCB3aWxsIG9ubHkgYWN0aXZhdGVcclxuICogd2hlbiB0aGUgZXhhY3QgdGFyZ2V0IHN0YXRlIHVzZWQgaW4gdGhlIGB1aS1zcmVmYCBpcyBhY3RpdmU7IG5vIGNoaWxkIHN0YXRlcy5cclxuICpcclxuICovXHJcbiRTdGF0ZVJlZkFjdGl2ZURpcmVjdGl2ZS4kaW5qZWN0ID0gWyckc3RhdGUnLCAnJHN0YXRlUGFyYW1zJywgJyRpbnRlcnBvbGF0ZSddO1xyXG5mdW5jdGlvbiAkU3RhdGVSZWZBY3RpdmVEaXJlY3RpdmUoJHN0YXRlLCAkc3RhdGVQYXJhbXMsICRpbnRlcnBvbGF0ZSkge1xyXG4gIHJldHVybiAge1xyXG4gICAgcmVzdHJpY3Q6IFwiQVwiLFxyXG4gICAgY29udHJvbGxlcjogWyckc2NvcGUnLCAnJGVsZW1lbnQnLCAnJGF0dHJzJywgJyR0aW1lb3V0JywgZnVuY3Rpb24gKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgJHRpbWVvdXQpIHtcclxuICAgICAgdmFyIHN0YXRlcyA9IFtdLCBhY3RpdmVDbGFzc2VzID0ge30sIGFjdGl2ZUVxQ2xhc3MsIHVpU3JlZkFjdGl2ZTtcclxuXHJcbiAgICAgIC8vIFRoZXJlIHByb2JhYmx5IGlzbid0IG11Y2ggcG9pbnQgaW4gJG9ic2VydmluZyB0aGlzXHJcbiAgICAgIC8vIHVpU3JlZkFjdGl2ZSBhbmQgdWlTcmVmQWN0aXZlRXEgc2hhcmUgdGhlIHNhbWUgZGlyZWN0aXZlIG9iamVjdCB3aXRoIHNvbWVcclxuICAgICAgLy8gc2xpZ2h0IGRpZmZlcmVuY2UgaW4gbG9naWMgcm91dGluZ1xyXG4gICAgICBhY3RpdmVFcUNsYXNzID0gJGludGVycG9sYXRlKCRhdHRycy51aVNyZWZBY3RpdmVFcSB8fCAnJywgZmFsc2UpKCRzY29wZSk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHVpU3JlZkFjdGl2ZSA9ICRzY29wZS4kZXZhbCgkYXR0cnMudWlTcmVmQWN0aXZlKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIERvIG5vdGhpbmcuIHVpU3JlZkFjdGl2ZSBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLlxyXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB1c2luZyAkaW50ZXJwb2xhdGUgYmVsb3dcclxuICAgICAgfVxyXG4gICAgICB1aVNyZWZBY3RpdmUgPSB1aVNyZWZBY3RpdmUgfHwgJGludGVycG9sYXRlKCRhdHRycy51aVNyZWZBY3RpdmUgfHwgJycsIGZhbHNlKSgkc2NvcGUpO1xyXG4gICAgICBpZiAoaXNPYmplY3QodWlTcmVmQWN0aXZlKSkge1xyXG4gICAgICAgIGZvckVhY2godWlTcmVmQWN0aXZlLCBmdW5jdGlvbihzdGF0ZU9yTmFtZSwgYWN0aXZlQ2xhc3MpIHtcclxuICAgICAgICAgIGlmIChpc1N0cmluZyhzdGF0ZU9yTmFtZSkpIHtcclxuICAgICAgICAgICAgdmFyIHJlZiA9IHBhcnNlU3RhdGVSZWYoc3RhdGVPck5hbWUsICRzdGF0ZS5jdXJyZW50Lm5hbWUpO1xyXG4gICAgICAgICAgICBhZGRTdGF0ZShyZWYuc3RhdGUsICRzY29wZS4kZXZhbChyZWYucGFyYW1FeHByKSwgYWN0aXZlQ2xhc3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBbGxvdyB1aVNyZWYgdG8gY29tbXVuaWNhdGUgd2l0aCB1aVNyZWZBY3RpdmVbRXF1YWxzXVxyXG4gICAgICB0aGlzLiQkYWRkU3RhdGVJbmZvID0gZnVuY3Rpb24gKG5ld1N0YXRlLCBuZXdQYXJhbXMpIHtcclxuICAgICAgICAvLyB3ZSBhbHJlYWR5IGdvdCBhbiBleHBsaWNpdCBzdGF0ZSBwcm92aWRlZCBieSB1aS1zcmVmLWFjdGl2ZSwgc28gd2VcclxuICAgICAgICAvLyBzaGFkb3cgdGhlIG9uZSB0aGF0IGNvbWVzIGZyb20gdWktc3JlZlxyXG4gICAgICAgIGlmIChpc09iamVjdCh1aVNyZWZBY3RpdmUpICYmIHN0YXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBkZXJlZ2lzdGVyID0gYWRkU3RhdGUobmV3U3RhdGUsIG5ld1BhcmFtcywgdWlTcmVmQWN0aXZlKTtcclxuICAgICAgICB1cGRhdGUoKTtcclxuICAgICAgICByZXR1cm4gZGVyZWdpc3RlcjtcclxuICAgICAgfTtcclxuXHJcbiAgICAgICRzY29wZS4kb24oJyRzdGF0ZUNoYW5nZVN1Y2Nlc3MnLCB1cGRhdGUpO1xyXG5cclxuICAgICAgZnVuY3Rpb24gYWRkU3RhdGUoc3RhdGVOYW1lLCBzdGF0ZVBhcmFtcywgYWN0aXZlQ2xhc3MpIHtcclxuICAgICAgICB2YXIgc3RhdGUgPSAkc3RhdGUuZ2V0KHN0YXRlTmFtZSwgc3RhdGVDb250ZXh0KCRlbGVtZW50KSk7XHJcbiAgICAgICAgdmFyIHN0YXRlSGFzaCA9IGNyZWF0ZVN0YXRlSGFzaChzdGF0ZU5hbWUsIHN0YXRlUGFyYW1zKTtcclxuXHJcbiAgICAgICAgdmFyIHN0YXRlSW5mbyA9IHtcclxuICAgICAgICAgIHN0YXRlOiBzdGF0ZSB8fCB7IG5hbWU6IHN0YXRlTmFtZSB9LFxyXG4gICAgICAgICAgcGFyYW1zOiBzdGF0ZVBhcmFtcyxcclxuICAgICAgICAgIGhhc2g6IHN0YXRlSGFzaFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHN0YXRlcy5wdXNoKHN0YXRlSW5mbyk7XHJcbiAgICAgICAgYWN0aXZlQ2xhc3Nlc1tzdGF0ZUhhc2hdID0gYWN0aXZlQ2xhc3M7XHJcblxyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiByZW1vdmVTdGF0ZSgpIHtcclxuICAgICAgICAgIHZhciBpZHggPSBzdGF0ZXMuaW5kZXhPZihzdGF0ZUluZm8pO1xyXG4gICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHN0YXRlcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlXHJcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gW3BhcmFtc11cclxuICAgICAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAgICAgKi9cclxuICAgICAgZnVuY3Rpb24gY3JlYXRlU3RhdGVIYXNoKHN0YXRlLCBwYXJhbXMpIHtcclxuICAgICAgICBpZiAoIWlzU3RyaW5nKHN0YXRlKSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGF0ZSBzaG91bGQgYmUgYSBzdHJpbmcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmFtcykpIHtcclxuICAgICAgICAgIHJldHVybiBzdGF0ZSArIHRvSnNvbihwYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJhbXMgPSAkc2NvcGUuJGV2YWwocGFyYW1zKTtcclxuICAgICAgICBpZiAoaXNPYmplY3QocGFyYW1zKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHN0YXRlICsgdG9Kc29uKHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVXBkYXRlIHJvdXRlIHN0YXRlXHJcbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGFueU1hdGNoKHN0YXRlc1tpXS5zdGF0ZSwgc3RhdGVzW2ldLnBhcmFtcykpIHtcclxuICAgICAgICAgICAgYWRkQ2xhc3MoJGVsZW1lbnQsIGFjdGl2ZUNsYXNzZXNbc3RhdGVzW2ldLmhhc2hdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKCRlbGVtZW50LCBhY3RpdmVDbGFzc2VzW3N0YXRlc1tpXS5oYXNoXSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGV4YWN0TWF0Y2goc3RhdGVzW2ldLnN0YXRlLCBzdGF0ZXNbaV0ucGFyYW1zKSkge1xyXG4gICAgICAgICAgICBhZGRDbGFzcygkZWxlbWVudCwgYWN0aXZlRXFDbGFzcyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZW1vdmVDbGFzcygkZWxlbWVudCwgYWN0aXZlRXFDbGFzcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBhZGRDbGFzcyhlbCwgY2xhc3NOYW1lKSB7ICR0aW1lb3V0KGZ1bmN0aW9uICgpIHsgZWwuYWRkQ2xhc3MoY2xhc3NOYW1lKTsgfSk7IH1cclxuICAgICAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkgeyBlbC5yZW1vdmVDbGFzcyhjbGFzc05hbWUpOyB9XHJcbiAgICAgIGZ1bmN0aW9uIGFueU1hdGNoKHN0YXRlLCBwYXJhbXMpIHsgcmV0dXJuICRzdGF0ZS5pbmNsdWRlcyhzdGF0ZS5uYW1lLCBwYXJhbXMpOyB9XHJcbiAgICAgIGZ1bmN0aW9uIGV4YWN0TWF0Y2goc3RhdGUsIHBhcmFtcykgeyByZXR1cm4gJHN0YXRlLmlzKHN0YXRlLm5hbWUsIHBhcmFtcyk7IH1cclxuXHJcbiAgICAgIHVwZGF0ZSgpO1xyXG4gICAgfV1cclxuICB9O1xyXG59XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgndWkucm91dGVyLnN0YXRlJylcclxuICAuZGlyZWN0aXZlKCd1aVNyZWYnLCAkU3RhdGVSZWZEaXJlY3RpdmUpXHJcbiAgLmRpcmVjdGl2ZSgndWlTcmVmQWN0aXZlJywgJFN0YXRlUmVmQWN0aXZlRGlyZWN0aXZlKVxyXG4gIC5kaXJlY3RpdmUoJ3VpU3JlZkFjdGl2ZUVxJywgJFN0YXRlUmVmQWN0aXZlRGlyZWN0aXZlKVxyXG4gIC5kaXJlY3RpdmUoJ3VpU3RhdGUnLCAkU3RhdGVSZWZEeW5hbWljRGlyZWN0aXZlKTtcclxuXHJcbi8qKlxyXG4gKiBAbmdkb2MgZmlsdGVyXHJcbiAqIEBuYW1lIHVpLnJvdXRlci5zdGF0ZS5maWx0ZXI6aXNTdGF0ZVxyXG4gKlxyXG4gKiBAcmVxdWlyZXMgdWkucm91dGVyLnN0YXRlLiRzdGF0ZVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogVHJhbnNsYXRlcyB0byB7QGxpbmsgdWkucm91dGVyLnN0YXRlLiRzdGF0ZSNtZXRob2RzX2lzICRzdGF0ZS5pcyhcInN0YXRlTmFtZVwiKX0uXHJcbiAqL1xyXG4kSXNTdGF0ZUZpbHRlci4kaW5qZWN0ID0gWyckc3RhdGUnXTtcclxuZnVuY3Rpb24gJElzU3RhdGVGaWx0ZXIoJHN0YXRlKSB7XHJcbiAgdmFyIGlzRmlsdGVyID0gZnVuY3Rpb24gKHN0YXRlLCBwYXJhbXMpIHtcclxuICAgIHJldHVybiAkc3RhdGUuaXMoc3RhdGUsIHBhcmFtcyk7XHJcbiAgfTtcclxuICBpc0ZpbHRlci4kc3RhdGVmdWwgPSB0cnVlO1xyXG4gIHJldHVybiBpc0ZpbHRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBuZ2RvYyBmaWx0ZXJcclxuICogQG5hbWUgdWkucm91dGVyLnN0YXRlLmZpbHRlcjppbmNsdWRlZEJ5U3RhdGVcclxuICpcclxuICogQHJlcXVpcmVzIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGVcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIFRyYW5zbGF0ZXMgdG8ge0BsaW5rIHVpLnJvdXRlci5zdGF0ZS4kc3RhdGUjbWV0aG9kc19pbmNsdWRlcyAkc3RhdGUuaW5jbHVkZXMoJ2Z1bGxPclBhcnRpYWxTdGF0ZU5hbWUnKX0uXHJcbiAqL1xyXG4kSW5jbHVkZWRCeVN0YXRlRmlsdGVyLiRpbmplY3QgPSBbJyRzdGF0ZSddO1xyXG5mdW5jdGlvbiAkSW5jbHVkZWRCeVN0YXRlRmlsdGVyKCRzdGF0ZSkge1xyXG4gIHZhciBpbmNsdWRlc0ZpbHRlciA9IGZ1bmN0aW9uIChzdGF0ZSwgcGFyYW1zLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4gJHN0YXRlLmluY2x1ZGVzKHN0YXRlLCBwYXJhbXMsIG9wdGlvbnMpO1xyXG4gIH07XHJcbiAgaW5jbHVkZXNGaWx0ZXIuJHN0YXRlZnVsID0gdHJ1ZTtcclxuICByZXR1cm4gIGluY2x1ZGVzRmlsdGVyO1xyXG59XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgndWkucm91dGVyLnN0YXRlJylcclxuICAuZmlsdGVyKCdpc1N0YXRlJywgJElzU3RhdGVGaWx0ZXIpXHJcbiAgLmZpbHRlcignaW5jbHVkZWRCeVN0YXRlJywgJEluY2x1ZGVkQnlTdGF0ZUZpbHRlcik7XHJcbn0pKHdpbmRvdywgd2luZG93LmFuZ3VsYXIpOyIsIid1c2Ugc3RyaWN0JztcblxuYW5ndWxhci5tb2R1bGUoJ2FuZ3VsYXJNU1RpbWUnLCBbXSlcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBhbmd1bGFyTVNUaW1lLmRpcmVjdGl2ZTphbmd1bGFyTXNUaW1lXG4gKiBAZGVzY3JpcHRpb24gQSBkaXJlY3RpdmUgdGhhdCBiaW5kcyB0byBhIG1pbGxpc2Vjb25kcyBtb2RlbCBhbmQgc2hvd3MgdGltZSBmb3JtYXR0ZWQgYXMgaHI6bWluOnNlY1xuICogIyBhbmd1bGFyTXNUaW1lXG4gKi9cbiAgLmRpcmVjdGl2ZSgnbXNUaW1lJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgc2NvcGU6IHtcbiAgICAgICAgbXNNb2RlbCA6IFwiPW1zVGltZVwiLFxuICAgICAgICBwcmVNcyAgIDogXCJAbXNUaW1lUHJlXCIsXG4gICAgICAgIHBvc3RNcyAgOiBcIkBtc1RpbWVQb3N0XCIsXG4gICAgICB9LFxuICAgICAgbGluazogZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb252ZXJ0IG1zIHRvIGEgdGltZSBzdHJpbmdcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1zVG9UaW1lKG1zKSB7XG4gICAgICAgICAgdmFyIHRpbWUgPSAnJyxcbiAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgZHQgPSB7XG4gICAgICAgICAgICAgICAgZGF5OiAwLFxuICAgICAgICAgICAgICAgIGhyczogMCxcbiAgICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgICAgc2VjOiAwXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKG1zICYmICFpc05hTihtcykpIHtcbiAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBQdWxsIHRoZSB0aW1lIGluZm9cbiAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBDcmVhdGUgZGF0ZSBvYmplY3QgZnJvbSBNU1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKE1hdGguYWJzKG1zKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgdGltZVxuICAgICAgICAgICAgZHQuaHJzID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgICAgICAgICAgZHQubWluID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgICAgICAgICBkdC5zZWMgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICAgICAgICBcbiAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBGb3JtYXQgdGhlIHRpbWVcbiAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBIb3Vyc1xuICAgICAgICAgICAgaWYgKGR0Lmhycykge1xuICAgICAgICAgICAgICB0aW1lID0gZHQuaHJzICsgJzonO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTWludXRlc1xuICAgICAgICAgICAgaWYgKGR0Lm1pbikge1xuICAgICAgICAgICAgICBpZiAoZHQuaHJzICYmIGR0Lm1pbiA8IDEwKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IHRpbWUgKyAnMCcgKyBkdC5taW4gKyAnOic7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IHRpbWUgKyBkdC5taW4gKyAnOic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRpbWUgPSB0aW1lICsgJzAwOic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZWNvbmRzXG4gICAgICAgICAgICBpZiAoZHQuc2VjKSB7XG4gICAgICAgICAgICAgIGlmIChkdC5zZWMgPCAxMCkge1xuICAgICAgICAgICAgICAgIHRpbWUgPSB0aW1lICsgJzAnICsgZHQuc2VjO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbWUgPSB0aW1lICsgZHQuc2VjO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aW1lID0gdGltZSArICcwMCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJldHVybiBmb3JtYXR0ZWQgdGltZVxuICAgICAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29udmVydCBhIHRpbWUgc3RyaW5nIHRvIG1zXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiB0aW1lVG9NcyAodGltZSkge1xuICAgICAgICAgIHZhciBzcGxpdFRpbWUsIHNwbGl0VGltZUxlbmd0aDtcbiAgICAgICAgICBcbiAgICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgLy8gRm9ybWF0IHRoZSB0aW1lXG4gICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aW1lIGlzIGEgc3RyaW5nXG4gICAgICAgICAgdGltZSA9IHRpbWUudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgc3BsaXRUaW1lID0gdGltZS5zcGxpdCgnOicpO1xuICAgICAgICAgIHNwbGl0VGltZUxlbmd0aCA9IHNwbGl0VGltZS5sZW5ndGg7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHNwbGl0VGltZUxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gc2VjXG4gICAgICAgICAgICB0aW1lID0gICcwMDowMDonICsgdGltZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwbGl0VGltZUxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgLy8gbWluOnNlY1xuICAgICAgICAgICAgdGltZSA9ICAnMDA6JyArIHRpbWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChzcGxpdFRpbWVMZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIC8vIGhyczptaW46c2VjXG4gICAgICAgICAgICAvLyBETyBOT1RISU5HICh0aW1lIGlzIHByb3Blcmx5IGZvcm1hdHRlZClcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwbGl0VGltZUxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICAvLyBNb3JlIHRoYW4gaHJzOm1pbjpzZWNcbiAgICAgICAgICAgIHRpbWUgPSAgc3BsaXRUaW1lW3NwbGl0VGltZUxlbmd0aC0zXSArICc6JyArIFxuICAgICAgICAgICAgICAgICAgICBzcGxpdFRpbWVbc3BsaXRUaW1lTGVuZ3RoLTJdICsgJzonICsgXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0VGltZVtzcGxpdFRpbWVMZW5ndGgtMV0gKyAnOic7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFueXRoaW5nIHdlaXJkXG4gICAgICAgICAgICB0aW1lID0gICcwMDowMCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAvLyBSZXR1cm4gdGltZSBpbiBtc1xuICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZShcIjAxIEphbiAxOTcwIFwiICsgdGltZSArIFwiIFVUQ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGlmIGEgdGltZSBzdHJpbmcgaXMgYSB2YWxpZCB0aW1lXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc1ZhbGlkVGltZSAodGltZSkge1xuICAgICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiB0aW1lIGlzIG9ubHkgZGlnaXRzIGFuZCBjb2xvbnNcbiAgICAgICAgICAgIHJldHVybiAvXihcXGQrOik/KFswMTIzNDVdP1xcZDopPyhbMDEyMzQ1XT9cXGQpJC9pLnRlc3QodGltZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAvKipcbiAgICAgICAgICAqIEJpbmQgdGhlIHRpbWUgdmFsdWUvdGV4dCB0byB0aGUgbXNNb2RlbFxuICAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGJpbmRUaW1lICgpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgICAgICAgIHZhciB0eXBlID0gZWxlbWVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgIC8vIElucHV0OiB0d28td2F5IGJpbmRcbiAgICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdpbnB1dCcgfHwgdHlwZSA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB2YWx1ZSBvbiBtb2RlbCBjaGFuZ2VcbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgnbXNNb2RlbCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICBlbGVtZW50LnZhbChtc1RvVGltZShuZXdWYWx1ZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWwgb24gdmFsdWUgY2hhbmdlXG4gICAgICAgICAgICAvLyBvbmx5IGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIHRpbWVcbiAgICAgICAgICAgIGVsZW1lbnQub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5ldyB2YWx1ZSBpcyB2YWxpZFxuICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGVsZW1lbnQudmFsKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyBkaXJ0eVxuICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCduZy1kaXJ0eScpO1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFRpbWUobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1vZGVsXG4gICAgICAgICAgICAgICAgICBzY29wZS5tc01vZGVsID0gdGltZVRvTXMobmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGFzIHZhbGlkXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCduZy12YWxpZCcpLnJlbW92ZUNsYXNzKCduZy1pbnZhbGlkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIHNldCBlbGVtZW50IGFzIGludmFsaWRcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJ25nLWludmFsaWQnKS5yZW1vdmVDbGFzcygnbmctdmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAvLyBOb24taW5wdXQ6IGluamVjdCB0ZXh0XG4gICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRleHQgb24gbW9kZWwgY2hhbmdlXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ21zTW9kZWwnLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgLy8gR2V0IHRpbWUsIGFkZCBwcmUgYW5kIHBvc3QgdG8gaXRcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSAoc2NvcGUucHJlTXMgfHwgJycpICsgbXNUb1RpbWUodmFsdWUpICsgKHNjb3BlLnBvc3RNcyB8fCAnJyk7XG4gICAgICAgICAgICAgIC8vIEFkZCB0aW1lIHRvIGVsZW1lbnQgYXMgdGV4dFxuICAgICAgICAgICAgICBlbGVtZW50LnRleHQodGV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEJpbmQgdGhlIHRpbWUgdG8gdGhlIG1vZGVsXG4gICAgICAgIGJpbmRUaW1lKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pzLmZvdW5kYXRpb24vPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG47KGZ1bmN0aW9uKCkge1xuXG4gIC8qKiBVc2VkIGFzIGEgc2FmZSByZWZlcmVuY2UgZm9yIGB1bmRlZmluZWRgIGluIHByZS1FUzUgZW52aXJvbm1lbnRzLiAqL1xuICB2YXIgdW5kZWZpbmVkO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci4gKi9cbiAgdmFyIFZFUlNJT04gPSAnNC4xNy40JztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbiAgLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xuICB2YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xuICB2YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuICAvKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG4gIHZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xuICB2YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xuICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gIHZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgICAgV1JBUF9DVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgICBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcgPSAxNixcbiAgICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgICBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NixcbiAgICAgIFdSQVBfRkxJUF9GTEFHID0gNTEyO1xuXG4gIC8qKiBVc2VkIGFzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYF8udHJ1bmNhdGVgLiAqL1xuICB2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEggPSAzMCxcbiAgICAgIERFRkFVTFRfVFJVTkNfT01JU1NJT04gPSAnLi4uJztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG4gIHZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgICBIT1RfU1BBTiA9IDE2O1xuXG4gIC8qKiBVc2VkIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIGxhenkgaXRlcmF0ZWVzLiAqL1xuICB2YXIgTEFaWV9GSUxURVJfRkxBRyA9IDEsXG4gICAgICBMQVpZX01BUF9GTEFHID0gMixcbiAgICAgIExBWllfV0hJTEVfRkxBRyA9IDM7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG4gIHZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgICAgTkFOID0gMCAvIDA7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbiAgdmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1LFxuICAgICAgTUFYX0FSUkFZX0lOREVYID0gTUFYX0FSUkFZX0xFTkdUSCAtIDEsXG4gICAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxO1xuXG4gIC8qKiBVc2VkIHRvIGFzc29jaWF0ZSB3cmFwIG1ldGhvZHMgd2l0aCB0aGVpciBiaXQgZmxhZ3MuICovXG4gIHZhciB3cmFwRmxhZ3MgPSBbXG4gICAgWydhcnknLCBXUkFQX0FSWV9GTEFHXSxcbiAgICBbJ2JpbmQnLCBXUkFQX0JJTkRfRkxBR10sXG4gICAgWydiaW5kS2V5JywgV1JBUF9CSU5EX0tFWV9GTEFHXSxcbiAgICBbJ2N1cnJ5JywgV1JBUF9DVVJSWV9GTEFHXSxcbiAgICBbJ2N1cnJ5UmlnaHQnLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUddLFxuICAgIFsnZmxpcCcsIFdSQVBfRkxJUF9GTEFHXSxcbiAgICBbJ3BhcnRpYWwnLCBXUkFQX1BBUlRJQUxfRkxBR10sXG4gICAgWydwYXJ0aWFsUmlnaHQnLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBR10sXG4gICAgWydyZWFyZycsIFdSQVBfUkVBUkdfRkxBR11cbiAgXTtcblxuICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG4gIHZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgICBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgICAgZG9tRXhjVGFnID0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXScsXG4gICAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgICAgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJyxcbiAgICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXScsXG4gICAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nLFxuICAgICAgd2Vha1NldFRhZyA9ICdbb2JqZWN0IFdlYWtTZXRdJztcblxuICB2YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UuICovXG4gIHZhciByZUVtcHR5U3RyaW5nTGVhZGluZyA9IC9cXGJfX3AgXFwrPSAnJzsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdNaWRkbGUgPSAvXFxiKF9fcCBcXCs9KSAnJyBcXCsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSkgXFwrXFxuJyc7L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggSFRNTCBlbnRpdGllcyBhbmQgSFRNTCBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGVkSHRtbCA9IC8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxcbiAgICAgIHJlVW5lc2NhcGVkSHRtbCA9IC9bJjw+XCInXS9nLFxuICAgICAgcmVIYXNFc2NhcGVkSHRtbCA9IFJlZ0V4cChyZUVzY2FwZWRIdG1sLnNvdXJjZSksXG4gICAgICByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlID0gLzwlLShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUV2YWx1YXRlID0gLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcXHNcXFNdKz8pJT4vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvLFxuICAgICAgcmVMZWFkaW5nRG90ID0gL15cXC4vLFxuICAgICAgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICAgKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAgICovXG4gIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csXG4gICAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nLFxuICAgICAgcmVUcmltU3RhcnQgPSAvXlxccysvLFxuICAgICAgcmVUcmltRW5kID0gL1xccyskLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/Oig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpXFxcXGIpJyxcbiAgICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86KD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSClcXFxcYiknLFxuICAgICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgICAgcnNFbW9qaSA9ICcoPzonICsgW3JzRGluZ2JhdCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNTZXEsXG4gICAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBhcG9zdHJvcGhlcy4gKi9cbiAgdmFyIHJlQXBvcyA9IFJlZ0V4cChyc0Fwb3MsICdnJyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKSBhbmRcbiAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcyBmb3Igc3ltYm9sc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX2Zvcl9TeW1ib2xzKS5cbiAgICovXG4gIHZhciByZUNvbWJvTWFyayA9IFJlZ0V4cChyc0NvbWJvLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG4gIHZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBjb21wbGV4IG9yIGNvbXBvdW5kIHdvcmRzLiAqL1xuICB2YXIgcmVVbmljb2RlV29yZCA9IFJlZ0V4cChbXG4gICAgcnNVcHBlciArICc/JyArIHJzTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc01pc2NVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIgKyByc01pc2NMb3dlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNVcHBlciArICc/JyArIHJzTWlzY0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyLFxuICAgIHJzVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIsXG4gICAgcnNPcmRVcHBlcixcbiAgICByc09yZExvd2VyLFxuICAgIHJzRGlnaXRzLFxuICAgIHJzRW1vamlcbiAgXS5qb2luKCd8JyksICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG4gIHZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHRoYXQgbmVlZCBhIG1vcmUgcm9idXN0IHJlZ2V4cCB0byBtYXRjaCB3b3Jkcy4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZVdvcmQgPSAvW2Etel1bQS1aXXxbQS1aXXsyLH1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdCdWZmZXInLCAnRGF0YVZpZXcnLCAnRGF0ZScsICdFcnJvcicsICdGbG9hdDMyQXJyYXknLCAnRmxvYXQ2NEFycmF5JyxcbiAgICAnRnVuY3Rpb24nLCAnSW50OEFycmF5JywgJ0ludDE2QXJyYXknLCAnSW50MzJBcnJheScsICdNYXAnLCAnTWF0aCcsICdPYmplY3QnLFxuICAgICdQcm9taXNlJywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ1N5bWJvbCcsICdUeXBlRXJyb3InLCAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ1VpbnQxNkFycmF5JywgJ1VpbnQzMkFycmF5JywgJ1dlYWtNYXAnLFxuICAgICdfJywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdwYXJzZUludCcsICdzZXRUaW1lb3V0J1xuICBdO1xuXG4gIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG4gIHZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xuICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICB0eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbiAgdmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbiAgY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbiAgY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbiAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcycsXG4gICAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAgICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAgICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAgICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAgICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAgICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAgICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAgICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAgICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAgICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAgICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG4gIHZhciBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgaHRtbFVuZXNjYXBlcyA9IHtcbiAgICAnJmFtcDsnOiAnJicsXG4gICAgJyZsdDsnOiAnPCcsXG4gICAgJyZndDsnOiAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyYjMzk7JzogXCInXCJcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbiAgdmFyIGZyZWVQYXJzZUZsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICAgIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbiAgLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG4gIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH0oKSk7XG5cbiAgLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIG5vZGVJc0FycmF5QnVmZmVyID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNBcnJheUJ1ZmZlcixcbiAgICAgIG5vZGVJc0RhdGUgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0RhdGUsXG4gICAgICBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcCxcbiAgICAgIG5vZGVJc1JlZ0V4cCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzUmVnRXhwLFxuICAgICAgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQsXG4gICAgICBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBrZXktdmFsdWUgYHBhaXJgIHRvIGBtYXBgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwYWlyIFRoZSBrZXktdmFsdWUgcGFpciB0byBhZGQuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG1hcGAuXG4gICAqL1xuICBmdW5jdGlvbiBhZGRNYXBFbnRyeShtYXAsIHBhaXIpIHtcbiAgICAvLyBEb24ndCByZXR1cm4gYG1hcC5zZXRgIGJlY2F1c2UgaXQncyBub3QgY2hhaW5hYmxlIGluIElFIDExLlxuICAgIG1hcC5zZXQocGFpclswXSwgcGFpclsxXSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGB2YWx1ZWAgdG8gYHNldGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZC5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgc2V0YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFNldEVudHJ5KHNldCwgdmFsdWUpIHtcbiAgICAvLyBEb24ndCByZXR1cm4gYHNldC5hZGRgIGJlY2F1c2UgaXQncyBub3QgY2hhaW5hYmxlIGluIElFIDExLlxuICAgIHNldC5hZGQodmFsdWUpO1xuICAgIHJldHVybiBzZXQ7XG4gIH1cblxuICAvKipcbiAgICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgIH1cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsXG4gICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICAgIHZhciByZXN1bHQ7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlSW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVhbmAgYW5kIGBfLm1lYW5CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gICAqIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXlcbiAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGJhc2VDbG9uZSwgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgICAgIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zVG9gIHdoaWNoIGFjY2VwdHMgYHByb3BzYCB0byBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHNvdXJjZVtrZXldLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICogdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ldmVyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICAgICAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgICAgIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgICAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmICghKHNlZW5cbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYXBwbHkoZnVuYywgb2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcnJheUJ1ZmZlclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gZGF0ZVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICAgICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gICAgICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgICAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICAgICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2FtZVRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgc3JjVmFsdWUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCAoc3JjSW5kZXggJiYgaXNGdW5jdGlvbihvYmpWYWx1ZSkpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMubGVuZ3RoID8gaXRlcmF0ZWVzIDogW2lkZW50aXR5XSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcblxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VNYXAoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24ob2JqZWN0LCBvdGhlcikge1xuICAgICAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5waWNrYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgIGBfLnBpY2tCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuXG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIHBhdGgpKSB7XG4gICAgICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEFsbEJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAgICogc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4T2YgPSBjb21wYXJhdG9yID8gYmFzZUluZGV4T2ZXaXRoIDogYmFzZUluZGV4T2YsXG4gICAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHNlZW4gPSBhcnJheTtcblxuICAgICAgaWYgKGFycmF5ID09PSB2YWx1ZXMpIHtcbiAgICAgICAgdmFsdWVzID0gY29weUFycmF5KHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgc2VlbiA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBmcm9tSW5kZXggPSAwLFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbUluZGV4ID0gaW5kZXhPZihzZWVuLCBjb21wdXRlZCwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSkgPiAtMSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSBhcnJheSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoc2VlbiwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGZyb21JbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIGluZGV4ZXMgb3IgY2FwdHVyaW5nIHRoZSByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGluZGV4ZXMgVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA/IGluZGV4ZXMubGVuZ3RoIDogMCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBpZiAobGVuZ3RoID09IGxhc3RJbmRleCB8fCBpbmRleCAhPT0gcHJldmlvdXMpIHtcbiAgICAgICAgICB2YXIgcHJldmlvdXMgPSBpbmRleDtcbiAgICAgICAgICBpZiAoaXNJbmRleChpbmRleCkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBpbmRleCwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VVbnNldChhcnJheSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmRvbWAgd2l0aG91dCBzdXBwb3J0IGZvciByZXR1cm5pbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93ZXIgVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcikge1xuICAgICAgcmV0dXJuIGxvd2VyICsgbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkgKiAodXBwZXIgLSBsb3dlciArIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5nZWAgYW5kIGBfLnJhbmdlUmlnaHRgIHdoaWNoIGRvZXNuJ3RcbiAgICAgKiBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgobmF0aXZlQ2VpbCgoZW5kIC0gc3RhcnQpIC8gKHN0ZXAgfHwgMSkpLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgcmVzdWx0W2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ICs9IHN0ZXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlcGVhdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLCBuKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICBpZiAoIXN0cmluZyB8fCBuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgLy8gTGV2ZXJhZ2UgdGhlIGV4cG9uZW50aWF0aW9uIGJ5IHNxdWFyaW5nIGFsZ29yaXRobSBmb3IgYSBmYXN0ZXIgcmVwZWF0LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V4cG9uZW50aWF0aW9uX2J5X3NxdWFyaW5nIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChuICUgMikge1xuICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgbiA9IG5hdGl2ZUZsb29yKG4gLyAyKTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICBzdHJpbmcgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChuKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGFycmF5U2FtcGxlKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlU2l6ZWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuKSB7XG4gICAgICB2YXIgYXJyYXkgPSB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoYXJyYXksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfVxuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICAgICAgbmVzdGVkID0gb2JqZWN0O1xuXG4gICAgICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pLFxuICAgICAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgdmFyIG9ialZhbHVlID0gbmVzdGVkW2tleV07XG4gICAgICAgICAgbmV3VmFsdWUgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihvYmpWYWx1ZSwga2V5LCBuZXN0ZWQpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGlzT2JqZWN0KG9ialZhbHVlKVxuICAgICAgICAgICAgICA/IG9ialZhbHVlXG4gICAgICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldERhdGFgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldERhdGEgPSAhbWV0YU1hcCA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgZGF0YSkge1xuICAgICAgbWV0YU1hcC5zZXQoZnVuYywgZGF0YSk7XG4gICAgICByZXR1cm4gZnVuYztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zaHVmZmxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zbGljZWAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IHN0YXJ0ID4gZW5kID8gMCA6ICgoZW5kIC0gc3RhcnQpID4+PiAwKTtcbiAgICAgIHN0YXJ0ID4+Pj0gMDtcblxuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbaW5kZXggKyBzdGFydF07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvbWVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gIXJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZEluZGV4YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4YCB3aGljaFxuICAgICAqIHBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBvZiBgYXJyYXlgIHRvIGRldGVybWluZSB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gbG93IDogYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09PSB2YWx1ZSAmJiBoaWdoIDw9IEhBTEZfTUFYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDEsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gYXJyYXlbbWlkXTtcblxuICAgICAgICAgIGlmIChjb21wdXRlZCAhPT0gbnVsbCAmJiAhaXNTeW1ib2woY29tcHV0ZWQpICYmXG4gICAgICAgICAgICAgIChyZXRIaWdoZXN0ID8gKGNvbXB1dGVkIDw9IHZhbHVlKSA6IChjb21wdXRlZCA8IHZhbHVlKSkpIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWdoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaWRlbnRpdHksIHJldEhpZ2hlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZEluZGV4QnlgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhCeWBcbiAgICAgKiB3aGljaCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGVcbiAgICAgKiB0aGVpciBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpLFxuICAgICAgICAgIHZhbElzVW5kZWZpbmVkID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IG5hdGl2ZUZsb29yKChsb3cgKyBoaWdoKSAvIDIpLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSxcbiAgICAgICAgICAgIG90aElzRGVmaW5lZCA9IGNvbXB1dGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBjb21wdXRlZCA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gY29tcHV0ZWQgPT09IGNvbXB1dGVkLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7XG5cbiAgICAgICAgaWYgKHZhbElzTmFOKSB7XG4gICAgICAgICAgdmFyIHNldExvdyA9IHJldEhpZ2hlc3QgfHwgb3RoSXNSZWZsZXhpdmU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiAocmV0SGlnaGVzdCB8fCBvdGhJc0RlZmluZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzTnVsbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNOdWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAhb3RoSXNOdWxsICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc1N5bWJvbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3RoSXNOdWxsIHx8IG90aElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldExvdykge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZU1pbihoaWdoLCBNQVhfQVJSQVlfSU5ERVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZFVuaXFgIGFuZCBgXy5zb3J0ZWRVbmlxQnlgIHdpdGhvdXRcbiAgICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWVxKGNvbXB1dGVkLCBzZWVuKSkge1xuICAgICAgICAgIHZhciBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAgICAgKiBjb252ZXJzaW9ucyBvZiBiaW5hcnksIGhleGFkZWNpbWFsLCBvciBvY3RhbCBzdHJpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAgICAgKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgICAgICBpZiAoc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51cGRhdGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHJldHVybiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdXBkYXRlcihiYXNlR2V0KG9iamVjdCwgcGF0aCkpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZHJvcFdoaWxlYCBhbmQgYF8udGFrZVdoaWxlYFxuICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRHJvcF0gU3BlY2lmeSBkcm9wcGluZyBlbGVtZW50cyBpbnN0ZWFkIG9mIHRha2luZyB0aGVtLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkgJiZcbiAgICAgICAgcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge31cblxuICAgICAgcmV0dXJuIGlzRHJvcFxuICAgICAgICA/IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IDAgOiBpbmRleCksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiBsZW5ndGgpKVxuICAgICAgICA6IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IDApLCAoZnJvbVJpZ2h0ID8gbGVuZ3RoIDogaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2ZcbiAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2hcbiAgICAgKiBzdWNjZXNzaXZlIGFjdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykge1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsIGZ1bmN0aW9uKHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpO1xuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ueG9yYCwgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWG9yKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VVbmlxKGFycmF5c1swXSkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpbmRleF0sXG4gICAgICAgICAgICBvdGhJbmRleCA9IC0xO1xuXG4gICAgICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKG90aEluZGV4ICE9IGluZGV4KSB7XG4gICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gYmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XSB8fCBhcnJheSwgYXJyYXlzW290aEluZGV4XSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uemlwT2JqZWN0YCB3aGljaCBhc3NpZ25zIHZhbHVlcyB1c2luZyBgYXNzaWduRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2lnbkZ1bmMocmVzdWx0LCBwcm9wc1tpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgYGJhc2VSZXN0YCBhbGlhcyB3aGljaCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBgaWRlbnRpdHlgIGJ5IG1vZHVsZVxuICAgICAqIHJlcGxhY2VtZW50IHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHZhciBjYXN0UmVzdCA9IGJhc2VSZXN0O1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gICAgICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgY2xlYXJUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vY2xlYXJUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ8T2JqZWN0fSBpZCBUaGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3Qgb2YgdGhlIHRpbWVyIHRvIGNsZWFyLlxuICAgICAqL1xuICAgIHZhciBjbGVhclRpbWVvdXQgPSBjdHhDbGVhclRpbWVvdXQgfHwgZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiByb290LmNsZWFyVGltZW91dChpZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICBidWZmZXIuY29weShyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgbWFwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNsb25lRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2xvbmUgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIG1hcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZU1hcChtYXAsIGlzRGVlcCwgY2xvbmVGdW5jKSB7XG4gICAgICB2YXIgYXJyYXkgPSBpc0RlZXAgPyBjbG9uZUZ1bmMobWFwVG9BcnJheShtYXApLCBDTE9ORV9ERUVQX0ZMQUcpIDogbWFwVG9BcnJheShtYXApO1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRNYXBFbnRyeSwgbmV3IG1hcC5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHJlZ2V4cC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTtcbiAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjbG9uZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNsb25lIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzZXQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVTZXQoc2V0LCBpc0RlZXAsIGNsb25lRnVuYykge1xuICAgICAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKHNldFRvQXJyYXkoc2V0KSwgQ0xPTkVfREVFUF9GTEFHKSA6IHNldFRvQXJyYXkoc2V0KTtcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhcnJheSwgYWRkU2V0RW50cnksIG5ldyBzZXQuY29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24pIHtcbiAgICAgICAgICAvLyBTaGlmdCB3aXRoIGV4cG9uZW50aWFsIG5vdGF0aW9uIHRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGlzc3Vlcy5cbiAgICAgICAgICAvLyBTZWUgW01ETl0oaHR0cHM6Ly9tZG4uaW8vcm91bmQjRXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgdmFyIHBhaXIgPSAodG9TdHJpbmcobnVtYmVyKSArICdlJykuc3BsaXQoJ2UnKSxcbiAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gKyBwcmVjaXNpb24pKTtcblxuICAgICAgICAgIHBhaXIgPSAodG9TdHJpbmcodmFsdWUpICsgJ2UnKS5zcGxpdCgnZScpO1xuICAgICAgICAgIHJldHVybiArKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gLSBwcmVjaXNpb24pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuYyhudW1iZXIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAgICAgKi9cbiAgICB2YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLnRvUGFpcnNgIG9yIGBfLnRvUGFpcnNJbmAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFpcnMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlVG9QYWlycyhrZXlzRnVuYykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgdGFnID0gZ2V0VGFnKG9iamVjdCk7XG4gICAgICAgIGlmICh0YWcgPT0gbWFwVGFnKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcFRvQXJyYXkob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnID09IHNldFRhZykge1xuICAgICAgICAgIHJldHVybiBzZXRUb1BhaXJzKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VUb1BhaXJzKG9iamVjdCwga2V5c0Z1bmMob2JqZWN0KSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAgICAgKiBgdGhpc2AgYmluZGluZyBhbmQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgICAxIC0gYF8uYmluZGBcbiAgICAgKiAgICAyIC0gYF8uYmluZEtleWBcbiAgICAgKiAgICA0IC0gYF8uY3VycnlgIG9yIGBfLmN1cnJ5UmlnaHRgIG9mIGEgYm91bmQgZnVuY3Rpb25cbiAgICAgKiAgICA4IC0gYF8uY3VycnlgXG4gICAgICogICAxNiAtIGBfLmN1cnJ5UmlnaHRgXG4gICAgICogICAzMiAtIGBfLnBhcnRpYWxgXG4gICAgICogICA2NCAtIGBfLnBhcnRpYWxSaWdodGBcbiAgICAgKiAgMTI4IC0gYF8ucmVhcmdgXG4gICAgICogIDI1NiAtIGBfLmFyeWBcbiAgICAgKiAgNTEyIC0gYF8uZmxpcGBcbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgICAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gICAgICBhcml0eSA9IGFyaXR5ID09PSB1bmRlZmluZWQgPyBhcml0eSA6IHRvSW50ZWdlcihhcml0eSk7XG4gICAgICBsZW5ndGggLT0gaG9sZGVycyA/IGhvbGRlcnMubGVuZ3RoIDogMDtcblxuICAgICAgaWYgKGJpdG1hc2sgJiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRykge1xuICAgICAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICAgICAgaG9sZGVyc1JpZ2h0ID0gaG9sZGVycztcblxuICAgICAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB2YXIgZGF0YSA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGdldERhdGEoZnVuYyk7XG5cbiAgICAgIHZhciBuZXdEYXRhID0gW1xuICAgICAgICBmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LFxuICAgICAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgICAgIF07XG5cbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIG1lcmdlRGF0YShuZXdEYXRhLCBkYXRhKTtcbiAgICAgIH1cbiAgICAgIGZ1bmMgPSBuZXdEYXRhWzBdO1xuICAgICAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gICAgICB0aGlzQXJnID0gbmV3RGF0YVsyXTtcbiAgICAgIHBhcnRpYWxzID0gbmV3RGF0YVszXTtcbiAgICAgIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICAgICAgYXJpdHkgPSBuZXdEYXRhWzldID0gbmV3RGF0YVs5XSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gKGlzQmluZEtleSA/IDAgOiBmdW5jLmxlbmd0aClcbiAgICAgICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgICAgIGlmICghYXJpdHkgJiYgYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO1xuICAgICAgfVxuICAgICAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gICAgICB9IGVsc2UgaWYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgICAgIH0gZWxzZSBpZiAoKGJpdG1hc2sgPT0gV1JBUF9QQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRykpICYmICFob2xkZXJzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZC5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgdmFyIHNldHRlciA9IGRhdGEgPyBiYXNlU2V0RGF0YSA6IHNldERhdGE7XG4gICAgICByZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHNldHRlcihyZXN1bHQsIG5ld0RhdGEpLCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzYCB0byBjdXN0b21pemUgaXRzIGBfLmFzc2lnbkluYCB1c2UgdG8gYXNzaWduIHByb3BlcnRpZXNcbiAgICAgKiBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllc1xuICAgICAqIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEob2JqVmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgcmV0dXJuIHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNEZWVwYCB0byBjdXN0b21pemUgaXRzIGBfLm1lcmdlYCB1c2UgdG8gbWVyZ2Ugc291cmNlXG4gICAgICogb2JqZWN0cyBpbnRvIGRlc3RpbmF0aW9uIG9iamVjdHMgdGhhdCBhcmUgcGFzc2VkIHRocnUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBzcmNWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qob2JqVmFsdWUpICYmIGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBvYmpWYWx1ZSk7XG4gICAgICAgIGJhc2VNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSwgc3RhY2spO1xuICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gICAgICogb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21PbWl0Q2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgYXJyYXlzIHdpdGggc3VwcG9ydCBmb3JcbiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYGFycmF5YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhlci5sZW5ndGg7XG5cbiAgICAgIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgaWYgKHN0YWNrZWQgJiYgc3RhY2suZ2V0KG90aGVyKSkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICAgICAgc2VlbiA9IChiaXRtYXNrICYgQ09NUEFSRV9VTk9SREVSRURfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHN0YWNrLnNldChhcnJheSwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgICAgIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICghY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8XG4gICAgICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gICAgICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBjYXNlIGJvb2xUYWc6XG4gICAgICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgICAgICBjYXNlIG1hcFRhZzpcbiAgICAgICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgICAgIG9ialByb3BzID0gZ2V0QWxsS2V5cyhvYmplY3QpLFxuICAgICAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcblxuICAgICAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjbG9uZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNsb25lIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBjbG9uZUZ1bmMsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lTWFwKG9iamVjdCwgaXNEZWVwLCBjbG9uZUZ1bmMpO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVTZXQob2JqZWN0LCBpc0RlZXAsIGNsb25lRnVuYyk7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG4gICAgICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCByZUlzVWludC50ZXN0KHZhbHVlKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHJlTGVhZGluZ0RvdC50ZXN0KHN0cmluZykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goJycpO1xuICAgICAgfVxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN0cmluZykge1xuICAgICAgICByZXN1bHQucHVzaChxdW90ZSA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgICAgIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgd3JhcHBlciBgZGV0YWlsc2AgYmFzZWQgb24gYGJpdG1hc2tgIGZsYWdzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXcmFwRGV0YWlscyhkZXRhaWxzLCBiaXRtYXNrKSB7XG4gICAgICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICdfLicgKyBwYWlyWzBdO1xuICAgICAgICBpZiAoKGJpdG1hc2sgJiBwYWlyWzFdKSAmJiAhYXJyYXlJbmNsdWRlcyhkZXRhaWxzLCB2YWx1ZSkpIHtcbiAgICAgICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHdyYXBwZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gd3JhcHBlciBUaGUgd3JhcHBlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgd3JhcHBlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcikge1xuICAgICAgaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXR1cm4gd3JhcHBlci5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sIHdyYXBwZXIuX19jaGFpbl9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh3cmFwcGVyLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2luZGV4X18gID0gd3JhcHBlci5fX2luZGV4X187XG4gICAgICByZXN1bHQuX192YWx1ZXNfXyA9IHdyYXBwZXIuX192YWx1ZXNfXztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cyBzcGxpdCBpbnRvIGdyb3VwcyB0aGUgbGVuZ3RoIG9mIGBzaXplYC5cbiAgICAgKiBJZiBgYXJyYXlgIGNhbid0IGJlIHNwbGl0IGV2ZW5seSwgdGhlIGZpbmFsIGNodW5rIHdpbGwgYmUgdGhlIHJlbWFpbmluZ1xuICAgICAqIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIFRoZSBsZW5ndGggb2YgZWFjaCBjaHVua1xuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY2h1bmtzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAyKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWydjJywgJ2QnXV1cbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDMpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYicsICdjJ10sIFsnZCddXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNodW5rKGFycmF5LCBzaXplLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzaXplLCBndWFyZCkgOiBzaXplID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHNpemUgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSA9IG5hdGl2ZU1heCh0b0ludGVnZXIoc2l6ZSksIDApO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobmF0aXZlQ2VpbChsZW5ndGggLyBzaXplKSk7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBiYXNlU2xpY2UoYXJyYXksIGluZGV4LCAoaW5kZXggKz0gc2l6ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHdpdGggYWxsIGZhbHNleSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIHZhbHVlcyBgZmFsc2VgLCBgbnVsbGAsXG4gICAgICogYDBgLCBgXCJcImAsIGB1bmRlZmluZWRgLCBhbmQgYE5hTmAgYXJlIGZhbHNleS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb21wYWN0KFswLCAxLCBmYWxzZSwgMiwgJycsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYWN0KGFycmF5KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBhcnJheSBjb25jYXRlbmF0aW5nIGBhcnJheWAgd2l0aCBhbnkgYWRkaXRpb25hbCBhcnJheXNcbiAgICAgKiBhbmQvb3IgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBjb25jYXRlbmF0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNvbmNhdChhcnJheSwgMiwgWzNdLCBbWzRdXSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvdGhlcik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25jYXQoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoIC0gMSksXG4gICAgICAgICAgYXJyYXkgPSBhcmd1bWVudHNbMF0sXG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIGFyZ3NbaW5kZXggLSAxXSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpID8gY29weUFycmF5KGFycmF5KSA6IFthcnJheV0sIGJhc2VGbGF0dGVuKGFyZ3MsIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGBhcnJheWAgdmFsdWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLndpdGhvdXQsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZShbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2UgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsQnlgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sIFt7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZUJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIG9yZGVyIGFuZFxuICAgICAqIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yXG4gICAgICogaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxXaXRoYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZVdpdGgob2JqZWN0cywgW3sgJ3gnOiAxLCAneSc6IDIgfV0sIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZVdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChjb21wYXJhdG9yKSkge1xuICAgICAgICBjb21wYXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbHMgZWxlbWVudHMgb2YgYGFycmF5YCB3aXRoIGB2YWx1ZWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90XG4gICAgICogaW5jbHVkaW5nLCBgZW5kYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8uZmlsbChhcnJheSwgJ2EnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydhJywgJ2EnLCAnYSddXG4gICAgICpcbiAgICAgKiBfLmZpbGwoQXJyYXkoMyksIDIpO1xuICAgICAqIC8vID0+IFsyLCAyLCAyXVxuICAgICAqXG4gICAgICogXy5maWxsKFs0LCA2LCA4LCAxMF0sICcqJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzQsICcqJywgJyonLCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ICYmIHR5cGVvZiBzdGFydCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgdmFsdWUsIHN0YXJ0KSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAqIG9mIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAncGViYmxlcyc7IH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggPCAwXG4gICAgICAgICAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApXG4gICAgICAgICAgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVlcChbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0LCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIElORklOSVRZKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYGFycmF5YCB1cCB0byBgZGVwdGhgIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgWzIsIFszLCBbNF1dLCA1XV07XG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlcHRoKGFycmF5LCBkZXB0aCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy50b1BhaXJzYDsgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBvYmplY3QgY29tcG9zZWRcbiAgICAgKiBmcm9tIGtleS12YWx1ZSBgcGFpcnNgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZyb21QYWlycyhbWydhJywgMV0sIFsnYicsIDJdXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBhaXJzKHBhaXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYWlycyA9PSBudWxsID8gMCA6IHBhaXJzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgIHJlc3VsdFtwYWlyWzBdXSA9IHBhaXJbMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBmaXJzdFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmhlYWQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmhlYWQoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhlYWQoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGFycmF5WzBdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzIHRoZVxuICAgICAqIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdGlhbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMCwgLTEpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGFsbCBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb24oWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsyXVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25CeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5pbnRlcnNlY3Rpb25CeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBpZiAoaXRlcmF0ZWUgPT09IGxhc3QobWFwcGVkKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcHBlZC5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXNcbiAgICAgKiBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3IgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIG1hcHBlZC5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYWxsIGVsZW1lbnRzIGluIGBhcnJheWAgaW50byBhIHN0cmluZyBzZXBhcmF0ZWQgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj0nLCddIFRoZSBlbGVtZW50IHNlcGFyYXRvci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBqb2luZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmpvaW4oWydhJywgJ2InLCAnYyddLCAnficpO1xuICAgICAqIC8vID0+ICdhfmJ+YydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBqb2luKGFycmF5LCBzZXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gJycgOiBuYXRpdmVKb2luLmNhbGwoYXJyYXksIHNlcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBhcnJheWAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gaW5kZXggPCAwID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKSA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgICAgID8gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleClcbiAgICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGluZGV4LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBlbGVtZW50IGF0IGluZGV4IGBuYCBvZiBgYXJyYXlgLiBJZiBgbmAgaXMgbmVnYXRpdmUsIHRoZSBudGhcbiAgICAgKiBlbGVtZW50IGZyb20gdGhlIGVuZCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjExLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqXG4gICAgICogXy5udGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogXy5udGgoYXJyYXksIC0yKTtcbiAgICAgKiAvLyA9PiAnYyc7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbnRoKGFycmF5LCBuKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlTnRoKGFycmF5LCB0b0ludGVnZXIobikpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGdpdmVuIHZhbHVlcyBmcm9tIGBhcnJheWAgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ud2l0aG91dGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnJlbW92ZWBcbiAgICAgKiB0byByZW1vdmUgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSBwcmVkaWNhdGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnYScsICdiJywgJ2MnXTtcbiAgICAgKlxuICAgICAqIF8ucHVsbChhcnJheSwgJ2EnLCAnYycpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgdmFyIHB1bGwgPSBiYXNlUmVzdChwdWxsQWxsKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnYScsICdiJywgJ2MnXTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbChhcnJheSwgWydhJywgJ2MnXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlQnlgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMyB9LCB7ICd4JzogMSB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbEJ5KGFycmF5LCBbeyAneCc6IDEgfSwgeyAneCc6IDMgfV0sICd4Jyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIGNvbXBhcmF0b3IgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZVdpdGhgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDMsICd5JzogNCB9LCB7ICd4JzogNSwgJ3knOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsV2l0aChhcnJheSwgW3sgJ3gnOiAzLCAneSc6IDQgfV0sIF8uaXNFcXVhbCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiA1LCAneSc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSwgdmFsdWVzLCBjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBlbGVtZW50cyBmcm9tIGBhcnJheWAgY29ycmVzcG9uZGluZyB0byBgaW5kZXhlc2AgYW5kIHJldHVybnMgYW5cbiAgICAgKiBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5hdGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gW2luZGV4ZXNdIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKiB2YXIgcHVsbGVkID0gXy5wdWxsQXQoYXJyYXksIFsxLCAzXSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydhJywgJ2MnXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocHVsbGVkKTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnZCddXG4gICAgICovXG4gICAgdmFyIHB1bGxBdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYmFzZUF0KGFycmF5LCBpbmRleGVzKTtcblxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgYXJyYXlNYXAoaW5kZXhlcywgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGlzSW5kZXgoaW5kZXgsIGxlbmd0aCkgPyAraW5kZXggOiBpbmRleDtcbiAgICAgIH0pLnNvcnQoY29tcGFyZUFzY2VuZGluZykpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBgYXJyYXlgIHRoYXQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yXG4gICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmZpbHRlcmAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnB1bGxgXG4gICAgICogdG8gcHVsbCBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHZhbHVlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDRdO1xuICAgICAqIHZhciBldmVucyA9IF8ucmVtb3ZlKGFycmF5LCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGV2ZW5zKTtcbiAgICAgKiAvLyA9PiBbMiwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICBpbmRleGVzLnB1c2goaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgYGFycmF5YCBzbyB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGJlY29tZXMgdGhlIGxhc3QsIHRoZSBzZWNvbmRcbiAgICAgKiBlbGVtZW50IGJlY29tZXMgdGhlIHNlY29uZCB0byBsYXN0LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgIGFuZCBpcyBiYXNlZCBvblxuICAgICAqIFtgQXJyYXkjcmV2ZXJzZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3JldmVyc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5yZXZlcnNlKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXZlcnNlKGFycmF5KSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/IGFycmF5IDogbmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgKiBbYEFycmF5I3NsaWNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvc2xpY2UpIHRvIGVuc3VyZSBkZW5zZSBhcnJheXMgYXJlXG4gICAgICogcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAmJiB0eXBlb2YgZW5kICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzdGFydCwgZW5kKSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZXMgYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSB0aGUgbG93ZXN0IGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleChbMzAsIDUwXSwgNDApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4T2YoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCAmJiBlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGhpZ2hlc3RcbiAgICAgKiBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG9cbiAgICAgKiBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4KFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZExhc3RJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubGFzdEluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4T2YoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpIC0gMTtcbiAgICAgICAgaWYgKGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZFVuaXEoWzEsIDEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFCeWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZFVuaXFCeShbMS4xLCAxLjIsIDIuMywgMi40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMSwgMi4zXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRhaWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWlsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAxLCBsZW5ndGgpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZShhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC4gRWxlbWVudHMgYXJlXG4gICAgICogdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGZhbHNlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLiBFbGVtZW50c1xuICAgICAqIGFyZSB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb20gdGhlIGZpcnN0XG4gICAgICogYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaW9uQnkoWzIuMV0sIFsxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjEsIDEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udW5pb25CeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbVxuICAgICAqIHRoZSBmaXJzdCBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy51bmlvbldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpO1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgYW4gYXJyYXksIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGluIHdoaWNoIG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBlbGVtZW50XG4gICAgICogaXMga2VwdC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1clxuICAgICAqIGluIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXEoWzIsIDEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgICAqIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXFCeShbMi4xLCAxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjEsIDEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udW5pcUJ5KFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS5UaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy51bmlxV2l0aChvYmplY3RzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxV2l0aChhcnJheSwgY29tcGFyYXRvcikge1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIHVuZGVmaW5lZCwgY29tcGFyYXRvcikgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiBncm91cGVkXG4gICAgICogZWxlbWVudHMgYW5kIGNyZWF0ZXMgYW4gYXJyYXkgcmVncm91cGluZyB0aGUgZWxlbWVudHMgdG8gdGhlaXIgcHJlLXppcFxuICAgICAqIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwKHppcHBlZCk7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcChhcnJheSkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gMDtcbiAgICAgIGFycmF5ID0gYXJyYXlGaWx0ZXIoYXJyYXksIGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChncm91cCkpIHtcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoZ3JvdXAubGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBiYXNlVGltZXMobGVuZ3RoLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gYXJyYXlNYXAoYXJyYXksIGJhc2VQcm9wZXJ0eShpbmRleCkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgcmVncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gICAgICogZWxlbWVudHMgb2YgZWFjaCBncm91cDogKC4uLmdyb3VwKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIHJlZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSk7XG4gICAgICogLy8gPT4gW1sxLCAxMCwgMTAwXSwgWzIsIDIwLCAyMDBdXVxuICAgICAqXG4gICAgICogXy51bnppcFdpdGgoemlwcGVkLCBfLmFkZCk7XG4gICAgICogLy8gPT4gWzMsIDMwLCAzMDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXBXaXRoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdW56aXAoYXJyYXkpO1xuICAgICAgaWYgKGl0ZXJhdGVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheU1hcChyZXN1bHQsIGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgICAgIHJldHVybiBhcHBseShpdGVyYXRlZSwgdW5kZWZpbmVkLCBncm91cCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgZ2l2ZW4gdmFsdWVzIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndpdGhvdXQoWzIsIDEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKi9cbiAgICB2YXIgd2l0aG91dCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgaXMgdGhlXG4gICAgICogW3N5bW1ldHJpYyBkaWZmZXJlbmNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TeW1tZXRyaWNfZGlmZmVyZW5jZSlcbiAgICAgKiBvZiB0aGUgZ2l2ZW4gYXJyYXlzLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlclxuICAgICAqIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ud2l0aG91dFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnhvcihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICovXG4gICAgdmFyIHhvciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkXG4gICAgICogYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmVcbiAgICAgKiBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnhvckJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjIsIDMuNF1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ueG9yQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHhvckJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy54b3JXaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHhvcldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpO1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMsIHRoZSBmaXJzdCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBmaXJzdCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCB0aGUgc2Vjb25kIG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIHNlY29uZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKi9cbiAgICB2YXIgemlwID0gYmFzZVJlc3QodW56aXApO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mcm9tUGFpcnNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgdHdvIGFycmF5cyxcbiAgICAgKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBPYmplY3QoWydhJywgJ2InXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwT2JqZWN0YCBleGNlcHQgdGhhdCBpdCBzdXBwb3J0cyBwcm9wZXJ0eSBwYXRocy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBPYmplY3REZWVwKFsnYS5iWzBdLmMnLCAnYS5iWzFdLmQnXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IFt7ICdjJzogMSB9LCB7ICdkJzogMiB9XSB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGJhc2VTZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyBncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gICAgICogZWxlbWVudHMgb2YgZWFjaCBncm91cDogKC4uLmdyb3VwKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBXaXRoKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0sIGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBhICsgYiArIGM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzExMSwgMjIyXVxuICAgICAqL1xuICAgIHZhciB6aXBXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBpdGVyYXRlZSA9IGxlbmd0aCA+IDEgPyBhcnJheXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGl0ZXJhdGVlID0gdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgPyAoYXJyYXlzLnBvcCgpLCBpdGVyYXRlZSkgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdW56aXBXaXRoKGFycmF5cywgaXRlcmF0ZWUpO1xuICAgIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UgdGhhdCB3cmFwcyBgdmFsdWVgIHdpdGggZXhwbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuIFRoZSByZXN1bHQgb2Ygc3VjaCBzZXF1ZW5jZXMgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiB2YXIgeW91bmdlc3QgPSBfXG4gICAgICogICAuY2hhaW4odXNlcnMpXG4gICAgICogICAuc29ydEJ5KCdhZ2UnKVxuICAgICAqICAgLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICogICAgIHJldHVybiBvLnVzZXIgKyAnIGlzICcgKyBvLmFnZTtcbiAgICAgKiAgIH0pXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcyBpcyAxJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNoYWluKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoKHZhbHVlKTtcbiAgICAgIHJlc3VsdC5fX2NoYWluX18gPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIGBpbnRlcmNlcHRvcmAgYW5kIHJldHVybnMgYHZhbHVlYC4gVGhlIGludGVyY2VwdG9yXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG9cbiAgICAgKiBcInRhcCBpbnRvXCIgYSBtZXRob2QgY2hhaW4gc2VxdWVuY2UgaW4gb3JkZXIgdG8gbW9kaWZ5IGludGVybWVkaWF0ZSByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKVxuICAgICAqICAudGFwKGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICogICAgLy8gTXV0YXRlIGlucHV0IGFycmF5LlxuICAgICAqICAgIGFycmF5LnBvcCgpO1xuICAgICAqICB9KVxuICAgICAqICAucmV2ZXJzZSgpXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhcCh2YWx1ZSwgaW50ZXJjZXB0b3IpIHtcbiAgICAgIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnRhcGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gXCJwYXNzIHRocnVcIiB2YWx1ZXMgcmVwbGFjaW5nIGludGVybWVkaWF0ZVxuICAgICAqIHJlc3VsdHMgaW4gYSBtZXRob2QgY2hhaW4gc2VxdWVuY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKCcgIGFiYyAgJylcbiAgICAgKiAgLmNoYWluKClcbiAgICAgKiAgLnRyaW0oKVxuICAgICAqICAudGhydShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgIHJldHVybiBbdmFsdWVdO1xuICAgICAqICB9KVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhydSh2YWx1ZSwgaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJldHVybiBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5hdGAuXG4gICAgICpcbiAgICAgKiBAbmFtZSBhdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gICAgICpcbiAgICAgKiBfKG9iamVjdCkuYXQoWydhWzBdLmIuYycsICdhWzFdJ10pLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIHdyYXBwZXJBdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHN0YXJ0ID0gbGVuZ3RoID8gcGF0aHNbMF0gOiAwLFxuICAgICAgICAgIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKG9iamVjdCkgeyByZXR1cm4gYmFzZUF0KG9iamVjdCwgcGF0aHMpOyB9O1xuXG4gICAgICBpZiAobGVuZ3RoID4gMSB8fCB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCB8fFxuICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikgfHwgIWlzSW5kZXgoc3RhcnQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydCwgK3N0YXJ0ICsgKGxlbmd0aCA/IDEgOiAwKSk7XG4gICAgICB2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgJ2Z1bmMnOiB0aHJ1LFxuICAgICAgICAnYXJncyc6IFtpbnRlcmNlcHRvcl0sXG4gICAgICAgICd0aGlzQXJnJzogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSwgdGhpcy5fX2NoYWluX18pLnRocnUoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgICAgaWYgKGxlbmd0aCAmJiAhYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXkucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2Ugd2l0aCBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjaGFpblxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGhvdXQgZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycykuaGVhZCgpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKVxuICAgICAqICAgLmNoYWluKClcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC5waWNrKCd1c2VyJylcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNoYWluKCkge1xuICAgICAgcmV0dXJuIGNoYWluKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSBhbmQgcmV0dXJucyB0aGUgd3JhcHBlZCByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjb21taXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDJdO1xuICAgICAqIHZhciB3cmFwcGVkID0gXyhhcnJheSkucHVzaCgzKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQgPSB3cmFwcGVkLmNvbW1pdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubGFzdCgpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ29tbWl0KCkge1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHRoaXMudmFsdWUoKSwgdGhpcy5fX2NoYWluX18pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5leHQgdmFsdWUgb24gYSB3cmFwcGVkIG9iamVjdCBmb2xsb3dpbmcgdGhlXG4gICAgICogW2l0ZXJhdG9yIHByb3RvY29sXShodHRwczovL21kbi5pby9pdGVyYXRpb25fcHJvdG9jb2xzI2l0ZXJhdG9yKS5cbiAgICAgKlxuICAgICAqIEBuYW1lIG5leHRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXh0IGl0ZXJhdG9yIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMSB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDIgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IHRydWUsICd2YWx1ZSc6IHVuZGVmaW5lZCB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlck5leHQoKSB7XG4gICAgICBpZiAodGhpcy5fX3ZhbHVlc19fID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdG9BcnJheSh0aGlzLnZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgdmFyIGRvbmUgPSB0aGlzLl9faW5kZXhfXyA+PSB0aGlzLl9fdmFsdWVzX18ubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlID0gZG9uZSA/IHVuZGVmaW5lZCA6IHRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtcblxuICAgICAgcmV0dXJuIHsgJ2RvbmUnOiBkb25lLCAndmFsdWUnOiB2YWx1ZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIHdyYXBwZXIgdG8gYmUgaXRlcmFibGUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBTeW1ib2wuaXRlcmF0b3JcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkW1N5bWJvbC5pdGVyYXRvcl0oKSA9PT0gd3JhcHBlZDtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBBcnJheS5mcm9tKHdyYXBwZWQpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJUb0l0ZXJhdG9yKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBjaGFpbiBzZXF1ZW5jZSBwbGFudGluZyBgdmFsdWVgIGFzIHRoZSB3cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgcGxhbnRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwbGFudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKS5tYXAoc3F1YXJlKTtcbiAgICAgKiB2YXIgb3RoZXIgPSB3cmFwcGVkLnBsYW50KFszLCA0XSk7XG4gICAgICpcbiAgICAgKiBvdGhlci52YWx1ZSgpO1xuICAgICAqIC8vID0+IFs5LCAxNl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgcGFyZW50ID0gdGhpcztcblxuICAgICAgd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIGJhc2VMb2Rhc2gpIHtcbiAgICAgICAgdmFyIGNsb25lID0gd3JhcHBlckNsb25lKHBhcmVudCk7XG4gICAgICAgIGNsb25lLl9faW5kZXhfXyA9IDA7XG4gICAgICAgIGNsb25lLl9fdmFsdWVzX18gPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IGNsb25lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGNsb25lO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91cyA9IGNsb25lO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX193cmFwcGVkX187XG4gICAgICB9XG4gICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLnJldmVyc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgdGhlIHdyYXBwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXZlcnNlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8oYXJyYXkpLnJldmVyc2UoKS52YWx1ZSgpXG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclJldmVyc2UoKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgdmFyIHdyYXBwZWQgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKSB7XG4gICAgICAgICAgd3JhcHBlZCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkID0gd3JhcHBlZC5yZXZlcnNlKCk7XG4gICAgICAgIHdyYXBwZWQuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICAgJ2Z1bmMnOiB0aHJ1LFxuICAgICAgICAgICdhcmdzJzogW3JldmVyc2VdLFxuICAgICAgICAgICd0aGlzQXJnJzogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCwgdGhpcy5fX2NoYWluX18pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudGhydShyZXZlcnNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyB0b0pTT04sIHZhbHVlT2ZcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlKCkge1xuICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUodGhpcy5fX3dyYXBwZWRfXywgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IHdhcyByZXR1cm5lZCBieSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvdW50QnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uY291bnRCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiAyLCAnNSc6IDEgfVxuICAgICAqL1xuICAgIHZhciBjb3VudEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICArK3Jlc3VsdFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbGwqKiBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAuXG4gICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBbZW1wdHkgY29sbGVjdGlvbnNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VtcHR5X3NldCkgYmVjYXVzZVxuICAgICAqIFtldmVyeXRoaW5nIGlzIHRydWVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhY3VvdXNfdHJ1dGgpIG9mXG4gICAgICogZWxlbWVudHMgb2YgZW1wdHkgY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmV2ZXJ5KFt0cnVlLCAxLCBudWxsLCAneWVzJ10sIEJvb2xlYW4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUV2ZXJ5IDogYmFzZUV2ZXJ5O1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5yZW1vdmVgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5yZWplY3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9Y29sbGVjdGlvbi5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgdmFyIGZpbmRMYXN0ID0gY3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlZXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgSU5GSU5JVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlcHRoKFsxLCAyXSwgZHVwbGljYXRlLCAyKTtcbiAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBkZXB0aCkge1xuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZVxuICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICAgIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXNGdW5jID8gYXBwbHkocGF0aCwgdmFsdWUsIGFyZ3MpIDogYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICAgICAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlc1xuICAgICAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICAgICAgfVxuICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleSBmb3IuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKi9cbiAgICB2YXIgcGFydGl0aW9uID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXkgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICogYW5kIGBzb3J0QnlgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICogfSwgMCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2VSaWdodCA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqIHRoYXQgYHByZWRpY2F0ZWAgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5maWx0ZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZSA6IGJhc2VTYW1wbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlXG4gICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgKiAvLyA9PiBbMiwgMywgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZVNpemUgOiBiYXNlU2FtcGxlU2l6ZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTaHVmZmxlIDogYmFzZVNodWZmbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAqIC8vID0+IDdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U29tZSA6IGJhc2VTb21lO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCA0MF0sIFsnZnJlZCcsIDQ4XV1cbiAgICAgKi9cbiAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gICAgICogfSwgXy5ub3coKSk7XG4gICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgbm93ID0gY3R4Tm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmJlZm9yZWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA8IDEpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHVwIHRvIGBuYCBhcmd1bWVudHMsXG4gICAgICogaWdub3JpbmcgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLmFyeShwYXJzZUludCwgMSkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnkoZnVuYywgbiwgZ3VhcmQpIHtcbiAgICAgIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAgICAgKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA8PSAxKSB7XG4gICAgICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIHdpdGggYHBhcnRpYWxzYFxuICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2VcbiAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gICAgICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnlSaWdodChhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgzKSgyKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMiwgMykoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAqIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICAgICAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICAgICAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxhc3RBcmdzLFxuICAgICAgICAgIGxhc3RUaGlzLFxuICAgICAgICAgIG1heFdhaXQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHRpbWVySWQsXG4gICAgICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAgICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAgICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAgICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgICAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICAgICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgICAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICAgICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgICAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgICAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgICAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gICAgICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgICAgIHJldHVybiBkZWJvdW5jZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmZXJzIGludm9raW5nIHRoZSBgZnVuY2AgdW50aWwgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMgY2xlYXJlZC4gQW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlZmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAqIH0sICdkZWZlcnJlZCcpO1xuICAgICAqIC8vID0+IExvZ3MgJ2RlZmVycmVkJyBhZnRlciBvbmUgbWlsbGlzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlZmVyID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCAxLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgYGZ1bmNgIGFmdGVyIGB3YWl0YCBtaWxsaXNlY29uZHMuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlbGF5KGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAqIH0sIDEwMDAsICdsYXRlcicpO1xuICAgICAqIC8vID0+IExvZ3MgJ2xhdGVyJyBhZnRlciBvbmUgc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWxheSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgdG9OdW1iZXIod2FpdCkgfHwgMCwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyByZXZlcnNlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZsaXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbGlwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZmxpcHBlZCA9IF8uZmxpcChmdW5jdGlvbigpIHtcbiAgICAgKiAgIHJldHVybiBfLnRvQXJyYXkoYXJndW1lbnRzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGZsaXBwZWQoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiBbJ2QnLCAnYycsICdiJywgJ2EnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsaXAoZnVuYykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9GTElQX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gICAgICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICAgICAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gICAgICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gICAgICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAgICAgKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICAgICAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gICAgICpcbiAgICAgKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHZhbHVlcyhvdGhlcik7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICpcbiAgICAgKiBvYmplY3QuYSA9IDI7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAgICAgKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqXG4gICAgICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAgICAgKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICAgICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxuICAgIG1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGBmdW5jYC4gVGhlXG4gICAgICogYGZ1bmNgIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgcHJlZGljYXRlIHRvIG5lZ2F0ZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBuZWdhdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0V2ZW4obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5maWx0ZXIoWzEsIDIsIDMsIDQsIDUsIDZdLCBfLm5lZ2F0ZShpc0V2ZW4pKTtcbiAgICAgKiAvLyA9PiBbMSwgMywgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKSB7XG4gICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcyk7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0pO1xuICAgICAgICAgIGNhc2UgMjogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICAgICAqIHRvIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uLiBUaGUgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiZWZvcmUoMiwgZnVuYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnRzIHRyYW5zZm9ybWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3RyYW5zZm9ybXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgYXJndW1lbnQgdHJhbnNmb3Jtcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZG91YmxlZChuKSB7XG4gICAgICogICByZXR1cm4gbiAqIDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckFyZ3MoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIFt4LCB5XTtcbiAgICAgKiB9LCBbc3F1YXJlLCBkb3VibGVkXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDksIDMpO1xuICAgICAqIC8vID0+IFs4MSwgNl1cbiAgICAgKlxuICAgICAqIGZ1bmMoMTAsIDUpO1xuICAgICAqIC8vID0+IFsxMDAsIDEwXVxuICAgICAqL1xuICAgIHZhciBvdmVyQXJncyA9IGNhc3RSZXN0KGZ1bmN0aW9uKGZ1bmMsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHRyYW5zZm9ybXMgPSAodHJhbnNmb3Jtcy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHRyYW5zZm9ybXNbMF0pKVxuICAgICAgICA/IGFycmF5TWFwKHRyYW5zZm9ybXNbMF0sIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSlcbiAgICAgICAgOiBhcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLCAxKSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcblxuICAgICAgdmFyIGZ1bmNzTGVuZ3RoID0gdHJhbnNmb3Jtcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihhcmdzLmxlbmd0aCwgZnVuY3NMZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSB0cmFuc2Zvcm1zW2luZGV4XS5jYWxsKHRoaXMsIGFyZ3NbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlXG4gICAgICogYXJndW1lbnRzIGl0IHJlY2VpdmVzLiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmJpbmRgIGV4Y2VwdCBpdCBkb2VzICoqbm90KipcbiAgICAgKiBhbHRlciB0aGUgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbChncmVldCwgJ2hlbGxvJyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbChncmVldCwgXywgJ2ZyZWQnKTtcbiAgICAgKiBncmVldEZyZWQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQnXG4gICAgICovXG4gICAgdmFyIHBhcnRpYWwgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWwpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFydGlhbGAgZXhjZXB0IHRoYXQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzXG4gICAgICogYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbFJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2ZyZWQnKTtcbiAgICAgKiBncmVldEZyZWQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnaGVsbG8nLCBfKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICovXG4gICAgdmFyIHBhcnRpYWxSaWdodCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbFJpZ2h0KSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyBhcnJhbmdlZCBhY2NvcmRpbmdcbiAgICAgKiB0byB0aGUgc3BlY2lmaWVkIGBpbmRleGVzYCB3aGVyZSB0aGUgYXJndW1lbnQgdmFsdWUgYXQgdGhlIGZpcnN0IGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCB0aGUgYXJndW1lbnQgdmFsdWUgYXQgdGhlIHNlY29uZCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlYXJyYW5nZSBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFyZ3VtZW50IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciByZWFyZ2VkID0gXy5yZWFyZyhmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH0sIFsyLCAwLCAxXSk7XG4gICAgICpcbiAgICAgKiByZWFyZ2VkKCdiJywgJ2MnLCAnYScpXG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgdmFyIHJlYXJnID0gZmxhdFJlc3QoZnVuY3Rpb24oZnVuYywgaW5kZXhlcykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9SRUFSR19GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBpbmRleGVzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gYW5kIGFyZ3VtZW50cyBmcm9tIGBzdGFydGAgYW5kIGJleW9uZCBwcm92aWRlZCBhc1xuICAgICAqIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtyZXN0IHBhcmFtZXRlcl0oaHR0cHM6Ly9tZG4uaW8vcmVzdF9wYXJhbWV0ZXJzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F5ID0gXy5yZXN0KGZ1bmN0aW9uKHdoYXQsIG5hbWVzKSB7XG4gICAgICogICByZXR1cm4gd2hhdCArICcgJyArIF8uaW5pdGlhbChuYW1lcykuam9pbignLCAnKSArXG4gICAgICogICAgIChfLnNpemUobmFtZXMpID4gMSA/ICcsICYgJyA6ICcnKSArIF8ubGFzdChuYW1lcyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoJ2hlbGxvJywgJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGUgZnVuY3Rpb24gYW5kIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBtdWNoIGxpa2VcbiAgICAgKiBbYEZ1bmN0aW9uI2FwcGx5YF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3NwcmVhZCBvcGVyYXRvcl0oaHR0cHM6Ly9tZG4uaW8vc3ByZWFkX29wZXJhdG9yKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHNwcmVhZCBhcmd1bWVudHMgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3ByZWFkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F5ID0gXy5zcHJlYWQoZnVuY3Rpb24od2hvLCB3aGF0KSB7XG4gICAgICogICByZXR1cm4gd2hvICsgJyBzYXlzICcgKyB3aGF0O1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KFsnZnJlZCcsICdoZWxsbyddKTtcbiAgICAgKiAvLyA9PiAnZnJlZCBzYXlzIGhlbGxvJ1xuICAgICAqXG4gICAgICogdmFyIG51bWJlcnMgPSBQcm9taXNlLmFsbChbXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoNDApLFxuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDM2KVxuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogbnVtYmVycy50aGVuKF8uc3ByZWFkKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiB4ICsgeTtcbiAgICAgKiB9KSk7XG4gICAgICogLy8gPT4gYSBQcm9taXNlIG9mIDc2XG4gICAgICovXG4gICAgZnVuY3Rpb24gc3ByZWFkKGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogbmF0aXZlTWF4KHRvSW50ZWdlcihzdGFydCksIDApO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJnc1tzdGFydF0sXG4gICAgICAgICAgICBvdGhlckFyZ3MgPSBjYXN0U2xpY2UoYXJncywgMCwgc3RhcnQpO1xuXG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIGFycmF5UHVzaChvdGhlckFyZ3MsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgYGZ1bmNgIGF0IG1vc3Qgb25jZSBwZXJcbiAgICAgKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICAgICAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAgICAgKiBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4gUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2BcbiAgICAgKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gICAgICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICAgICAqIHRocm90dGxlZCBmdW5jdGlvbi4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHJldHVybiB0aGVcbiAgICAgKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZy5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHJlbmV3VG9rZW5gIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBidXQgbm90IG1vcmUgdGhhbiBvbmNlIGV2ZXJ5IDUgbWludXRlcy5cbiAgICAgKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICAgICAnbGVhZGluZyc6IGxlYWRpbmcsXG4gICAgICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAgICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdXAgdG8gb25lIGFyZ3VtZW50LCBpZ25vcmluZyBhbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy51bmFyeShwYXJzZUludCkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmFyeShmdW5jKSB7XG4gICAgICByZXR1cm4gYXJ5KGZ1bmMsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGB2YWx1ZWAgdG8gYHdyYXBwZXJgIGFzIGl0cyBmaXJzdFxuICAgICAqIGFyZ3VtZW50LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uIGFyZSBhcHBlbmRlZFxuICAgICAqIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBgd3JhcHBlcmAuIFRoZSB3cmFwcGVyIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3dyYXBwZXI9aWRlbnRpdHldIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcCA9IF8ud3JhcChfLmVzY2FwZSwgZnVuY3Rpb24oZnVuYywgdGV4dCkge1xuICAgICAqICAgcmV0dXJuICc8cD4nICsgZnVuYyh0ZXh0KSArICc8L3A+JztcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHAoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJzxwPmZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlczwvcD4nXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgd3JhcHBlcikge1xuICAgICAgcmV0dXJuIHBhcnRpYWwoY2FzdEZ1bmN0aW9uKHdyYXBwZXIpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCBhcyBhbiBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtudWxsXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkodW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqIGNvbnNvbGUubG9nKF8uY2FzdEFycmF5KGFycmF5KSA9PT0gYXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXkoKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzWzBdO1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKVxuICAgICAqIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcyxcbiAgICAgKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAgICAgKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZFxuICAgICAqIGFzIHBsYWluIG9iamVjdHMuIEFuIGVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdW5jbG9uZWFibGUgdmFsdWVzIHN1Y2hcbiAgICAgKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZURlZXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gICAgICpcbiAgICAgKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coc2hhbGxvd1swXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWUuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLFxuICAgICAqIGNsb25pbmcgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdXAgdG8gZm91ciBhcmd1bWVudHM7ICh2YWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZURlZXBXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZShmYWxzZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGVsID0gXy5jbG9uZVdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gICAgICpcbiAgICAgKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVXaXRoYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGVsID0gXy5jbG9uZURlZXBXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBvYmplY3RgIGNvbmZvcm1zIHRvIGBzb3VyY2VgIGJ5IGludm9raW5nIHRoZSBwcmVkaWNhdGVcbiAgICAgKiBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAyOyB9IH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZSA9PSBudWxsIHx8IGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBrZXlzKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZXEoJ2EnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZXEoTmFOLCBOYU4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmd0KDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ndGUoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndGUoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3RlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAgICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5QnVmZmVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5QnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FycmF5QnVmZmVyID0gbm9kZUlzQXJyYXlCdWZmZXIgPyBiYXNlVW5hcnkobm9kZUlzQXJyYXlCdWZmZXIpIDogYmFzZUlzQXJyYXlCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gICAgICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICAgICAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAgICAgKiBpcyBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYm9vbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYERhdGVgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZShuZXcgRGF0ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUoJ01vbiBBcHJpbCAyMyAyMDEyJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNEYXRlID0gbm9kZUlzRGF0ZSA/IGJhc2VVbmFyeShub2RlSXNEYXRlKSA6IGJhc2VJc0RhdGU7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBET00gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudChkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudCgnPGJvZHk+Jyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIHZhbHVlLm5vZGVUeXBlID09PSAxICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICAgICAqXG4gICAgICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gICAgICogcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICAgICAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAgICAgKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh0cnVlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlXG4gICAgICogZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBjb21wYXJpbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucyxcbiAgICAgKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gICAgICogc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkIGFycmF5cy4gYE9iamVjdGAgb2JqZWN0cyBhcmUgY29tcGFyZWRcbiAgICAgKiBieSB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRnVuY3Rpb25zIGFuZCBET01cbiAgICAgKiBub2RlcyBhcmUgY29tcGFyZWQgYnkgc3RyaWN0IGVxdWFsaXR5LCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbChvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBvYmplY3QgPT09IG90aGVyO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNFcXVhbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHVwIHRvXG4gICAgICogc2l4IGFyZ3VtZW50czogKG9ialZhbHVlLCBvdGhWYWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlKSB7XG4gICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhvdGhWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydoZWxsbycsICdnb29kYnllJ107XG4gICAgICogdmFyIG90aGVyID0gWydoaScsICdnb29kYnllJ107XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWxXaXRoKGFycmF5LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWxXaXRoKHZhbHVlLCBvdGhlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKHZhbHVlLCBvdGhlcikgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIHVuZGVmaW5lZCwgY3VzdG9taXplcikgOiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgRXJyb3JgLCBgRXZhbEVycm9yYCwgYFJhbmdlRXJyb3JgLCBgUmVmZXJlbmNlRXJyb3JgLFxuICAgICAqIGBTeW50YXhFcnJvcmAsIGBUeXBlRXJyb3JgLCBvciBgVVJJRXJyb3JgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gZXJyb3Igb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihuZXcgRXJyb3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihFcnJvcik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Vycm9yKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICAgICAgcmV0dXJuIHRhZyA9PSBlcnJvclRhZyB8fCB0YWcgPT0gZG9tRXhjVGFnIHx8XG4gICAgICAgICh0eXBlb2YgdmFsdWUubWVzc2FnZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUubmFtZSA9PSAnc3RyaW5nJyAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIHByaW1pdGl2ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0Zpbml0ZWBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0Zpbml0ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIG5hdGl2ZUlzRmluaXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKF8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgICAgIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICAgICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICAgICAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzSW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PSB0b0ludGVnZXIodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAgICAgKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gICAgICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdCh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAgICAgKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgTWFwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGBvYmplY3RgIGFuZCBgc291cmNlYCB0b1xuICAgICAqIGRldGVybWluZSBpZiBgb2JqZWN0YCBjb250YWlucyBlcXVpdmFsZW50IHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLm1hdGNoZXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hdGNoKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzTWF0Y2hgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBmaXZlXG4gICAgICogYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBpbmRleHxrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhzcmNWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2dyZWV0aW5nJzogJ2hlbGxvJyB9O1xuICAgICAqIHZhciBzb3VyY2UgPSB7ICdncmVldGluZyc6ICdoaScgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYE5hTmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc05hTmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc05hTikgYW5kIGlzIG5vdCB0aGUgc2FtZSBhc1xuICAgICAqIGdsb2JhbCBbYGlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vaXNOYU4pIHdoaWNoIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtYmVyIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hTihOYU4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4obmV3IE51bWJlcihOYU4pKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBpc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgICAvLyBBbiBgTmFOYCBwcmltaXRpdmUgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLlxuICAgICAgLy8gUGVyZm9ybSB0aGUgYHRvU3RyaW5nVGFnYCBjaGVjayBmaXJzdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBzb21lXG4gICAgICAvLyBBY3RpdmVYIG9iamVjdHMgaW4gSUUuXG4gICAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByaXN0aW5lIG5hdGl2ZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBjYW4ndCByZWxpYWJseSBkZXRlY3QgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgcHJlc2VuY2VcbiAgICAgKiBvZiB0aGUgY29yZS1qcyBwYWNrYWdlIGJlY2F1c2UgY29yZS1qcyBjaXJjdW12ZW50cyB0aGlzIGtpbmQgb2YgZGV0ZWN0aW9uLlxuICAgICAqIERlc3BpdGUgbXVsdGlwbGUgcmVxdWVzdHMsIHRoZSBjb3JlLWpzIG1haW50YWluZXIgaGFzIG1hZGUgaXQgY2xlYXI6IGFueVxuICAgICAqIGF0dGVtcHQgdG8gZml4IHRoZSBkZXRlY3Rpb24gd2lsbCBiZSBvYnN0cnVjdGVkLiBBcyBhIHJlc3VsdCwgd2UncmUgbGVmdFxuICAgICAqIHdpdGggbGl0dGxlIGNob2ljZSBidXQgdG8gdGhyb3cgYW4gZXJyb3IuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBhZmZlY3RzXG4gICAgICogcGFja2FnZXMsIGxpa2UgW2JhYmVsLXBvbHlmaWxsXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iYWJlbC1wb2x5ZmlsbCksXG4gICAgICogd2hpY2ggcmVseSBvbiBjb3JlLWpzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmF0aXZlKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmF0aXZlKF8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmIChpc01hc2thYmxlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQ09SRV9FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYG51bGxgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKHZvaWQgMCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc051bGwodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG51bGxpc2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05pbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbChOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOaWwodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTnVtYmVyYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gICAgICogY2xhc3NpZmllZCBhcyBudW1iZXJzLCB1c2UgdGhlIGBfLmlzRmluaXRlYCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBudW1iZXJUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAgICAgKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC44LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gICAgICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICAgICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFJlZ0V4cGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzUmVnRXhwKC9hYmMvKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUmVnRXhwKCcvYWJjLycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzUmVnRXhwID0gbm9kZUlzUmVnRXhwID8gYmFzZVVuYXJ5KG5vZGVJc1JlZ0V4cCkgOiBiYXNlSXNSZWdFeHA7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlci4gQW4gaW50ZWdlciBpcyBzYWZlIGlmIGl0J3MgYW4gSUVFRS03NTRcbiAgICAgKiBkb3VibGUgcHJlY2lzaW9uIG51bWJlciB3aGljaCBpc24ndCB0aGUgcmVzdWx0IG9mIGEgcm91bmRlZCB1bnNhZmUgaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzU2FmZUludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNTYWZlSW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gLU1BWF9TQUZFX0lOVEVHRVIgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFNldGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygnYWJjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha01hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHdlYWsgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBXZWFrTWFwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgTWFwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSB3ZWFrTWFwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha1NldGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHdlYWsgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gd2Vha1NldFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubHQoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUx0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubHRlKDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHRlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHRlKDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPD0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoMSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcodmFsdWUpID8gc3RyaW5nVG9BcnJheSh2YWx1ZSkgOiBjb3B5QXJyYXkodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN5bUl0ZXJhdG9yICYmIHZhbHVlW3N5bUl0ZXJhdG9yXSkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgIGZ1bmMgPSB0YWcgPT0gbWFwVGFnID8gbWFwVG9BcnJheSA6ICh0YWcgPT0gc2V0VGFnID8gc2V0VG9BcnJheSA6IHZhbHVlcyk7XG5cbiAgICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEyLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgICAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gICAgICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyIHN1aXRhYmxlIGZvciB1c2UgYXMgdGhlIGxlbmd0aCBvZiBhblxuICAgICAqIGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xlbmd0aCgzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b0xlbmd0aChJbmZpbml0eSk7XG4gICAgICogLy8gPT4gNDI5NDk2NzI5NVxuICAgICAqXG4gICAgICogXy50b0xlbmd0aCgnMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgMCwgTUFYX0FSUkFZX0xFTkdUSCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gSW5maW5pdHlcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgICAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgICAgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAgICAgKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICAgICAqIHJlcHJlc2VudGVkIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIC1NQVhfU0FGRV9JTlRFR0VSLCBNQVhfU0FGRV9JTlRFR0VSKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAgICAgKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKG51bGwpO1xuICAgICAqIC8vID0+ICcnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKC0wKTtcbiAgICAgKiAvLyA9PiAnLTAnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gJzEsMiwzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgIGFuZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBpZiAoaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25JbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRXaXRoXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25JbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXy5hdChvYmplY3QsIFsnYVswXS5iLmMnLCAnYVsxXSddKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgYXQgPSBmbGF0UmVzdChiYXNlQXQpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgcHJvdG90eXBlYCBvYmplY3QuIElmIGFcbiAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0IGlzIGdpdmVuLCBpdHMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXNcbiAgICAgKiBhcmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICAgICAqICAgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTtcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcyA9PSBudWxsID8gcmVzdWx0IDogYmFzZUFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAgICAgKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgYXJncy5wdXNoKHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7XG4gICAgICByZXR1cm4gYXBwbHkoYXNzaWduSW5XaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kZWZhdWx0c2AgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgYXNzaWduc1xuICAgICAqIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0c0RlZXAoeyAnYSc6IHsgJ2InOiAyIH0gfSwgeyAnYSc6IHsgJ2InOiAxLCAnYyc6IDMgfSB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IDIsICdjJzogMyB9IH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHNEZWVwID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgYXJncy5wdXNoKHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSk7XG4gICAgICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiByZXR1cm5zICdwZWJibGVzJyBhc3N1bWluZyBgXy5maW5kS2V5YCByZXR1cm5zICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW5cbiAgICAgKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3Iob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW5SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2MnLCAnYicsIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvckluYCBsb2dzICdhJywgJ2InLCB0aGVuICdjJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3JSaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmRcbiAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd24ob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdiJyB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIHRoZW4gJ2InLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93blJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgICAqIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc0luXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGFuZCBpbmhlcml0ZWRcbiAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gICAgICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gICAgICogcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnQob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9XG4gICAgICovXG4gICAgdmFyIGludmVydCA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIHZhbHVlKSkge1xuICAgICAgICByZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0gPSBba2V5XTtcbiAgICAgIH1cbiAgICB9LCBnZXRJdGVyYXRlZSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogWzEsIDIsIDMsIDRdIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uaW52b2tlKG9iamVjdCwgJ2FbMF0uYi5jLnNsaWNlJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgdmFyIGludm9rZSA9IGJhc2VSZXN0KGJhc2VJbnZva2UpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICAgICAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8ua2V5cygnaGknKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMSddXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlXG4gICAgICogc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwVmFsdWVzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwS2V5cyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIHJldHVybiBrZXkgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhMSc6IDEsICdiMic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcEtleXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICAgICAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcEtleXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gICAgICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAgICAgKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAgICAgKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgb3RoZXIgPSB7XG4gICAgICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2VcbiAgICAgKiBwcm9wZXJ0aWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgbWVyZ2luZyBpcyBoYW5kbGVkIGJ5IHRoZVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBzaXggYXJndW1lbnRzOlxuICAgICAqIChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIG9ialZhbHVlLmNvbmNhdChzcmNWYWx1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbMV0sICdiJzogWzJdIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IFszXSwgJ2InOiBbNF0gfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2VXaXRoKG9iamVjdCwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbMSwgM10sICdiJzogWzIsIDRdIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2VXaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgdmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpc0RlZXAgPSBmYWxzZTtcbiAgICAgIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9KTtcbiAgICAgIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmVzdWx0ID0gYmFzZUNsb25lKHJlc3VsdCwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfRkxBVF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21PbWl0Q2xvbmUpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja0J5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2ZcbiAgICAgKiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0aGF0XG4gICAgICogYHByZWRpY2F0ZWAgZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdEJ5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gb21pdEJ5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gcGlja0J5KG9iamVjdCwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJuc1xuICAgICAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrQnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwaWNrQnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICB2YXIgcHJvcHMgPSBhcnJheU1hcChnZXRBbGxLZXlzSW4ob2JqZWN0KSwgZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gW3Byb3BdO1xuICAgICAgfSk7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUpO1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwcm9wcywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmdldGAgZXhjZXB0IHRoYXQgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFcbiAgICAgKiBmdW5jdGlvbiBpdCdzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgaXRzIHBhcmVudCBvYmplY3QgYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHJlc29sdmUuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjMSc6IDMsICdjMic6IF8uY29uc3RhbnQoNCkgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMxJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMyJyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsIF8uY29uc3RhbnQoJ2RlZmF1bHQnKSk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgbG9vcCBpcyBlbnRlcmVkIHdoZW4gcGF0aCBpcyBlbXB0eS5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIG9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXhdKV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG4gICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKG9iamVjdCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gICAgICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gICAgICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAgICAgKiBgcGF0aGAgY3JlYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8uc2V0V2l0aChvYmplY3QsICdbMF1bMV0nLCAnYScsIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0V2l0aChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YFxuICAgICAqIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcCBvciBzZXQsIGl0c1xuICAgICAqIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl1dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnMgPSBjcmVhdGVUb1BhaXJzKGtleXMpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlyc1xuICAgICAqIGZvciBgb2JqZWN0YCB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXBcbiAgICAgKiBvciBzZXQsIGl0cyBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzSW5cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnNJbiA9IGNyZWF0ZVRvUGFpcnMoa2V5c0luKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gICAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICAgICAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gICAgICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA5XVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiB9LCB7fSk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICAgICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiA3IH0gfV0gfTtcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqXG4gICAgICogXy51bnNldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB0cnVlIDogYmFzZVVuc2V0KG9iamVjdCwgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGFjY2VwdHMgYHVwZGF0ZXJgIHRvIHByb2R1Y2UgdGhlXG4gICAgICogdmFsdWUgdG8gc2V0LiBVc2UgYF8udXBkYXRlV2l0aGAgdG8gY3VzdG9taXplIGBwYXRoYCBjcmVhdGlvbi4gVGhlIGB1cGRhdGVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAnYVswXS5iLmMnLCBmdW5jdGlvbihuKSB7IHJldHVybiBuICogbjsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICd4WzBdLnkueicsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPyBuICsgMSA6IDA7IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udXBkYXRlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy51cGRhdGVXaXRoKG9iamVjdCwgJ1swXVsxXScsIF8uY29uc3RhbnQoJ2EnKSwgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXaXRoKG9iamVjdCwgcGF0aCwgdXBkYXRlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy52YWx1ZXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWydoJywgJ2knXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHlcbiAgICAgKiB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENsYW1wcyBgbnVtYmVyYCB3aXRoaW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoLTEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gLTVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSB0b051bWJlcih1cHBlcik7XG4gICAgICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICAgICAgfVxuICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgICAgIGxvd2VyID0gbG93ZXIgPT09IGxvd2VyID8gbG93ZXIgOiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgbmAgaXMgYmV0d2VlbiBgc3RhcnRgIGFuZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZlxuICAgICAqIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKiBJZiBgc3RhcnRgIGlzIGdyZWF0ZXIgdGhhbiBgZW5kYCB0aGUgcGFyYW1zIGFyZSBzd2FwcGVkIHRvIHN1cHBvcnRcbiAgICAgKiBuZWdhdGl2ZSByYW5nZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ucmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMywgMiwgNCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDgpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDIsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMS4yLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNS4yLCA0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKC0zLCAtMiwgLTYpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgICB9XG4gICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgcmV0dXJuIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKiBJZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCBhIG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIG51bWJlclxuICAgICAqIGlzIHJldHVybmVkLiBJZiBgZmxvYXRpbmdgIGlzIGB0cnVlYCwgb3IgZWl0aGVyIGBsb3dlcmAgb3IgYHVwcGVyYCBhcmVcbiAgICAgKiBmbG9hdHMsIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXI9MF0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdXBwZXI9MV0gVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgwLCA1KTtcbiAgICAgKiAvLyA9PiBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSk7XG4gICAgICogLy8gPT4gYWxzbyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgxLjIsIDUuMik7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAxLjIgYW5kIDUuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJhbmRvbShsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSB7XG4gICAgICBpZiAoZmxvYXRpbmcgJiYgdHlwZW9mIGZsb2F0aW5nICE9ICdib29sZWFuJyAmJiBpc0l0ZXJhdGVlQ2FsbChsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSkge1xuICAgICAgICB1cHBlciA9IGZsb2F0aW5nID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1cHBlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IHVwcGVyO1xuICAgICAgICAgIHVwcGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsb3dlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPT09IHVuZGVmaW5lZCAmJiB1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgdXBwZXIgPSAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvd2VyID0gdG9GaW5pdGUobG93ZXIpO1xuICAgICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwcGVyID0gdG9GaW5pdGUodXBwZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPiB1cHBlcikge1xuICAgICAgICB2YXIgdGVtcCA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVwcGVyO1xuICAgICAgICB1cHBlciA9IHRlbXA7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgfHwgbG93ZXIgJSAxIHx8IHVwcGVyICUgMSkge1xuICAgICAgICB2YXIgcmFuZCA9IG5hdGl2ZVJhbmRvbSgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlTWluKGxvd2VyICsgKHJhbmQgKiAodXBwZXIgLSBsb3dlciArIGZyZWVQYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsgJycpLmxlbmd0aCAtIDEpKSkpLCB1cHBlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIFtjYW1lbCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1lbENhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKi9cbiAgICB2YXIgY2FtZWxDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/IGNhcGl0YWxpemUod29yZCkgOiB3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICAgICAqIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FwaXRhbGl6ZSgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZ1xuICAgICAqIFtMYXRpbi0xIFN1cHBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluLTFfU3VwcGxlbWVudF8oVW5pY29kZV9ibG9jaykjQ2hhcmFjdGVyX3RhYmxlKVxuICAgICAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAgICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nXG4gICAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBkZWJ1cnIuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gICAgICogLy8gPT4gJ2RlamEgdnUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBlbmRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTtcblxuICAgICAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA+PSAwICYmIHN0cmluZy5zbGljZShwb3NpdGlvbiwgZW5kKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gICAgICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICAgICAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICAgICAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gICAgICogWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGhlIGBSZWdFeHBgIHNwZWNpYWwgY2hhcmFjdGVycyBcIl5cIiwgXCIkXCIsIFwiXFxcIiwgXCIuXCIsIFwiKlwiLCBcIitcIixcbiAgICAgKiBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgYW5kIFwifFwiIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICogLy8gPT4gJ1xcW2xvZGFzaFxcXVxcKGh0dHBzOi8vbG9kYXNoXFwuY29tL1xcKSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqL1xuICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdmUkVEJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCk7XG4gICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpO1xuICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzdHJMZW5ndGggPj0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbWlkID0gKGxlbmd0aCAtIHN0ckxlbmd0aCkgLyAyO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLCBjaGFycykgK1xuICAgICAgICBzdHJpbmcgK1xuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnICAgYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tX2FiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpICsgc3RyaW5nKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYVxuICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlXG4gICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICogLy8gPT4gJyoqKidcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgKiAvLyA9PiAnYWJjYWJjJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAqIC8vID0+ICcnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTtcbiAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoIDwgMyA/IHN0cmluZyA6IHN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tRk9PLUJBUi0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICovXG4gICAgdmFyIHNuYWtlQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICdfJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX0FSUkFZX0xFTkdUSCA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKCFsaW1pdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoXG4gICAgICAgICAgICB0eXBlb2Ygc2VwYXJhdG9yID09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICAgICAgKSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksIDAsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPTBdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplc1xuICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlPV8udGVtcGxhdGVTZXR0aW5ncy5ldmFsdWF0ZV1cbiAgICAgKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICogIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgZnJlZSB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddXG4gICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnYmFybmV5JyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgRVMgdGVtcGxhdGUgbGl0ZXJhbCBkZWxpbWl0ZXIgYXMgYW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ3BlYmJsZXMnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSBiYWNrc2xhc2hlcyB0byB0cmVhdCBkZWxpbWl0ZXJzIGFzIHBsYWluIHRleHQuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gICAgICogdmFyIHRleHQgPSAnPCUganEuZWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+JztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7XG4gICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAgICAgKiBjb21waWxlZC5zb3VyY2U7XG4gICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gICAgICogLy8gICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS51c2VyICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAqIC8vIH1cbiAgICAgKlxuICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gICAgICB2YXIgaXNFc2NhcGluZyxcbiAgICAgICAgICBpc0V2YWx1YXRpbmcsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGludGVycG9sYXRlID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsXG4gICAgICAgICAgc291cmNlID0gXCJfX3AgKz0gJ1wiO1xuXG4gICAgICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKFxuICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xhdGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJ1xuICAgICAgLCAnZycpO1xuXG4gICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICB2YXIgc291cmNlVVJMID0gJy8vIyBzb3VyY2VVUkw9JyArXG4gICAgICAgICgnc291cmNlVVJMJyBpbiBvcHRpb25zXG4gICAgICAgICAgPyBvcHRpb25zLnNvdXJjZVVSTFxuICAgICAgICAgIDogKCdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWycgKyAoKyt0ZW1wbGF0ZUNvdW50ZXIpICsgJ10nKVxuICAgICAgICApICsgJ1xcbic7XG5cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgICAgICBpbnRlcnBvbGF0ZVZhbHVlIHx8IChpbnRlcnBvbGF0ZVZhbHVlID0gZXNUZW1wbGF0ZVZhbHVlKTtcblxuICAgICAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscy5cbiAgICAgICAgc291cmNlICs9IHN0cmluZy5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBlc2NhcGVTdHJpbmdDaGFyKTtcblxuICAgICAgICAvLyBSZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBzbmlwcGV0cy5cbiAgICAgICAgaWYgKGVzY2FwZVZhbHVlKSB7XG4gICAgICAgICAgaXNFc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuX19lKFwiICsgZXNjYXBlVmFsdWUgKyBcIikgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlVmFsdWUgKyBcIjtcXG5fX3AgKz0gJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuKChfX3QgPSAoXCIgKyBpbnRlcnBvbGF0ZVZhbHVlICsgXCIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgICAgLy8gVGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cyBuZWVkcyBgbWF0Y2hgIHJldHVybmVkIGluXG4gICAgICAgIC8vIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH0pO1xuXG4gICAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgICAvLyBJZiBgdmFyaWFibGVgIGlzIG5vdCBzcGVjaWZpZWQgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkXG4gICAgICAvLyBjb2RlIHRvIGFkZCB0aGUgZGF0YSBvYmplY3QgdG8gdGhlIHRvcCBvZiB0aGUgc2NvcGUgY2hhaW4uXG4gICAgICB2YXIgdmFyaWFibGUgPSBvcHRpb25zLnZhcmlhYmxlO1xuICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAob2JqKSB7XFxuJyArIHNvdXJjZSArICdcXG59XFxuJztcbiAgICAgIH1cbiAgICAgIC8vIENsZWFudXAgY29kZSBieSBzdHJpcHBpbmcgZW1wdHkgc3RyaW5ncy5cbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAgICAgKHZhcmlhYmxlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIFwidmFyIF9fdCwgX19wID0gJydcIiArXG4gICAgICAgIChpc0VzY2FwaW5nXG4gICAgICAgICAgID8gJywgX19lID0gXy5lc2NhcGUnXG4gICAgICAgICAgIDogJydcbiAgICAgICAgKSArXG4gICAgICAgIChpc0V2YWx1YXRpbmdcbiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xcbicgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgICAgIDogJztcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBzb3VyY2UgK1xuICAgICAgICAncmV0dXJuIF9fcFxcbn0nO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgaW1wb3J0c1ZhbHVlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gICAgICAvLyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IgaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzLlxuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gbG93ZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1mb28tYmFyLS0nXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29iYXInXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ19fZm9vX2Jhcl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT09CQVInXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGNoclN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KGNoYXJzKSxcbiAgICAgICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW1FbmQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW1FbmQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICctXy1hYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1FbmQsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBzdHJpbmdUb0FycmF5KGNoYXJzKSkgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMgICdcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjLV8tJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1TdGFydCwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBzdHJpbmdUb0FycmF5KGNoYXJzKSk7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlcyBgc3RyaW5nYCBpZiBpdCdzIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogVGhlIGxhc3QgY2hhcmFjdGVycyBvZiB0aGUgdHJ1bmNhdGVkIHN0cmluZyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb21pc3Npb25cbiAgICAgKiBzdHJpbmcgd2hpY2ggZGVmYXVsdHMgdG8gXCIuLi5cIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cnVuY2F0ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubGVuZ3RoPTMwXSBUaGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vbWlzc2lvbj0nLi4uJ10gVGhlIHN0cmluZyB0byBpbmRpY2F0ZSB0ZXh0IGlzIG9taXR0ZWQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbb3B0aW9ucy5zZXBhcmF0b3JdIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byB0cnVuY2F0ZSB0by5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cnVuY2F0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJyk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hiby4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogJyAnXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwuLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6IC8sPyArL1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUuLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ29taXNzaW9uJzogJyBbLi4uXSdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnIFsuLi5dJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgb3B0aW9ucykge1xuICAgICAgdmFyIGxlbmd0aCA9IERFRkFVTFRfVFJVTkNfTEVOR1RILFxuICAgICAgICAgIG9taXNzaW9uID0gREVGQVVMVF9UUlVOQ19PTUlTU0lPTjtcblxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyBpbiBvcHRpb25zID8gb3B0aW9ucy5zZXBhcmF0b3IgOiBzZXBhcmF0b3I7XG4gICAgICAgIGxlbmd0aCA9ICdsZW5ndGgnIGluIG9wdGlvbnMgPyB0b0ludGVnZXIob3B0aW9ucy5sZW5ndGgpIDogbGVuZ3RoO1xuICAgICAgICBvbWlzc2lvbiA9ICdvbWlzc2lvbicgaW4gb3B0aW9ucyA/IGJhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKSA6IG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBpZiAoaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpO1xuICAgICAgICBzdHJMZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChsZW5ndGggPj0gc3RyTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgZW5kID0gbGVuZ3RoIC0gc3RyaW5nU2l6ZShvbWlzc2lvbik7XG4gICAgICBpZiAoZW5kIDwgMSkge1xuICAgICAgICByZXR1cm4gb21pc3Npb247XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gc3RyU3ltYm9sc1xuICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpXG4gICAgICAgIDogc3RyaW5nLnNsaWNlKDAsIGVuZCk7XG5cbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgICB9XG4gICAgICBpZiAoc3RyU3ltYm9scykge1xuICAgICAgICBlbmQgKz0gKHJlc3VsdC5sZW5ndGggLSBlbmQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgaWYgKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKSB7XG4gICAgICAgICAgdmFyIG1hdGNoLFxuICAgICAgICAgICAgICBzdWJzdHJpbmcgPSByZXN1bHQ7XG5cbiAgICAgICAgICBpZiAoIXNlcGFyYXRvci5nbG9iYWwpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCB0b1N0cmluZyhyZUZsYWdzLmV4ZWMoc2VwYXJhdG9yKSkgKyAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXBhcmF0b3IubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gc2VwYXJhdG9yLmV4ZWMoc3Vic3RyaW5nKSkpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbmQgPSBtYXRjaC5pbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG5ld0VuZCA9PT0gdW5kZWZpbmVkID8gZW5kIDogbmV3RW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJpbmcuaW5kZXhPZihiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKSwgZW5kKSAhPSBlbmQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcmVzdWx0Lmxhc3RJbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLmVzY2FwZWA7IHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBIVE1MIGVudGl0aWVzXG4gICAgICogYCZhbXA7YCwgYCZsdDtgLCBgJmd0O2AsIGAmcXVvdDtgLCBhbmQgYCYjMzk7YCBpbiBgc3RyaW5nYCB0b1xuICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBIVE1MIGVudGl0aWVzIGFyZSB1bmVzY2FwZWQuIFRvIHVuZXNjYXBlIGFkZGl0aW9uYWxcbiAgICAgKiBIVE1MIGVudGl0aWVzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjYuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB1bmVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuZXNjYXBlKCdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNFc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVFc2NhcGVkSHRtbCwgdW5lc2NhcGVIdG1sQ2hhcilcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gdXBwZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJy0tZm9vLWJhcicpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICovXG4gICAgdmFyIHVwcGVyQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnZnJlZCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZSRUQnXG4gICAgICovXG4gICAgdmFyIHVwcGVyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvVXBwZXJDYXNlJyk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtwYXR0ZXJuXSBUaGUgcGF0dGVybiB0byBtYXRjaCB3b3Jkcy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJywgL1teLCBdKy9nKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJyYnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gd29yZHMoc3RyaW5nLCBwYXR0ZXJuLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBhdHRlcm4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IHBhdHRlcm47XG5cbiAgICAgIGlmIChwYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZykgPyB1bmljb2RlV29yZHMoc3RyaW5nKSA6IGFzY2lpV29yZHMoc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybikgfHwgW107XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gaW52b2tlIGBmdW5jYCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgcmVzdWx0IG9yIHRoZSBjYXVnaHQgZXJyb3JcbiAgICAgKiBvYmplY3QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhdHRlbXB0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBgZnVuY2AgcmVzdWx0IG9yIGVycm9yIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgdGhyb3dpbmcgZXJyb3JzIGZvciBpbnZhbGlkIHNlbGVjdG9ycy5cbiAgICAgKiB2YXIgZWxlbWVudHMgPSBfLmF0dGVtcHQoZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICAgKiAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgKiB9LCAnPl8+Jyk7XG4gICAgICpcbiAgICAgKiBpZiAoXy5pc0Vycm9yKGVsZW1lbnRzKSkge1xuICAgICAqICAgZWxlbWVudHMgPSBbXTtcbiAgICAgKiB9XG4gICAgICovXG4gICAgdmFyIGF0dGVtcHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQmluZHMgbWV0aG9kcyBvZiBhbiBvYmplY3QgdG8gdGhlIG9iamVjdCBpdHNlbGYsIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZ1xuICAgICAqIG1ldGhvZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiaW5kIGFuZCBhc3NpZ24gdGhlIGJvdW5kIG1ldGhvZHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gbWV0aG9kTmFtZXMgVGhlIG9iamVjdCBtZXRob2QgbmFtZXMgdG8gYmluZC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdmlldyA9IHtcbiAgICAgKiAgICdsYWJlbCc6ICdkb2NzJyxcbiAgICAgKiAgICdjbGljayc6IGZ1bmN0aW9uKCkge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnY2xpY2tlZCAnICsgdGhpcy5sYWJlbCk7XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uYmluZEFsbCh2aWV3LCBbJ2NsaWNrJ10pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB2aWV3LmNsaWNrKTtcbiAgICAgKiAvLyA9PiBMb2dzICdjbGlja2VkIGRvY3MnIHdoZW4gY2xpY2tlZC5cbiAgICAgKi9cbiAgICB2YXIgYmluZEFsbCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgbWV0aG9kTmFtZXMpIHtcbiAgICAgIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGtleSA9IHRvS2V5KGtleSk7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgYmluZChvYmplY3Rba2V5XSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpdGVyYXRlcyBvdmVyIGBwYWlyc2AgYW5kIGludm9rZXMgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiBmdW5jdGlvbiBvZiB0aGUgZmlyc3QgcHJlZGljYXRlIHRvIHJldHVybiB0cnV0aHkuIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb25cbiAgICAgKiBwYWlycyBhcmUgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb24gcGFpcnMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8uY29uZChbXG4gICAgICogICBbXy5tYXRjaGVzKHsgJ2EnOiAxIH0pLCAgICAgICAgICAgXy5jb25zdGFudCgnbWF0Y2hlcyBBJyldLFxuICAgICAqICAgW18uY29uZm9ybXMoeyAnYic6IF8uaXNOdW1iZXIgfSksIF8uY29uc3RhbnQoJ21hdGNoZXMgQicpXSxcbiAgICAgKiAgIFtfLnN0dWJUcnVlLCAgICAgICAgICAgICAgICAgICAgICBfLmNvbnN0YW50KCdubyBtYXRjaCcpXVxuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEEnXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAwLCAnYic6IDEgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQidcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6ICcxJywgJ2InOiAnMicgfSk7XG4gICAgICogLy8gPT4gJ25vIG1hdGNoJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmQocGFpcnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYWlycyA9PSBudWxsID8gMCA6IHBhaXJzLmxlbmd0aCxcbiAgICAgICAgICB0b0l0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoKTtcblxuICAgICAgcGFpcnMgPSAhbGVuZ3RoID8gW10gOiBhcnJheU1hcChwYWlycywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICBpZiAodHlwZW9mIHBhaXJbMV0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RvSXRlcmF0ZWUocGFpclswXSksIHBhaXJbMV1dO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICAgIGlmIChhcHBseShwYWlyWzBdLCB0aGlzLCBhcmdzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHBhaXJbMV0sIHRoaXMsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgcHJlZGljYXRlIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aFxuICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBhIGdpdmVuIG9iamVjdCwgcmV0dXJuaW5nIGB0cnVlYCBpZlxuICAgICAqIGFsbCBwcmVkaWNhdGVzIHJldHVybiB0cnV0aHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zVG9gIHdpdGhcbiAgICAgKiBgc291cmNlYCBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAyLCAnYic6IDEgfSxcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLmNvbmZvcm1zKHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBgdmFsdWVgIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQgaW5cbiAgICAgKiBpdHMgcGxhY2UuIFRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBgbnVsbGAsXG4gICAgICogb3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKDEsIDEwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbyh1bmRlZmluZWQsIDEwKTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlZmF1bHRUbyh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb25zXG4gICAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICAgICAqIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1JpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvdyhbXy5hZGQsIHNxdWFyZV0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3cgPSBjcmVhdGVGbG93KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsb3dgIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0XG4gICAgICogaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvd1JpZ2h0KFtzcXVhcmUsIF8uYWRkXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvd1JpZ2h0ID0gY3JlYXRlRmxvdyh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi4gSWYgYGZ1bmNgIGlzIGEgcHJvcGVydHkgbmFtZSwgdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyB0aGVcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBnaXZlbiBlbGVtZW50LiBJZiBgZnVuY2AgaXMgYW4gYXJyYXkgb3Igb2JqZWN0LCB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gdGhlIGVxdWl2YWxlbnRcbiAgICAgKiBzb3VyY2UgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSBbZnVuYz1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2FsbGJhY2suXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKFsndXNlcicsICdmcmVkJ10pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgXy5pdGVyYXRlZSgndXNlcicpKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIENyZWF0ZSBjdXN0b20gaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKiBfLml0ZXJhdGVlID0gXy53cmFwKF8uaXRlcmF0ZWUsIGZ1bmN0aW9uKGl0ZXJhdGVlLCBmdW5jKSB7XG4gICAgICogICByZXR1cm4gIV8uaXNSZWdFeHAoZnVuYykgPyBpdGVyYXRlZShmdW5jKSA6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAqICAgICByZXR1cm4gZnVuYy50ZXN0KHN0cmluZyk7XG4gICAgICogICB9O1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIoWydhYmMnLCAnZGVmJ10sIC9lZi8pO1xuICAgICAqIC8vID0+IFsnZGVmJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpdGVyYXRlZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jID09ICdmdW5jdGlvbicgPyBmdW5jIDogYmFzZUNsb25lKGZ1bmMsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBhIGdpdmVuXG4gICAgICogb2JqZWN0IGFuZCBgc291cmNlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBlcXVpdmFsZW50XG4gICAgICogcHJvcGVydHkgdmFsdWVzLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5pc01hdGNoYCB3aXRoIGBzb3VyY2VgXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ubWF0Y2hlcyh7ICdhJzogNCwgJ2MnOiA2IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckV2ZXJ5KFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIGZ1bmMoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBvdmVyRXZlcnkgPSBjcmVhdGVPdmVyKGFycmF5RXZlcnkpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYW55Kiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtwcmVkaWNhdGVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyU29tZShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBvdmVyU29tZSA9IGNyZWF0ZU92ZXIoYXJyYXlTb21lKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IDIgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgICAgIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5wcm9wZXJ0eWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnNcbiAgICAgKiB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFswLCAxLCAyXSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbVxuICAgICAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gICAgICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gICAgICogaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDQpO1xuICAgICAqIC8vID0+IFswLCAxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgtNCk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmFuZ2VgIGV4Y2VwdCB0aGF0IGl0IHBvcHVsYXRlcyB2YWx1ZXMgaW5cbiAgICAgKiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCg0KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgtNCk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNSk7XG4gICAgICogLy8gPT4gWzQsIDMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFsxNSwgMTAsIDUsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZVJpZ2h0ID0gY3JlYXRlUmFuZ2UodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5cyk7XG4gICAgICogLy8gPT4gW1tdLCBbXV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5c1swXSA9PT0gYXJyYXlzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJBcnJheSgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAgICAgKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLnN0dWJPYmplY3QpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3t9LCB7fV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1Yk9iamVjdCgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnJywgJyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlN0cmluZygpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJUcnVlKTtcbiAgICAgKiAvLyA9PiBbdHJ1ZSwgdHJ1ZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViVHJ1ZSgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIGl0ZXJhdGVlIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mXG4gICAgICogZWFjaCBpbnZvY2F0aW9uLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKGluZGV4KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMywgU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMScsICcyJ11cbiAgICAgKlxuICAgICAqICBfLnRpbWVzKDQsIF8uY29uc3RhbnQoMCkpO1xuICAgICAqIC8vID0+IFswLCAwLCAwLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgaWYgKG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IE1BWF9BUlJBWV9MRU5HVEgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtcbiAgICAgIG4gLT0gTUFYX0FSUkFZX0xFTkdUSDtcblxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VUaW1lcyhsZW5ndGgsIGl0ZXJhdGVlKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgICBpdGVyYXRlZShpbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJzAnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIHRvS2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N5bWJvbCh2YWx1ZSkgPyBbdmFsdWVdIDogY29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgnY29udGFjdF8nKTtcbiAgICAgKiAvLyA9PiAnY29udGFjdF8xMDQnXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCk7XG4gICAgICogLy8gPT4gJzEwNSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgICAgIHZhciBpZCA9ICsraWRDb3VudGVyO1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXVnZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFkZGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0b3RhbC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5hZGQoNiwgNCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICB2YXIgYWRkID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihhdWdlbmQsIGFkZGVuZCkge1xuICAgICAgcmV0dXJuIGF1Z2VuZCArIGFkZGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdXAgdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgdXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIHVwIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jZWlsKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiBfLmNlaWwoNi4wMDQsIDIpO1xuICAgICAqIC8vID0+IDYuMDFcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2MDQwLCAtMik7XG4gICAgICogLy8gPT4gNjEwMFxuICAgICAqL1xuICAgIHZhciBjZWlsID0gY3JlYXRlUm91bmQoJ2NlaWwnKTtcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlkZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aXNvciBUaGUgc2Vjb25kIG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHF1b3RpZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpdmlkZSg2LCA0KTtcbiAgICAgKiAvLyA9PiAxLjVcbiAgICAgKi9cbiAgICB2YXIgZGl2aWRlID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgcmV0dXJuIGRpdmlkZW5kIC8gZGl2aXNvcjtcbiAgICB9LCAxKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgZG93biB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCBkb3duLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgZG93biB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIGRvd24gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsb29yKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLmZsb29yKDAuMDQ2LCAyKTtcbiAgICAgKiAvLyA9PiAwLjA0XG4gICAgICpcbiAgICAgKiBfLmZsb29yKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MDAwXG4gICAgICovXG4gICAgdmFyIGZsb29yID0gY3JlYXRlUm91bmQoJ2Zsb29yJyk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA4XG4gICAgICpcbiAgICAgKiBfLm1heChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWF4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heEJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1lYW4gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWVhbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuKGFycmF5KSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGlkZW50aXR5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lYW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBhdmVyYWdlZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLm1pbihbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWVyIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGljYW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcHJvZHVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tdWx0aXBseSg2LCA0KTtcbiAgICAgKiAvLyA9PiAyNFxuICAgICAqL1xuICAgIHZhciBtdWx0aXBseSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllciwgbXVsdGlwbGljYW5kKSB7XG4gICAgICByZXR1cm4gbXVsdGlwbGllciAqIG11bHRpcGxpY2FuZDtcbiAgICB9LCAxKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNiwgMik7XG4gICAgICogLy8gPT4gNC4wMVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDEwMFxuICAgICAqL1xuICAgIHZhciByb3VuZCA9IGNyZWF0ZVJvdW5kKCdyb3VuZCcpO1xuXG4gICAgLyoqXG4gICAgICogU3VidHJhY3QgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW51ZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3VidHJhaGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGRpZmZlcmVuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VidHJhY3QoNiwgNCk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIHZhciBzdWJ0cmFjdCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obWludWVuZCwgc3VidHJhaGVuZCkge1xuICAgICAgcmV0dXJuIG1pbnVlbmQgLSBzdWJ0cmFoZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1bShbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBpZGVudGl0eSlcbiAgICAgICAgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc3VtYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgc3VtbWVkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5zdW1CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IDIwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW1CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiAwO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHdyYXBwZWQgdmFsdWVzIGluIGNoYWluIHNlcXVlbmNlcy5cbiAgICBsb2Rhc2guYWZ0ZXIgPSBhZnRlcjtcbiAgICBsb2Rhc2guYXJ5ID0gYXJ5O1xuICAgIGxvZGFzaC5hc3NpZ24gPSBhc3NpZ247XG4gICAgbG9kYXNoLmFzc2lnbkluID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmFzc2lnbkluV2l0aCA9IGFzc2lnbkluV2l0aDtcbiAgICBsb2Rhc2guYXNzaWduV2l0aCA9IGFzc2lnbldpdGg7XG4gICAgbG9kYXNoLmF0ID0gYXQ7XG4gICAgbG9kYXNoLmJlZm9yZSA9IGJlZm9yZTtcbiAgICBsb2Rhc2guYmluZCA9IGJpbmQ7XG4gICAgbG9kYXNoLmJpbmRBbGwgPSBiaW5kQWxsO1xuICAgIGxvZGFzaC5iaW5kS2V5ID0gYmluZEtleTtcbiAgICBsb2Rhc2guY2FzdEFycmF5ID0gY2FzdEFycmF5O1xuICAgIGxvZGFzaC5jaGFpbiA9IGNoYWluO1xuICAgIGxvZGFzaC5jaHVuayA9IGNodW5rO1xuICAgIGxvZGFzaC5jb21wYWN0ID0gY29tcGFjdDtcbiAgICBsb2Rhc2guY29uY2F0ID0gY29uY2F0O1xuICAgIGxvZGFzaC5jb25kID0gY29uZDtcbiAgICBsb2Rhc2guY29uZm9ybXMgPSBjb25mb3JtcztcbiAgICBsb2Rhc2guY29uc3RhbnQgPSBjb25zdGFudDtcbiAgICBsb2Rhc2guY291bnRCeSA9IGNvdW50Qnk7XG4gICAgbG9kYXNoLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBsb2Rhc2guY3VycnkgPSBjdXJyeTtcbiAgICBsb2Rhc2guY3VycnlSaWdodCA9IGN1cnJ5UmlnaHQ7XG4gICAgbG9kYXNoLmRlYm91bmNlID0gZGVib3VuY2U7XG4gICAgbG9kYXNoLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4gICAgbG9kYXNoLmRlZmF1bHRzRGVlcCA9IGRlZmF1bHRzRGVlcDtcbiAgICBsb2Rhc2guZGVmZXIgPSBkZWZlcjtcbiAgICBsb2Rhc2guZGVsYXkgPSBkZWxheTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2U7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VCeSA9IGRpZmZlcmVuY2VCeTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZVdpdGggPSBkaWZmZXJlbmNlV2l0aDtcbiAgICBsb2Rhc2guZHJvcCA9IGRyb3A7XG4gICAgbG9kYXNoLmRyb3BSaWdodCA9IGRyb3BSaWdodDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0V2hpbGUgPSBkcm9wUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2guZHJvcFdoaWxlID0gZHJvcFdoaWxlO1xuICAgIGxvZGFzaC5maWxsID0gZmlsbDtcbiAgICBsb2Rhc2guZmlsdGVyID0gZmlsdGVyO1xuICAgIGxvZGFzaC5mbGF0TWFwID0gZmxhdE1hcDtcbiAgICBsb2Rhc2guZmxhdE1hcERlZXAgPSBmbGF0TWFwRGVlcDtcbiAgICBsb2Rhc2guZmxhdE1hcERlcHRoID0gZmxhdE1hcERlcHRoO1xuICAgIGxvZGFzaC5mbGF0dGVuID0gZmxhdHRlbjtcbiAgICBsb2Rhc2guZmxhdHRlbkRlZXAgPSBmbGF0dGVuRGVlcDtcbiAgICBsb2Rhc2guZmxhdHRlbkRlcHRoID0gZmxhdHRlbkRlcHRoO1xuICAgIGxvZGFzaC5mbGlwID0gZmxpcDtcbiAgICBsb2Rhc2guZmxvdyA9IGZsb3c7XG4gICAgbG9kYXNoLmZsb3dSaWdodCA9IGZsb3dSaWdodDtcbiAgICBsb2Rhc2guZnJvbVBhaXJzID0gZnJvbVBhaXJzO1xuICAgIGxvZGFzaC5mdW5jdGlvbnMgPSBmdW5jdGlvbnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9uc0luID0gZnVuY3Rpb25zSW47XG4gICAgbG9kYXNoLmdyb3VwQnkgPSBncm91cEJ5O1xuICAgIGxvZGFzaC5pbml0aWFsID0gaW5pdGlhbDtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb25CeSA9IGludGVyc2VjdGlvbkJ5O1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb25XaXRoID0gaW50ZXJzZWN0aW9uV2l0aDtcbiAgICBsb2Rhc2guaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIGxvZGFzaC5pbnZlcnRCeSA9IGludmVydEJ5O1xuICAgIGxvZGFzaC5pbnZva2VNYXAgPSBpbnZva2VNYXA7XG4gICAgbG9kYXNoLml0ZXJhdGVlID0gaXRlcmF0ZWU7XG4gICAgbG9kYXNoLmtleUJ5ID0ga2V5Qnk7XG4gICAgbG9kYXNoLmtleXMgPSBrZXlzO1xuICAgIGxvZGFzaC5rZXlzSW4gPSBrZXlzSW47XG4gICAgbG9kYXNoLm1hcCA9IG1hcDtcbiAgICBsb2Rhc2gubWFwS2V5cyA9IG1hcEtleXM7XG4gICAgbG9kYXNoLm1hcFZhbHVlcyA9IG1hcFZhbHVlcztcbiAgICBsb2Rhc2gubWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgbG9kYXNoLm1hdGNoZXNQcm9wZXJ0eSA9IG1hdGNoZXNQcm9wZXJ0eTtcbiAgICBsb2Rhc2gubWVtb2l6ZSA9IG1lbW9pemU7XG4gICAgbG9kYXNoLm1lcmdlID0gbWVyZ2U7XG4gICAgbG9kYXNoLm1lcmdlV2l0aCA9IG1lcmdlV2l0aDtcbiAgICBsb2Rhc2gubWV0aG9kID0gbWV0aG9kO1xuICAgIGxvZGFzaC5tZXRob2RPZiA9IG1ldGhvZE9mO1xuICAgIGxvZGFzaC5taXhpbiA9IG1peGluO1xuICAgIGxvZGFzaC5uZWdhdGUgPSBuZWdhdGU7XG4gICAgbG9kYXNoLm50aEFyZyA9IG50aEFyZztcbiAgICBsb2Rhc2gub21pdCA9IG9taXQ7XG4gICAgbG9kYXNoLm9taXRCeSA9IG9taXRCeTtcbiAgICBsb2Rhc2gub25jZSA9IG9uY2U7XG4gICAgbG9kYXNoLm9yZGVyQnkgPSBvcmRlckJ5O1xuICAgIGxvZGFzaC5vdmVyID0gb3ZlcjtcbiAgICBsb2Rhc2gub3ZlckFyZ3MgPSBvdmVyQXJncztcbiAgICBsb2Rhc2gub3ZlckV2ZXJ5ID0gb3ZlckV2ZXJ5O1xuICAgIGxvZGFzaC5vdmVyU29tZSA9IG92ZXJTb21lO1xuICAgIGxvZGFzaC5wYXJ0aWFsID0gcGFydGlhbDtcbiAgICBsb2Rhc2gucGFydGlhbFJpZ2h0ID0gcGFydGlhbFJpZ2h0O1xuICAgIGxvZGFzaC5wYXJ0aXRpb24gPSBwYXJ0aXRpb247XG4gICAgbG9kYXNoLnBpY2sgPSBwaWNrO1xuICAgIGxvZGFzaC5waWNrQnkgPSBwaWNrQnk7XG4gICAgbG9kYXNoLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgbG9kYXNoLnByb3BlcnR5T2YgPSBwcm9wZXJ0eU9mO1xuICAgIGxvZGFzaC5wdWxsID0gcHVsbDtcbiAgICBsb2Rhc2gucHVsbEFsbCA9IHB1bGxBbGw7XG4gICAgbG9kYXNoLnB1bGxBbGxCeSA9IHB1bGxBbGxCeTtcbiAgICBsb2Rhc2gucHVsbEFsbFdpdGggPSBwdWxsQWxsV2l0aDtcbiAgICBsb2Rhc2gucHVsbEF0ID0gcHVsbEF0O1xuICAgIGxvZGFzaC5yYW5nZSA9IHJhbmdlO1xuICAgIGxvZGFzaC5yYW5nZVJpZ2h0ID0gcmFuZ2VSaWdodDtcbiAgICBsb2Rhc2gucmVhcmcgPSByZWFyZztcbiAgICBsb2Rhc2gucmVqZWN0ID0gcmVqZWN0O1xuICAgIGxvZGFzaC5yZW1vdmUgPSByZW1vdmU7XG4gICAgbG9kYXNoLnJlc3QgPSByZXN0O1xuICAgIGxvZGFzaC5yZXZlcnNlID0gcmV2ZXJzZTtcbiAgICBsb2Rhc2guc2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7XG4gICAgbG9kYXNoLnNldCA9IHNldDtcbiAgICBsb2Rhc2guc2V0V2l0aCA9IHNldFdpdGg7XG4gICAgbG9kYXNoLnNodWZmbGUgPSBzaHVmZmxlO1xuICAgIGxvZGFzaC5zbGljZSA9IHNsaWNlO1xuICAgIGxvZGFzaC5zb3J0QnkgPSBzb3J0Qnk7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXEgPSBzb3J0ZWRVbmlxO1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxQnkgPSBzb3J0ZWRVbmlxQnk7XG4gICAgbG9kYXNoLnNwbGl0ID0gc3BsaXQ7XG4gICAgbG9kYXNoLnNwcmVhZCA9IHNwcmVhZDtcbiAgICBsb2Rhc2gudGFpbCA9IHRhaWw7XG4gICAgbG9kYXNoLnRha2UgPSB0YWtlO1xuICAgIGxvZGFzaC50YWtlUmlnaHQgPSB0YWtlUmlnaHQ7XG4gICAgbG9kYXNoLnRha2VSaWdodFdoaWxlID0gdGFrZVJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLnRha2VXaGlsZSA9IHRha2VXaGlsZTtcbiAgICBsb2Rhc2gudGFwID0gdGFwO1xuICAgIGxvZGFzaC50aHJvdHRsZSA9IHRocm90dGxlO1xuICAgIGxvZGFzaC50aHJ1ID0gdGhydTtcbiAgICBsb2Rhc2gudG9BcnJheSA9IHRvQXJyYXk7XG4gICAgbG9kYXNoLnRvUGFpcnMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC50b1BhaXJzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLnRvUGF0aCA9IHRvUGF0aDtcbiAgICBsb2Rhc2gudG9QbGFpbk9iamVjdCA9IHRvUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBsb2Rhc2gudW5hcnkgPSB1bmFyeTtcbiAgICBsb2Rhc2gudW5pb24gPSB1bmlvbjtcbiAgICBsb2Rhc2gudW5pb25CeSA9IHVuaW9uQnk7XG4gICAgbG9kYXNoLnVuaW9uV2l0aCA9IHVuaW9uV2l0aDtcbiAgICBsb2Rhc2gudW5pcSA9IHVuaXE7XG4gICAgbG9kYXNoLnVuaXFCeSA9IHVuaXFCeTtcbiAgICBsb2Rhc2gudW5pcVdpdGggPSB1bmlxV2l0aDtcbiAgICBsb2Rhc2gudW5zZXQgPSB1bnNldDtcbiAgICBsb2Rhc2gudW56aXAgPSB1bnppcDtcbiAgICBsb2Rhc2gudW56aXBXaXRoID0gdW56aXBXaXRoO1xuICAgIGxvZGFzaC51cGRhdGUgPSB1cGRhdGU7XG4gICAgbG9kYXNoLnVwZGF0ZVdpdGggPSB1cGRhdGVXaXRoO1xuICAgIGxvZGFzaC52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgbG9kYXNoLnZhbHVlc0luID0gdmFsdWVzSW47XG4gICAgbG9kYXNoLndpdGhvdXQgPSB3aXRob3V0O1xuICAgIGxvZGFzaC53b3JkcyA9IHdvcmRzO1xuICAgIGxvZGFzaC53cmFwID0gd3JhcDtcbiAgICBsb2Rhc2gueG9yID0geG9yO1xuICAgIGxvZGFzaC54b3JCeSA9IHhvckJ5O1xuICAgIGxvZGFzaC54b3JXaXRoID0geG9yV2l0aDtcbiAgICBsb2Rhc2guemlwID0gemlwO1xuICAgIGxvZGFzaC56aXBPYmplY3QgPSB6aXBPYmplY3Q7XG4gICAgbG9kYXNoLnppcE9iamVjdERlZXAgPSB6aXBPYmplY3REZWVwO1xuICAgIGxvZGFzaC56aXBXaXRoID0gemlwV2l0aDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lbnRyaWVzID0gdG9QYWlycztcbiAgICBsb2Rhc2guZW50cmllc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC5leHRlbmQgPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guZXh0ZW5kV2l0aCA9IGFzc2lnbkluV2l0aDtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBtaXhpbihsb2Rhc2gsIGxvZGFzaCk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzIGluIGNoYWluIHNlcXVlbmNlcy5cbiAgICBsb2Rhc2guYWRkID0gYWRkO1xuICAgIGxvZGFzaC5hdHRlbXB0ID0gYXR0ZW1wdDtcbiAgICBsb2Rhc2guY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xuICAgIGxvZGFzaC5jYXBpdGFsaXplID0gY2FwaXRhbGl6ZTtcbiAgICBsb2Rhc2guY2VpbCA9IGNlaWw7XG4gICAgbG9kYXNoLmNsYW1wID0gY2xhbXA7XG4gICAgbG9kYXNoLmNsb25lID0gY2xvbmU7XG4gICAgbG9kYXNoLmNsb25lRGVlcCA9IGNsb25lRGVlcDtcbiAgICBsb2Rhc2guY2xvbmVEZWVwV2l0aCA9IGNsb25lRGVlcFdpdGg7XG4gICAgbG9kYXNoLmNsb25lV2l0aCA9IGNsb25lV2l0aDtcbiAgICBsb2Rhc2guY29uZm9ybXNUbyA9IGNvbmZvcm1zVG87XG4gICAgbG9kYXNoLmRlYnVyciA9IGRlYnVycjtcbiAgICBsb2Rhc2guZGVmYXVsdFRvID0gZGVmYXVsdFRvO1xuICAgIGxvZGFzaC5kaXZpZGUgPSBkaXZpZGU7XG4gICAgbG9kYXNoLmVuZHNXaXRoID0gZW5kc1dpdGg7XG4gICAgbG9kYXNoLmVxID0gZXE7XG4gICAgbG9kYXNoLmVzY2FwZSA9IGVzY2FwZTtcbiAgICBsb2Rhc2guZXNjYXBlUmVnRXhwID0gZXNjYXBlUmVnRXhwO1xuICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5maW5kID0gZmluZDtcbiAgICBsb2Rhc2guZmluZEluZGV4ID0gZmluZEluZGV4O1xuICAgIGxvZGFzaC5maW5kS2V5ID0gZmluZEtleTtcbiAgICBsb2Rhc2guZmluZExhc3QgPSBmaW5kTGFzdDtcbiAgICBsb2Rhc2guZmluZExhc3RJbmRleCA9IGZpbmRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLmZpbmRMYXN0S2V5ID0gZmluZExhc3RLZXk7XG4gICAgbG9kYXNoLmZsb29yID0gZmxvb3I7XG4gICAgbG9kYXNoLmZvckVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5mb3JFYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZvckluID0gZm9ySW47XG4gICAgbG9kYXNoLmZvckluUmlnaHQgPSBmb3JJblJpZ2h0O1xuICAgIGxvZGFzaC5mb3JPd24gPSBmb3JPd247XG4gICAgbG9kYXNoLmZvck93blJpZ2h0ID0gZm9yT3duUmlnaHQ7XG4gICAgbG9kYXNoLmdldCA9IGdldDtcbiAgICBsb2Rhc2guZ3QgPSBndDtcbiAgICBsb2Rhc2guZ3RlID0gZ3RlO1xuICAgIGxvZGFzaC5oYXMgPSBoYXM7XG4gICAgbG9kYXNoLmhhc0luID0gaGFzSW47XG4gICAgbG9kYXNoLmhlYWQgPSBoZWFkO1xuICAgIGxvZGFzaC5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIGxvZGFzaC5pbmNsdWRlcyA9IGluY2x1ZGVzO1xuICAgIGxvZGFzaC5pbmRleE9mID0gaW5kZXhPZjtcbiAgICBsb2Rhc2guaW5SYW5nZSA9IGluUmFuZ2U7XG4gICAgbG9kYXNoLmludm9rZSA9IGludm9rZTtcbiAgICBsb2Rhc2guaXNBcmd1bWVudHMgPSBpc0FyZ3VtZW50cztcbiAgICBsb2Rhc2guaXNBcnJheSA9IGlzQXJyYXk7XG4gICAgbG9kYXNoLmlzQXJyYXlCdWZmZXIgPSBpc0FycmF5QnVmZmVyO1xuICAgIGxvZGFzaC5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuICAgIGxvZGFzaC5pc0FycmF5TGlrZU9iamVjdCA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuICAgIGxvZGFzaC5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG4gICAgbG9kYXNoLmlzQnVmZmVyID0gaXNCdWZmZXI7XG4gICAgbG9kYXNoLmlzRGF0ZSA9IGlzRGF0ZTtcbiAgICBsb2Rhc2guaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuICAgIGxvZGFzaC5pc0VtcHR5ID0gaXNFbXB0eTtcbiAgICBsb2Rhc2guaXNFcXVhbCA9IGlzRXF1YWw7XG4gICAgbG9kYXNoLmlzRXF1YWxXaXRoID0gaXNFcXVhbFdpdGg7XG4gICAgbG9kYXNoLmlzRXJyb3IgPSBpc0Vycm9yO1xuICAgIGxvZGFzaC5pc0Zpbml0ZSA9IGlzRmluaXRlO1xuICAgIGxvZGFzaC5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbiAgICBsb2Rhc2guaXNJbnRlZ2VyID0gaXNJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc0xlbmd0aCA9IGlzTGVuZ3RoO1xuICAgIGxvZGFzaC5pc01hcCA9IGlzTWFwO1xuICAgIGxvZGFzaC5pc01hdGNoID0gaXNNYXRjaDtcbiAgICBsb2Rhc2guaXNNYXRjaFdpdGggPSBpc01hdGNoV2l0aDtcbiAgICBsb2Rhc2guaXNOYU4gPSBpc05hTjtcbiAgICBsb2Rhc2guaXNOYXRpdmUgPSBpc05hdGl2ZTtcbiAgICBsb2Rhc2guaXNOaWwgPSBpc05pbDtcbiAgICBsb2Rhc2guaXNOdWxsID0gaXNOdWxsO1xuICAgIGxvZGFzaC5pc051bWJlciA9IGlzTnVtYmVyO1xuICAgIGxvZGFzaC5pc09iamVjdCA9IGlzT2JqZWN0O1xuICAgIGxvZGFzaC5pc09iamVjdExpa2UgPSBpc09iamVjdExpa2U7XG4gICAgbG9kYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuICAgIGxvZGFzaC5pc1NhZmVJbnRlZ2VyID0gaXNTYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNTZXQgPSBpc1NldDtcbiAgICBsb2Rhc2guaXNTdHJpbmcgPSBpc1N0cmluZztcbiAgICBsb2Rhc2guaXNTeW1ib2wgPSBpc1N5bWJvbDtcbiAgICBsb2Rhc2guaXNUeXBlZEFycmF5ID0gaXNUeXBlZEFycmF5O1xuICAgIGxvZGFzaC5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuICAgIGxvZGFzaC5pc1dlYWtNYXAgPSBpc1dlYWtNYXA7XG4gICAgbG9kYXNoLmlzV2Vha1NldCA9IGlzV2Vha1NldDtcbiAgICBsb2Rhc2guam9pbiA9IGpvaW47XG4gICAgbG9kYXNoLmtlYmFiQ2FzZSA9IGtlYmFiQ2FzZTtcbiAgICBsb2Rhc2gubGFzdCA9IGxhc3Q7XG4gICAgbG9kYXNoLmxhc3RJbmRleE9mID0gbGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLmxvd2VyQ2FzZSA9IGxvd2VyQ2FzZTtcbiAgICBsb2Rhc2gubG93ZXJGaXJzdCA9IGxvd2VyRmlyc3Q7XG4gICAgbG9kYXNoLmx0ID0gbHQ7XG4gICAgbG9kYXNoLmx0ZSA9IGx0ZTtcbiAgICBsb2Rhc2gubWF4ID0gbWF4O1xuICAgIGxvZGFzaC5tYXhCeSA9IG1heEJ5O1xuICAgIGxvZGFzaC5tZWFuID0gbWVhbjtcbiAgICBsb2Rhc2gubWVhbkJ5ID0gbWVhbkJ5O1xuICAgIGxvZGFzaC5taW4gPSBtaW47XG4gICAgbG9kYXNoLm1pbkJ5ID0gbWluQnk7XG4gICAgbG9kYXNoLnN0dWJBcnJheSA9IHN0dWJBcnJheTtcbiAgICBsb2Rhc2guc3R1YkZhbHNlID0gc3R1YkZhbHNlO1xuICAgIGxvZGFzaC5zdHViT2JqZWN0ID0gc3R1Yk9iamVjdDtcbiAgICBsb2Rhc2guc3R1YlN0cmluZyA9IHN0dWJTdHJpbmc7XG4gICAgbG9kYXNoLnN0dWJUcnVlID0gc3R1YlRydWU7XG4gICAgbG9kYXNoLm11bHRpcGx5ID0gbXVsdGlwbHk7XG4gICAgbG9kYXNoLm50aCA9IG50aDtcbiAgICBsb2Rhc2gubm9Db25mbGljdCA9IG5vQ29uZmxpY3Q7XG4gICAgbG9kYXNoLm5vb3AgPSBub29wO1xuICAgIGxvZGFzaC5ub3cgPSBub3c7XG4gICAgbG9kYXNoLnBhZCA9IHBhZDtcbiAgICBsb2Rhc2gucGFkRW5kID0gcGFkRW5kO1xuICAgIGxvZGFzaC5wYWRTdGFydCA9IHBhZFN0YXJ0O1xuICAgIGxvZGFzaC5wYXJzZUludCA9IHBhcnNlSW50O1xuICAgIGxvZGFzaC5yYW5kb20gPSByYW5kb207XG4gICAgbG9kYXNoLnJlZHVjZSA9IHJlZHVjZTtcbiAgICBsb2Rhc2gucmVkdWNlUmlnaHQgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2gucmVwZWF0ID0gcmVwZWF0O1xuICAgIGxvZGFzaC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICBsb2Rhc2gucmVzdWx0ID0gcmVzdWx0O1xuICAgIGxvZGFzaC5yb3VuZCA9IHJvdW5kO1xuICAgIGxvZGFzaC5ydW5JbkNvbnRleHQgPSBydW5JbkNvbnRleHQ7XG4gICAgbG9kYXNoLnNhbXBsZSA9IHNhbXBsZTtcbiAgICBsb2Rhc2guc2l6ZSA9IHNpemU7XG4gICAgbG9kYXNoLnNuYWtlQ2FzZSA9IHNuYWtlQ2FzZTtcbiAgICBsb2Rhc2guc29tZSA9IHNvbWU7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4ID0gc29ydGVkSW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4QnkgPSBzb3J0ZWRJbmRleEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleE9mID0gc29ydGVkSW5kZXhPZjtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4ID0gc29ydGVkTGFzdEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeSA9IHNvcnRlZExhc3RJbmRleEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXhPZiA9IHNvcnRlZExhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5zdGFydENhc2UgPSBzdGFydENhc2U7XG4gICAgbG9kYXNoLnN0YXJ0c1dpdGggPSBzdGFydHNXaXRoO1xuICAgIGxvZGFzaC5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuICAgIGxvZGFzaC5zdW0gPSBzdW07XG4gICAgbG9kYXNoLnN1bUJ5ID0gc3VtQnk7XG4gICAgbG9kYXNoLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgbG9kYXNoLnRpbWVzID0gdGltZXM7XG4gICAgbG9kYXNoLnRvRmluaXRlID0gdG9GaW5pdGU7XG4gICAgbG9kYXNoLnRvSW50ZWdlciA9IHRvSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9MZW5ndGggPSB0b0xlbmd0aDtcbiAgICBsb2Rhc2gudG9Mb3dlciA9IHRvTG93ZXI7XG4gICAgbG9kYXNoLnRvTnVtYmVyID0gdG9OdW1iZXI7XG4gICAgbG9kYXNoLnRvU2FmZUludGVnZXIgPSB0b1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIGxvZGFzaC50b1VwcGVyID0gdG9VcHBlcjtcbiAgICBsb2Rhc2gudHJpbSA9IHRyaW07XG4gICAgbG9kYXNoLnRyaW1FbmQgPSB0cmltRW5kO1xuICAgIGxvZGFzaC50cmltU3RhcnQgPSB0cmltU3RhcnQ7XG4gICAgbG9kYXNoLnRydW5jYXRlID0gdHJ1bmNhdGU7XG4gICAgbG9kYXNoLnVuZXNjYXBlID0gdW5lc2NhcGU7XG4gICAgbG9kYXNoLnVuaXF1ZUlkID0gdW5pcXVlSWQ7XG4gICAgbG9kYXNoLnVwcGVyQ2FzZSA9IHVwcGVyQ2FzZTtcbiAgICBsb2Rhc2gudXBwZXJGaXJzdCA9IHVwcGVyRmlyc3Q7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZmlyc3QgPSBoZWFkO1xuXG4gICAgbWl4aW4obG9kYXNoLCAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc291cmNlID0ge307XG4gICAgICBiYXNlRm9yT3duKGxvZGFzaCwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLnByb3RvdHlwZSwgbWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICBzb3VyY2VbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfSgpKSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgbG9kYXNoLlZFUlNJT04gPSBWRVJTSU9OO1xuXG4gICAgLy8gQXNzaWduIGRlZmF1bHQgcGxhY2Vob2xkZXJzLlxuICAgIGFycmF5RWFjaChbJ2JpbmQnLCAnYmluZEtleScsICdjdXJyeScsICdjdXJyeVJpZ2h0JywgJ3BhcnRpYWwnLCAncGFydGlhbFJpZ2h0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIGxvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlciA9IGxvZGFzaDtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmRyb3BgIGFuZCBgXy50YWtlYCB2YXJpYW50cy5cbiAgICBhcnJheUVhY2goWydkcm9wJywgJ3Rha2UnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgbiA9IG4gPT09IHVuZGVmaW5lZCA/IDEgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLCAwKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gKHRoaXMuX19maWx0ZXJlZF9fICYmICFpbmRleClcbiAgICAgICAgICA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKVxuICAgICAgICAgIDogdGhpcy5jbG9uZSgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fKSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSBuYXRpdmVNaW4obiwgcmVzdWx0Ll9fdGFrZUNvdW50X18pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5fX3ZpZXdzX18ucHVzaCh7XG4gICAgICAgICAgICAnc2l6ZSc6IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKSxcbiAgICAgICAgICAgICd0eXBlJzogbWV0aG9kTmFtZSArIChyZXN1bHQuX19kaXJfXyA8IDAgPyAnUmlnaHQnIDogJycpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lICsgJ1JpZ2h0J10gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKVttZXRob2ROYW1lXShuKS5yZXZlcnNlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0aGF0IGFjY2VwdCBhbiBgaXRlcmF0ZWVgIHZhbHVlLlxuICAgIGFycmF5RWFjaChbJ2ZpbHRlcicsICdtYXAnLCAndGFrZVdoaWxlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdHlwZSA9IGluZGV4ICsgMSxcbiAgICAgICAgICBpc0ZpbHRlciA9IHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRyB8fCB0eXBlID09IExBWllfV0hJTEVfRkxBRztcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18ucHVzaCh7XG4gICAgICAgICAgJ2l0ZXJhdGVlJzogZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLFxuICAgICAgICAgICd0eXBlJzogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHJlc3VsdC5fX2ZpbHRlcmVkX18gfHwgaXNGaWx0ZXI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaGVhZGAgYW5kIGBfLmxhc3RgLlxuICAgIGFycmF5RWFjaChbJ2hlYWQnLCAnbGFzdCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHRha2VOYW1lID0gJ3Rha2UnICsgKGluZGV4ID8gJ1JpZ2h0JyA6ICcnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Rha2VOYW1lXSgxKS52YWx1ZSgpWzBdO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmluaXRpYWxgIGFuZCBgXy50YWlsYC5cbiAgICBhcnJheUVhY2goWydpbml0aWFsJywgJ3RhaWwnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciBkcm9wTmFtZSA9ICdkcm9wJyArIChpbmRleCA/ICcnIDogJ1JpZ2h0Jyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18gPyBuZXcgTGF6eVdyYXBwZXIodGhpcykgOiB0aGlzW2Ryb3BOYW1lXSgxKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29tcGFjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihwcmVkaWNhdGUpLmhlYWQoKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmRMYXN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG5cbiAgICAgIHZhciByZXN1bHQgPSB0aGlzO1xuICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18gJiYgKHN0YXJ0ID4gMCB8fCBlbmQgPCAwKSkge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmRyb3Aoc3RhcnQpO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHRvSW50ZWdlcihlbmQpO1xuICAgICAgICByZXN1bHQgPSBlbmQgPCAwID8gcmVzdWx0LmRyb3BSaWdodCgtZW5kKSA6IHJlc3VsdC50YWtlKGVuZCAtIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZSA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZShwcmVkaWNhdGUpLnJldmVyc2UoKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCk7XG4gICAgfTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgY2hlY2tJdGVyYXRlZSA9IC9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLFxuICAgICAgICAgIGlzVGFrZXIgPSAvXig/OmhlYWR8bGFzdCkkLy50ZXN0KG1ldGhvZE5hbWUpLFxuICAgICAgICAgIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbaXNUYWtlciA/ICgndGFrZScgKyAobWV0aG9kTmFtZSA9PSAnbGFzdCcgPyAnUmlnaHQnIDogJycpKSA6IG1ldGhvZE5hbWVdLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IGlzVGFrZXIgfHwgL15maW5kLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBpZiAoIWxvZGFzaEZ1bmMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgICAgYXJncyA9IGlzVGFrZXIgPyBbMV0gOiBhcmd1bWVudHMsXG4gICAgICAgICAgICBpc0xhenkgPSB2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyLFxuICAgICAgICAgICAgaXRlcmF0ZWUgPSBhcmdzWzBdLFxuICAgICAgICAgICAgdXNlTGF6eSA9IGlzTGF6eSB8fCBpc0FycmF5KHZhbHVlKTtcblxuICAgICAgICB2YXIgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2hGdW5jLmFwcGx5KGxvZGFzaCwgYXJyYXlQdXNoKFt2YWx1ZV0sIGFyZ3MpKTtcbiAgICAgICAgICByZXR1cm4gKGlzVGFrZXIgJiYgY2hhaW5BbGwpID8gcmVzdWx0WzBdIDogcmVzdWx0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh1c2VMYXp5ICYmIGNoZWNrSXRlcmF0ZWUgJiYgdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgJiYgaXRlcmF0ZWUubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICAvLyBBdm9pZCBsYXp5IHVzZSBpZiB0aGUgaXRlcmF0ZWUgaGFzIGEgXCJsZW5ndGhcIiB2YWx1ZSBvdGhlciB0aGFuIGAxYC5cbiAgICAgICAgICBpc0xhenkgPSB1c2VMYXp5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sXG4gICAgICAgICAgICBpc0h5YnJpZCA9ICEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsXG4gICAgICAgICAgICBpc1Vud3JhcHBlZCA9IHJldFVud3JhcHBlZCAmJiAhY2hhaW5BbGwsXG4gICAgICAgICAgICBvbmx5TGF6eSA9IGlzTGF6eSAmJiAhaXNIeWJyaWQ7XG5cbiAgICAgICAgaWYgKCFyZXRVbndyYXBwZWQgJiYgdXNlTGF6eSkge1xuICAgICAgICAgIHZhbHVlID0gb25seUxhenkgPyB2YWx1ZSA6IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh2YWx1ZSwgYXJncyk7XG4gICAgICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fLnB1c2goeyAnZnVuYyc6IHRocnUsICdhcmdzJzogW2ludGVyY2VwdG9yXSwgJ3RoaXNBcmcnOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCwgY2hhaW5BbGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Vud3JhcHBlZCAmJiBvbmx5TGF6eSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICAgIHJldHVybiBpc1Vud3JhcHBlZCA/IChpc1Rha2VyID8gcmVzdWx0LnZhbHVlKClbMF0gOiByZXN1bHQudmFsdWUoKSkgOiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBBcnJheWAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYXJyYXlFYWNoKFsncG9wJywgJ3B1c2gnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IGFycmF5UHJvdG9bbWV0aG9kTmFtZV0sXG4gICAgICAgICAgY2hhaW5OYW1lID0gL14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpID8gJ3RhcCcgOiAndGhydScsXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gL14oPzpwb3B8c2hpZnQpJC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgaWYgKHJldFVud3JhcHBlZCAmJiAhdGhpcy5fX2NoYWluX18pIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1tjaGFpbk5hbWVdKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gTWFwIG1pbmlmaWVkIG1ldGhvZCBuYW1lcyB0byB0aGVpciByZWFsIG5hbWVzLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgbG9kYXNoRnVuYyA9IGxvZGFzaFttZXRob2ROYW1lXTtcbiAgICAgIGlmIChsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHZhciBrZXkgPSAobG9kYXNoRnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgICAgbmFtZXMgPSByZWFsTmFtZXNba2V5XSB8fCAocmVhbE5hbWVzW2tleV0gPSBbXSk7XG5cbiAgICAgICAgbmFtZXMucHVzaCh7ICduYW1lJzogbWV0aG9kTmFtZSwgJ2Z1bmMnOiBsb2Rhc2hGdW5jIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVhbE5hbWVzW2NyZWF0ZUh5YnJpZCh1bmRlZmluZWQsIFdSQVBfQklORF9LRVlfRkxBRykubmFtZV0gPSBbe1xuICAgICAgJ25hbWUnOiAnd3JhcHBlcicsXG4gICAgICAnZnVuYyc6IHVuZGVmaW5lZFxuICAgIH1dO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYExhenlXcmFwcGVyYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY2xvbmUgPSBsYXp5Q2xvbmU7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2UgPSBsYXp5UmV2ZXJzZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudmFsdWUgPSBsYXp5VmFsdWU7XG5cbiAgICAvLyBBZGQgY2hhaW4gc2VxdWVuY2UgbWV0aG9kcyB0byB0aGUgYGxvZGFzaGAgd3JhcHBlci5cbiAgICBsb2Rhc2gucHJvdG90eXBlLmF0ID0gd3JhcHBlckF0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY2hhaW4gPSB3cmFwcGVyQ2hhaW47XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb21taXQgPSB3cmFwcGVyQ29tbWl0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUubmV4dCA9IHdyYXBwZXJOZXh0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucGxhbnQgPSB3cmFwcGVyUGxhbnQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5yZXZlcnNlID0gd3JhcHBlclJldmVyc2U7XG4gICAgbG9kYXNoLnByb3RvdHlwZS50b0pTT04gPSBsb2Rhc2gucHJvdG90eXBlLnZhbHVlT2YgPSBsb2Rhc2gucHJvdG90eXBlLnZhbHVlID0gd3JhcHBlclZhbHVlO1xuXG4gICAgLy8gQWRkIGxhenkgYWxpYXNlcy5cbiAgICBsb2Rhc2gucHJvdG90eXBlLmZpcnN0ID0gbG9kYXNoLnByb3RvdHlwZS5oZWFkO1xuXG4gICAgaWYgKHN5bUl0ZXJhdG9yKSB7XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW3N5bUl0ZXJhdG9yXSA9IHdyYXBwZXJUb0l0ZXJhdG9yO1xuICAgIH1cbiAgICByZXR1cm4gbG9kYXNoO1xuICB9KTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvLyBFeHBvcnQgbG9kYXNoLlxuICB2YXIgXyA9IHJ1bkluQ29udGV4dCgpO1xuXG4gIC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIGNvbmRpdGlvbiBwYXR0ZXJucyBsaWtlOlxuICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcbiAgICAvLyBFeHBvc2UgTG9kYXNoIG9uIHRoZSBnbG9iYWwgb2JqZWN0IHRvIHByZXZlbnQgZXJyb3JzIHdoZW4gTG9kYXNoIGlzXG4gICAgLy8gbG9hZGVkIGJ5IGEgc2NyaXB0IHRhZyBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQU1EIGxvYWRlci5cbiAgICAvLyBTZWUgaHR0cDovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCNtaXNtYXRjaCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIC8vIFVzZSBgXy5ub0NvbmZsaWN0YCB0byByZW1vdmUgTG9kYXNoIGZyb20gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcblxuICAgIC8vIERlZmluZSBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlIHNvLCB0aHJvdWdoIHBhdGggbWFwcGluZywgaXQgY2FuIGJlXG4gICAgLy8gcmVmZXJlbmNlZCBhcyB0aGUgXCJ1bmRlcnNjb3JlXCIgbW9kdWxlLlxuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfO1xuICAgIH0pO1xuICB9XG4gIC8vIENoZWNrIGZvciBgZXhwb3J0c2AgYWZ0ZXIgYGRlZmluZWAgaW4gY2FzZSBhIGJ1aWxkIG9wdGltaXplciBhZGRzIGl0LlxuICBlbHNlIGlmIChmcmVlTW9kdWxlKSB7XG4gICAgLy8gRXhwb3J0IGZvciBOb2RlLmpzLlxuICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBfKS5fID0gXztcbiAgICAvLyBFeHBvcnQgZm9yIENvbW1vbkpTIHN1cHBvcnQuXG4gICAgZnJlZUV4cG9ydHMuXyA9IF87XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gRXhwb3J0IHRvIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG4gIH1cbn0uY2FsbCh0aGlzKSk7XG4iLCIvKiBhbmd1bGFyLW1vbWVudC5qcyAvIHYxLjAuMSAvIChjKSAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2IFVyaSBTaGFrZWQgLyBNSVQgTGljZW5jZSAqL1xuXG4nZm9ybWF0IGFtZCc7XG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHRmdW5jdGlvbiBpc1VuZGVmaW5lZE9yTnVsbCh2YWwpIHtcblx0XHRyZXR1cm4gYW5ndWxhci5pc1VuZGVmaW5lZCh2YWwpIHx8IHZhbCA9PT0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlcXVpcmVNb21lbnQoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiByZXF1aXJlKCdtb21lbnQnKTsgLy8gVXNpbmcgbncuanMgb3IgYnJvd3NlcmlmeT9cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBpbnN0YWxsIG1vbWVudCB2aWEgbnBtLiBQbGVhc2UgcmVmZXJlbmNlIHRvOiBodHRwczovL2dpdGh1Yi5jb20vdXJpc2gvYW5ndWxhci1tb21lbnQnKTsgLy8gQWRkIHdpa2kvdHJvdWJsZXNob290aW5nIHNlY3Rpb24/XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYW5ndWxhck1vbWVudChhbmd1bGFyLCBtb21lbnQpIHtcblxuXHRcdGlmKHR5cGVvZiBtb21lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRpZih0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRtb21lbnQgPSByZXF1aXJlTW9tZW50KCk7XG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNb21lbnQgY2Fubm90IGJlIGZvdW5kIGJ5IGFuZ3VsYXItbW9tZW50ISBQbGVhc2UgcmVmZXJlbmNlIHRvOiBodHRwczovL2dpdGh1Yi5jb20vdXJpc2gvYW5ndWxhci1tb21lbnQnKTsgLy8gQWRkIHdpa2kvdHJvdWJsZXNob290aW5nIHNlY3Rpb24/XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIG92ZXJ2aWV3XG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudFxuXHRcdCAqXG5cdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0ICogYW5ndWxhck1vbWVudCBtb2R1bGUgcHJvdmlkZXMgbW9tZW50LmpzIGZ1bmN0aW9uYWxpdHkgZm9yIGFuZ3VsYXIuanMgYXBwcy5cblx0XHQgKi9cblx0XHRhbmd1bGFyLm1vZHVsZSgnYW5ndWxhck1vbWVudCcsIFtdKVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIG9iamVjdFxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuY29uZmlnOmFuZ3VsYXJNb21lbnRDb25maWdcblx0XHQgKlxuXHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdCAqIENvbW1vbiBjb25maWd1cmF0aW9uIG9mIHRoZSBhbmd1bGFyTW9tZW50IG1vZHVsZVxuXHRcdCAqL1xuXHRcdFx0LmNvbnN0YW50KCdhbmd1bGFyTW9tZW50Q29uZmlnJywge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogQG5nZG9jIHByb3BlcnR5XG5cdFx0XHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuY29uZmlnLmFuZ3VsYXJNb21lbnRDb25maWcjcHJlcHJvY2Vzc1xuXHRcdFx0XHQgKiBAcHJvcGVydHlPZiBhbmd1bGFyTW9tZW50LmNvbmZpZzphbmd1bGFyTW9tZW50Q29uZmlnXG5cdFx0XHRcdCAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBwcmVwcm9jZXNzb3IgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgb24gYWxsIGluY29taW5nIGRhdGVzXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdFx0XHQgKiBEZWZpbmVzIGEgcHJlcHJvY2Vzc29yIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGFsbCBpbnB1dCBkYXRlcyAoZS5nLiB0aGUgaW5wdXQgb2YgYGFtLXRpbWUtYWdvYCxcblx0XHRcdFx0ICogYGFtQ2FsZW5kYXJgLCBldGMuKS4gVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgYG1vbWVudGAgb2JqZWN0LlxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKiBAZXhhbXBsZVxuXHRcdFx0XHQgKiAgIC8vIENhdXNlcyBhbmd1bGFyLW1vbWVudCB0byBhbHdheXMgdHJlYXQgdGhlIGlucHV0IHZhbHVlcyBhcyB1bml4IHRpbWVzdGFtcHNcblx0XHRcdFx0ICogICBhbmd1bGFyTW9tZW50Q29uZmlnLnByZXByb2Nlc3MgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHQgKiBcdCAgIHJldHVybiBtb21lbnQudW5peCh2YWx1ZSk7XG5cdFx0XHRcdCAqICAgfVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0cHJlcHJvY2VzczogbnVsbCxcblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogQG5nZG9jIHByb3BlcnR5XG5cdFx0XHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuY29uZmlnLmFuZ3VsYXJNb21lbnRDb25maWcjdGltZXpvbmVcblx0XHRcdFx0ICogQHByb3BlcnR5T2YgYW5ndWxhck1vbWVudC5jb25maWc6YW5ndWxhck1vbWVudENvbmZpZ1xuXHRcdFx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZGVmYXVsdCB0aW1lem9uZVxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKiBAZGVzY3JpcHRpb25cblx0XHRcdFx0ICogVGhlIGRlZmF1bHQgdGltZXpvbmUgKGUuZy4gJ0V1cm9wZS9Mb25kb24nKS4gRW1wdHkgc3RyaW5nIGJ5IGRlZmF1bHQgKGRvZXMgbm90IGFwcGx5XG5cdFx0XHRcdCAqIGFueSB0aW1lem9uZSBzaGlmdCkuXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIE5PVEU6IFRoaXMgb3B0aW9uIHJlcXVpcmVzIG1vbWVudC10aW1lem9uZSA+PSAwLjMuMC5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHRpbWV6b25lOiBudWxsLFxuXG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBAbmdkb2MgcHJvcGVydHlcblx0XHRcdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5jb25maWcuYW5ndWxhck1vbWVudENvbmZpZyNmb3JtYXRcblx0XHRcdFx0ICogQHByb3BlcnR5T2YgYW5ndWxhck1vbWVudC5jb25maWc6YW5ndWxhck1vbWVudENvbmZpZ1xuXHRcdFx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJlLWNvbnZlcnNpb24gZm9ybWF0IG9mIHRoZSBkYXRlXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdFx0XHQgKiBTcGVjaWZ5IHRoZSBmb3JtYXQgb2YgdGhlIGlucHV0IGRhdGUuIEVzc2VudGlhbGx5IGl0J3MgYVxuXHRcdFx0XHQgKiBkZWZhdWx0IGFuZCBzYXZlcyB5b3UgZnJvbSBzcGVjaWZ5aW5nIGEgZm9ybWF0IGluIGV2ZXJ5XG5cdFx0XHRcdCAqIGVsZW1lbnQuIE92ZXJyaWRkZW4gYnkgZWxlbWVudCBhdHRyLiBOdWxsIGJ5IGRlZmF1bHQuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRmb3JtYXQ6IG51bGwsXG5cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBuZ2RvYyBwcm9wZXJ0eVxuXHRcdFx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmNvbmZpZy5hbmd1bGFyTW9tZW50Q29uZmlnI3N0YXRlZnVsRmlsdGVyc1xuXHRcdFx0XHQgKiBAcHJvcGVydHlPZiBhbmd1bGFyTW9tZW50LmNvbmZpZzphbmd1bGFyTW9tZW50Q29uZmlnXG5cdFx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGFuZ3VsYXItbW9tZW50IGZpbHRlcnMgc2hvdWxkIGJlIHN0YXRlbGVzcyAob3Igbm90KVxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKiBAZGVzY3JpcHRpb25cblx0XHRcdFx0ICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZpbHRlcnMgaW5jbHVkZWQgd2l0aCBhbmd1bGFyLW1vbWVudCBhcmUgc3RhdGVmdWwuXG5cdFx0XHRcdCAqIFN0YXRlZnVsIGZpbHRlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHJlLWV2YWx1YXRlIHdoZW5ldmVyIHlvdSBjaGFuZ2UgdGhlIHRpbWV6b25lXG5cdFx0XHRcdCAqIG9yIGxvY2FsZSBzZXR0aW5ncywgYnV0IG1heSBuZWdhdGl2ZWx5IGltcGFjdCBwZXJmb3JtYW5jZS4gdHJ1ZSBieSBkZWZhdWx0LlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0c3RhdGVmdWxGaWx0ZXJzOiB0cnVlXG5cdFx0XHR9KVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIG9iamVjdFxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQub2JqZWN0Om1vbWVudFxuXHRcdCAqXG5cdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0ICogbW9tZW50IGdsb2JhbCAoYXMgcHJvdmlkZWQgYnkgdGhlIG1vbWVudC5qcyBsaWJyYXJ5KVxuXHRcdCAqL1xuXHRcdFx0LmNvbnN0YW50KCdtb21lbnQnLCBtb21lbnQpXG5cblx0XHQvKipcblx0XHQgKiBAbmdkb2Mgb2JqZWN0XG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5jb25maWc6YW1UaW1lQWdvQ29uZmlnXG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICpcblx0XHQgKiBAZGVzY3JpcHRpb25cblx0XHQgKiBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIHRoZSBhbVRpbWVBZ28gZGlyZWN0aXZlXG5cdFx0ICovXG5cdFx0XHQuY29uc3RhbnQoJ2FtVGltZUFnb0NvbmZpZycsIHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBuZ2RvYyBwcm9wZXJ0eVxuXHRcdFx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmNvbmZpZy5hbVRpbWVBZ29Db25maWcjd2l0aG91dFN1ZmZpeFxuXHRcdFx0XHQgKiBAcHJvcGVydHlPZiBhbmd1bGFyTW9tZW50LmNvbmZpZzphbVRpbWVBZ29Db25maWdcblx0XHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdG8gaW5jbHVkZSBhIHN1ZmZpeCBpbiBhbS10aW1lLWFnbyBkaXJlY3RpdmVcblx0XHRcdFx0ICpcblx0XHRcdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0XHRcdCAqIERlZmF1bHRzIHRvIGZhbHNlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0d2l0aG91dFN1ZmZpeDogZmFsc2UsXG5cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBuZ2RvYyBwcm9wZXJ0eVxuXHRcdFx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmNvbmZpZy5hbVRpbWVBZ29Db25maWcjc2VydmVyVGltZVxuXHRcdFx0XHQgKiBAcHJvcGVydHlPZiBhbmd1bGFyTW9tZW50LmNvbmZpZzphbVRpbWVBZ29Db25maWdcblx0XHRcdFx0ICogQHJldHVybnMge251bWJlcn0gU2VydmVyIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaFxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKiBAZGVzY3JpcHRpb25cblx0XHRcdFx0ICogSWYgc2V0LCB0aW1lIGFnbyB3aWxsIGJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIHZhbHVlLlxuXHRcdFx0XHQgKiBJZiBudWxsLCBsb2NhbCB0aW1lIHdpbGwgYmUgdXNlZC4gRGVmYXVsdHMgdG8gbnVsbC5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHNlcnZlclRpbWU6IG51bGwsXG5cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBuZ2RvYyBwcm9wZXJ0eVxuXHRcdFx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmNvbmZpZy5hbVRpbWVBZ29Db25maWcjdGl0bGVGb3JtYXRcblx0XHRcdFx0ICogQHByb3BlcnR5T2YgYW5ndWxhck1vbWVudC5jb25maWc6YW1UaW1lQWdvQ29uZmlnXG5cdFx0XHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0aXRsZSBvZiB0aGUgZWxlbWVudC4gSWYgbnVsbCxcblx0XHRcdFx0ICogICAgICAgIHRoZSBkaXJlY3RpdmUgc2V0IHRoZSB0aXRsZSBvZiB0aGUgZWxlbWVudC5cblx0XHRcdFx0ICpcblx0XHRcdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0XHRcdCAqIFRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBlbGVtZW50LiBudWxsIGJ5IGRlZmF1bHQuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aXRsZUZvcm1hdDogbnVsbCxcblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogQG5nZG9jIHByb3BlcnR5XG5cdFx0XHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuY29uZmlnLmFtVGltZUFnb0NvbmZpZyNmdWxsRGF0ZVRocmVzaG9sZFxuXHRcdFx0XHQgKiBAcHJvcGVydHlPZiBhbmd1bGFyTW9tZW50LmNvbmZpZzphbVRpbWVBZ29Db25maWdcblx0XHRcdFx0ICogQHJldHVybnMge251bWJlcn0gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRheXMgZm9yIHNob3dpbmcgYSBmdWxsIGRhdGUgaW5zdGVhZCBvZiByZWxhdGl2ZSB0aW1lXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdFx0XHQgKiBUaGUgdGhyZXNob2xkIGZvciBkaXNwbGF5aW5nIGEgZnVsbCBkYXRlLiBUaGUgZGVmYXVsdCBpcyBudWxsLCB3aGljaCBtZWFucyB0aGUgZGF0ZSB3aWxsIGFsd2F5c1xuXHRcdFx0XHQgKiBiZSByZWxhdGl2ZSwgYW5kIGZ1bGwgZGF0ZSB3aWxsIG5ldmVyIGJlIGRpc3BsYXllZC5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGZ1bGxEYXRlVGhyZXNob2xkOiBudWxsLFxuXG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBAbmdkb2MgcHJvcGVydHlcblx0XHRcdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5jb25maWcuYW1UaW1lQWdvQ29uZmlnI2Z1bGxEYXRlRm9ybWF0XG5cdFx0XHRcdCAqIEBwcm9wZXJ0eU9mIGFuZ3VsYXJNb21lbnQuY29uZmlnOmFtVGltZUFnb0NvbmZpZ1xuXHRcdFx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0IHRvIHVzZSB3aGVuIGRpc3BsYXlpbmcgYSBmdWxsIGRhdGUuXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdFx0XHQgKiBTcGVjaWZ5IHRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgd2hlbiBkaXNwbGF5ZWQgYXMgZnVsbCBkYXRlLiBudWxsIGJ5IGRlZmF1bHQuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRmdWxsRGF0ZUZvcm1hdDogbnVsbCxcblxuXHRcdFx0XHRmdWxsRGF0ZVRocmVzaG9sZFVuaXQ6ICdkYXknXG5cdFx0XHR9KVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIGRpcmVjdGl2ZVxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuZGlyZWN0aXZlOmFtVGltZUFnb1xuXHRcdCAqIEBtb2R1bGUgYW5ndWxhck1vbWVudFxuXHRcdCAqXG5cdFx0ICogQHJlc3RyaWN0IEFcblx0XHQgKi9cblx0XHRcdC5kaXJlY3RpdmUoJ2FtVGltZUFnbycsIFsnJHdpbmRvdycsICdtb21lbnQnLCAnYW1Nb21lbnQnLCAnYW1UaW1lQWdvQ29uZmlnJywgZnVuY3Rpb24gKCR3aW5kb3csIG1vbWVudCwgYW1Nb21lbnQsIGFtVGltZUFnb0NvbmZpZykge1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcblx0XHRcdFx0XHR2YXIgYWN0aXZlVGltZW91dCA9IG51bGw7XG5cdFx0XHRcdFx0dmFyIGN1cnJlbnRWYWx1ZTtcblx0XHRcdFx0XHR2YXIgd2l0aG91dFN1ZmZpeCA9IGFtVGltZUFnb0NvbmZpZy53aXRob3V0U3VmZml4O1xuXHRcdFx0XHRcdHZhciB0aXRsZUZvcm1hdCA9IGFtVGltZUFnb0NvbmZpZy50aXRsZUZvcm1hdDtcblx0XHRcdFx0XHR2YXIgZnVsbERhdGVUaHJlc2hvbGQgPSBhbVRpbWVBZ29Db25maWcuZnVsbERhdGVUaHJlc2hvbGQ7XG5cdFx0XHRcdFx0dmFyIGZ1bGxEYXRlRm9ybWF0ID0gYW1UaW1lQWdvQ29uZmlnLmZ1bGxEYXRlRm9ybWF0O1xuXHRcdFx0XHRcdHZhciBmdWxsRGF0ZVRocmVzaG9sZFVuaXQgPSBhbVRpbWVBZ29Db25maWcuZnVsbERhdGVUaHJlc2hvbGRVbml0O1xuXG5cdFx0XHRcdFx0dmFyIGxvY2FsRGF0ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXHRcdFx0XHRcdHZhciBtb2RlbE5hbWUgPSBhdHRyLmFtVGltZUFnbztcblx0XHRcdFx0XHR2YXIgY3VycmVudEZyb207XG5cdFx0XHRcdFx0dmFyIGlzVGltZUVsZW1lbnQgPSAoJ1RJTUUnID09PSBlbGVtZW50WzBdLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuXHRcdFx0XHRcdHZhciBzZXRUaXRsZVRpbWUgPSAhZWxlbWVudC5hdHRyKCd0aXRsZScpO1xuXG5cdFx0XHRcdFx0ZnVuY3Rpb24gZ2V0Tm93KCkge1xuXHRcdFx0XHRcdFx0dmFyIG5vdztcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50RnJvbSkge1xuXHRcdFx0XHRcdFx0XHRub3cgPSBjdXJyZW50RnJvbTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYW1UaW1lQWdvQ29uZmlnLnNlcnZlclRpbWUpIHtcblx0XHRcdFx0XHRcdFx0dmFyIGxvY2FsTm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cdFx0XHRcdFx0XHRcdHZhciBub3dNaWxsaXMgPSBsb2NhbE5vdyAtIGxvY2FsRGF0ZSArIGFtVGltZUFnb0NvbmZpZy5zZXJ2ZXJUaW1lO1xuXHRcdFx0XHRcdFx0XHRub3cgPSBtb21lbnQobm93TWlsbGlzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRub3cgPSBtb21lbnQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBub3c7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZnVuY3Rpb24gY2FuY2VsVGltZXIoKSB7XG5cdFx0XHRcdFx0XHRpZiAoYWN0aXZlVGltZW91dCkge1xuXHRcdFx0XHRcdFx0XHQkd2luZG93LmNsZWFyVGltZW91dChhY3RpdmVUaW1lb3V0KTtcblx0XHRcdFx0XHRcdFx0YWN0aXZlVGltZW91dCA9IG51bGw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZnVuY3Rpb24gdXBkYXRlVGltZShtb21lbnRJbnN0YW5jZSkge1xuXHRcdFx0XHRcdFx0dmFyIHRpbWVBZ28gPSBnZXROb3coKS5kaWZmKG1vbWVudEluc3RhbmNlLCBmdWxsRGF0ZVRocmVzaG9sZFVuaXQpO1xuXHRcdFx0XHRcdFx0dmFyIHNob3dGdWxsRGF0ZSA9IGZ1bGxEYXRlVGhyZXNob2xkICYmIHRpbWVBZ28gPj0gZnVsbERhdGVUaHJlc2hvbGQ7XG5cblx0XHRcdFx0XHRcdGlmIChzaG93RnVsbERhdGUpIHtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC50ZXh0KG1vbWVudEluc3RhbmNlLmZvcm1hdChmdWxsRGF0ZUZvcm1hdCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC50ZXh0KG1vbWVudEluc3RhbmNlLmZyb20oZ2V0Tm93KCksIHdpdGhvdXRTdWZmaXgpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHRpdGxlRm9ybWF0ICYmIHNldFRpdGxlVGltZSkge1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50LmF0dHIoJ3RpdGxlJywgbW9tZW50SW5zdGFuY2UuZm9ybWF0KHRpdGxlRm9ybWF0KSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICghc2hvd0Z1bGxEYXRlKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBob3dPbGQgPSBNYXRoLmFicyhnZXROb3coKS5kaWZmKG1vbWVudEluc3RhbmNlLCAnbWludXRlJykpO1xuXHRcdFx0XHRcdFx0XHR2YXIgc2Vjb25kc1VudGlsVXBkYXRlID0gMzYwMDtcblx0XHRcdFx0XHRcdFx0aWYgKGhvd09sZCA8IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRzZWNvbmRzVW50aWxVcGRhdGUgPSAxO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGhvd09sZCA8IDYwKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2Vjb25kc1VudGlsVXBkYXRlID0gMzA7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaG93T2xkIDwgMTgwKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2Vjb25kc1VudGlsVXBkYXRlID0gMzAwO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0YWN0aXZlVGltZW91dCA9ICR3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0dXBkYXRlVGltZShtb21lbnRJbnN0YW5jZSk7XG5cdFx0XHRcdFx0XHRcdH0sIHNlY29uZHNVbnRpbFVwZGF0ZSAqIDEwMDApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZ1bmN0aW9uIHVwZGF0ZURhdGVUaW1lQXR0cih2YWx1ZSkge1xuXHRcdFx0XHRcdFx0aWYgKGlzVGltZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5hdHRyKCdkYXRldGltZScsIHZhbHVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmdW5jdGlvbiB1cGRhdGVNb21lbnQoKSB7XG5cdFx0XHRcdFx0XHRjYW5jZWxUaW1lcigpO1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgbW9tZW50VmFsdWUgPSBhbU1vbWVudC5wcmVwcm9jZXNzRGF0ZShjdXJyZW50VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHR1cGRhdGVUaW1lKG1vbWVudFZhbHVlKTtcblx0XHRcdFx0XHRcdFx0dXBkYXRlRGF0ZVRpbWVBdHRyKG1vbWVudFZhbHVlLnRvSVNPU3RyaW5nKCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLiR3YXRjaChtb2RlbE5hbWUsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHRcdFx0aWYgKGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSB8fCAodmFsdWUgPT09ICcnKSkge1xuXHRcdFx0XHRcdFx0XHRjYW5jZWxUaW1lcigpO1xuXHRcdFx0XHRcdFx0XHRpZiAoY3VycmVudFZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZWxlbWVudC50ZXh0KCcnKTtcblx0XHRcdFx0XHRcdFx0XHR1cGRhdGVEYXRlVGltZUF0dHIoJycpO1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdHVwZGF0ZU1vbWVudCgpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKGFuZ3VsYXIuaXNEZWZpbmVkKGF0dHIuYW1Gcm9tKSkge1xuXHRcdFx0XHRcdFx0c2NvcGUuJHdhdGNoKGF0dHIuYW1Gcm9tLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSB8fCAodmFsdWUgPT09ICcnKSkge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRGcm9tID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50RnJvbSA9IG1vbWVudCh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dXBkYXRlTW9tZW50KCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoYW5ndWxhci5pc0RlZmluZWQoYXR0ci5hbVdpdGhvdXRTdWZmaXgpKSB7XG5cdFx0XHRcdFx0XHRzY29wZS4kd2F0Y2goYXR0ci5hbVdpdGhvdXRTdWZmaXgsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHRcdFx0XHR3aXRob3V0U3VmZml4ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0dXBkYXRlTW9tZW50KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2l0aG91dFN1ZmZpeCA9IGFtVGltZUFnb0NvbmZpZy53aXRob3V0U3VmZml4O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRhdHRyLiRvYnNlcnZlKCdhbUZ1bGxEYXRlVGhyZXNob2xkJywgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG5cdFx0XHRcdFx0XHRmdWxsRGF0ZVRocmVzaG9sZCA9IG5ld1ZhbHVlO1xuXHRcdFx0XHRcdFx0dXBkYXRlTW9tZW50KCk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRhdHRyLiRvYnNlcnZlKCdhbUZ1bGxEYXRlRm9ybWF0JywgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG5cdFx0XHRcdFx0XHRmdWxsRGF0ZUZvcm1hdCA9IG5ld1ZhbHVlO1xuXHRcdFx0XHRcdFx0dXBkYXRlTW9tZW50KCk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRhdHRyLiRvYnNlcnZlKCdhbUZ1bGxEYXRlVGhyZXNob2xkVW5pdCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuXHRcdFx0XHRcdFx0ZnVsbERhdGVUaHJlc2hvbGRVbml0ID0gbmV3VmFsdWU7XG5cdFx0XHRcdFx0XHR1cGRhdGVNb21lbnQoKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRjYW5jZWxUaW1lcigpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0c2NvcGUuJG9uKCdhbU1vbWVudDpsb2NhbGVDaGFuZ2VkJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dXBkYXRlTW9tZW50KCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XSlcblxuXHRcdC8qKlxuXHRcdCAqIEBuZ2RvYyBzZXJ2aWNlXG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5zZXJ2aWNlLmFtTW9tZW50XG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICovXG5cdFx0XHQuc2VydmljZSgnYW1Nb21lbnQnLCBbJ21vbWVudCcsICckcm9vdFNjb3BlJywgJyRsb2cnLCAnYW5ndWxhck1vbWVudENvbmZpZycsIGZ1bmN0aW9uIChtb21lbnQsICRyb290U2NvcGUsICRsb2csIGFuZ3VsYXJNb21lbnRDb25maWcpIHtcblx0XHRcdFx0dmFyIGRlZmF1bHRUaW1lem9uZSA9IG51bGw7XG5cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBuZ2RvYyBmdW5jdGlvblxuXHRcdFx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LnNlcnZpY2UuYW1Nb21lbnQjY2hhbmdlTG9jYWxlXG5cdFx0XHRcdCAqIEBtZXRob2RPZiBhbmd1bGFyTW9tZW50LnNlcnZpY2UuYW1Nb21lbnRcblx0XHRcdFx0ICpcblx0XHRcdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0XHRcdCAqIENoYW5nZXMgdGhlIGxvY2FsZSBmb3IgbW9tZW50LmpzIGFuZCB1cGRhdGVzIGFsbCB0aGUgYW0tdGltZS1hZ28gZGlyZWN0aXZlIGluc3RhbmNlc1xuXHRcdFx0XHQgKiB3aXRoIHRoZSBuZXcgbG9jYWxlLiBBbHNvIGJyb2FkY2FzdHMgYW4gYGFtTW9tZW50OmxvY2FsZUNoYW5nZWRgIGV2ZW50IG9uICRyb290U2NvcGUuXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGUgTG9jYWxlIGNvZGUgKGUuZy4gZW4sIGVzLCBydSwgcHQtYnIsIGV0Yy4pXG5cdFx0XHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBjdXN0b21pemF0aW9uIG9iamVjdCBvZiBsb2NhbGUgc3RyaW5ncyB0byBvdmVycmlkZVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhpcy5jaGFuZ2VMb2NhbGUgPSBmdW5jdGlvbiAobG9jYWxlLCBjdXN0b21pemF0aW9uKSB7XG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IG1vbWVudC5sb2NhbGUobG9jYWxlLCBjdXN0b21pemF0aW9uKTtcblx0XHRcdFx0XHRpZiAoYW5ndWxhci5pc0RlZmluZWQobG9jYWxlKSkge1xuXHRcdFx0XHRcdFx0JHJvb3RTY29wZS4kYnJvYWRjYXN0KCdhbU1vbWVudDpsb2NhbGVDaGFuZ2VkJyk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogQG5nZG9jIGZ1bmN0aW9uXG5cdFx0XHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuc2VydmljZS5hbU1vbWVudCNjaGFuZ2VUaW1lem9uZVxuXHRcdFx0XHQgKiBAbWV0aG9kT2YgYW5ndWxhck1vbWVudC5zZXJ2aWNlLmFtTW9tZW50XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdFx0XHQgKiBDaGFuZ2VzIHRoZSBkZWZhdWx0IHRpbWV6b25lIGZvciBhbUNhbGVuZGFyLCBhbURhdGVGb3JtYXQgYW5kIGFtVGltZUFnby4gQWxzbyBicm9hZGNhc3RzIGFuXG5cdFx0XHRcdCAqIGBhbU1vbWVudDp0aW1lem9uZUNoYW5nZWRgIGV2ZW50IG9uICRyb290U2NvcGUuXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIE5vdGU6IHRoaXMgbWV0aG9kIHdvcmtzIG9ubHkgaWYgbW9tZW50LXRpbWV6b25lID4gMC4zLjAgaXMgbG9hZGVkXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lem9uZSBUaW1lem9uZSBuYW1lIChlLmcuIFVUQylcblx0XHRcdFx0ICovXG5cdFx0XHRcdHRoaXMuY2hhbmdlVGltZXpvbmUgPSBmdW5jdGlvbiAodGltZXpvbmUpIHtcblx0XHRcdFx0XHRpZiAobW9tZW50LnR6ICYmIG1vbWVudC50ei5zZXREZWZhdWx0KSB7XG5cdFx0XHRcdFx0XHRtb21lbnQudHouc2V0RGVmYXVsdCh0aW1lem9uZSk7XG5cdFx0XHRcdFx0XHQkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ2FtTW9tZW50OnRpbWV6b25lQ2hhbmdlZCcpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkbG9nLndhcm4oJ2FuZ3VsYXItbW9tZW50OiBjaGFuZ2VUaW1lem9uZSgpIHdvcmtzIG9ubHkgd2l0aCBtb21lbnQtdGltZXpvbmUuanMgdjAuMy4wIG9yIGdyZWF0ZXIuJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFuZ3VsYXJNb21lbnRDb25maWcudGltZXpvbmUgPSB0aW1lem9uZTtcblx0XHRcdFx0XHRkZWZhdWx0VGltZXpvbmUgPSB0aW1lem9uZTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogQG5nZG9jIGZ1bmN0aW9uXG5cdFx0XHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuc2VydmljZS5hbU1vbWVudCNwcmVwcm9jZXNzRGF0ZVxuXHRcdFx0XHQgKiBAbWV0aG9kT2YgYW5ndWxhck1vbWVudC5zZXJ2aWNlLmFtTW9tZW50XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdFx0XHQgKiBQcmVwcm9jZXNzIGEgZ2l2ZW4gdmFsdWUgYW5kIGNvbnZlcnQgaXQgaW50byBhIE1vbWVudCBpbnN0YW5jZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIHRoZVxuXHRcdFx0XHQgKiBhbS10aW1lLWFnbyBkaXJlY3RpdmUgYW5kIHRoZSBmaWx0ZXJzLiBUaGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGVuIGJ5XG5cdFx0XHRcdCAqIHNldHRpbmcgYGFuZ3VsYXJNb21lbnRDb25maWcucHJlcHJvY2Vzc2AuXG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHByZXByb2Nlc3NlZFxuXHRcdFx0XHQgKiBAcmV0dXJuIHtNb21lbnR9IEEgYG1vbWVudGAgb2JqZWN0XG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGlzLnByZXByb2Nlc3NEYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRcdFx0Ly8gQ29uZmlndXJlIHRoZSBkZWZhdWx0IHRpbWV6b25lIGlmIG5lZWRlZFxuXHRcdFx0XHRcdGlmIChkZWZhdWx0VGltZXpvbmUgIT09IGFuZ3VsYXJNb21lbnRDb25maWcudGltZXpvbmUpIHtcblx0XHRcdFx0XHRcdHRoaXMuY2hhbmdlVGltZXpvbmUoYW5ndWxhck1vbWVudENvbmZpZy50aW1lem9uZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFuZ3VsYXJNb21lbnRDb25maWcucHJlcHJvY2Vzcykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFuZ3VsYXJNb21lbnRDb25maWcucHJlcHJvY2Vzcyh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHQvLyBNaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KHBhcnNlSW50KHZhbHVlLCAxMCkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGVsc2UganVzdCByZXR1cm5zIHRoZSB2YWx1ZSBhcy1pcy5cblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKTtcblx0XHRcdFx0fTtcblx0XHRcdH1dKVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIGZpbHRlclxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuZmlsdGVyOmFtUGFyc2Vcblx0XHQgKiBAbW9kdWxlIGFuZ3VsYXJNb21lbnRcblx0XHQgKi9cblx0XHRcdC5maWx0ZXIoJ2FtUGFyc2UnLCBbJ21vbWVudCcsIGZ1bmN0aW9uIChtb21lbnQpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1vbWVudCh2YWx1ZSwgZm9ybWF0KTtcblx0XHRcdFx0fTtcblx0XHRcdH1dKVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIGZpbHRlclxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuZmlsdGVyOmFtRnJvbVVuaXhcblx0XHQgKiBAbW9kdWxlIGFuZ3VsYXJNb21lbnRcblx0XHQgKi9cblx0XHRcdC5maWx0ZXIoJ2FtRnJvbVVuaXgnLCBbJ21vbWVudCcsIGZ1bmN0aW9uIChtb21lbnQpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHRcdHJldHVybiBtb21lbnQudW5peCh2YWx1ZSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XSlcblxuXHRcdC8qKlxuXHRcdCAqIEBuZ2RvYyBmaWx0ZXJcblx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmZpbHRlcjphbVV0Y1xuXHRcdCAqIEBtb2R1bGUgYW5ndWxhck1vbWVudFxuXHRcdCAqL1xuXHRcdFx0LmZpbHRlcignYW1VdGMnLCBbJ21vbWVudCcsIGZ1bmN0aW9uIChtb21lbnQpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHRcdHJldHVybiBtb21lbnQudXRjKHZhbHVlKTtcblx0XHRcdFx0fTtcblx0XHRcdH1dKVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIGZpbHRlclxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuZmlsdGVyOmFtVXRjT2Zmc2V0XG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICpcblx0XHQgKiBAZGVzY3JpcHRpb25cblx0XHQgKiBBZGRzIGEgVVRDIG9mZnNldCB0byB0aGUgZ2l2ZW4gdGltZXpvbmUgb2JqZWN0LiBUaGUgb2Zmc2V0IGNhbiBiZSBhIG51bWJlciBvZiBtaW51dGVzLCBvciBhIHN0cmluZyBzdWNoIGFzXG5cdFx0ICogJyswMzAwJywgJy0wMzAwJyBvciAnWicuXG5cdFx0ICovXG5cdFx0XHQuZmlsdGVyKCdhbVV0Y09mZnNldCcsIFsnYW1Nb21lbnQnLCBmdW5jdGlvbiAoYW1Nb21lbnQpIHtcblx0XHRcdFx0ZnVuY3Rpb24gYW1VdGNPZmZzZXQodmFsdWUsIG9mZnNldCkge1xuXHRcdFx0XHRcdHJldHVybiBhbU1vbWVudC5wcmVwcm9jZXNzRGF0ZSh2YWx1ZSkudXRjT2Zmc2V0KG9mZnNldCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gYW1VdGNPZmZzZXQ7XG5cdFx0XHR9XSlcblxuXHRcdC8qKlxuXHRcdCAqIEBuZ2RvYyBmaWx0ZXJcblx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmZpbHRlcjphbUxvY2FsXG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICovXG5cdFx0XHQuZmlsdGVyKCdhbUxvY2FsJywgWydtb21lbnQnLCBmdW5jdGlvbiAobW9tZW50KSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50LmlzTW9tZW50KHZhbHVlKSA/IHZhbHVlLmxvY2FsKCkgOiBudWxsO1xuXHRcdFx0XHR9O1xuXHRcdFx0fV0pXG5cblx0XHQvKipcblx0XHQgKiBAbmdkb2MgZmlsdGVyXG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5maWx0ZXI6YW1UaW1lem9uZVxuXHRcdCAqIEBtb2R1bGUgYW5ndWxhck1vbWVudFxuXHRcdCAqXG5cdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0ICogQXBwbHkgYSB0aW1lem9uZSBvbnRvIGEgZ2l2ZW4gbW9tZW50IG9iamVjdCwgZS5nLiAnQW1lcmljYS9QaG9lbml4JykuXG5cdFx0ICpcblx0XHQgKiBZb3UgbmVlZCB0byBpbmNsdWRlIG1vbWVudC10aW1lem9uZS5qcyBmb3IgdGltZXpvbmUgc3VwcG9ydC5cblx0XHQgKi9cblx0XHRcdC5maWx0ZXIoJ2FtVGltZXpvbmUnLCBbJ2FtTW9tZW50JywgJ2FuZ3VsYXJNb21lbnRDb25maWcnLCAnJGxvZycsIGZ1bmN0aW9uIChhbU1vbWVudCwgYW5ndWxhck1vbWVudENvbmZpZywgJGxvZykge1xuXHRcdFx0XHRmdW5jdGlvbiBhbVRpbWV6b25lKHZhbHVlLCB0aW1lem9uZSkge1xuXHRcdFx0XHRcdHZhciBhTW9tZW50ID0gYW1Nb21lbnQucHJlcHJvY2Vzc0RhdGUodmFsdWUpO1xuXG5cdFx0XHRcdFx0aWYgKCF0aW1lem9uZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFNb21lbnQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFNb21lbnQudHopIHtcblx0XHRcdFx0XHRcdHJldHVybiBhTW9tZW50LnR6KHRpbWV6b25lKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JGxvZy53YXJuKCdhbmd1bGFyLW1vbWVudDogbmFtZWQgdGltZXpvbmUgc3BlY2lmaWVkIGJ1dCBtb21lbnQudHooKSBpcyB1bmRlZmluZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGluY2x1ZGUgbW9tZW50LXRpbWV6b25lLmpzID8nKTtcblx0XHRcdFx0XHRcdHJldHVybiBhTW9tZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhbVRpbWV6b25lO1xuXHRcdFx0fV0pXG5cblx0XHQvKipcblx0XHQgKiBAbmdkb2MgZmlsdGVyXG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5maWx0ZXI6YW1DYWxlbmRhclxuXHRcdCAqIEBtb2R1bGUgYW5ndWxhck1vbWVudFxuXHRcdCAqL1xuXHRcdFx0LmZpbHRlcignYW1DYWxlbmRhcicsIFsnbW9tZW50JywgJ2FtTW9tZW50JywgJ2FuZ3VsYXJNb21lbnRDb25maWcnLCBmdW5jdGlvbiAobW9tZW50LCBhbU1vbWVudCwgYW5ndWxhck1vbWVudENvbmZpZykge1xuXHRcdFx0XHRmdW5jdGlvbiBhbUNhbGVuZGFyRmlsdGVyKHZhbHVlLCByZWZlcmVuY2VUaW1lLCBmb3JtYXRzKSB7XG5cdFx0XHRcdFx0aWYgKGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBkYXRlID0gYW1Nb21lbnQucHJlcHJvY2Vzc0RhdGUodmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiBkYXRlLmlzVmFsaWQoKSA/IGRhdGUuY2FsZW5kYXIocmVmZXJlbmNlVGltZSwgZm9ybWF0cykgOiAnJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNpbmNlIEFuZ3VsYXJKUyAxLjMsIGZpbHRlcnMgaGF2ZSB0byBleHBsaWNpdGx5IGRlZmluZSBiZWluZyBzdGF0ZWZ1bFxuXHRcdFx0XHQvLyAodGhpcyBpcyBubyBsb25nZXIgdGhlIGRlZmF1bHQpLlxuXHRcdFx0XHRhbUNhbGVuZGFyRmlsdGVyLiRzdGF0ZWZ1bCA9IGFuZ3VsYXJNb21lbnRDb25maWcuc3RhdGVmdWxGaWx0ZXJzO1xuXG5cdFx0XHRcdHJldHVybiBhbUNhbGVuZGFyRmlsdGVyO1xuXHRcdFx0fV0pXG5cblx0XHQvKipcblx0XHQgKiBAbmdkb2MgZmlsdGVyXG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5maWx0ZXI6YW1EaWZmZXJlbmNlXG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICovXG5cdFx0XHQuZmlsdGVyKCdhbURpZmZlcmVuY2UnLCBbJ21vbWVudCcsICdhbU1vbWVudCcsICdhbmd1bGFyTW9tZW50Q29uZmlnJywgZnVuY3Rpb24gKG1vbWVudCwgYW1Nb21lbnQsIGFuZ3VsYXJNb21lbnRDb25maWcpIHtcblx0XHRcdFx0ZnVuY3Rpb24gYW1EaWZmZXJlbmNlRmlsdGVyKHZhbHVlLCBvdGhlclZhbHVlLCB1bml0LCB1c2VQcmVjaXNpb24pIHtcblx0XHRcdFx0XHRpZiAoaXNVbmRlZmluZWRPck51bGwodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGRhdGUgPSBhbU1vbWVudC5wcmVwcm9jZXNzRGF0ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0dmFyIGRhdGUyID0gIWlzVW5kZWZpbmVkT3JOdWxsKG90aGVyVmFsdWUpID8gYW1Nb21lbnQucHJlcHJvY2Vzc0RhdGUob3RoZXJWYWx1ZSkgOiBtb21lbnQoKTtcblxuXHRcdFx0XHRcdGlmICghZGF0ZS5pc1ZhbGlkKCkgfHwgIWRhdGUyLmlzVmFsaWQoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBkYXRlLmRpZmYoZGF0ZTIsIHVuaXQsIHVzZVByZWNpc2lvbik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhbURpZmZlcmVuY2VGaWx0ZXIuJHN0YXRlZnVsID0gYW5ndWxhck1vbWVudENvbmZpZy5zdGF0ZWZ1bEZpbHRlcnM7XG5cblx0XHRcdFx0cmV0dXJuIGFtRGlmZmVyZW5jZUZpbHRlcjtcblx0XHRcdH1dKVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIGZpbHRlclxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuZmlsdGVyOmFtRGF0ZUZvcm1hdFxuXHRcdCAqIEBtb2R1bGUgYW5ndWxhck1vbWVudFxuXHRcdCAqIEBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdFx0LmZpbHRlcignYW1EYXRlRm9ybWF0JywgWydtb21lbnQnLCAnYW1Nb21lbnQnLCAnYW5ndWxhck1vbWVudENvbmZpZycsIGZ1bmN0aW9uIChtb21lbnQsIGFtTW9tZW50LCBhbmd1bGFyTW9tZW50Q29uZmlnKSB7XG5cdFx0XHRcdGZ1bmN0aW9uIGFtRGF0ZUZvcm1hdEZpbHRlcih2YWx1ZSwgZm9ybWF0KSB7XG5cdFx0XHRcdFx0aWYgKGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBkYXRlID0gYW1Nb21lbnQucHJlcHJvY2Vzc0RhdGUodmFsdWUpO1xuXHRcdFx0XHRcdGlmICghZGF0ZS5pc1ZhbGlkKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnJztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFtRGF0ZUZvcm1hdEZpbHRlci4kc3RhdGVmdWwgPSBhbmd1bGFyTW9tZW50Q29uZmlnLnN0YXRlZnVsRmlsdGVycztcblxuXHRcdFx0XHRyZXR1cm4gYW1EYXRlRm9ybWF0RmlsdGVyO1xuXHRcdFx0fV0pXG5cblx0XHQvKipcblx0XHQgKiBAbmdkb2MgZmlsdGVyXG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5maWx0ZXI6YW1EdXJhdGlvbkZvcm1hdFxuXHRcdCAqIEBtb2R1bGUgYW5ndWxhck1vbWVudFxuXHRcdCAqIEBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdFx0LmZpbHRlcignYW1EdXJhdGlvbkZvcm1hdCcsIFsnbW9tZW50JywgJ2FuZ3VsYXJNb21lbnRDb25maWcnLCBmdW5jdGlvbiAobW9tZW50LCBhbmd1bGFyTW9tZW50Q29uZmlnKSB7XG5cdFx0XHRcdGZ1bmN0aW9uIGFtRHVyYXRpb25Gb3JtYXRGaWx0ZXIodmFsdWUsIGZvcm1hdCwgc3VmZml4KSB7XG5cdFx0XHRcdFx0aWYgKGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24odmFsdWUsIGZvcm1hdCkuaHVtYW5pemUoc3VmZml4KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFtRHVyYXRpb25Gb3JtYXRGaWx0ZXIuJHN0YXRlZnVsID0gYW5ndWxhck1vbWVudENvbmZpZy5zdGF0ZWZ1bEZpbHRlcnM7XG5cblx0XHRcdFx0cmV0dXJuIGFtRHVyYXRpb25Gb3JtYXRGaWx0ZXI7XG5cdFx0XHR9XSlcblxuXHRcdC8qKlxuXHRcdCAqIEBuZ2RvYyBmaWx0ZXJcblx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmZpbHRlcjphbVRpbWVBZ29cblx0XHQgKiBAbW9kdWxlIGFuZ3VsYXJNb21lbnRcblx0XHQgKiBAZnVuY3Rpb25cblx0XHQgKi9cblx0XHRcdC5maWx0ZXIoJ2FtVGltZUFnbycsIFsnbW9tZW50JywgJ2FtTW9tZW50JywgJ2FuZ3VsYXJNb21lbnRDb25maWcnLCBmdW5jdGlvbiAobW9tZW50LCBhbU1vbWVudCwgYW5ndWxhck1vbWVudENvbmZpZykge1xuXHRcdFx0XHRmdW5jdGlvbiBhbVRpbWVBZ29GaWx0ZXIodmFsdWUsIHN1ZmZpeCwgZnJvbSkge1xuXHRcdFx0XHRcdHZhciBkYXRlLCBkYXRlRnJvbTtcblxuXHRcdFx0XHRcdGlmIChpc1VuZGVmaW5lZE9yTnVsbCh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnJztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YWx1ZSA9IGFtTW9tZW50LnByZXByb2Nlc3NEYXRlKHZhbHVlKTtcblx0XHRcdFx0XHRkYXRlID0gbW9tZW50KHZhbHVlKTtcblx0XHRcdFx0XHRpZiAoIWRhdGUuaXNWYWxpZCgpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZGF0ZUZyb20gPSBtb21lbnQoZnJvbSk7XG5cdFx0XHRcdFx0aWYgKCFpc1VuZGVmaW5lZE9yTnVsbChmcm9tKSAmJiBkYXRlRnJvbS5pc1ZhbGlkKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBkYXRlLmZyb20oZGF0ZUZyb20sIHN1ZmZpeCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGRhdGUuZnJvbU5vdyhzdWZmaXgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW1UaW1lQWdvRmlsdGVyLiRzdGF0ZWZ1bCA9IGFuZ3VsYXJNb21lbnRDb25maWcuc3RhdGVmdWxGaWx0ZXJzO1xuXG5cdFx0XHRcdHJldHVybiBhbVRpbWVBZ29GaWx0ZXI7XG5cdFx0XHR9XSlcblxuXHRcdC8qKlxuXHRcdCAqIEBuZ2RvYyBmaWx0ZXJcblx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmZpbHRlcjphbVN1YnRyYWN0XG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICogQGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0XHQuZmlsdGVyKCdhbVN1YnRyYWN0JywgWydtb21lbnQnLCAnYW5ndWxhck1vbWVudENvbmZpZycsIGZ1bmN0aW9uIChtb21lbnQsIGFuZ3VsYXJNb21lbnRDb25maWcpIHtcblx0XHRcdFx0ZnVuY3Rpb24gYW1TdWJ0cmFjdEZpbHRlcih2YWx1ZSwgYW1vdW50LCB0eXBlKSB7XG5cblx0XHRcdFx0XHRpZiAoaXNVbmRlZmluZWRPck51bGwodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIG1vbWVudCh2YWx1ZSkuc3VidHJhY3QocGFyc2VJbnQoYW1vdW50LCAxMCksIHR5cGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW1TdWJ0cmFjdEZpbHRlci4kc3RhdGVmdWwgPSBhbmd1bGFyTW9tZW50Q29uZmlnLnN0YXRlZnVsRmlsdGVycztcblxuXHRcdFx0XHRyZXR1cm4gYW1TdWJ0cmFjdEZpbHRlcjtcblx0XHRcdH1dKVxuXG5cdFx0LyoqXG5cdFx0ICogQG5nZG9jIGZpbHRlclxuXHRcdCAqIEBuYW1lIGFuZ3VsYXJNb21lbnQuZmlsdGVyOmFtQWRkXG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICogQGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0XHQuZmlsdGVyKCdhbUFkZCcsIFsnbW9tZW50JywgJ2FuZ3VsYXJNb21lbnRDb25maWcnLCBmdW5jdGlvbiAobW9tZW50LCBhbmd1bGFyTW9tZW50Q29uZmlnKSB7XG5cdFx0XHRcdGZ1bmN0aW9uIGFtQWRkRmlsdGVyKHZhbHVlLCBhbW91bnQsIHR5cGUpIHtcblxuXHRcdFx0XHRcdGlmIChpc1VuZGVmaW5lZE9yTnVsbCh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnJztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKS5hZGQocGFyc2VJbnQoYW1vdW50LCAxMCksIHR5cGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW1BZGRGaWx0ZXIuJHN0YXRlZnVsID0gYW5ndWxhck1vbWVudENvbmZpZy5zdGF0ZWZ1bEZpbHRlcnM7XG5cblx0XHRcdFx0cmV0dXJuIGFtQWRkRmlsdGVyO1xuXHRcdFx0fV0pXG5cblx0XHQvKipcblx0XHQgKiBAbmdkb2MgZmlsdGVyXG5cdFx0ICogQG5hbWUgYW5ndWxhck1vbWVudC5maWx0ZXI6YW1TdGFydE9mXG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICogQGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0XHQuZmlsdGVyKCdhbVN0YXJ0T2YnLCBbJ21vbWVudCcsICdhbmd1bGFyTW9tZW50Q29uZmlnJywgZnVuY3Rpb24gKG1vbWVudCwgYW5ndWxhck1vbWVudENvbmZpZykge1xuXHRcdFx0XHRmdW5jdGlvbiBhbVN0YXJ0T2ZGaWx0ZXIodmFsdWUsIHR5cGUpIHtcblxuXHRcdFx0XHRcdGlmIChpc1VuZGVmaW5lZE9yTnVsbCh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnJztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKS5zdGFydE9mKHR5cGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW1TdGFydE9mRmlsdGVyLiRzdGF0ZWZ1bCA9IGFuZ3VsYXJNb21lbnRDb25maWcuc3RhdGVmdWxGaWx0ZXJzO1xuXG5cdFx0XHRcdHJldHVybiBhbVN0YXJ0T2ZGaWx0ZXI7XG5cdFx0XHR9XSlcblxuXHRcdC8qKlxuXHRcdCAqIEBuZ2RvYyBmaWx0ZXJcblx0XHQgKiBAbmFtZSBhbmd1bGFyTW9tZW50LmZpbHRlcjphbUVuZE9mXG5cdFx0ICogQG1vZHVsZSBhbmd1bGFyTW9tZW50XG5cdFx0ICogQGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0XHQuZmlsdGVyKCdhbUVuZE9mJywgWydtb21lbnQnLCAnYW5ndWxhck1vbWVudENvbmZpZycsIGZ1bmN0aW9uIChtb21lbnQsIGFuZ3VsYXJNb21lbnRDb25maWcpIHtcblx0XHRcdFx0ZnVuY3Rpb24gYW1FbmRPZkZpbHRlcih2YWx1ZSwgdHlwZSkge1xuXG5cdFx0XHRcdFx0aWYgKGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBtb21lbnQodmFsdWUpLmVuZE9mKHR5cGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW1FbmRPZkZpbHRlci4kc3RhdGVmdWwgPSBhbmd1bGFyTW9tZW50Q29uZmlnLnN0YXRlZnVsRmlsdGVycztcblxuXHRcdFx0XHRyZXR1cm4gYW1FbmRPZkZpbHRlcjtcbiBcdFx0XHR9XSk7XG5cblx0XHRyZXR1cm4gJ2FuZ3VsYXJNb21lbnQnO1xuXHR9XG5cblx0dmFyIGlzRWxlY3Ryb24gPSB3aW5kb3cgJiYgd2luZG93LnByb2Nlc3MgJiYgd2luZG93LnByb2Nlc3MudHlwZTtcblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShbJ2FuZ3VsYXInLCAnbW9tZW50J10sIGFuZ3VsYXJNb21lbnQpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cyAmJiAodHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpICYmICFpc0VsZWN0cm9uKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBhbmd1bGFyTW9tZW50KHJlcXVpcmUoJ2FuZ3VsYXInKSwgcmVxdWlyZSgnbW9tZW50JykpO1xuXHR9IGVsc2Uge1xuXHRcdGFuZ3VsYXJNb21lbnQoYW5ndWxhciwgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93KS5tb21lbnQpO1xuXHR9XG59KSgpO1xuIiwiLyoqXG4gKiBhbmd1bGFyLXNwaW5uZXIgdmVyc2lvbiAwLjguMVxuICogTGljZW5zZTogTUlULlxuICogQ29weXJpZ2h0IChDKSAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2LCBVcmkgU2hha2VkIGFuZCBjb250cmlidXRvcnMuXG4gKi9cblxuJ2Zvcm1hdCBhbWQnO1xuXG4oZnVuY3Rpb24gKHJvb3QpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdGZ1bmN0aW9uIGZhY3RvcnkoYW5ndWxhciwgU3Bpbm5lcikge1xuXG5cdFx0cmV0dXJuIGFuZ3VsYXJcblx0XHRcdC5tb2R1bGUoJ2FuZ3VsYXJTcGlubmVyJywgW10pXG5cblx0XHRcdC5jb25zdGFudCgnU3BpbkpTU3Bpbm5lcicsIFNwaW5uZXIpXG5cblx0XHRcdC5wcm92aWRlcigndXNTcGlubmVyQ29uZmlnJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgX2NvbmZpZyA9IHt9LCBfdGhlbWVzID0ge307XG5cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRzZXREZWZhdWx0czogZnVuY3Rpb24gKGNvbmZpZykge1xuXHRcdFx0XHRcdFx0X2NvbmZpZyA9IGNvbmZpZyB8fCBfY29uZmlnO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c2V0VGhlbWU6IGZ1bmN0aW9uKG5hbWUsIGNvbmZpZykge1xuXHRcdFx0XHRcdFx0X3RoZW1lc1tuYW1lXSA9IGNvbmZpZztcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGNvbmZpZzogX2NvbmZpZyxcblx0XHRcdFx0XHRcdFx0dGhlbWVzOiBfdGhlbWVzXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH0pXG5cblx0XHRcdC5mYWN0b3J5KCd1c1NwaW5uZXJTZXJ2aWNlJywgWyckcm9vdFNjb3BlJywgZnVuY3Rpb24gKCRyb290U2NvcGUpIHtcblx0XHRcdFx0dmFyIGNvbmZpZyA9IHt9O1xuXG5cdFx0XHRcdGNvbmZpZy5zcGluID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRcdCRyb290U2NvcGUuJGJyb2FkY2FzdCgndXMtc3Bpbm5lcjpzcGluJywga2V5KTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25maWcuc3RvcCA9IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0XHQkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ3VzLXNwaW5uZXI6c3RvcCcsIGtleSk7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0cmV0dXJuIGNvbmZpZztcblx0XHRcdH1dKVxuXG5cdFx0XHQuZGlyZWN0aXZlKCd1c1NwaW5uZXInLCBbJ1NwaW5KU1NwaW5uZXInLCAndXNTcGlubmVyQ29uZmlnJywgZnVuY3Rpb24gKFNwaW5KU1NwaW5uZXIsIHVzU3Bpbm5lckNvbmZpZykge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHNjb3BlOiB0cnVlLFxuXHRcdFx0XHRcdGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cikge1xuXHRcdFx0XHRcdFx0c2NvcGUuc3Bpbm5lciA9IG51bGw7XG5cblx0XHRcdFx0XHRcdHNjb3BlLmtleSA9IGFuZ3VsYXIuaXNEZWZpbmVkKGF0dHIuc3Bpbm5lcktleSkgPyBhdHRyLnNwaW5uZXJLZXkgOiBmYWxzZTtcblxuXHRcdFx0XHRcdFx0c2NvcGUuc3RhcnRBY3RpdmUgPSBhbmd1bGFyLmlzRGVmaW5lZChhdHRyLnNwaW5uZXJTdGFydEFjdGl2ZSkgP1xuXHRcdFx0XHRcdFx0XHRzY29wZS4kZXZhbChhdHRyLnNwaW5uZXJTdGFydEFjdGl2ZSkgOiBzY29wZS5rZXkgP1xuXHRcdFx0XHRcdFx0XHRmYWxzZSA6IHRydWU7XG5cblx0XHRcdFx0XHRcdGZ1bmN0aW9uIHN0b3BTcGlubmVyKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NvcGUuc3Bpbm5lcikge1xuXHRcdFx0XHRcdFx0XHRcdHNjb3BlLnNwaW5uZXIuc3RvcCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHNjb3BlLnNwaW4gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzY29wZS5zcGlubmVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2NvcGUuc3Bpbm5lci5zcGluKGVsZW1lbnRbMF0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRzY29wZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRzY29wZS5zdGFydEFjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRzdG9wU3Bpbm5lcigpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0c2NvcGUuJHdhdGNoKGF0dHIudXNTcGlubmVyLCBmdW5jdGlvbiAob3B0aW9ucykge1xuXHRcdFx0XHRcdFx0XHRzdG9wU3Bpbm5lcigpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIG9yZGVyIG9mIHByZWNlZGVuY2U6IGVsZW1lbnQgb3B0aW9ucywgdGhlbWUsIGRlZmF1bHRzLlxuXHRcdFx0XHRcdFx0XHRvcHRpb25zID0gYW5ndWxhci5leHRlbmQoXG5cdFx0XHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHRcdFx0dXNTcGlubmVyQ29uZmlnLmNvbmZpZyxcblx0XHRcdFx0XHRcdFx0XHR1c1NwaW5uZXJDb25maWcudGhlbWVzW2F0dHIuc3Bpbm5lclRoZW1lXSxcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0XHRzY29wZS5zcGlubmVyID0gbmV3IFNwaW5KU1NwaW5uZXIob3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRcdGlmICgoIXNjb3BlLmtleSB8fCBzY29wZS5zdGFydEFjdGl2ZSkgJiYgIWF0dHIuc3Bpbm5lck9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2NvcGUuc3Bpbm5lci5zcGluKGVsZW1lbnRbMF0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCB0cnVlKTtcblxuXHRcdFx0XHRcdFx0aWYgKGF0dHIuc3Bpbm5lck9uKSB7XG5cdFx0XHRcdFx0XHRcdHNjb3BlLiR3YXRjaChhdHRyLnNwaW5uZXJPbiwgZnVuY3Rpb24gKHNwaW4pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc3Bpbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2NvcGUuc3BpbigpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzY29wZS5zdG9wKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c2NvcGUuJG9uKCd1cy1zcGlubmVyOnNwaW4nLCBmdW5jdGlvbiAoZXZlbnQsIGtleSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoa2V5ID09PSBzY29wZS5rZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRzY29wZS5zcGluKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRzY29wZS4kb24oJ3VzLXNwaW5uZXI6c3RvcCcsIGZ1bmN0aW9uIChldmVudCwga2V5KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChrZXkgPT09IHNjb3BlLmtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNjb3BlLnN0b3AoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHNjb3BlLnN0b3AoKTtcblx0XHRcdFx0XHRcdFx0c2NvcGUuc3Bpbm5lciA9IG51bGw7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XSk7XG5cdH1cblxuICAgIGlmICgodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0LyogQ29tbW9uSlMgbW9kdWxlICovXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJ2FuZ3VsYXInKSwgcmVxdWlyZSgnc3Bpbi5qcycpKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHQvKiBBTUQgbW9kdWxlICovXG5cdFx0ZGVmaW5lKFsnYW5ndWxhcicsICdzcGluJ10sIGZhY3RvcnkpO1xuXHR9IGVsc2Uge1xuXHRcdC8qIEJyb3dzZXIgZ2xvYmFsICovXG5cdFx0ZmFjdG9yeShyb290LmFuZ3VsYXIsIHJvb3QuU3Bpbm5lcik7XG5cdH1cbn0odGhpcykpO1xuIiwiKGZ1bmN0aW9uICh3aW5kb3cpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvKmdsb2JhbCBkZWZpbmUsIG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSAqL1xuXG4gICAgdmFyIGMzID0geyB2ZXJzaW9uOiBcIjAuNC4xMVwiIH07XG5cbiAgICB2YXIgYzNfY2hhcnRfZm4sXG4gICAgICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLFxuICAgICAgICBjM19jaGFydF9pbnRlcm5hbF9heGlzX2ZuO1xuXG4gICAgZnVuY3Rpb24gQVBJKG93bmVyKSB7XG4gICAgICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbmhlcml0KGJhc2UsIGRlcml2ZWQpIHtcblxuICAgICAgICBpZiAoT2JqZWN0LmNyZWF0ZSkge1xuICAgICAgICAgICAgZGVyaXZlZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2UucHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24gZigpIHt9O1xuICAgICAgICAgICAgZi5wcm90b3R5cGUgPSBiYXNlLnByb3RvdHlwZTtcbiAgICAgICAgICAgIGRlcml2ZWQucHJvdG90eXBlID0gbmV3IGYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcml2ZWQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZGVyaXZlZDtcblxuICAgICAgICByZXR1cm4gZGVyaXZlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDaGFydChjb25maWcpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbCA9IG5ldyBDaGFydEludGVybmFsKHRoaXMpO1xuICAgICAgICAkJC5sb2FkQ29uZmlnKGNvbmZpZyk7XG5cbiAgICAgICAgJCQuYmVmb3JlSW5pdChjb25maWcpO1xuICAgICAgICAkJC5pbml0KCk7XG4gICAgICAgICQkLmFmdGVySW5pdChjb25maWcpO1xuXG4gICAgICAgIC8vIGJpbmQgXCJ0aGlzXCIgdG8gbmVzdGVkIEFQSVxuICAgICAgICAoZnVuY3Rpb24gYmluZFRoaXMoZm4sIHRhcmdldCwgYXJnVGhpcykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZm4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gZm5ba2V5XS5iaW5kKGFyZ1RoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhmbltrZXldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRUaGlzKGZuW2tleV0sIHRhcmdldFtrZXldLCBhcmdUaGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkoYzNfY2hhcnRfZm4sIHRoaXMsIHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENoYXJ0SW50ZXJuYWwoYXBpKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLmQzID0gd2luZG93LmQzID8gd2luZG93LmQzIDogdHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnID8gcmVxdWlyZShcImQzXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAkJC5hcGkgPSBhcGk7XG4gICAgICAgICQkLmNvbmZpZyA9ICQkLmdldERlZmF1bHRDb25maWcoKTtcbiAgICAgICAgJCQuZGF0YSA9IHt9O1xuICAgICAgICAkJC5jYWNoZSA9IHt9O1xuICAgICAgICAkJC5heGVzID0ge307XG4gICAgfVxuXG4gICAgYzMuZ2VuZXJhdGUgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhcnQoY29uZmlnKTtcbiAgICB9O1xuXG4gICAgYzMuY2hhcnQgPSB7XG4gICAgICAgIGZuOiBDaGFydC5wcm90b3R5cGUsXG4gICAgICAgIGludGVybmFsOiB7XG4gICAgICAgICAgICBmbjogQ2hhcnRJbnRlcm5hbC5wcm90b3R5cGUsXG4gICAgICAgICAgICBheGlzOiB7XG4gICAgICAgICAgICAgICAgZm46IEF4aXMucHJvdG90eXBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ZuID0gYzMuY2hhcnQuZm47XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4gPSBjMy5jaGFydC5pbnRlcm5hbC5mbjtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9heGlzX2ZuID0gYzMuY2hhcnQuaW50ZXJuYWwuYXhpcy5mbjtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmJlZm9yZUluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGNhbiBkbyBzb21ldGhpbmdcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmFmdGVySW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY2FuIGRvIHNvbWV0aGluZ1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuXG4gICAgICAgICQkLmluaXRQYXJhbXMoKTtcblxuICAgICAgICBpZiAoY29uZmlnLmRhdGFfdXJsKSB7XG4gICAgICAgICAgICAkJC5jb252ZXJ0VXJsVG9EYXRhKGNvbmZpZy5kYXRhX3VybCwgY29uZmlnLmRhdGFfbWltZVR5cGUsIGNvbmZpZy5kYXRhX2hlYWRlcnMsIGNvbmZpZy5kYXRhX2tleXMsICQkLmluaXRXaXRoRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29uZmlnLmRhdGFfanNvbikge1xuICAgICAgICAgICAgJCQuaW5pdFdpdGhEYXRhKCQkLmNvbnZlcnRKc29uVG9EYXRhKGNvbmZpZy5kYXRhX2pzb24sIGNvbmZpZy5kYXRhX2tleXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb25maWcuZGF0YV9yb3dzKSB7XG4gICAgICAgICAgICAkJC5pbml0V2l0aERhdGEoJCQuY29udmVydFJvd3NUb0RhdGEoY29uZmlnLmRhdGFfcm93cykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbmZpZy5kYXRhX2NvbHVtbnMpIHtcbiAgICAgICAgICAgICQkLmluaXRXaXRoRGF0YSgkJC5jb252ZXJ0Q29sdW1uc1RvRGF0YShjb25maWcuZGF0YV9jb2x1bW5zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcigndXJsIG9yIGpzb24gb3Igcm93cyBvciBjb2x1bW5zIGlzIHJlcXVpcmVkLicpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmluaXRQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGQzID0gJCQuZDMsIGNvbmZpZyA9ICQkLmNvbmZpZztcblxuICAgICAgICAvLyBNRU1POiBjbGlwSWQgbmVlZHMgdG8gYmUgdW5pcXVlIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdoZW4gbXVsdGlwbGUgY2hhcnRzIGV4aXN0XG4gICAgICAgICQkLmNsaXBJZCA9IFwiYzMtXCIgKyAoK25ldyBEYXRlKCkpICsgJy1jbGlwJyxcbiAgICAgICAgJCQuY2xpcElkRm9yWEF4aXMgPSAkJC5jbGlwSWQgKyAnLXhheGlzJyxcbiAgICAgICAgJCQuY2xpcElkRm9yWUF4aXMgPSAkJC5jbGlwSWQgKyAnLXlheGlzJyxcbiAgICAgICAgJCQuY2xpcElkRm9yR3JpZCA9ICQkLmNsaXBJZCArICctZ3JpZCcsXG4gICAgICAgICQkLmNsaXBJZEZvclN1YmNoYXJ0ID0gJCQuY2xpcElkICsgJy1zdWJjaGFydCcsXG4gICAgICAgICQkLmNsaXBQYXRoID0gJCQuZ2V0Q2xpcFBhdGgoJCQuY2xpcElkKSxcbiAgICAgICAgJCQuY2xpcFBhdGhGb3JYQXhpcyA9ICQkLmdldENsaXBQYXRoKCQkLmNsaXBJZEZvclhBeGlzKSxcbiAgICAgICAgJCQuY2xpcFBhdGhGb3JZQXhpcyA9ICQkLmdldENsaXBQYXRoKCQkLmNsaXBJZEZvcllBeGlzKTtcbiAgICAgICAgJCQuY2xpcFBhdGhGb3JHcmlkID0gJCQuZ2V0Q2xpcFBhdGgoJCQuY2xpcElkRm9yR3JpZCksXG4gICAgICAgICQkLmNsaXBQYXRoRm9yU3ViY2hhcnQgPSAkJC5nZXRDbGlwUGF0aCgkJC5jbGlwSWRGb3JTdWJjaGFydCksXG5cbiAgICAgICAgJCQuZHJhZ1N0YXJ0ID0gbnVsbDtcbiAgICAgICAgJCQuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgJCQuZmxvd2luZyA9IGZhbHNlO1xuICAgICAgICAkJC5jYW5jZWxDbGljayA9IGZhbHNlO1xuICAgICAgICAkJC5tb3VzZW92ZXIgPSBmYWxzZTtcbiAgICAgICAgJCQudHJhbnNpdGluZyA9IGZhbHNlO1xuXG4gICAgICAgICQkLmNvbG9yID0gJCQuZ2VuZXJhdGVDb2xvcigpO1xuICAgICAgICAkJC5sZXZlbENvbG9yID0gJCQuZ2VuZXJhdGVMZXZlbENvbG9yKCk7XG5cbiAgICAgICAgJCQuZGF0YVRpbWVGb3JtYXQgPSBjb25maWcuZGF0YV94TG9jYWx0aW1lID8gZDMudGltZS5mb3JtYXQgOiBkMy50aW1lLmZvcm1hdC51dGM7XG4gICAgICAgICQkLmF4aXNUaW1lRm9ybWF0ID0gY29uZmlnLmF4aXNfeF9sb2NhbHRpbWUgPyBkMy50aW1lLmZvcm1hdCA6IGQzLnRpbWUuZm9ybWF0LnV0YztcbiAgICAgICAgJCQuZGVmYXVsdEF4aXNUaW1lRm9ybWF0ID0gJCQuYXhpc1RpbWVGb3JtYXQubXVsdGkoW1xuICAgICAgICAgICAgW1wiLiVMXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmdldE1pbGxpc2Vjb25kcygpOyB9XSxcbiAgICAgICAgICAgIFtcIjolU1wiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5nZXRTZWNvbmRzKCk7IH1dLFxuICAgICAgICAgICAgW1wiJUk6JU1cIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuZ2V0TWludXRlcygpOyB9XSxcbiAgICAgICAgICAgIFtcIiVJICVwXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmdldEhvdXJzKCk7IH1dLFxuICAgICAgICAgICAgW1wiJS1tLyUtZFwiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5nZXREYXkoKSAmJiBkLmdldERhdGUoKSAhPT0gMTsgfV0sXG4gICAgICAgICAgICBbXCIlLW0vJS1kXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmdldERhdGUoKSAhPT0gMTsgfV0sXG4gICAgICAgICAgICBbXCIlLW0vJS1kXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmdldE1vbnRoKCk7IH1dLFxuICAgICAgICAgICAgW1wiJVkvJS1tLyUtZFwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9XVxuICAgICAgICBdKTtcblxuICAgICAgICAkJC5oaWRkZW5UYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgJCQuaGlkZGVuTGVnZW5kSWRzID0gW107XG4gICAgICAgICQkLmZvY3VzZWRUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgJCQuZGVmb2N1c2VkVGFyZ2V0SWRzID0gW107XG5cbiAgICAgICAgJCQueE9yaWVudCA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyBcImxlZnRcIiA6IFwiYm90dG9tXCI7XG4gICAgICAgICQkLnlPcmllbnQgPSBjb25maWcuYXhpc19yb3RhdGVkID8gKGNvbmZpZy5heGlzX3lfaW5uZXIgPyBcInRvcFwiIDogXCJib3R0b21cIikgOiAoY29uZmlnLmF4aXNfeV9pbm5lciA/IFwicmlnaHRcIiA6IFwibGVmdFwiKTtcbiAgICAgICAgJCQueTJPcmllbnQgPSBjb25maWcuYXhpc19yb3RhdGVkID8gKGNvbmZpZy5heGlzX3kyX2lubmVyID8gXCJib3R0b21cIiA6IFwidG9wXCIpIDogKGNvbmZpZy5heGlzX3kyX2lubmVyID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCIpO1xuICAgICAgICAkJC5zdWJYT3JpZW50ID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IFwibGVmdFwiIDogXCJib3R0b21cIjtcblxuICAgICAgICAkJC5pc0xlZ2VuZFJpZ2h0ID0gY29uZmlnLmxlZ2VuZF9wb3NpdGlvbiA9PT0gJ3JpZ2h0JztcbiAgICAgICAgJCQuaXNMZWdlbmRJbnNldCA9IGNvbmZpZy5sZWdlbmRfcG9zaXRpb24gPT09ICdpbnNldCc7XG4gICAgICAgICQkLmlzTGVnZW5kVG9wID0gY29uZmlnLmxlZ2VuZF9pbnNldF9hbmNob3IgPT09ICd0b3AtbGVmdCcgfHwgY29uZmlnLmxlZ2VuZF9pbnNldF9hbmNob3IgPT09ICd0b3AtcmlnaHQnO1xuICAgICAgICAkJC5pc0xlZ2VuZExlZnQgPSBjb25maWcubGVnZW5kX2luc2V0X2FuY2hvciA9PT0gJ3RvcC1sZWZ0JyB8fCBjb25maWcubGVnZW5kX2luc2V0X2FuY2hvciA9PT0gJ2JvdHRvbS1sZWZ0JztcbiAgICAgICAgJCQubGVnZW5kU3RlcCA9IDA7XG4gICAgICAgICQkLmxlZ2VuZEl0ZW1XaWR0aCA9IDA7XG4gICAgICAgICQkLmxlZ2VuZEl0ZW1IZWlnaHQgPSAwO1xuXG4gICAgICAgICQkLmN1cnJlbnRNYXhUaWNrV2lkdGhzID0ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICB5MjogMFxuICAgICAgICB9O1xuXG4gICAgICAgICQkLnJvdGF0ZWRfcGFkZGluZ19sZWZ0ID0gMzA7XG4gICAgICAgICQkLnJvdGF0ZWRfcGFkZGluZ19yaWdodCA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgJiYgIWNvbmZpZy5heGlzX3hfc2hvdyA/IDAgOiAzMDtcbiAgICAgICAgJCQucm90YXRlZF9wYWRkaW5nX3RvcCA9IDU7XG5cbiAgICAgICAgJCQud2l0aG91dEZhZGVJbiA9IHt9O1xuXG4gICAgICAgICQkLmludGVydmFsRm9yT2JzZXJ2ZUluc2VydGVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICQkLmF4ZXMuc3VieCA9IGQzLnNlbGVjdEFsbChbXSk7IC8vIG5lZWRzIHdoZW4gZXhjbHVkaW5nIHN1YmNoYXJ0LmpzXG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmluaXRDaGFydEVsZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbml0QmFyKSB7IHRoaXMuaW5pdEJhcigpOyB9XG4gICAgICAgIGlmICh0aGlzLmluaXRMaW5lKSB7IHRoaXMuaW5pdExpbmUoKTsgfVxuICAgICAgICBpZiAodGhpcy5pbml0QXJjKSB7IHRoaXMuaW5pdEFyYygpOyB9XG4gICAgICAgIGlmICh0aGlzLmluaXRHYXVnZSkgeyB0aGlzLmluaXRHYXVnZSgpOyB9XG4gICAgICAgIGlmICh0aGlzLmluaXRUZXh0KSB7IHRoaXMuaW5pdFRleHQoKTsgfVxuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0V2l0aERhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBkMyA9ICQkLmQzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIHZhciBkZWZzLCBtYWluLCBiaW5kaW5nID0gdHJ1ZTtcblxuICAgICAgICAkJC5heGlzID0gbmV3IEF4aXMoJCQpO1xuXG4gICAgICAgIGlmICgkJC5pbml0UGllKSB7ICQkLmluaXRQaWUoKTsgfVxuICAgICAgICBpZiAoJCQuaW5pdEJydXNoKSB7ICQkLmluaXRCcnVzaCgpOyB9XG4gICAgICAgIGlmICgkJC5pbml0Wm9vbSkgeyAkJC5pbml0Wm9vbSgpOyB9XG5cbiAgICAgICAgaWYgKCFjb25maWcuYmluZHRvKSB7XG4gICAgICAgICAgICAkJC5zZWxlY3RDaGFydCA9IGQzLnNlbGVjdEFsbChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNvbmZpZy5iaW5kdG8ubm9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgJCQuc2VsZWN0Q2hhcnQgPSBjb25maWcuYmluZHRvO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgJCQuc2VsZWN0Q2hhcnQgPSBkMy5zZWxlY3QoY29uZmlnLmJpbmR0byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCQkLnNlbGVjdENoYXJ0LmVtcHR5KCkpIHtcbiAgICAgICAgICAgICQkLnNlbGVjdENoYXJ0ID0gZDMuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKS5zdHlsZSgnb3BhY2l0eScsIDApO1xuICAgICAgICAgICAgJCQub2JzZXJ2ZUluc2VydGVkKCQkLnNlbGVjdENoYXJ0KTtcbiAgICAgICAgICAgIGJpbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAkJC5zZWxlY3RDaGFydC5odG1sKFwiXCIpLmNsYXNzZWQoXCJjM1wiLCB0cnVlKTtcblxuICAgICAgICAvLyBJbml0IGRhdGEgYXMgdGFyZ2V0c1xuICAgICAgICAkJC5kYXRhLnhzID0ge307XG4gICAgICAgICQkLmRhdGEudGFyZ2V0cyA9ICQkLmNvbnZlcnREYXRhVG9UYXJnZXRzKGRhdGEpO1xuXG4gICAgICAgIGlmIChjb25maWcuZGF0YV9maWx0ZXIpIHtcbiAgICAgICAgICAgICQkLmRhdGEudGFyZ2V0cyA9ICQkLmRhdGEudGFyZ2V0cy5maWx0ZXIoY29uZmlnLmRhdGFfZmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0YXJnZXRzIHRvIGhpZGUgaWYgbmVlZGVkXG4gICAgICAgIGlmIChjb25maWcuZGF0YV9oaWRlKSB7XG4gICAgICAgICAgICAkJC5hZGRIaWRkZW5UYXJnZXRJZHMoY29uZmlnLmRhdGFfaGlkZSA9PT0gdHJ1ZSA/ICQkLm1hcFRvSWRzKCQkLmRhdGEudGFyZ2V0cykgOiBjb25maWcuZGF0YV9oaWRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmxlZ2VuZF9oaWRlKSB7XG4gICAgICAgICAgICAkJC5hZGRIaWRkZW5MZWdlbmRJZHMoY29uZmlnLmxlZ2VuZF9oaWRlID09PSB0cnVlID8gJCQubWFwVG9JZHMoJCQuZGF0YS50YXJnZXRzKSA6IGNvbmZpZy5sZWdlbmRfaGlkZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIGdhdWdlLCBoaWRlIGxlZ2VuZCAvLyBUT0RPOiBmaXhcbiAgICAgICAgaWYgKCQkLmhhc1R5cGUoJ2dhdWdlJykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5sZWdlbmRfc2hvdyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdCBzaXplcyBhbmQgc2NhbGVzXG4gICAgICAgICQkLnVwZGF0ZVNpemVzKCk7XG4gICAgICAgICQkLnVwZGF0ZVNjYWxlcygpO1xuXG4gICAgICAgIC8vIFNldCBkb21haW5zIGZvciBlYWNoIHNjYWxlXG4gICAgICAgICQkLnguZG9tYWluKGQzLmV4dGVudCgkJC5nZXRYRG9tYWluKCQkLmRhdGEudGFyZ2V0cykpKTtcbiAgICAgICAgJCQueS5kb21haW4oJCQuZ2V0WURvbWFpbigkJC5kYXRhLnRhcmdldHMsICd5JykpO1xuICAgICAgICAkJC55Mi5kb21haW4oJCQuZ2V0WURvbWFpbigkJC5kYXRhLnRhcmdldHMsICd5MicpKTtcbiAgICAgICAgJCQuc3ViWC5kb21haW4oJCQueC5kb21haW4oKSk7XG4gICAgICAgICQkLnN1YlkuZG9tYWluKCQkLnkuZG9tYWluKCkpO1xuICAgICAgICAkJC5zdWJZMi5kb21haW4oJCQueTIuZG9tYWluKCkpO1xuXG4gICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgeCBkb21haW4gZm9yIHpvb20gdXBkYXRlXG4gICAgICAgICQkLm9yZ1hEb21haW4gPSAkJC54LmRvbWFpbigpO1xuXG4gICAgICAgIC8vIFNldCBpbml0aWFsaXplZCBzY2FsZXMgdG8gYnJ1c2ggYW5kIHpvb21cbiAgICAgICAgaWYgKCQkLmJydXNoKSB7ICQkLmJydXNoLnNjYWxlKCQkLnN1YlgpOyB9XG4gICAgICAgIGlmIChjb25maWcuem9vbV9lbmFibGVkKSB7ICQkLnpvb20uc2NhbGUoJCQueCk7IH1cblxuICAgICAgICAvKi0tIEJhc2ljIEVsZW1lbnRzIC0tKi9cblxuICAgICAgICAvLyBEZWZpbmUgc3Znc1xuICAgICAgICAkJC5zdmcgPSAkJC5zZWxlY3RDaGFydC5hcHBlbmQoXCJzdmdcIilcbiAgICAgICAgICAgIC5zdHlsZShcIm92ZXJmbG93XCIsIFwiaGlkZGVuXCIpXG4gICAgICAgICAgICAub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWcub25tb3VzZW92ZXIuY2FsbCgkJCk7IH0pXG4gICAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWcub25tb3VzZW91dC5jYWxsKCQkKTsgfSk7XG5cbiAgICAgICAgaWYgKCQkLmNvbmZpZy5zdmdfY2xhc3NuYW1lKSB7XG4gICAgICAgICAgICAkJC5zdmcuYXR0cignY2xhc3MnLCAkJC5jb25maWcuc3ZnX2NsYXNzbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgZGVmc1xuICAgICAgICBkZWZzID0gJCQuc3ZnLmFwcGVuZChcImRlZnNcIik7XG4gICAgICAgICQkLmNsaXBDaGFydCA9ICQkLmFwcGVuZENsaXAoZGVmcywgJCQuY2xpcElkKTtcbiAgICAgICAgJCQuY2xpcFhBeGlzID0gJCQuYXBwZW5kQ2xpcChkZWZzLCAkJC5jbGlwSWRGb3JYQXhpcyk7XG4gICAgICAgICQkLmNsaXBZQXhpcyA9ICQkLmFwcGVuZENsaXAoZGVmcywgJCQuY2xpcElkRm9yWUF4aXMpO1xuICAgICAgICAkJC5jbGlwR3JpZCA9ICQkLmFwcGVuZENsaXAoZGVmcywgJCQuY2xpcElkRm9yR3JpZCk7XG4gICAgICAgICQkLmNsaXBTdWJjaGFydCA9ICQkLmFwcGVuZENsaXAoZGVmcywgJCQuY2xpcElkRm9yU3ViY2hhcnQpO1xuICAgICAgICAkJC51cGRhdGVTdmdTaXplKCk7XG5cbiAgICAgICAgLy8gRGVmaW5lIHJlZ2lvbnNcbiAgICAgICAgbWFpbiA9ICQkLm1haW4gPSAkJC5zdmcuYXBwZW5kKFwiZ1wiKS5hdHRyKFwidHJhbnNmb3JtXCIsICQkLmdldFRyYW5zbGF0ZSgnbWFpbicpKTtcblxuICAgICAgICBpZiAoJCQuaW5pdFN1YmNoYXJ0KSB7ICQkLmluaXRTdWJjaGFydCgpOyB9XG4gICAgICAgIGlmICgkJC5pbml0VG9vbHRpcCkgeyAkJC5pbml0VG9vbHRpcCgpOyB9XG4gICAgICAgIGlmICgkJC5pbml0TGVnZW5kKSB7ICQkLmluaXRMZWdlbmQoKTsgfVxuICAgICAgICBpZiAoJCQuaW5pdFRpdGxlKSB7ICQkLmluaXRUaXRsZSgpOyB9XG5cbiAgICAgICAgLyotLSBNYWluIFJlZ2lvbiAtLSovXG5cbiAgICAgICAgLy8gdGV4dCB3aGVuIGVtcHR5XG4gICAgICAgIG1haW4uYXBwZW5kKFwidGV4dFwiKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy50ZXh0ICsgJyAnICsgQ0xBU1MuZW1wdHkpXG4gICAgICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpIC8vIGhvcml6b250YWwgY2VudGVyaW5nIG9mIHRleHQgYXQgeCBwb3NpdGlvbiBpbiBhbGwgYnJvd3NlcnMuXG4gICAgICAgICAgICAuYXR0cihcImRvbWluYW50LWJhc2VsaW5lXCIsIFwibWlkZGxlXCIpOyAvLyB2ZXJ0aWNhbCBjZW50ZXJpbmcgb2YgdGV4dCBhdCB5IHBvc2l0aW9uIGluIGFsbCBicm93c2VycywgZXhjZXB0IElFLlxuXG4gICAgICAgIC8vIFJlZ2lvbnNcbiAgICAgICAgJCQuaW5pdFJlZ2lvbigpO1xuXG4gICAgICAgIC8vIEdyaWRzXG4gICAgICAgICQkLmluaXRHcmlkKCk7XG5cbiAgICAgICAgLy8gRGVmaW5lIGcgZm9yIGNoYXJ0IGFyZWFcbiAgICAgICAgbWFpbi5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgJCQuY2xpcFBhdGgpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBDTEFTUy5jaGFydCk7XG5cbiAgICAgICAgLy8gR3JpZCBsaW5lc1xuICAgICAgICBpZiAoY29uZmlnLmdyaWRfbGluZXNfZnJvbnQpIHsgJCQuaW5pdEdyaWRMaW5lcygpOyB9XG5cbiAgICAgICAgLy8gQ292ZXIgd2hvbGUgd2l0aCByZWN0cyBmb3IgZXZlbnRzXG4gICAgICAgICQkLmluaXRFdmVudFJlY3QoKTtcblxuICAgICAgICAvLyBEZWZpbmUgZyBmb3IgY2hhcnRcbiAgICAgICAgJCQuaW5pdENoYXJ0RWxlbWVudHMoKTtcblxuICAgICAgICAvLyBpZiB6b29tIHByaXZpbGVnZWQsIGluc2VydCByZWN0IHRvIGZvcmVmcm9udFxuICAgICAgICAvLyBUT0RPOiBpcyB0aGlzIG5lZWRlZD9cbiAgICAgICAgbWFpbi5pbnNlcnQoJ3JlY3QnLCBjb25maWcuem9vbV9wcml2aWxlZ2VkID8gbnVsbCA6ICdnLicgKyBDTEFTUy5yZWdpb25zKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgQ0xBU1Muem9vbVJlY3QpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCAkJC53aWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAkJC5oZWlnaHQpXG4gICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBudWxsKTtcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCBleHRlbnQgaWYgZGVmaW5lZFxuICAgICAgICBpZiAoY29uZmlnLmF4aXNfeF9leHRlbnQpIHsgJCQuYnJ1c2guZXh0ZW50KCQkLmdldERlZmF1bHRFeHRlbnQoKSk7IH1cblxuICAgICAgICAvLyBBZGQgQXhpc1xuICAgICAgICAkJC5heGlzLmluaXQoKTtcblxuICAgICAgICAvLyBTZXQgdGFyZ2V0c1xuICAgICAgICAkJC51cGRhdGVUYXJnZXRzKCQkLmRhdGEudGFyZ2V0cyk7XG5cbiAgICAgICAgLy8gRHJhdyB3aXRoIHRhcmdldHNcbiAgICAgICAgaWYgKGJpbmRpbmcpIHtcbiAgICAgICAgICAgICQkLnVwZGF0ZURpbWVuc2lvbigpO1xuICAgICAgICAgICAgJCQuY29uZmlnLm9uaW5pdC5jYWxsKCQkKTtcbiAgICAgICAgICAgICQkLnJlZHJhdyh7XG4gICAgICAgICAgICAgICAgd2l0aFRyYW5zaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdpdGhUcmFuc2Zvcm06IHRydWUsXG4gICAgICAgICAgICAgICAgd2l0aFVwZGF0ZVhEb21haW46IHRydWUsXG4gICAgICAgICAgICAgICAgd2l0aFVwZGF0ZU9yZ1hEb21haW46IHRydWUsXG4gICAgICAgICAgICAgICAgd2l0aFRyYW5zaXRpb25Gb3JBeGlzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCaW5kIHJlc2l6ZSBldmVudFxuICAgICAgICAkJC5iaW5kUmVzaXplKCk7XG5cbiAgICAgICAgLy8gZXhwb3J0IGVsZW1lbnQgb2YgdGhlIGNoYXJ0XG4gICAgICAgICQkLmFwaS5lbGVtZW50ID0gJCQuc2VsZWN0Q2hhcnQubm9kZSgpO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5zbW9vdGhMaW5lcyA9IGZ1bmN0aW9uIChlbCwgdHlwZSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2dyaWQnKSB7XG4gICAgICAgICAgICBlbC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZyA9ICQkLmQzLnNlbGVjdCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgeDEgPSBnLmF0dHIoJ3gxJyksXG4gICAgICAgICAgICAgICAgICAgIHgyID0gZy5hdHRyKCd4MicpLFxuICAgICAgICAgICAgICAgICAgICB5MSA9IGcuYXR0cigneTEnKSxcbiAgICAgICAgICAgICAgICAgICAgeTIgPSBnLmF0dHIoJ3kyJyk7XG4gICAgICAgICAgICAgICAgZy5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgJ3gxJzogTWF0aC5jZWlsKHgxKSxcbiAgICAgICAgICAgICAgICAgICAgJ3gyJzogTWF0aC5jZWlsKHgyKSxcbiAgICAgICAgICAgICAgICAgICAgJ3kxJzogTWF0aC5jZWlsKHkxKSxcbiAgICAgICAgICAgICAgICAgICAgJ3kyJzogTWF0aC5jZWlsKHkyKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVTaXplcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICB2YXIgbGVnZW5kSGVpZ2h0ID0gJCQubGVnZW5kID8gJCQuZ2V0TGVnZW5kSGVpZ2h0KCkgOiAwLFxuICAgICAgICAgICAgbGVnZW5kV2lkdGggPSAkJC5sZWdlbmQgPyAkJC5nZXRMZWdlbmRXaWR0aCgpIDogMCxcbiAgICAgICAgICAgIGxlZ2VuZEhlaWdodEZvckJvdHRvbSA9ICQkLmlzTGVnZW5kUmlnaHQgfHwgJCQuaXNMZWdlbmRJbnNldCA/IDAgOiBsZWdlbmRIZWlnaHQsXG4gICAgICAgICAgICBoYXNBcmMgPSAkJC5oYXNBcmNUeXBlKCksXG4gICAgICAgICAgICB4QXhpc0hlaWdodCA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgfHwgaGFzQXJjID8gMCA6ICQkLmdldEhvcml6b250YWxBeGlzSGVpZ2h0KCd4JyksXG4gICAgICAgICAgICBzdWJjaGFydEhlaWdodCA9IGNvbmZpZy5zdWJjaGFydF9zaG93ICYmICFoYXNBcmMgPyAoY29uZmlnLnN1YmNoYXJ0X3NpemVfaGVpZ2h0ICsgeEF4aXNIZWlnaHQpIDogMDtcblxuICAgICAgICAkJC5jdXJyZW50V2lkdGggPSAkJC5nZXRDdXJyZW50V2lkdGgoKTtcbiAgICAgICAgJCQuY3VycmVudEhlaWdodCA9ICQkLmdldEN1cnJlbnRIZWlnaHQoKTtcblxuICAgICAgICAvLyBmb3IgbWFpblxuICAgICAgICAkJC5tYXJnaW4gPSBjb25maWcuYXhpc19yb3RhdGVkID8ge1xuICAgICAgICAgICAgdG9wOiAkJC5nZXRIb3Jpem9udGFsQXhpc0hlaWdodCgneTInKSArICQkLmdldEN1cnJlbnRQYWRkaW5nVG9wKCksXG4gICAgICAgICAgICByaWdodDogaGFzQXJjID8gMCA6ICQkLmdldEN1cnJlbnRQYWRkaW5nUmlnaHQoKSxcbiAgICAgICAgICAgIGJvdHRvbTogJCQuZ2V0SG9yaXpvbnRhbEF4aXNIZWlnaHQoJ3knKSArIGxlZ2VuZEhlaWdodEZvckJvdHRvbSArICQkLmdldEN1cnJlbnRQYWRkaW5nQm90dG9tKCksXG4gICAgICAgICAgICBsZWZ0OiBzdWJjaGFydEhlaWdodCArIChoYXNBcmMgPyAwIDogJCQuZ2V0Q3VycmVudFBhZGRpbmdMZWZ0KCkpXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgICB0b3A6IDQgKyAkJC5nZXRDdXJyZW50UGFkZGluZ1RvcCgpLCAvLyBmb3IgdG9wIHRpY2sgdGV4dFxuICAgICAgICAgICAgcmlnaHQ6IGhhc0FyYyA/IDAgOiAkJC5nZXRDdXJyZW50UGFkZGluZ1JpZ2h0KCksXG4gICAgICAgICAgICBib3R0b206IHhBeGlzSGVpZ2h0ICsgc3ViY2hhcnRIZWlnaHQgKyBsZWdlbmRIZWlnaHRGb3JCb3R0b20gKyAkJC5nZXRDdXJyZW50UGFkZGluZ0JvdHRvbSgpLFxuICAgICAgICAgICAgbGVmdDogaGFzQXJjID8gMCA6ICQkLmdldEN1cnJlbnRQYWRkaW5nTGVmdCgpXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gZm9yIHN1YmNoYXJ0XG4gICAgICAgICQkLm1hcmdpbjIgPSBjb25maWcuYXhpc19yb3RhdGVkID8ge1xuICAgICAgICAgICAgdG9wOiAkJC5tYXJnaW4udG9wLFxuICAgICAgICAgICAgcmlnaHQ6IE5hTixcbiAgICAgICAgICAgIGJvdHRvbTogMjAgKyBsZWdlbmRIZWlnaHRGb3JCb3R0b20sXG4gICAgICAgICAgICBsZWZ0OiAkJC5yb3RhdGVkX3BhZGRpbmdfbGVmdFxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgdG9wOiAkJC5jdXJyZW50SGVpZ2h0IC0gc3ViY2hhcnRIZWlnaHQgLSBsZWdlbmRIZWlnaHRGb3JCb3R0b20sXG4gICAgICAgICAgICByaWdodDogTmFOLFxuICAgICAgICAgICAgYm90dG9tOiB4QXhpc0hlaWdodCArIGxlZ2VuZEhlaWdodEZvckJvdHRvbSxcbiAgICAgICAgICAgIGxlZnQ6ICQkLm1hcmdpbi5sZWZ0XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gZm9yIGxlZ2VuZFxuICAgICAgICAkJC5tYXJnaW4zID0ge1xuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgcmlnaHQ6IE5hTixcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCQkLnVwZGF0ZVNpemVGb3JMZWdlbmQpIHsgJCQudXBkYXRlU2l6ZUZvckxlZ2VuZChsZWdlbmRIZWlnaHQsIGxlZ2VuZFdpZHRoKTsgfVxuXG4gICAgICAgICQkLndpZHRoID0gJCQuY3VycmVudFdpZHRoIC0gJCQubWFyZ2luLmxlZnQgLSAkJC5tYXJnaW4ucmlnaHQ7XG4gICAgICAgICQkLmhlaWdodCA9ICQkLmN1cnJlbnRIZWlnaHQgLSAkJC5tYXJnaW4udG9wIC0gJCQubWFyZ2luLmJvdHRvbTtcbiAgICAgICAgaWYgKCQkLndpZHRoIDwgMCkgeyAkJC53aWR0aCA9IDA7IH1cbiAgICAgICAgaWYgKCQkLmhlaWdodCA8IDApIHsgJCQuaGVpZ2h0ID0gMDsgfVxuXG4gICAgICAgICQkLndpZHRoMiA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC5tYXJnaW4ubGVmdCAtICQkLnJvdGF0ZWRfcGFkZGluZ19sZWZ0IC0gJCQucm90YXRlZF9wYWRkaW5nX3JpZ2h0IDogJCQud2lkdGg7XG4gICAgICAgICQkLmhlaWdodDIgPSBjb25maWcuYXhpc19yb3RhdGVkID8gJCQuaGVpZ2h0IDogJCQuY3VycmVudEhlaWdodCAtICQkLm1hcmdpbjIudG9wIC0gJCQubWFyZ2luMi5ib3R0b207XG4gICAgICAgIGlmICgkJC53aWR0aDIgPCAwKSB7ICQkLndpZHRoMiA9IDA7IH1cbiAgICAgICAgaWYgKCQkLmhlaWdodDIgPCAwKSB7ICQkLmhlaWdodDIgPSAwOyB9XG5cbiAgICAgICAgLy8gZm9yIGFyY1xuICAgICAgICAkJC5hcmNXaWR0aCA9ICQkLndpZHRoIC0gKCQkLmlzTGVnZW5kUmlnaHQgPyBsZWdlbmRXaWR0aCArIDEwIDogMCk7XG4gICAgICAgICQkLmFyY0hlaWdodCA9ICQkLmhlaWdodCAtICgkJC5pc0xlZ2VuZFJpZ2h0ID8gMCA6IDEwKTtcbiAgICAgICAgaWYgKCQkLmhhc1R5cGUoJ2dhdWdlJykgJiYgIWNvbmZpZy5nYXVnZV9mdWxsQ2lyY2xlKSB7XG4gICAgICAgICAgICAkJC5hcmNIZWlnaHQgKz0gJCQuaGVpZ2h0IC0gJCQuZ2V0R2F1Z2VMYWJlbEhlaWdodCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkJC51cGRhdGVSYWRpdXMpIHsgJCQudXBkYXRlUmFkaXVzKCk7IH1cblxuICAgICAgICBpZiAoJCQuaXNMZWdlbmRSaWdodCAmJiBoYXNBcmMpIHtcbiAgICAgICAgICAgICQkLm1hcmdpbjMubGVmdCA9ICQkLmFyY1dpZHRoIC8gMiArICQkLnJhZGl1c0V4cGFuZGVkICogMS4xO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVRhcmdldHMgPSBmdW5jdGlvbiAodGFyZ2V0cykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuXG4gICAgICAgIC8qLS0gTWFpbiAtLSovXG5cbiAgICAgICAgLy8tLSBUZXh0IC0tLy9cbiAgICAgICAgJCQudXBkYXRlVGFyZ2V0c0ZvclRleHQodGFyZ2V0cyk7XG5cbiAgICAgICAgLy8tLSBCYXIgLS0vL1xuICAgICAgICAkJC51cGRhdGVUYXJnZXRzRm9yQmFyKHRhcmdldHMpO1xuXG4gICAgICAgIC8vLS0gTGluZSAtLS8vXG4gICAgICAgICQkLnVwZGF0ZVRhcmdldHNGb3JMaW5lKHRhcmdldHMpO1xuXG4gICAgICAgIC8vLS0gQXJjIC0tLy9cbiAgICAgICAgaWYgKCQkLmhhc0FyY1R5cGUoKSAmJiAkJC51cGRhdGVUYXJnZXRzRm9yQXJjKSB7ICQkLnVwZGF0ZVRhcmdldHNGb3JBcmModGFyZ2V0cyk7IH1cblxuICAgICAgICAvKi0tIFN1YiAtLSovXG5cbiAgICAgICAgaWYgKCQkLnVwZGF0ZVRhcmdldHNGb3JTdWJjaGFydCkgeyAkJC51cGRhdGVUYXJnZXRzRm9yU3ViY2hhcnQodGFyZ2V0cyk7IH1cblxuICAgICAgICAvLyBGYWRlLWluIGVhY2ggY2hhcnRcbiAgICAgICAgJCQuc2hvd1RhcmdldHMoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnNob3dUYXJnZXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICAkJC5zdmcuc2VsZWN0QWxsKCcuJyArIENMQVNTLnRhcmdldCkuZmlsdGVyKGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC5pc1RhcmdldFRvU2hvdyhkLmlkKTsgfSlcbiAgICAgICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKCQkLmNvbmZpZy50cmFuc2l0aW9uX2R1cmF0aW9uKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAxKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucmVkcmF3ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRyYW5zaXRpb25zKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIG1haW4gPSAkJC5tYWluLCBkMyA9ICQkLmQzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIHZhciBhcmVhSW5kaWNlcyA9ICQkLmdldFNoYXBlSW5kaWNlcygkJC5pc0FyZWFUeXBlKSwgYmFySW5kaWNlcyA9ICQkLmdldFNoYXBlSW5kaWNlcygkJC5pc0JhclR5cGUpLCBsaW5lSW5kaWNlcyA9ICQkLmdldFNoYXBlSW5kaWNlcygkJC5pc0xpbmVUeXBlKTtcbiAgICAgICAgdmFyIHdpdGhZLCB3aXRoU3ViY2hhcnQsIHdpdGhUcmFuc2l0aW9uLCB3aXRoVHJhbnNpdGlvbkZvckV4aXQsIHdpdGhUcmFuc2l0aW9uRm9yQXhpcyxcbiAgICAgICAgICAgIHdpdGhUcmFuc2Zvcm0sIHdpdGhVcGRhdGVYRG9tYWluLCB3aXRoVXBkYXRlT3JnWERvbWFpbiwgd2l0aFRyaW1YRG9tYWluLCB3aXRoTGVnZW5kLFxuICAgICAgICAgICAgd2l0aEV2ZW50UmVjdCwgd2l0aERpbWVuc2lvbiwgd2l0aFVwZGF0ZVhBeGlzO1xuICAgICAgICB2YXIgaGlkZUF4aXMgPSAkJC5oYXNBcmNUeXBlKCk7XG4gICAgICAgIHZhciBkcmF3QXJlYSwgZHJhd0JhciwgZHJhd0xpbmUsIHhGb3JUZXh0LCB5Rm9yVGV4dDtcbiAgICAgICAgdmFyIGR1cmF0aW9uLCBkdXJhdGlvbkZvckV4aXQsIGR1cmF0aW9uRm9yQXhpcztcbiAgICAgICAgdmFyIHdhaXRGb3JEcmF3LCBmbG93O1xuICAgICAgICB2YXIgdGFyZ2V0c1RvU2hvdyA9ICQkLmZpbHRlclRhcmdldHNUb1Nob3coJCQuZGF0YS50YXJnZXRzKSwgdGlja1ZhbHVlcywgaSwgaW50ZXJ2YWxGb3JDdWxsaW5nLCB4RG9tYWluRm9yWm9vbTtcbiAgICAgICAgdmFyIHh2ID0gJCQueHYuYmluZCgkJCksIGN4LCBjeTtcblxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgd2l0aFkgPSBnZXRPcHRpb24ob3B0aW9ucywgXCJ3aXRoWVwiLCB0cnVlKTtcbiAgICAgICAgd2l0aFN1YmNoYXJ0ID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFN1YmNoYXJ0XCIsIHRydWUpO1xuICAgICAgICB3aXRoVHJhbnNpdGlvbiA9IGdldE9wdGlvbihvcHRpb25zLCBcIndpdGhUcmFuc2l0aW9uXCIsIHRydWUpO1xuICAgICAgICB3aXRoVHJhbnNmb3JtID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyYW5zZm9ybVwiLCBmYWxzZSk7XG4gICAgICAgIHdpdGhVcGRhdGVYRG9tYWluID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFVwZGF0ZVhEb21haW5cIiwgZmFsc2UpO1xuICAgICAgICB3aXRoVXBkYXRlT3JnWERvbWFpbiA9IGdldE9wdGlvbihvcHRpb25zLCBcIndpdGhVcGRhdGVPcmdYRG9tYWluXCIsIGZhbHNlKTtcbiAgICAgICAgd2l0aFRyaW1YRG9tYWluID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyaW1YRG9tYWluXCIsIHRydWUpO1xuICAgICAgICB3aXRoVXBkYXRlWEF4aXMgPSBnZXRPcHRpb24ob3B0aW9ucywgXCJ3aXRoVXBkYXRlWEF4aXNcIiwgd2l0aFVwZGF0ZVhEb21haW4pO1xuICAgICAgICB3aXRoTGVnZW5kID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aExlZ2VuZFwiLCBmYWxzZSk7XG4gICAgICAgIHdpdGhFdmVudFJlY3QgPSBnZXRPcHRpb24ob3B0aW9ucywgXCJ3aXRoRXZlbnRSZWN0XCIsIHRydWUpO1xuICAgICAgICB3aXRoRGltZW5zaW9uID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aERpbWVuc2lvblwiLCB0cnVlKTtcbiAgICAgICAgd2l0aFRyYW5zaXRpb25Gb3JFeGl0ID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyYW5zaXRpb25Gb3JFeGl0XCIsIHdpdGhUcmFuc2l0aW9uKTtcbiAgICAgICAgd2l0aFRyYW5zaXRpb25Gb3JBeGlzID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyYW5zaXRpb25Gb3JBeGlzXCIsIHdpdGhUcmFuc2l0aW9uKTtcblxuICAgICAgICBkdXJhdGlvbiA9IHdpdGhUcmFuc2l0aW9uID8gY29uZmlnLnRyYW5zaXRpb25fZHVyYXRpb24gOiAwO1xuICAgICAgICBkdXJhdGlvbkZvckV4aXQgPSB3aXRoVHJhbnNpdGlvbkZvckV4aXQgPyBkdXJhdGlvbiA6IDA7XG4gICAgICAgIGR1cmF0aW9uRm9yQXhpcyA9IHdpdGhUcmFuc2l0aW9uRm9yQXhpcyA/IGR1cmF0aW9uIDogMDtcblxuICAgICAgICB0cmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zIHx8ICQkLmF4aXMuZ2VuZXJhdGVUcmFuc2l0aW9ucyhkdXJhdGlvbkZvckF4aXMpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBsZWdlbmQgYW5kIHRyYW5zZm9ybSBlYWNoIGdcbiAgICAgICAgaWYgKHdpdGhMZWdlbmQgJiYgY29uZmlnLmxlZ2VuZF9zaG93KSB7XG4gICAgICAgICAgICAkJC51cGRhdGVMZWdlbmQoJCQubWFwVG9JZHMoJCQuZGF0YS50YXJnZXRzKSwgb3B0aW9ucywgdHJhbnNpdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKHdpdGhEaW1lbnNpb24pIHtcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gdXBkYXRlIGRpbWVuc2lvbiAoZS5nLiBheGlzLnkudGljay52YWx1ZXMpIGJlY2F1c2UgeSB0aWNrIHZhbHVlcyBzaG91bGQgY2hhbmdlXG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHVwZGF0ZSBheGlzIGluIGl0IGJlY2F1c2UgdGhleSB3aWxsIGJlIHVwZGF0ZWQgaW4gcmVkcmF3KClcbiAgICAgICAgICAgICQkLnVwZGF0ZURpbWVuc2lvbih0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1FTU86IG5lZWRlZCBmb3IgZ3JpZHMgY2FsY3VsYXRpb25cbiAgICAgICAgaWYgKCQkLmlzQ2F0ZWdvcml6ZWQoKSAmJiB0YXJnZXRzVG9TaG93Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgJCQueC5kb21haW4oWzAsICQkLmF4ZXMueC5zZWxlY3RBbGwoJy50aWNrJykuc2l6ZSgpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0c1RvU2hvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgICQkLnVwZGF0ZVhEb21haW4odGFyZ2V0c1RvU2hvdywgd2l0aFVwZGF0ZVhEb21haW4sIHdpdGhVcGRhdGVPcmdYRG9tYWluLCB3aXRoVHJpbVhEb21haW4pO1xuICAgICAgICAgICAgaWYgKCFjb25maWcuYXhpc194X3RpY2tfdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGlja1ZhbHVlcyA9ICQkLmF4aXMudXBkYXRlWEF4aXNUaWNrVmFsdWVzKHRhcmdldHNUb1Nob3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCQueEF4aXMudGlja1ZhbHVlcyhbXSk7XG4gICAgICAgICAgICAkJC5zdWJYQXhpcy50aWNrVmFsdWVzKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuem9vbV9yZXNjYWxlICYmICFvcHRpb25zLmZsb3cpIHtcbiAgICAgICAgICAgIHhEb21haW5Gb3Jab29tID0gJCQueC5vcmdEb21haW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQkLnkuZG9tYWluKCQkLmdldFlEb21haW4odGFyZ2V0c1RvU2hvdywgJ3knLCB4RG9tYWluRm9yWm9vbSkpO1xuICAgICAgICAkJC55Mi5kb21haW4oJCQuZ2V0WURvbWFpbih0YXJnZXRzVG9TaG93LCAneTInLCB4RG9tYWluRm9yWm9vbSkpO1xuXG4gICAgICAgIGlmICghY29uZmlnLmF4aXNfeV90aWNrX3ZhbHVlcyAmJiBjb25maWcuYXhpc195X3RpY2tfY291bnQpIHtcbiAgICAgICAgICAgICQkLnlBeGlzLnRpY2tWYWx1ZXMoJCQuYXhpcy5nZW5lcmF0ZVRpY2tWYWx1ZXMoJCQueS5kb21haW4oKSwgY29uZmlnLmF4aXNfeV90aWNrX2NvdW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb25maWcuYXhpc195Ml90aWNrX3ZhbHVlcyAmJiBjb25maWcuYXhpc195Ml90aWNrX2NvdW50KSB7XG4gICAgICAgICAgICAkJC55MkF4aXMudGlja1ZhbHVlcygkJC5heGlzLmdlbmVyYXRlVGlja1ZhbHVlcygkJC55Mi5kb21haW4oKSwgY29uZmlnLmF4aXNfeTJfdGlja19jb3VudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXhlc1xuICAgICAgICAkJC5heGlzLnJlZHJhdyh0cmFuc2l0aW9ucywgaGlkZUF4aXMpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBheGlzIGxhYmVsXG4gICAgICAgICQkLmF4aXMudXBkYXRlTGFiZWxzKHdpdGhUcmFuc2l0aW9uKTtcblxuICAgICAgICAvLyBzaG93L2hpZGUgaWYgbWFudWFsIGN1bGxpbmcgbmVlZGVkXG4gICAgICAgIGlmICgod2l0aFVwZGF0ZVhEb21haW4gfHwgd2l0aFVwZGF0ZVhBeGlzKSAmJiB0YXJnZXRzVG9TaG93Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5heGlzX3hfdGlja19jdWxsaW5nICYmIHRpY2tWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgdGlja1ZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGlja1ZhbHVlcy5sZW5ndGggLyBpIDwgY29uZmlnLmF4aXNfeF90aWNrX2N1bGxpbmdfbWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbEZvckN1bGxpbmcgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCQuc3ZnLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5heGlzWCArICcgLnRpY2sgdGV4dCcpLmVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGlja1ZhbHVlcy5pbmRleE9mKGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdkaXNwbGF5JywgaW5kZXggJSBpbnRlcnZhbEZvckN1bGxpbmcgPyAnbm9uZScgOiAnYmxvY2snKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkJC5zdmcuc2VsZWN0QWxsKCcuJyArIENMQVNTLmF4aXNYICsgJyAudGljayB0ZXh0Jykuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldHVwIGRyYXdlciAtIE1FTU86IHRoZXNlIG11c3QgYmUgY2FsbGVkIGFmdGVyIGF4aXMgdXBkYXRlZFxuICAgICAgICBkcmF3QXJlYSA9ICQkLmdlbmVyYXRlRHJhd0FyZWEgPyAkJC5nZW5lcmF0ZURyYXdBcmVhKGFyZWFJbmRpY2VzLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGRyYXdCYXIgPSAkJC5nZW5lcmF0ZURyYXdCYXIgPyAkJC5nZW5lcmF0ZURyYXdCYXIoYmFySW5kaWNlcykgOiB1bmRlZmluZWQ7XG4gICAgICAgIGRyYXdMaW5lID0gJCQuZ2VuZXJhdGVEcmF3TGluZSA/ICQkLmdlbmVyYXRlRHJhd0xpbmUobGluZUluZGljZXMsIGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgeEZvclRleHQgPSAkJC5nZW5lcmF0ZVhZRm9yVGV4dChhcmVhSW5kaWNlcywgYmFySW5kaWNlcywgbGluZUluZGljZXMsIHRydWUpO1xuICAgICAgICB5Rm9yVGV4dCA9ICQkLmdlbmVyYXRlWFlGb3JUZXh0KGFyZWFJbmRpY2VzLCBiYXJJbmRpY2VzLCBsaW5lSW5kaWNlcywgZmFsc2UpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdWIgZG9tYWluXG4gICAgICAgIGlmICh3aXRoWSkge1xuICAgICAgICAgICAgJCQuc3ViWS5kb21haW4oJCQuZ2V0WURvbWFpbih0YXJnZXRzVG9TaG93LCAneScpKTtcbiAgICAgICAgICAgICQkLnN1YlkyLmRvbWFpbigkJC5nZXRZRG9tYWluKHRhcmdldHNUb1Nob3csICd5MicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHhncmlkIGZvY3VzXG4gICAgICAgICQkLnVwZGF0ZVhncmlkRm9jdXMoKTtcblxuICAgICAgICAvLyBEYXRhIGVtcHR5IGxhYmVsIHBvc2l0aW9uaW5nIGFuZCB0ZXh0LlxuICAgICAgICBtYWluLnNlbGVjdChcInRleHQuXCIgKyBDTEFTUy50ZXh0ICsgJy4nICsgQ0xBU1MuZW1wdHkpXG4gICAgICAgICAgICAuYXR0cihcInhcIiwgJCQud2lkdGggLyAyKVxuICAgICAgICAgICAgLmF0dHIoXCJ5XCIsICQkLmhlaWdodCAvIDIpXG4gICAgICAgICAgICAudGV4dChjb25maWcuZGF0YV9lbXB0eV9sYWJlbF90ZXh0KVxuICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRhcmdldHNUb1Nob3cubGVuZ3RoID8gMCA6IDEpO1xuXG4gICAgICAgIC8vIGdyaWRcbiAgICAgICAgJCQudXBkYXRlR3JpZChkdXJhdGlvbik7XG5cbiAgICAgICAgLy8gcmVjdCBmb3IgcmVnaW9uc1xuICAgICAgICAkJC51cGRhdGVSZWdpb24oZHVyYXRpb24pO1xuXG4gICAgICAgIC8vIGJhcnNcbiAgICAgICAgJCQudXBkYXRlQmFyKGR1cmF0aW9uRm9yRXhpdCk7XG5cbiAgICAgICAgLy8gbGluZXMsIGFyZWFzIGFuZCBjcmljbGVzXG4gICAgICAgICQkLnVwZGF0ZUxpbmUoZHVyYXRpb25Gb3JFeGl0KTtcbiAgICAgICAgJCQudXBkYXRlQXJlYShkdXJhdGlvbkZvckV4aXQpO1xuICAgICAgICAkJC51cGRhdGVDaXJjbGUoKTtcblxuICAgICAgICAvLyB0ZXh0XG4gICAgICAgIGlmICgkJC5oYXNEYXRhTGFiZWwoKSkge1xuICAgICAgICAgICAgJCQudXBkYXRlVGV4dChkdXJhdGlvbkZvckV4aXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGl0bGVcbiAgICAgICAgaWYgKCQkLnJlZHJhd1RpdGxlKSB7ICQkLnJlZHJhd1RpdGxlKCk7IH1cblxuICAgICAgICAvLyBhcmNcbiAgICAgICAgaWYgKCQkLnJlZHJhd0FyYykgeyAkJC5yZWRyYXdBcmMoZHVyYXRpb24sIGR1cmF0aW9uRm9yRXhpdCwgd2l0aFRyYW5zZm9ybSk7IH1cblxuICAgICAgICAvLyBzdWJjaGFydFxuICAgICAgICBpZiAoJCQucmVkcmF3U3ViY2hhcnQpIHtcbiAgICAgICAgICAgICQkLnJlZHJhd1N1YmNoYXJ0KHdpdGhTdWJjaGFydCwgdHJhbnNpdGlvbnMsIGR1cmF0aW9uLCBkdXJhdGlvbkZvckV4aXQsIGFyZWFJbmRpY2VzLCBiYXJJbmRpY2VzLCBsaW5lSW5kaWNlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaXJjbGVzIGZvciBzZWxlY3RcbiAgICAgICAgbWFpbi5zZWxlY3RBbGwoJy4nICsgQ0xBU1Muc2VsZWN0ZWRDaXJjbGVzKVxuICAgICAgICAgICAgLmZpbHRlcigkJC5pc0JhclR5cGUuYmluZCgkJCkpXG4gICAgICAgICAgICAuc2VsZWN0QWxsKCdjaXJjbGUnKVxuICAgICAgICAgICAgLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIGV2ZW50IHJlY3RzIHdpbGwgcmVkcmF3biB3aGVuIGZsb3cgY2FsbGVkXG4gICAgICAgIGlmIChjb25maWcuaW50ZXJhY3Rpb25fZW5hYmxlZCAmJiAhb3B0aW9ucy5mbG93ICYmIHdpdGhFdmVudFJlY3QpIHtcbiAgICAgICAgICAgICQkLnJlZHJhd0V2ZW50UmVjdCgpO1xuICAgICAgICAgICAgaWYgKCQkLnVwZGF0ZVpvb20pIHsgJCQudXBkYXRlWm9vbSgpOyB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgY2lyY2xlWSBiYXNlZCBvbiB1cGRhdGVkIHBhcmFtZXRlcnNcbiAgICAgICAgJCQudXBkYXRlQ2lyY2xlWSgpO1xuXG4gICAgICAgIC8vIGdlbmVyYXRlIGNpcmNsZSB4L3kgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB1cGRhdGVkIHBhcmFtc1xuICAgICAgICBjeCA9ICgkJC5jb25maWcuYXhpc19yb3RhdGVkID8gJCQuY2lyY2xlWSA6ICQkLmNpcmNsZVgpLmJpbmQoJCQpO1xuICAgICAgICBjeSA9ICgkJC5jb25maWcuYXhpc19yb3RhdGVkID8gJCQuY2lyY2xlWCA6ICQkLmNpcmNsZVkpLmJpbmQoJCQpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZsb3cpIHtcbiAgICAgICAgICAgIGZsb3cgPSAkJC5nZW5lcmF0ZUZsb3coe1xuICAgICAgICAgICAgICAgIHRhcmdldHM6IHRhcmdldHNUb1Nob3csXG4gICAgICAgICAgICAgICAgZmxvdzogb3B0aW9ucy5mbG93LFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmZsb3cuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgZHJhd0JhcjogZHJhd0JhcixcbiAgICAgICAgICAgICAgICBkcmF3TGluZTogZHJhd0xpbmUsXG4gICAgICAgICAgICAgICAgZHJhd0FyZWE6IGRyYXdBcmVhLFxuICAgICAgICAgICAgICAgIGN4OiBjeCxcbiAgICAgICAgICAgICAgICBjeTogY3ksXG4gICAgICAgICAgICAgICAgeHY6IHh2LFxuICAgICAgICAgICAgICAgIHhGb3JUZXh0OiB4Rm9yVGV4dCxcbiAgICAgICAgICAgICAgICB5Rm9yVGV4dDogeUZvclRleHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChkdXJhdGlvbiB8fCBmbG93KSAmJiAkJC5pc1RhYlZpc2libGUoKSkgeyAvLyBPbmx5IHVzZSB0cmFuc2l0aW9uIGlmIHRhYiB2aXNpYmxlLiBTZWUgIzkzOC5cbiAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gc2hvdWxkIGJlIGRlcml2ZWQgZnJvbSBvbmUgdHJhbnNpdGlvblxuICAgICAgICAgICAgZDMudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNpdGlvbnNUb1dhaXQgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHJlZHJhdyBhbmQgZ2F0aGVyIHRyYW5zaXRpb25zXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAkJC5yZWRyYXdCYXIoZHJhd0JhciwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICQkLnJlZHJhd0xpbmUoZHJhd0xpbmUsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAkJC5yZWRyYXdBcmVhKGRyYXdBcmVhLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgJCQucmVkcmF3Q2lyY2xlKGN4LCBjeSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICQkLnJlZHJhd1RleHQoeEZvclRleHQsIHlGb3JUZXh0LCBvcHRpb25zLmZsb3csIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAkJC5yZWRyYXdSZWdpb24odHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICQkLnJlZHJhd0dyaWQodHJ1ZSksXG4gICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFuc2l0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uc1RvV2FpdC5wdXNoKHRyYW5zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIGVuZCBvZiB0cmFuc2l0aW9ucyB0byBjYWxsIGZsb3cgYW5kIG9ucmVuZGVyZWQgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICB3YWl0Rm9yRHJhdyA9ICQkLmdlbmVyYXRlV2FpdCgpO1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zVG9XYWl0LmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdEZvckRyYXcuYWRkKHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYWxsKHdhaXRGb3JEcmF3LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9ucmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9ucmVuZGVyZWQuY2FsbCgkJCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAkJC5yZWRyYXdCYXIoZHJhd0Jhcik7XG4gICAgICAgICAgICAkJC5yZWRyYXdMaW5lKGRyYXdMaW5lKTtcbiAgICAgICAgICAgICQkLnJlZHJhd0FyZWEoZHJhd0FyZWEpO1xuICAgICAgICAgICAgJCQucmVkcmF3Q2lyY2xlKGN4LCBjeSk7XG4gICAgICAgICAgICAkJC5yZWRyYXdUZXh0KHhGb3JUZXh0LCB5Rm9yVGV4dCwgb3B0aW9ucy5mbG93KTtcbiAgICAgICAgICAgICQkLnJlZHJhd1JlZ2lvbigpO1xuICAgICAgICAgICAgJCQucmVkcmF3R3JpZCgpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5vbnJlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLm9ucmVuZGVyZWQuY2FsbCgkJCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgZmFkZWluIGNvbmRpdGlvblxuICAgICAgICAkJC5tYXBUb0lkcygkJC5kYXRhLnRhcmdldHMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAkJC53aXRob3V0RmFkZUluW2lkXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVBbmRSZWRyYXcgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsIHRyYW5zaXRpb25zO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgLy8gc2FtZSB3aXRoIHJlZHJhd1xuICAgICAgICBvcHRpb25zLndpdGhUcmFuc2l0aW9uID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyYW5zaXRpb25cIiwgdHJ1ZSk7XG4gICAgICAgIG9wdGlvbnMud2l0aFRyYW5zZm9ybSA9IGdldE9wdGlvbihvcHRpb25zLCBcIndpdGhUcmFuc2Zvcm1cIiwgZmFsc2UpO1xuICAgICAgICBvcHRpb25zLndpdGhMZWdlbmQgPSBnZXRPcHRpb24ob3B0aW9ucywgXCJ3aXRoTGVnZW5kXCIsIGZhbHNlKTtcbiAgICAgICAgLy8gTk9UIHNhbWUgd2l0aCByZWRyYXdcbiAgICAgICAgb3B0aW9ucy53aXRoVXBkYXRlWERvbWFpbiA9IHRydWU7XG4gICAgICAgIG9wdGlvbnMud2l0aFVwZGF0ZU9yZ1hEb21haW4gPSB0cnVlO1xuICAgICAgICBvcHRpb25zLndpdGhUcmFuc2l0aW9uRm9yRXhpdCA9IGZhbHNlO1xuICAgICAgICBvcHRpb25zLndpdGhUcmFuc2l0aW9uRm9yVHJhbnNmb3JtID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyYW5zaXRpb25Gb3JUcmFuc2Zvcm1cIiwgb3B0aW9ucy53aXRoVHJhbnNpdGlvbik7XG4gICAgICAgIC8vIE1FTU86IHRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVMZWdlbmQgYW5kIGl0IG1lYW5zIHRoaXMgQUxXQVlTIG5lZWRzIHRvIGJlIGNhbGxlZClcbiAgICAgICAgJCQudXBkYXRlU2l6ZXMoKTtcbiAgICAgICAgLy8gTUVNTzogY2FsbGVkIGluIHVwZGF0ZUxlZ2VuZCBpbiByZWRyYXcgaWYgd2l0aExlZ2VuZFxuICAgICAgICBpZiAoIShvcHRpb25zLndpdGhMZWdlbmQgJiYgY29uZmlnLmxlZ2VuZF9zaG93KSkge1xuICAgICAgICAgICAgdHJhbnNpdGlvbnMgPSAkJC5heGlzLmdlbmVyYXRlVHJhbnNpdGlvbnMob3B0aW9ucy53aXRoVHJhbnNpdGlvbkZvckF4aXMgPyBjb25maWcudHJhbnNpdGlvbl9kdXJhdGlvbiA6IDApO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHNjYWxlc1xuICAgICAgICAgICAgJCQudXBkYXRlU2NhbGVzKCk7XG4gICAgICAgICAgICAkJC51cGRhdGVTdmdTaXplKCk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgZyBwb3NpdGlvbnNcbiAgICAgICAgICAgICQkLnRyYW5zZm9ybUFsbChvcHRpb25zLndpdGhUcmFuc2l0aW9uRm9yVHJhbnNmb3JtLCB0cmFuc2l0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRHJhdyB3aXRoIG5ldyBzaXplcyAmIHNjYWxlc1xuICAgICAgICAkJC5yZWRyYXcob3B0aW9ucywgdHJhbnNpdGlvbnMpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucmVkcmF3V2l0aG91dFJlc2NhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVkcmF3KHtcbiAgICAgICAgICAgIHdpdGhZOiBmYWxzZSxcbiAgICAgICAgICAgIHdpdGhTdWJjaGFydDogZmFsc2UsXG4gICAgICAgICAgICB3aXRoRXZlbnRSZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIHdpdGhUcmFuc2l0aW9uRm9yQXhpczogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzVGltZVNlcmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmF4aXNfeF90eXBlID09PSAndGltZXNlcmllcyc7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc0NhdGVnb3JpemVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuYXhpc194X3R5cGUuaW5kZXhPZignY2F0ZWdvcicpID49IDA7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc0N1c3RvbVggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgcmV0dXJuICEkJC5pc1RpbWVTZXJpZXMoKSAmJiAoY29uZmlnLmRhdGFfeCB8fCBub3RFbXB0eShjb25maWcuZGF0YV94cykpO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc1RpbWVTZXJpZXNZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuYXhpc195X3R5cGUgPT09ICd0aW1lc2VyaWVzJztcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0VHJhbnNsYXRlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsIHgsIHk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09ICdtYWluJykge1xuICAgICAgICAgICAgeCA9IGFzSGFsZlBpeGVsKCQkLm1hcmdpbi5sZWZ0KTtcbiAgICAgICAgICAgIHkgPSBhc0hhbGZQaXhlbCgkJC5tYXJnaW4udG9wKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09ICdjb250ZXh0Jykge1xuICAgICAgICAgICAgeCA9IGFzSGFsZlBpeGVsKCQkLm1hcmdpbjIubGVmdCk7XG4gICAgICAgICAgICB5ID0gYXNIYWxmUGl4ZWwoJCQubWFyZ2luMi50b3ApO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gJ2xlZ2VuZCcpIHtcbiAgICAgICAgICAgIHggPSAkJC5tYXJnaW4zLmxlZnQ7XG4gICAgICAgICAgICB5ID0gJCQubWFyZ2luMy50b3A7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSAneCcpIHtcbiAgICAgICAgICAgIHggPSAwO1xuICAgICAgICAgICAgeSA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAwIDogJCQuaGVpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gJ3knKSB7XG4gICAgICAgICAgICB4ID0gMDtcbiAgICAgICAgICAgIHkgPSBjb25maWcuYXhpc19yb3RhdGVkID8gJCQuaGVpZ2h0IDogMDtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09ICd5MicpIHtcbiAgICAgICAgICAgIHggPSBjb25maWcuYXhpc19yb3RhdGVkID8gMCA6ICQkLndpZHRoO1xuICAgICAgICAgICAgeSA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAxIDogMDtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09ICdzdWJ4Jykge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgICAgICB5ID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IDAgOiAkJC5oZWlnaHQyO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gJ2FyYycpIHtcbiAgICAgICAgICAgIHggPSAkJC5hcmNXaWR0aCAvIDI7XG4gICAgICAgICAgICB5ID0gJCQuYXJjSGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCIsXCIgKyB5ICsgXCIpXCI7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0aWFsT3BhY2l0eSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLnZhbHVlICE9PSBudWxsICYmIHRoaXMud2l0aG91dEZhZGVJbltkLmlkXSA/IDEgOiAwO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdGlhbE9wYWNpdHlGb3JDaXJjbGUgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC52YWx1ZSAhPT0gbnVsbCAmJiB0aGlzLndpdGhvdXRGYWRlSW5bZC5pZF0gPyB0aGlzLm9wYWNpdHlGb3JDaXJjbGUoZCkgOiAwO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ub3BhY2l0eUZvckNpcmNsZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHZhciBvcGFjaXR5ID0gdGhpcy5jb25maWcucG9pbnRfc2hvdyA/IDEgOiAwO1xuICAgICAgICByZXR1cm4gaXNWYWx1ZShkLnZhbHVlKSA/ICh0aGlzLmlzU2NhdHRlclR5cGUoZCkgPyAwLjUgOiBvcGFjaXR5KSA6IDA7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5vcGFjaXR5Rm9yVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzRGF0YUxhYmVsKCkgPyAxIDogMDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnh4ID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQgPyB0aGlzLngoZC54KSA6IG51bGw7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi54diA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIHZhbHVlID0gZC52YWx1ZTtcbiAgICAgICAgaWYgKCQkLmlzVGltZVNlcmllcygpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICQkLnBhcnNlRGF0ZShkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgkJC5pc0NhdGVnb3JpemVkKCkgJiYgdHlwZW9mIGQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICQkLmNvbmZpZy5heGlzX3hfY2F0ZWdvcmllcy5pbmRleE9mKGQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoJCQueCh2YWx1ZSkpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ueXYgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgeVNjYWxlID0gZC5heGlzICYmIGQuYXhpcyA9PT0gJ3kyJyA/ICQkLnkyIDogJCQueTtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh5U2NhbGUoZC52YWx1ZSkpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uc3VieHggPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZCA/IHRoaXMuc3ViWChkLngpIDogbnVsbDtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udHJhbnNmb3JtTWFpbiA9IGZ1bmN0aW9uICh3aXRoVHJhbnNpdGlvbiwgdHJhbnNpdGlvbnMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIHhBeGlzLCB5QXhpcywgeTJBeGlzO1xuICAgICAgICBpZiAodHJhbnNpdGlvbnMgJiYgdHJhbnNpdGlvbnMuYXhpc1gpIHtcbiAgICAgICAgICAgIHhBeGlzID0gdHJhbnNpdGlvbnMuYXhpc1g7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4QXhpcyAgPSAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5heGlzWCk7XG4gICAgICAgICAgICBpZiAod2l0aFRyYW5zaXRpb24pIHsgeEF4aXMgPSB4QXhpcy50cmFuc2l0aW9uKCk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNpdGlvbnMgJiYgdHJhbnNpdGlvbnMuYXhpc1kpIHtcbiAgICAgICAgICAgIHlBeGlzID0gdHJhbnNpdGlvbnMuYXhpc1k7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5QXhpcyA9ICQkLm1haW4uc2VsZWN0KCcuJyArIENMQVNTLmF4aXNZKTtcbiAgICAgICAgICAgIGlmICh3aXRoVHJhbnNpdGlvbikgeyB5QXhpcyA9IHlBeGlzLnRyYW5zaXRpb24oKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFuc2l0aW9ucyAmJiB0cmFuc2l0aW9ucy5heGlzWTIpIHtcbiAgICAgICAgICAgIHkyQXhpcyA9IHRyYW5zaXRpb25zLmF4aXNZMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHkyQXhpcyA9ICQkLm1haW4uc2VsZWN0KCcuJyArIENMQVNTLmF4aXNZMik7XG4gICAgICAgICAgICBpZiAod2l0aFRyYW5zaXRpb24pIHsgeTJBeGlzID0geTJBeGlzLnRyYW5zaXRpb24oKTsgfVxuICAgICAgICB9XG4gICAgICAgICh3aXRoVHJhbnNpdGlvbiA/ICQkLm1haW4udHJhbnNpdGlvbigpIDogJCQubWFpbikuYXR0cihcInRyYW5zZm9ybVwiLCAkJC5nZXRUcmFuc2xhdGUoJ21haW4nKSk7XG4gICAgICAgIHhBeGlzLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgJCQuZ2V0VHJhbnNsYXRlKCd4JykpO1xuICAgICAgICB5QXhpcy5hdHRyKFwidHJhbnNmb3JtXCIsICQkLmdldFRyYW5zbGF0ZSgneScpKTtcbiAgICAgICAgeTJBeGlzLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgJCQuZ2V0VHJhbnNsYXRlKCd5MicpKTtcbiAgICAgICAgJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuY2hhcnRBcmNzKS5hdHRyKFwidHJhbnNmb3JtXCIsICQkLmdldFRyYW5zbGF0ZSgnYXJjJykpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udHJhbnNmb3JtQWxsID0gZnVuY3Rpb24gKHdpdGhUcmFuc2l0aW9uLCB0cmFuc2l0aW9ucykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICAkJC50cmFuc2Zvcm1NYWluKHdpdGhUcmFuc2l0aW9uLCB0cmFuc2l0aW9ucyk7XG4gICAgICAgIGlmICgkJC5jb25maWcuc3ViY2hhcnRfc2hvdykgeyAkJC50cmFuc2Zvcm1Db250ZXh0KHdpdGhUcmFuc2l0aW9uLCB0cmFuc2l0aW9ucyk7IH1cbiAgICAgICAgaWYgKCQkLmxlZ2VuZCkgeyAkJC50cmFuc2Zvcm1MZWdlbmQod2l0aFRyYW5zaXRpb24pOyB9XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVN2Z1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBicnVzaCA9ICQkLnN2Zy5zZWxlY3QoXCIuYzMtYnJ1c2ggLmJhY2tncm91bmRcIik7XG4gICAgICAgICQkLnN2Zy5hdHRyKCd3aWR0aCcsICQkLmN1cnJlbnRXaWR0aCkuYXR0cignaGVpZ2h0JywgJCQuY3VycmVudEhlaWdodCk7XG4gICAgICAgICQkLnN2Zy5zZWxlY3RBbGwoWycjJyArICQkLmNsaXBJZCwgJyMnICsgJCQuY2xpcElkRm9yR3JpZF0pLnNlbGVjdCgncmVjdCcpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCAkJC53aWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAkJC5oZWlnaHQpO1xuICAgICAgICAkJC5zdmcuc2VsZWN0KCcjJyArICQkLmNsaXBJZEZvclhBeGlzKS5zZWxlY3QoJ3JlY3QnKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAkJC5nZXRYQXhpc0NsaXBYLmJpbmQoJCQpKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCAkJC5nZXRYQXhpc0NsaXBZLmJpbmQoJCQpKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgJCQuZ2V0WEF4aXNDbGlwV2lkdGguYmluZCgkJCkpXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgJCQuZ2V0WEF4aXNDbGlwSGVpZ2h0LmJpbmQoJCQpKTtcbiAgICAgICAgJCQuc3ZnLnNlbGVjdCgnIycgKyAkJC5jbGlwSWRGb3JZQXhpcykuc2VsZWN0KCdyZWN0JylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgJCQuZ2V0WUF4aXNDbGlwWC5iaW5kKCQkKSlcbiAgICAgICAgICAgIC5hdHRyKCd5JywgJCQuZ2V0WUF4aXNDbGlwWS5iaW5kKCQkKSlcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsICQkLmdldFlBeGlzQ2xpcFdpZHRoLmJpbmQoJCQpKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsICQkLmdldFlBeGlzQ2xpcEhlaWdodC5iaW5kKCQkKSk7XG4gICAgICAgICQkLnN2Zy5zZWxlY3QoJyMnICsgJCQuY2xpcElkRm9yU3ViY2hhcnQpLnNlbGVjdCgncmVjdCcpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCAkJC53aWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBicnVzaC5zaXplKCkgPyBicnVzaC5hdHRyKCdoZWlnaHQnKSA6IDApO1xuICAgICAgICAkJC5zdmcuc2VsZWN0KCcuJyArIENMQVNTLnpvb21SZWN0KVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgJCQud2lkdGgpXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgJCQuaGVpZ2h0KTtcbiAgICAgICAgLy8gTUVNTzogcGFyZW50IGRpdidzIGhlaWdodCB3aWxsIGJlIGJpZ2dlciB0aGFuIHN2ZyB3aGVuIDwhRE9DVFlQRSBodG1sPlxuICAgICAgICAkJC5zZWxlY3RDaGFydC5zdHlsZSgnbWF4LWhlaWdodCcsICQkLmN1cnJlbnRIZWlnaHQgKyBcInB4XCIpO1xuICAgIH07XG5cblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZURpbWVuc2lvbiA9IGZ1bmN0aW9uICh3aXRob3V0QXhpcykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICBpZiAoIXdpdGhvdXRBeGlzKSB7XG4gICAgICAgICAgICBpZiAoJCQuY29uZmlnLmF4aXNfcm90YXRlZCkge1xuICAgICAgICAgICAgICAgICQkLmF4ZXMueC5jYWxsKCQkLnhBeGlzKTtcbiAgICAgICAgICAgICAgICAkJC5heGVzLnN1YnguY2FsbCgkJC5zdWJYQXhpcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQkLmF4ZXMueS5jYWxsKCQkLnlBeGlzKTtcbiAgICAgICAgICAgICAgICAkJC5heGVzLnkyLmNhbGwoJCQueTJBeGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkJC51cGRhdGVTaXplcygpO1xuICAgICAgICAkJC51cGRhdGVTY2FsZXMoKTtcbiAgICAgICAgJCQudXBkYXRlU3ZnU2l6ZSgpO1xuICAgICAgICAkJC50cmFuc2Zvcm1BbGwoZmFsc2UpO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5vYnNlcnZlSW5zZXJ0ZWQgPSBmdW5jdGlvbiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIG9ic2VydmVyO1xuICAgICAgICBpZiAodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB3aW5kb3cuY29uc29sZS5lcnJvcihcIk11dGF0aW9uT2JzZXJ2ZXIgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9ic2VydmVyPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgbXV0YXRpb24ucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byB3YWl0IGZvciBjb21wbGV0aW9uIG9mIGxvYWQgYmVjYXVzZSBzaXplIGNhbGN1bGF0aW9uIHJlcXVpcmVzIHRoZSBhY3R1YWwgc2l6ZXMgZGV0ZXJtaW5lZCBhZnRlciB0aGF0IGNvbXBsZXRpb25cbiAgICAgICAgICAgICAgICAgICAgJCQuaW50ZXJ2YWxGb3JPYnNlcnZlSW5zZXJ0ZWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50Tm9kZSB3aWxsIE5PVCBiZSBudWxsIHdoZW4gY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLm5vZGUoKS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoJCQuaW50ZXJ2YWxGb3JPYnNlcnZlSW5zZXJ0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkLnVwZGF0ZURpbWVuc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkJC5icnVzaCkgeyAkJC5icnVzaC51cGRhdGUoKTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkLmNvbmZpZy5vbmluaXQuY2FsbCgkJCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQucmVkcmF3KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFRyYW5zZm9ybTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFVwZGF0ZVhEb21haW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhVcGRhdGVPcmdYRG9tYWluOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoVHJhbnNpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhUcmFuc2l0aW9uRm9yVHJhbnNmb3JtOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aExlZ2VuZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi50cmFuc2l0aW9uKCkuc3R5bGUoJ29wYWNpdHknLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShzZWxlY3Rpb24ubm9kZSgpLCB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmJpbmRSZXNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcblxuICAgICAgICAkJC5yZXNpemVGdW5jdGlvbiA9ICQkLmdlbmVyYXRlUmVzaXplKCk7XG5cbiAgICAgICAgJCQucmVzaXplRnVuY3Rpb24uYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbmZpZy5vbnJlc2l6ZS5jYWxsKCQkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWcucmVzaXplX2F1dG8pIHtcbiAgICAgICAgICAgICQkLnJlc2l6ZUZ1bmN0aW9uLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQkLnJlc2l6ZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KCQkLnJlc2l6ZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkJC5yZXNpemVUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgJCQucmVzaXplVGltZW91dDtcbiAgICAgICAgICAgICAgICAgICAgJCQuYXBpLmZsdXNoKCk7XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgICQkLnJlc2l6ZUZ1bmN0aW9uLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25maWcub25yZXNpemVkLmNhbGwoJCQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAod2luZG93LmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoJ29ucmVzaXplJywgJCQucmVzaXplRnVuY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgJCQucmVzaXplRnVuY3Rpb24sIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIHRoaXMsIGlmIHRoaXMgaXMgYSB2ZXJ5IG9sZCBicm93c2VyXG4gICAgICAgICAgICB2YXIgd3JhcHBlciA9IHdpbmRvdy5vbnJlc2l6ZTtcbiAgICAgICAgICAgIGlmICghd3JhcHBlcikge1xuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdyYXBwZXIgdGhhdCB3aWxsIGNhbGwgYWxsIGNoYXJ0c1xuICAgICAgICAgICAgICAgIHdyYXBwZXIgPSAkJC5nZW5lcmF0ZVJlc2l6ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghd3JhcHBlci5hZGQgfHwgIXdyYXBwZXIucmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYWxyZWFkeSBhIGhhbmRsZXIgcmVnaXN0ZXJlZCwgbWFrZSBzdXJlIHdlIGNhbGwgaXQgdG9vXG4gICAgICAgICAgICAgICAgd3JhcHBlciA9ICQkLmdlbmVyYXRlUmVzaXplKCk7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5hZGQod2luZG93Lm9ucmVzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCB0aGlzIGdyYXBoIHRvIHRoZSB3cmFwcGVyLCB3ZSB3aWxsIGJlIHJlbW92ZWQgaWYgdGhlIHVzZXIgY2FsbHMgZGVzdHJveVxuICAgICAgICAgICAgd3JhcHBlci5hZGQoJCQucmVzaXplRnVuY3Rpb24pO1xuICAgICAgICAgICAgd2luZG93Lm9ucmVzaXplID0gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZW5lcmF0ZVJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc2l6ZUZ1bmN0aW9ucyA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBjYWxsUmVzaXplRnVuY3Rpb25zKCkge1xuICAgICAgICAgICAgcmVzaXplRnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgICAgICAgICBmKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsUmVzaXplRnVuY3Rpb25zLmFkZCA9IGZ1bmN0aW9uIChmKSB7XG4gICAgICAgICAgICByZXNpemVGdW5jdGlvbnMucHVzaChmKTtcbiAgICAgICAgfTtcbiAgICAgICAgY2FsbFJlc2l6ZUZ1bmN0aW9ucy5yZW1vdmUgPSBmdW5jdGlvbiAoZikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNpemVGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzaXplRnVuY3Rpb25zW2ldID09PSBmKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc2l6ZUZ1bmN0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGNhbGxSZXNpemVGdW5jdGlvbnM7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmVuZGFsbCA9IGZ1bmN0aW9uICh0cmFuc2l0aW9uLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgbiA9IDA7XG4gICAgICAgIHRyYW5zaXRpb25cbiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uICgpIHsgKytuOyB9KVxuICAgICAgICAgICAgLmVhY2goXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghLS1uKSB7IGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbiAgICAgICAgICAgIH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2VuZXJhdGVXYWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbnNUb1dhaXQgPSBbXSxcbiAgICAgICAgICAgIGYgPSBmdW5jdGlvbiAodHJhbnNpdGlvbiwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkb25lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbnNUb1dhaXQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudHJhbnNpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb25lID09PSB0cmFuc2l0aW9uc1RvV2FpdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKCk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGYuYWRkID0gZnVuY3Rpb24gKHRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb25zVG9XYWl0LnB1c2godHJhbnNpdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5wYXJzZURhdGUgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBwYXJzZWREYXRlO1xuICAgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHBhcnNlZERhdGUgPSBkYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGFyc2VkRGF0ZSA9ICQkLmRhdGFUaW1lRm9ybWF0KCQkLmNvbmZpZy5kYXRhX3hGb3JtYXQpLnBhcnNlKGRhdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oZGF0ZSkpIHtcbiAgICAgICAgICAgIHBhcnNlZERhdGUgPSBuZXcgRGF0ZSgrZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXJzZWREYXRlIHx8IGlzTmFOKCtwYXJzZWREYXRlKSkge1xuICAgICAgICAgICAgd2luZG93LmNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgeCAnXCIgKyBkYXRlICsgXCInIHRvIERhdGUgb2JqZWN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWREYXRlO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc1RhYlZpc2libGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoaWRkZW47XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuaGlkZGVuICE9PSBcInVuZGVmaW5lZFwiKSB7IC8vIE9wZXJhIDEyLjEwIGFuZCBGaXJlZm94IDE4IGFuZCBsYXRlciBzdXBwb3J0XG4gICAgICAgICAgICBoaWRkZW4gPSBcImhpZGRlblwiO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudC5tb3pIaWRkZW4gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGhpZGRlbiA9IFwibW96SGlkZGVuXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50Lm1zSGlkZGVuICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBoaWRkZW4gPSBcIm1zSGlkZGVuXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50LndlYmtpdEhpZGRlbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgaGlkZGVuID0gXCJ3ZWJraXRIaWRkZW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkb2N1bWVudFtoaWRkZW5dID8gZmFsc2UgOiB0cnVlO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXREZWZhdWx0Q29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICAgICAgYmluZHRvOiAnI2NoYXJ0JyxcbiAgICAgICAgICAgIHN2Z19jbGFzc25hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNpemVfd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNpemVfaGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwYWRkaW5nX2xlZnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBhZGRpbmdfcmlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBhZGRpbmdfdG9wOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwYWRkaW5nX2JvdHRvbTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVzaXplX2F1dG86IHRydWUsXG4gICAgICAgICAgICB6b29tX2VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgem9vbV9leHRlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHpvb21fcHJpdmlsZWdlZDogZmFsc2UsXG4gICAgICAgICAgICB6b29tX3Jlc2NhbGU6IGZhbHNlLFxuICAgICAgICAgICAgem9vbV9vbnpvb206IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgem9vbV9vbnpvb21zdGFydDogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICB6b29tX29uem9vbWVuZDogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICB6b29tX3hfbWluOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB6b29tX3hfbWF4OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbl9icmlnaHRlbjogdHJ1ZSxcbiAgICAgICAgICAgIGludGVyYWN0aW9uX2VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBvbm1vdXNlb3ZlcjogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICBvbm1vdXNlb3V0OiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIG9ucmVzaXplOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIG9ucmVzaXplZDogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICBvbmluaXQ6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgb25yZW5kZXJlZDogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICB0cmFuc2l0aW9uX2R1cmF0aW9uOiAzNTAsXG4gICAgICAgICAgICBkYXRhX3g6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGFfeHM6IHt9LFxuICAgICAgICAgICAgZGF0YV94Rm9ybWF0OiAnJVktJW0tJWQnLFxuICAgICAgICAgICAgZGF0YV94TG9jYWx0aW1lOiB0cnVlLFxuICAgICAgICAgICAgZGF0YV94U29ydDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGFfaWRDb252ZXJ0ZXI6IGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gaWQ7IH0sXG4gICAgICAgICAgICBkYXRhX25hbWVzOiB7fSxcbiAgICAgICAgICAgIGRhdGFfY2xhc3Nlczoge30sXG4gICAgICAgICAgICBkYXRhX2dyb3VwczogW10sXG4gICAgICAgICAgICBkYXRhX2F4ZXM6IHt9LFxuICAgICAgICAgICAgZGF0YV90eXBlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXRhX3R5cGVzOiB7fSxcbiAgICAgICAgICAgIGRhdGFfbGFiZWxzOiB7fSxcbiAgICAgICAgICAgIGRhdGFfb3JkZXI6ICdkZXNjJyxcbiAgICAgICAgICAgIGRhdGFfcmVnaW9uczoge30sXG4gICAgICAgICAgICBkYXRhX2NvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXRhX2NvbG9yczoge30sXG4gICAgICAgICAgICBkYXRhX2hpZGU6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YV9maWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGFfc2VsZWN0aW9uX2VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YV9zZWxlY3Rpb25fZ3JvdXBlZDogZmFsc2UsXG4gICAgICAgICAgICBkYXRhX3NlbGVjdGlvbl9pc3NlbGVjdGFibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sXG4gICAgICAgICAgICBkYXRhX3NlbGVjdGlvbl9tdWx0aXBsZTogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGFfc2VsZWN0aW9uX2RyYWdnYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBkYXRhX29uY2xpY2s6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgZGF0YV9vbm1vdXNlb3ZlcjogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICBkYXRhX29ubW91c2VvdXQ6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgZGF0YV9vbnNlbGVjdGVkOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIGRhdGFfb251bnNlbGVjdGVkOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIGRhdGFfdXJsOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXRhX2hlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGFfanNvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YV9yb3dzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXRhX2NvbHVtbnM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGFfbWltZVR5cGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGFfa2V5czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBmb3Igbm8gcGxvdC1hYmxlIGRhdGEgc3VwcGxpZWQuXG4gICAgICAgICAgICBkYXRhX2VtcHR5X2xhYmVsX3RleHQ6IFwiXCIsXG4gICAgICAgICAgICAvLyBzdWJjaGFydFxuICAgICAgICAgICAgc3ViY2hhcnRfc2hvdzogZmFsc2UsXG4gICAgICAgICAgICBzdWJjaGFydF9zaXplX2hlaWdodDogNjAsXG4gICAgICAgICAgICBzdWJjaGFydF9heGlzX3hfc2hvdzogdHJ1ZSxcbiAgICAgICAgICAgIHN1YmNoYXJ0X29uYnJ1c2g6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgLy8gY29sb3JcbiAgICAgICAgICAgIGNvbG9yX3BhdHRlcm46IFtdLFxuICAgICAgICAgICAgY29sb3JfdGhyZXNob2xkOiB7fSxcbiAgICAgICAgICAgIC8vIGxlZ2VuZFxuICAgICAgICAgICAgbGVnZW5kX3Nob3c6IHRydWUsXG4gICAgICAgICAgICBsZWdlbmRfaGlkZTogZmFsc2UsXG4gICAgICAgICAgICBsZWdlbmRfcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgICAgICAgbGVnZW5kX2luc2V0X2FuY2hvcjogJ3RvcC1sZWZ0JyxcbiAgICAgICAgICAgIGxlZ2VuZF9pbnNldF94OiAxMCxcbiAgICAgICAgICAgIGxlZ2VuZF9pbnNldF95OiAwLFxuICAgICAgICAgICAgbGVnZW5kX2luc2V0X3N0ZXA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxlZ2VuZF9pdGVtX29uY2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxlZ2VuZF9pdGVtX29ubW91c2VvdmVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsZWdlbmRfaXRlbV9vbm1vdXNlb3V0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsZWdlbmRfZXF1YWxseTogZmFsc2UsXG4gICAgICAgICAgICBsZWdlbmRfcGFkZGluZzogMCxcbiAgICAgICAgICAgIGxlZ2VuZF9pdGVtX3RpbGVfd2lkdGg6IDEwLFxuICAgICAgICAgICAgbGVnZW5kX2l0ZW1fdGlsZV9oZWlnaHQ6IDEwLFxuICAgICAgICAgICAgLy8gYXhpc1xuICAgICAgICAgICAgYXhpc19yb3RhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGF4aXNfeF9zaG93OiB0cnVlLFxuICAgICAgICAgICAgYXhpc194X3R5cGU6ICdpbmRleGVkJyxcbiAgICAgICAgICAgIGF4aXNfeF9sb2NhbHRpbWU6IHRydWUsXG4gICAgICAgICAgICBheGlzX3hfY2F0ZWdvcmllczogW10sXG4gICAgICAgICAgICBheGlzX3hfdGlja19jZW50ZXJlZDogZmFsc2UsXG4gICAgICAgICAgICBheGlzX3hfdGlja19mb3JtYXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF4aXNfeF90aWNrX2N1bGxpbmc6IHt9LFxuICAgICAgICAgICAgYXhpc194X3RpY2tfY3VsbGluZ19tYXg6IDEwLFxuICAgICAgICAgICAgYXhpc194X3RpY2tfY291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF4aXNfeF90aWNrX2ZpdDogdHJ1ZSxcbiAgICAgICAgICAgIGF4aXNfeF90aWNrX3ZhbHVlczogbnVsbCxcbiAgICAgICAgICAgIGF4aXNfeF90aWNrX3JvdGF0ZTogMCxcbiAgICAgICAgICAgIGF4aXNfeF90aWNrX291dGVyOiB0cnVlLFxuICAgICAgICAgICAgYXhpc194X3RpY2tfbXVsdGlsaW5lOiB0cnVlLFxuICAgICAgICAgICAgYXhpc194X3RpY2tfd2lkdGg6IG51bGwsXG4gICAgICAgICAgICBheGlzX3hfbWF4OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3hfbWluOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3hfcGFkZGluZzoge30sXG4gICAgICAgICAgICBheGlzX3hfaGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3hfZXh0ZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3hfbGFiZWw6IHt9LFxuICAgICAgICAgICAgYXhpc195X3Nob3c6IHRydWUsXG4gICAgICAgICAgICBheGlzX3lfdHlwZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195X21heDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195X21pbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195X2ludmVydGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGF4aXNfeV9jZW50ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF4aXNfeV9pbm5lcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195X2xhYmVsOiB7fSxcbiAgICAgICAgICAgIGF4aXNfeV90aWNrX2Zvcm1hdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195X3RpY2tfb3V0ZXI6IHRydWUsXG4gICAgICAgICAgICBheGlzX3lfdGlja192YWx1ZXM6IG51bGwsICAgICAgICBcbiAgICAgICAgICAgIGF4aXNfeV90aWNrX3JvdGF0ZTogMCxcbiAgICAgICAgICAgIGF4aXNfeV90aWNrX2NvdW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3lfdGlja190aW1lX3ZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3lfdGlja190aW1lX2ludGVydmFsOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3lfcGFkZGluZzoge30sXG4gICAgICAgICAgICBheGlzX3lfZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195Ml9zaG93OiBmYWxzZSxcbiAgICAgICAgICAgIGF4aXNfeTJfbWF4OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3kyX21pbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195Ml9pbnZlcnRlZDogZmFsc2UsXG4gICAgICAgICAgICBheGlzX3kyX2NlbnRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195Ml9pbm5lcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXhpc195Ml9sYWJlbDoge30sXG4gICAgICAgICAgICBheGlzX3kyX3RpY2tfZm9ybWF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3kyX3RpY2tfb3V0ZXI6IHRydWUsXG4gICAgICAgICAgICBheGlzX3kyX3RpY2tfdmFsdWVzOiBudWxsLFxuICAgICAgICAgICAgYXhpc195Ml90aWNrX2NvdW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBheGlzX3kyX3BhZGRpbmc6IHt9LFxuICAgICAgICAgICAgYXhpc195Ml9kZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBncmlkXG4gICAgICAgICAgICBncmlkX3hfc2hvdzogZmFsc2UsXG4gICAgICAgICAgICBncmlkX3hfdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgZ3JpZF94X2xpbmVzOiBbXSxcbiAgICAgICAgICAgIGdyaWRfeV9zaG93OiBmYWxzZSxcbiAgICAgICAgICAgIC8vIG5vdCB1c2VkXG4gICAgICAgICAgICAvLyBncmlkX3lfdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgZ3JpZF95X2xpbmVzOiBbXSxcbiAgICAgICAgICAgIGdyaWRfeV90aWNrczogMTAsXG4gICAgICAgICAgICBncmlkX2ZvY3VzX3Nob3c6IHRydWUsXG4gICAgICAgICAgICBncmlkX2xpbmVzX2Zyb250OiB0cnVlLFxuICAgICAgICAgICAgLy8gcG9pbnQgLSBwb2ludCBvZiBlYWNoIGRhdGFcbiAgICAgICAgICAgIHBvaW50X3Nob3c6IHRydWUsXG4gICAgICAgICAgICBwb2ludF9yOiAyLjUsXG4gICAgICAgICAgICBwb2ludF9zZW5zaXRpdml0eTogMTAsXG4gICAgICAgICAgICBwb2ludF9mb2N1c19leHBhbmRfZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHBvaW50X2ZvY3VzX2V4cGFuZF9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwb2ludF9zZWxlY3RfcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gbGluZVxuICAgICAgICAgICAgbGluZV9jb25uZWN0TnVsbDogZmFsc2UsXG4gICAgICAgICAgICBsaW5lX3N0ZXBfdHlwZTogJ3N0ZXAnLFxuICAgICAgICAgICAgLy8gYmFyXG4gICAgICAgICAgICBiYXJfd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJhcl93aWR0aF9yYXRpbzogMC42LFxuICAgICAgICAgICAgYmFyX3dpZHRoX21heDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYmFyX3plcm9iYXNlZDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIGFyZWFcbiAgICAgICAgICAgIGFyZWFfemVyb2Jhc2VkOiB0cnVlLFxuICAgICAgICAgICAgYXJlYV9hYm92ZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBwaWVcbiAgICAgICAgICAgIHBpZV9sYWJlbF9zaG93OiB0cnVlLFxuICAgICAgICAgICAgcGllX2xhYmVsX2Zvcm1hdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGllX2xhYmVsX3RocmVzaG9sZDogMC4wNSxcbiAgICAgICAgICAgIHBpZV9sYWJlbF9yYXRpbzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGllX2V4cGFuZDoge30sXG4gICAgICAgICAgICBwaWVfZXhwYW5kX2R1cmF0aW9uOiA1MCxcbiAgICAgICAgICAgIC8vIGdhdWdlXG4gICAgICAgICAgICBnYXVnZV9mdWxsQ2lyY2xlOiBmYWxzZSxcbiAgICAgICAgICAgIGdhdWdlX2xhYmVsX3Nob3c6IHRydWUsXG4gICAgICAgICAgICBnYXVnZV9sYWJlbF9mb3JtYXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdhdWdlX21pbjogMCxcbiAgICAgICAgICAgIGdhdWdlX21heDogMTAwLFxuICAgICAgICAgICAgZ2F1Z2Vfc3RhcnRpbmdBbmdsZTogLTEgKiBNYXRoLlBJLzIsXG4gICAgICAgICAgICBnYXVnZV91bml0czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ2F1Z2Vfd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdhdWdlX2V4cGFuZDoge30sXG4gICAgICAgICAgICBnYXVnZV9leHBhbmRfZHVyYXRpb246IDUwLFxuICAgICAgICAgICAgLy8gZG9udXRcbiAgICAgICAgICAgIGRvbnV0X2xhYmVsX3Nob3c6IHRydWUsXG4gICAgICAgICAgICBkb251dF9sYWJlbF9mb3JtYXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRvbnV0X2xhYmVsX3RocmVzaG9sZDogMC4wNSxcbiAgICAgICAgICAgIGRvbnV0X2xhYmVsX3JhdGlvOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkb251dF93aWR0aDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZG9udXRfdGl0bGU6IFwiXCIsXG4gICAgICAgICAgICBkb251dF9leHBhbmQ6IHt9LFxuICAgICAgICAgICAgZG9udXRfZXhwYW5kX2R1cmF0aW9uOiA1MCxcbiAgICAgICAgICAgIC8vIHNwbGluZVxuICAgICAgICAgICAgc3BsaW5lX2ludGVycG9sYXRpb25fdHlwZTogJ2NhcmRpbmFsJyxcbiAgICAgICAgICAgIC8vIHJlZ2lvbiAtIHJlZ2lvbiB0byBjaGFuZ2Ugc3R5bGVcbiAgICAgICAgICAgIHJlZ2lvbnM6IFtdLFxuICAgICAgICAgICAgLy8gdG9vbHRpcCAtIHNob3cgd2hlbiBtb3VzZW92ZXIgb24gZWFjaCBkYXRhXG4gICAgICAgICAgICB0b29sdGlwX3Nob3c6IHRydWUsXG4gICAgICAgICAgICB0b29sdGlwX2dyb3VwZWQ6IHRydWUsXG4gICAgICAgICAgICB0b29sdGlwX2Zvcm1hdF90aXRsZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdG9vbHRpcF9mb3JtYXRfbmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdG9vbHRpcF9mb3JtYXRfdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvb2x0aXBfcG9zaXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvb2x0aXBfY29udGVudHM6IGZ1bmN0aW9uIChkLCBkZWZhdWx0VGl0bGVGb3JtYXQsIGRlZmF1bHRWYWx1ZUZvcm1hdCwgY29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUb29sdGlwQ29udGVudCA/IHRoaXMuZ2V0VG9vbHRpcENvbnRlbnQoZCwgZGVmYXVsdFRpdGxlRm9ybWF0LCBkZWZhdWx0VmFsdWVGb3JtYXQsIGNvbG9yKSA6ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvb2x0aXBfaW5pdF9zaG93OiBmYWxzZSxcbiAgICAgICAgICAgIHRvb2x0aXBfaW5pdF94OiAwLFxuICAgICAgICAgICAgdG9vbHRpcF9pbml0X3Bvc2l0aW9uOiB7dG9wOiAnMHB4JywgbGVmdDogJzUwcHgnfSxcbiAgICAgICAgICAgIHRvb2x0aXBfb25zaG93OiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIHRvb2x0aXBfb25oaWRlOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIC8vIHRpdGxlXG4gICAgICAgICAgICB0aXRsZV90ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aXRsZV9wYWRkaW5nOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGVfcG9zaXRpb246ICd0b3AtY2VudGVyJyxcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmFkZGl0aW9uYWxDb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmFkZGl0aW9uYWxDb25maWdba2V5XTtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmFkZGl0aW9uYWxDb25maWcgPSB7fTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmxvYWRDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHZhciB0aGlzX2NvbmZpZyA9IHRoaXMuY29uZmlnLCB0YXJnZXQsIGtleXMsIHJlYWQ7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmQoKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5cy5zaGlmdCgpO1xuICAgIC8vICAgICAgICBjb25zb2xlLmxvZyhcImtleSA9PlwiLCBrZXksIFwiLCB0YXJnZXQgPT5cIiwgdGFyZ2V0KTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYgdGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmIGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRba2V5XTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmluZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXNfY29uZmlnKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IGNvbmZpZztcbiAgICAgICAgICAgIGtleXMgPSBrZXkuc3BsaXQoJ18nKTtcbiAgICAgICAgICAgIHJlYWQgPSBmaW5kKCk7XG4gICAgLy8gICAgICAgIGNvbnNvbGUubG9nKFwiQ09ORklHIDogXCIsIGtleSwgcmVhZCk7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHJlYWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpc19jb25maWdba2V5XSA9IHJlYWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRTY2FsZSA9IGZ1bmN0aW9uIChtaW4sIG1heCwgZm9yVGltZXNlcmllcykge1xuICAgICAgICByZXR1cm4gKGZvclRpbWVzZXJpZXMgPyB0aGlzLmQzLnRpbWUuc2NhbGUoKSA6IHRoaXMuZDMuc2NhbGUubGluZWFyKCkpLnJhbmdlKFttaW4sIG1heF0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0WCA9IGZ1bmN0aW9uIChtaW4sIG1heCwgZG9tYWluLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIHNjYWxlID0gJCQuZ2V0U2NhbGUobWluLCBtYXgsICQkLmlzVGltZVNlcmllcygpKSxcbiAgICAgICAgICAgIF9zY2FsZSA9IGRvbWFpbiA/IHNjYWxlLmRvbWFpbihkb21haW4pIDogc2NhbGUsIGtleTtcbiAgICAgICAgLy8gRGVmaW5lIGN1c3RvbWl6ZWQgc2NhbGUgaWYgY2F0ZWdvcml6ZWQgYXhpc1xuICAgICAgICBpZiAoJCQuaXNDYXRlZ29yaXplZCgpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfTtcbiAgICAgICAgICAgIHNjYWxlID0gZnVuY3Rpb24gKGQsIHJhdykge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gX3NjYWxlKGQpICsgb2Zmc2V0KGQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByYXcgPyB2IDogTWF0aC5jZWlsKHYpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjYWxlID0gZnVuY3Rpb24gKGQsIHJhdykge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gX3NjYWxlKGQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByYXcgPyB2IDogTWF0aC5jZWlsKHYpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZWZpbmUgZnVuY3Rpb25zXG4gICAgICAgIGZvciAoa2V5IGluIF9zY2FsZSkge1xuICAgICAgICAgICAgc2NhbGVba2V5XSA9IF9zY2FsZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIHNjYWxlLm9yZ0RvbWFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfc2NhbGUuZG9tYWluKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGRlZmluZSBjdXN0b20gZG9tYWluKCkgZm9yIGNhdGVnb3JpemVkIGF4aXNcbiAgICAgICAgaWYgKCQkLmlzQ2F0ZWdvcml6ZWQoKSkge1xuICAgICAgICAgICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24gKGRvbWFpbikge1xuICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkb21haW4gPSB0aGlzLm9yZ0RvbWFpbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2RvbWFpblswXSwgZG9tYWluWzFdICsgMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9zY2FsZS5kb21haW4oZG9tYWluKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGU7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFkgPSBmdW5jdGlvbiAobWluLCBtYXgsIGRvbWFpbikge1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLmdldFNjYWxlKG1pbiwgbWF4LCB0aGlzLmlzVGltZVNlcmllc1koKSk7XG4gICAgICAgIGlmIChkb21haW4pIHsgc2NhbGUuZG9tYWluKGRvbWFpbik7IH1cbiAgICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0WVNjYWxlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF4aXMuZ2V0SWQoaWQpID09PSAneTInID8gdGhpcy55MiA6IHRoaXMueTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFN1YllTY2FsZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5heGlzLmdldElkKGlkKSA9PT0gJ3kyJyA/IHRoaXMuc3ViWTIgOiB0aGlzLnN1Ylk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVTY2FsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGZvckluaXQgPSAhJCQueDtcbiAgICAgICAgLy8gdXBkYXRlIGVkZ2VzXG4gICAgICAgICQkLnhNaW4gPSBjb25maWcuYXhpc19yb3RhdGVkID8gMSA6IDA7XG4gICAgICAgICQkLnhNYXggPSBjb25maWcuYXhpc19yb3RhdGVkID8gJCQuaGVpZ2h0IDogJCQud2lkdGg7XG4gICAgICAgICQkLnlNaW4gPSBjb25maWcuYXhpc19yb3RhdGVkID8gMCA6ICQkLmhlaWdodDtcbiAgICAgICAgJCQueU1heCA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC53aWR0aCA6IDE7XG4gICAgICAgICQkLnN1YlhNaW4gPSAkJC54TWluO1xuICAgICAgICAkJC5zdWJYTWF4ID0gJCQueE1heDtcbiAgICAgICAgJCQuc3ViWU1pbiA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAwIDogJCQuaGVpZ2h0MjtcbiAgICAgICAgJCQuc3ViWU1heCA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC53aWR0aDIgOiAxO1xuICAgICAgICAvLyB1cGRhdGUgc2NhbGVzXG4gICAgICAgICQkLnggPSAkJC5nZXRYKCQkLnhNaW4sICQkLnhNYXgsIGZvckluaXQgPyB1bmRlZmluZWQgOiAkJC54Lm9yZ0RvbWFpbigpLCBmdW5jdGlvbiAoKSB7IHJldHVybiAkJC54QXhpcy50aWNrT2Zmc2V0KCk7IH0pO1xuICAgICAgICAkJC55ID0gJCQuZ2V0WSgkJC55TWluLCAkJC55TWF4LCBmb3JJbml0ID8gY29uZmlnLmF4aXNfeV9kZWZhdWx0IDogJCQueS5kb21haW4oKSk7XG4gICAgICAgICQkLnkyID0gJCQuZ2V0WSgkJC55TWluLCAkJC55TWF4LCBmb3JJbml0ID8gY29uZmlnLmF4aXNfeTJfZGVmYXVsdCA6ICQkLnkyLmRvbWFpbigpKTtcbiAgICAgICAgJCQuc3ViWCA9ICQkLmdldFgoJCQueE1pbiwgJCQueE1heCwgJCQub3JnWERvbWFpbiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQgJSAxID8gMCA6ICQkLnN1YlhBeGlzLnRpY2tPZmZzZXQoKTsgfSk7XG4gICAgICAgICQkLnN1YlkgPSAkJC5nZXRZKCQkLnN1YllNaW4sICQkLnN1YllNYXgsIGZvckluaXQgPyBjb25maWcuYXhpc195X2RlZmF1bHQgOiAkJC5zdWJZLmRvbWFpbigpKTtcbiAgICAgICAgJCQuc3ViWTIgPSAkJC5nZXRZKCQkLnN1YllNaW4sICQkLnN1YllNYXgsIGZvckluaXQgPyBjb25maWcuYXhpc195Ml9kZWZhdWx0IDogJCQuc3ViWTIuZG9tYWluKCkpO1xuICAgICAgICAvLyB1cGRhdGUgYXhlc1xuICAgICAgICAkJC54QXhpc1RpY2tGb3JtYXQgPSAkJC5heGlzLmdldFhBeGlzVGlja0Zvcm1hdCgpO1xuICAgICAgICAkJC54QXhpc1RpY2tWYWx1ZXMgPSAkJC5heGlzLmdldFhBeGlzVGlja1ZhbHVlcygpO1xuICAgICAgICAkJC55QXhpc1RpY2tWYWx1ZXMgPSAkJC5heGlzLmdldFlBeGlzVGlja1ZhbHVlcygpO1xuICAgICAgICAkJC55MkF4aXNUaWNrVmFsdWVzID0gJCQuYXhpcy5nZXRZMkF4aXNUaWNrVmFsdWVzKCk7XG5cbiAgICAgICAgJCQueEF4aXMgPSAkJC5heGlzLmdldFhBeGlzKCQkLngsICQkLnhPcmllbnQsICQkLnhBeGlzVGlja0Zvcm1hdCwgJCQueEF4aXNUaWNrVmFsdWVzLCBjb25maWcuYXhpc194X3RpY2tfb3V0ZXIpO1xuICAgICAgICAkJC5zdWJYQXhpcyA9ICQkLmF4aXMuZ2V0WEF4aXMoJCQuc3ViWCwgJCQuc3ViWE9yaWVudCwgJCQueEF4aXNUaWNrRm9ybWF0LCAkJC54QXhpc1RpY2tWYWx1ZXMsIGNvbmZpZy5heGlzX3hfdGlja19vdXRlcik7XG4gICAgICAgICQkLnlBeGlzID0gJCQuYXhpcy5nZXRZQXhpcygkJC55LCAkJC55T3JpZW50LCBjb25maWcuYXhpc195X3RpY2tfZm9ybWF0LCAkJC55QXhpc1RpY2tWYWx1ZXMsIGNvbmZpZy5heGlzX3lfdGlja19vdXRlcik7XG4gICAgICAgICQkLnkyQXhpcyA9ICQkLmF4aXMuZ2V0WUF4aXMoJCQueTIsICQkLnkyT3JpZW50LCBjb25maWcuYXhpc195Ml90aWNrX2Zvcm1hdCwgJCQueTJBeGlzVGlja1ZhbHVlcywgY29uZmlnLmF4aXNfeTJfdGlja19vdXRlcik7XG5cbiAgICAgICAgLy8gU2V0IGluaXRpYWxpemVkIHNjYWxlcyB0byBicnVzaCBhbmQgem9vbVxuICAgICAgICBpZiAoIWZvckluaXQpIHtcbiAgICAgICAgICAgIGlmICgkJC5icnVzaCkgeyAkJC5icnVzaC5zY2FsZSgkJC5zdWJYKTsgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy56b29tX2VuYWJsZWQpIHsgJCQuem9vbS5zY2FsZSgkJC54KTsgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBmb3IgYXJjXG4gICAgICAgIGlmICgkJC51cGRhdGVBcmMpIHsgJCQudXBkYXRlQXJjKCk7IH1cbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0WURvbWFpbk1pbiA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGlkcyA9ICQkLm1hcFRvSWRzKHRhcmdldHMpLCB5cyA9ICQkLmdldFZhbHVlc0FzSWRLZXllZCh0YXJnZXRzKSxcbiAgICAgICAgICAgIGosIGssIGJhc2VJZCwgaWRzSW5Hcm91cCwgaWQsIGhhc05lZ2F0aXZlVmFsdWU7XG4gICAgICAgIGlmIChjb25maWcuZGF0YV9ncm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaGFzTmVnYXRpdmVWYWx1ZSA9ICQkLmhhc05lZ2F0aXZlVmFsdWVJblRhcmdldHModGFyZ2V0cyk7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29uZmlnLmRhdGFfZ3JvdXBzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGJhc2VJZFxuICAgICAgICAgICAgICAgIGlkc0luR3JvdXAgPSBjb25maWcuZGF0YV9ncm91cHNbal0uZmlsdGVyKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gaWRzLmluZGV4T2YoaWQpID49IDA7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChpZHNJbkdyb3VwLmxlbmd0aCA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgIGJhc2VJZCA9IGlkc0luR3JvdXBbMF07XG4gICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgbmVnYXRpdmUgdmFsdWVzXG4gICAgICAgICAgICAgICAgaWYgKGhhc05lZ2F0aXZlVmFsdWUgJiYgeXNbYmFzZUlkXSkge1xuICAgICAgICAgICAgICAgICAgICB5c1tiYXNlSWRdLmZvckVhY2goZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlzW2Jhc2VJZF1baV0gPSB2IDwgMCA/IHYgOiAwO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBtaW5cbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgaWRzSW5Hcm91cC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBpZCA9IGlkc0luR3JvdXBba107XG4gICAgICAgICAgICAgICAgICAgIGlmICghIHlzW2lkXSkgeyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICB5c1tpZF0uZm9yRWFjaChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQkLmF4aXMuZ2V0SWQoaWQpID09PSAkJC5heGlzLmdldElkKGJhc2VJZCkgJiYgeXNbYmFzZUlkXSAmJiAhKGhhc05lZ2F0aXZlVmFsdWUgJiYgK3YgPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzW2Jhc2VJZF1baV0gKz0gK3Y7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJCQuZDMubWluKE9iamVjdC5rZXlzKHlzKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gJCQuZDMubWluKHlzW2tleV0pOyB9KSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRZRG9tYWluTWF4ID0gZnVuY3Rpb24gKHRhcmdldHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgaWRzID0gJCQubWFwVG9JZHModGFyZ2V0cyksIHlzID0gJCQuZ2V0VmFsdWVzQXNJZEtleWVkKHRhcmdldHMpLFxuICAgICAgICAgICAgaiwgaywgYmFzZUlkLCBpZHNJbkdyb3VwLCBpZCwgaGFzUG9zaXRpdmVWYWx1ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5kYXRhX2dyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBoYXNQb3NpdGl2ZVZhbHVlID0gJCQuaGFzUG9zaXRpdmVWYWx1ZUluVGFyZ2V0cyh0YXJnZXRzKTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb25maWcuZGF0YV9ncm91cHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgYmFzZUlkXG4gICAgICAgICAgICAgICAgaWRzSW5Hcm91cCA9IGNvbmZpZy5kYXRhX2dyb3Vwc1tqXS5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBpZHMuaW5kZXhPZihpZCkgPj0gMDsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGlkc0luR3JvdXAubGVuZ3RoID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgYmFzZUlkID0gaWRzSW5Hcm91cFswXTtcbiAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBwb3NpdGl2ZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoaGFzUG9zaXRpdmVWYWx1ZSAmJiB5c1tiYXNlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHlzW2Jhc2VJZF0uZm9yRWFjaChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeXNbYmFzZUlkXVtpXSA9IHYgPiAwID8gdiA6IDA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIG1heFxuICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBpZHNJbkdyb3VwLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkID0gaWRzSW5Hcm91cFtrXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgeXNbaWRdKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIHlzW2lkXS5mb3JFYWNoKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCQuYXhpcy5nZXRJZChpZCkgPT09ICQkLmF4aXMuZ2V0SWQoYmFzZUlkKSAmJiB5c1tiYXNlSWRdICYmICEoaGFzUG9zaXRpdmVWYWx1ZSAmJiArdiA8IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXNbYmFzZUlkXVtpXSArPSArdjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkJC5kMy5tYXgoT2JqZWN0LmtleXMoeXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAkJC5kMy5tYXgoeXNba2V5XSk7IH0pKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFlEb21haW4gPSBmdW5jdGlvbiAodGFyZ2V0cywgYXhpc0lkLCB4RG9tYWluKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIHRhcmdldHNCeUF4aXNJZCA9IHRhcmdldHMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7IHJldHVybiAkJC5heGlzLmdldElkKHQuaWQpID09PSBheGlzSWQ7IH0pLFxuICAgICAgICAgICAgeVRhcmdldHMgPSB4RG9tYWluID8gJCQuZmlsdGVyQnlYRG9tYWluKHRhcmdldHNCeUF4aXNJZCwgeERvbWFpbikgOiB0YXJnZXRzQnlBeGlzSWQsXG4gICAgICAgICAgICB5TWluID0gYXhpc0lkID09PSAneTInID8gY29uZmlnLmF4aXNfeTJfbWluIDogY29uZmlnLmF4aXNfeV9taW4sXG4gICAgICAgICAgICB5TWF4ID0gYXhpc0lkID09PSAneTInID8gY29uZmlnLmF4aXNfeTJfbWF4IDogY29uZmlnLmF4aXNfeV9tYXgsXG4gICAgICAgICAgICB5RG9tYWluTWluID0gJCQuZ2V0WURvbWFpbk1pbih5VGFyZ2V0cyksXG4gICAgICAgICAgICB5RG9tYWluTWF4ID0gJCQuZ2V0WURvbWFpbk1heCh5VGFyZ2V0cyksXG4gICAgICAgICAgICBkb21haW4sIGRvbWFpbkxlbmd0aCwgcGFkZGluZywgcGFkZGluZ190b3AsIHBhZGRpbmdfYm90dG9tLFxuICAgICAgICAgICAgY2VudGVyID0gYXhpc0lkID09PSAneTInID8gY29uZmlnLmF4aXNfeTJfY2VudGVyIDogY29uZmlnLmF4aXNfeV9jZW50ZXIsXG4gICAgICAgICAgICB5RG9tYWluQWJzLCBsZW5ndGhzLCBkaWZmLCByYXRpbywgaXNBbGxQb3NpdGl2ZSwgaXNBbGxOZWdhdGl2ZSxcbiAgICAgICAgICAgIGlzWmVyb0Jhc2VkID0gKCQkLmhhc1R5cGUoJ2JhcicsIHlUYXJnZXRzKSAmJiBjb25maWcuYmFyX3plcm9iYXNlZCkgfHwgKCQkLmhhc1R5cGUoJ2FyZWEnLCB5VGFyZ2V0cykgJiYgY29uZmlnLmFyZWFfemVyb2Jhc2VkKSxcbiAgICAgICAgICAgIGlzSW52ZXJ0ZWQgPSBheGlzSWQgPT09ICd5MicgPyBjb25maWcuYXhpc195Ml9pbnZlcnRlZCA6IGNvbmZpZy5heGlzX3lfaW52ZXJ0ZWQsXG4gICAgICAgICAgICBzaG93SG9yaXpvbnRhbERhdGFMYWJlbCA9ICQkLmhhc0RhdGFMYWJlbCgpICYmIGNvbmZpZy5heGlzX3JvdGF0ZWQsXG4gICAgICAgICAgICBzaG93VmVydGljYWxEYXRhTGFiZWwgPSAkJC5oYXNEYXRhTGFiZWwoKSAmJiAhY29uZmlnLmF4aXNfcm90YXRlZDtcblxuICAgICAgICAvLyBNRU1POiBhdm9pZCBpbnZlcnRpbmcgZG9tYWluIHVuZXhwZWN0ZWRseVxuICAgICAgICB5RG9tYWluTWluID0gaXNWYWx1ZSh5TWluKSA/IHlNaW4gOiBpc1ZhbHVlKHlNYXgpID8gKHlEb21haW5NaW4gPCB5TWF4ID8geURvbWFpbk1pbiA6IHlNYXggLSAxMCkgOiB5RG9tYWluTWluO1xuICAgICAgICB5RG9tYWluTWF4ID0gaXNWYWx1ZSh5TWF4KSA/IHlNYXggOiBpc1ZhbHVlKHlNaW4pID8gKHlNaW4gPCB5RG9tYWluTWF4ID8geURvbWFpbk1heCA6IHlNaW4gKyAxMCkgOiB5RG9tYWluTWF4O1xuXG4gICAgICAgIGlmICh5VGFyZ2V0cy5sZW5ndGggPT09IDApIHsgLy8gdXNlIGN1cnJlbnQgZG9tYWluIGlmIHRhcmdldCBvZiBheGlzSWQgaXMgbm9uZVxuICAgICAgICAgICAgcmV0dXJuIGF4aXNJZCA9PT0gJ3kyJyA/ICQkLnkyLmRvbWFpbigpIDogJCQueS5kb21haW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oeURvbWFpbk1pbikpIHsgLy8gc2V0IG1pbmltdW0gdG8gemVybyB3aGVuIG5vdCBudW1iZXJcbiAgICAgICAgICAgIHlEb21haW5NaW4gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05hTih5RG9tYWluTWF4KSkgeyAvLyBzZXQgbWF4aW11bSB0byBoYXZlIHNhbWUgdmFsdWUgYXMgeURvbWFpbk1pblxuICAgICAgICAgICAgeURvbWFpbk1heCA9IHlEb21haW5NaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHlEb21haW5NaW4gPT09IHlEb21haW5NYXgpIHtcbiAgICAgICAgICAgIHlEb21haW5NaW4gPCAwID8geURvbWFpbk1heCA9IDAgOiB5RG9tYWluTWluID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpc0FsbFBvc2l0aXZlID0geURvbWFpbk1pbiA+PSAwICYmIHlEb21haW5NYXggPj0gMDtcbiAgICAgICAgaXNBbGxOZWdhdGl2ZSA9IHlEb21haW5NaW4gPD0gMCAmJiB5RG9tYWluTWF4IDw9IDA7XG5cbiAgICAgICAgLy8gQ2FuY2VsIHplcm9iYXNlZCBpZiBheGlzXypfbWluIC8gYXhpc18qX21heCBzcGVjaWZpZWRcbiAgICAgICAgaWYgKChpc1ZhbHVlKHlNaW4pICYmIGlzQWxsUG9zaXRpdmUpIHx8IChpc1ZhbHVlKHlNYXgpICYmIGlzQWxsTmVnYXRpdmUpKSB7XG4gICAgICAgICAgICBpc1plcm9CYXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFyL0FyZWEgY2hhcnQgc2hvdWxkIGJlIDAtYmFzZWQgaWYgYWxsIHBvc2l0aXZlfG5lZ2F0aXZlXG4gICAgICAgIGlmIChpc1plcm9CYXNlZCkge1xuICAgICAgICAgICAgaWYgKGlzQWxsUG9zaXRpdmUpIHsgeURvbWFpbk1pbiA9IDA7IH1cbiAgICAgICAgICAgIGlmIChpc0FsbE5lZ2F0aXZlKSB7IHlEb21haW5NYXggPSAwOyB9XG4gICAgICAgIH1cblxuICAgICAgICBkb21haW5MZW5ndGggPSBNYXRoLmFicyh5RG9tYWluTWF4IC0geURvbWFpbk1pbik7XG4gICAgICAgIHBhZGRpbmcgPSBwYWRkaW5nX3RvcCA9IHBhZGRpbmdfYm90dG9tID0gZG9tYWluTGVuZ3RoICogMC4xO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2VudGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgeURvbWFpbkFicyA9IE1hdGgubWF4KE1hdGguYWJzKHlEb21haW5NaW4pLCBNYXRoLmFicyh5RG9tYWluTWF4KSk7XG4gICAgICAgICAgICB5RG9tYWluTWF4ID0gY2VudGVyICsgeURvbWFpbkFicztcbiAgICAgICAgICAgIHlEb21haW5NaW4gPSBjZW50ZXIgLSB5RG9tYWluQWJzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCBwYWRkaW5nIGZvciBkYXRhIGxhYmVsXG4gICAgICAgIGlmIChzaG93SG9yaXpvbnRhbERhdGFMYWJlbCkge1xuICAgICAgICAgICAgbGVuZ3RocyA9ICQkLmdldERhdGFMYWJlbExlbmd0aCh5RG9tYWluTWluLCB5RG9tYWluTWF4LCAnd2lkdGgnKTtcbiAgICAgICAgICAgIGRpZmYgPSBkaWZmRG9tYWluKCQkLnkucmFuZ2UoKSk7XG4gICAgICAgICAgICByYXRpbyA9IFtsZW5ndGhzWzBdIC8gZGlmZiwgbGVuZ3Roc1sxXSAvIGRpZmZdO1xuICAgICAgICAgICAgcGFkZGluZ190b3AgKz0gZG9tYWluTGVuZ3RoICogKHJhdGlvWzFdIC8gKDEgLSByYXRpb1swXSAtIHJhdGlvWzFdKSk7XG4gICAgICAgICAgICBwYWRkaW5nX2JvdHRvbSArPSBkb21haW5MZW5ndGggKiAocmF0aW9bMF0gLyAoMSAtIHJhdGlvWzBdIC0gcmF0aW9bMV0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaG93VmVydGljYWxEYXRhTGFiZWwpIHtcbiAgICAgICAgICAgIGxlbmd0aHMgPSAkJC5nZXREYXRhTGFiZWxMZW5ndGgoeURvbWFpbk1pbiwgeURvbWFpbk1heCwgJ2hlaWdodCcpO1xuICAgICAgICAgICAgcGFkZGluZ190b3AgKz0gJCQuYXhpcy5jb252ZXJ0UGl4ZWxzVG9BeGlzUGFkZGluZyhsZW5ndGhzWzFdLCBkb21haW5MZW5ndGgpO1xuICAgICAgICAgICAgcGFkZGluZ19ib3R0b20gKz0gJCQuYXhpcy5jb252ZXJ0UGl4ZWxzVG9BeGlzUGFkZGluZyhsZW5ndGhzWzBdLCBkb21haW5MZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChheGlzSWQgPT09ICd5JyAmJiBub3RFbXB0eShjb25maWcuYXhpc195X3BhZGRpbmcpKSB7XG4gICAgICAgICAgICBwYWRkaW5nX3RvcCA9ICQkLmF4aXMuZ2V0UGFkZGluZyhjb25maWcuYXhpc195X3BhZGRpbmcsICd0b3AnLCBwYWRkaW5nX3RvcCwgZG9tYWluTGVuZ3RoKTtcbiAgICAgICAgICAgIHBhZGRpbmdfYm90dG9tID0gJCQuYXhpcy5nZXRQYWRkaW5nKGNvbmZpZy5heGlzX3lfcGFkZGluZywgJ2JvdHRvbScsIHBhZGRpbmdfYm90dG9tLCBkb21haW5MZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChheGlzSWQgPT09ICd5MicgJiYgbm90RW1wdHkoY29uZmlnLmF4aXNfeTJfcGFkZGluZykpIHtcbiAgICAgICAgICAgIHBhZGRpbmdfdG9wID0gJCQuYXhpcy5nZXRQYWRkaW5nKGNvbmZpZy5heGlzX3kyX3BhZGRpbmcsICd0b3AnLCBwYWRkaW5nX3RvcCwgZG9tYWluTGVuZ3RoKTtcbiAgICAgICAgICAgIHBhZGRpbmdfYm90dG9tID0gJCQuYXhpcy5nZXRQYWRkaW5nKGNvbmZpZy5heGlzX3kyX3BhZGRpbmcsICdib3R0b20nLCBwYWRkaW5nX2JvdHRvbSwgZG9tYWluTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCYXIvQXJlYSBjaGFydCBzaG91bGQgYmUgMC1iYXNlZCBpZiBhbGwgcG9zaXRpdmV8bmVnYXRpdmVcbiAgICAgICAgaWYgKGlzWmVyb0Jhc2VkKSB7XG4gICAgICAgICAgICBpZiAoaXNBbGxQb3NpdGl2ZSkgeyBwYWRkaW5nX2JvdHRvbSA9IHlEb21haW5NaW47IH1cbiAgICAgICAgICAgIGlmIChpc0FsbE5lZ2F0aXZlKSB7IHBhZGRpbmdfdG9wID0gLXlEb21haW5NYXg7IH1cbiAgICAgICAgfVxuICAgICAgICBkb21haW4gPSBbeURvbWFpbk1pbiAtIHBhZGRpbmdfYm90dG9tLCB5RG9tYWluTWF4ICsgcGFkZGluZ190b3BdO1xuICAgICAgICByZXR1cm4gaXNJbnZlcnRlZCA/IGRvbWFpbi5yZXZlcnNlKCkgOiBkb21haW47XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRYRG9tYWluTWluID0gZnVuY3Rpb24gKHRhcmdldHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICByZXR1cm4gaXNEZWZpbmVkKGNvbmZpZy5heGlzX3hfbWluKSA/XG4gICAgICAgICAgICAoJCQuaXNUaW1lU2VyaWVzKCkgPyB0aGlzLnBhcnNlRGF0ZShjb25maWcuYXhpc194X21pbikgOiBjb25maWcuYXhpc194X21pbikgOlxuICAgICAgICAkJC5kMy5taW4odGFyZ2V0cywgZnVuY3Rpb24gKHQpIHsgcmV0dXJuICQkLmQzLm1pbih0LnZhbHVlcywgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYueDsgfSk7IH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0WERvbWFpbk1heCA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZChjb25maWcuYXhpc194X21heCkgP1xuICAgICAgICAgICAgKCQkLmlzVGltZVNlcmllcygpID8gdGhpcy5wYXJzZURhdGUoY29uZmlnLmF4aXNfeF9tYXgpIDogY29uZmlnLmF4aXNfeF9tYXgpIDpcbiAgICAgICAgJCQuZDMubWF4KHRhcmdldHMsIGZ1bmN0aW9uICh0KSB7IHJldHVybiAkJC5kMy5tYXgodC52YWx1ZXMsIGZ1bmN0aW9uICh2KSB7IHJldHVybiB2Lng7IH0pOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFhEb21haW5QYWRkaW5nID0gZnVuY3Rpb24gKGRvbWFpbikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBkaWZmID0gZG9tYWluWzFdIC0gZG9tYWluWzBdLFxuICAgICAgICAgICAgbWF4RGF0YUNvdW50LCBwYWRkaW5nLCBwYWRkaW5nTGVmdCwgcGFkZGluZ1JpZ2h0O1xuICAgICAgICBpZiAoJCQuaXNDYXRlZ29yaXplZCgpKSB7XG4gICAgICAgICAgICBwYWRkaW5nID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICgkJC5oYXNUeXBlKCdiYXInKSkge1xuICAgICAgICAgICAgbWF4RGF0YUNvdW50ID0gJCQuZ2V0TWF4RGF0YUNvdW50KCk7XG4gICAgICAgICAgICBwYWRkaW5nID0gbWF4RGF0YUNvdW50ID4gMSA/IChkaWZmIC8gKG1heERhdGFDb3VudCAtIDEpKSAvIDIgOiAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWRkaW5nID0gZGlmZiAqIDAuMDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuYXhpc194X3BhZGRpbmcgPT09ICdvYmplY3QnICYmIG5vdEVtcHR5KGNvbmZpZy5heGlzX3hfcGFkZGluZykpIHtcbiAgICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gaXNWYWx1ZShjb25maWcuYXhpc194X3BhZGRpbmcubGVmdCkgPyBjb25maWcuYXhpc194X3BhZGRpbmcubGVmdCA6IHBhZGRpbmc7XG4gICAgICAgICAgICBwYWRkaW5nUmlnaHQgPSBpc1ZhbHVlKGNvbmZpZy5heGlzX3hfcGFkZGluZy5yaWdodCkgPyBjb25maWcuYXhpc194X3BhZGRpbmcucmlnaHQgOiBwYWRkaW5nO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcuYXhpc194X3BhZGRpbmcgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBwYWRkaW5nTGVmdCA9IHBhZGRpbmdSaWdodCA9IGNvbmZpZy5heGlzX3hfcGFkZGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gcGFkZGluZ1JpZ2h0ID0gcGFkZGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge2xlZnQ6IHBhZGRpbmdMZWZ0LCByaWdodDogcGFkZGluZ1JpZ2h0fTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFhEb21haW4gPSBmdW5jdGlvbiAodGFyZ2V0cykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgeERvbWFpbiA9IFskJC5nZXRYRG9tYWluTWluKHRhcmdldHMpLCAkJC5nZXRYRG9tYWluTWF4KHRhcmdldHMpXSxcbiAgICAgICAgICAgIGZpcnN0WCA9IHhEb21haW5bMF0sIGxhc3RYID0geERvbWFpblsxXSxcbiAgICAgICAgICAgIHBhZGRpbmcgPSAkJC5nZXRYRG9tYWluUGFkZGluZyh4RG9tYWluKSxcbiAgICAgICAgICAgIG1pbiA9IDAsIG1heCA9IDA7XG4gICAgICAgIC8vIHNob3cgY2VudGVyIG9mIHggZG9tYWluIGlmIG1pbiBhbmQgbWF4IGFyZSB0aGUgc2FtZVxuICAgICAgICBpZiAoKGZpcnN0WCAtIGxhc3RYKSA9PT0gMCAmJiAhJCQuaXNDYXRlZ29yaXplZCgpKSB7XG4gICAgICAgICAgICBpZiAoJCQuaXNUaW1lU2VyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFggPSBuZXcgRGF0ZShmaXJzdFguZ2V0VGltZSgpICogMC41KTtcbiAgICAgICAgICAgICAgICBsYXN0WCA9IG5ldyBEYXRlKGxhc3RYLmdldFRpbWUoKSAqIDEuNSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpcnN0WCA9IGZpcnN0WCA9PT0gMCA/IDEgOiAoZmlyc3RYICogMC41KTtcbiAgICAgICAgICAgICAgICBsYXN0WCA9IGxhc3RYID09PSAwID8gLTEgOiAobGFzdFggKiAxLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdFggfHwgZmlyc3RYID09PSAwKSB7XG4gICAgICAgICAgICBtaW4gPSAkJC5pc1RpbWVTZXJpZXMoKSA/IG5ldyBEYXRlKGZpcnN0WC5nZXRUaW1lKCkgLSBwYWRkaW5nLmxlZnQpIDogZmlyc3RYIC0gcGFkZGluZy5sZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0WCB8fCBsYXN0WCA9PT0gMCkge1xuICAgICAgICAgICAgbWF4ID0gJCQuaXNUaW1lU2VyaWVzKCkgPyBuZXcgRGF0ZShsYXN0WC5nZXRUaW1lKCkgKyBwYWRkaW5nLnJpZ2h0KSA6IGxhc3RYICsgcGFkZGluZy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW21pbiwgbWF4XTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVhEb21haW4gPSBmdW5jdGlvbiAodGFyZ2V0cywgd2l0aFVwZGF0ZVhEb21haW4sIHdpdGhVcGRhdGVPcmdYRG9tYWluLCB3aXRoVHJpbSwgZG9tYWluKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcblxuICAgICAgICBpZiAod2l0aFVwZGF0ZU9yZ1hEb21haW4pIHtcbiAgICAgICAgICAgICQkLnguZG9tYWluKGRvbWFpbiA/IGRvbWFpbiA6ICQkLmQzLmV4dGVudCgkJC5nZXRYRG9tYWluKHRhcmdldHMpKSk7XG4gICAgICAgICAgICAkJC5vcmdYRG9tYWluID0gJCQueC5kb21haW4oKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuem9vbV9lbmFibGVkKSB7ICQkLnpvb20uc2NhbGUoJCQueCkudXBkYXRlU2NhbGVFeHRlbnQoKTsgfVxuICAgICAgICAgICAgJCQuc3ViWC5kb21haW4oJCQueC5kb21haW4oKSk7XG4gICAgICAgICAgICBpZiAoJCQuYnJ1c2gpIHsgJCQuYnJ1c2guc2NhbGUoJCQuc3ViWCk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2l0aFVwZGF0ZVhEb21haW4pIHtcbiAgICAgICAgICAgICQkLnguZG9tYWluKGRvbWFpbiA/IGRvbWFpbiA6ICghJCQuYnJ1c2ggfHwgJCQuYnJ1c2guZW1wdHkoKSkgPyAkJC5vcmdYRG9tYWluIDogJCQuYnJ1c2guZXh0ZW50KCkpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy56b29tX2VuYWJsZWQpIHsgJCQuem9vbS5zY2FsZSgkJC54KS51cGRhdGVTY2FsZUV4dGVudCgpOyB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmltIGRvbWFpbiB3aGVuIHRvbyBiaWcgYnkgem9vbSBtb3VzZW1vdmUgZXZlbnRcbiAgICAgICAgaWYgKHdpdGhUcmltKSB7ICQkLnguZG9tYWluKCQkLnRyaW1YRG9tYWluKCQkLngub3JnRG9tYWluKCkpKTsgfVxuXG4gICAgICAgIHJldHVybiAkJC54LmRvbWFpbigpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udHJpbVhEb21haW4gPSBmdW5jdGlvbiAoZG9tYWluKSB7XG4gICAgICAgIHZhciB6b29tRG9tYWluID0gdGhpcy5nZXRab29tRG9tYWluKCksXG4gICAgICAgICAgICBtaW4gPSB6b29tRG9tYWluWzBdLCBtYXggPSB6b29tRG9tYWluWzFdO1xuICAgICAgICBpZiAoZG9tYWluWzBdIDw9IG1pbikge1xuICAgICAgICAgICAgZG9tYWluWzFdID0gK2RvbWFpblsxXSArIChtaW4gLSBkb21haW5bMF0pO1xuICAgICAgICAgICAgZG9tYWluWzBdID0gbWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggPD0gZG9tYWluWzFdKSB7XG4gICAgICAgICAgICBkb21haW5bMF0gPSArZG9tYWluWzBdIC0gKGRvbWFpblsxXSAtIG1heCk7XG4gICAgICAgICAgICBkb21haW5bMV0gPSBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvbWFpbjtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNYID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIHJldHVybiAoY29uZmlnLmRhdGFfeCAmJiBrZXkgPT09IGNvbmZpZy5kYXRhX3gpIHx8IChub3RFbXB0eShjb25maWcuZGF0YV94cykgJiYgaGFzVmFsdWUoY29uZmlnLmRhdGFfeHMsIGtleSkpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNOb3RYID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNYKGtleSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRYS2V5ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5kYXRhX3ggPyBjb25maWcuZGF0YV94IDogbm90RW1wdHkoY29uZmlnLmRhdGFfeHMpID8gY29uZmlnLmRhdGFfeHNbaWRdIDogbnVsbDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFhWYWx1ZXNPZlhLZXkgPSBmdW5jdGlvbiAoa2V5LCB0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICB4VmFsdWVzLCBpZHMgPSB0YXJnZXRzICYmIG5vdEVtcHR5KHRhcmdldHMpID8gJCQubWFwVG9JZHModGFyZ2V0cykgOiBbXTtcbiAgICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICBpZiAoJCQuZ2V0WEtleShpZCkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgIHhWYWx1ZXMgPSAkJC5kYXRhLnhzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB4VmFsdWVzO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0SW5kZXhCeVggPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgZGF0YSA9ICQkLmZpbHRlckJ5WCgkJC5kYXRhLnRhcmdldHMsIHgpO1xuICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGggPyBkYXRhWzBdLmluZGV4IDogbnVsbDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFhWYWx1ZSA9IGZ1bmN0aW9uIChpZCwgaSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gaWQgaW4gJCQuZGF0YS54cyAmJiAkJC5kYXRhLnhzW2lkXSAmJiBpc1ZhbHVlKCQkLmRhdGEueHNbaWRdW2ldKSA/ICQkLmRhdGEueHNbaWRdW2ldIDogaTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldE90aGVyVGFyZ2V0WHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBpZHNGb3JYID0gT2JqZWN0LmtleXMoJCQuZGF0YS54cyk7XG4gICAgICAgIHJldHVybiBpZHNGb3JYLmxlbmd0aCA/ICQkLmRhdGEueHNbaWRzRm9yWFswXV0gOiBudWxsO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0T3RoZXJUYXJnZXRYID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciB4cyA9IHRoaXMuZ2V0T3RoZXJUYXJnZXRYcygpO1xuICAgICAgICByZXR1cm4geHMgJiYgaW5kZXggPCB4cy5sZW5ndGggPyB4c1tpbmRleF0gOiBudWxsO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uYWRkWHMgPSBmdW5jdGlvbiAoeHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgT2JqZWN0LmtleXMoeHMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAkJC5jb25maWcuZGF0YV94c1tpZF0gPSB4c1tpZF07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaGFzTXVsdGlwbGVYID0gZnVuY3Rpb24gKHhzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmQzLnNldChPYmplY3Qua2V5cyh4cykubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4geHNbaWRdOyB9KSkuc2l6ZSgpID4gMTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzTXVsdGlwbGVYID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbm90RW1wdHkodGhpcy5jb25maWcuZGF0YV94cykgfHwgIXRoaXMuY29uZmlnLmRhdGFfeFNvcnQgfHwgdGhpcy5oYXNUeXBlKCdzY2F0dGVyJyk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5hZGROYW1lID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgbmFtZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIG5hbWUgPSAkJC5jb25maWcuZGF0YV9uYW1lc1tkYXRhLmlkXTtcbiAgICAgICAgICAgIGRhdGEubmFtZSA9IG5hbWUgIT09IHVuZGVmaW5lZCA/IG5hbWUgOiBkYXRhLmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0VmFsdWVPbkluZGV4ID0gZnVuY3Rpb24gKHZhbHVlcywgaW5kZXgpIHtcbiAgICAgICAgdmFyIHZhbHVlT25JbmRleCA9IHZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYuaW5kZXggPT09IGluZGV4OyB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlT25JbmRleC5sZW5ndGggPyB2YWx1ZU9uSW5kZXhbMF0gOiBudWxsO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlVGFyZ2V0WCA9IGZ1bmN0aW9uICh0YXJnZXRzLCB4KSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgdC52YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgICAgICAgIHYueCA9ICQkLmdlbmVyYXRlVGFyZ2V0WCh4W2ldLCB0LmlkLCBpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJCQuZGF0YS54c1t0LmlkXSA9IHg7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlVGFyZ2V0WHMgPSBmdW5jdGlvbiAodGFyZ2V0cywgeHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBpZiAoeHNbdC5pZF0pIHtcbiAgICAgICAgICAgICAgICAkJC51cGRhdGVUYXJnZXRYKFt0XSwgeHNbdC5pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdlbmVyYXRlVGFyZ2V0WCA9IGZ1bmN0aW9uIChyYXdYLCBpZCwgaW5kZXgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgeDtcbiAgICAgICAgaWYgKCQkLmlzVGltZVNlcmllcygpKSB7XG4gICAgICAgICAgICB4ID0gcmF3WCA/ICQkLnBhcnNlRGF0ZShyYXdYKSA6ICQkLnBhcnNlRGF0ZSgkJC5nZXRYVmFsdWUoaWQsIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJCQuaXNDdXN0b21YKCkgJiYgISQkLmlzQ2F0ZWdvcml6ZWQoKSkge1xuICAgICAgICAgICAgeCA9IGlzVmFsdWUocmF3WCkgPyArcmF3WCA6ICQkLmdldFhWYWx1ZShpZCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY2xvbmVUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZCA6IHRhcmdldC5pZCxcbiAgICAgICAgICAgIGlkX29yZyA6IHRhcmdldC5pZF9vcmcsXG4gICAgICAgICAgICB2YWx1ZXMgOiB0YXJnZXQudmFsdWVzLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7eDogZC54LCB2YWx1ZTogZC52YWx1ZSwgaWQ6IGQuaWR9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVhzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICBpZiAoJCQuZGF0YS50YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgJCQueHMgPSBbXTtcbiAgICAgICAgICAgICQkLmRhdGEudGFyZ2V0c1swXS52YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgICQkLnhzW3YuaW5kZXhdID0gdi54O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFByZXZYID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLnhzW2kgLSAxXTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB4ICE9PSAndW5kZWZpbmVkJyA/IHggOiBudWxsO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0TmV4dFggPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICB2YXIgeCA9IHRoaXMueHNbaSArIDFdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHggIT09ICd1bmRlZmluZWQnID8geCA6IG51bGw7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRNYXhEYXRhQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHJldHVybiAkJC5kMy5tYXgoJCQuZGF0YS50YXJnZXRzLCBmdW5jdGlvbiAodCkgeyByZXR1cm4gdC52YWx1ZXMubGVuZ3RoOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldE1heERhdGFDb3VudFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0YXJnZXRzLmxlbmd0aCwgbWF4ID0gMCwgbWF4VGFyZ2V0O1xuICAgICAgICBpZiAobGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQudmFsdWVzLmxlbmd0aCA+IG1heCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhUYXJnZXQgPSB0O1xuICAgICAgICAgICAgICAgICAgICBtYXggPSB0LnZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXhUYXJnZXQgPSBsZW5ndGggPyB0YXJnZXRzWzBdIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4VGFyZ2V0O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0RWRnZVggPSBmdW5jdGlvbiAodGFyZ2V0cykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gIXRhcmdldHMubGVuZ3RoID8gWzAsIDBdIDogW1xuICAgICAgICAgICAgJCQuZDMubWluKHRhcmdldHMsIGZ1bmN0aW9uICh0KSB7IHJldHVybiB0LnZhbHVlc1swXS54OyB9KSxcbiAgICAgICAgICAgICQkLmQzLm1heCh0YXJnZXRzLCBmdW5jdGlvbiAodCkgeyByZXR1cm4gdC52YWx1ZXNbdC52YWx1ZXMubGVuZ3RoIC0gMV0ueDsgfSlcbiAgICAgICAgXTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLm1hcFRvSWRzID0gZnVuY3Rpb24gKHRhcmdldHMpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldHMubWFwKGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmlkOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLm1hcFRvVGFyZ2V0SWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gaWRzID8gW10uY29uY2F0KGlkcykgOiAkJC5tYXBUb0lkcygkJC5kYXRhLnRhcmdldHMpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaGFzVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldHMsIGlkKSB7XG4gICAgICAgIHZhciBpZHMgPSB0aGlzLm1hcFRvSWRzKHRhcmdldHMpLCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaWRzW2ldID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzVGFyZ2V0VG9TaG93ID0gZnVuY3Rpb24gKHRhcmdldElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGRlblRhcmdldElkcy5pbmRleE9mKHRhcmdldElkKSA8IDA7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc0xlZ2VuZFRvU2hvdyA9IGZ1bmN0aW9uICh0YXJnZXRJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaWRkZW5MZWdlbmRJZHMuaW5kZXhPZih0YXJnZXRJZCkgPCAwO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZmlsdGVyVGFyZ2V0c1RvU2hvdyA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0YXJnZXRzLmZpbHRlcihmdW5jdGlvbiAodCkgeyByZXR1cm4gJCQuaXNUYXJnZXRUb1Nob3codC5pZCk7IH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ubWFwVGFyZ2V0c1RvVW5pcXVlWHMgPSBmdW5jdGlvbiAodGFyZ2V0cykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICB2YXIgeHMgPSAkJC5kMy5zZXQoJCQuZDMubWVyZ2UodGFyZ2V0cy5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQudmFsdWVzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gK3YueDsgfSk7IH0pKSkudmFsdWVzKCk7XG4gICAgICAgIHhzID0gJCQuaXNUaW1lU2VyaWVzKCkgPyB4cy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG5ldyBEYXRlKCt4KTsgfSkgOiB4cy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuICt4OyB9KTtcbiAgICAgICAgcmV0dXJuIHhzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmFkZEhpZGRlblRhcmdldElkcyA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5UYXJnZXRJZHMgPSB0aGlzLmhpZGRlblRhcmdldElkcy5jb25jYXQodGFyZ2V0SWRzKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlbW92ZUhpZGRlblRhcmdldElkcyA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5UYXJnZXRJZHMgPSB0aGlzLmhpZGRlblRhcmdldElkcy5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7IHJldHVybiB0YXJnZXRJZHMuaW5kZXhPZihpZCkgPCAwOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmFkZEhpZGRlbkxlZ2VuZElkcyA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5MZWdlbmRJZHMgPSB0aGlzLmhpZGRlbkxlZ2VuZElkcy5jb25jYXQodGFyZ2V0SWRzKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlbW92ZUhpZGRlbkxlZ2VuZElkcyA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgdGhpcy5oaWRkZW5MZWdlbmRJZHMgPSB0aGlzLmhpZGRlbkxlZ2VuZElkcy5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7IHJldHVybiB0YXJnZXRJZHMuaW5kZXhPZihpZCkgPCAwOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFZhbHVlc0FzSWRLZXllZCA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciB5cyA9IHt9O1xuICAgICAgICB0YXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHlzW3QuaWRdID0gW107XG4gICAgICAgICAgICB0LnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgeXNbdC5pZF0ucHVzaCh2LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHlzO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY2hlY2tWYWx1ZUluVGFyZ2V0cyA9IGZ1bmN0aW9uICh0YXJnZXRzLCBjaGVja2VyKSB7XG4gICAgICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyh0YXJnZXRzKSwgaSwgaiwgdmFsdWVzO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZXMgPSB0YXJnZXRzW2lkc1tpXV0udmFsdWVzO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VyKHZhbHVlc1tqXS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmhhc05lZ2F0aXZlVmFsdWVJblRhcmdldHMgPSBmdW5jdGlvbiAodGFyZ2V0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1ZhbHVlSW5UYXJnZXRzKHRhcmdldHMsIGZ1bmN0aW9uICh2KSB7IHJldHVybiB2IDwgMDsgfSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5oYXNQb3NpdGl2ZVZhbHVlSW5UYXJnZXRzID0gZnVuY3Rpb24gKHRhcmdldHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tWYWx1ZUluVGFyZ2V0cyh0YXJnZXRzLCBmdW5jdGlvbiAodikgeyByZXR1cm4gdiA+IDA7IH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNPcmRlckRlc2MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIHR5cGVvZihjb25maWcuZGF0YV9vcmRlcikgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5kYXRhX29yZGVyLnRvTG93ZXJDYXNlKCkgPT09ICdkZXNjJztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzT3JkZXJBc2MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIHR5cGVvZihjb25maWcuZGF0YV9vcmRlcikgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5kYXRhX29yZGVyLnRvTG93ZXJDYXNlKCkgPT09ICdhc2MnO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ub3JkZXJUYXJnZXRzID0gZnVuY3Rpb24gKHRhcmdldHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCBvcmRlckFzYyA9ICQkLmlzT3JkZXJBc2MoKSwgb3JkZXJEZXNjID0gJCQuaXNPcmRlckRlc2MoKTtcbiAgICAgICAgaWYgKG9yZGVyQXNjIHx8IG9yZGVyRGVzYykge1xuICAgICAgICAgICAgdGFyZ2V0cy5zb3J0KGZ1bmN0aW9uICh0MSwgdDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVkdWNlciA9IGZ1bmN0aW9uIChwLCBjKSB7IHJldHVybiBwICsgTWF0aC5hYnMoYy52YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgdmFyIHQxU3VtID0gdDEudmFsdWVzLnJlZHVjZShyZWR1Y2VyLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgdDJTdW0gPSB0Mi52YWx1ZXMucmVkdWNlKHJlZHVjZXIsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmRlckFzYyA/IHQyU3VtIC0gdDFTdW0gOiB0MVN1bSAtIHQyU3VtO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjb25maWcuZGF0YV9vcmRlcikpIHtcbiAgICAgICAgICAgIHRhcmdldHMuc29ydChjb25maWcuZGF0YV9vcmRlcik7XG4gICAgICAgIH0gLy8gVE9ETzogYWNjZXB0IG5hbWUgYXJyYXkgZm9yIG9yZGVyXG4gICAgICAgIHJldHVybiB0YXJnZXRzO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZmlsdGVyQnlYID0gZnVuY3Rpb24gKHRhcmdldHMsIHgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZDMubWVyZ2UodGFyZ2V0cy5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQudmFsdWVzOyB9KSkuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2LnggLSB4ID09PSAwOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmZpbHRlclJlbW92ZU51bGwgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGlzVmFsdWUoZC52YWx1ZSk7IH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZmlsdGVyQnlYRG9tYWluID0gZnVuY3Rpb24gKHRhcmdldHMsIHhEb21haW4pIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldHMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiB0LmlkLFxuICAgICAgICAgICAgICAgIGlkX29yZzogdC5pZF9vcmcsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiB0LnZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhEb21haW5bMF0gPD0gdi54ICYmIHYueCA8PSB4RG9tYWluWzFdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmhhc0RhdGFMYWJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5kYXRhX2xhYmVscyA9PT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5kYXRhX2xhYmVscykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZy5kYXRhX2xhYmVscyA9PT0gJ29iamVjdCcgJiYgbm90RW1wdHkoY29uZmlnLmRhdGFfbGFiZWxzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0RGF0YUxhYmVsTGVuZ3RoID0gZnVuY3Rpb24gKG1pbiwgbWF4LCBrZXkpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIGxlbmd0aHMgPSBbMCwgMF0sIHBhZGRpbmdDb2VmID0gMS4zO1xuICAgICAgICAkJC5zZWxlY3RDaGFydC5zZWxlY3QoJ3N2ZycpLnNlbGVjdEFsbCgnLmR1bW15JylcbiAgICAgICAgICAgIC5kYXRhKFttaW4sIG1heF0pXG4gICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHsgcmV0dXJuICQkLmRhdGFMYWJlbEZvcm1hdChkLmlkKShkKTsgfSlcbiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgICAgICAgICAgbGVuZ3Roc1tpXSA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5XSAqIHBhZGRpbmdDb2VmO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuIGxlbmd0aHM7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc05vbmVBcmMgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNUYXJnZXQodGhpcy5kYXRhLnRhcmdldHMsIGQuaWQpO1xuICAgIH0sXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNBcmMgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gJ2RhdGEnIGluIGQgJiYgdGhpcy5oYXNUYXJnZXQodGhpcy5kYXRhLnRhcmdldHMsIGQuZGF0YS5pZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5maW5kU2FtZVhPZlZhbHVlcyA9IGZ1bmN0aW9uICh2YWx1ZXMsIGluZGV4KSB7XG4gICAgICAgIHZhciBpLCB0YXJnZXRYID0gdmFsdWVzW2luZGV4XS54LCBzYW1lcyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSBpbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0WCAhPT0gdmFsdWVzW2ldLngpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIHNhbWVzLnB1c2godmFsdWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSBpbmRleDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRhcmdldFggIT09IHZhbHVlc1tpXS54KSB7IGJyZWFrOyB9XG4gICAgICAgICAgICBzYW1lcy5wdXNoKHZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbWVzO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5maW5kQ2xvc2VzdEZyb21UYXJnZXRzID0gZnVuY3Rpb24gKHRhcmdldHMsIHBvcykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjYW5kaWRhdGVzO1xuXG4gICAgICAgIC8vIG1hcCB0byBhcnJheSBvZiBjbG9zZXN0IHBvaW50cyBvZiBlYWNoIHRhcmdldFxuICAgICAgICBjYW5kaWRhdGVzID0gdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuICQkLmZpbmRDbG9zZXN0KHRhcmdldC52YWx1ZXMsIHBvcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRlY2lkZSBjbG9zZXN0IHBvaW50IGFuZCByZXR1cm5cbiAgICAgICAgcmV0dXJuICQkLmZpbmRDbG9zZXN0KGNhbmRpZGF0ZXMsIHBvcyk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5maW5kQ2xvc2VzdCA9IGZ1bmN0aW9uICh2YWx1ZXMsIHBvcykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBtaW5EaXN0ID0gJCQuY29uZmlnLnBvaW50X3NlbnNpdGl2aXR5LCBjbG9zZXN0O1xuXG4gICAgICAgIC8vIGZpbmQgbW91c2VvdmVyaW5nIGJhclxuICAgICAgICB2YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ICYmICQkLmlzQmFyVHlwZSh2LmlkKTsgfSkuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgdmFyIHNoYXBlID0gJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuYmFycyArICQkLmdldFRhcmdldFNlbGVjdG9yU3VmZml4KHYuaWQpICsgJyAuJyArIENMQVNTLmJhciArICctJyArIHYuaW5kZXgpLm5vZGUoKTtcbiAgICAgICAgICAgIGlmICghY2xvc2VzdCAmJiAkJC5pc1dpdGhpbkJhcihzaGFwZSkpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0ID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZmluZCBjbG9zZXN0IHBvaW50IGZyb20gbm9uLWJhclxuICAgICAgICB2YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ICYmICEkJC5pc0JhclR5cGUodi5pZCk7IH0pLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIHZhciBkID0gJCQuZGlzdCh2LCBwb3MpO1xuICAgICAgICAgICAgaWYgKGQgPCBtaW5EaXN0KSB7XG4gICAgICAgICAgICAgICAgbWluRGlzdCA9IGQ7XG4gICAgICAgICAgICAgICAgY2xvc2VzdCA9IHY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjbG9zZXN0O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZGlzdCA9IGZ1bmN0aW9uIChkYXRhLCBwb3MpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgeEluZGV4ID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IDEgOiAwLFxuICAgICAgICAgICAgeUluZGV4ID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IDAgOiAxLFxuICAgICAgICAgICAgeSA9ICQkLmNpcmNsZVkoZGF0YSwgZGF0YS5pbmRleCksXG4gICAgICAgICAgICB4ID0gJCQueChkYXRhLngpO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHggLSBwb3NbeEluZGV4XSwgMikgKyBNYXRoLnBvdyh5IC0gcG9zW3lJbmRleF0sIDIpKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNvbnZlcnRWYWx1ZXNUb1N0ZXAgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgIHZhciBjb252ZXJ0ZWQgPSBbXS5jb25jYXQodmFsdWVzKSwgaTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNDYXRlZ29yaXplZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gdmFsdWVzLmxlbmd0aCArIDE7IDAgPCBpOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnZlcnRlZFtpXSA9IGNvbnZlcnRlZFtpIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICBjb252ZXJ0ZWRbMF0gPSB7XG4gICAgICAgICAgICB4OiBjb252ZXJ0ZWRbMF0ueCAtIDEsXG4gICAgICAgICAgICB2YWx1ZTogY29udmVydGVkWzBdLnZhbHVlLFxuICAgICAgICAgICAgaWQ6IGNvbnZlcnRlZFswXS5pZFxuICAgICAgICB9O1xuICAgICAgICBjb252ZXJ0ZWRbdmFsdWVzLmxlbmd0aCArIDFdID0ge1xuICAgICAgICAgICAgeDogY29udmVydGVkW3ZhbHVlcy5sZW5ndGhdLnggKyAxLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnZlcnRlZFt2YWx1ZXMubGVuZ3RoXS52YWx1ZSxcbiAgICAgICAgICAgIGlkOiBjb252ZXJ0ZWRbdmFsdWVzLmxlbmd0aF0uaWRcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gY29udmVydGVkO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlRGF0YUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAobmFtZSwgYXR0cnMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCBjdXJyZW50ID0gY29uZmlnWydkYXRhXycgKyBuYW1lXTtcbiAgICAgICAgaWYgKHR5cGVvZiBhdHRycyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGN1cnJlbnQ7IH1cbiAgICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICBjdXJyZW50W2lkXSA9IGF0dHJzW2lkXTtcbiAgICAgICAgfSk7XG4gICAgICAgICQkLnJlZHJhdyh7d2l0aExlZ2VuZDogdHJ1ZX0pO1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY29udmVydFVybFRvRGF0YSA9IGZ1bmN0aW9uICh1cmwsIG1pbWVUeXBlLCBoZWFkZXJzLCBrZXlzLCBkb25lKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIHR5cGUgPSBtaW1lVHlwZSA/IG1pbWVUeXBlIDogJ2Nzdic7XG4gICAgICAgIHZhciByZXEgPSAkJC5kMy54aHIodXJsKTtcbiAgICAgICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgICAgICAgICAgIHJlcS5oZWFkZXIoaGVhZGVyLCBoZWFkZXJzW2hlYWRlcl0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxLmdldChmdW5jdGlvbiAoZXJyb3IsIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBkO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLnJlc3BvbnNlVVJMICsgJyAnICsgZXJyb3Iuc3RhdHVzICsgJyAoJyArIGVycm9yLnN0YXR1c1RleHQgKyAnKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgICAgIGQgPSAkJC5jb252ZXJ0SnNvblRvRGF0YShKU09OLnBhcnNlKGRhdGEucmVzcG9uc2UpLCBrZXlzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RzdicpIHtcbiAgICAgICAgICAgICAgICBkID0gJCQuY29udmVydFRzdlRvRGF0YShkYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZCA9ICQkLmNvbnZlcnRDc3ZUb0RhdGEoZGF0YS5yZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lLmNhbGwoJCQsIGQpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNvbnZlcnRYc3ZUb0RhdGEgPSBmdW5jdGlvbiAoeHN2LCBwYXJzZXIpIHtcbiAgICAgICAgdmFyIHJvd3MgPSBwYXJzZXIucGFyc2VSb3dzKHhzdiksIGQ7XG4gICAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgZCA9IFt7fV07XG4gICAgICAgICAgICByb3dzWzBdLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgZFswXVtpZF0gPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkID0gcGFyc2VyLnBhcnNlKHhzdik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jb252ZXJ0Q3N2VG9EYXRhID0gZnVuY3Rpb24gKGNzdikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0WHN2VG9EYXRhKGNzdiwgdGhpcy5kMy5jc3YpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY29udmVydFRzdlRvRGF0YSA9IGZ1bmN0aW9uICh0c3YpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFhzdlRvRGF0YSh0c3YsIHRoaXMuZDMudHN2KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNvbnZlcnRKc29uVG9EYXRhID0gZnVuY3Rpb24gKGpzb24sIGtleXMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIG5ld19yb3dzID0gW10sIHRhcmdldEtleXMsIGRhdGE7XG4gICAgICAgIGlmIChrZXlzKSB7IC8vIHdoZW4ga2V5cyBzcGVjaWZpZWQsIGpzb24gd291bGQgYmUgYW4gYXJyYXkgdGhhdCBpbmNsdWRlcyBvYmplY3RzXG4gICAgICAgICAgICBpZiAoa2V5cy54KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0S2V5cyA9IGtleXMudmFsdWUuY29uY2F0KGtleXMueCk7XG4gICAgICAgICAgICAgICAgJCQuY29uZmlnLmRhdGFfeCA9IGtleXMueDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0S2V5cyA9IGtleXMudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdfcm93cy5wdXNoKHRhcmdldEtleXMpO1xuICAgICAgICAgICAganNvbi5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld19yb3cgPSBbXTtcbiAgICAgICAgICAgICAgICB0YXJnZXRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHVuZGVmaW5lZCB0byBudWxsIGJlY2F1c2UgdW5kZWZpbmVkIGRhdGEgd2lsbCBiZSByZW1vdmVkIGluIGNvbnZlcnREYXRhVG9UYXJnZXRzKClcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkJC5maW5kVmFsdWVJbkpzb24obywga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdfcm93LnB1c2godik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbmV3X3Jvd3MucHVzaChuZXdfcm93KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YSA9ICQkLmNvbnZlcnRSb3dzVG9EYXRhKG5ld19yb3dzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGpzb24pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIG5ld19yb3dzLnB1c2goW2tleV0uY29uY2F0KGpzb25ba2V5XSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXRhID0gJCQuY29udmVydENvbHVtbnNUb0RhdGEobmV3X3Jvd3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZmluZFZhbHVlSW5Kc29uID0gZnVuY3Rpb24gKG9iamVjdCwgcGF0aCkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXFsoXFx3KylcXF0vZywgJy4kMScpOyAvLyBjb252ZXJ0IGluZGV4ZXMgdG8gcHJvcGVydGllcyAocmVwbGFjZSBbXSB3aXRoIC4pXG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC4vLCAnJyk7ICAgICAgICAgICAvLyBzdHJpcCBhIGxlYWRpbmcgZG90XG4gICAgICAgIHZhciBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgayA9IHBhdGhBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChrIGluIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdFtrXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jb252ZXJ0Um93c1RvRGF0YSA9IGZ1bmN0aW9uIChyb3dzKSB7XG4gICAgICAgIHZhciBrZXlzID0gcm93c1swXSwgbmV3X3JvdyA9IHt9LCBuZXdfcm93cyA9IFtdLCBpLCBqO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3X3JvdyA9IHt9O1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJvd3NbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQocm93c1tpXVtqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIGRhdGEgaXMgbWlzc2luZyBhIGNvbXBvbmVudCBhdCAoXCIgKyBpICsgXCIsXCIgKyBqICsgXCIpIVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3X3Jvd1trZXlzW2pdXSA9IHJvd3NbaV1bal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdfcm93cy5wdXNoKG5ld19yb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdfcm93cztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNvbnZlcnRDb2x1bW5zVG9EYXRhID0gZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICAgICAgdmFyIG5ld19yb3dzID0gW10sIGksIGosIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGtleSA9IGNvbHVtbnNbaV1bMF07XG4gICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgY29sdW1uc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChuZXdfcm93c1tqIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld19yb3dzW2ogLSAxXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoY29sdW1uc1tpXVtqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIGRhdGEgaXMgbWlzc2luZyBhIGNvbXBvbmVudCBhdCAoXCIgKyBpICsgXCIsXCIgKyBqICsgXCIpIVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3X3Jvd3NbaiAtIDFdW2tleV0gPSBjb2x1bW5zW2ldW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdfcm93cztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNvbnZlcnREYXRhVG9UYXJnZXRzID0gZnVuY3Rpb24gKGRhdGEsIGFwcGVuZFhzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGlkcyA9ICQkLmQzLmtleXMoZGF0YVswXSkuZmlsdGVyKCQkLmlzTm90WCwgJCQpLFxuICAgICAgICAgICAgeHMgPSAkJC5kMy5rZXlzKGRhdGFbMF0pLmZpbHRlcigkJC5pc1gsICQkKSxcbiAgICAgICAgICAgIHRhcmdldHM7XG5cbiAgICAgICAgLy8gc2F2ZSB4IGZvciB1cGRhdGUgZGF0YSBieSBsb2FkIHdoZW4gY3VzdG9tIHggYW5kIGMzLnggQVBJXG4gICAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgdmFyIHhLZXkgPSAkJC5nZXRYS2V5KGlkKTtcblxuICAgICAgICAgICAgaWYgKCQkLmlzQ3VzdG9tWCgpIHx8ICQkLmlzVGltZVNlcmllcygpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaW5jbHVkZWQgaW4gaW5wdXQgZGF0YVxuICAgICAgICAgICAgICAgIGlmICh4cy5pbmRleE9mKHhLZXkpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgJCQuZGF0YS54c1tpZF0gPSAoYXBwZW5kWHMgJiYgJCQuZGF0YS54c1tpZF0gPyAkJC5kYXRhLnhzW2lkXSA6IFtdKS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1hcChmdW5jdGlvbiAoZCkgeyByZXR1cm4gZFt4S2V5XTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocmF3WCwgaSkgeyByZXR1cm4gJCQuZ2VuZXJhdGVUYXJnZXRYKHJhd1gsIGlkLCBpKTsgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgbm90IGluY2x1ZGVkIGluIGlucHV0IGRhdGEsIGZpbmQgZnJvbSBwcmVsb2FkZWQgZGF0YSBvZiBvdGhlciBpZCdzIHhcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25maWcuZGF0YV94KSB7XG4gICAgICAgICAgICAgICAgICAgICQkLmRhdGEueHNbaWRdID0gJCQuZ2V0T3RoZXJUYXJnZXRYcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiBub3QgaW5jbHVkZWQgaW4gaW5wdXQgZGF0YSwgZmluZCBmcm9tIHByZWxvYWRlZCBkYXRhXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm90RW1wdHkoY29uZmlnLmRhdGFfeHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICQkLmRhdGEueHNbaWRdID0gJCQuZ2V0WFZhbHVlc09mWEtleSh4S2V5LCAkJC5kYXRhLnRhcmdldHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBNRU1POiBpZiBubyB4IGluY2x1ZGVkLCB1c2Ugc2FtZSB4IG9mIGN1cnJlbnQgd2lsbCBiZSB1c2VkXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQkLmRhdGEueHNbaWRdID0gZGF0YS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIGk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8vIGNoZWNrIHggaXMgZGVmaW5lZFxuICAgICAgICBpZHMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgIGlmICghJCQuZGF0YS54c1tpZF0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ggaXMgbm90IGRlZmluZWQgZm9yIGlkID0gXCInICsgaWQgKyAnXCIuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gdGFyZ2V0XG4gICAgICAgIHRhcmdldHMgPSBpZHMubWFwKGZ1bmN0aW9uIChpZCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBjb252ZXJ0ZWRJZCA9IGNvbmZpZy5kYXRhX2lkQ29udmVydGVyKGlkKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IGNvbnZlcnRlZElkLFxuICAgICAgICAgICAgICAgIGlkX29yZzogaWQsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBkYXRhLm1hcChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeEtleSA9ICQkLmdldFhLZXkoaWQpLCByYXdYID0gZFt4S2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZFtpZF0gIT09IG51bGwgJiYgIWlzTmFOKGRbaWRdKSA/ICtkW2lkXSA6IG51bGwsIHg7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB4IGFzIGNhdGVnb3JpZXMgaWYgY3VzdG9tIHggYW5kIGNhdGVnb3JpemVkXG4gICAgICAgICAgICAgICAgICAgIGlmICgkJC5pc0N1c3RvbVgoKSAmJiAkJC5pc0NhdGVnb3JpemVkKCkgJiYgaW5kZXggPT09IDAgJiYgIWlzVW5kZWZpbmVkKHJhd1gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5heGlzX3hfY2F0ZWdvcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGNvbmZpZy5heGlzX3hfY2F0ZWdvcmllcy5pbmRleE9mKHJhd1gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGNvbmZpZy5heGlzX3hfY2F0ZWdvcmllcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmF4aXNfeF9jYXRlZ29yaWVzLnB1c2gocmF3WCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4ICA9ICQkLmdlbmVyYXRlVGFyZ2V0WChyYXdYLCBpZCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBhcyB4ID0gdW5kZWZpbmVkIGlmIHZhbHVlIGlzIHVuZGVmaW5lZCBhbmQgZmlsdGVyIHRvIHJlbW92ZSBhZnRlciBtYXBwZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGRbaWRdKSB8fCAkJC5kYXRhLnhzW2lkXS5sZW5ndGggPD0gaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3g6IHgsIHZhbHVlOiB2YWx1ZSwgaWQ6IGNvbnZlcnRlZElkfTtcbiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIGlzRGVmaW5lZCh2LngpOyB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZmluaXNoIHRhcmdldHNcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIC8vIHNvcnQgdmFsdWVzIGJ5IGl0cyB4XG4gICAgICAgICAgICBpZiAoY29uZmlnLmRhdGFfeFNvcnQpIHtcbiAgICAgICAgICAgICAgICB0LnZhbHVlcyA9IHQudmFsdWVzLnNvcnQoZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeDEgPSB2MS54IHx8IHYxLnggPT09IDAgPyB2MS54IDogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgICAgICAgICB4MiA9IHYyLnggfHwgdjIueCA9PT0gMCA/IHYyLnggOiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgxIC0geDI7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpbmRleGluZyBlYWNoIHZhbHVlXG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIHQudmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICB2LmluZGV4ID0gaSsrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyB0aGlzIG5lZWRzIHRvIGJlIHNvcnRlZCBiZWNhdXNlIGl0cyBpbmRleCBhbmQgdmFsdWUuaW5kZXggaXMgaWRlbnRpY2FsXG4gICAgICAgICAgICAkJC5kYXRhLnhzW3QuaWRdLnNvcnQoZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2MSAtIHYyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNhY2hlIGluZm9ybWF0aW9uIGFib3V0IHZhbHVlc1xuICAgICAgICAkJC5oYXNOZWdhdGl2ZVZhbHVlID0gJCQuaGFzTmVnYXRpdmVWYWx1ZUluVGFyZ2V0cyh0YXJnZXRzKTtcbiAgICAgICAgJCQuaGFzUG9zaXRpdmVWYWx1ZSA9ICQkLmhhc1Bvc2l0aXZlVmFsdWVJblRhcmdldHModGFyZ2V0cyk7XG5cbiAgICAgICAgLy8gc2V0IHRhcmdldCB0eXBlc1xuICAgICAgICBpZiAoY29uZmlnLmRhdGFfdHlwZSkge1xuICAgICAgICAgICAgJCQuc2V0VGFyZ2V0VHlwZSgkJC5tYXBUb0lkcyh0YXJnZXRzKS5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7IHJldHVybiAhIChpZCBpbiBjb25maWcuZGF0YV90eXBlcyk7IH0pLCBjb25maWcuZGF0YV90eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhY2hlIGFzIG9yaWdpbmFsIGlkIGtleWVkXG4gICAgICAgIHRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgJCQuYWRkQ2FjaGUoZC5pZF9vcmcsIGQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0cztcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ubG9hZCA9IGZ1bmN0aW9uICh0YXJnZXRzLCBhcmdzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBmaWx0ZXIgbG9hZGluZyB0YXJnZXRzIGlmIG5lZWRlZFxuICAgICAgICAgICAgaWYgKGFyZ3MuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKGFyZ3MuZmlsdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCB0eXBlIGlmIGFyZ3MudHlwZXMgfHwgYXJncy50eXBlIHNwZWNpZmllZFxuICAgICAgICAgICAgaWYgKGFyZ3MudHlwZSB8fCBhcmdzLnR5cGVzKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gYXJncy50eXBlcyAmJiBhcmdzLnR5cGVzW3QuaWRdID8gYXJncy50eXBlc1t0LmlkXSA6IGFyZ3MudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgJCQuc2V0VGFyZ2V0VHlwZSh0LmlkLCB0eXBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVwZGF0ZS9BZGQgZGF0YVxuICAgICAgICAgICAgJCQuZGF0YS50YXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQuaWQgPT09IHRhcmdldHNbaV0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQudmFsdWVzID0gdGFyZ2V0c1tpXS52YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkJC5kYXRhLnRhcmdldHMgPSAkJC5kYXRhLnRhcmdldHMuY29uY2F0KHRhcmdldHMpOyAvLyBhZGQgcmVtYWluZWRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0YXJnZXRzXG4gICAgICAgICQkLnVwZGF0ZVRhcmdldHMoJCQuZGF0YS50YXJnZXRzKTtcblxuICAgICAgICAvLyBSZWRyYXcgd2l0aCBuZXcgdGFyZ2V0c1xuICAgICAgICAkJC5yZWRyYXcoe3dpdGhVcGRhdGVPcmdYRG9tYWluOiB0cnVlLCB3aXRoVXBkYXRlWERvbWFpbjogdHJ1ZSwgd2l0aExlZ2VuZDogdHJ1ZX0pO1xuXG4gICAgICAgIGlmIChhcmdzLmRvbmUpIHsgYXJncy5kb25lKCk7IH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmxvYWRGcm9tQXJncyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIGlmIChhcmdzLmRhdGEpIHtcbiAgICAgICAgICAgICQkLmxvYWQoJCQuY29udmVydERhdGFUb1RhcmdldHMoYXJncy5kYXRhKSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJncy51cmwpIHtcbiAgICAgICAgICAgICQkLmNvbnZlcnRVcmxUb0RhdGEoYXJncy51cmwsIGFyZ3MubWltZVR5cGUsIGFyZ3MuaGVhZGVycywgYXJncy5rZXlzLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICQkLmxvYWQoJCQuY29udmVydERhdGFUb1RhcmdldHMoZGF0YSksIGFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJncy5qc29uKSB7XG4gICAgICAgICAgICAkJC5sb2FkKCQkLmNvbnZlcnREYXRhVG9UYXJnZXRzKCQkLmNvbnZlcnRKc29uVG9EYXRhKGFyZ3MuanNvbiwgYXJncy5rZXlzKSksIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3Mucm93cykge1xuICAgICAgICAgICAgJCQubG9hZCgkJC5jb252ZXJ0RGF0YVRvVGFyZ2V0cygkJC5jb252ZXJ0Um93c1RvRGF0YShhcmdzLnJvd3MpKSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJncy5jb2x1bW5zKSB7XG4gICAgICAgICAgICAkJC5sb2FkKCQkLmNvbnZlcnREYXRhVG9UYXJnZXRzKCQkLmNvbnZlcnRDb2x1bW5zVG9EYXRhKGFyZ3MuY29sdW1ucykpLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICQkLmxvYWQobnVsbCwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVubG9hZCA9IGZ1bmN0aW9uICh0YXJnZXRJZHMsIGRvbmUpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgICBkb25lID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmlsdGVyIGV4aXN0aW5nIHRhcmdldFxuICAgICAgICB0YXJnZXRJZHMgPSB0YXJnZXRJZHMuZmlsdGVyKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gJCQuaGFzVGFyZ2V0KCQkLmRhdGEudGFyZ2V0cywgaWQpOyB9KTtcbiAgICAgICAgLy8gSWYgbm8gdGFyZ2V0LCBjYWxsIGRvbmUgYW5kIHJldHVyblxuICAgICAgICBpZiAoIXRhcmdldElkcyB8fCB0YXJnZXRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgJCQuc3ZnLnNlbGVjdEFsbCh0YXJnZXRJZHMubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gJCQuc2VsZWN0b3JUYXJnZXQoaWQpOyB9KSlcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAgICAgICAucmVtb3ZlKClcbiAgICAgICAgICAgIC5jYWxsKCQkLmVuZGFsbCwgZG9uZSk7XG4gICAgICAgIHRhcmdldElkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgLy8gUmVzZXQgZmFkZWluIGZvciBmdXR1cmUgbG9hZFxuICAgICAgICAgICAgJCQud2l0aG91dEZhZGVJbltpZF0gPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0YXJnZXQncyBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKCQkLmxlZ2VuZCkge1xuICAgICAgICAgICAgICAgICQkLmxlZ2VuZC5zZWxlY3RBbGwoJy4nICsgQ0xBU1MubGVnZW5kSXRlbSArICQkLmdldFRhcmdldFNlbGVjdG9yU3VmZml4KGlkKSkucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGFyZ2V0XG4gICAgICAgICAgICAkJC5kYXRhLnRhcmdldHMgPSAkJC5kYXRhLnRhcmdldHMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuaWQgIT09IGlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jYXRlZ29yeU5hbWUgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgICAgIHJldHVybiBpIDwgY29uZmlnLmF4aXNfeF9jYXRlZ29yaWVzLmxlbmd0aCA/IGNvbmZpZy5heGlzX3hfY2F0ZWdvcmllc1tpXSA6IGk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmluaXRFdmVudFJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLm1haW4uc2VsZWN0KCcuJyArIENMQVNTLmNoYXJ0KS5hcHBlbmQoXCJnXCIpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmV2ZW50UmVjdHMpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZpbGwtb3BhY2l0eScsIDApO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucmVkcmF3RXZlbnRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBldmVudFJlY3RVcGRhdGUsIG1heERhdGFDb3VudFRhcmdldCxcbiAgICAgICAgICAgIGlzTXVsdGlwbGVYID0gJCQuaXNNdWx0aXBsZVgoKTtcblxuICAgICAgICAvLyByZWN0cyBmb3IgbW91c2VvdmVyXG4gICAgICAgIHZhciBldmVudFJlY3RzID0gJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuZXZlbnRSZWN0cylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsIGNvbmZpZy56b29tX2VuYWJsZWQgPyBjb25maWcuYXhpc19yb3RhdGVkID8gJ25zLXJlc2l6ZScgOiAnZXctcmVzaXplJyA6IG51bGwpXG4gICAgICAgICAgICAgICAgLmNsYXNzZWQoQ0xBU1MuZXZlbnRSZWN0c011bHRpcGxlLCBpc011bHRpcGxlWClcbiAgICAgICAgICAgICAgICAuY2xhc3NlZChDTEFTUy5ldmVudFJlY3RzU2luZ2xlLCAhaXNNdWx0aXBsZVgpO1xuXG4gICAgICAgIC8vIGNsZWFyIG9sZCByZWN0c1xuICAgICAgICBldmVudFJlY3RzLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5ldmVudFJlY3QpLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIG9wZW4gYXMgcHVibGljIHZhcmlhYmxlXG4gICAgICAgICQkLmV2ZW50UmVjdCA9IGV2ZW50UmVjdHMuc2VsZWN0QWxsKCcuJyArIENMQVNTLmV2ZW50UmVjdCk7XG5cbiAgICAgICAgaWYgKGlzTXVsdGlwbGVYKSB7XG4gICAgICAgICAgICBldmVudFJlY3RVcGRhdGUgPSAkJC5ldmVudFJlY3QuZGF0YShbMF0pO1xuICAgICAgICAgICAgLy8gZW50ZXIgOiBvbmx5IG9uZSByZWN0IHdpbGwgYmUgYWRkZWRcbiAgICAgICAgICAgICQkLmdlbmVyYXRlRXZlbnRSZWN0c0Zvck11bHRpcGxlWHMoZXZlbnRSZWN0VXBkYXRlLmVudGVyKCkpO1xuICAgICAgICAgICAgLy8gdXBkYXRlXG4gICAgICAgICAgICAkJC51cGRhdGVFdmVudFJlY3QoZXZlbnRSZWN0VXBkYXRlKTtcbiAgICAgICAgICAgIC8vIGV4aXQgOiBub3QgbmVlZGVkIGJlY2F1c2UgYWx3YXlzIG9ubHkgb25lIHJlY3QgZXhpc3RzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXQgZGF0YSBhbmQgdXBkYXRlICQkLmV2ZW50UmVjdFxuICAgICAgICAgICAgbWF4RGF0YUNvdW50VGFyZ2V0ID0gJCQuZ2V0TWF4RGF0YUNvdW50VGFyZ2V0KCQkLmRhdGEudGFyZ2V0cyk7XG4gICAgICAgICAgICBldmVudFJlY3RzLmRhdHVtKG1heERhdGFDb3VudFRhcmdldCA/IG1heERhdGFDb3VudFRhcmdldC52YWx1ZXMgOiBbXSk7XG4gICAgICAgICAgICAkJC5ldmVudFJlY3QgPSBldmVudFJlY3RzLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5ldmVudFJlY3QpO1xuICAgICAgICAgICAgZXZlbnRSZWN0VXBkYXRlID0gJCQuZXZlbnRSZWN0LmRhdGEoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQ7IH0pO1xuICAgICAgICAgICAgLy8gZW50ZXJcbiAgICAgICAgICAgICQkLmdlbmVyYXRlRXZlbnRSZWN0c0ZvclNpbmdsZVgoZXZlbnRSZWN0VXBkYXRlLmVudGVyKCkpO1xuICAgICAgICAgICAgLy8gdXBkYXRlXG4gICAgICAgICAgICAkJC51cGRhdGVFdmVudFJlY3QoZXZlbnRSZWN0VXBkYXRlKTtcbiAgICAgICAgICAgIC8vIGV4aXRcbiAgICAgICAgICAgIGV2ZW50UmVjdFVwZGF0ZS5leGl0KCkucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUV2ZW50UmVjdCA9IGZ1bmN0aW9uIChldmVudFJlY3RVcGRhdGUpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgeCwgeSwgdywgaCwgcmVjdFcsIHJlY3RYO1xuXG4gICAgICAgIC8vIHNldCB1cGRhdGUgc2VsZWN0aW9uIGlmIG51bGxcbiAgICAgICAgZXZlbnRSZWN0VXBkYXRlID0gZXZlbnRSZWN0VXBkYXRlIHx8ICQkLmV2ZW50UmVjdC5kYXRhKGZ1bmN0aW9uIChkKSB7IHJldHVybiBkOyB9KTtcblxuICAgICAgICBpZiAoJCQuaXNNdWx0aXBsZVgoKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogcm90YXRlZCBub3Qgc3VwcG9ydGVkIHlldFxuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgICAgIHcgPSAkJC53aWR0aDtcbiAgICAgICAgICAgIGggPSAkJC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoKCQkLmlzQ3VzdG9tWCgpIHx8ICQkLmlzVGltZVNlcmllcygpKSAmJiAhJCQuaXNDYXRlZ29yaXplZCgpKSB7XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaW5kZXggZm9yIHggdGhhdCBpcyB1c2VkIGJ5IHByZXZYIGFuZCBuZXh0WFxuICAgICAgICAgICAgICAgICQkLnVwZGF0ZVhzKCk7XG5cbiAgICAgICAgICAgICAgICByZWN0VyA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmV2WCA9ICQkLmdldFByZXZYKGQuaW5kZXgpLCBuZXh0WCA9ICQkLmdldE5leHRYKGQuaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHRoaXMgaXMgYSBzaW5nbGUgZGF0YSBwb2ludCBtYWtlIHRoZSBldmVudFJlY3QgZnVsbCB3aWR0aCAob3IgaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldlggPT09IG51bGwgJiYgbmV4dFggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcuYXhpc19yb3RhdGVkID8gJCQuaGVpZ2h0IDogJCQud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldlggPT09IG51bGwpIHsgcHJldlggPSAkJC54LmRvbWFpbigpWzBdOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0WCA9PT0gbnVsbCkgeyBuZXh0WCA9ICQkLnguZG9tYWluKClbMV07IH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKCQkLngobmV4dFgpIC0gJCQueChwcmV2WCkpIC8gMik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWN0WCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmV2WCA9ICQkLmdldFByZXZYKGQuaW5kZXgpLCBuZXh0WCA9ICQkLmdldE5leHRYKGQuaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1ggPSAkJC5kYXRhLnhzW2QuaWRdW2QuaW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHRoaXMgaXMgYSBzaW5nbGUgZGF0YSBwb2ludCBwb3NpdGlvbiB0aGUgZXZlbnRSZWN0IGF0IDBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZYID09PSBudWxsICYmIG5leHRYID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2WCA9PT0gbnVsbCkgeyBwcmV2WCA9ICQkLnguZG9tYWluKClbMF07IH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCQkLngodGhpc1gpICsgJCQueChwcmV2WCkpIC8gMjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWN0VyA9ICQkLmdldEV2ZW50UmVjdFdpZHRoKCk7XG4gICAgICAgICAgICAgICAgcmVjdFggPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCQueChkLngpIC0gKHJlY3RXIC8gMik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHggPSBjb25maWcuYXhpc19yb3RhdGVkID8gMCA6IHJlY3RYO1xuICAgICAgICAgICAgeSA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyByZWN0WCA6IDA7XG4gICAgICAgICAgICB3ID0gY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLndpZHRoIDogcmVjdFc7XG4gICAgICAgICAgICBoID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IHJlY3RXIDogJCQuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnRSZWN0VXBkYXRlXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAkJC5jbGFzc0V2ZW50LmJpbmQoJCQpKVxuICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIHgpXG4gICAgICAgICAgICAuYXR0cihcInlcIiwgeSlcbiAgICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgdylcbiAgICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGgpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2VuZXJhdGVFdmVudFJlY3RzRm9yU2luZ2xlWCA9IGZ1bmN0aW9uIChldmVudFJlY3RFbnRlcikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBkMyA9ICQkLmQzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIGV2ZW50UmVjdEVudGVyLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgJCQuY2xhc3NFdmVudC5iaW5kKCQkKSlcbiAgICAgICAgICAgIC5zdHlsZShcImN1cnNvclwiLCBjb25maWcuZGF0YV9zZWxlY3Rpb25fZW5hYmxlZCAmJiBjb25maWcuZGF0YV9zZWxlY3Rpb25fZ3JvdXBlZCA/IFwicG9pbnRlclwiIDogbnVsbClcbiAgICAgICAgICAgIC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBkLmluZGV4O1xuXG4gICAgICAgICAgICAgICAgaWYgKCQkLmRyYWdnaW5nIHx8ICQkLmZsb3dpbmcpIHsgcmV0dXJuOyB9IC8vIGRvIG5vdGhpbmcgd2hpbGUgZHJhZ2dpbmcvZmxvd2luZ1xuICAgICAgICAgICAgICAgIGlmICgkJC5oYXNBcmNUeXBlKCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgICAgICAvLyBFeHBhbmQgc2hhcGVzIGZvciBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnBvaW50X2ZvY3VzX2V4cGFuZF9lbmFibGVkKSB7ICQkLmV4cGFuZENpcmNsZXMoaW5kZXgsIG51bGwsIHRydWUpOyB9XG4gICAgICAgICAgICAgICAgJCQuZXhwYW5kQmFycyhpbmRleCwgbnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgICAgICAgICAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5zaGFwZSArICctJyArIGluZGV4KS5lYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5kYXRhX29ubW91c2VvdmVyLmNhbGwoJCQuYXBpLCBkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ21vdXNlb3V0JywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBkLmluZGV4O1xuICAgICAgICAgICAgICAgIGlmICghJCQuY29uZmlnKSB7IHJldHVybjsgfSAvLyBjaGFydCBpcyBkZXN0cm95ZWRcbiAgICAgICAgICAgICAgICBpZiAoJCQuaGFzQXJjVHlwZSgpKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgICQkLmhpZGVYR3JpZEZvY3VzKCk7XG4gICAgICAgICAgICAgICAgJCQuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgICAgICAgICAvLyBVbmRvIGV4cGFuZGVkIHNoYXBlc1xuICAgICAgICAgICAgICAgICQkLnVuZXhwYW5kQ2lyY2xlcygpO1xuICAgICAgICAgICAgICAgICQkLnVuZXhwYW5kQmFycygpO1xuICAgICAgICAgICAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlclxuICAgICAgICAgICAgICAgICQkLm1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlICsgJy0nICsgaW5kZXgpLmVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmRhdGFfb25tb3VzZW91dC5jYWxsKCQkLmFwaSwgZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZERhdGEsIGluZGV4ID0gZC5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWN0ID0gJCQuc3ZnLnNlbGVjdCgnLicgKyBDTEFTUy5ldmVudFJlY3QgKyAnLScgKyBpbmRleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJCQuZHJhZ2dpbmcgfHwgJCQuZmxvd2luZykgeyByZXR1cm47IH0gLy8gZG8gbm90aGluZyB3aGlsZSBkcmFnZ2luZy9mbG93aW5nXG4gICAgICAgICAgICAgICAgaWYgKCQkLmhhc0FyY1R5cGUoKSkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgICAgIGlmICgkJC5pc1N0ZXBUeXBlKGQpICYmICQkLmNvbmZpZy5saW5lX3N0ZXBfdHlwZSA9PT0gJ3N0ZXAtYWZ0ZXInICYmIGQzLm1vdXNlKHRoaXMpWzBdIDwgJCQueCgkJC5nZXRYVmFsdWUoZC5pZCwgaW5kZXgpKSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNob3cgdG9vbHRpcFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YSA9ICQkLmZpbHRlclRhcmdldHNUb1Nob3coJCQuZGF0YS50YXJnZXRzKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQkLmFkZE5hbWUoJCQuZ2V0VmFsdWVPbkluZGV4KHQudmFsdWVzLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50b29sdGlwX2dyb3VwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgJCQuc2hvd1Rvb2x0aXAoc2VsZWN0ZWREYXRhLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgJCQuc2hvd1hHcmlkRm9jdXMoc2VsZWN0ZWREYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnRvb2x0aXBfZ3JvdXBlZCAmJiAoIWNvbmZpZy5kYXRhX3NlbGVjdGlvbl9lbmFibGVkIHx8IGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9ncm91cGVkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJCQubWFpbi5zZWxlY3RBbGwoJy4nICsgQ0xBU1Muc2hhcGUgKyAnLScgKyBpbmRleClcbiAgICAgICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoQ0xBU1MuRVhQQU5ERUQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRSZWN0LnN0eWxlKCdjdXJzb3InLCBjb25maWcuZGF0YV9zZWxlY3Rpb25fZ3JvdXBlZCA/ICdwb2ludGVyJyA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWcudG9vbHRpcF9ncm91cGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQuaGlkZVhHcmlkRm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJC5oaWRlVG9vbHRpcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmRhdGFfc2VsZWN0aW9uX2dyb3VwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQudW5leHBhbmRDaXJjbGVzKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQudW5leHBhbmRCYXJzKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkJC5pc1dpdGhpblNoYXBlKHRoaXMsIGQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9lbmFibGVkICYmIChjb25maWcuZGF0YV9zZWxlY3Rpb25fZ3JvdXBlZCB8fCBjb25maWcuZGF0YV9zZWxlY3Rpb25faXNzZWxlY3RhYmxlKGQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50UmVjdC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLnRvb2x0aXBfZ3JvdXBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkLnNob3dUb29sdGlwKFtkXSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQuc2hvd1hHcmlkRm9jdXMoW2RdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnBvaW50X2ZvY3VzX2V4cGFuZF9lbmFibGVkKSB7ICQkLmV4cGFuZENpcmNsZXMoaW5kZXgsIGQuaWQsIHRydWUpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQuZXhwYW5kQmFycyhpbmRleCwgZC5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGQuaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKCQkLmhhc0FyY1R5cGUoKSB8fCAhJCQudG9nZ2xlU2hhcGUpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgaWYgKCQkLmNhbmNlbENsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICQkLmNhbmNlbENsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCQkLmlzU3RlcFR5cGUoZCkgJiYgY29uZmlnLmxpbmVfc3RlcF90eXBlID09PSAnc3RlcC1hZnRlcicgJiYgZDMubW91c2UodGhpcylbMF0gPCAkJC54KCQkLmdldFhWYWx1ZShkLmlkLCBpbmRleCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4IC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQkLm1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlICsgJy0nICsgaW5kZXgpLmVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9ncm91cGVkIHx8ICQkLmlzV2l0aGluU2hhcGUodGhpcywgZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQkLnRvZ2dsZVNoYXBlKHRoaXMsIGQsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQkLmNvbmZpZy5kYXRhX29uY2xpY2suY2FsbCgkJC5hcGksIGQsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhbGwoXG4gICAgICAgICAgICAgICAgY29uZmlnLmRhdGFfc2VsZWN0aW9uX2RyYWdnYWJsZSAmJiAkJC5kcmFnID8gKFxuICAgICAgICAgICAgICAgICAgICBkMy5iZWhhdmlvci5kcmFnKCkub3JpZ2luKE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignZHJhZycsIGZ1bmN0aW9uICgpIHsgJCQuZHJhZyhkMy5tb3VzZSh0aGlzKSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAub24oJ2RyYWdzdGFydCcsIGZ1bmN0aW9uICgpIHsgJCQuZHJhZ3N0YXJ0KGQzLm1vdXNlKHRoaXMpKTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uICgpIHsgJCQuZHJhZ2VuZCgpOyB9KVxuICAgICAgICAgICAgICAgICkgOiBmdW5jdGlvbiAoKSB7fVxuICAgICAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2VuZXJhdGVFdmVudFJlY3RzRm9yTXVsdGlwbGVYcyA9IGZ1bmN0aW9uIChldmVudFJlY3RFbnRlcikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBkMyA9ICQkLmQzLCBjb25maWcgPSAkJC5jb25maWc7XG5cbiAgICAgICAgZnVuY3Rpb24gbW91c2VvdXQoKSB7XG4gICAgICAgICAgICAkJC5zdmcuc2VsZWN0KCcuJyArIENMQVNTLmV2ZW50UmVjdCkuc3R5bGUoJ2N1cnNvcicsIG51bGwpO1xuICAgICAgICAgICAgJCQuaGlkZVhHcmlkRm9jdXMoKTtcbiAgICAgICAgICAgICQkLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgICAkJC51bmV4cGFuZENpcmNsZXMoKTtcbiAgICAgICAgICAgICQkLnVuZXhwYW5kQmFycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnRSZWN0RW50ZXIuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsICQkLndpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsICQkLmhlaWdodClcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIENMQVNTLmV2ZW50UmVjdClcbiAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEkJC5jb25maWcpIHsgcmV0dXJuOyB9IC8vIGNoYXJ0IGlzIGRlc3Ryb3llZFxuICAgICAgICAgICAgICAgIGlmICgkJC5oYXNBcmNUeXBlKCkpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgbW91c2VvdXQoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0c1RvU2hvdyA9ICQkLmZpbHRlclRhcmdldHNUb1Nob3coJCQuZGF0YS50YXJnZXRzKTtcbiAgICAgICAgICAgICAgICB2YXIgbW91c2UsIGNsb3Nlc3QsIHNhbWVYRGF0YSwgc2VsZWN0ZWREYXRhO1xuXG4gICAgICAgICAgICAgICAgaWYgKCQkLmRyYWdnaW5nKSB7IHJldHVybjsgfSAvLyBkbyBub3RoaW5nIHdoZW4gZHJhZ2dpbmdcbiAgICAgICAgICAgICAgICBpZiAoJCQuaGFzQXJjVHlwZSh0YXJnZXRzVG9TaG93KSkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgICAgIG1vdXNlID0gZDMubW91c2UodGhpcyk7XG4gICAgICAgICAgICAgICAgY2xvc2VzdCA9ICQkLmZpbmRDbG9zZXN0RnJvbVRhcmdldHModGFyZ2V0c1RvU2hvdywgbW91c2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCQkLm1vdXNlb3ZlciAmJiAoIWNsb3Nlc3QgfHwgY2xvc2VzdC5pZCAhPT0gJCQubW91c2VvdmVyLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuZGF0YV9vbm1vdXNlb3V0LmNhbGwoJCQuYXBpLCAkJC5tb3VzZW92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAkJC5tb3VzZW92ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCEgY2xvc2VzdCkge1xuICAgICAgICAgICAgICAgICAgICBtb3VzZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCQkLmlzU2NhdHRlclR5cGUoY2xvc2VzdCkgfHwgIWNvbmZpZy50b29sdGlwX2dyb3VwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FtZVhEYXRhID0gW2Nsb3Nlc3RdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVYRGF0YSA9ICQkLmZpbHRlckJ5WCh0YXJnZXRzVG9TaG93LCBjbG9zZXN0LngpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHNob3cgdG9vbHRpcCB3aGVuIGN1cnNvciBpcyBjbG9zZSB0byBzb21lIHBvaW50XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhID0gc2FtZVhEYXRhLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCQuYWRkTmFtZShkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkJC5zaG93VG9vbHRpcChzZWxlY3RlZERhdGEsIHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgLy8gZXhwYW5kIHBvaW50c1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcucG9pbnRfZm9jdXNfZXhwYW5kX2VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgJCQuZXhwYW5kQ2lyY2xlcyhjbG9zZXN0LmluZGV4LCBjbG9zZXN0LmlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCQuZXhwYW5kQmFycyhjbG9zZXN0LmluZGV4LCBjbG9zZXN0LmlkLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIC8vIFNob3cgeGdyaWQgZm9jdXMgbGluZVxuICAgICAgICAgICAgICAgICQkLnNob3dYR3JpZEZvY3VzKHNlbGVjdGVkRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAvLyBTaG93IGN1cnNvciBhcyBwb2ludGVyIGlmIHBvaW50IGlzIGNsb3NlIHRvIG1vdXNlIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCQkLmlzQmFyVHlwZShjbG9zZXN0LmlkKSB8fCAkJC5kaXN0KGNsb3Nlc3QsIG1vdXNlKSA8IGNvbmZpZy5wb2ludF9zZW5zaXRpdml0eSkge1xuICAgICAgICAgICAgICAgICAgICAkJC5zdmcuc2VsZWN0KCcuJyArIENMQVNTLmV2ZW50UmVjdCkuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghJCQubW91c2VvdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZGF0YV9vbm1vdXNlb3Zlci5jYWxsKCQkLmFwaSwgY2xvc2VzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkJC5tb3VzZW92ZXIgPSBjbG9zZXN0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldHNUb1Nob3cgPSAkJC5maWx0ZXJUYXJnZXRzVG9TaG93KCQkLmRhdGEudGFyZ2V0cyk7XG4gICAgICAgICAgICAgICAgdmFyIG1vdXNlLCBjbG9zZXN0O1xuICAgICAgICAgICAgICAgIGlmICgkJC5oYXNBcmNUeXBlKHRhcmdldHNUb1Nob3cpKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICAgICAgbW91c2UgPSBkMy5tb3VzZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBjbG9zZXN0ID0gJCQuZmluZENsb3Nlc3RGcm9tVGFyZ2V0cyh0YXJnZXRzVG9TaG93LCBtb3VzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCEgY2xvc2VzdCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICAvLyBzZWxlY3QgaWYgc2VsZWN0aW9uIGVuYWJsZWRcbiAgICAgICAgICAgICAgICBpZiAoJCQuaXNCYXJUeXBlKGNsb3Nlc3QuaWQpIHx8ICQkLmRpc3QoY2xvc2VzdCwgbW91c2UpIDwgY29uZmlnLnBvaW50X3NlbnNpdGl2aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICQkLm1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlcyArICQkLmdldFRhcmdldFNlbGVjdG9yU3VmZml4KGNsb3Nlc3QuaWQpKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1Muc2hhcGUgKyAnLScgKyBjbG9zZXN0LmluZGV4KS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZGF0YV9zZWxlY3Rpb25fZ3JvdXBlZCB8fCAkJC5pc1dpdGhpblNoYXBlKHRoaXMsIGNsb3Nlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQudG9nZ2xlU2hhcGUodGhpcywgY2xvc2VzdCwgY2xvc2VzdC5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQuY29uZmlnLmRhdGFfb25jbGljay5jYWxsKCQkLmFwaSwgY2xvc2VzdCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2FsbChcbiAgICAgICAgICAgICAgICBjb25maWcuZGF0YV9zZWxlY3Rpb25fZHJhZ2dhYmxlICYmICQkLmRyYWcgPyAoXG4gICAgICAgICAgICAgICAgICAgIGQzLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oT2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdkcmFnJywgZnVuY3Rpb24gKCkgeyAkJC5kcmFnKGQzLm1vdXNlKHRoaXMpKTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignZHJhZ3N0YXJ0JywgZnVuY3Rpb24gKCkgeyAkJC5kcmFnc3RhcnQoZDMubW91c2UodGhpcykpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkgeyAkJC5kcmFnZW5kKCk7IH0pXG4gICAgICAgICAgICAgICAgKSA6IGZ1bmN0aW9uICgpIHt9XG4gICAgICAgICAgICApO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uICh0eXBlLCBpbmRleCwgbW91c2UpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIHNlbGVjdG9yID0gJy4nICsgQ0xBU1MuZXZlbnRSZWN0ICsgKCEkJC5pc011bHRpcGxlWCgpID8gJy0nICsgaW5kZXggOiAnJyksXG4gICAgICAgICAgICBldmVudFJlY3QgPSAkJC5tYWluLnNlbGVjdChzZWxlY3Rvcikubm9kZSgpLFxuICAgICAgICAgICAgYm94ID0gZXZlbnRSZWN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgeCA9IGJveC5sZWZ0ICsgKG1vdXNlID8gbW91c2VbMF0gOiAwKSxcbiAgICAgICAgICAgIHkgPSBib3gudG9wICsgKG1vdXNlID8gbW91c2VbMV0gOiAwKSxcbiAgICAgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtcblxuICAgICAgICBldmVudC5pbml0TW91c2VFdmVudCh0eXBlLCB0cnVlLCB0cnVlLCB3aW5kb3csIDAsIHgsIHksIHgsIHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKTtcbiAgICAgICAgZXZlbnRSZWN0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRDdXJyZW50V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5zaXplX3dpZHRoID8gY29uZmlnLnNpemVfd2lkdGggOiAkJC5nZXRQYXJlbnRXaWR0aCgpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0Q3VycmVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgaCA9IGNvbmZpZy5zaXplX2hlaWdodCA/IGNvbmZpZy5zaXplX2hlaWdodCA6ICQkLmdldFBhcmVudEhlaWdodCgpO1xuICAgICAgICByZXR1cm4gaCA+IDAgPyBoIDogMzIwIC8gKCQkLmhhc1R5cGUoJ2dhdWdlJykgJiYgIWNvbmZpZy5nYXVnZV9mdWxsQ2lyY2xlID8gMiA6IDEpOyBcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEN1cnJlbnRQYWRkaW5nVG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgcGFkZGluZyA9IGlzVmFsdWUoY29uZmlnLnBhZGRpbmdfdG9wKSA/IGNvbmZpZy5wYWRkaW5nX3RvcCA6IDA7XG4gICAgICAgIGlmICgkJC50aXRsZSAmJiAkJC50aXRsZS5ub2RlKCkpIHtcbiAgICAgICAgICAgIHBhZGRpbmcgKz0gJCQuZ2V0VGl0bGVQYWRkaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZGRpbmc7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRDdXJyZW50UGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgICAgICByZXR1cm4gaXNWYWx1ZShjb25maWcucGFkZGluZ19ib3R0b20pID8gY29uZmlnLnBhZGRpbmdfYm90dG9tIDogMDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEN1cnJlbnRQYWRkaW5nTGVmdCA9IGZ1bmN0aW9uICh3aXRob3V0UmVjb21wdXRlKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKGlzVmFsdWUoY29uZmlnLnBhZGRpbmdfbGVmdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWcucGFkZGluZ19sZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5heGlzX3JvdGF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAhY29uZmlnLmF4aXNfeF9zaG93ID8gMSA6IE1hdGgubWF4KGNlaWwxMCgkJC5nZXRBeGlzV2lkdGhCeUF4aXNJZCgneCcsIHdpdGhvdXRSZWNvbXB1dGUpKSwgNDApO1xuICAgICAgICB9IGVsc2UgaWYgKCFjb25maWcuYXhpc195X3Nob3cgfHwgY29uZmlnLmF4aXNfeV9pbm5lcikgeyAvLyAmJiAhY29uZmlnLmF4aXNfcm90YXRlZFxuICAgICAgICAgICAgcmV0dXJuICQkLmF4aXMuZ2V0WUF4aXNMYWJlbFBvc2l0aW9uKCkuaXNPdXRlciA/IDMwIDogMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjZWlsMTAoJCQuZ2V0QXhpc1dpZHRoQnlBeGlzSWQoJ3knLCB3aXRob3V0UmVjb21wdXRlKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEN1cnJlbnRQYWRkaW5nUmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGRlZmF1bHRQYWRkaW5nID0gMTAsIGxlZ2VuZFdpZHRoT25SaWdodCA9ICQkLmlzTGVnZW5kUmlnaHQgPyAkJC5nZXRMZWdlbmRXaWR0aCgpICsgMjAgOiAwO1xuICAgICAgICBpZiAoaXNWYWx1ZShjb25maWcucGFkZGluZ19yaWdodCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWcucGFkZGluZ19yaWdodCArIDE7IC8vIDEgaXMgbmVlZGVkIG5vdCB0byBoaWRlIHRpY2sgbGluZVxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5heGlzX3JvdGF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UGFkZGluZyArIGxlZ2VuZFdpZHRoT25SaWdodDtcbiAgICAgICAgfSBlbHNlIGlmICghY29uZmlnLmF4aXNfeTJfc2hvdyB8fCBjb25maWcuYXhpc195Ml9pbm5lcikgeyAvLyAmJiAhY29uZmlnLmF4aXNfcm90YXRlZFxuICAgICAgICAgICAgcmV0dXJuIDIgKyBsZWdlbmRXaWR0aE9uUmlnaHQgKyAoJCQuYXhpcy5nZXRZMkF4aXNMYWJlbFBvc2l0aW9uKCkuaXNPdXRlciA/IDIwIDogMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY2VpbDEwKCQkLmdldEF4aXNXaWR0aEJ5QXhpc0lkKCd5MicpKSArIGxlZ2VuZFdpZHRoT25SaWdodDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRQYXJlbnRSZWN0VmFsdWUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnNlbGVjdENoYXJ0Lm5vZGUoKSwgdjtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQudGFnTmFtZSAhPT0gJ0JPRFknKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHYgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5XTtcbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICd3aWR0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gSUUgaW4gY2VydGFpbiBjYXNlcyBnZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBjYXVzZSBhbiBcInVuc3BlY2lmaWVkIGVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgdiA9IHBhcmVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRQYXJlbnRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyZW50UmVjdFZhbHVlKCd3aWR0aCcpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0UGFyZW50SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaCA9IHRoaXMuc2VsZWN0Q2hhcnQuc3R5bGUoJ2hlaWdodCcpO1xuICAgICAgICByZXR1cm4gaC5pbmRleE9mKCdweCcpID4gMCA/ICtoLnJlcGxhY2UoJ3B4JywgJycpIDogMDtcbiAgICB9O1xuXG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRTdmdMZWZ0ID0gZnVuY3Rpb24gKHdpdGhvdXRSZWNvbXB1dGUpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgaGFzTGVmdEF4aXNSZWN0ID0gY29uZmlnLmF4aXNfcm90YXRlZCB8fCAoIWNvbmZpZy5heGlzX3JvdGF0ZWQgJiYgIWNvbmZpZy5heGlzX3lfaW5uZXIpLFxuICAgICAgICAgICAgbGVmdEF4aXNDbGFzcyA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyBDTEFTUy5heGlzWCA6IENMQVNTLmF4aXNZLFxuICAgICAgICAgICAgbGVmdEF4aXMgPSAkJC5tYWluLnNlbGVjdCgnLicgKyBsZWZ0QXhpc0NsYXNzKS5ub2RlKCksXG4gICAgICAgICAgICBzdmdSZWN0ID0gbGVmdEF4aXMgJiYgaGFzTGVmdEF4aXNSZWN0ID8gbGVmdEF4aXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiB7cmlnaHQ6IDB9LFxuICAgICAgICAgICAgY2hhcnRSZWN0ID0gJCQuc2VsZWN0Q2hhcnQubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgaGFzQXJjID0gJCQuaGFzQXJjVHlwZSgpLFxuICAgICAgICAgICAgc3ZnTGVmdCA9IHN2Z1JlY3QucmlnaHQgLSBjaGFydFJlY3QubGVmdCAtIChoYXNBcmMgPyAwIDogJCQuZ2V0Q3VycmVudFBhZGRpbmdMZWZ0KHdpdGhvdXRSZWNvbXB1dGUpKTtcbiAgICAgICAgcmV0dXJuIHN2Z0xlZnQgPiAwID8gc3ZnTGVmdCA6IDA7XG4gICAgfTtcblxuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0QXhpc1dpZHRoQnlBeGlzSWQgPSBmdW5jdGlvbiAoaWQsIHdpdGhvdXRSZWNvbXB1dGUpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgcG9zaXRpb24gPSAkJC5heGlzLmdldExhYmVsUG9zaXRpb25CeUlkKGlkKTtcbiAgICAgICAgcmV0dXJuICQkLmF4aXMuZ2V0TWF4VGlja1dpZHRoKGlkLCB3aXRob3V0UmVjb21wdXRlKSArIChwb3NpdGlvbi5pc0lubmVyID8gMjAgOiA0MCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRIb3Jpem9udGFsQXhpc0hlaWdodCA9IGZ1bmN0aW9uIChheGlzSWQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCBoID0gMzA7XG4gICAgICAgIGlmIChheGlzSWQgPT09ICd4JyAmJiAhY29uZmlnLmF4aXNfeF9zaG93KSB7IHJldHVybiA4OyB9XG4gICAgICAgIGlmIChheGlzSWQgPT09ICd4JyAmJiBjb25maWcuYXhpc194X2hlaWdodCkgeyByZXR1cm4gY29uZmlnLmF4aXNfeF9oZWlnaHQ7IH1cbiAgICAgICAgaWYgKGF4aXNJZCA9PT0gJ3knICYmICFjb25maWcuYXhpc195X3Nob3cpIHsgXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnLmxlZ2VuZF9zaG93ICYmICEkJC5pc0xlZ2VuZFJpZ2h0ICYmICEkJC5pc0xlZ2VuZEluc2V0ID8gMTAgOiAxOyBcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXhpc0lkID09PSAneTInICYmICFjb25maWcuYXhpc195Ml9zaG93KSB7IHJldHVybiAkJC5yb3RhdGVkX3BhZGRpbmdfdG9wOyB9XG4gICAgICAgIC8vIENhbGN1bGF0ZSB4IGF4aXMgaGVpZ2h0IHdoZW4gdGljayByb3RhdGVkXG4gICAgICAgIGlmIChheGlzSWQgPT09ICd4JyAmJiAhY29uZmlnLmF4aXNfcm90YXRlZCAmJiBjb25maWcuYXhpc194X3RpY2tfcm90YXRlKSB7XG4gICAgICAgICAgICBoID0gMzAgKyAkJC5heGlzLmdldE1heFRpY2tXaWR0aChheGlzSWQpICogTWF0aC5jb3MoTWF0aC5QSSAqICg5MCAtIGNvbmZpZy5heGlzX3hfdGlja19yb3RhdGUpIC8gMTgwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxjdWxhdGUgeSBheGlzIGhlaWdodCB3aGVuIHRpY2sgcm90YXRlZFxuICAgICAgICBpZiAoYXhpc0lkID09PSAneScgJiYgY29uZmlnLmF4aXNfcm90YXRlZCAmJiBjb25maWcuYXhpc195X3RpY2tfcm90YXRlKSB7XG4gICAgICAgICAgICBoID0gMzAgKyAkJC5heGlzLmdldE1heFRpY2tXaWR0aChheGlzSWQpICogTWF0aC5jb3MoTWF0aC5QSSAqICg5MCAtIGNvbmZpZy5heGlzX3lfdGlja19yb3RhdGUpIC8gMTgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaCArICgkJC5heGlzLmdldExhYmVsUG9zaXRpb25CeUlkKGF4aXNJZCkuaXNJbm5lciA/IDAgOiAxMCkgKyAoYXhpc0lkID09PSAneTInID8gLTEwIDogMCk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEV2ZW50UmVjdFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy54QXhpcy50aWNrSW50ZXJ2YWwoKSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFNoYXBlSW5kaWNlcyA9IGZ1bmN0aW9uICh0eXBlRmlsdGVyKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGluZGljZXMgPSB7fSwgaSA9IDAsIGosIGs7XG4gICAgICAgICQkLmZpbHRlclRhcmdldHNUb1Nob3coJCQuZGF0YS50YXJnZXRzLmZpbHRlcih0eXBlRmlsdGVyLCAkJCkpLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb25maWcuZGF0YV9ncm91cHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRhdGFfZ3JvdXBzW2pdLmluZGV4T2YoZC5pZCkgPCAwKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGNvbmZpZy5kYXRhX2dyb3Vwc1tqXS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRhdGFfZ3JvdXBzW2pdW2tdIGluIGluZGljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbZC5pZF0gPSBpbmRpY2VzW2NvbmZpZy5kYXRhX2dyb3Vwc1tqXVtrXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChpbmRpY2VzW2QuaWRdKSkgeyBpbmRpY2VzW2QuaWRdID0gaSsrOyB9XG4gICAgICAgIH0pO1xuICAgICAgICBpbmRpY2VzLl9fbWF4X18gPSBpIC0gMTtcbiAgICAgICAgcmV0dXJuIGluZGljZXM7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRTaGFwZVggPSBmdW5jdGlvbiAob2Zmc2V0LCB0YXJnZXRzTnVtLCBpbmRpY2VzLCBpc1N1Yikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBzY2FsZSA9IGlzU3ViID8gJCQuc3ViWCA6ICQkLng7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gZC5pZCBpbiBpbmRpY2VzID8gaW5kaWNlc1tkLmlkXSA6IDA7XG4gICAgICAgICAgICByZXR1cm4gZC54IHx8IGQueCA9PT0gMCA/IHNjYWxlKGQueCkgLSBvZmZzZXQgKiAodGFyZ2V0c051bSAvIDIgLSBpbmRleCkgOiAwO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0U2hhcGVZID0gZnVuY3Rpb24gKGlzU3ViKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgdmFyIHNjYWxlID0gaXNTdWIgPyAkJC5nZXRTdWJZU2NhbGUoZC5pZCkgOiAkJC5nZXRZU2NhbGUoZC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gc2NhbGUoZC52YWx1ZSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRTaGFwZU9mZnNldCA9IGZ1bmN0aW9uICh0eXBlRmlsdGVyLCBpbmRpY2VzLCBpc1N1Yikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgdGFyZ2V0cyA9ICQkLm9yZGVyVGFyZ2V0cygkJC5maWx0ZXJUYXJnZXRzVG9TaG93KCQkLmRhdGEudGFyZ2V0cy5maWx0ZXIodHlwZUZpbHRlciwgJCQpKSksXG4gICAgICAgICAgICB0YXJnZXRJZHMgPSB0YXJnZXRzLm1hcChmdW5jdGlvbiAodCkgeyByZXR1cm4gdC5pZDsgfSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgICAgdmFyIHNjYWxlID0gaXNTdWIgPyAkJC5nZXRTdWJZU2NhbGUoZC5pZCkgOiAkJC5nZXRZU2NhbGUoZC5pZCksXG4gICAgICAgICAgICAgICAgeTAgPSBzY2FsZSgwKSwgb2Zmc2V0ID0geTA7XG4gICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gJCQuaXNTdGVwVHlwZShkKSA/ICQkLmNvbnZlcnRWYWx1ZXNUb1N0ZXAodC52YWx1ZXMpIDogdC52YWx1ZXM7XG4gICAgICAgICAgICAgICAgaWYgKHQuaWQgPT09IGQuaWQgfHwgaW5kaWNlc1t0LmlkXSAhPT0gaW5kaWNlc1tkLmlkXSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SWRzLmluZGV4T2YodC5pZCkgPCB0YXJnZXRJZHMuaW5kZXhPZihkLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgeCB2YWx1ZXMgbGluZSB1cFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlc1tpXSA9PT0gJ3VuZGVmaW5lZCcgfHwgK3ZhbHVlc1tpXS54ICE9PSArZC54KSB7ICAvLyBcIitcIiBmb3IgdGltZXNlcmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90LCB0cnkgdG8gZmluZCB0aGUgdmFsdWUgdGhhdCBkb2VzIGxpbmUgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2LCBqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYueCA9PT0gZC54KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpIGluIHZhbHVlcyAmJiB2YWx1ZXNbaV0udmFsdWUgKiBkLnZhbHVlID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBzY2FsZSh2YWx1ZXNbaV0udmFsdWUpIC0geTA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc1dpdGhpblNoYXBlID0gZnVuY3Rpb24gKHRoYXQsIGQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIHNoYXBlID0gJCQuZDMuc2VsZWN0KHRoYXQpLCBpc1dpdGhpbjtcbiAgICAgICAgaWYgKCEkJC5pc1RhcmdldFRvU2hvdyhkLmlkKSkge1xuICAgICAgICAgICAgaXNXaXRoaW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGF0Lm5vZGVOYW1lID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgaXNXaXRoaW4gPSAkJC5pc1N0ZXBUeXBlKGQpID8gJCQuaXNXaXRoaW5TdGVwKHRoYXQsICQkLmdldFlTY2FsZShkLmlkKShkLnZhbHVlKSkgOiAkJC5pc1dpdGhpbkNpcmNsZSh0aGF0LCAkJC5wb2ludFNlbGVjdFIoZCkgKiAxLjUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoYXQubm9kZU5hbWUgPT09ICdwYXRoJykge1xuICAgICAgICAgICAgaXNXaXRoaW4gPSBzaGFwZS5jbGFzc2VkKENMQVNTLmJhcikgPyAkJC5pc1dpdGhpbkJhcih0aGF0KSA6IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzV2l0aGluO1xuICAgIH07XG5cblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEludGVycG9sYXRlID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSAkJC5pc0ludGVycG9sYXRpb25UeXBlKCQkLmNvbmZpZy5zcGxpbmVfaW50ZXJwb2xhdGlvbl90eXBlKSA/ICQkLmNvbmZpZy5zcGxpbmVfaW50ZXJwb2xhdGlvbl90eXBlIDogJ2NhcmRpbmFsJztcbiAgICAgICAgcmV0dXJuICQkLmlzU3BsaW5lVHlwZShkKSA/IGludGVycG9sYXRpb24gOiAkJC5pc1N0ZXBUeXBlKGQpID8gJCQuY29uZmlnLmxpbmVfc3RlcF90eXBlIDogXCJsaW5lYXJcIjtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdExpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLm1haW4uc2VsZWN0KCcuJyArIENMQVNTLmNoYXJ0KS5hcHBlbmQoXCJnXCIpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmNoYXJ0TGluZXMpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlVGFyZ2V0c0ZvckxpbmUgPSBmdW5jdGlvbiAodGFyZ2V0cykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBtYWluTGluZVVwZGF0ZSwgbWFpbkxpbmVFbnRlcixcbiAgICAgICAgICAgIGNsYXNzQ2hhcnRMaW5lID0gJCQuY2xhc3NDaGFydExpbmUuYmluZCgkJCksXG4gICAgICAgICAgICBjbGFzc0xpbmVzID0gJCQuY2xhc3NMaW5lcy5iaW5kKCQkKSxcbiAgICAgICAgICAgIGNsYXNzQXJlYXMgPSAkJC5jbGFzc0FyZWFzLmJpbmQoJCQpLFxuICAgICAgICAgICAgY2xhc3NDaXJjbGVzID0gJCQuY2xhc3NDaXJjbGVzLmJpbmQoJCQpLFxuICAgICAgICAgICAgY2xhc3NGb2N1cyA9ICQkLmNsYXNzRm9jdXMuYmluZCgkJCk7XG4gICAgICAgIG1haW5MaW5lVXBkYXRlID0gJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuY2hhcnRMaW5lcykuc2VsZWN0QWxsKCcuJyArIENMQVNTLmNoYXJ0TGluZSlcbiAgICAgICAgICAgIC5kYXRhKHRhcmdldHMpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gY2xhc3NDaGFydExpbmUoZCkgKyBjbGFzc0ZvY3VzKGQpOyB9KTtcbiAgICAgICAgbWFpbkxpbmVFbnRlciA9IG1haW5MaW5lVXBkYXRlLmVudGVyKCkuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGNsYXNzQ2hhcnRMaW5lKVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAgIC5zdHlsZShcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcbiAgICAgICAgLy8gTGluZXMgZm9yIGVhY2ggZGF0YVxuICAgICAgICBtYWluTGluZUVudGVyLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIGNsYXNzTGluZXMpO1xuICAgICAgICAvLyBBcmVhc1xuICAgICAgICBtYWluTGluZUVudGVyLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBjbGFzc0FyZWFzKTtcbiAgICAgICAgLy8gQ2lyY2xlcyBmb3IgZWFjaCBkYXRhIHBvaW50IG9uIGxpbmVzXG4gICAgICAgIG1haW5MaW5lRW50ZXIuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuICQkLmdlbmVyYXRlQ2xhc3MoQ0xBU1Muc2VsZWN0ZWRDaXJjbGVzLCBkLmlkKTsgfSk7XG4gICAgICAgIG1haW5MaW5lRW50ZXIuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgY2xhc3NDaXJjbGVzKVxuICAgICAgICAgICAgLnN0eWxlKFwiY3Vyc29yXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBjb25maWcuZGF0YV9zZWxlY3Rpb25faXNzZWxlY3RhYmxlKGQpID8gXCJwb2ludGVyXCIgOiBudWxsOyB9KTtcbiAgICAgICAgLy8gVXBkYXRlIGRhdGUgZm9yIHNlbGVjdGVkIGNpcmNsZXNcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5zZWxlY3RlZENpcmNsZXMgKyAkJC5nZXRUYXJnZXRTZWxlY3RvclN1ZmZpeCh0LmlkKSkuc2VsZWN0QWxsKCcuJyArIENMQVNTLnNlbGVjdGVkQ2lyY2xlKS5lYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgZC52YWx1ZSA9IHQudmFsdWVzW2QuaW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBNRU1POiBjYW4gbm90IGtlZXAgc2FtZSBjb2xvci4uLlxuICAgICAgICAvL21haW5MaW5lVXBkYXRlLmV4aXQoKS5yZW1vdmUoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUxpbmUgPSBmdW5jdGlvbiAoZHVyYXRpb25Gb3JFeGl0KSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLm1haW5MaW5lID0gJCQubWFpbi5zZWxlY3RBbGwoJy4nICsgQ0xBU1MubGluZXMpLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5saW5lKVxuICAgICAgICAgICAgLmRhdGEoJCQubGluZURhdGEuYmluZCgkJCkpO1xuICAgICAgICAkJC5tYWluTGluZS5lbnRlcigpLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAkJC5jbGFzc0xpbmUuYmluZCgkJCkpXG4gICAgICAgICAgICAuc3R5bGUoXCJzdHJva2VcIiwgJCQuY29sb3IpO1xuICAgICAgICAkJC5tYWluTGluZVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAkJC5pbml0aWFsT3BhY2l0eS5iaW5kKCQkKSlcbiAgICAgICAgICAgIC5zdHlsZSgnc2hhcGUtcmVuZGVyaW5nJywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuICQkLmlzU3RlcFR5cGUoZCkgPyAnY3Jpc3BFZGdlcycgOiAnJzsgfSlcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKTtcbiAgICAgICAgJCQubWFpbkxpbmUuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbkZvckV4aXQpXG4gICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAgICAgLnJlbW92ZSgpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucmVkcmF3TGluZSA9IGZ1bmN0aW9uIChkcmF3TGluZSwgd2l0aFRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICh3aXRoVHJhbnNpdGlvbiA/IHRoaXMubWFpbkxpbmUudHJhbnNpdGlvbihNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkpIDogdGhpcy5tYWluTGluZSlcbiAgICAgICAgICAgICAgICAuYXR0cihcImRcIiwgZHJhd0xpbmUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAxKVxuICAgICAgICBdO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2VuZXJhdGVEcmF3TGluZSA9IGZ1bmN0aW9uIChsaW5lSW5kaWNlcywgaXNTdWIpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgbGluZSA9ICQkLmQzLnN2Zy5saW5lKCksXG4gICAgICAgICAgICBnZXRQb2ludHMgPSAkJC5nZW5lcmF0ZUdldExpbmVQb2ludHMobGluZUluZGljZXMsIGlzU3ViKSxcbiAgICAgICAgICAgIHlTY2FsZUdldHRlciA9IGlzU3ViID8gJCQuZ2V0U3ViWVNjYWxlIDogJCQuZ2V0WVNjYWxlLFxuICAgICAgICAgICAgeFZhbHVlID0gZnVuY3Rpb24gKGQpIHsgcmV0dXJuIChpc1N1YiA/ICQkLnN1Ynh4IDogJCQueHgpLmNhbGwoJCQsIGQpOyB9LFxuICAgICAgICAgICAgeVZhbHVlID0gZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLmRhdGFfZ3JvdXBzLmxlbmd0aCA+IDAgPyBnZXRQb2ludHMoZCwgaSlbMF1bMV0gOiB5U2NhbGVHZXR0ZXIuY2FsbCgkJCwgZC5pZCkoZC52YWx1ZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGxpbmUgPSBjb25maWcuYXhpc19yb3RhdGVkID8gbGluZS54KHlWYWx1ZSkueSh4VmFsdWUpIDogbGluZS54KHhWYWx1ZSkueSh5VmFsdWUpO1xuICAgICAgICBpZiAoIWNvbmZpZy5saW5lX2Nvbm5lY3ROdWxsKSB7IGxpbmUgPSBsaW5lLmRlZmluZWQoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQudmFsdWUgIT0gbnVsbDsgfSk7IH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gY29uZmlnLmxpbmVfY29ubmVjdE51bGwgPyAkJC5maWx0ZXJSZW1vdmVOdWxsKGQudmFsdWVzKSA6IGQudmFsdWVzLFxuICAgICAgICAgICAgICAgIHggPSBpc1N1YiA/ICQkLnggOiAkJC5zdWJYLCB5ID0geVNjYWxlR2V0dGVyLmNhbGwoJCQsIGQuaWQpLCB4MCA9IDAsIHkwID0gMCwgcGF0aDtcbiAgICAgICAgICAgIGlmICgkJC5pc0xpbmVUeXBlKGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5kYXRhX3JlZ2lvbnNbZC5pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICQkLmxpbmVXaXRoUmVnaW9ucyh2YWx1ZXMsIHgsIHksIGNvbmZpZy5kYXRhX3JlZ2lvbnNbZC5pZF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkJC5pc1N0ZXBUeXBlKGQpKSB7IHZhbHVlcyA9ICQkLmNvbnZlcnRWYWx1ZXNUb1N0ZXAodmFsdWVzKTsgfVxuICAgICAgICAgICAgICAgICAgICBwYXRoID0gbGluZS5pbnRlcnBvbGF0ZSgkJC5nZXRJbnRlcnBvbGF0ZShkKSkodmFsdWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgeDAgPSB4KHZhbHVlc1swXS54KTtcbiAgICAgICAgICAgICAgICAgICAgeTAgPSB5KHZhbHVlc1swXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhdGggPSBjb25maWcuYXhpc19yb3RhdGVkID8gXCJNIFwiICsgeTAgKyBcIiBcIiArIHgwIDogXCJNIFwiICsgeDAgKyBcIiBcIiArIHkwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhdGggPyBwYXRoIDogXCJNIDAgMFwiO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2VuZXJhdGVHZXRMaW5lUG9pbnRzID0gZnVuY3Rpb24gKGxpbmVJbmRpY2VzLCBpc1N1YikgeyAvLyBwYXJ0aWFsIGR1cGxpY2F0aW9uIG9mIGdlbmVyYXRlR2V0QmFyUG9pbnRzXG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGxpbmVUYXJnZXRzTnVtID0gbGluZUluZGljZXMuX19tYXhfXyArIDEsXG4gICAgICAgICAgICB4ID0gJCQuZ2V0U2hhcGVYKDAsIGxpbmVUYXJnZXRzTnVtLCBsaW5lSW5kaWNlcywgISFpc1N1YiksXG4gICAgICAgICAgICB5ID0gJCQuZ2V0U2hhcGVZKCEhaXNTdWIpLFxuICAgICAgICAgICAgbGluZU9mZnNldCA9ICQkLmdldFNoYXBlT2Zmc2V0KCQkLmlzTGluZVR5cGUsIGxpbmVJbmRpY2VzLCAhIWlzU3ViKSxcbiAgICAgICAgICAgIHlTY2FsZSA9IGlzU3ViID8gJCQuZ2V0U3ViWVNjYWxlIDogJCQuZ2V0WVNjYWxlO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIHZhciB5MCA9IHlTY2FsZS5jYWxsKCQkLCBkLmlkKSgwKSxcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsaW5lT2Zmc2V0KGQsIGkpIHx8IHkwLCAvLyBvZmZzZXQgaXMgZm9yIHN0YWNrZWQgYXJlYSBjaGFydFxuICAgICAgICAgICAgICAgIHBvc1ggPSB4KGQpLCBwb3NZID0geShkKTtcbiAgICAgICAgICAgIC8vIGZpeCBwb3NZIG5vdCB0byBvdmVyZmxvdyBvcHBvc2l0ZSBxdWFkcmFudFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5heGlzX3JvdGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoKDAgPCBkLnZhbHVlICYmIHBvc1kgPCB5MCkgfHwgKGQudmFsdWUgPCAwICYmIHkwIDwgcG9zWSkpIHsgcG9zWSA9IHkwOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAxIHBvaW50IHRoYXQgbWFya3MgdGhlIGxpbmUgcG9zaXRpb25cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgW3Bvc1gsIHBvc1kgLSAoeTAgLSBvZmZzZXQpXSxcbiAgICAgICAgICAgICAgICBbcG9zWCwgcG9zWSAtICh5MCAtIG9mZnNldCldLCAvLyBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBbcG9zWCwgcG9zWSAtICh5MCAtIG9mZnNldCldLCAvLyBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBbcG9zWCwgcG9zWSAtICh5MCAtIG9mZnNldCldICAvLyBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH07XG4gICAgfTtcblxuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ubGluZVdpdGhSZWdpb25zID0gZnVuY3Rpb24gKGQsIHgsIHksIF9yZWdpb25zKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIHByZXYgPSAtMSwgaSwgaixcbiAgICAgICAgICAgIHMgPSBcIk1cIiwgc1dpdGhSZWdpb24sXG4gICAgICAgICAgICB4cCwgeXAsIGR4LCBkeSwgZGQsIGRpZmYsIGRpZmZ4MixcbiAgICAgICAgICAgIHhPZmZzZXQgPSAkJC5pc0NhdGVnb3JpemVkKCkgPyAwLjUgOiAwLFxuICAgICAgICAgICAgeFZhbHVlLCB5VmFsdWUsXG4gICAgICAgICAgICByZWdpb25zID0gW107XG5cbiAgICAgICAgZnVuY3Rpb24gaXNXaXRoaW5SZWdpb25zKHgsIHJlZ2lvbnMpIHtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocmVnaW9uc1tpXS5zdGFydCA8IHggJiYgeCA8PSByZWdpb25zW2ldLmVuZCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgc3RhcnQvZW5kIG9mIHJlZ2lvbnNcbiAgICAgICAgaWYgKGlzRGVmaW5lZChfcmVnaW9ucykpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBfcmVnaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlZ2lvbnNbaV0gPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoX3JlZ2lvbnNbaV0uc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbnNbaV0uc3RhcnQgPSBkWzBdLng7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uc1tpXS5zdGFydCA9ICQkLmlzVGltZVNlcmllcygpID8gJCQucGFyc2VEYXRlKF9yZWdpb25zW2ldLnN0YXJ0KSA6IF9yZWdpb25zW2ldLnN0YXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoX3JlZ2lvbnNbaV0uZW5kKSkge1xuICAgICAgICAgICAgICAgICAgICByZWdpb25zW2ldLmVuZCA9IGRbZC5sZW5ndGggLSAxXS54O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbnNbaV0uZW5kID0gJCQuaXNUaW1lU2VyaWVzKCkgPyAkJC5wYXJzZURhdGUoX3JlZ2lvbnNbaV0uZW5kKSA6IF9yZWdpb25zW2ldLmVuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgc2NhbGVzXG4gICAgICAgIHhWYWx1ZSA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyBmdW5jdGlvbiAoZCkgeyByZXR1cm4geShkLnZhbHVlKTsgfSA6IGZ1bmN0aW9uIChkKSB7IHJldHVybiB4KGQueCk7IH07XG4gICAgICAgIHlWYWx1ZSA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyBmdW5jdGlvbiAoZCkgeyByZXR1cm4geChkLngpOyB9IDogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHkoZC52YWx1ZSk7IH07XG5cbiAgICAgICAgLy8gRGVmaW5lIHN2ZyBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIHJlZ2lvblxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZU0ocG9pbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ00nICsgcG9pbnRzWzBdWzBdICsgJyAnICsgcG9pbnRzWzBdWzFdICsgJyAnICsgcG9pbnRzWzFdWzBdICsgJyAnICsgcG9pbnRzWzFdWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkJC5pc1RpbWVTZXJpZXMoKSkge1xuICAgICAgICAgICAgc1dpdGhSZWdpb24gPSBmdW5jdGlvbiAoZDAsIGQxLCBqLCBkaWZmKSB7XG4gICAgICAgICAgICAgICAgdmFyIHgwID0gZDAueC5nZXRUaW1lKCksIHhfZGlmZiA9IGQxLnggLSBkMC54LFxuICAgICAgICAgICAgICAgICAgICB4djAgPSBuZXcgRGF0ZSh4MCArIHhfZGlmZiAqIGopLFxuICAgICAgICAgICAgICAgICAgICB4djEgPSBuZXcgRGF0ZSh4MCArIHhfZGlmZiAqIChqICsgZGlmZikpLFxuICAgICAgICAgICAgICAgICAgICBwb2ludHM7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5heGlzX3JvdGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gW1t5KHlwKGopKSwgeCh4djApXSwgW3koeXAoaiArIGRpZmYpKSwgeCh4djEpXV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gW1t4KHh2MCksIHkoeXAoaikpXSwgW3goeHYxKSwgeSh5cChqICsgZGlmZikpXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZU0ocG9pbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzV2l0aFJlZ2lvbiA9IGZ1bmN0aW9uIChkMCwgZDEsIGosIGRpZmYpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRzO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXhpc19yb3RhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IFtbeSh5cChqKSwgdHJ1ZSksIHgoeHAoaikpXSwgW3koeXAoaiArIGRpZmYpLCB0cnVlKSwgeCh4cChqICsgZGlmZikpXV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gW1t4KHhwKGopLCB0cnVlKSwgeSh5cChqKSldLCBbeCh4cChqICsgZGlmZiksIHRydWUpLCB5KHlwKGogKyBkaWZmKSldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlTShwb2ludHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIC8vIERyYXcgYXMgbm9ybWFsXG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQocmVnaW9ucykgfHwgISBpc1dpdGhpblJlZ2lvbnMoZFtpXS54LCByZWdpb25zKSkge1xuICAgICAgICAgICAgICAgIHMgKz0gXCIgXCIgKyB4VmFsdWUoZFtpXSkgKyBcIiBcIiArIHlWYWx1ZShkW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERyYXcgd2l0aCByZWdpb24gLy8gVE9ETzogRml4IGZvciBob3Jpem90YWwgY2hhcnRzXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4cCA9ICQkLmdldFNjYWxlKGRbaSAtIDFdLnggKyB4T2Zmc2V0LCBkW2ldLnggKyB4T2Zmc2V0LCAkJC5pc1RpbWVTZXJpZXMoKSk7XG4gICAgICAgICAgICAgICAgeXAgPSAkJC5nZXRTY2FsZShkW2kgLSAxXS52YWx1ZSwgZFtpXS52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICBkeCA9IHgoZFtpXS54KSAtIHgoZFtpIC0gMV0ueCk7XG4gICAgICAgICAgICAgICAgZHkgPSB5KGRbaV0udmFsdWUpIC0geShkW2kgLSAxXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgZGQgPSBNYXRoLnNxcnQoTWF0aC5wb3coZHgsIDIpICsgTWF0aC5wb3coZHksIDIpKTtcbiAgICAgICAgICAgICAgICBkaWZmID0gMiAvIGRkO1xuICAgICAgICAgICAgICAgIGRpZmZ4MiA9IGRpZmYgKiAyO1xuXG4gICAgICAgICAgICAgICAgZm9yIChqID0gZGlmZjsgaiA8PSAxOyBqICs9IGRpZmZ4Mikge1xuICAgICAgICAgICAgICAgICAgICBzICs9IHNXaXRoUmVnaW9uKGRbaSAtIDFdLCBkW2ldLCBqLCBkaWZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gZFtpXS54O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfTtcblxuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlQXJlYSA9IGZ1bmN0aW9uIChkdXJhdGlvbkZvckV4aXQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgZDMgPSAkJC5kMztcbiAgICAgICAgJCQubWFpbkFyZWEgPSAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5hcmVhcykuc2VsZWN0QWxsKCcuJyArIENMQVNTLmFyZWEpXG4gICAgICAgICAgICAuZGF0YSgkJC5saW5lRGF0YS5iaW5kKCQkKSk7XG4gICAgICAgICQkLm1haW5BcmVhLmVudGVyKCkuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgJCQuY2xhc3NBcmVhLmJpbmQoJCQpKVxuICAgICAgICAgICAgLnN0eWxlKFwiZmlsbFwiLCAkJC5jb2xvcilcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgZnVuY3Rpb24gKCkgeyAkJC5vcmdBcmVhT3BhY2l0eSA9ICtkMy5zZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknKTsgcmV0dXJuIDA7IH0pO1xuICAgICAgICAkJC5tYWluQXJlYVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAkJC5vcmdBcmVhT3BhY2l0eSk7XG4gICAgICAgICQkLm1haW5BcmVhLmV4aXQoKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb25Gb3JFeGl0KVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlZHJhd0FyZWEgPSBmdW5jdGlvbiAoZHJhd0FyZWEsIHdpdGhUcmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAod2l0aFRyYW5zaXRpb24gPyB0aGlzLm1haW5BcmVhLnRyYW5zaXRpb24oTWF0aC5yYW5kb20oKS50b1N0cmluZygpKSA6IHRoaXMubWFpbkFyZWEpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJkXCIsIGRyYXdBcmVhKVxuICAgICAgICAgICAgICAgIC5zdHlsZShcImZpbGxcIiwgdGhpcy5jb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIHRoaXMub3JnQXJlYU9wYWNpdHkpXG4gICAgICAgIF07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZW5lcmF0ZURyYXdBcmVhID0gZnVuY3Rpb24gKGFyZWFJbmRpY2VzLCBpc1N1Yikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsIGFyZWEgPSAkJC5kMy5zdmcuYXJlYSgpLFxuICAgICAgICAgICAgZ2V0UG9pbnRzID0gJCQuZ2VuZXJhdGVHZXRBcmVhUG9pbnRzKGFyZWFJbmRpY2VzLCBpc1N1YiksXG4gICAgICAgICAgICB5U2NhbGVHZXR0ZXIgPSBpc1N1YiA/ICQkLmdldFN1YllTY2FsZSA6ICQkLmdldFlTY2FsZSxcbiAgICAgICAgICAgIHhWYWx1ZSA9IGZ1bmN0aW9uIChkKSB7IHJldHVybiAoaXNTdWIgPyAkJC5zdWJ4eCA6ICQkLnh4KS5jYWxsKCQkLCBkKTsgfSxcbiAgICAgICAgICAgIHZhbHVlMCA9IGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5kYXRhX2dyb3Vwcy5sZW5ndGggPiAwID8gZ2V0UG9pbnRzKGQsIGkpWzBdWzFdIDogeVNjYWxlR2V0dGVyLmNhbGwoJCQsIGQuaWQpKCQkLmdldEFyZWFCYXNlVmFsdWUoZC5pZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZhbHVlMSA9IGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5kYXRhX2dyb3Vwcy5sZW5ndGggPiAwID8gZ2V0UG9pbnRzKGQsIGkpWzFdWzFdIDogeVNjYWxlR2V0dGVyLmNhbGwoJCQsIGQuaWQpKGQudmFsdWUpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBhcmVhID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IGFyZWEueDAodmFsdWUwKS54MSh2YWx1ZTEpLnkoeFZhbHVlKSA6IGFyZWEueCh4VmFsdWUpLnkwKGNvbmZpZy5hcmVhX2Fib3ZlID8gMCA6IHZhbHVlMCkueTEodmFsdWUxKTtcbiAgICAgICAgaWYgKCFjb25maWcubGluZV9jb25uZWN0TnVsbCkge1xuICAgICAgICAgICAgYXJlYSA9IGFyZWEuZGVmaW5lZChmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC52YWx1ZSAhPT0gbnVsbDsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBjb25maWcubGluZV9jb25uZWN0TnVsbCA/ICQkLmZpbHRlclJlbW92ZU51bGwoZC52YWx1ZXMpIDogZC52YWx1ZXMsXG4gICAgICAgICAgICAgICAgeDAgPSAwLCB5MCA9IDAsIHBhdGg7XG4gICAgICAgICAgICBpZiAoJCQuaXNBcmVhVHlwZShkKSkge1xuICAgICAgICAgICAgICAgIGlmICgkJC5pc1N0ZXBUeXBlKGQpKSB7IHZhbHVlcyA9ICQkLmNvbnZlcnRWYWx1ZXNUb1N0ZXAodmFsdWVzKTsgfVxuICAgICAgICAgICAgICAgIHBhdGggPSBhcmVhLmludGVycG9sYXRlKCQkLmdldEludGVycG9sYXRlKGQpKSh2YWx1ZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIHgwID0gJCQueCh2YWx1ZXNbMF0ueCk7XG4gICAgICAgICAgICAgICAgICAgIHkwID0gJCQuZ2V0WVNjYWxlKGQuaWQpKHZhbHVlc1swXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhdGggPSBjb25maWcuYXhpc19yb3RhdGVkID8gXCJNIFwiICsgeTAgKyBcIiBcIiArIHgwIDogXCJNIFwiICsgeDAgKyBcIiBcIiArIHkwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhdGggPyBwYXRoIDogXCJNIDAgMFwiO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0QXJlYUJhc2VWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZW5lcmF0ZUdldEFyZWFQb2ludHMgPSBmdW5jdGlvbiAoYXJlYUluZGljZXMsIGlzU3ViKSB7IC8vIHBhcnRpYWwgZHVwbGljYXRpb24gb2YgZ2VuZXJhdGVHZXRCYXJQb2ludHNcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgYXJlYVRhcmdldHNOdW0gPSBhcmVhSW5kaWNlcy5fX21heF9fICsgMSxcbiAgICAgICAgICAgIHggPSAkJC5nZXRTaGFwZVgoMCwgYXJlYVRhcmdldHNOdW0sIGFyZWFJbmRpY2VzLCAhIWlzU3ViKSxcbiAgICAgICAgICAgIHkgPSAkJC5nZXRTaGFwZVkoISFpc1N1YiksXG4gICAgICAgICAgICBhcmVhT2Zmc2V0ID0gJCQuZ2V0U2hhcGVPZmZzZXQoJCQuaXNBcmVhVHlwZSwgYXJlYUluZGljZXMsICEhaXNTdWIpLFxuICAgICAgICAgICAgeVNjYWxlID0gaXNTdWIgPyAkJC5nZXRTdWJZU2NhbGUgOiAkJC5nZXRZU2NhbGU7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgICAgdmFyIHkwID0geVNjYWxlLmNhbGwoJCQsIGQuaWQpKDApLFxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGFyZWFPZmZzZXQoZCwgaSkgfHwgeTAsIC8vIG9mZnNldCBpcyBmb3Igc3RhY2tlZCBhcmVhIGNoYXJ0XG4gICAgICAgICAgICAgICAgcG9zWCA9IHgoZCksIHBvc1kgPSB5KGQpO1xuICAgICAgICAgICAgLy8gZml4IHBvc1kgbm90IHRvIG92ZXJmbG93IG9wcG9zaXRlIHF1YWRyYW50XG4gICAgICAgICAgICBpZiAoY29uZmlnLmF4aXNfcm90YXRlZCkge1xuICAgICAgICAgICAgICAgIGlmICgoMCA8IGQudmFsdWUgJiYgcG9zWSA8IHkwKSB8fCAoZC52YWx1ZSA8IDAgJiYgeTAgPCBwb3NZKSkgeyBwb3NZID0geTA7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDEgcG9pbnQgdGhhdCBtYXJrcyB0aGUgYXJlYSBwb3NpdGlvblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBbcG9zWCwgb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICBbcG9zWCwgcG9zWSAtICh5MCAtIG9mZnNldCldLFxuICAgICAgICAgICAgICAgIFtwb3NYLCBwb3NZIC0gKHkwIC0gb2Zmc2V0KV0sIC8vIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgIFtwb3NYLCBvZmZzZXRdIC8vIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVDaXJjbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLm1haW5DaXJjbGUgPSAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5jaXJjbGVzKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MuY2lyY2xlKVxuICAgICAgICAgICAgLmRhdGEoJCQubGluZU9yU2NhdHRlckRhdGEuYmluZCgkJCkpO1xuICAgICAgICAkJC5tYWluQ2lyY2xlLmVudGVyKCkuYXBwZW5kKFwiY2lyY2xlXCIpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsICQkLmNsYXNzQ2lyY2xlLmJpbmQoJCQpKVxuICAgICAgICAgICAgLmF0dHIoXCJyXCIsICQkLnBvaW50Ui5iaW5kKCQkKSlcbiAgICAgICAgICAgIC5zdHlsZShcImZpbGxcIiwgJCQuY29sb3IpO1xuICAgICAgICAkJC5tYWluQ2lyY2xlXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsICQkLmluaXRpYWxPcGFjaXR5Rm9yQ2lyY2xlLmJpbmQoJCQpKTtcbiAgICAgICAgJCQubWFpbkNpcmNsZS5leGl0KCkucmVtb3ZlKCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWRyYXdDaXJjbGUgPSBmdW5jdGlvbiAoY3gsIGN5LCB3aXRoVHJhbnNpdGlvbikge1xuICAgICAgICB2YXIgc2VsZWN0ZWRDaXJjbGVzID0gdGhpcy5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5zZWxlY3RlZENpcmNsZSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAod2l0aFRyYW5zaXRpb24gPyB0aGlzLm1haW5DaXJjbGUudHJhbnNpdGlvbihNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkpIDogdGhpcy5tYWluQ2lyY2xlKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIHRoaXMub3BhY2l0eUZvckNpcmNsZS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgIC5zdHlsZShcImZpbGxcIiwgdGhpcy5jb2xvcilcbiAgICAgICAgICAgICAgICAuYXR0cihcImN4XCIsIGN4KVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiY3lcIiwgY3kpLFxuICAgICAgICAgICAgKHdpdGhUcmFuc2l0aW9uID8gc2VsZWN0ZWRDaXJjbGVzLnRyYW5zaXRpb24oTWF0aC5yYW5kb20oKS50b1N0cmluZygpKSA6IHNlbGVjdGVkQ2lyY2xlcylcbiAgICAgICAgICAgICAgICAuYXR0cihcImN4XCIsIGN4KVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiY3lcIiwgY3kpXG4gICAgICAgIF07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jaXJjbGVYID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQueCB8fCBkLnggPT09IDAgPyB0aGlzLngoZC54KSA6IG51bGw7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVDaXJjbGVZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBsaW5lSW5kaWNlcywgZ2V0UG9pbnRzO1xuICAgICAgICBpZiAoJCQuY29uZmlnLmRhdGFfZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxpbmVJbmRpY2VzID0gJCQuZ2V0U2hhcGVJbmRpY2VzKCQkLmlzTGluZVR5cGUpLFxuICAgICAgICAgICAgZ2V0UG9pbnRzID0gJCQuZ2VuZXJhdGVHZXRMaW5lUG9pbnRzKGxpbmVJbmRpY2VzKTtcbiAgICAgICAgICAgICQkLmNpcmNsZVkgPSBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQb2ludHMoZCwgaSlbMF1bMV07XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCQuY2lyY2xlWSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkLmdldFlTY2FsZShkLmlkKShkLnZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldENpcmNsZXMgPSBmdW5jdGlvbiAoaSwgaWQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChpZCA/ICQkLm1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLmNpcmNsZXMgKyAkJC5nZXRUYXJnZXRTZWxlY3RvclN1ZmZpeChpZCkpIDogJCQubWFpbikuc2VsZWN0QWxsKCcuJyArIENMQVNTLmNpcmNsZSArIChpc1ZhbHVlKGkpID8gJy0nICsgaSA6ICcnKSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5leHBhbmRDaXJjbGVzID0gZnVuY3Rpb24gKGksIGlkLCByZXNldCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgciA9ICQkLnBvaW50RXhwYW5kZWRSLmJpbmQoJCQpO1xuICAgICAgICBpZiAocmVzZXQpIHsgJCQudW5leHBhbmRDaXJjbGVzKCk7IH1cbiAgICAgICAgJCQuZ2V0Q2lyY2xlcyhpLCBpZClcbiAgICAgICAgICAgIC5jbGFzc2VkKENMQVNTLkVYUEFOREVELCB0cnVlKVxuICAgICAgICAgICAgLmF0dHIoJ3InLCByKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVuZXhwYW5kQ2lyY2xlcyA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICByID0gJCQucG9pbnRSLmJpbmQoJCQpO1xuICAgICAgICAkJC5nZXRDaXJjbGVzKGkpXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICgpIHsgcmV0dXJuICQkLmQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKENMQVNTLkVYUEFOREVEKTsgfSlcbiAgICAgICAgICAgIC5jbGFzc2VkKENMQVNTLkVYUEFOREVELCBmYWxzZSlcbiAgICAgICAgICAgIC5hdHRyKCdyJywgcik7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5wb2ludFIgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIHJldHVybiAkJC5pc1N0ZXBUeXBlKGQpID8gMCA6IChpc0Z1bmN0aW9uKGNvbmZpZy5wb2ludF9yKSA/IGNvbmZpZy5wb2ludF9yKGQpIDogY29uZmlnLnBvaW50X3IpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucG9pbnRFeHBhbmRlZFIgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIHJldHVybiBjb25maWcucG9pbnRfZm9jdXNfZXhwYW5kX2VuYWJsZWQgPyAoY29uZmlnLnBvaW50X2ZvY3VzX2V4cGFuZF9yID8gY29uZmlnLnBvaW50X2ZvY3VzX2V4cGFuZF9yIDogJCQucG9pbnRSKGQpICogMS43NSkgOiAkJC5wb2ludFIoZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5wb2ludFNlbGVjdFIgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGNvbmZpZy5wb2ludF9zZWxlY3RfcikgPyBjb25maWcucG9pbnRfc2VsZWN0X3IoZCkgOiAoKGNvbmZpZy5wb2ludF9zZWxlY3RfcikgPyBjb25maWcucG9pbnRfc2VsZWN0X3IgOiAkJC5wb2ludFIoZCkgKiA0KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzV2l0aGluQ2lyY2xlID0gZnVuY3Rpb24gKHRoYXQsIHIpIHtcbiAgICAgICAgdmFyIGQzID0gdGhpcy5kMyxcbiAgICAgICAgICAgIG1vdXNlID0gZDMubW91c2UodGhhdCksIGQzX3RoaXMgPSBkMy5zZWxlY3QodGhhdCksXG4gICAgICAgICAgICBjeCA9ICtkM190aGlzLmF0dHIoXCJjeFwiKSwgY3kgPSArZDNfdGhpcy5hdHRyKFwiY3lcIik7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coY3ggLSBtb3VzZVswXSwgMikgKyBNYXRoLnBvdyhjeSAtIG1vdXNlWzFdLCAyKSkgPCByO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNXaXRoaW5TdGVwID0gZnVuY3Rpb24gKHRoYXQsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHkgLSB0aGlzLmQzLm1vdXNlKHRoYXQpWzFdKSA8IDMwO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0QmFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5jaGFydCkuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy5jaGFydEJhcnMpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlVGFyZ2V0c0ZvckJhciA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIG1haW5CYXJVcGRhdGUsIG1haW5CYXJFbnRlcixcbiAgICAgICAgICAgIGNsYXNzQ2hhcnRCYXIgPSAkJC5jbGFzc0NoYXJ0QmFyLmJpbmQoJCQpLFxuICAgICAgICAgICAgY2xhc3NCYXJzID0gJCQuY2xhc3NCYXJzLmJpbmQoJCQpLFxuICAgICAgICAgICAgY2xhc3NGb2N1cyA9ICQkLmNsYXNzRm9jdXMuYmluZCgkJCk7XG4gICAgICAgIG1haW5CYXJVcGRhdGUgPSAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5jaGFydEJhcnMpLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5jaGFydEJhcilcbiAgICAgICAgICAgIC5kYXRhKHRhcmdldHMpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gY2xhc3NDaGFydEJhcihkKSArIGNsYXNzRm9jdXMoZCk7IH0pO1xuICAgICAgICBtYWluQmFyRW50ZXIgPSBtYWluQmFyVXBkYXRlLmVudGVyKCkuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGNsYXNzQ2hhcnRCYXIpXG4gICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAgICAgLnN0eWxlKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpO1xuICAgICAgICAvLyBCYXJzIGZvciBlYWNoIGRhdGFcbiAgICAgICAgbWFpbkJhckVudGVyLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIGNsYXNzQmFycylcbiAgICAgICAgICAgIC5zdHlsZShcImN1cnNvclwiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gY29uZmlnLmRhdGFfc2VsZWN0aW9uX2lzc2VsZWN0YWJsZShkKSA/IFwicG9pbnRlclwiIDogbnVsbDsgfSk7XG5cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUJhciA9IGZ1bmN0aW9uIChkdXJhdGlvbkZvckV4aXQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIGJhckRhdGEgPSAkJC5iYXJEYXRhLmJpbmQoJCQpLFxuICAgICAgICAgICAgY2xhc3NCYXIgPSAkJC5jbGFzc0Jhci5iaW5kKCQkKSxcbiAgICAgICAgICAgIGluaXRpYWxPcGFjaXR5ID0gJCQuaW5pdGlhbE9wYWNpdHkuYmluZCgkJCksXG4gICAgICAgICAgICBjb2xvciA9IGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC5jb2xvcihkLmlkKTsgfTtcbiAgICAgICAgJCQubWFpbkJhciA9ICQkLm1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLmJhcnMpLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5iYXIpXG4gICAgICAgICAgICAuZGF0YShiYXJEYXRhKTtcbiAgICAgICAgJCQubWFpbkJhci5lbnRlcigpLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIGNsYXNzQmFyKVxuICAgICAgICAgICAgLnN0eWxlKFwic3Ryb2tlXCIsIGNvbG9yKVxuICAgICAgICAgICAgLnN0eWxlKFwiZmlsbFwiLCBjb2xvcik7XG4gICAgICAgICQkLm1haW5CYXJcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgaW5pdGlhbE9wYWNpdHkpO1xuICAgICAgICAkJC5tYWluQmFyLmV4aXQoKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb25Gb3JFeGl0KVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlZHJhd0JhciA9IGZ1bmN0aW9uIChkcmF3QmFyLCB3aXRoVHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgKHdpdGhUcmFuc2l0aW9uID8gdGhpcy5tYWluQmFyLnRyYW5zaXRpb24oTWF0aC5yYW5kb20oKS50b1N0cmluZygpKSA6IHRoaXMubWFpbkJhcilcbiAgICAgICAgICAgICAgICAuYXR0cignZCcsIGRyYXdCYXIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwiZmlsbFwiLCB0aGlzLmNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMSlcbiAgICAgICAgXTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEJhclcgPSBmdW5jdGlvbiAoYXhpcywgYmFyVGFyZ2V0c051bSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICB3ID0gdHlwZW9mIGNvbmZpZy5iYXJfd2lkdGggPT09ICdudW1iZXInID8gY29uZmlnLmJhcl93aWR0aCA6IGJhclRhcmdldHNOdW0gPyAoYXhpcy50aWNrSW50ZXJ2YWwoKSAqIGNvbmZpZy5iYXJfd2lkdGhfcmF0aW8pIC8gYmFyVGFyZ2V0c051bSA6IDA7XG4gICAgICAgIHJldHVybiBjb25maWcuYmFyX3dpZHRoX21heCAmJiB3ID4gY29uZmlnLmJhcl93aWR0aF9tYXggPyBjb25maWcuYmFyX3dpZHRoX21heCA6IHc7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRCYXJzID0gZnVuY3Rpb24gKGksIGlkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoaWQgPyAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5iYXJzICsgJCQuZ2V0VGFyZ2V0U2VsZWN0b3JTdWZmaXgoaWQpKSA6ICQkLm1haW4pLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5iYXIgKyAoaXNWYWx1ZShpKSA/ICctJyArIGkgOiAnJykpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZXhwYW5kQmFycyA9IGZ1bmN0aW9uIChpLCBpZCwgcmVzZXQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgaWYgKHJlc2V0KSB7ICQkLnVuZXhwYW5kQmFycygpOyB9XG4gICAgICAgICQkLmdldEJhcnMoaSwgaWQpLmNsYXNzZWQoQ0xBU1MuRVhQQU5ERUQsIHRydWUpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udW5leHBhbmRCYXJzID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgJCQuZ2V0QmFycyhpKS5jbGFzc2VkKENMQVNTLkVYUEFOREVELCBmYWxzZSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZW5lcmF0ZURyYXdCYXIgPSBmdW5jdGlvbiAoYmFySW5kaWNlcywgaXNTdWIpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgZ2V0UG9pbnRzID0gJCQuZ2VuZXJhdGVHZXRCYXJQb2ludHMoYmFySW5kaWNlcywgaXNTdWIpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIC8vIDQgcG9pbnRzIHRoYXQgbWFrZSBhIGJhclxuICAgICAgICAgICAgdmFyIHBvaW50cyA9IGdldFBvaW50cyhkLCBpKTtcblxuICAgICAgICAgICAgLy8gc3dpdGNoIHBvaW50cyBpZiBheGlzIGlzIHJvdGF0ZWQsIG5vdCBhcHBsaWNhYmxlIGZvciBzdWIgY2hhcnRcbiAgICAgICAgICAgIHZhciBpbmRleFggPSBjb25maWcuYXhpc19yb3RhdGVkID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgaW5kZXhZID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IDAgOiAxO1xuXG4gICAgICAgICAgICB2YXIgcGF0aCA9ICdNICcgKyBwb2ludHNbMF1baW5kZXhYXSArICcsJyArIHBvaW50c1swXVtpbmRleFldICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0wnICsgcG9pbnRzWzFdW2luZGV4WF0gKyAnLCcgKyBwb2ludHNbMV1baW5kZXhZXSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICdMJyArIHBvaW50c1syXVtpbmRleFhdICsgJywnICsgcG9pbnRzWzJdW2luZGV4WV0gKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAnTCcgKyBwb2ludHNbM11baW5kZXhYXSArICcsJyArIHBvaW50c1szXVtpbmRleFldICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3onO1xuXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdlbmVyYXRlR2V0QmFyUG9pbnRzID0gZnVuY3Rpb24gKGJhckluZGljZXMsIGlzU3ViKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBheGlzID0gaXNTdWIgPyAkJC5zdWJYQXhpcyA6ICQkLnhBeGlzLFxuICAgICAgICAgICAgYmFyVGFyZ2V0c051bSA9IGJhckluZGljZXMuX19tYXhfXyArIDEsXG4gICAgICAgICAgICBiYXJXID0gJCQuZ2V0QmFyVyhheGlzLCBiYXJUYXJnZXRzTnVtKSxcbiAgICAgICAgICAgIGJhclggPSAkJC5nZXRTaGFwZVgoYmFyVywgYmFyVGFyZ2V0c051bSwgYmFySW5kaWNlcywgISFpc1N1YiksXG4gICAgICAgICAgICBiYXJZID0gJCQuZ2V0U2hhcGVZKCEhaXNTdWIpLFxuICAgICAgICAgICAgYmFyT2Zmc2V0ID0gJCQuZ2V0U2hhcGVPZmZzZXQoJCQuaXNCYXJUeXBlLCBiYXJJbmRpY2VzLCAhIWlzU3ViKSxcbiAgICAgICAgICAgIHlTY2FsZSA9IGlzU3ViID8gJCQuZ2V0U3ViWVNjYWxlIDogJCQuZ2V0WVNjYWxlO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIHZhciB5MCA9IHlTY2FsZS5jYWxsKCQkLCBkLmlkKSgwKSxcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBiYXJPZmZzZXQoZCwgaSkgfHwgeTAsIC8vIG9mZnNldCBpcyBmb3Igc3RhY2tlZCBiYXIgY2hhcnRcbiAgICAgICAgICAgICAgICBwb3NYID0gYmFyWChkKSwgcG9zWSA9IGJhclkoZCk7XG4gICAgICAgICAgICAvLyBmaXggcG9zWSBub3QgdG8gb3ZlcmZsb3cgb3Bwb3NpdGUgcXVhZHJhbnRcbiAgICAgICAgICAgIGlmICgkJC5jb25maWcuYXhpc19yb3RhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwIDwgZC52YWx1ZSAmJiBwb3NZIDwgeTApIHx8IChkLnZhbHVlIDwgMCAmJiB5MCA8IHBvc1kpKSB7IHBvc1kgPSB5MDsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gNCBwb2ludHMgdGhhdCBtYWtlIGEgYmFyXG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIFtwb3NYLCBvZmZzZXRdLFxuICAgICAgICAgICAgICAgIFtwb3NYLCBwb3NZIC0gKHkwIC0gb2Zmc2V0KV0sXG4gICAgICAgICAgICAgICAgW3Bvc1ggKyBiYXJXLCBwb3NZIC0gKHkwIC0gb2Zmc2V0KV0sXG4gICAgICAgICAgICAgICAgW3Bvc1ggKyBiYXJXLCBvZmZzZXRdXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNXaXRoaW5CYXIgPSBmdW5jdGlvbiAodGhhdCkge1xuICAgICAgICB2YXIgbW91c2UgPSB0aGlzLmQzLm1vdXNlKHRoYXQpLCBib3ggPSB0aGF0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgc2VnMCA9IHRoYXQucGF0aFNlZ0xpc3QuZ2V0SXRlbSgwKSwgc2VnMSA9IHRoYXQucGF0aFNlZ0xpc3QuZ2V0SXRlbSgxKSxcbiAgICAgICAgICAgIHggPSBNYXRoLm1pbihzZWcwLngsIHNlZzEueCksIHkgPSBNYXRoLm1pbihzZWcwLnksIHNlZzEueSksXG4gICAgICAgICAgICB3ID0gYm94LndpZHRoLCBoID0gYm94LmhlaWdodCwgb2Zmc2V0ID0gMixcbiAgICAgICAgICAgIHN4ID0geCAtIG9mZnNldCwgZXggPSB4ICsgdyArIG9mZnNldCwgc3kgPSB5ICsgaCArIG9mZnNldCwgZXkgPSB5IC0gb2Zmc2V0O1xuICAgICAgICByZXR1cm4gc3ggPCBtb3VzZVswXSAmJiBtb3VzZVswXSA8IGV4ICYmIGV5IDwgbW91c2VbMV0gJiYgbW91c2VbMV0gPCBzeTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLm1haW4uc2VsZWN0KCcuJyArIENMQVNTLmNoYXJ0KS5hcHBlbmQoXCJnXCIpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmNoYXJ0VGV4dHMpO1xuICAgICAgICAkJC5tYWluVGV4dCA9ICQkLmQzLnNlbGVjdEFsbChbXSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVUYXJnZXRzRm9yVGV4dCA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIG1haW5UZXh0VXBkYXRlLCBtYWluVGV4dEVudGVyLFxuICAgICAgICAgICAgY2xhc3NDaGFydFRleHQgPSAkJC5jbGFzc0NoYXJ0VGV4dC5iaW5kKCQkKSxcbiAgICAgICAgICAgIGNsYXNzVGV4dHMgPSAkJC5jbGFzc1RleHRzLmJpbmQoJCQpLFxuICAgICAgICAgICAgY2xhc3NGb2N1cyA9ICQkLmNsYXNzRm9jdXMuYmluZCgkJCk7XG4gICAgICAgIG1haW5UZXh0VXBkYXRlID0gJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuY2hhcnRUZXh0cykuc2VsZWN0QWxsKCcuJyArIENMQVNTLmNoYXJ0VGV4dClcbiAgICAgICAgICAgIC5kYXRhKHRhcmdldHMpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gY2xhc3NDaGFydFRleHQoZCkgKyBjbGFzc0ZvY3VzKGQpOyB9KTtcbiAgICAgICAgbWFpblRleHRFbnRlciA9IG1haW5UZXh0VXBkYXRlLmVudGVyKCkuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGNsYXNzQ2hhcnRUZXh0KVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAgIC5zdHlsZShcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcbiAgICAgICAgbWFpblRleHRFbnRlci5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgY2xhc3NUZXh0cyk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVUZXh0ID0gZnVuY3Rpb24gKGR1cmF0aW9uRm9yRXhpdCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBiYXJPckxpbmVEYXRhID0gJCQuYmFyT3JMaW5lRGF0YS5iaW5kKCQkKSxcbiAgICAgICAgICAgIGNsYXNzVGV4dCA9ICQkLmNsYXNzVGV4dC5iaW5kKCQkKTtcbiAgICAgICAgJCQubWFpblRleHQgPSAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy50ZXh0cykuc2VsZWN0QWxsKCcuJyArIENMQVNTLnRleHQpXG4gICAgICAgICAgICAuZGF0YShiYXJPckxpbmVEYXRhKTtcbiAgICAgICAgJCQubWFpblRleHQuZW50ZXIoKS5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBjbGFzc1RleHQpXG4gICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gY29uZmlnLmF4aXNfcm90YXRlZCA/IChkLnZhbHVlIDwgMCA/ICdlbmQnIDogJ3N0YXJ0JykgOiAnbWlkZGxlJzsgfSlcbiAgICAgICAgICAgIC5zdHlsZShcInN0cm9rZVwiLCAnbm9uZScpXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC5jb2xvcihkKTsgfSlcbiAgICAgICAgICAgIC5zdHlsZShcImZpbGwtb3BhY2l0eVwiLCAwKTtcbiAgICAgICAgJCQubWFpblRleHRcbiAgICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkLCBpLCBqKSB7IHJldHVybiAkJC5kYXRhTGFiZWxGb3JtYXQoZC5pZCkoZC52YWx1ZSwgZC5pZCwgaSwgaik7IH0pO1xuICAgICAgICAkJC5tYWluVGV4dC5leGl0KClcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb25Gb3JFeGl0KVxuICAgICAgICAgICAgLnN0eWxlKCdmaWxsLW9wYWNpdHknLCAwKVxuICAgICAgICAgICAgLnJlbW92ZSgpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucmVkcmF3VGV4dCA9IGZ1bmN0aW9uICh4Rm9yVGV4dCwgeUZvclRleHQsIGZvckZsb3csIHdpdGhUcmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAod2l0aFRyYW5zaXRpb24gPyB0aGlzLm1haW5UZXh0LnRyYW5zaXRpb24oKSA6IHRoaXMubWFpblRleHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB4Rm9yVGV4dClcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHlGb3JUZXh0KVxuICAgICAgICAgICAgICAgIC5zdHlsZShcImZpbGxcIiwgdGhpcy5jb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJmaWxsLW9wYWNpdHlcIiwgZm9yRmxvdyA/IDAgOiB0aGlzLm9wYWNpdHlGb3JUZXh0LmJpbmQodGhpcykpXG4gICAgICAgIF07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRUZXh0UmVjdCA9IGZ1bmN0aW9uICh0ZXh0LCBjbHMsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGR1bW15ID0gdGhpcy5kMy5zZWxlY3QoJ2JvZHknKS5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2MzJywgdHJ1ZSksXG4gICAgICAgICAgICBzdmcgPSBkdW1teS5hcHBlbmQoXCJzdmdcIikuc3R5bGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJykuc3R5bGUoJ3Bvc2l0aW9uJywgJ2ZpeGVkJykuc3R5bGUoJ3RvcCcsIDApLnN0eWxlKCdsZWZ0JywgMCksXG4gICAgICAgICAgICBmb250ID0gdGhpcy5kMy5zZWxlY3QoZWxlbWVudCkuc3R5bGUoJ2ZvbnQnKSxcbiAgICAgICAgICAgIHJlY3Q7XG4gICAgICAgIHN2Zy5zZWxlY3RBbGwoJy5kdW1teScpXG4gICAgICAgICAgICAuZGF0YShbdGV4dF0pXG4gICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgIC5jbGFzc2VkKGNscyA/IGNscyA6IFwiXCIsIHRydWUpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQnLCBmb250KVxuICAgICAgICAgICAgLnRleHQodGV4dClcbiAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoKSB7IHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyB9KTtcbiAgICAgICAgZHVtbXkucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2VuZXJhdGVYWUZvclRleHQgPSBmdW5jdGlvbiAoYXJlYUluZGljZXMsIGJhckluZGljZXMsIGxpbmVJbmRpY2VzLCBmb3JYKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBnZXRBcmVhUG9pbnRzID0gJCQuZ2VuZXJhdGVHZXRBcmVhUG9pbnRzKGFyZWFJbmRpY2VzLCBmYWxzZSksXG4gICAgICAgICAgICBnZXRCYXJQb2ludHMgPSAkJC5nZW5lcmF0ZUdldEJhclBvaW50cyhiYXJJbmRpY2VzLCBmYWxzZSksXG4gICAgICAgICAgICBnZXRMaW5lUG9pbnRzID0gJCQuZ2VuZXJhdGVHZXRMaW5lUG9pbnRzKGxpbmVJbmRpY2VzLCBmYWxzZSksXG4gICAgICAgICAgICBnZXR0ZXIgPSBmb3JYID8gJCQuZ2V0WEZvclRleHQgOiAkJC5nZXRZRm9yVGV4dDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgICAgICB2YXIgZ2V0UG9pbnRzID0gJCQuaXNBcmVhVHlwZShkKSA/IGdldEFyZWFQb2ludHMgOiAkJC5pc0JhclR5cGUoZCkgPyBnZXRCYXJQb2ludHMgOiBnZXRMaW5lUG9pbnRzO1xuICAgICAgICAgICAgcmV0dXJuIGdldHRlci5jYWxsKCQkLCBnZXRQb2ludHMoZCwgaSksIGQsIHRoaXMpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0WEZvclRleHQgPSBmdW5jdGlvbiAocG9pbnRzLCBkLCB0ZXh0RWxlbWVudCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgYm94ID0gdGV4dEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHhQb3MsIHBhZGRpbmc7XG4gICAgICAgIGlmICgkJC5jb25maWcuYXhpc19yb3RhdGVkKSB7XG4gICAgICAgICAgICBwYWRkaW5nID0gJCQuaXNCYXJUeXBlKGQpID8gNCA6IDY7XG4gICAgICAgICAgICB4UG9zID0gcG9pbnRzWzJdWzFdICsgcGFkZGluZyAqIChkLnZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4UG9zID0gJCQuaGFzVHlwZSgnYmFyJykgPyAocG9pbnRzWzJdWzBdICsgcG9pbnRzWzBdWzBdKSAvIDIgOiBwb2ludHNbMF1bMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2hvdyBsYWJlbHMgcmVnYXJkbGVzcyBvZiB0aGUgZG9tYWluIGlmIHZhbHVlIGlzIG51bGxcbiAgICAgICAgaWYgKGQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh4UG9zID4gJCQud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB4UG9zID0gJCQud2lkdGggLSBib3gud2lkdGg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHhQb3MgPCAwKSB7XG4gICAgICAgICAgICAgICAgeFBvcyA9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHhQb3M7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRZRm9yVGV4dCA9IGZ1bmN0aW9uIChwb2ludHMsIGQsIHRleHRFbGVtZW50KSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBib3ggPSB0ZXh0RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIHlQb3M7XG4gICAgICAgIGlmICgkJC5jb25maWcuYXhpc19yb3RhdGVkKSB7XG4gICAgICAgICAgICB5UG9zID0gKHBvaW50c1swXVswXSArIHBvaW50c1syXVswXSArIGJveC5oZWlnaHQgKiAwLjYpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlQb3MgPSBwb2ludHNbMl1bMV07XG4gICAgICAgICAgICBpZiAoZC52YWx1ZSA8IDAgIHx8IChkLnZhbHVlID09PSAwICYmICEkJC5oYXNQb3NpdGl2ZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHlQb3MgKz0gYm94LmhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoJCQuaXNCYXJUeXBlKGQpICYmICQkLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgeVBvcyAtPSAzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghJCQuaXNCYXJUeXBlKGQpICYmICQkLmlzQ2hyb21lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgeVBvcyArPSAzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeVBvcyArPSAkJC5pc0JhclR5cGUoZCkgPyAtMyA6IC02O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNob3cgbGFiZWxzIHJlZ2FyZGxlc3Mgb2YgdGhlIGRvbWFpbiBpZiB2YWx1ZSBpcyBudWxsXG4gICAgICAgIGlmIChkLnZhbHVlID09PSBudWxsICYmICEkJC5jb25maWcuYXhpc19yb3RhdGVkKSB7XG4gICAgICAgICAgICBpZiAoeVBvcyA8IGJveC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB5UG9zID0gYm94LmhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeVBvcyA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgeVBvcyA9IHRoaXMuaGVpZ2h0IC0gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geVBvcztcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uc2V0VGFyZ2V0VHlwZSA9IGZ1bmN0aW9uICh0YXJnZXRJZHMsIHR5cGUpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICAkJC5tYXBUb1RhcmdldElkcyh0YXJnZXRJZHMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAkJC53aXRob3V0RmFkZUluW2lkXSA9ICh0eXBlID09PSBjb25maWcuZGF0YV90eXBlc1tpZF0pO1xuICAgICAgICAgICAgY29uZmlnLmRhdGFfdHlwZXNbaWRdID0gdHlwZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGFyZ2V0SWRzKSB7XG4gICAgICAgICAgICBjb25maWcuZGF0YV90eXBlID0gdHlwZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaGFzVHlwZSA9IGZ1bmN0aW9uICh0eXBlLCB0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIHR5cGVzID0gJCQuY29uZmlnLmRhdGFfdHlwZXMsIGhhcyA9IGZhbHNlO1xuICAgICAgICB0YXJnZXRzID0gdGFyZ2V0cyB8fCAkJC5kYXRhLnRhcmdldHM7XG4gICAgICAgIGlmICh0YXJnZXRzICYmIHRhcmdldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdHlwZXNbdGFyZ2V0LmlkXTtcbiAgICAgICAgICAgICAgICBpZiAoKHQgJiYgdC5pbmRleE9mKHR5cGUpID49IDApIHx8ICghdCAmJiB0eXBlID09PSAnbGluZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmtleXModHlwZXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXModHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVzW2lkXSA9PT0gdHlwZSkgeyBoYXMgPSB0cnVlOyB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhcyA9ICQkLmNvbmZpZy5kYXRhX3R5cGUgPT09IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhcztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmhhc0FyY1R5cGUgPSBmdW5jdGlvbiAodGFyZ2V0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNUeXBlKCdwaWUnLCB0YXJnZXRzKSB8fCB0aGlzLmhhc1R5cGUoJ2RvbnV0JywgdGFyZ2V0cykgfHwgdGhpcy5oYXNUeXBlKCdnYXVnZScsIHRhcmdldHMpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNMaW5lVHlwZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZywgaWQgPSBpc1N0cmluZyhkKSA/IGQgOiBkLmlkO1xuICAgICAgICByZXR1cm4gIWNvbmZpZy5kYXRhX3R5cGVzW2lkXSB8fCBbJ2xpbmUnLCAnc3BsaW5lJywgJ2FyZWEnLCAnYXJlYS1zcGxpbmUnLCAnc3RlcCcsICdhcmVhLXN0ZXAnXS5pbmRleE9mKGNvbmZpZy5kYXRhX3R5cGVzW2lkXSkgPj0gMDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzU3RlcFR5cGUgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgaWQgPSBpc1N0cmluZyhkKSA/IGQgOiBkLmlkO1xuICAgICAgICByZXR1cm4gWydzdGVwJywgJ2FyZWEtc3RlcCddLmluZGV4T2YodGhpcy5jb25maWcuZGF0YV90eXBlc1tpZF0pID49IDA7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc1NwbGluZVR5cGUgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgaWQgPSBpc1N0cmluZyhkKSA/IGQgOiBkLmlkO1xuICAgICAgICByZXR1cm4gWydzcGxpbmUnLCAnYXJlYS1zcGxpbmUnXS5pbmRleE9mKHRoaXMuY29uZmlnLmRhdGFfdHlwZXNbaWRdKSA+PSAwO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNBcmVhVHlwZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHZhciBpZCA9IGlzU3RyaW5nKGQpID8gZCA6IGQuaWQ7XG4gICAgICAgIHJldHVybiBbJ2FyZWEnLCAnYXJlYS1zcGxpbmUnLCAnYXJlYS1zdGVwJ10uaW5kZXhPZih0aGlzLmNvbmZpZy5kYXRhX3R5cGVzW2lkXSkgPj0gMDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzQmFyVHlwZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHZhciBpZCA9IGlzU3RyaW5nKGQpID8gZCA6IGQuaWQ7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhX3R5cGVzW2lkXSA9PT0gJ2Jhcic7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc1NjYXR0ZXJUeXBlID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgdmFyIGlkID0gaXNTdHJpbmcoZCkgPyBkIDogZC5pZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFfdHlwZXNbaWRdID09PSAnc2NhdHRlcic7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc1BpZVR5cGUgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgaWQgPSBpc1N0cmluZyhkKSA/IGQgOiBkLmlkO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YV90eXBlc1tpZF0gPT09ICdwaWUnO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNHYXVnZVR5cGUgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgaWQgPSBpc1N0cmluZyhkKSA/IGQgOiBkLmlkO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YV90eXBlc1tpZF0gPT09ICdnYXVnZSc7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc0RvbnV0VHlwZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHZhciBpZCA9IGlzU3RyaW5nKGQpID8gZCA6IGQuaWQ7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhX3R5cGVzW2lkXSA9PT0gJ2RvbnV0JztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzQXJjVHlwZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUGllVHlwZShkKSB8fCB0aGlzLmlzRG9udXRUeXBlKGQpIHx8IHRoaXMuaXNHYXVnZVR5cGUoZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5saW5lRGF0YSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGluZVR5cGUoZCkgPyBbZF0gOiBbXTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmFyY0RhdGEgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FyY1R5cGUoZC5kYXRhKSA/IFtkXSA6IFtdO1xuICAgIH07XG4gICAgLyogbm90IHVzZWRcbiAgICAgZnVuY3Rpb24gc2NhdHRlckRhdGEoZCkge1xuICAgICByZXR1cm4gaXNTY2F0dGVyVHlwZShkKSA/IGQudmFsdWVzIDogW107XG4gICAgIH1cbiAgICAgKi9cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5iYXJEYXRhID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNCYXJUeXBlKGQpID8gZC52YWx1ZXMgOiBbXTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmxpbmVPclNjYXR0ZXJEYXRhID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaW5lVHlwZShkKSB8fCB0aGlzLmlzU2NhdHRlclR5cGUoZCkgPyBkLnZhbHVlcyA6IFtdO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uYmFyT3JMaW5lRGF0YSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQmFyVHlwZShkKSB8fCB0aGlzLmlzTGluZVR5cGUoZCkgPyBkLnZhbHVlcyA6IFtdO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNJbnRlcnBvbGF0aW9uVHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHJldHVybiBbJ2xpbmVhcicsICdsaW5lYXItY2xvc2VkJywgJ2Jhc2lzJywgJ2Jhc2lzLW9wZW4nLCAnYmFzaXMtY2xvc2VkJywgJ2J1bmRsZScsICdjYXJkaW5hbCcsICdjYXJkaW5hbC1vcGVuJywgJ2NhcmRpbmFsLWNsb3NlZCcsICdtb25vdG9uZSddLmluZGV4T2YodHlwZSkgPj0gMDtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdEdyaWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZywgZDMgPSAkJC5kMztcbiAgICAgICAgJCQuZ3JpZCA9ICQkLm1haW4uYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xpcC1wYXRoXCIsICQkLmNsaXBQYXRoRm9yR3JpZClcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIENMQVNTLmdyaWQpO1xuICAgICAgICBpZiAoY29uZmlnLmdyaWRfeF9zaG93KSB7XG4gICAgICAgICAgICAkJC5ncmlkLmFwcGVuZChcImdcIikuYXR0cihcImNsYXNzXCIsIENMQVNTLnhncmlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5ncmlkX3lfc2hvdykge1xuICAgICAgICAgICAgJCQuZ3JpZC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsIENMQVNTLnlncmlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5ncmlkX2ZvY3VzX3Nob3cpIHtcbiAgICAgICAgICAgICQkLmdyaWQuYXBwZW5kKCdnJylcbiAgICAgICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLnhncmlkRm9jdXMpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgQ0xBU1MueGdyaWRGb2N1cyk7XG4gICAgICAgIH1cbiAgICAgICAgJCQueGdyaWQgPSBkMy5zZWxlY3RBbGwoW10pO1xuICAgICAgICBpZiAoIWNvbmZpZy5ncmlkX2xpbmVzX2Zyb250KSB7ICQkLmluaXRHcmlkTGluZXMoKTsgfVxuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdEdyaWRMaW5lcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgZDMgPSAkJC5kMztcbiAgICAgICAgJCQuZ3JpZExpbmVzID0gJCQubWFpbi5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgJCQuY2xpcFBhdGhGb3JHcmlkKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgQ0xBU1MuZ3JpZCArICcgJyArIENMQVNTLmdyaWRMaW5lcyk7XG4gICAgICAgICQkLmdyaWRMaW5lcy5hcHBlbmQoJ2cnKS5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MueGdyaWRMaW5lcyk7XG4gICAgICAgICQkLmdyaWRMaW5lcy5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsIENMQVNTLnlncmlkTGluZXMpO1xuICAgICAgICAkJC54Z3JpZExpbmVzID0gZDMuc2VsZWN0QWxsKFtdKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVhHcmlkID0gZnVuY3Rpb24gKHdpdGhvdXRVcGRhdGUpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCBkMyA9ICQkLmQzLFxuICAgICAgICAgICAgeGdyaWREYXRhID0gJCQuZ2VuZXJhdGVHcmlkRGF0YShjb25maWcuZ3JpZF94X3R5cGUsICQkLngpLFxuICAgICAgICAgICAgdGlja09mZnNldCA9ICQkLmlzQ2F0ZWdvcml6ZWQoKSA/ICQkLnhBeGlzLnRpY2tPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgJCQueGdyaWRBdHRyID0gY29uZmlnLmF4aXNfcm90YXRlZCA/IHtcbiAgICAgICAgICAgICd4MSc6IDAsXG4gICAgICAgICAgICAneDInOiAkJC53aWR0aCxcbiAgICAgICAgICAgICd5MSc6IGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC54KGQpIC0gdGlja09mZnNldDsgfSxcbiAgICAgICAgICAgICd5Mic6IGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC54KGQpIC0gdGlja09mZnNldDsgfVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgJ3gxJzogZnVuY3Rpb24gKGQpIHsgcmV0dXJuICQkLngoZCkgKyB0aWNrT2Zmc2V0OyB9LFxuICAgICAgICAgICAgJ3gyJzogZnVuY3Rpb24gKGQpIHsgcmV0dXJuICQkLngoZCkgKyB0aWNrT2Zmc2V0OyB9LFxuICAgICAgICAgICAgJ3kxJzogMCxcbiAgICAgICAgICAgICd5Mic6ICQkLmhlaWdodFxuICAgICAgICB9O1xuXG4gICAgICAgICQkLnhncmlkID0gJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MueGdyaWRzKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MueGdyaWQpXG4gICAgICAgICAgICAuZGF0YSh4Z3JpZERhdGEpO1xuICAgICAgICAkJC54Z3JpZC5lbnRlcigpLmFwcGVuZCgnbGluZScpLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy54Z3JpZCk7XG4gICAgICAgIGlmICghd2l0aG91dFVwZGF0ZSkge1xuICAgICAgICAgICAgJCQueGdyaWQuYXR0cigkJC54Z3JpZEF0dHIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiArZDMuc2VsZWN0KHRoaXMpLmF0dHIoY29uZmlnLmF4aXNfcm90YXRlZCA/ICd5MScgOiAneDEnKSA9PT0gKGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC5oZWlnaHQgOiAwKSA/IDAgOiAxOyB9KTtcbiAgICAgICAgfVxuICAgICAgICAkJC54Z3JpZC5leGl0KCkucmVtb3ZlKCk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVlHcmlkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBncmlkVmFsdWVzID0gJCQueUF4aXMudGlja1ZhbHVlcygpIHx8ICQkLnkudGlja3MoY29uZmlnLmdyaWRfeV90aWNrcyk7XG4gICAgICAgICQkLnlncmlkID0gJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MueWdyaWRzKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MueWdyaWQpXG4gICAgICAgICAgICAuZGF0YShncmlkVmFsdWVzKTtcbiAgICAgICAgJCQueWdyaWQuZW50ZXIoKS5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgQ0xBU1MueWdyaWQpO1xuICAgICAgICAkJC55Z3JpZC5hdHRyKFwieDFcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLnkgOiAwKVxuICAgICAgICAgICAgLmF0dHIoXCJ4MlwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gJCQueSA6ICQkLndpZHRoKVxuICAgICAgICAgICAgLmF0dHIoXCJ5MVwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gMCA6ICQkLnkpXG4gICAgICAgICAgICAuYXR0cihcInkyXCIsIGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC5oZWlnaHQgOiAkJC55KTtcbiAgICAgICAgJCQueWdyaWQuZXhpdCgpLnJlbW92ZSgpO1xuICAgICAgICAkJC5zbW9vdGhMaW5lcygkJC55Z3JpZCwgJ2dyaWQnKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ3JpZFRleHRBbmNob3IgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5wb3NpdGlvbiA/IGQucG9zaXRpb24gOiBcImVuZFwiO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ3JpZFRleHREeCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLnBvc2l0aW9uID09PSAnc3RhcnQnID8gNCA6IGQucG9zaXRpb24gPT09ICdtaWRkbGUnID8gMCA6IC00O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ueEdyaWRUZXh0WCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLnBvc2l0aW9uID09PSAnc3RhcnQnID8gLXRoaXMuaGVpZ2h0IDogZC5wb3NpdGlvbiA9PT0gJ21pZGRsZScgPyAtdGhpcy5oZWlnaHQgLyAyIDogMDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnlHcmlkVGV4dFggPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5wb3NpdGlvbiA9PT0gJ3N0YXJ0JyA/IDAgOiBkLnBvc2l0aW9uID09PSAnbWlkZGxlJyA/IHRoaXMud2lkdGggLyAyIDogdGhpcy53aWR0aDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUdyaWQgPSBmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgbWFpbiA9ICQkLm1haW4sIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIHhncmlkTGluZSwgeWdyaWRMaW5lLCB5djtcblxuICAgICAgICAvLyBoaWRlIGlmIGFyYyB0eXBlXG4gICAgICAgICQkLmdyaWQuc3R5bGUoJ3Zpc2liaWxpdHknLCAkJC5oYXNBcmNUeXBlKCkgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJyk7XG5cbiAgICAgICAgbWFpbi5zZWxlY3QoJ2xpbmUuJyArIENMQVNTLnhncmlkRm9jdXMpLnN0eWxlKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICAgICAgaWYgKGNvbmZpZy5ncmlkX3hfc2hvdykge1xuICAgICAgICAgICAgJCQudXBkYXRlWEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgICAkJC54Z3JpZExpbmVzID0gbWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MueGdyaWRMaW5lcykuc2VsZWN0QWxsKCcuJyArIENMQVNTLnhncmlkTGluZSlcbiAgICAgICAgICAgIC5kYXRhKGNvbmZpZy5ncmlkX3hfbGluZXMpO1xuICAgICAgICAvLyBlbnRlclxuICAgICAgICB4Z3JpZExpbmUgPSAkJC54Z3JpZExpbmVzLmVudGVyKCkuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIENMQVNTLnhncmlkTGluZSArIChkWydjbGFzcyddID8gJyAnICsgZFsnY2xhc3MnXSA6ICcnKTsgfSk7XG4gICAgICAgIHhncmlkTGluZS5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwKTtcbiAgICAgICAgeGdyaWRMaW5lLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsICQkLmdyaWRUZXh0QW5jaG9yKVxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IFwiXCIgOiBcInJvdGF0ZSgtOTApXCIpXG4gICAgICAgICAgICAuYXR0cignZHgnLCAkJC5ncmlkVGV4dER4KVxuICAgICAgICAgICAgLmF0dHIoJ2R5JywgLTUpXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDApO1xuICAgICAgICAvLyB1ZHBhdGVcbiAgICAgICAgLy8gZG9uZSBpbiBkMy50cmFuc2l0aW9uKCkgb2YgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIC8vIGV4aXRcbiAgICAgICAgJCQueGdyaWRMaW5lcy5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwKVxuICAgICAgICAgICAgLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIFktR3JpZFxuICAgICAgICBpZiAoY29uZmlnLmdyaWRfeV9zaG93KSB7XG4gICAgICAgICAgICAkJC51cGRhdGVZR3JpZCgpO1xuICAgICAgICB9XG4gICAgICAgICQkLnlncmlkTGluZXMgPSBtYWluLnNlbGVjdCgnLicgKyBDTEFTUy55Z3JpZExpbmVzKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MueWdyaWRMaW5lKVxuICAgICAgICAgICAgLmRhdGEoY29uZmlnLmdyaWRfeV9saW5lcyk7XG4gICAgICAgIC8vIGVudGVyXG4gICAgICAgIHlncmlkTGluZSA9ICQkLnlncmlkTGluZXMuZW50ZXIoKS5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gQ0xBU1MueWdyaWRMaW5lICsgKGRbJ2NsYXNzJ10gPyAnICcgKyBkWydjbGFzcyddIDogJycpOyB9KTtcbiAgICAgICAgeWdyaWRMaW5lLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDApO1xuICAgICAgICB5Z3JpZExpbmUuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgJCQuZ3JpZFRleHRBbmNob3IpXG4gICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gXCJyb3RhdGUoLTkwKVwiIDogXCJcIilcbiAgICAgICAgICAgIC5hdHRyKCdkeCcsICQkLmdyaWRUZXh0RHgpXG4gICAgICAgICAgICAuYXR0cignZHknLCAtNSlcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMCk7XG4gICAgICAgIC8vIHVwZGF0ZVxuICAgICAgICB5diA9ICQkLnl2LmJpbmQoJCQpO1xuICAgICAgICAkJC55Z3JpZExpbmVzLnNlbGVjdCgnbGluZScpXG4gICAgICAgICAgLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbilcbiAgICAgICAgICAgIC5hdHRyKFwieDFcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IHl2IDogMClcbiAgICAgICAgICAgIC5hdHRyKFwieDJcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IHl2IDogJCQud2lkdGgpXG4gICAgICAgICAgICAuYXR0cihcInkxXCIsIGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAwIDogeXYpXG4gICAgICAgICAgICAuYXR0cihcInkyXCIsIGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC5oZWlnaHQgOiB5dilcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMSk7XG4gICAgICAgICQkLnlncmlkTGluZXMuc2VsZWN0KCd0ZXh0JylcbiAgICAgICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKVxuICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC54R3JpZFRleHRYLmJpbmQoJCQpIDogJCQueUdyaWRUZXh0WC5iaW5kKCQkKSlcbiAgICAgICAgICAgIC5hdHRyKFwieVwiLCB5dilcbiAgICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnRleHQ7IH0pXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDEpO1xuICAgICAgICAvLyBleGl0XG4gICAgICAgICQkLnlncmlkTGluZXMuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbilcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMClcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlZHJhd0dyaWQgPSBmdW5jdGlvbiAod2l0aFRyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCB4diA9ICQkLnh2LmJpbmQoJCQpLFxuICAgICAgICAgICAgbGluZXMgPSAkJC54Z3JpZExpbmVzLnNlbGVjdCgnbGluZScpLFxuICAgICAgICAgICAgdGV4dHMgPSAkJC54Z3JpZExpbmVzLnNlbGVjdCgndGV4dCcpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgKHdpdGhUcmFuc2l0aW9uID8gbGluZXMudHJhbnNpdGlvbigpIDogbGluZXMpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJ4MVwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gMCA6IHh2KVxuICAgICAgICAgICAgICAgIC5hdHRyKFwieDJcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLndpZHRoIDogeHYpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJ5MVwiLCBjb25maWcuYXhpc19yb3RhdGVkID8geHYgOiAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwieTJcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IHh2IDogJCQuaGVpZ2h0KVxuICAgICAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMSksXG4gICAgICAgICAgICAod2l0aFRyYW5zaXRpb24gPyB0ZXh0cy50cmFuc2l0aW9uKCkgOiB0ZXh0cylcbiAgICAgICAgICAgICAgICAuYXR0cihcInhcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLnlHcmlkVGV4dFguYmluZCgkJCkgOiAkJC54R3JpZFRleHRYLmJpbmQoJCQpKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwieVwiLCB4dilcbiAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC50ZXh0OyB9KVxuICAgICAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMSlcbiAgICAgICAgXTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnNob3dYR3JpZEZvY3VzID0gZnVuY3Rpb24gKHNlbGVjdGVkRGF0YSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBkYXRhVG9TaG93ID0gc2VsZWN0ZWREYXRhLmZpbHRlcihmdW5jdGlvbiAoZCkgeyByZXR1cm4gZCAmJiBpc1ZhbHVlKGQudmFsdWUpOyB9KSxcbiAgICAgICAgICAgIGZvY3VzRWwgPSAkJC5tYWluLnNlbGVjdEFsbCgnbGluZS4nICsgQ0xBU1MueGdyaWRGb2N1cyksXG4gICAgICAgICAgICB4eCA9ICQkLnh4LmJpbmQoJCQpO1xuICAgICAgICBpZiAoISBjb25maWcudG9vbHRpcF9zaG93KSB7IHJldHVybjsgfVxuICAgICAgICAvLyBIaWRlIHdoZW4gc2NhdHRlciBwbG90IGV4aXN0c1xuICAgICAgICBpZiAoJCQuaGFzVHlwZSgnc2NhdHRlcicpIHx8ICQkLmhhc0FyY1R5cGUoKSkgeyByZXR1cm47IH1cbiAgICAgICAgZm9jdXNFbFxuICAgICAgICAgICAgLnN0eWxlKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIilcbiAgICAgICAgICAgIC5kYXRhKFtkYXRhVG9TaG93WzBdXSlcbiAgICAgICAgICAgIC5hdHRyKGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAneTEnIDogJ3gxJywgeHgpXG4gICAgICAgICAgICAuYXR0cihjb25maWcuYXhpc19yb3RhdGVkID8gJ3kyJyA6ICd4MicsIHh4KTtcbiAgICAgICAgJCQuc21vb3RoTGluZXMoZm9jdXNFbCwgJ2dyaWQnKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmhpZGVYR3JpZEZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1haW4uc2VsZWN0KCdsaW5lLicgKyBDTEFTUy54Z3JpZEZvY3VzKS5zdHlsZShcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVYZ3JpZEZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgICQkLm1haW4uc2VsZWN0KCdsaW5lLicgKyBDTEFTUy54Z3JpZEZvY3VzKVxuICAgICAgICAgICAgLmF0dHIoXCJ4MVwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gMCA6IC0xMClcbiAgICAgICAgICAgIC5hdHRyKFwieDJcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLndpZHRoIDogLTEwKVxuICAgICAgICAgICAgLmF0dHIoXCJ5MVwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gLTEwIDogMClcbiAgICAgICAgICAgIC5hdHRyKFwieTJcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IC0xMCA6ICQkLmhlaWdodCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZW5lcmF0ZUdyaWREYXRhID0gZnVuY3Rpb24gKHR5cGUsIHNjYWxlKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBncmlkRGF0YSA9IFtdLCB4RG9tYWluLCBmaXJzdFllYXIsIGxhc3RZZWFyLCBpLFxuICAgICAgICAgICAgdGlja051bSA9ICQkLm1haW4uc2VsZWN0KFwiLlwiICsgQ0xBU1MuYXhpc1gpLnNlbGVjdEFsbCgnLnRpY2snKS5zaXplKCk7XG4gICAgICAgIGlmICh0eXBlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHhEb21haW4gPSAkJC5nZXRYRG9tYWluKCk7XG4gICAgICAgICAgICBmaXJzdFllYXIgPSB4RG9tYWluWzBdLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICBsYXN0WWVhciA9IHhEb21haW5bMV0uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgIGZvciAoaSA9IGZpcnN0WWVhcjsgaSA8PSBsYXN0WWVhcjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZ3JpZERhdGEucHVzaChuZXcgRGF0ZShpICsgJy0wMS0wMSAwMDowMDowMCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdyaWREYXRhID0gc2NhbGUudGlja3MoMTApO1xuICAgICAgICAgICAgaWYgKGdyaWREYXRhLmxlbmd0aCA+IHRpY2tOdW0pIHsgLy8gdXNlIG9ubHkgaW50XG4gICAgICAgICAgICAgICAgZ3JpZERhdGEgPSBncmlkRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIChcIlwiICsgZCkuaW5kZXhPZignLicpIDwgMDsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyaWREYXRhO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0R3JpZEZpbHRlclRvUmVtb3ZlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gcGFyYW1zID8gZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgW10uY29uY2F0KHBhcmFtcykuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoKCgndmFsdWUnIGluIHBhcmFtICYmIGxpbmUudmFsdWUgPT09IHBhcmFtLnZhbHVlKSB8fCAoJ2NsYXNzJyBpbiBwYXJhbSAmJiBsaW5lWydjbGFzcyddID09PSBwYXJhbVsnY2xhc3MnXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfSA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZW1vdmVHcmlkTGluZXMgPSBmdW5jdGlvbiAocGFyYW1zLCBmb3JYKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIHRvUmVtb3ZlID0gJCQuZ2V0R3JpZEZpbHRlclRvUmVtb3ZlKHBhcmFtcyksXG4gICAgICAgICAgICB0b1Nob3cgPSBmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gIXRvUmVtb3ZlKGxpbmUpOyB9LFxuICAgICAgICAgICAgY2xhc3NMaW5lcyA9IGZvclggPyBDTEFTUy54Z3JpZExpbmVzIDogQ0xBU1MueWdyaWRMaW5lcyxcbiAgICAgICAgICAgIGNsYXNzTGluZSA9IGZvclggPyBDTEFTUy54Z3JpZExpbmUgOiBDTEFTUy55Z3JpZExpbmU7XG4gICAgICAgICQkLm1haW4uc2VsZWN0KCcuJyArIGNsYXNzTGluZXMpLnNlbGVjdEFsbCgnLicgKyBjbGFzc0xpbmUpLmZpbHRlcih0b1JlbW92ZSlcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24oY29uZmlnLnRyYW5zaXRpb25fZHVyYXRpb24pXG4gICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKS5yZW1vdmUoKTtcbiAgICAgICAgaWYgKGZvclgpIHtcbiAgICAgICAgICAgIGNvbmZpZy5ncmlkX3hfbGluZXMgPSBjb25maWcuZ3JpZF94X2xpbmVzLmZpbHRlcih0b1Nob3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLmdyaWRfeV9saW5lcyA9IGNvbmZpZy5ncmlkX3lfbGluZXMuZmlsdGVyKHRvU2hvdyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdFRvb2x0aXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZywgaTtcbiAgICAgICAgJCQudG9vbHRpcCA9ICQkLnNlbGVjdENoYXJ0XG4gICAgICAgICAgICAuc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXG4gICAgICAgICAgLmFwcGVuZChcImRpdlwiKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgQ0xBU1MudG9vbHRpcENvbnRhaW5lcilcbiAgICAgICAgICAgIC5zdHlsZShcInBvc2l0aW9uXCIsIFwiYWJzb2x1dGVcIilcbiAgICAgICAgICAgIC5zdHlsZShcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKVxuICAgICAgICAgICAgLnN0eWxlKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIC8vIFNob3cgdG9vbHRpcCBpZiBuZWVkZWRcbiAgICAgICAgaWYgKGNvbmZpZy50b29sdGlwX2luaXRfc2hvdykge1xuICAgICAgICAgICAgaWYgKCQkLmlzVGltZVNlcmllcygpICYmIGlzU3RyaW5nKGNvbmZpZy50b29sdGlwX2luaXRfeCkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcudG9vbHRpcF9pbml0X3ggPSAkJC5wYXJzZURhdGUoY29uZmlnLnRvb2x0aXBfaW5pdF94KTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgJCQuZGF0YS50YXJnZXRzWzBdLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCQkLmRhdGEudGFyZ2V0c1swXS52YWx1ZXNbaV0ueCAtIGNvbmZpZy50b29sdGlwX2luaXRfeCkgPT09IDApIHsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uZmlnLnRvb2x0aXBfaW5pdF94ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQkLnRvb2x0aXAuaHRtbChjb25maWcudG9vbHRpcF9jb250ZW50cy5jYWxsKCQkLCAkJC5kYXRhLnRhcmdldHMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkLmFkZE5hbWUoZC52YWx1ZXNbY29uZmlnLnRvb2x0aXBfaW5pdF94XSk7XG4gICAgICAgICAgICB9KSwgJCQuYXhpcy5nZXRYQXhpc1RpY2tGb3JtYXQoKSwgJCQuZ2V0WUZvcm1hdCgkJC5oYXNBcmNUeXBlKCkpLCAkJC5jb2xvcikpO1xuICAgICAgICAgICAgJCQudG9vbHRpcC5zdHlsZShcInRvcFwiLCBjb25maWcudG9vbHRpcF9pbml0X3Bvc2l0aW9uLnRvcClcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJsZWZ0XCIsIGNvbmZpZy50b29sdGlwX2luaXRfcG9zaXRpb24ubGVmdClcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFRvb2x0aXBDb250ZW50ID0gZnVuY3Rpb24gKGQsIGRlZmF1bHRUaXRsZUZvcm1hdCwgZGVmYXVsdFZhbHVlRm9ybWF0LCBjb2xvcikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICB0aXRsZUZvcm1hdCA9IGNvbmZpZy50b29sdGlwX2Zvcm1hdF90aXRsZSB8fCBkZWZhdWx0VGl0bGVGb3JtYXQsXG4gICAgICAgICAgICBuYW1lRm9ybWF0ID0gY29uZmlnLnRvb2x0aXBfZm9ybWF0X25hbWUgfHwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG5hbWU7IH0sXG4gICAgICAgICAgICB2YWx1ZUZvcm1hdCA9IGNvbmZpZy50b29sdGlwX2Zvcm1hdF92YWx1ZSB8fCBkZWZhdWx0VmFsdWVGb3JtYXQsXG4gICAgICAgICAgICB0ZXh0LCBpLCB0aXRsZSwgdmFsdWUsIG5hbWUsIGJnY29sb3IsXG4gICAgICAgICAgICBvcmRlckFzYyA9ICQkLmlzT3JkZXJBc2MoKTtcblxuICAgICAgICBpZiAoY29uZmlnLmRhdGFfZ3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIHZhciB2MSA9IGEgPyBhLnZhbHVlIDogbnVsbCwgdjIgPSBiID8gYi52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyQXNjID8gdjEgLSB2MiA6IHYyIC0gdjE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpZHMgPSAkJC5vcmRlclRhcmdldHMoJCQuZGF0YS50YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaS5pZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdjEgPSBhID8gYS52YWx1ZSA6IG51bGwsIHYyID0gYiA/IGIudmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh2MSA+IDAgJiYgdjIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHYxID0gYSA/IGlkcy5pbmRleE9mKGEuaWQpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdjIgPSBiID8gaWRzLmluZGV4T2YoYi5pZCkgOiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJBc2MgPyB2MSAtIHYyIDogdjIgLSB2MTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghIChkW2ldICYmIChkW2ldLnZhbHVlIHx8IGRbaV0udmFsdWUgPT09IDApKSkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgICBpZiAoISB0ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBzYW5pdGlzZSh0aXRsZUZvcm1hdCA/IHRpdGxlRm9ybWF0KGRbaV0ueCkgOiBkW2ldLngpO1xuICAgICAgICAgICAgICAgIHRleHQgPSBcIjx0YWJsZSBjbGFzcz0nXCIgKyAkJC5DTEFTUy50b29sdGlwICsgXCInPlwiICsgKHRpdGxlIHx8IHRpdGxlID09PSAwID8gXCI8dHI+PHRoIGNvbHNwYW49JzInPlwiICsgdGl0bGUgKyBcIjwvdGg+PC90cj5cIiA6IFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IHNhbml0aXNlKHZhbHVlRm9ybWF0KGRbaV0udmFsdWUsIGRbaV0ucmF0aW8sIGRbaV0uaWQsIGRbaV0uaW5kZXgsIGQpKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBlbGVtZW50cyB3aGVuIHRoZWlyIG5hbWUgaXMgc2V0IHRvIG51bGxcbiAgICAgICAgICAgICAgICBpZiAoZFtpXS5uYW1lID09PSBudWxsKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgbmFtZSA9IHNhbml0aXNlKG5hbWVGb3JtYXQoZFtpXS5uYW1lLCBkW2ldLnJhdGlvLCBkW2ldLmlkLCBkW2ldLmluZGV4KSk7XG4gICAgICAgICAgICAgICAgYmdjb2xvciA9ICQkLmxldmVsQ29sb3IgPyAkJC5sZXZlbENvbG9yKGRbaV0udmFsdWUpIDogY29sb3IoZFtpXS5pZCk7XG5cbiAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiPHRyIGNsYXNzPSdcIiArICQkLkNMQVNTLnRvb2x0aXBOYW1lICsgXCItXCIgKyAkJC5nZXRUYXJnZXRTZWxlY3RvclN1ZmZpeChkW2ldLmlkKSArIFwiJz5cIjtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiPHRkIGNsYXNzPSduYW1lJz48c3BhbiBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjpcIiArIGJnY29sb3IgKyBcIic+PC9zcGFuPlwiICsgbmFtZSArIFwiPC90ZD5cIjtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiPHRkIGNsYXNzPSd2YWx1ZSc+XCIgKyB2YWx1ZSArIFwiPC90ZD5cIjtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiPC90cj5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dCArIFwiPC90YWJsZT5cIjtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnRvb2x0aXBQb3NpdGlvbiA9IGZ1bmN0aW9uIChkYXRhVG9TaG93LCB0V2lkdGgsIHRIZWlnaHQsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCBkMyA9ICQkLmQzO1xuICAgICAgICB2YXIgc3ZnTGVmdCwgdG9vbHRpcExlZnQsIHRvb2x0aXBSaWdodCwgdG9vbHRpcFRvcCwgY2hhcnRSaWdodDtcbiAgICAgICAgdmFyIGZvckFyYyA9ICQkLmhhc0FyY1R5cGUoKSxcbiAgICAgICAgICAgIG1vdXNlID0gZDMubW91c2UoZWxlbWVudCk7XG4gICAgICAvLyBEZXRlcm1pbiB0b29sdGlwIHBvc2l0aW9uXG4gICAgICAgIGlmIChmb3JBcmMpIHtcbiAgICAgICAgICAgIHRvb2x0aXBMZWZ0ID0gKCgkJC53aWR0aCAtICgkJC5pc0xlZ2VuZFJpZ2h0ID8gJCQuZ2V0TGVnZW5kV2lkdGgoKSA6IDApKSAvIDIpICsgbW91c2VbMF07XG4gICAgICAgICAgICB0b29sdGlwVG9wID0gKCQkLmhlaWdodCAvIDIpICsgbW91c2VbMV0gKyAyMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN2Z0xlZnQgPSAkJC5nZXRTdmdMZWZ0KHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5heGlzX3JvdGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0b29sdGlwTGVmdCA9IHN2Z0xlZnQgKyBtb3VzZVswXSArIDEwMDtcbiAgICAgICAgICAgICAgICB0b29sdGlwUmlnaHQgPSB0b29sdGlwTGVmdCArIHRXaWR0aDtcbiAgICAgICAgICAgICAgICBjaGFydFJpZ2h0ID0gJCQuY3VycmVudFdpZHRoIC0gJCQuZ2V0Q3VycmVudFBhZGRpbmdSaWdodCgpO1xuICAgICAgICAgICAgICAgIHRvb2x0aXBUb3AgPSAkJC54KGRhdGFUb1Nob3dbMF0ueCkgKyAyMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9vbHRpcExlZnQgPSBzdmdMZWZ0ICsgJCQuZ2V0Q3VycmVudFBhZGRpbmdMZWZ0KHRydWUpICsgJCQueChkYXRhVG9TaG93WzBdLngpICsgMjA7XG4gICAgICAgICAgICAgICAgdG9vbHRpcFJpZ2h0ID0gdG9vbHRpcExlZnQgKyB0V2lkdGg7XG4gICAgICAgICAgICAgICAgY2hhcnRSaWdodCA9IHN2Z0xlZnQgKyAkJC5jdXJyZW50V2lkdGggLSAkJC5nZXRDdXJyZW50UGFkZGluZ1JpZ2h0KCk7XG4gICAgICAgICAgICAgICAgdG9vbHRpcFRvcCA9IG1vdXNlWzFdICsgMTU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0b29sdGlwUmlnaHQgPiBjaGFydFJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgLy8gMjAgaXMgbmVlZGVkIGZvciBGaXJlZm94IHRvIGtlZXAgdG9vbHRpcCB3aWR0aFxuICAgICAgICAgICAgICAgIHRvb2x0aXBMZWZ0IC09IHRvb2x0aXBSaWdodCAtIGNoYXJ0UmlnaHQgKyAyMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b29sdGlwVG9wICsgdEhlaWdodCA+ICQkLmN1cnJlbnRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0b29sdGlwVG9wIC09IHRIZWlnaHQgKyAzMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodG9vbHRpcFRvcCA8IDApIHtcbiAgICAgICAgICAgIHRvb2x0aXBUb3AgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7dG9wOiB0b29sdGlwVG9wLCBsZWZ0OiB0b29sdGlwTGVmdH07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5zaG93VG9vbHRpcCA9IGZ1bmN0aW9uIChzZWxlY3RlZERhdGEsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICB2YXIgdFdpZHRoLCB0SGVpZ2h0LCBwb3NpdGlvbjtcbiAgICAgICAgdmFyIGZvckFyYyA9ICQkLmhhc0FyY1R5cGUoKSxcbiAgICAgICAgICAgIGRhdGFUb1Nob3cgPSBzZWxlY3RlZERhdGEuZmlsdGVyKGZ1bmN0aW9uIChkKSB7IHJldHVybiBkICYmIGlzVmFsdWUoZC52YWx1ZSk7IH0pLFxuICAgICAgICAgICAgcG9zaXRpb25GdW5jdGlvbiA9IGNvbmZpZy50b29sdGlwX3Bvc2l0aW9uIHx8IGMzX2NoYXJ0X2ludGVybmFsX2ZuLnRvb2x0aXBQb3NpdGlvbjtcbiAgICAgICAgaWYgKGRhdGFUb1Nob3cubGVuZ3RoID09PSAwIHx8ICFjb25maWcudG9vbHRpcF9zaG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgJCQudG9vbHRpcC5odG1sKGNvbmZpZy50b29sdGlwX2NvbnRlbnRzLmNhbGwoJCQsIHNlbGVjdGVkRGF0YSwgJCQuYXhpcy5nZXRYQXhpc1RpY2tGb3JtYXQoKSwgJCQuZ2V0WUZvcm1hdChmb3JBcmMpLCAkJC5jb2xvcikpLnN0eWxlKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xuXG4gICAgICAgIC8vIEdldCB0b29sdGlwIGRpbWVuc2lvbnNcbiAgICAgICAgdFdpZHRoID0gJCQudG9vbHRpcC5wcm9wZXJ0eSgnb2Zmc2V0V2lkdGgnKTtcbiAgICAgICAgdEhlaWdodCA9ICQkLnRvb2x0aXAucHJvcGVydHkoJ29mZnNldEhlaWdodCcpO1xuXG4gICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25GdW5jdGlvbi5jYWxsKHRoaXMsIGRhdGFUb1Nob3csIHRXaWR0aCwgdEhlaWdodCwgZWxlbWVudCk7XG4gICAgICAgIC8vIFNldCB0b29sdGlwXG4gICAgICAgICQkLnRvb2x0aXBcbiAgICAgICAgICAgIC5zdHlsZShcInRvcFwiLCBwb3NpdGlvbi50b3AgKyBcInB4XCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJsZWZ0XCIsIHBvc2l0aW9uLmxlZnQgKyAncHgnKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmhpZGVUb29sdGlwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdExlZ2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgJCQubGVnZW5kSXRlbVRleHRCb3ggPSB7fTtcbiAgICAgICAgJCQubGVnZW5kSGFzUmVuZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgJCQubGVnZW5kID0gJCQuc3ZnLmFwcGVuZChcImdcIikuYXR0cihcInRyYW5zZm9ybVwiLCAkJC5nZXRUcmFuc2xhdGUoJ2xlZ2VuZCcpKTtcbiAgICAgICAgaWYgKCEkJC5jb25maWcubGVnZW5kX3Nob3cpIHtcbiAgICAgICAgICAgICQkLmxlZ2VuZC5zdHlsZSgndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcbiAgICAgICAgICAgICQkLmhpZGRlbkxlZ2VuZElkcyA9ICQkLm1hcFRvSWRzKCQkLmRhdGEudGFyZ2V0cyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTUVNTzogY2FsbCBoZXJlIHRvIHVwZGF0ZSBsZWdlbmQgYm94IGFuZCB0cmFubGF0ZSBmb3IgYWxsXG4gICAgICAgIC8vIE1FTU86IHRyYW5zbGF0ZSB3aWxsIGJlIHVwYXRlZCBieSB0aGlzLCBzbyB0cmFuc2Zvcm0gbm90IG5lZWRlZCBpbiB1cGRhdGVMZWdlbmQoKVxuICAgICAgICAkJC51cGRhdGVMZWdlbmRXaXRoRGVmYXVsdHMoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUxlZ2VuZFdpdGhEZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgJCQudXBkYXRlTGVnZW5kKCQkLm1hcFRvSWRzKCQkLmRhdGEudGFyZ2V0cyksIHt3aXRoVHJhbnNmb3JtOiBmYWxzZSwgd2l0aFRyYW5zaXRpb25Gb3JUcmFuc2Zvcm06IGZhbHNlLCB3aXRoVHJhbnNpdGlvbjogZmFsc2V9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVNpemVGb3JMZWdlbmQgPSBmdW5jdGlvbiAobGVnZW5kSGVpZ2h0LCBsZWdlbmRXaWR0aCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsIGluc2V0TGVnZW5kUG9zaXRpb24gPSB7XG4gICAgICAgICAgICB0b3A6ICQkLmlzTGVnZW5kVG9wID8gJCQuZ2V0Q3VycmVudFBhZGRpbmdUb3AoKSArIGNvbmZpZy5sZWdlbmRfaW5zZXRfeSArIDUuNSA6ICQkLmN1cnJlbnRIZWlnaHQgLSBsZWdlbmRIZWlnaHQgLSAkJC5nZXRDdXJyZW50UGFkZGluZ0JvdHRvbSgpIC0gY29uZmlnLmxlZ2VuZF9pbnNldF95LFxuICAgICAgICAgICAgbGVmdDogJCQuaXNMZWdlbmRMZWZ0ID8gJCQuZ2V0Q3VycmVudFBhZGRpbmdMZWZ0KCkgKyBjb25maWcubGVnZW5kX2luc2V0X3ggKyAwLjUgOiAkJC5jdXJyZW50V2lkdGggLSBsZWdlbmRXaWR0aCAtICQkLmdldEN1cnJlbnRQYWRkaW5nUmlnaHQoKSAtIGNvbmZpZy5sZWdlbmRfaW5zZXRfeCArIDAuNVxuICAgICAgICB9O1xuXG4gICAgICAgICQkLm1hcmdpbjMgPSB7XG4gICAgICAgICAgICB0b3A6ICQkLmlzTGVnZW5kUmlnaHQgPyAwIDogJCQuaXNMZWdlbmRJbnNldCA/IGluc2V0TGVnZW5kUG9zaXRpb24udG9wIDogJCQuY3VycmVudEhlaWdodCAtIGxlZ2VuZEhlaWdodCxcbiAgICAgICAgICAgIHJpZ2h0OiBOYU4sXG4gICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICBsZWZ0OiAkJC5pc0xlZ2VuZFJpZ2h0ID8gJCQuY3VycmVudFdpZHRoIC0gbGVnZW5kV2lkdGggOiAkJC5pc0xlZ2VuZEluc2V0ID8gaW5zZXRMZWdlbmRQb3NpdGlvbi5sZWZ0IDogMFxuICAgICAgICB9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udHJhbnNmb3JtTGVnZW5kID0gZnVuY3Rpb24gKHdpdGhUcmFuc2l0aW9uKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICh3aXRoVHJhbnNpdGlvbiA/ICQkLmxlZ2VuZC50cmFuc2l0aW9uKCkgOiAkJC5sZWdlbmQpLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgJCQuZ2V0VHJhbnNsYXRlKCdsZWdlbmQnKSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVMZWdlbmRTdGVwID0gZnVuY3Rpb24gKHN0ZXApIHtcbiAgICAgICAgdGhpcy5sZWdlbmRTdGVwID0gc3RlcDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUxlZ2VuZEl0ZW1XaWR0aCA9IGZ1bmN0aW9uICh3KSB7XG4gICAgICAgIHRoaXMubGVnZW5kSXRlbVdpZHRoID0gdztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUxlZ2VuZEl0ZW1IZWlnaHQgPSBmdW5jdGlvbiAoaCkge1xuICAgICAgICB0aGlzLmxlZ2VuZEl0ZW1IZWlnaHQgPSBoO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0TGVnZW5kV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHJldHVybiAkJC5jb25maWcubGVnZW5kX3Nob3cgPyAkJC5pc0xlZ2VuZFJpZ2h0IHx8ICQkLmlzTGVnZW5kSW5zZXQgPyAkJC5sZWdlbmRJdGVtV2lkdGggKiAoJCQubGVnZW5kU3RlcCArIDEpIDogJCQuY3VycmVudFdpZHRoIDogMDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldExlZ2VuZEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgaCA9IDA7XG4gICAgICAgIGlmICgkJC5jb25maWcubGVnZW5kX3Nob3cpIHtcbiAgICAgICAgICAgIGlmICgkJC5pc0xlZ2VuZFJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaCA9ICQkLmN1cnJlbnRIZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGggPSBNYXRoLm1heCgyMCwgJCQubGVnZW5kSXRlbUhlaWdodCkgKiAoJCQubGVnZW5kU3RlcCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ub3BhY2l0eUZvckxlZ2VuZCA9IGZ1bmN0aW9uIChsZWdlbmRJdGVtKSB7XG4gICAgICAgIHJldHVybiBsZWdlbmRJdGVtLmNsYXNzZWQoQ0xBU1MubGVnZW5kSXRlbUhpZGRlbikgPyBudWxsIDogMTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLm9wYWNpdHlGb3JVbmZvY3VzZWRMZWdlbmQgPSBmdW5jdGlvbiAobGVnZW5kSXRlbSkge1xuICAgICAgICByZXR1cm4gbGVnZW5kSXRlbS5jbGFzc2VkKENMQVNTLmxlZ2VuZEl0ZW1IaWRkZW4pID8gbnVsbCA6IDAuMztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnRvZ2dsZUZvY3VzTGVnZW5kID0gZnVuY3Rpb24gKHRhcmdldElkcywgZm9jdXMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgdGFyZ2V0SWRzID0gJCQubWFwVG9UYXJnZXRJZHModGFyZ2V0SWRzKTtcbiAgICAgICAgJCQubGVnZW5kLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5sZWdlbmRJdGVtKVxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIHRhcmdldElkcy5pbmRleE9mKGlkKSA+PSAwOyB9KVxuICAgICAgICAgICAgLmNsYXNzZWQoQ0xBU1MubGVnZW5kSXRlbUZvY3VzZWQsIGZvY3VzKVxuICAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvcGFjaXR5ID0gZm9jdXMgPyAkJC5vcGFjaXR5Rm9yTGVnZW5kIDogJCQub3BhY2l0eUZvclVuZm9jdXNlZExlZ2VuZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BhY2l0eS5jYWxsKCQkLCAkJC5kMy5zZWxlY3QodGhpcykpO1xuICAgICAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZXZlcnRMZWdlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGQzID0gJCQuZDM7XG4gICAgICAgICQkLmxlZ2VuZC5zZWxlY3RBbGwoJy4nICsgQ0xBU1MubGVnZW5kSXRlbSlcbiAgICAgICAgICAgIC5jbGFzc2VkKENMQVNTLmxlZ2VuZEl0ZW1Gb2N1c2VkLCBmYWxzZSlcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJCQub3BhY2l0eUZvckxlZ2VuZChkMy5zZWxlY3QodGhpcykpOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnNob3dMZWdlbmQgPSBmdW5jdGlvbiAodGFyZ2V0SWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKCFjb25maWcubGVnZW5kX3Nob3cpIHtcbiAgICAgICAgICAgIGNvbmZpZy5sZWdlbmRfc2hvdyA9IHRydWU7XG4gICAgICAgICAgICAkJC5sZWdlbmQuc3R5bGUoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xuICAgICAgICAgICAgaWYgKCEkJC5sZWdlbmRIYXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgICAgICQkLnVwZGF0ZUxlZ2VuZFdpdGhEZWZhdWx0cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICQkLnJlbW92ZUhpZGRlbkxlZ2VuZElkcyh0YXJnZXRJZHMpO1xuICAgICAgICAkJC5sZWdlbmQuc2VsZWN0QWxsKCQkLnNlbGVjdG9yTGVnZW5kcyh0YXJnZXRJZHMpKVxuICAgICAgICAgICAgLnN0eWxlKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKVxuICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJCQub3BhY2l0eUZvckxlZ2VuZCgkJC5kMy5zZWxlY3QodGhpcykpOyB9KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmhpZGVMZWdlbmQgPSBmdW5jdGlvbiAodGFyZ2V0SWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKGNvbmZpZy5sZWdlbmRfc2hvdyAmJiBpc0VtcHR5KHRhcmdldElkcykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5sZWdlbmRfc2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgJCQubGVnZW5kLnN0eWxlKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuICAgICAgICB9XG4gICAgICAgICQkLmFkZEhpZGRlbkxlZ2VuZElkcyh0YXJnZXRJZHMpO1xuICAgICAgICAkJC5sZWdlbmQuc2VsZWN0QWxsKCQkLnNlbGVjdG9yTGVnZW5kcyh0YXJnZXRJZHMpKVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAgIC5zdHlsZSgndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsZWFyTGVnZW5kSXRlbVRleHRCb3hDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sZWdlbmRJdGVtVGV4dEJveCA9IHt9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlTGVnZW5kID0gZnVuY3Rpb24gKHRhcmdldElkcywgb3B0aW9ucywgdHJhbnNpdGlvbnMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICB2YXIgeEZvckxlZ2VuZCwgeEZvckxlZ2VuZFRleHQsIHhGb3JMZWdlbmRSZWN0LCB5Rm9yTGVnZW5kLCB5Rm9yTGVnZW5kVGV4dCwgeUZvckxlZ2VuZFJlY3QsIHgxRm9yTGVnZW5kVGlsZSwgeDJGb3JMZWdlbmRUaWxlLCB5Rm9yTGVnZW5kVGlsZTtcbiAgICAgICAgdmFyIHBhZGRpbmdUb3AgPSA0LCBwYWRkaW5nUmlnaHQgPSAxMCwgbWF4V2lkdGggPSAwLCBtYXhIZWlnaHQgPSAwLCBwb3NNaW4gPSAxMCwgdGlsZVdpZHRoID0gY29uZmlnLmxlZ2VuZF9pdGVtX3RpbGVfd2lkdGggKyA1O1xuICAgICAgICB2YXIgbCwgdG90YWxMZW5ndGggPSAwLCBvZmZzZXRzID0ge30sIHdpZHRocyA9IHt9LCBoZWlnaHRzID0ge30sIG1hcmdpbnMgPSBbMF0sIHN0ZXBzID0ge30sIHN0ZXAgPSAwO1xuICAgICAgICB2YXIgd2l0aFRyYW5zaXRpb24sIHdpdGhUcmFuc2l0aW9uRm9yVHJhbnNmb3JtO1xuICAgICAgICB2YXIgdGV4dHMsIHJlY3RzLCB0aWxlcywgYmFja2dyb3VuZDtcblxuICAgICAgICAvLyBTa2lwIGVsZW1lbnRzIHdoZW4gdGhlaXIgbmFtZSBpcyBzZXQgdG8gbnVsbFxuICAgICAgICB0YXJnZXRJZHMgPSB0YXJnZXRJZHMuZmlsdGVyKGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gIWlzRGVmaW5lZChjb25maWcuZGF0YV9uYW1lc1tpZF0pIHx8IGNvbmZpZy5kYXRhX25hbWVzW2lkXSAhPT0gbnVsbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHdpdGhUcmFuc2l0aW9uID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyYW5zaXRpb25cIiwgdHJ1ZSk7XG4gICAgICAgIHdpdGhUcmFuc2l0aW9uRm9yVHJhbnNmb3JtID0gZ2V0T3B0aW9uKG9wdGlvbnMsIFwid2l0aFRyYW5zaXRpb25Gb3JUcmFuc2Zvcm1cIiwgdHJ1ZSk7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VGV4dEJveCh0ZXh0RWxlbWVudCwgaWQpIHtcbiAgICAgICAgICAgIGlmICghJCQubGVnZW5kSXRlbVRleHRCb3hbaWRdKSB7XG4gICAgICAgICAgICAgICAgJCQubGVnZW5kSXRlbVRleHRCb3hbaWRdID0gJCQuZ2V0VGV4dFJlY3QodGV4dEVsZW1lbnQudGV4dENvbnRlbnQsIENMQVNTLmxlZ2VuZEl0ZW0sIHRleHRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkJC5sZWdlbmRJdGVtVGV4dEJveFtpZF07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbnModGV4dEVsZW1lbnQsIGlkLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIHJlc2V0ID0gaW5kZXggPT09IDAsIGlzTGFzdCA9IGluZGV4ID09PSB0YXJnZXRJZHMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBib3ggPSBnZXRUZXh0Qm94KHRleHRFbGVtZW50LCBpZCksXG4gICAgICAgICAgICAgICAgaXRlbVdpZHRoID0gYm94LndpZHRoICsgdGlsZVdpZHRoICsgKGlzTGFzdCAmJiAhKCQkLmlzTGVnZW5kUmlnaHQgfHwgJCQuaXNMZWdlbmRJbnNldCkgPyAwIDogcGFkZGluZ1JpZ2h0KSArIGNvbmZpZy5sZWdlbmRfcGFkZGluZyxcbiAgICAgICAgICAgICAgICBpdGVtSGVpZ2h0ID0gYm94LmhlaWdodCArIHBhZGRpbmdUb3AsXG4gICAgICAgICAgICAgICAgaXRlbUxlbmd0aCA9ICQkLmlzTGVnZW5kUmlnaHQgfHwgJCQuaXNMZWdlbmRJbnNldCA/IGl0ZW1IZWlnaHQgOiBpdGVtV2lkdGgsXG4gICAgICAgICAgICAgICAgYXJlYUxlbmd0aCA9ICQkLmlzTGVnZW5kUmlnaHQgfHwgJCQuaXNMZWdlbmRJbnNldCA/ICQkLmdldExlZ2VuZEhlaWdodCgpIDogJCQuZ2V0TGVnZW5kV2lkdGgoKSxcbiAgICAgICAgICAgICAgICBtYXJnaW4sIG1heExlbmd0aDtcblxuICAgICAgICAgICAgLy8gTUVNTzogY2FyZSBhYm91dCBjb25kaWZpb24gb2Ygc3RlcCwgdG90YWxMZW5ndGhcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVZhbHVlcyhpZCwgd2l0aG91dFN0ZXApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdpdGhvdXRTdGVwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IChhcmVhTGVuZ3RoIC0gdG90YWxMZW5ndGggLSBpdGVtTGVuZ3RoKSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJnaW4gPCBwb3NNaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IChhcmVhTGVuZ3RoIC0gaXRlbUxlbmd0aCkgLyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0ZXBzW2lkXSA9IHN0ZXA7XG4gICAgICAgICAgICAgICAgbWFyZ2luc1tzdGVwXSA9ICQkLmlzTGVnZW5kSW5zZXQgPyAxMCA6IG1hcmdpbjtcbiAgICAgICAgICAgICAgICBvZmZzZXRzW2lkXSA9IHRvdGFsTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IGl0ZW1MZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXNldCkge1xuICAgICAgICAgICAgICAgIHRvdGFsTGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5sZWdlbmRfc2hvdyAmJiAhJCQuaXNMZWdlbmRUb1Nob3coaWQpKSB7XG4gICAgICAgICAgICAgICAgd2lkdGhzW2lkXSA9IGhlaWdodHNbaWRdID0gc3RlcHNbaWRdID0gb2Zmc2V0c1tpZF0gPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2lkdGhzW2lkXSA9IGl0ZW1XaWR0aDtcbiAgICAgICAgICAgIGhlaWdodHNbaWRdID0gaXRlbUhlaWdodDtcblxuICAgICAgICAgICAgaWYgKCFtYXhXaWR0aCB8fCBpdGVtV2lkdGggPj0gbWF4V2lkdGgpIHsgbWF4V2lkdGggPSBpdGVtV2lkdGg7IH1cbiAgICAgICAgICAgIGlmICghbWF4SGVpZ2h0IHx8IGl0ZW1IZWlnaHQgPj0gbWF4SGVpZ2h0KSB7IG1heEhlaWdodCA9IGl0ZW1IZWlnaHQ7IH1cbiAgICAgICAgICAgIG1heExlbmd0aCA9ICQkLmlzTGVnZW5kUmlnaHQgfHwgJCQuaXNMZWdlbmRJbnNldCA/IG1heEhlaWdodCA6IG1heFdpZHRoO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLmxlZ2VuZF9lcXVhbGx5KSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMod2lkdGhzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgeyB3aWR0aHNbaWRdID0gbWF4V2lkdGg7IH0pO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGhlaWdodHMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IGhlaWdodHNbaWRdID0gbWF4SGVpZ2h0OyB9KTtcbiAgICAgICAgICAgICAgICBtYXJnaW4gPSAoYXJlYUxlbmd0aCAtIG1heExlbmd0aCAqIHRhcmdldElkcy5sZW5ndGgpIC8gMjtcbiAgICAgICAgICAgICAgICBpZiAobWFyZ2luIDwgcG9zTWluKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsTGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RlcCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgeyB1cGRhdGVWYWx1ZXMoaWQpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZhbHVlcyhpZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZXMoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQkLmlzTGVnZW5kSW5zZXQpIHtcbiAgICAgICAgICAgIHN0ZXAgPSBjb25maWcubGVnZW5kX2luc2V0X3N0ZXAgPyBjb25maWcubGVnZW5kX2luc2V0X3N0ZXAgOiB0YXJnZXRJZHMubGVuZ3RoO1xuICAgICAgICAgICAgJCQudXBkYXRlTGVnZW5kU3RlcChzdGVwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgkJC5pc0xlZ2VuZFJpZ2h0KSB7XG4gICAgICAgICAgICB4Rm9yTGVnZW5kID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBtYXhXaWR0aCAqIHN0ZXBzW2lkXTsgfTtcbiAgICAgICAgICAgIHlGb3JMZWdlbmQgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIG1hcmdpbnNbc3RlcHNbaWRdXSArIG9mZnNldHNbaWRdOyB9O1xuICAgICAgICB9IGVsc2UgaWYgKCQkLmlzTGVnZW5kSW5zZXQpIHtcbiAgICAgICAgICAgIHhGb3JMZWdlbmQgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIG1heFdpZHRoICogc3RlcHNbaWRdICsgMTA7IH07XG4gICAgICAgICAgICB5Rm9yTGVnZW5kID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBtYXJnaW5zW3N0ZXBzW2lkXV0gKyBvZmZzZXRzW2lkXTsgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhGb3JMZWdlbmQgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIG1hcmdpbnNbc3RlcHNbaWRdXSArIG9mZnNldHNbaWRdOyB9O1xuICAgICAgICAgICAgeUZvckxlZ2VuZCA9IGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gbWF4SGVpZ2h0ICogc3RlcHNbaWRdOyB9O1xuICAgICAgICB9XG4gICAgICAgIHhGb3JMZWdlbmRUZXh0ID0gZnVuY3Rpb24gKGlkLCBpKSB7IHJldHVybiB4Rm9yTGVnZW5kKGlkLCBpKSArIDQgKyBjb25maWcubGVnZW5kX2l0ZW1fdGlsZV93aWR0aDsgfTtcbiAgICAgICAgeUZvckxlZ2VuZFRleHQgPSBmdW5jdGlvbiAoaWQsIGkpIHsgcmV0dXJuIHlGb3JMZWdlbmQoaWQsIGkpICsgOTsgfTtcbiAgICAgICAgeEZvckxlZ2VuZFJlY3QgPSBmdW5jdGlvbiAoaWQsIGkpIHsgcmV0dXJuIHhGb3JMZWdlbmQoaWQsIGkpOyB9O1xuICAgICAgICB5Rm9yTGVnZW5kUmVjdCA9IGZ1bmN0aW9uIChpZCwgaSkgeyByZXR1cm4geUZvckxlZ2VuZChpZCwgaSkgLSA1OyB9O1xuICAgICAgICB4MUZvckxlZ2VuZFRpbGUgPSBmdW5jdGlvbiAoaWQsIGkpIHsgcmV0dXJuIHhGb3JMZWdlbmQoaWQsIGkpIC0gMjsgfTtcbiAgICAgICAgeDJGb3JMZWdlbmRUaWxlID0gZnVuY3Rpb24gKGlkLCBpKSB7IHJldHVybiB4Rm9yTGVnZW5kKGlkLCBpKSAtIDIgKyBjb25maWcubGVnZW5kX2l0ZW1fdGlsZV93aWR0aDsgfTtcbiAgICAgICAgeUZvckxlZ2VuZFRpbGUgPSBmdW5jdGlvbiAoaWQsIGkpIHsgcmV0dXJuIHlGb3JMZWdlbmQoaWQsIGkpICsgNDsgfTtcblxuICAgICAgICAvLyBEZWZpbmUgZyBmb3IgbGVnZW5kIGFyZWFcbiAgICAgICAgbCA9ICQkLmxlZ2VuZC5zZWxlY3RBbGwoJy4nICsgQ0xBU1MubGVnZW5kSXRlbSlcbiAgICAgICAgICAgIC5kYXRhKHRhcmdldElkcylcbiAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuICQkLmdlbmVyYXRlQ2xhc3MoQ0xBU1MubGVnZW5kSXRlbSwgaWQpOyB9KVxuICAgICAgICAgICAgLnN0eWxlKCd2aXNpYmlsaXR5JywgZnVuY3Rpb24gKGlkKSB7IHJldHVybiAkJC5pc0xlZ2VuZFRvU2hvdyhpZCkgPyAndmlzaWJsZScgOiAnaGlkZGVuJzsgfSlcbiAgICAgICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcubGVnZW5kX2l0ZW1fb25jbGljaykge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcubGVnZW5kX2l0ZW1fb25jbGljay5jYWxsKCQkLCBpZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCQkLmQzLmV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCQuYXBpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQkLmFwaS5zaG93KGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQkLmFwaS50b2dnbGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJCQuaXNUYXJnZXRUb1Nob3coaWQpID8gJCQuYXBpLmZvY3VzKGlkKSA6ICQkLmFwaS5yZXZlcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcubGVnZW5kX2l0ZW1fb25tb3VzZW92ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmxlZ2VuZF9pdGVtX29ubW91c2VvdmVyLmNhbGwoJCQsIGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQkLmQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKENMQVNTLmxlZ2VuZEl0ZW1Gb2N1c2VkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkJC50cmFuc2l0aW5nICYmICQkLmlzVGFyZ2V0VG9TaG93KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCQuYXBpLmZvY3VzKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ21vdXNlb3V0JywgZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5sZWdlbmRfaXRlbV9vbm1vdXNlb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sZWdlbmRfaXRlbV9vbm1vdXNlb3V0LmNhbGwoJCQsIGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQkLmQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKENMQVNTLmxlZ2VuZEl0ZW1Gb2N1c2VkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICQkLmFwaS5yZXZlcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgbC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBpc0RlZmluZWQoY29uZmlnLmRhdGFfbmFtZXNbaWRdKSA/IGNvbmZpZy5kYXRhX25hbWVzW2lkXSA6IGlkOyB9KVxuICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGlkLCBpKSB7IHVwZGF0ZVBvc2l0aW9ucyh0aGlzLCBpZCwgaSk7IH0pXG4gICAgICAgICAgICAuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIilcbiAgICAgICAgICAgIC5hdHRyKCd4JywgJCQuaXNMZWdlbmRSaWdodCB8fCAkJC5pc0xlZ2VuZEluc2V0ID8geEZvckxlZ2VuZFRleHQgOiAtMjAwKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCAkJC5pc0xlZ2VuZFJpZ2h0IHx8ICQkLmlzTGVnZW5kSW5zZXQgPyAtMjAwIDogeUZvckxlZ2VuZFRleHQpO1xuICAgICAgICBsLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmxlZ2VuZEl0ZW1FdmVudClcbiAgICAgICAgICAgIC5zdHlsZSgnZmlsbC1vcGFjaXR5JywgMClcbiAgICAgICAgICAgIC5hdHRyKCd4JywgJCQuaXNMZWdlbmRSaWdodCB8fCAkJC5pc0xlZ2VuZEluc2V0ID8geEZvckxlZ2VuZFJlY3QgOiAtMjAwKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCAkJC5pc0xlZ2VuZFJpZ2h0IHx8ICQkLmlzTGVnZW5kSW5zZXQgPyAtMjAwIDogeUZvckxlZ2VuZFJlY3QpO1xuICAgICAgICBsLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBDTEFTUy5sZWdlbmRJdGVtVGlsZSlcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJCQuY29sb3IpXG4gICAgICAgICAgICAuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIilcbiAgICAgICAgICAgIC5hdHRyKCd4MScsICQkLmlzTGVnZW5kUmlnaHQgfHwgJCQuaXNMZWdlbmRJbnNldCA/IHgxRm9yTGVnZW5kVGlsZSA6IC0yMDApXG4gICAgICAgICAgICAuYXR0cigneTEnLCAkJC5pc0xlZ2VuZFJpZ2h0IHx8ICQkLmlzTGVnZW5kSW5zZXQgPyAtMjAwIDogeUZvckxlZ2VuZFRpbGUpXG4gICAgICAgICAgICAuYXR0cigneDInLCAkJC5pc0xlZ2VuZFJpZ2h0IHx8ICQkLmlzTGVnZW5kSW5zZXQgPyB4MkZvckxlZ2VuZFRpbGUgOiAtMjAwKVxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgJCQuaXNMZWdlbmRSaWdodCB8fCAkJC5pc0xlZ2VuZEluc2V0ID8gLTIwMCA6IHlGb3JMZWdlbmRUaWxlKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGNvbmZpZy5sZWdlbmRfaXRlbV90aWxlX2hlaWdodCk7XG5cbiAgICAgICAgLy8gU2V0IGJhY2tncm91bmQgZm9yIGluc2V0IGxlZ2VuZFxuICAgICAgICBiYWNrZ3JvdW5kID0gJCQubGVnZW5kLnNlbGVjdCgnLicgKyBDTEFTUy5sZWdlbmRCYWNrZ3JvdW5kICsgJyByZWN0Jyk7XG4gICAgICAgIGlmICgkJC5pc0xlZ2VuZEluc2V0ICYmIG1heFdpZHRoID4gMCAmJiBiYWNrZ3JvdW5kLnNpemUoKSA9PT0gMCkge1xuICAgICAgICAgICAgYmFja2dyb3VuZCA9ICQkLmxlZ2VuZC5pbnNlcnQoJ2cnLCAnLicgKyBDTEFTUy5sZWdlbmRJdGVtKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MubGVnZW5kQmFja2dyb3VuZClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0cyA9ICQkLmxlZ2VuZC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAgICAgLmRhdGEodGFyZ2V0SWRzKVxuICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBpc0RlZmluZWQoY29uZmlnLmRhdGFfbmFtZXNbaWRdKSA/IGNvbmZpZy5kYXRhX25hbWVzW2lkXSA6IGlkOyB9KSAvLyBNRU1POiBuZWVkZWQgZm9yIHVwZGF0ZVxuICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGlkLCBpKSB7IHVwZGF0ZVBvc2l0aW9ucyh0aGlzLCBpZCwgaSk7IH0pO1xuICAgICAgICAod2l0aFRyYW5zaXRpb24gPyB0ZXh0cy50cmFuc2l0aW9uKCkgOiB0ZXh0cylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgeEZvckxlZ2VuZFRleHQpXG4gICAgICAgICAgICAuYXR0cigneScsIHlGb3JMZWdlbmRUZXh0KTtcblxuICAgICAgICByZWN0cyA9ICQkLmxlZ2VuZC5zZWxlY3RBbGwoJ3JlY3QuJyArIENMQVNTLmxlZ2VuZEl0ZW1FdmVudClcbiAgICAgICAgICAgIC5kYXRhKHRhcmdldElkcyk7XG4gICAgICAgICh3aXRoVHJhbnNpdGlvbiA/IHJlY3RzLnRyYW5zaXRpb24oKSA6IHJlY3RzKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgZnVuY3Rpb24gKGlkKSB7IHJldHVybiB3aWR0aHNbaWRdOyB9KVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gaGVpZ2h0c1tpZF07IH0pXG4gICAgICAgICAgICAuYXR0cigneCcsIHhGb3JMZWdlbmRSZWN0KVxuICAgICAgICAgICAgLmF0dHIoJ3knLCB5Rm9yTGVnZW5kUmVjdCk7XG5cbiAgICAgICAgdGlsZXMgPSAkJC5sZWdlbmQuc2VsZWN0QWxsKCdsaW5lLicgKyBDTEFTUy5sZWdlbmRJdGVtVGlsZSlcbiAgICAgICAgICAgICAgICAuZGF0YSh0YXJnZXRJZHMpO1xuICAgICAgICAgICAgKHdpdGhUcmFuc2l0aW9uID8gdGlsZXMudHJhbnNpdGlvbigpIDogdGlsZXMpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAkJC5jb2xvcilcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB4MUZvckxlZ2VuZFRpbGUpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgeUZvckxlZ2VuZFRpbGUpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgeDJGb3JMZWdlbmRUaWxlKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHlGb3JMZWdlbmRUaWxlKTtcblxuICAgICAgICBpZiAoYmFja2dyb3VuZCkge1xuICAgICAgICAgICAgKHdpdGhUcmFuc2l0aW9uID8gYmFja2dyb3VuZC50cmFuc2l0aW9uKCkgOiBiYWNrZ3JvdW5kKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAkJC5nZXRMZWdlbmRIZWlnaHQoKSAtIDEyKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIG1heFdpZHRoICogKHN0ZXAgKyAxKSArIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvZ2dsZSBsZWdlbmQgc3RhdGVcbiAgICAgICAgJCQubGVnZW5kLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5sZWdlbmRJdGVtKVxuICAgICAgICAgICAgLmNsYXNzZWQoQ0xBU1MubGVnZW5kSXRlbUhpZGRlbiwgZnVuY3Rpb24gKGlkKSB7IHJldHVybiAhJCQuaXNUYXJnZXRUb1Nob3coaWQpOyB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgYWxsIHRvIHJlZmxlY3QgY2hhbmdlIG9mIGxlZ2VuZFxuICAgICAgICAkJC51cGRhdGVMZWdlbmRJdGVtV2lkdGgobWF4V2lkdGgpO1xuICAgICAgICAkJC51cGRhdGVMZWdlbmRJdGVtSGVpZ2h0KG1heEhlaWdodCk7XG4gICAgICAgICQkLnVwZGF0ZUxlZ2VuZFN0ZXAoc3RlcCk7XG4gICAgICAgIC8vIFVwZGF0ZSBzaXplIGFuZCBzY2FsZVxuICAgICAgICAkJC51cGRhdGVTaXplcygpO1xuICAgICAgICAkJC51cGRhdGVTY2FsZXMoKTtcbiAgICAgICAgJCQudXBkYXRlU3ZnU2l6ZSgpO1xuICAgICAgICAvLyBVcGRhdGUgZyBwb3NpdGlvbnNcbiAgICAgICAgJCQudHJhbnNmb3JtQWxsKHdpdGhUcmFuc2l0aW9uRm9yVHJhbnNmb3JtLCB0cmFuc2l0aW9ucyk7XG4gICAgICAgICQkLmxlZ2VuZEhhc1JlbmRlcmVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdFRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICAkJC50aXRsZSA9ICQkLnN2Zy5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgICAgICAgIC50ZXh0KCQkLmNvbmZpZy50aXRsZV90ZXh0KVxuICAgICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsICQkLkNMQVNTLnRpdGxlKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlZHJhd1RpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICAkJC50aXRsZVxuICAgICAgICAgICAgICAuYXR0cihcInhcIiwgJCQueEZvclRpdGxlLmJpbmQoJCQpKVxuICAgICAgICAgICAgICAuYXR0cihcInlcIiwgJCQueUZvclRpdGxlLmJpbmQoJCQpKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnhGb3JUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCBwb3NpdGlvbiA9IGNvbmZpZy50aXRsZV9wb3NpdGlvbiB8fCAnbGVmdCcsIHg7XG4gICAgICAgIGlmIChwb3NpdGlvbi5pbmRleE9mKCdyaWdodCcpID49IDApIHtcbiAgICAgICAgICAgIHggPSAkJC5jdXJyZW50V2lkdGggLSAkJC5nZXRUZXh0UmVjdCgkJC50aXRsZS5ub2RlKCkudGV4dENvbnRlbnQsICQkLkNMQVNTLnRpdGxlLCAkJC50aXRsZS5ub2RlKCkpLndpZHRoIC0gY29uZmlnLnRpdGxlX3BhZGRpbmcucmlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24uaW5kZXhPZignY2VudGVyJykgPj0gMCkge1xuICAgICAgICAgICAgeCA9ICgkJC5jdXJyZW50V2lkdGggLSAkJC5nZXRUZXh0UmVjdCgkJC50aXRsZS5ub2RlKCkudGV4dENvbnRlbnQsICQkLkNMQVNTLnRpdGxlLCAkJC50aXRsZS5ub2RlKCkpLndpZHRoKSAvIDI7XG4gICAgICAgIH0gZWxzZSB7IC8vIGxlZnRcbiAgICAgICAgICAgIHggPSBjb25maWcudGl0bGVfcGFkZGluZy5sZWZ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ueUZvclRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gJCQuY29uZmlnLnRpdGxlX3BhZGRpbmcudG9wICsgJCQuZ2V0VGV4dFJlY3QoJCQudGl0bGUubm9kZSgpLnRleHRDb250ZW50LCAkJC5DTEFTUy50aXRsZSwgJCQudGl0bGUubm9kZSgpKS5oZWlnaHQ7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRUaXRsZVBhZGRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgcmV0dXJuICQkLnlGb3JUaXRsZSgpICsgJCQuY29uZmlnLnRpdGxlX3BhZGRpbmcuYm90dG9tO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBBeGlzKG93bmVyKSB7XG4gICAgICAgIEFQSS5jYWxsKHRoaXMsIG93bmVyKTtcbiAgICB9XG5cbiAgICBpbmhlcml0KEFQSSwgQXhpcyk7XG5cbiAgICBBeGlzLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gaW5pdCgpIHtcblxuICAgICAgICB2YXIgJCQgPSB0aGlzLm93bmVyLCBjb25maWcgPSAkJC5jb25maWcsIG1haW4gPSAkJC5tYWluO1xuICAgICAgICAkJC5heGVzLnggPSBtYWluLmFwcGVuZChcImdcIilcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MuYXhpcyArICcgJyArIENMQVNTLmF4aXNYKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgJCQuY2xpcFBhdGhGb3JYQXhpcylcbiAgICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsICQkLmdldFRyYW5zbGF0ZSgneCcpKVxuICAgICAgICAgICAgLnN0eWxlKFwidmlzaWJpbGl0eVwiLCBjb25maWcuYXhpc194X3Nob3cgPyAndmlzaWJsZScgOiAnaGlkZGVuJyk7XG4gICAgICAgICQkLmF4ZXMueC5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmF4aXNYTGFiZWwpXG4gICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gXCJyb3RhdGUoLTkwKVwiIDogXCJcIilcbiAgICAgICAgICAgIC5zdHlsZShcInRleHQtYW5jaG9yXCIsIHRoaXMudGV4dEFuY2hvckZvclhBeGlzTGFiZWwuYmluZCh0aGlzKSk7XG4gICAgICAgICQkLmF4ZXMueSA9IG1haW4uYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy5heGlzICsgJyAnICsgQ0xBU1MuYXhpc1kpXG4gICAgICAgICAgICAuYXR0cihcImNsaXAtcGF0aFwiLCBjb25maWcuYXhpc195X2lubmVyID8gXCJcIiA6ICQkLmNsaXBQYXRoRm9yWUF4aXMpXG4gICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAkJC5nZXRUcmFuc2xhdGUoJ3knKSlcbiAgICAgICAgICAgIC5zdHlsZShcInZpc2liaWxpdHlcIiwgY29uZmlnLmF4aXNfeV9zaG93ID8gJ3Zpc2libGUnIDogJ2hpZGRlbicpO1xuICAgICAgICAkJC5heGVzLnkuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy5heGlzWUxhYmVsKVxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IFwiXCIgOiBcInJvdGF0ZSgtOTApXCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJ0ZXh0LWFuY2hvclwiLCB0aGlzLnRleHRBbmNob3JGb3JZQXhpc0xhYmVsLmJpbmQodGhpcykpO1xuXG4gICAgICAgICQkLmF4ZXMueTIgPSBtYWluLmFwcGVuZChcImdcIilcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MuYXhpcyArICcgJyArIENMQVNTLmF4aXNZMilcbiAgICAgICAgICAgIC8vIGNsaXAtcGF0aD9cbiAgICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsICQkLmdldFRyYW5zbGF0ZSgneTInKSlcbiAgICAgICAgICAgIC5zdHlsZShcInZpc2liaWxpdHlcIiwgY29uZmlnLmF4aXNfeTJfc2hvdyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKTtcbiAgICAgICAgJCQuYXhlcy55Mi5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmF4aXNZMkxhYmVsKVxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IFwiXCIgOiBcInJvdGF0ZSgtOTApXCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJ0ZXh0LWFuY2hvclwiLCB0aGlzLnRleHRBbmNob3JGb3JZMkF4aXNMYWJlbC5iaW5kKHRoaXMpKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmdldFhBeGlzID0gZnVuY3Rpb24gZ2V0WEF4aXMoc2NhbGUsIG9yaWVudCwgdGlja0Zvcm1hdCwgdGlja1ZhbHVlcywgd2l0aE91dGVyVGljaywgd2l0aG91dFRyYW5zaXRpb24sIHdpdGhvdXRSb3RhdGVUaWNrVGV4dCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLm93bmVyLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBheGlzUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGlzQ2F0ZWdvcnk6ICQkLmlzQ2F0ZWdvcml6ZWQoKSxcbiAgICAgICAgICAgICAgICB3aXRoT3V0ZXJUaWNrOiB3aXRoT3V0ZXJUaWNrLFxuICAgICAgICAgICAgICAgIHRpY2tNdWx0aWxpbmU6IGNvbmZpZy5heGlzX3hfdGlja19tdWx0aWxpbmUsXG4gICAgICAgICAgICAgICAgdGlja1dpZHRoOiBjb25maWcuYXhpc194X3RpY2tfd2lkdGgsXG4gICAgICAgICAgICAgICAgdGlja1RleHRSb3RhdGU6IHdpdGhvdXRSb3RhdGVUaWNrVGV4dCA/IDAgOiBjb25maWcuYXhpc194X3RpY2tfcm90YXRlLFxuICAgICAgICAgICAgICAgIHdpdGhvdXRUcmFuc2l0aW9uOiB3aXRob3V0VHJhbnNpdGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBheGlzID0gYzNfYXhpcygkJC5kMywgYXhpc1BhcmFtcykuc2NhbGUoc2NhbGUpLm9yaWVudChvcmllbnQpO1xuXG4gICAgICAgIGlmICgkJC5pc1RpbWVTZXJpZXMoKSAmJiB0aWNrVmFsdWVzICYmIHR5cGVvZiB0aWNrVmFsdWVzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRpY2tWYWx1ZXMgPSB0aWNrVmFsdWVzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gJCQucGFyc2VEYXRlKHYpOyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aWNrXG4gICAgICAgIGF4aXMudGlja0Zvcm1hdCh0aWNrRm9ybWF0KS50aWNrVmFsdWVzKHRpY2tWYWx1ZXMpO1xuICAgICAgICBpZiAoJCQuaXNDYXRlZ29yaXplZCgpKSB7XG4gICAgICAgICAgICBheGlzLnRpY2tDZW50ZXJlZChjb25maWcuYXhpc194X3RpY2tfY2VudGVyZWQpO1xuICAgICAgICAgICAgaWYgKGlzRW1wdHkoY29uZmlnLmF4aXNfeF90aWNrX2N1bGxpbmcpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmF4aXNfeF90aWNrX2N1bGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBheGlzO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUudXBkYXRlWEF4aXNUaWNrVmFsdWVzID0gZnVuY3Rpb24gdXBkYXRlWEF4aXNUaWNrVmFsdWVzKHRhcmdldHMsIGF4aXMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5vd25lciwgY29uZmlnID0gJCQuY29uZmlnLCB0aWNrVmFsdWVzO1xuICAgICAgICBpZiAoY29uZmlnLmF4aXNfeF90aWNrX2ZpdCB8fCBjb25maWcuYXhpc194X3RpY2tfY291bnQpIHtcbiAgICAgICAgICAgIHRpY2tWYWx1ZXMgPSB0aGlzLmdlbmVyYXRlVGlja1ZhbHVlcygkJC5tYXBUYXJnZXRzVG9VbmlxdWVYcyh0YXJnZXRzKSwgY29uZmlnLmF4aXNfeF90aWNrX2NvdW50LCAkJC5pc1RpbWVTZXJpZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMpIHtcbiAgICAgICAgICAgIGF4aXMudGlja1ZhbHVlcyh0aWNrVmFsdWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQkLnhBeGlzLnRpY2tWYWx1ZXModGlja1ZhbHVlcyk7XG4gICAgICAgICAgICAkJC5zdWJYQXhpcy50aWNrVmFsdWVzKHRpY2tWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWNrVmFsdWVzO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZ2V0WUF4aXMgPSBmdW5jdGlvbiBnZXRZQXhpcyhzY2FsZSwgb3JpZW50LCB0aWNrRm9ybWF0LCB0aWNrVmFsdWVzLCB3aXRoT3V0ZXJUaWNrLCB3aXRob3V0VHJhbnNpdGlvbiwgd2l0aG91dFJvdGF0ZVRpY2tUZXh0KSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMub3duZXIsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGF4aXNQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgd2l0aE91dGVyVGljazogd2l0aE91dGVyVGljayxcbiAgICAgICAgICAgICAgICB3aXRob3V0VHJhbnNpdGlvbjogd2l0aG91dFRyYW5zaXRpb24sXG4gICAgICAgICAgICAgICAgdGlja1RleHRSb3RhdGU6IHdpdGhvdXRSb3RhdGVUaWNrVGV4dCA/IDAgOiBjb25maWcuYXhpc195X3RpY2tfcm90YXRlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXhpcyA9IGMzX2F4aXMoJCQuZDMsIGF4aXNQYXJhbXMpLnNjYWxlKHNjYWxlKS5vcmllbnQob3JpZW50KS50aWNrRm9ybWF0KHRpY2tGb3JtYXQpO1xuICAgICAgICBpZiAoJCQuaXNUaW1lU2VyaWVzWSgpKSB7XG4gICAgICAgICAgICBheGlzLnRpY2tzKCQkLmQzLnRpbWVbY29uZmlnLmF4aXNfeV90aWNrX3RpbWVfdmFsdWVdLCBjb25maWcuYXhpc195X3RpY2tfdGltZV9pbnRlcnZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBheGlzLnRpY2tWYWx1ZXModGlja1ZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uIGdldElkKGlkKSB7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm93bmVyLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIGlkIGluIGNvbmZpZy5kYXRhX2F4ZXMgPyBjb25maWcuZGF0YV9heGVzW2lkXSA6ICd5JztcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmdldFhBeGlzVGlja0Zvcm1hdCA9IGZ1bmN0aW9uIGdldFhBeGlzVGlja0Zvcm1hdCgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5vd25lciwgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgZm9ybWF0ID0gJCQuaXNUaW1lU2VyaWVzKCkgPyAkJC5kZWZhdWx0QXhpc1RpbWVGb3JtYXQgOiAkJC5pc0NhdGVnb3JpemVkKCkgPyAkJC5jYXRlZ29yeU5hbWUgOiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiA8IDAgPyB2LnRvRml4ZWQoMCkgOiB2OyB9O1xuICAgICAgICBpZiAoY29uZmlnLmF4aXNfeF90aWNrX2Zvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29uZmlnLmF4aXNfeF90aWNrX2Zvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuYXhpc194X3RpY2tfZm9ybWF0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkJC5pc1RpbWVTZXJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlID8gJCQuYXhpc1RpbWVGb3JtYXQoY29uZmlnLmF4aXNfeF90aWNrX2Zvcm1hdCkoZGF0ZSkgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiBmb3JtYXQuY2FsbCgkJCwgdik7IH0gOiBmb3JtYXQ7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5nZXRUaWNrVmFsdWVzID0gZnVuY3Rpb24gZ2V0VGlja1ZhbHVlcyh0aWNrVmFsdWVzLCBheGlzKSB7XG4gICAgICAgIHJldHVybiB0aWNrVmFsdWVzID8gdGlja1ZhbHVlcyA6IGF4aXMgPyBheGlzLnRpY2tWYWx1ZXMoKSA6IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmdldFhBeGlzVGlja1ZhbHVlcyA9IGZ1bmN0aW9uIGdldFhBeGlzVGlja1ZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGlja1ZhbHVlcyh0aGlzLm93bmVyLmNvbmZpZy5heGlzX3hfdGlja192YWx1ZXMsIHRoaXMub3duZXIueEF4aXMpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZ2V0WUF4aXNUaWNrVmFsdWVzID0gZnVuY3Rpb24gZ2V0WUF4aXNUaWNrVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUaWNrVmFsdWVzKHRoaXMub3duZXIuY29uZmlnLmF4aXNfeV90aWNrX3ZhbHVlcywgdGhpcy5vd25lci55QXhpcyk7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5nZXRZMkF4aXNUaWNrVmFsdWVzID0gZnVuY3Rpb24gZ2V0WTJBeGlzVGlja1ZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGlja1ZhbHVlcyh0aGlzLm93bmVyLmNvbmZpZy5heGlzX3kyX3RpY2tfdmFsdWVzLCB0aGlzLm93bmVyLnkyQXhpcyk7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5nZXRMYWJlbE9wdGlvbkJ5QXhpc0lkID0gZnVuY3Rpb24gZ2V0TGFiZWxPcHRpb25CeUF4aXNJZChheGlzSWQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5vd25lciwgY29uZmlnID0gJCQuY29uZmlnLCBvcHRpb247XG4gICAgICAgIGlmIChheGlzSWQgPT09ICd5Jykge1xuICAgICAgICAgICAgb3B0aW9uID0gY29uZmlnLmF4aXNfeV9sYWJlbDtcbiAgICAgICAgfSBlbHNlIGlmIChheGlzSWQgPT09ICd5MicpIHtcbiAgICAgICAgICAgIG9wdGlvbiA9IGNvbmZpZy5heGlzX3kyX2xhYmVsO1xuICAgICAgICB9IGVsc2UgaWYgKGF4aXNJZCA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBvcHRpb24gPSBjb25maWcuYXhpc194X2xhYmVsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb247XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5nZXRMYWJlbFRleHQgPSBmdW5jdGlvbiBnZXRMYWJlbFRleHQoYXhpc0lkKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSB0aGlzLmdldExhYmVsT3B0aW9uQnlBeGlzSWQoYXhpc0lkKTtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKG9wdGlvbikgPyBvcHRpb24gOiBvcHRpb24gPyBvcHRpb24udGV4dCA6IG51bGw7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5zZXRMYWJlbFRleHQgPSBmdW5jdGlvbiBzZXRMYWJlbFRleHQoYXhpc0lkLCB0ZXh0KSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMub3duZXIsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIG9wdGlvbiA9IHRoaXMuZ2V0TGFiZWxPcHRpb25CeUF4aXNJZChheGlzSWQpO1xuICAgICAgICBpZiAoaXNTdHJpbmcob3B0aW9uKSkge1xuICAgICAgICAgICAgaWYgKGF4aXNJZCA9PT0gJ3knKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmF4aXNfeV9sYWJlbCA9IHRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGF4aXNJZCA9PT0gJ3kyJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5heGlzX3kyX2xhYmVsID0gdGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXhpc0lkID09PSAneCcpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuYXhpc194X2xhYmVsID0gdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbi50ZXh0ID0gdGV4dDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZ2V0TGFiZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIGdldExhYmVsUG9zaXRpb24oYXhpc0lkLCBkZWZhdWx0UG9zaXRpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMuZ2V0TGFiZWxPcHRpb25CeUF4aXNJZChheGlzSWQpLFxuICAgICAgICAgICAgcG9zaXRpb24gPSAob3B0aW9uICYmIHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbi5wb3NpdGlvbikgPyBvcHRpb24ucG9zaXRpb24gOiBkZWZhdWx0UG9zaXRpb247XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc0lubmVyOiBwb3NpdGlvbi5pbmRleE9mKCdpbm5lcicpID49IDAsXG4gICAgICAgICAgICBpc091dGVyOiBwb3NpdGlvbi5pbmRleE9mKCdvdXRlcicpID49IDAsXG4gICAgICAgICAgICBpc0xlZnQ6IHBvc2l0aW9uLmluZGV4T2YoJ2xlZnQnKSA+PSAwLFxuICAgICAgICAgICAgaXNDZW50ZXI6IHBvc2l0aW9uLmluZGV4T2YoJ2NlbnRlcicpID49IDAsXG4gICAgICAgICAgICBpc1JpZ2h0OiBwb3NpdGlvbi5pbmRleE9mKCdyaWdodCcpID49IDAsXG4gICAgICAgICAgICBpc1RvcDogcG9zaXRpb24uaW5kZXhPZigndG9wJykgPj0gMCxcbiAgICAgICAgICAgIGlzTWlkZGxlOiBwb3NpdGlvbi5pbmRleE9mKCdtaWRkbGUnKSA+PSAwLFxuICAgICAgICAgICAgaXNCb3R0b206IHBvc2l0aW9uLmluZGV4T2YoJ2JvdHRvbScpID49IDBcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmdldFhBeGlzTGFiZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIGdldFhBeGlzTGFiZWxQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWxQb3NpdGlvbigneCcsIHRoaXMub3duZXIuY29uZmlnLmF4aXNfcm90YXRlZCA/ICdpbm5lci10b3AnIDogJ2lubmVyLXJpZ2h0Jyk7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5nZXRZQXhpc0xhYmVsUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRZQXhpc0xhYmVsUG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExhYmVsUG9zaXRpb24oJ3knLCB0aGlzLm93bmVyLmNvbmZpZy5heGlzX3JvdGF0ZWQgPyAnaW5uZXItcmlnaHQnIDogJ2lubmVyLXRvcCcpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZ2V0WTJBeGlzTGFiZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIGdldFkyQXhpc0xhYmVsUG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExhYmVsUG9zaXRpb24oJ3kyJywgdGhpcy5vd25lci5jb25maWcuYXhpc19yb3RhdGVkID8gJ2lubmVyLXJpZ2h0JyA6ICdpbm5lci10b3AnKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmdldExhYmVsUG9zaXRpb25CeUlkID0gZnVuY3Rpb24gZ2V0TGFiZWxQb3NpdGlvbkJ5SWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAneTInID8gdGhpcy5nZXRZMkF4aXNMYWJlbFBvc2l0aW9uKCkgOiBpZCA9PT0gJ3knID8gdGhpcy5nZXRZQXhpc0xhYmVsUG9zaXRpb24oKSA6IHRoaXMuZ2V0WEF4aXNMYWJlbFBvc2l0aW9uKCk7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS50ZXh0Rm9yWEF4aXNMYWJlbCA9IGZ1bmN0aW9uIHRleHRGb3JYQXhpc0xhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbFRleHQoJ3gnKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLnRleHRGb3JZQXhpc0xhYmVsID0gZnVuY3Rpb24gdGV4dEZvcllBeGlzTGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExhYmVsVGV4dCgneScpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUudGV4dEZvclkyQXhpc0xhYmVsID0gZnVuY3Rpb24gdGV4dEZvclkyQXhpc0xhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbFRleHQoJ3kyJyk7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS54Rm9yQXhpc0xhYmVsID0gZnVuY3Rpb24geEZvckF4aXNMYWJlbChmb3JIb3Jpem9udGFsLCBwb3NpdGlvbikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLm93bmVyO1xuICAgICAgICBpZiAoZm9ySG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmlzTGVmdCA/IDAgOiBwb3NpdGlvbi5pc0NlbnRlciA/ICQkLndpZHRoIC8gMiA6ICQkLndpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmlzQm90dG9tID8gLSQkLmhlaWdodCA6IHBvc2l0aW9uLmlzTWlkZGxlID8gLSQkLmhlaWdodCAvIDIgOiAwO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5keEZvckF4aXNMYWJlbCA9IGZ1bmN0aW9uIGR4Rm9yQXhpc0xhYmVsKGZvckhvcml6b250YWwsIHBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChmb3JIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb24uaXNMZWZ0ID8gXCIwLjVlbVwiIDogcG9zaXRpb24uaXNSaWdodCA/IFwiLTAuNWVtXCIgOiBcIjBcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbi5pc1RvcCA/IFwiLTAuNWVtXCIgOiBwb3NpdGlvbi5pc0JvdHRvbSA/IFwiMC41ZW1cIiA6IFwiMFwiO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS50ZXh0QW5jaG9yRm9yQXhpc0xhYmVsID0gZnVuY3Rpb24gdGV4dEFuY2hvckZvckF4aXNMYWJlbChmb3JIb3Jpem9udGFsLCBwb3NpdGlvbikge1xuICAgICAgICBpZiAoZm9ySG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmlzTGVmdCA/ICdzdGFydCcgOiBwb3NpdGlvbi5pc0NlbnRlciA/ICdtaWRkbGUnIDogJ2VuZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb24uaXNCb3R0b20gPyAnc3RhcnQnIDogcG9zaXRpb24uaXNNaWRkbGUgPyAnbWlkZGxlJyA6ICdlbmQnO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS54Rm9yWEF4aXNMYWJlbCA9IGZ1bmN0aW9uIHhGb3JYQXhpc0xhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy54Rm9yQXhpc0xhYmVsKCF0aGlzLm93bmVyLmNvbmZpZy5heGlzX3JvdGF0ZWQsIHRoaXMuZ2V0WEF4aXNMYWJlbFBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUueEZvcllBeGlzTGFiZWwgPSBmdW5jdGlvbiB4Rm9yWUF4aXNMYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueEZvckF4aXNMYWJlbCh0aGlzLm93bmVyLmNvbmZpZy5heGlzX3JvdGF0ZWQsIHRoaXMuZ2V0WUF4aXNMYWJlbFBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUueEZvclkyQXhpc0xhYmVsID0gZnVuY3Rpb24geEZvclkyQXhpc0xhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy54Rm9yQXhpc0xhYmVsKHRoaXMub3duZXIuY29uZmlnLmF4aXNfcm90YXRlZCwgdGhpcy5nZXRZMkF4aXNMYWJlbFBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZHhGb3JYQXhpc0xhYmVsID0gZnVuY3Rpb24gZHhGb3JYQXhpc0xhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5keEZvckF4aXNMYWJlbCghdGhpcy5vd25lci5jb25maWcuYXhpc19yb3RhdGVkLCB0aGlzLmdldFhBeGlzTGFiZWxQb3NpdGlvbigpKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmR4Rm9yWUF4aXNMYWJlbCA9IGZ1bmN0aW9uIGR4Rm9yWUF4aXNMYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHhGb3JBeGlzTGFiZWwodGhpcy5vd25lci5jb25maWcuYXhpc19yb3RhdGVkLCB0aGlzLmdldFlBeGlzTGFiZWxQb3NpdGlvbigpKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmR4Rm9yWTJBeGlzTGFiZWwgPSBmdW5jdGlvbiBkeEZvclkyQXhpc0xhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5keEZvckF4aXNMYWJlbCh0aGlzLm93bmVyLmNvbmZpZy5heGlzX3JvdGF0ZWQsIHRoaXMuZ2V0WTJBeGlzTGFiZWxQb3NpdGlvbigpKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmR5Rm9yWEF4aXNMYWJlbCA9IGZ1bmN0aW9uIGR5Rm9yWEF4aXNMYWJlbCgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5vd25lciwgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmdldFhBeGlzTGFiZWxQb3NpdGlvbigpO1xuICAgICAgICBpZiAoY29uZmlnLmF4aXNfcm90YXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmlzSW5uZXIgPyBcIjEuMmVtXCIgOiAtMjUgLSB0aGlzLmdldE1heFRpY2tXaWR0aCgneCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmlzSW5uZXIgPyBcIi0wLjVlbVwiIDogY29uZmlnLmF4aXNfeF9oZWlnaHQgPyBjb25maWcuYXhpc194X2hlaWdodCAtIDEwIDogXCIzZW1cIjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZHlGb3JZQXhpc0xhYmVsID0gZnVuY3Rpb24gZHlGb3JZQXhpc0xhYmVsKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLm93bmVyLFxuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmdldFlBeGlzTGFiZWxQb3NpdGlvbigpO1xuICAgICAgICBpZiAoJCQuY29uZmlnLmF4aXNfcm90YXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLmlzSW5uZXIgPyBcIi0wLjVlbVwiIDogXCIzZW1cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbi5pc0lubmVyID8gXCIxLjJlbVwiIDogLTEwIC0gKCQkLmNvbmZpZy5heGlzX3lfaW5uZXIgPyAwIDogKHRoaXMuZ2V0TWF4VGlja1dpZHRoKCd5JykgKyAxMCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5keUZvclkyQXhpc0xhYmVsID0gZnVuY3Rpb24gZHlGb3JZMkF4aXNMYWJlbCgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5vd25lcixcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5nZXRZMkF4aXNMYWJlbFBvc2l0aW9uKCk7XG4gICAgICAgIGlmICgkJC5jb25maWcuYXhpc19yb3RhdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb24uaXNJbm5lciA/IFwiMS4yZW1cIiA6IFwiLTIuMmVtXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb24uaXNJbm5lciA/IFwiLTAuNWVtXCIgOiAxNSArICgkJC5jb25maWcuYXhpc195Ml9pbm5lciA/IDAgOiAodGhpcy5nZXRNYXhUaWNrV2lkdGgoJ3kyJykgKyAxNSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS50ZXh0QW5jaG9yRm9yWEF4aXNMYWJlbCA9IGZ1bmN0aW9uIHRleHRBbmNob3JGb3JYQXhpc0xhYmVsKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLm93bmVyO1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0QW5jaG9yRm9yQXhpc0xhYmVsKCEkJC5jb25maWcuYXhpc19yb3RhdGVkLCB0aGlzLmdldFhBeGlzTGFiZWxQb3NpdGlvbigpKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLnRleHRBbmNob3JGb3JZQXhpc0xhYmVsID0gZnVuY3Rpb24gdGV4dEFuY2hvckZvcllBeGlzTGFiZWwoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMub3duZXI7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRBbmNob3JGb3JBeGlzTGFiZWwoJCQuY29uZmlnLmF4aXNfcm90YXRlZCwgdGhpcy5nZXRZQXhpc0xhYmVsUG9zaXRpb24oKSk7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS50ZXh0QW5jaG9yRm9yWTJBeGlzTGFiZWwgPSBmdW5jdGlvbiB0ZXh0QW5jaG9yRm9yWTJBeGlzTGFiZWwoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMub3duZXI7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRBbmNob3JGb3JBeGlzTGFiZWwoJCQuY29uZmlnLmF4aXNfcm90YXRlZCwgdGhpcy5nZXRZMkF4aXNMYWJlbFBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZ2V0TWF4VGlja1dpZHRoID0gZnVuY3Rpb24gZ2V0TWF4VGlja1dpZHRoKGlkLCB3aXRob3V0UmVjb21wdXRlKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMub3duZXIsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIG1heFdpZHRoID0gMCwgdGFyZ2V0c1RvU2hvdywgc2NhbGUsIGF4aXMsIGR1bW15LCBzdmc7XG4gICAgICAgIGlmICh3aXRob3V0UmVjb21wdXRlICYmICQkLmN1cnJlbnRNYXhUaWNrV2lkdGhzW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuICQkLmN1cnJlbnRNYXhUaWNrV2lkdGhzW2lkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCQuc3ZnKSB7XG4gICAgICAgICAgICB0YXJnZXRzVG9TaG93ID0gJCQuZmlsdGVyVGFyZ2V0c1RvU2hvdygkJC5kYXRhLnRhcmdldHMpO1xuICAgICAgICAgICAgaWYgKGlkID09PSAneScpIHtcbiAgICAgICAgICAgICAgICBzY2FsZSA9ICQkLnkuY29weSgpLmRvbWFpbigkJC5nZXRZRG9tYWluKHRhcmdldHNUb1Nob3csICd5JykpO1xuICAgICAgICAgICAgICAgIGF4aXMgPSB0aGlzLmdldFlBeGlzKHNjYWxlLCAkJC55T3JpZW50LCBjb25maWcuYXhpc195X3RpY2tfZm9ybWF0LCAkJC55QXhpc1RpY2tWYWx1ZXMsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT09ICd5MicpIHtcbiAgICAgICAgICAgICAgICBzY2FsZSA9ICQkLnkyLmNvcHkoKS5kb21haW4oJCQuZ2V0WURvbWFpbih0YXJnZXRzVG9TaG93LCAneTInKSk7XG4gICAgICAgICAgICAgICAgYXhpcyA9IHRoaXMuZ2V0WUF4aXMoc2NhbGUsICQkLnkyT3JpZW50LCBjb25maWcuYXhpc195Ml90aWNrX2Zvcm1hdCwgJCQueTJBeGlzVGlja1ZhbHVlcywgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY2FsZSA9ICQkLnguY29weSgpLmRvbWFpbigkJC5nZXRYRG9tYWluKHRhcmdldHNUb1Nob3cpKTtcbiAgICAgICAgICAgICAgICBheGlzID0gdGhpcy5nZXRYQXhpcyhzY2FsZSwgJCQueE9yaWVudCwgJCQueEF4aXNUaWNrRm9ybWF0LCAkJC54QXhpc1RpY2tWYWx1ZXMsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVhBeGlzVGlja1ZhbHVlcyh0YXJnZXRzVG9TaG93LCBheGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR1bW15ID0gJCQuZDMuc2VsZWN0KCdib2R5JykuYXBwZW5kKCdkaXYnKS5jbGFzc2VkKCdjMycsIHRydWUpO1xuICAgICAgICAgICAgc3ZnID0gZHVtbXkuYXBwZW5kKFwic3ZnXCIpLnN0eWxlKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpLnN0eWxlKCdwb3NpdGlvbicsICdmaXhlZCcpLnN0eWxlKCd0b3AnLCAwKS5zdHlsZSgnbGVmdCcsIDApLFxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnZycpLmNhbGwoYXhpcykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCQuZDMuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgndGV4dCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYm94ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heFdpZHRoIDwgYm94LndpZHRoKSB7IG1heFdpZHRoID0gYm94LndpZHRoOyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZHVtbXkucmVtb3ZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAkJC5jdXJyZW50TWF4VGlja1dpZHRoc1tpZF0gPSBtYXhXaWR0aCA8PSAwID8gJCQuY3VycmVudE1heFRpY2tXaWR0aHNbaWRdIDogbWF4V2lkdGg7XG4gICAgICAgIHJldHVybiAkJC5jdXJyZW50TWF4VGlja1dpZHRoc1tpZF07XG4gICAgfTtcblxuICAgIEF4aXMucHJvdG90eXBlLnVwZGF0ZUxhYmVscyA9IGZ1bmN0aW9uIHVwZGF0ZUxhYmVscyh3aXRoVHJhbnNpdGlvbikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLm93bmVyO1xuICAgICAgICB2YXIgYXhpc1hMYWJlbCA9ICQkLm1haW4uc2VsZWN0KCcuJyArIENMQVNTLmF4aXNYICsgJyAuJyArIENMQVNTLmF4aXNYTGFiZWwpLFxuICAgICAgICAgICAgYXhpc1lMYWJlbCA9ICQkLm1haW4uc2VsZWN0KCcuJyArIENMQVNTLmF4aXNZICsgJyAuJyArIENMQVNTLmF4aXNZTGFiZWwpLFxuICAgICAgICAgICAgYXhpc1kyTGFiZWwgPSAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5heGlzWTIgKyAnIC4nICsgQ0xBU1MuYXhpc1kyTGFiZWwpO1xuICAgICAgICAod2l0aFRyYW5zaXRpb24gPyBheGlzWExhYmVsLnRyYW5zaXRpb24oKSA6IGF4aXNYTGFiZWwpXG4gICAgICAgICAgICAuYXR0cihcInhcIiwgdGhpcy54Rm9yWEF4aXNMYWJlbC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLmF0dHIoXCJkeFwiLCB0aGlzLmR4Rm9yWEF4aXNMYWJlbC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLmF0dHIoXCJkeVwiLCB0aGlzLmR5Rm9yWEF4aXNMYWJlbC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLnRleHQodGhpcy50ZXh0Rm9yWEF4aXNMYWJlbC5iaW5kKHRoaXMpKTtcbiAgICAgICAgKHdpdGhUcmFuc2l0aW9uID8gYXhpc1lMYWJlbC50cmFuc2l0aW9uKCkgOiBheGlzWUxhYmVsKVxuICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIHRoaXMueEZvcllBeGlzTGFiZWwuYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5hdHRyKFwiZHhcIiwgdGhpcy5keEZvcllBeGlzTGFiZWwuYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5hdHRyKFwiZHlcIiwgdGhpcy5keUZvcllBeGlzTGFiZWwuYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC50ZXh0KHRoaXMudGV4dEZvcllBeGlzTGFiZWwuYmluZCh0aGlzKSk7XG4gICAgICAgICh3aXRoVHJhbnNpdGlvbiA/IGF4aXNZMkxhYmVsLnRyYW5zaXRpb24oKSA6IGF4aXNZMkxhYmVsKVxuICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIHRoaXMueEZvclkyQXhpc0xhYmVsLmJpbmQodGhpcykpXG4gICAgICAgICAgICAuYXR0cihcImR4XCIsIHRoaXMuZHhGb3JZMkF4aXNMYWJlbC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLmF0dHIoXCJkeVwiLCB0aGlzLmR5Rm9yWTJBeGlzTGFiZWwuYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC50ZXh0KHRoaXMudGV4dEZvclkyQXhpc0xhYmVsLmJpbmQodGhpcykpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZ2V0UGFkZGluZyA9IGZ1bmN0aW9uIGdldFBhZGRpbmcocGFkZGluZywga2V5LCBkZWZhdWx0VmFsdWUsIGRvbWFpbkxlbmd0aCkge1xuICAgICAgICB2YXIgcCA9IHR5cGVvZiBwYWRkaW5nID09PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBwYWRkaW5nW2tleV07XG4gICAgICAgIGlmICghaXNWYWx1ZShwKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGluZy51bml0ID09PSAncmF0aW8nKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkZGluZ1trZXldICogZG9tYWluTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFzc3VtZSBwYWRkaW5nIGlzIHBpeGVscyBpZiB1bml0IGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFBpeGVsc1RvQXhpc1BhZGRpbmcocCwgZG9tYWluTGVuZ3RoKTtcbiAgICB9O1xuICAgIEF4aXMucHJvdG90eXBlLmNvbnZlcnRQaXhlbHNUb0F4aXNQYWRkaW5nID0gZnVuY3Rpb24gY29udmVydFBpeGVsc1RvQXhpc1BhZGRpbmcocGl4ZWxzLCBkb21haW5MZW5ndGgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5vd25lcixcbiAgICAgICAgICAgIGxlbmd0aCA9ICQkLmNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC53aWR0aCA6ICQkLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIGRvbWFpbkxlbmd0aCAqIChwaXhlbHMgLyBsZW5ndGgpO1xuICAgIH07XG4gICAgQXhpcy5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrVmFsdWVzID0gZnVuY3Rpb24gZ2VuZXJhdGVUaWNrVmFsdWVzKHZhbHVlcywgdGlja0NvdW50LCBmb3JUaW1lU2VyaWVzKSB7XG4gICAgICAgIHZhciB0aWNrVmFsdWVzID0gdmFsdWVzLCB0YXJnZXRDb3VudCwgc3RhcnQsIGVuZCwgY291bnQsIGludGVydmFsLCBpLCB0aWNrVmFsdWU7XG4gICAgICAgIGlmICh0aWNrQ291bnQpIHtcbiAgICAgICAgICAgIHRhcmdldENvdW50ID0gaXNGdW5jdGlvbih0aWNrQ291bnQpID8gdGlja0NvdW50KCkgOiB0aWNrQ291bnQ7XG4gICAgICAgICAgICAvLyBjb21wdXRlIHRpY2tzIGFjY29yZGluZyB0byB0aWNrQ291bnRcbiAgICAgICAgICAgIGlmICh0YXJnZXRDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRpY2tWYWx1ZXMgPSBbdmFsdWVzWzBdXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0Q291bnQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICB0aWNrVmFsdWVzID0gW3ZhbHVlc1swXSwgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldENvdW50ID4gMikge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gdGFyZ2V0Q291bnQgLSAyO1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdmFsdWVzWzBdO1xuICAgICAgICAgICAgICAgIGVuZCA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAoZW5kIC0gc3RhcnQpIC8gKGNvdW50ICsgMSk7XG4gICAgICAgICAgICAgICAgLy8gcmUtY29uc3RydWN0IHVuaXF1ZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICB0aWNrVmFsdWVzID0gW3N0YXJ0XTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aWNrVmFsdWUgPSArc3RhcnQgKyBpbnRlcnZhbCAqIChpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRpY2tWYWx1ZXMucHVzaChmb3JUaW1lU2VyaWVzID8gbmV3IERhdGUodGlja1ZhbHVlKSA6IHRpY2tWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRpY2tWYWx1ZXMucHVzaChlbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm9yVGltZVNlcmllcykgeyB0aWNrVmFsdWVzID0gdGlja1ZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7IH1cbiAgICAgICAgcmV0dXJuIHRpY2tWYWx1ZXM7XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5nZW5lcmF0ZVRyYW5zaXRpb25zID0gZnVuY3Rpb24gZ2VuZXJhdGVUcmFuc2l0aW9ucyhkdXJhdGlvbikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLm93bmVyLCBheGVzID0gJCQuYXhlcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGF4aXNYOiBkdXJhdGlvbiA/IGF4ZXMueC50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pIDogYXhlcy54LFxuICAgICAgICAgICAgYXhpc1k6IGR1cmF0aW9uID8gYXhlcy55LnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikgOiBheGVzLnksXG4gICAgICAgICAgICBheGlzWTI6IGR1cmF0aW9uID8gYXhlcy55Mi50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pIDogYXhlcy55MixcbiAgICAgICAgICAgIGF4aXNTdWJYOiBkdXJhdGlvbiA/IGF4ZXMuc3VieC50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pIDogYXhlcy5zdWJ4XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBBeGlzLnByb3RvdHlwZS5yZWRyYXcgPSBmdW5jdGlvbiByZWRyYXcodHJhbnNpdGlvbnMsIGlzSGlkZGVuKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMub3duZXI7XG4gICAgICAgICQkLmF4ZXMueC5zdHlsZShcIm9wYWNpdHlcIiwgaXNIaWRkZW4gPyAwIDogMSk7XG4gICAgICAgICQkLmF4ZXMueS5zdHlsZShcIm9wYWNpdHlcIiwgaXNIaWRkZW4gPyAwIDogMSk7XG4gICAgICAgICQkLmF4ZXMueTIuc3R5bGUoXCJvcGFjaXR5XCIsIGlzSGlkZGVuID8gMCA6IDEpO1xuICAgICAgICAkJC5heGVzLnN1Ynguc3R5bGUoXCJvcGFjaXR5XCIsIGlzSGlkZGVuID8gMCA6IDEpO1xuICAgICAgICB0cmFuc2l0aW9ucy5heGlzWC5jYWxsKCQkLnhBeGlzKTtcbiAgICAgICAgdHJhbnNpdGlvbnMuYXhpc1kuY2FsbCgkJC55QXhpcyk7XG4gICAgICAgIHRyYW5zaXRpb25zLmF4aXNZMi5jYWxsKCQkLnkyQXhpcyk7XG4gICAgICAgIHRyYW5zaXRpb25zLmF4aXNTdWJYLmNhbGwoJCQuc3ViWEF4aXMpO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRDbGlwUGF0aCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgaXNJRTkgPSB3aW5kb3cubmF2aWdhdG9yLmFwcFZlcnNpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKFwibXNpZSA5LlwiKSA+PSAwO1xuICAgICAgICByZXR1cm4gXCJ1cmwoXCIgKyAoaXNJRTkgPyBcIlwiIDogZG9jdW1lbnQuVVJMLnNwbGl0KCcjJylbMF0pICsgXCIjXCIgKyBpZCArIFwiKVwiO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uYXBwZW5kQ2xpcCA9IGZ1bmN0aW9uIChwYXJlbnQsIGlkKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQuYXBwZW5kKFwiY2xpcFBhdGhcIikuYXR0cihcImlkXCIsIGlkKS5hcHBlbmQoXCJyZWN0XCIpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0QXhpc0NsaXBYID0gZnVuY3Rpb24gKGZvckhvcml6b250YWwpIHtcbiAgICAgICAgLy8gYXhpcyBsaW5lIHdpZHRoICsgcGFkZGluZyBmb3IgbGVmdFxuICAgICAgICB2YXIgbGVmdCA9IE1hdGgubWF4KDMwLCB0aGlzLm1hcmdpbi5sZWZ0KTtcbiAgICAgICAgcmV0dXJuIGZvckhvcml6b250YWwgPyAtKDEgKyBsZWZ0KSA6IC0obGVmdCAtIDEpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0QXhpc0NsaXBZID0gZnVuY3Rpb24gKGZvckhvcml6b250YWwpIHtcbiAgICAgICAgcmV0dXJuIGZvckhvcml6b250YWwgPyAtMjAgOiAtdGhpcy5tYXJnaW4udG9wO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0WEF4aXNDbGlwWCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgcmV0dXJuICQkLmdldEF4aXNDbGlwWCghJCQuY29uZmlnLmF4aXNfcm90YXRlZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRYQXhpc0NsaXBZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gJCQuZ2V0QXhpc0NsaXBZKCEkJC5jb25maWcuYXhpc19yb3RhdGVkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFlBeGlzQ2xpcFggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHJldHVybiAkJC5jb25maWcuYXhpc195X2lubmVyID8gLTEgOiAkJC5nZXRBeGlzQ2xpcFgoJCQuY29uZmlnLmF4aXNfcm90YXRlZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRZQXhpc0NsaXBZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gJCQuZ2V0QXhpc0NsaXBZKCQkLmNvbmZpZy5heGlzX3JvdGF0ZWQpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0QXhpc0NsaXBXaWR0aCA9IGZ1bmN0aW9uIChmb3JIb3Jpem9udGFsKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgoMzAsICQkLm1hcmdpbi5sZWZ0KSxcbiAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgoMzAsICQkLm1hcmdpbi5yaWdodCk7XG4gICAgICAgIC8vIHdpZHRoICsgYXhpcyBsaW5lIHdpZHRoICsgcGFkZGluZyBmb3IgbGVmdC9yaWdodFxuICAgICAgICByZXR1cm4gZm9ySG9yaXpvbnRhbCA/ICQkLndpZHRoICsgMiArIGxlZnQgKyByaWdodCA6ICQkLm1hcmdpbi5sZWZ0ICsgMjA7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRBeGlzQ2xpcEhlaWdodCA9IGZ1bmN0aW9uIChmb3JIb3Jpem9udGFsKSB7XG4gICAgICAgIC8vIGxlc3MgdGhhbiAyMCBpcyBub3QgZW5vdWdoIHRvIHNob3cgdGhlIGF4aXMgbGFiZWwgJ291dGVyJyB3aXRob3V0IGxlZ2VuZFxuICAgICAgICByZXR1cm4gKGZvckhvcml6b250YWwgPyB0aGlzLm1hcmdpbi5ib3R0b20gOiAodGhpcy5tYXJnaW4udG9wICsgdGhpcy5oZWlnaHQpKSArIDIwO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0WEF4aXNDbGlwV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgIHJldHVybiAkJC5nZXRBeGlzQ2xpcFdpZHRoKCEkJC5jb25maWcuYXhpc19yb3RhdGVkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFhBeGlzQ2xpcEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgcmV0dXJuICQkLmdldEF4aXNDbGlwSGVpZ2h0KCEkJC5jb25maWcuYXhpc19yb3RhdGVkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFlBeGlzQ2xpcFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gJCQuZ2V0QXhpc0NsaXBXaWR0aCgkJC5jb25maWcuYXhpc19yb3RhdGVkKSArICgkJC5jb25maWcuYXhpc195X2lubmVyID8gMjAgOiAwKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFlBeGlzQ2xpcEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgcmV0dXJuICQkLmdldEF4aXNDbGlwSGVpZ2h0KCQkLmNvbmZpZy5heGlzX3JvdGF0ZWQpO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0UGllID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBkMyA9ICQkLmQzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgICQkLnBpZSA9IGQzLmxheW91dC5waWUoKS52YWx1ZShmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQudmFsdWVzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSArIGIudmFsdWU7IH0sIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjb25maWcuZGF0YV9vcmRlcikge1xuICAgICAgICAgICAgJCQucGllLnNvcnQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlUmFkaXVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICB3ID0gY29uZmlnLmdhdWdlX3dpZHRoIHx8IGNvbmZpZy5kb251dF93aWR0aDtcbiAgICAgICAgJCQucmFkaXVzRXhwYW5kZWQgPSBNYXRoLm1pbigkJC5hcmNXaWR0aCwgJCQuYXJjSGVpZ2h0KSAvIDI7XG4gICAgICAgICQkLnJhZGl1cyA9ICQkLnJhZGl1c0V4cGFuZGVkICogMC45NTtcbiAgICAgICAgJCQuaW5uZXJSYWRpdXNSYXRpbyA9IHcgPyAoJCQucmFkaXVzIC0gdykgLyAkJC5yYWRpdXMgOiAwLjY7XG4gICAgICAgICQkLmlubmVyUmFkaXVzID0gJCQuaGFzVHlwZSgnZG9udXQnKSB8fCAkJC5oYXNUeXBlKCdnYXVnZScpID8gJCQucmFkaXVzICogJCQuaW5uZXJSYWRpdXNSYXRpbyA6IDA7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZUFyYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgJCQuc3ZnQXJjID0gJCQuZ2V0U3ZnQXJjKCk7XG4gICAgICAgICQkLnN2Z0FyY0V4cGFuZGVkID0gJCQuZ2V0U3ZnQXJjRXhwYW5kZWQoKTtcbiAgICAgICAgJCQuc3ZnQXJjRXhwYW5kZWRTdWIgPSAkJC5nZXRTdmdBcmNFeHBhbmRlZCgwLjk4KTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlQW5nbGUgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBmb3VuZCA9IGZhbHNlLCBpbmRleCA9IDAsXG4gICAgICAgICAgICBnTWluLCBnTWF4LCBnVGljLCBnVmFsdWU7XG5cbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQucGllKCQkLmZpbHRlclRhcmdldHNUb1Nob3coJCQuZGF0YS50YXJnZXRzKSkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgaWYgKCEgZm91bmQgJiYgdC5kYXRhLmlkID09PSBkLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZCA9IHQ7XG4gICAgICAgICAgICAgICAgZC5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc05hTihkLnN0YXJ0QW5nbGUpKSB7XG4gICAgICAgICAgICBkLnN0YXJ0QW5nbGUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05hTihkLmVuZEFuZ2xlKSkge1xuICAgICAgICAgICAgZC5lbmRBbmdsZSA9IGQuc3RhcnRBbmdsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCQuaXNHYXVnZVR5cGUoZC5kYXRhKSkge1xuICAgICAgICAgICAgZ01pbiA9IGNvbmZpZy5nYXVnZV9taW47XG4gICAgICAgICAgICBnTWF4ID0gY29uZmlnLmdhdWdlX21heDtcbiAgICAgICAgICAgIGdUaWMgPSAoTWF0aC5QSSAqIChjb25maWcuZ2F1Z2VfZnVsbENpcmNsZSA/IDIgOiAxKSkgLyAoZ01heCAtIGdNaW4pO1xuICAgICAgICAgICAgZ1ZhbHVlID0gZC52YWx1ZSA8IGdNaW4gPyAwIDogZC52YWx1ZSA8IGdNYXggPyBkLnZhbHVlIC0gZ01pbiA6IChnTWF4IC0gZ01pbik7XG4gICAgICAgICAgICBkLnN0YXJ0QW5nbGUgPSBjb25maWcuZ2F1Z2Vfc3RhcnRpbmdBbmdsZTtcbiAgICAgICAgICAgIGQuZW5kQW5nbGUgPSBkLnN0YXJ0QW5nbGUgKyBnVGljICogZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZCA/IGQgOiBudWxsO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRTdmdBcmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBhcmMgPSAkJC5kMy5zdmcuYXJjKCkub3V0ZXJSYWRpdXMoJCQucmFkaXVzKS5pbm5lclJhZGl1cygkJC5pbm5lclJhZGl1cyksXG4gICAgICAgICAgICBuZXdBcmMgPSBmdW5jdGlvbiAoZCwgd2l0aG91dFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkO1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0VXBkYXRlKSB7IHJldHVybiBhcmMoZCk7IH0gLy8gZm9yIGludGVycG9sYXRlXG4gICAgICAgICAgICAgICAgdXBkYXRlZCA9ICQkLnVwZGF0ZUFuZ2xlKGQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkID8gYXJjKHVwZGF0ZWQpIDogXCJNIDAgMFwiO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgLy8gVE9ETzogZXh0ZW5kcyBhbGwgZnVuY3Rpb25cbiAgICAgICAgbmV3QXJjLmNlbnRyb2lkID0gYXJjLmNlbnRyb2lkO1xuICAgICAgICByZXR1cm4gbmV3QXJjO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRTdmdBcmNFeHBhbmRlZCA9IGZ1bmN0aW9uIChyYXRlKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBhcmMgPSAkJC5kMy5zdmcuYXJjKCkub3V0ZXJSYWRpdXMoJCQucmFkaXVzRXhwYW5kZWQgKiAocmF0ZSA/IHJhdGUgOiAxKSkuaW5uZXJSYWRpdXMoJCQuaW5uZXJSYWRpdXMpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHZhciB1cGRhdGVkID0gJCQudXBkYXRlQW5nbGUoZCk7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZCA/IGFyYyh1cGRhdGVkKSA6IFwiTSAwIDBcIjtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0QXJjID0gZnVuY3Rpb24gKGQsIHdpdGhvdXRVcGRhdGUsIGZvcmNlKSB7XG4gICAgICAgIHJldHVybiBmb3JjZSB8fCB0aGlzLmlzQXJjVHlwZShkLmRhdGEpID8gdGhpcy5zdmdBcmMoZCwgd2l0aG91dFVwZGF0ZSkgOiBcIk0gMCAwXCI7XG4gICAgfTtcblxuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udHJhbnNmb3JtRm9yQXJjTGFiZWwgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICB1cGRhdGVkID0gJCQudXBkYXRlQW5nbGUoZCksIGMsIHgsIHksIGgsIHJhdGlvLCB0cmFuc2xhdGUgPSBcIlwiO1xuICAgICAgICBpZiAodXBkYXRlZCAmJiAhJCQuaGFzVHlwZSgnZ2F1Z2UnKSkge1xuICAgICAgICAgICAgYyA9IHRoaXMuc3ZnQXJjLmNlbnRyb2lkKHVwZGF0ZWQpO1xuICAgICAgICAgICAgeCA9IGlzTmFOKGNbMF0pID8gMCA6IGNbMF07XG4gICAgICAgICAgICB5ID0gaXNOYU4oY1sxXSkgPyAwIDogY1sxXTtcbiAgICAgICAgICAgIGggPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgICAgICAgICBpZiAoJCQuaGFzVHlwZSgnZG9udXQnKSAmJiBjb25maWcuZG9udXRfbGFiZWxfcmF0aW8pIHtcbiAgICAgICAgICAgICAgICByYXRpbyA9IGlzRnVuY3Rpb24oY29uZmlnLmRvbnV0X2xhYmVsX3JhdGlvKSA/IGNvbmZpZy5kb251dF9sYWJlbF9yYXRpbyhkLCAkJC5yYWRpdXMsIGgpIDogY29uZmlnLmRvbnV0X2xhYmVsX3JhdGlvO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkJC5oYXNUeXBlKCdwaWUnKSAmJiBjb25maWcucGllX2xhYmVsX3JhdGlvKSB7XG4gICAgICAgICAgICAgICAgcmF0aW8gPSBpc0Z1bmN0aW9uKGNvbmZpZy5waWVfbGFiZWxfcmF0aW8pID8gY29uZmlnLnBpZV9sYWJlbF9yYXRpbyhkLCAkJC5yYWRpdXMsIGgpIDogY29uZmlnLnBpZV9sYWJlbF9yYXRpbztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmF0aW8gPSAkJC5yYWRpdXMgJiYgaCA/ICgzNiAvICQkLnJhZGl1cyA+IDAuMzc1ID8gMS4xNzUgLSAzNiAvICQkLnJhZGl1cyA6IDAuOCkgKiAkJC5yYWRpdXMgLyBoIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYW5zbGF0ZSA9IFwidHJhbnNsYXRlKFwiICsgKHggKiByYXRpbykgKyAgJywnICsgKHkgKiByYXRpbykgKyAgXCIpXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0QXJjUmF0aW8gPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgd2hvbGUgPSBNYXRoLlBJICogKCQkLmhhc1R5cGUoJ2dhdWdlJykgJiYgIWNvbmZpZy5nYXVnZV9mdWxsQ2lyY2xlID8gMSA6IDIpO1xuICAgICAgICByZXR1cm4gZCA/IChkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlKSAvIHdob2xlIDogbnVsbDtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY29udmVydFRvQXJjRGF0YSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZE5hbWUoe1xuICAgICAgICAgICAgaWQ6IGQuZGF0YS5pZCxcbiAgICAgICAgICAgIHZhbHVlOiBkLnZhbHVlLFxuICAgICAgICAgICAgcmF0aW86IHRoaXMuZ2V0QXJjUmF0aW8oZCksXG4gICAgICAgICAgICBpbmRleDogZC5pbmRleFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udGV4dEZvckFyY0xhYmVsID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIHVwZGF0ZWQsIHZhbHVlLCByYXRpbywgaWQsIGZvcm1hdDtcbiAgICAgICAgaWYgKCEgJCQuc2hvdWxkU2hvd0FyY0xhYmVsKCkpIHsgcmV0dXJuIFwiXCI7IH1cbiAgICAgICAgdXBkYXRlZCA9ICQkLnVwZGF0ZUFuZ2xlKGQpO1xuICAgICAgICB2YWx1ZSA9IHVwZGF0ZWQgPyB1cGRhdGVkLnZhbHVlIDogbnVsbDtcbiAgICAgICAgcmF0aW8gPSAkJC5nZXRBcmNSYXRpbyh1cGRhdGVkKTtcbiAgICAgICAgaWQgPSBkLmRhdGEuaWQ7XG4gICAgICAgIGlmICghICQkLmhhc1R5cGUoJ2dhdWdlJykgJiYgISAkJC5tZWV0c0FyY0xhYmVsVGhyZXNob2xkKHJhdGlvKSkgeyByZXR1cm4gXCJcIjsgfVxuICAgICAgICBmb3JtYXQgPSAkJC5nZXRBcmNMYWJlbEZvcm1hdCgpO1xuICAgICAgICByZXR1cm4gZm9ybWF0ID8gZm9ybWF0KHZhbHVlLCByYXRpbywgaWQpIDogJCQuZGVmYXVsdEFyY1ZhbHVlRm9ybWF0KHZhbHVlLCByYXRpbyk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmV4cGFuZEFyYyA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgaW50ZXJ2YWw7XG5cbiAgICAgICAgLy8gTUVNTzogYXZvaWQgdG8gY2FuY2VsIHRyYW5zaXRpb25cbiAgICAgICAgaWYgKCQkLnRyYW5zaXRpbmcpIHtcbiAgICAgICAgICAgIGludGVydmFsID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoISQkLnRyYW5zaXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJCQubGVnZW5kLnNlbGVjdEFsbCgnLmMzLWxlZ2VuZC1pdGVtLWZvY3VzZWQnKS5zaXplKCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkJC5leHBhbmRBcmModGFyZ2V0SWRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldElkcyA9ICQkLm1hcFRvVGFyZ2V0SWRzKHRhcmdldElkcyk7XG5cbiAgICAgICAgJCQuc3ZnLnNlbGVjdEFsbCgkJC5zZWxlY3RvclRhcmdldHModGFyZ2V0SWRzLCAnLicgKyBDTEFTUy5jaGFydEFyYykpLmVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIGlmICghICQkLnNob3VsZEV4cGFuZChkLmRhdGEuaWQpKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgJCQuZDMuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgncGF0aCcpXG4gICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKS5kdXJhdGlvbigkJC5leHBhbmREdXJhdGlvbihkLmRhdGEuaWQpKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiZFwiLCAkJC5zdmdBcmNFeHBhbmRlZClcbiAgICAgICAgICAgICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKCQkLmV4cGFuZER1cmF0aW9uKGQuZGF0YS5pZCkgKiAyKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiZFwiLCAkJC5zdmdBcmNFeHBhbmRlZFN1YilcbiAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJCQuaXNEb251dFR5cGUoZC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgaGVyZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51bmV4cGFuZEFyYyA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcblxuICAgICAgICBpZiAoJCQudHJhbnNpdGluZykgeyByZXR1cm47IH1cblxuICAgICAgICB0YXJnZXRJZHMgPSAkJC5tYXBUb1RhcmdldElkcyh0YXJnZXRJZHMpO1xuXG4gICAgICAgICQkLnN2Zy5zZWxlY3RBbGwoJCQuc2VsZWN0b3JUYXJnZXRzKHRhcmdldElkcywgJy4nICsgQ0xBU1MuY2hhcnRBcmMpKS5zZWxlY3RBbGwoJ3BhdGgnKVxuICAgICAgICAgICAgLnRyYW5zaXRpb24oKS5kdXJhdGlvbihmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkLmV4cGFuZER1cmF0aW9uKGQuZGF0YS5pZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmF0dHIoXCJkXCIsICQkLnN2Z0FyYyk7XG4gICAgICAgICQkLnN2Zy5zZWxlY3RBbGwoJy4nICsgQ0xBU1MuYXJjKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAxKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZXhwYW5kRHVyYXRpb24gPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuXG4gICAgICAgIGlmICgkJC5pc0RvbnV0VHlwZShpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWcuZG9udXRfZXhwYW5kX2R1cmF0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKCQkLmlzR2F1Z2VUeXBlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5nYXVnZV9leHBhbmRfZHVyYXRpb247XG4gICAgICAgIH0gZWxzZSBpZiAoJCQuaXNQaWVUeXBlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5waWVfZXhwYW5kX2R1cmF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDUwO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uc2hvdWxkRXhwYW5kID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgcmV0dXJuICgkJC5pc0RvbnV0VHlwZShpZCkgJiYgY29uZmlnLmRvbnV0X2V4cGFuZCkgfHxcbiAgICAgICAgICAgICAgICgkJC5pc0dhdWdlVHlwZShpZCkgJiYgY29uZmlnLmdhdWdlX2V4cGFuZCkgfHxcbiAgICAgICAgICAgICAgICgkJC5pc1BpZVR5cGUoaWQpICYmIGNvbmZpZy5waWVfZXhwYW5kKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uc2hvdWxkU2hvd0FyY0xhYmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsIHNob3VsZFNob3cgPSB0cnVlO1xuICAgICAgICBpZiAoJCQuaGFzVHlwZSgnZG9udXQnKSkge1xuICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGNvbmZpZy5kb251dF9sYWJlbF9zaG93O1xuICAgICAgICB9IGVsc2UgaWYgKCQkLmhhc1R5cGUoJ3BpZScpKSB7XG4gICAgICAgICAgICBzaG91bGRTaG93ID0gY29uZmlnLnBpZV9sYWJlbF9zaG93O1xuICAgICAgICB9XG4gICAgICAgIC8vIHdoZW4gZ2F1Z2UsIGFsd2F5cyB0cnVlXG4gICAgICAgIHJldHVybiBzaG91bGRTaG93O1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5tZWV0c0FyY0xhYmVsVGhyZXNob2xkID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIHRocmVzaG9sZCA9ICQkLmhhc1R5cGUoJ2RvbnV0JykgPyBjb25maWcuZG9udXRfbGFiZWxfdGhyZXNob2xkIDogY29uZmlnLnBpZV9sYWJlbF90aHJlc2hvbGQ7XG4gICAgICAgIHJldHVybiByYXRpbyA+PSB0aHJlc2hvbGQ7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEFyY0xhYmVsRm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcucGllX2xhYmVsX2Zvcm1hdDtcbiAgICAgICAgaWYgKCQkLmhhc1R5cGUoJ2dhdWdlJykpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5nYXVnZV9sYWJlbF9mb3JtYXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoJCQuaGFzVHlwZSgnZG9udXQnKSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLmRvbnV0X2xhYmVsX2Zvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRBcmNUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgcmV0dXJuICQkLmhhc1R5cGUoJ2RvbnV0JykgPyAkJC5jb25maWcuZG9udXRfdGl0bGUgOiBcIlwiO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVUYXJnZXRzRm9yQXJjID0gZnVuY3Rpb24gKHRhcmdldHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgbWFpbiA9ICQkLm1haW4sXG4gICAgICAgICAgICBtYWluUGllVXBkYXRlLCBtYWluUGllRW50ZXIsXG4gICAgICAgICAgICBjbGFzc0NoYXJ0QXJjID0gJCQuY2xhc3NDaGFydEFyYy5iaW5kKCQkKSxcbiAgICAgICAgICAgIGNsYXNzQXJjcyA9ICQkLmNsYXNzQXJjcy5iaW5kKCQkKSxcbiAgICAgICAgICAgIGNsYXNzRm9jdXMgPSAkJC5jbGFzc0ZvY3VzLmJpbmQoJCQpO1xuICAgICAgICBtYWluUGllVXBkYXRlID0gbWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuY2hhcnRBcmNzKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MuY2hhcnRBcmMpXG4gICAgICAgICAgICAuZGF0YSgkJC5waWUodGFyZ2V0cykpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBjbGFzc0NoYXJ0QXJjKGQpICsgY2xhc3NGb2N1cyhkLmRhdGEpOyB9KTtcbiAgICAgICAgbWFpblBpZUVudGVyID0gbWFpblBpZVVwZGF0ZS5lbnRlcigpLmFwcGVuZChcImdcIilcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgY2xhc3NDaGFydEFyYyk7XG4gICAgICAgIG1haW5QaWVFbnRlci5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgY2xhc3NBcmNzKTtcbiAgICAgICAgbWFpblBpZUVudGVyLmFwcGVuZChcInRleHRcIilcbiAgICAgICAgICAgIC5hdHRyKFwiZHlcIiwgJCQuaGFzVHlwZSgnZ2F1Z2UnKSA/IFwiLS4xZW1cIiA6IFwiLjM1ZW1cIilcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMClcbiAgICAgICAgICAgIC5zdHlsZShcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIik7XG4gICAgICAgIC8vIE1FTU86IGNhbiBub3Qga2VlcCBzYW1lIGNvbG9yLi4uLCBidXQgbm90IGJhZCB0byB1cGRhdGUgY29sb3IgaW4gcmVkcmF3XG4gICAgICAgIC8vbWFpblBpZVVwZGF0ZS5leGl0KCkucmVtb3ZlKCk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmluaXRBcmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLmFyY3MgPSAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5jaGFydCkuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy5jaGFydEFyY3MpXG4gICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAkJC5nZXRUcmFuc2xhdGUoJ2FyYycpKTtcbiAgICAgICAgJCQuYXJjcy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgQ0xBU1MuY2hhcnRBcmNzVGl0bGUpXG4gICAgICAgICAgICAuc3R5bGUoXCJ0ZXh0LWFuY2hvclwiLCBcIm1pZGRsZVwiKVxuICAgICAgICAgICAgLnRleHQoJCQuZ2V0QXJjVGl0bGUoKSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlZHJhd0FyYyA9IGZ1bmN0aW9uIChkdXJhdGlvbiwgZHVyYXRpb25Gb3JFeGl0LCB3aXRoVHJhbnNmb3JtKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGQzID0gJCQuZDMsIGNvbmZpZyA9ICQkLmNvbmZpZywgbWFpbiA9ICQkLm1haW4sXG4gICAgICAgICAgICBtYWluQXJjO1xuICAgICAgICBtYWluQXJjID0gbWFpbi5zZWxlY3RBbGwoJy4nICsgQ0xBU1MuYXJjcykuc2VsZWN0QWxsKCcuJyArIENMQVNTLmFyYylcbiAgICAgICAgICAgIC5kYXRhKCQkLmFyY0RhdGEuYmluZCgkJCkpO1xuICAgICAgICBtYWluQXJjLmVudGVyKCkuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgJCQuY2xhc3NBcmMuYmluZCgkJCkpXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC5jb2xvcihkLmRhdGEpOyB9KVxuICAgICAgICAgICAgLnN0eWxlKFwiY3Vyc29yXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBjb25maWcuaW50ZXJhY3Rpb25fZW5hYmxlZCAmJiBjb25maWcuZGF0YV9zZWxlY3Rpb25faXNzZWxlY3RhYmxlKGQpID8gXCJwb2ludGVyXCIgOiBudWxsOyB9KVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwKVxuICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoJCQuaXNHYXVnZVR5cGUoZC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBkLnN0YXJ0QW5nbGUgPSBkLmVuZEFuZ2xlID0gY29uZmlnLmdhdWdlX3N0YXJ0aW5nQW5nbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnQgPSBkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIG1haW5BcmNcbiAgICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiAhJCQuaXNHYXVnZVR5cGUoZC5kYXRhKSAmJiB3aXRoVHJhbnNmb3JtID8gXCJzY2FsZSgwKVwiIDogXCJcIjsgfSlcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQgPT09IHRoaXMuX2N1cnJlbnQgPyAwIDogMTsgfSlcbiAgICAgICAgICAgIC5vbignbW91c2VvdmVyJywgY29uZmlnLmludGVyYWN0aW9uX2VuYWJsZWQgPyBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkLCBhcmNEYXRhO1xuICAgICAgICAgICAgICAgIGlmICgkJC50cmFuc2l0aW5nKSB7IC8vIHNraXAgd2hpbGUgdHJhbnNpdGluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSAkJC51cGRhdGVBbmdsZShkKTtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBhcmNEYXRhID0gJCQuY29udmVydFRvQXJjRGF0YSh1cGRhdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgJCQuZXhwYW5kQXJjKHVwZGF0ZWQuZGF0YS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICQkLmFwaS5mb2N1cyh1cGRhdGVkLmRhdGEuaWQpO1xuICAgICAgICAgICAgICAgICAgICAkJC50b2dnbGVGb2N1c0xlZ2VuZCh1cGRhdGVkLmRhdGEuaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAkJC5jb25maWcuZGF0YV9vbm1vdXNlb3ZlcihhcmNEYXRhLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IDogbnVsbClcbiAgICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgY29uZmlnLmludGVyYWN0aW9uX2VuYWJsZWQgPyBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkID0gJCQudXBkYXRlQW5nbGUoZCksIGFyY0RhdGEsIHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBhcmNEYXRhID0gJCQuY29udmVydFRvQXJjRGF0YSh1cGRhdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhID0gW2FyY0RhdGFdO1xuICAgICAgICAgICAgICAgICAgICAkJC5zaG93VG9vbHRpcChzZWxlY3RlZERhdGEsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gOiBudWxsKVxuICAgICAgICAgICAgLm9uKCdtb3VzZW91dCcsIGNvbmZpZy5pbnRlcmFjdGlvbl9lbmFibGVkID8gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgdXBkYXRlZCwgYXJjRGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoJCQudHJhbnNpdGluZykgeyAvLyBza2lwIHdoaWxlIHRyYW5zaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVkID0gJCQudXBkYXRlQW5nbGUoZCk7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJjRGF0YSA9ICQkLmNvbnZlcnRUb0FyY0RhdGEodXBkYXRlZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICQkLnVuZXhwYW5kQXJjKHVwZGF0ZWQuZGF0YS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICQkLmFwaS5yZXZlcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgJCQucmV2ZXJ0TGVnZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICQkLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgICAgICAgICAgICQkLmNvbmZpZy5kYXRhX29ubW91c2VvdXQoYXJjRGF0YSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSA6IG51bGwpXG4gICAgICAgICAgICAub24oJ2NsaWNrJywgY29uZmlnLmludGVyYWN0aW9uX2VuYWJsZWQgPyBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkID0gJCQudXBkYXRlQW5nbGUoZCksIGFyY0RhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJjRGF0YSA9ICQkLmNvbnZlcnRUb0FyY0RhdGEodXBkYXRlZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkJC50b2dnbGVTaGFwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCQudG9nZ2xlU2hhcGUodGhpcywgYXJjRGF0YSwgaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJCQuY29uZmlnLmRhdGFfb25jbGljay5jYWxsKCQkLmFwaSwgYXJjRGF0YSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSA6IG51bGwpXG4gICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoKSB7ICQkLnRyYW5zaXRpbmcgPSB0cnVlOyB9KVxuICAgICAgICAgICAgLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbilcbiAgICAgICAgICAgIC5hdHRyVHdlZW4oXCJkXCIsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWQgPSAkJC51cGRhdGVBbmdsZShkKSwgaW50ZXJwb2xhdGU7XG4gICAgICAgICAgICAgICAgaWYgKCEgdXBkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJNIDAgMFwiOyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudCA9PT0gZCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZTogTWF0aC5QSSoyLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgZW5kQW5nbGU6IE1hdGguUEkqMixcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMuX2N1cnJlbnQuc3RhcnRBbmdsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudC5zdGFydEFuZ2xlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMuX2N1cnJlbnQuZW5kQW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnQuZW5kQW5nbGUgPSB0aGlzLl9jdXJyZW50LnN0YXJ0QW5nbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGludGVycG9sYXRlID0gZDMuaW50ZXJwb2xhdGUodGhpcy5fY3VycmVudCwgdXBkYXRlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudCA9IGludGVycG9sYXRlKDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGUodCk7XG4gICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlZC5kYXRhID0gZC5kYXRhOyAvLyBkYXRhLmlkIHdpbGwgYmUgdXBkYXRlZCBieSBpbnRlcnBvcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQkLmdldEFyYyhpbnRlcnBvbGF0ZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgd2l0aFRyYW5zZm9ybSA/IFwic2NhbGUoMSlcIiA6IFwiXCIpXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkLmxldmVsQ29sb3IgPyAkJC5sZXZlbENvbG9yKGQuZGF0YS52YWx1ZXNbMF0udmFsdWUpIDogJCQuY29sb3IoZC5kYXRhLmlkKTtcbiAgICAgICAgICAgIH0pIC8vIFdoZXJlIGdhdWdlIHJlYWRpbmcgY29sb3Igd291bGQgcmVjZWl2ZSBjdXN0b21pemF0aW9uLlxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAxKVxuICAgICAgICAgICAgLmNhbGwoJCQuZW5kYWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCQudHJhbnNpdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIG1haW5BcmMuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbkZvckV4aXQpXG4gICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAgICAgLnJlbW92ZSgpO1xuICAgICAgICBtYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5jaGFydEFyYykuc2VsZWN0KCd0ZXh0JylcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMClcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC5pc0dhdWdlVHlwZShkLmRhdGEpID8gQ0xBU1MuZ2F1Z2VWYWx1ZSA6ICcnOyB9KVxuICAgICAgICAgICAgLnRleHQoJCQudGV4dEZvckFyY0xhYmVsLmJpbmQoJCQpKVxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgJCQudHJhbnNmb3JtRm9yQXJjTGFiZWwuYmluZCgkJCkpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC5pc0dhdWdlVHlwZShkLmRhdGEpID8gTWF0aC5yb3VuZCgkJC5yYWRpdXMgLyA1KSArICdweCcgOiAnJzsgfSlcbiAgICAgICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gJCQuaXNUYXJnZXRUb1Nob3coZC5kYXRhLmlkKSAmJiAkJC5pc0FyY1R5cGUoZC5kYXRhKSA/IDEgOiAwOyB9KTtcbiAgICAgICAgbWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuY2hhcnRBcmNzVGl0bGUpXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsICQkLmhhc1R5cGUoJ2RvbnV0JykgfHwgJCQuaGFzVHlwZSgnZ2F1Z2UnKSA/IDEgOiAwKTtcblxuICAgICAgICBpZiAoJCQuaGFzVHlwZSgnZ2F1Z2UnKSkge1xuICAgICAgICAgICAgJCQuYXJjcy5zZWxlY3QoJy4nICsgQ0xBU1MuY2hhcnRBcmNzQmFja2dyb3VuZClcbiAgICAgICAgICAgICAgICAuYXR0cihcImRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IFt7dmFsdWU6IGNvbmZpZy5nYXVnZV9tYXh9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGU6IGNvbmZpZy5nYXVnZV9zdGFydGluZ0FuZ2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kQW5nbGU6IC0xICogY29uZmlnLmdhdWdlX3N0YXJ0aW5nQW5nbGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQkLmdldEFyYyhkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICQkLmFyY3Muc2VsZWN0KCcuJyArIENMQVNTLmNoYXJ0QXJjc0dhdWdlVW5pdClcbiAgICAgICAgICAgICAgICAuYXR0cihcImR5XCIsIFwiLjc1ZW1cIilcbiAgICAgICAgICAgICAgICAudGV4dChjb25maWcuZ2F1Z2VfbGFiZWxfc2hvdyA/IGNvbmZpZy5nYXVnZV91bml0cyA6ICcnKTtcbiAgICAgICAgICAgICQkLmFyY3Muc2VsZWN0KCcuJyArIENMQVNTLmNoYXJ0QXJjc0dhdWdlTWluKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiZHhcIiwgLTEgKiAoJCQuaW5uZXJSYWRpdXMgKyAoKCQkLnJhZGl1cyAtICQkLmlubmVyUmFkaXVzKSAvIChjb25maWcuZ2F1Z2VfZnVsbENpcmNsZSA/IDEgOiAyKSkpICsgXCJweFwiKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiZHlcIiwgXCIxLjJlbVwiKVxuICAgICAgICAgICAgICAgIC50ZXh0KGNvbmZpZy5nYXVnZV9sYWJlbF9zaG93ID8gY29uZmlnLmdhdWdlX21pbiA6ICcnKTtcbiAgICAgICAgICAgICQkLmFyY3Muc2VsZWN0KCcuJyArIENMQVNTLmNoYXJ0QXJjc0dhdWdlTWF4KVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiZHhcIiwgJCQuaW5uZXJSYWRpdXMgKyAoKCQkLnJhZGl1cyAtICQkLmlubmVyUmFkaXVzKSAvIChjb25maWcuZ2F1Z2VfZnVsbENpcmNsZSA/IDEgOiAyKSkgKyBcInB4XCIpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJkeVwiLCBcIjEuMmVtXCIpXG4gICAgICAgICAgICAgICAgLnRleHQoY29uZmlnLmdhdWdlX2xhYmVsX3Nob3cgPyBjb25maWcuZ2F1Z2VfbWF4IDogJycpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0R2F1Z2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmNzID0gdGhpcy5hcmNzO1xuICAgICAgICBpZiAodGhpcy5oYXNUeXBlKCdnYXVnZScpKSB7XG4gICAgICAgICAgICBhcmNzLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy5jaGFydEFyY3NCYWNrZ3JvdW5kKTtcbiAgICAgICAgICAgIGFyY3MuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MuY2hhcnRBcmNzR2F1Z2VVbml0KVxuICAgICAgICAgICAgICAgIC5zdHlsZShcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpO1xuICAgICAgICAgICAgYXJjcy5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy5jaGFydEFyY3NHYXVnZU1pbilcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJ0ZXh0LWFuY2hvclwiLCBcIm1pZGRsZVwiKVxuICAgICAgICAgICAgICAgIC5zdHlsZShcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcbiAgICAgICAgICAgIGFyY3MuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MuY2hhcnRBcmNzR2F1Z2VNYXgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldEdhdWdlTGFiZWxIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5nYXVnZV9sYWJlbF9zaG93ID8gMjAgOiAwO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0UmVnaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICAkJC5yZWdpb24gPSAkJC5tYWluLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cihcImNsaXAtcGF0aFwiLCAkJC5jbGlwUGF0aClcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MucmVnaW9ucyk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVSZWdpb24gPSBmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuXG4gICAgICAgIC8vIGhpZGUgaWYgYXJjIHR5cGVcbiAgICAgICAgJCQucmVnaW9uLnN0eWxlKCd2aXNpYmlsaXR5JywgJCQuaGFzQXJjVHlwZSgpID8gJ2hpZGRlbicgOiAndmlzaWJsZScpO1xuXG4gICAgICAgICQkLm1haW5SZWdpb24gPSAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5yZWdpb25zKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MucmVnaW9uKVxuICAgICAgICAgICAgLmRhdGEoY29uZmlnLnJlZ2lvbnMpO1xuICAgICAgICAkJC5tYWluUmVnaW9uLmVudGVyKCkuYXBwZW5kKCdnJylcbiAgICAgICAgICAuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgIC5zdHlsZShcImZpbGwtb3BhY2l0eVwiLCAwKTtcbiAgICAgICAgJCQubWFpblJlZ2lvblxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJCQuY2xhc3NSZWdpb24uYmluZCgkJCkpO1xuICAgICAgICAkJC5tYWluUmVnaW9uLmV4aXQoKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDApXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWRyYXdSZWdpb24gPSBmdW5jdGlvbiAod2l0aFRyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyICQkID0gdGhpcyxcbiAgICAgICAgICAgIHJlZ2lvbnMgPSAkJC5tYWluUmVnaW9uLnNlbGVjdEFsbCgncmVjdCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIGRhdGEgaXMgYmluZGVkIHRvIGcgYW5kIGl0J3Mgbm90IHRyYW5zZmVycmVkIHRvIHJlY3QgKGNoaWxkIG5vZGUpIGF1dG9tYXRpY2FsbHksXG4gICAgICAgICAgICAgICAgLy8gdGhlbiBkYXRhIG9mIGVhY2ggcmVjdCBoYXMgdG8gYmUgdXBkYXRlZCBtYW51YWxseS5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGVyZSBzaG91bGQgYmUgbW9yZSBlZmZpY2llbnQgd2F5IHRvIHNvbHZlIHRoaXM/XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudERhdGEgPSAkJC5kMy5zZWxlY3QodGhpcy5wYXJlbnROb2RlKS5kYXR1bSgpO1xuICAgICAgICAgICAgICAgICQkLmQzLnNlbGVjdCh0aGlzKS5kYXR1bShwYXJlbnREYXRhKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgeCA9ICQkLnJlZ2lvblguYmluZCgkJCksXG4gICAgICAgICAgICB5ID0gJCQucmVnaW9uWS5iaW5kKCQkKSxcbiAgICAgICAgICAgIHcgPSAkJC5yZWdpb25XaWR0aC5iaW5kKCQkKSxcbiAgICAgICAgICAgIGggPSAkJC5yZWdpb25IZWlnaHQuYmluZCgkJCk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAod2l0aFRyYW5zaXRpb24gPyByZWdpb25zLnRyYW5zaXRpb24oKSA6IHJlZ2lvbnMpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIHgpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJ5XCIsIHkpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCB3KVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwiZmlsbC1vcGFjaXR5XCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBpc1ZhbHVlKGQub3BhY2l0eSkgPyBkLm9wYWNpdHkgOiAwLjE7IH0pXG4gICAgICAgIF07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWdpb25YID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgeFBvcywgeVNjYWxlID0gZC5heGlzID09PSAneScgPyAkJC55IDogJCQueTI7XG4gICAgICAgIGlmIChkLmF4aXMgPT09ICd5JyB8fCBkLmF4aXMgPT09ICd5MicpIHtcbiAgICAgICAgICAgIHhQb3MgPSBjb25maWcuYXhpc19yb3RhdGVkID8gKCdzdGFydCcgaW4gZCA/IHlTY2FsZShkLnN0YXJ0KSA6IDApIDogMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhQb3MgPSBjb25maWcuYXhpc19yb3RhdGVkID8gMCA6ICgnc3RhcnQnIGluIGQgPyAkJC54KCQkLmlzVGltZVNlcmllcygpID8gJCQucGFyc2VEYXRlKGQuc3RhcnQpIDogZC5zdGFydCkgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geFBvcztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnJlZ2lvblkgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICB5UG9zLCB5U2NhbGUgPSBkLmF4aXMgPT09ICd5JyA/ICQkLnkgOiAkJC55MjtcbiAgICAgICAgaWYgKGQuYXhpcyA9PT0gJ3knIHx8IGQuYXhpcyA9PT0gJ3kyJykge1xuICAgICAgICAgICAgeVBvcyA9IGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAwIDogKCdlbmQnIGluIGQgPyB5U2NhbGUoZC5lbmQpIDogMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5UG9zID0gY29uZmlnLmF4aXNfcm90YXRlZCA/ICgnc3RhcnQnIGluIGQgPyAkJC54KCQkLmlzVGltZVNlcmllcygpID8gJCQucGFyc2VEYXRlKGQuc3RhcnQpIDogZC5zdGFydCkgOiAwKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHlQb3M7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWdpb25XaWR0aCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIHN0YXJ0ID0gJCQucmVnaW9uWChkKSwgZW5kLCB5U2NhbGUgPSBkLmF4aXMgPT09ICd5JyA/ICQkLnkgOiAkJC55MjtcbiAgICAgICAgaWYgKGQuYXhpcyA9PT0gJ3knIHx8IGQuYXhpcyA9PT0gJ3kyJykge1xuICAgICAgICAgICAgZW5kID0gY29uZmlnLmF4aXNfcm90YXRlZCA/ICgnZW5kJyBpbiBkID8geVNjYWxlKGQuZW5kKSA6ICQkLndpZHRoKSA6ICQkLndpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kID0gY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLndpZHRoIDogKCdlbmQnIGluIGQgPyAkJC54KCQkLmlzVGltZVNlcmllcygpID8gJCQucGFyc2VEYXRlKGQuZW5kKSA6IGQuZW5kKSA6ICQkLndpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5kIDwgc3RhcnQgPyAwIDogZW5kIC0gc3RhcnQ7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWdpb25IZWlnaHQgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBzdGFydCA9IHRoaXMucmVnaW9uWShkKSwgZW5kLCB5U2NhbGUgPSBkLmF4aXMgPT09ICd5JyA/ICQkLnkgOiAkJC55MjtcbiAgICAgICAgaWYgKGQuYXhpcyA9PT0gJ3knIHx8IGQuYXhpcyA9PT0gJ3kyJykge1xuICAgICAgICAgICAgZW5kID0gY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLmhlaWdodCA6ICgnc3RhcnQnIGluIGQgPyB5U2NhbGUoZC5zdGFydCkgOiAkJC5oZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kID0gY29uZmlnLmF4aXNfcm90YXRlZCA/ICgnZW5kJyBpbiBkID8gJCQueCgkJC5pc1RpbWVTZXJpZXMoKSA/ICQkLnBhcnNlRGF0ZShkLmVuZCkgOiBkLmVuZCkgOiAkJC5oZWlnaHQpIDogJCQuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbmQgPCBzdGFydCA/IDAgOiBlbmQgLSBzdGFydDtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzUmVnaW9uT25YID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuICFkLmF4aXMgfHwgZC5heGlzID09PSAneCc7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmRyYWcgPSBmdW5jdGlvbiAobW91c2UpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLCBtYWluID0gJCQubWFpbiwgZDMgPSAkJC5kMztcbiAgICAgICAgdmFyIHN4LCBzeSwgbXgsIG15LCBtaW5YLCBtYXhYLCBtaW5ZLCBtYXhZO1xuXG4gICAgICAgIGlmICgkJC5oYXNBcmNUeXBlKCkpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmICghIGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9lbmFibGVkKSB7IHJldHVybjsgfSAvLyBkbyBub3RoaW5nIGlmIG5vdCBzZWxlY3RhYmxlXG4gICAgICAgIGlmIChjb25maWcuem9vbV9lbmFibGVkICYmICEgJCQuem9vbS5hbHREb21haW4pIHsgcmV0dXJuOyB9IC8vIHNraXAgaWYgem9vbWFibGUgYmVjYXVzZSBvZiBjb25mbGljdCBkcmFnIGRlaGF2aW9yXG4gICAgICAgIGlmICghY29uZmlnLmRhdGFfc2VsZWN0aW9uX211bHRpcGxlKSB7IHJldHVybjsgfSAvLyBza2lwIHdoZW4gc2luZ2xlIHNlbGVjdGlvbiBiZWNhdXNlIGRyYWcgaXMgdXNlZCBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG5cbiAgICAgICAgc3ggPSAkJC5kcmFnU3RhcnRbMF07XG4gICAgICAgIHN5ID0gJCQuZHJhZ1N0YXJ0WzFdO1xuICAgICAgICBteCA9IG1vdXNlWzBdO1xuICAgICAgICBteSA9IG1vdXNlWzFdO1xuICAgICAgICBtaW5YID0gTWF0aC5taW4oc3gsIG14KTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KHN4LCBteCk7XG4gICAgICAgIG1pblkgPSAoY29uZmlnLmRhdGFfc2VsZWN0aW9uX2dyb3VwZWQpID8gJCQubWFyZ2luLnRvcCA6IE1hdGgubWluKHN5LCBteSk7XG4gICAgICAgIG1heFkgPSAoY29uZmlnLmRhdGFfc2VsZWN0aW9uX2dyb3VwZWQpID8gJCQuaGVpZ2h0IDogTWF0aC5tYXgoc3ksIG15KTtcblxuICAgICAgICBtYWluLnNlbGVjdCgnLicgKyBDTEFTUy5kcmFnYXJlYSlcbiAgICAgICAgICAgIC5hdHRyKCd4JywgbWluWClcbiAgICAgICAgICAgIC5hdHRyKCd5JywgbWluWSlcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIG1heFggLSBtaW5YKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIG1heFkgLSBtaW5ZKTtcbiAgICAgICAgLy8gVE9ETzogYmluYXJ5IHNlYXJjaCB3aGVuIG11bHRpcGxlIHhzXG4gICAgICAgIG1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlcykuc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlKVxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZCkgeyByZXR1cm4gY29uZmlnLmRhdGFfc2VsZWN0aW9uX2lzc2VsZWN0YWJsZShkKTsgfSlcbiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNoYXBlID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkID0gc2hhcGUuY2xhc3NlZChDTEFTUy5TRUxFQ1RFRCksXG4gICAgICAgICAgICAgICAgICAgIGlzSW5jbHVkZWQgPSBzaGFwZS5jbGFzc2VkKENMQVNTLklOQ0xVREVEKSxcbiAgICAgICAgICAgICAgICAgICAgX3gsIF95LCBfdywgX2gsIHRvZ2dsZSwgaXNXaXRoaW4gPSBmYWxzZSwgYm94O1xuICAgICAgICAgICAgICAgIGlmIChzaGFwZS5jbGFzc2VkKENMQVNTLmNpcmNsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3ggPSBzaGFwZS5hdHRyKFwiY3hcIikgKiAxO1xuICAgICAgICAgICAgICAgICAgICBfeSA9IHNoYXBlLmF0dHIoXCJjeVwiKSAqIDE7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZSA9ICQkLnRvZ2dsZVBvaW50O1xuICAgICAgICAgICAgICAgICAgICBpc1dpdGhpbiA9IG1pblggPCBfeCAmJiBfeCA8IG1heFggJiYgbWluWSA8IF95ICYmIF95IDwgbWF4WTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hhcGUuY2xhc3NlZChDTEFTUy5iYXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJveCA9IGdldFBhdGhCb3godGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIF94ID0gYm94Lng7XG4gICAgICAgICAgICAgICAgICAgIF95ID0gYm94Lnk7XG4gICAgICAgICAgICAgICAgICAgIF93ID0gYm94LndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBfaCA9IGJveC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZSA9ICQkLnRvZ2dsZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGlzV2l0aGluID0gIShtYXhYIDwgX3ggfHwgX3ggKyBfdyA8IG1pblgpICYmICEobWF4WSA8IF95IHx8IF95ICsgX2ggPCBtaW5ZKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBsaW5lL2FyZWEgc2VsZWN0aW9uIG5vdCBzdXBwb3J0ZWQgeWV0XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzV2l0aGluIF4gaXNJbmNsdWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBzaGFwZS5jbGFzc2VkKENMQVNTLklOQ0xVREVELCAhaXNJbmNsdWRlZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGluY2x1ZGVkL3VuaW5jbHVkZWQgY2FsbGJhY2sgaGVyZVxuICAgICAgICAgICAgICAgICAgICBzaGFwZS5jbGFzc2VkKENMQVNTLlNFTEVDVEVELCAhaXNTZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5jYWxsKCQkLCAhaXNTZWxlY3RlZCwgc2hhcGUsIGQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5kcmFnc3RhcnQgPSBmdW5jdGlvbiAobW91c2UpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICBpZiAoJCQuaGFzQXJjVHlwZSgpKSB7IHJldHVybjsgfVxuICAgICAgICBpZiAoISBjb25maWcuZGF0YV9zZWxlY3Rpb25fZW5hYmxlZCkgeyByZXR1cm47IH0gLy8gZG8gbm90aGluZyBpZiBub3Qgc2VsZWN0YWJsZVxuICAgICAgICAkJC5kcmFnU3RhcnQgPSBtb3VzZTtcbiAgICAgICAgJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1MuY2hhcnQpLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBDTEFTUy5kcmFnYXJlYSlcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuMSk7XG4gICAgICAgICQkLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZHJhZ2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICBpZiAoJCQuaGFzQXJjVHlwZSgpKSB7IHJldHVybjsgfVxuICAgICAgICBpZiAoISBjb25maWcuZGF0YV9zZWxlY3Rpb25fZW5hYmxlZCkgeyByZXR1cm47IH0gLy8gZG8gbm90aGluZyBpZiBub3Qgc2VsZWN0YWJsZVxuICAgICAgICAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5kcmFnYXJlYSlcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcbiAgICAgICAgJCQubWFpbi5zZWxlY3RBbGwoJy4nICsgQ0xBU1Muc2hhcGUpXG4gICAgICAgICAgICAuY2xhc3NlZChDTEFTUy5JTkNMVURFRCwgZmFsc2UpO1xuICAgICAgICAkJC5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5zZWxlY3RQb2ludCA9IGZ1bmN0aW9uICh0YXJnZXQsIGQsIGkpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgY3ggPSAoY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLmNpcmNsZVkgOiAkJC5jaXJjbGVYKS5iaW5kKCQkKSxcbiAgICAgICAgICAgIGN5ID0gKGNvbmZpZy5heGlzX3JvdGF0ZWQgPyAkJC5jaXJjbGVYIDogJCQuY2lyY2xlWSkuYmluZCgkJCksXG4gICAgICAgICAgICByID0gJCQucG9pbnRTZWxlY3RSLmJpbmQoJCQpO1xuICAgICAgICBjb25maWcuZGF0YV9vbnNlbGVjdGVkLmNhbGwoJCQuYXBpLCBkLCB0YXJnZXQubm9kZSgpKTtcbiAgICAgICAgLy8gYWRkIHNlbGVjdGVkLWNpcmNsZSBvbiBsb3cgbGF5ZXIgZ1xuICAgICAgICAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5zZWxlY3RlZENpcmNsZXMgKyAkJC5nZXRUYXJnZXRTZWxlY3RvclN1ZmZpeChkLmlkKSkuc2VsZWN0QWxsKCcuJyArIENMQVNTLnNlbGVjdGVkQ2lyY2xlICsgJy0nICsgaSlcbiAgICAgICAgICAgIC5kYXRhKFtkXSlcbiAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gJCQuZ2VuZXJhdGVDbGFzcyhDTEFTUy5zZWxlY3RlZENpcmNsZSwgaSk7IH0pXG4gICAgICAgICAgICAuYXR0cihcImN4XCIsIGN4KVxuICAgICAgICAgICAgLmF0dHIoXCJjeVwiLCBjeSlcbiAgICAgICAgICAgIC5hdHRyKFwic3Ryb2tlXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuICQkLmNvbG9yKGQpOyB9KVxuICAgICAgICAgICAgLmF0dHIoXCJyXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiAkJC5wb2ludFNlbGVjdFIoZCkgKiAxLjQ7IH0pXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKDEwMClcbiAgICAgICAgICAgIC5hdHRyKFwiclwiLCByKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVuc2VsZWN0UG9pbnQgPSBmdW5jdGlvbiAodGFyZ2V0LCBkLCBpKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLmNvbmZpZy5kYXRhX29udW5zZWxlY3RlZC5jYWxsKCQkLmFwaSwgZCwgdGFyZ2V0Lm5vZGUoKSk7XG4gICAgICAgIC8vIHJlbW92ZSBzZWxlY3RlZC1jaXJjbGUgZnJvbSBsb3cgbGF5ZXIgZ1xuICAgICAgICAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5zZWxlY3RlZENpcmNsZXMgKyAkJC5nZXRUYXJnZXRTZWxlY3RvclN1ZmZpeChkLmlkKSkuc2VsZWN0QWxsKCcuJyArIENMQVNTLnNlbGVjdGVkQ2lyY2xlICsgJy0nICsgaSlcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKS5hdHRyKCdyJywgMClcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnRvZ2dsZVBvaW50ID0gZnVuY3Rpb24gKHNlbGVjdGVkLCB0YXJnZXQsIGQsIGkpIHtcbiAgICAgICAgc2VsZWN0ZWQgPyB0aGlzLnNlbGVjdFBvaW50KHRhcmdldCwgZCwgaSkgOiB0aGlzLnVuc2VsZWN0UG9pbnQodGFyZ2V0LCBkLCBpKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnNlbGVjdFBhdGggPSBmdW5jdGlvbiAodGFyZ2V0LCBkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLmNvbmZpZy5kYXRhX29uc2VsZWN0ZWQuY2FsbCgkJCwgZCwgdGFyZ2V0Lm5vZGUoKSk7XG4gICAgICAgIGlmICgkJC5jb25maWcuaW50ZXJhY3Rpb25fYnJpZ2h0ZW4pIHtcbiAgICAgICAgICAgIHRhcmdldC50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKVxuICAgICAgICAgICAgICAgIC5zdHlsZShcImZpbGxcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gJCQuZDMucmdiKCQkLmNvbG9yKGQpKS5icmlnaHRlcigwLjc1KTsgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVuc2VsZWN0UGF0aCA9IGZ1bmN0aW9uICh0YXJnZXQsIGQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgJCQuY29uZmlnLmRhdGFfb251bnNlbGVjdGVkLmNhbGwoJCQsIGQsIHRhcmdldC5ub2RlKCkpO1xuICAgICAgICBpZiAoJCQuY29uZmlnLmludGVyYWN0aW9uX2JyaWdodGVuKSB7XG4gICAgICAgICAgICB0YXJnZXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKDEwMClcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuICQkLmNvbG9yKGQpOyB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udG9nZ2xlUGF0aCA9IGZ1bmN0aW9uIChzZWxlY3RlZCwgdGFyZ2V0LCBkLCBpKSB7XG4gICAgICAgIHNlbGVjdGVkID8gdGhpcy5zZWxlY3RQYXRoKHRhcmdldCwgZCwgaSkgOiB0aGlzLnVuc2VsZWN0UGF0aCh0YXJnZXQsIGQsIGkpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZ2V0VG9nZ2xlID0gZnVuY3Rpb24gKHRoYXQsIGQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgdG9nZ2xlO1xuICAgICAgICBpZiAodGhhdC5ub2RlTmFtZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgIGlmICgkJC5pc1N0ZXBUeXBlKGQpKSB7XG4gICAgICAgICAgICAgICAgLy8gY2lyY2xlIGlzIGhpZGRlbiBpbiBzdGVwIGNoYXJ0LCBzbyB0cmVhdCBhcyB3aXRoaW4gdGhlIGNsaWNrIGFyZWFcbiAgICAgICAgICAgICAgICB0b2dnbGUgPSBmdW5jdGlvbiAoKSB7fTsgLy8gVE9ETzogaG93IHRvIHNlbGVjdCBzdGVwIGNoYXJ0P1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2dnbGUgPSAkJC50b2dnbGVQb2ludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGF0Lm5vZGVOYW1lID09PSAncGF0aCcpIHtcbiAgICAgICAgICAgIHRvZ2dsZSA9ICQkLnRvZ2dsZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvZ2dsZTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnRvZ2dsZVNoYXBlID0gZnVuY3Rpb24gKHRoYXQsIGQsIGkpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgZDMgPSAkJC5kMywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgc2hhcGUgPSBkMy5zZWxlY3QodGhhdCksIGlzU2VsZWN0ZWQgPSBzaGFwZS5jbGFzc2VkKENMQVNTLlNFTEVDVEVEKSxcbiAgICAgICAgICAgIHRvZ2dsZSA9ICQkLmdldFRvZ2dsZSh0aGF0LCBkKS5iaW5kKCQkKTtcblxuICAgICAgICBpZiAoY29uZmlnLmRhdGFfc2VsZWN0aW9uX2VuYWJsZWQgJiYgY29uZmlnLmRhdGFfc2VsZWN0aW9uX2lzc2VsZWN0YWJsZShkKSkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcuZGF0YV9zZWxlY3Rpb25fbXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5zaGFwZXMgKyAoY29uZmlnLmRhdGFfc2VsZWN0aW9uX2dyb3VwZWQgPyAkJC5nZXRUYXJnZXRTZWxlY3RvclN1ZmZpeChkLmlkKSA6IFwiXCIpKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1Muc2hhcGUpLmVhY2goZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXBlID0gZDMuc2VsZWN0KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGUuY2xhc3NlZChDTEFTUy5TRUxFQ1RFRCkpIHsgdG9nZ2xlKGZhbHNlLCBzaGFwZS5jbGFzc2VkKENMQVNTLlNFTEVDVEVELCBmYWxzZSksIGQsIGkpOyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFwZS5jbGFzc2VkKENMQVNTLlNFTEVDVEVELCAhaXNTZWxlY3RlZCk7XG4gICAgICAgICAgICB0b2dnbGUoIWlzU2VsZWN0ZWQsIHNoYXBlLCBkLCBpKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0QnJ1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGQzID0gJCQuZDM7XG4gICAgICAgICQkLmJydXNoID0gZDMuc3ZnLmJydXNoKCkub24oXCJicnVzaFwiLCBmdW5jdGlvbiAoKSB7ICQkLnJlZHJhd0ZvckJydXNoKCk7IH0pO1xuICAgICAgICAkJC5icnVzaC51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoJCQuY29udGV4dCkgeyAkJC5jb250ZXh0LnNlbGVjdCgnLicgKyBDTEFTUy5icnVzaCkuY2FsbCh0aGlzKTsgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgICAgICQkLmJydXNoLnNjYWxlID0gZnVuY3Rpb24gKHNjYWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gJCQuY29uZmlnLmF4aXNfcm90YXRlZCA/IHRoaXMueShzY2FsZSkgOiB0aGlzLngoc2NhbGUpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaW5pdFN1YmNoYXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBjb250ZXh0ID0gJCQuY29udGV4dCA9ICQkLnN2Zy5hcHBlbmQoXCJnXCIpLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgJCQuZ2V0VHJhbnNsYXRlKCdjb250ZXh0JykpLFxuICAgICAgICAgICAgdmlzaWJpbGl0eSA9IGNvbmZpZy5zdWJjaGFydF9zaG93ID8gJ3Zpc2libGUnIDogJ2hpZGRlbic7XG5cbiAgICAgICAgY29udGV4dC5zdHlsZSgndmlzaWJpbGl0eScsIHZpc2liaWxpdHkpO1xuXG4gICAgICAgIC8vIERlZmluZSBnIGZvciBjaGFydCBhcmVhXG4gICAgICAgIGNvbnRleHQuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKFwiY2xpcC1wYXRoXCIsICQkLmNsaXBQYXRoRm9yU3ViY2hhcnQpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCBDTEFTUy5jaGFydCk7XG5cbiAgICAgICAgLy8gRGVmaW5lIGcgZm9yIGJhciBjaGFydCBhcmVhXG4gICAgICAgIGNvbnRleHQuc2VsZWN0KCcuJyArIENMQVNTLmNoYXJ0KS5hcHBlbmQoXCJnXCIpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmNoYXJ0QmFycyk7XG5cbiAgICAgICAgLy8gRGVmaW5lIGcgZm9yIGxpbmUgY2hhcnQgYXJlYVxuICAgICAgICBjb250ZXh0LnNlbGVjdCgnLicgKyBDTEFTUy5jaGFydCkuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBDTEFTUy5jaGFydExpbmVzKTtcblxuICAgICAgICAvLyBBZGQgZXh0ZW50IHJlY3QgZm9yIEJydXNoXG4gICAgICAgIGNvbnRleHQuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgJCQuY2xpcFBhdGgpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIENMQVNTLmJydXNoKVxuICAgICAgICAgICAgLmNhbGwoJCQuYnJ1c2gpO1xuXG4gICAgICAgIC8vIEFUVEVOVElPTjogVGhpcyBtdXN0IGJlIGNhbGxlZCBBRlRFUiBjaGFydCBhZGRlZFxuICAgICAgICAvLyBBZGQgQXhpc1xuICAgICAgICAkJC5heGVzLnN1YnggPSBjb250ZXh0LmFwcGVuZChcImdcIilcbiAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgQ0xBU1MuYXhpc1gpXG4gICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAkJC5nZXRUcmFuc2xhdGUoJ3N1YngnKSlcbiAgICAgICAgICAgIC5hdHRyKFwiY2xpcC1wYXRoXCIsIGNvbmZpZy5heGlzX3JvdGF0ZWQgPyBcIlwiIDogJCQuY2xpcFBhdGhGb3JYQXhpcylcbiAgICAgICAgICAgIC5zdHlsZShcInZpc2liaWxpdHlcIiwgY29uZmlnLnN1YmNoYXJ0X2F4aXNfeF9zaG93ID8gdmlzaWJpbGl0eSA6ICdoaWRkZW4nKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnVwZGF0ZVRhcmdldHNGb3JTdWJjaGFydCA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbnRleHQgPSAkJC5jb250ZXh0LCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBjb250ZXh0TGluZUVudGVyLCBjb250ZXh0TGluZVVwZGF0ZSwgY29udGV4dEJhckVudGVyLCBjb250ZXh0QmFyVXBkYXRlLFxuICAgICAgICAgICAgY2xhc3NDaGFydEJhciA9ICQkLmNsYXNzQ2hhcnRCYXIuYmluZCgkJCksXG4gICAgICAgICAgICBjbGFzc0JhcnMgPSAkJC5jbGFzc0JhcnMuYmluZCgkJCksXG4gICAgICAgICAgICBjbGFzc0NoYXJ0TGluZSA9ICQkLmNsYXNzQ2hhcnRMaW5lLmJpbmQoJCQpLFxuICAgICAgICAgICAgY2xhc3NMaW5lcyA9ICQkLmNsYXNzTGluZXMuYmluZCgkJCksXG4gICAgICAgICAgICBjbGFzc0FyZWFzID0gJCQuY2xhc3NBcmVhcy5iaW5kKCQkKTtcblxuICAgICAgICBpZiAoY29uZmlnLnN1YmNoYXJ0X3Nob3cpIHtcbiAgICAgICAgICAgIC8vLS0gQmFyIC0tLy9cbiAgICAgICAgICAgIGNvbnRleHRCYXJVcGRhdGUgPSBjb250ZXh0LnNlbGVjdCgnLicgKyBDTEFTUy5jaGFydEJhcnMpLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5jaGFydEJhcilcbiAgICAgICAgICAgICAgICAuZGF0YSh0YXJnZXRzKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGNsYXNzQ2hhcnRCYXIpO1xuICAgICAgICAgICAgY29udGV4dEJhckVudGVyID0gY29udGV4dEJhclVwZGF0ZS5lbnRlcigpLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCBjbGFzc0NoYXJ0QmFyKTtcbiAgICAgICAgICAgIC8vIEJhcnMgZm9yIGVhY2ggZGF0YVxuICAgICAgICAgICAgY29udGV4dEJhckVudGVyLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBjbGFzc0JhcnMpO1xuXG4gICAgICAgICAgICAvLy0tIExpbmUgLS0vL1xuICAgICAgICAgICAgY29udGV4dExpbmVVcGRhdGUgPSBjb250ZXh0LnNlbGVjdCgnLicgKyBDTEFTUy5jaGFydExpbmVzKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MuY2hhcnRMaW5lKVxuICAgICAgICAgICAgICAgIC5kYXRhKHRhcmdldHMpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgY2xhc3NDaGFydExpbmUpO1xuICAgICAgICAgICAgY29udGV4dExpbmVFbnRlciA9IGNvbnRleHRMaW5lVXBkYXRlLmVudGVyKCkuYXBwZW5kKCdnJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGNsYXNzQ2hhcnRMaW5lKTtcbiAgICAgICAgICAgIC8vIExpbmVzIGZvciBlYWNoIGRhdGFcbiAgICAgICAgICAgIGNvbnRleHRMaW5lRW50ZXIuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgY2xhc3NMaW5lcyk7XG4gICAgICAgICAgICAvLyBBcmVhXG4gICAgICAgICAgICBjb250ZXh0TGluZUVudGVyLmFwcGVuZChcImdcIilcbiAgICAgICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIGNsYXNzQXJlYXMpO1xuXG4gICAgICAgICAgICAvLy0tIEJydXNoIC0tLy9cbiAgICAgICAgICAgIGNvbnRleHQuc2VsZWN0QWxsKCcuJyArIENMQVNTLmJydXNoICsgJyByZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cihjb25maWcuYXhpc19yb3RhdGVkID8gXCJ3aWR0aFwiIDogXCJoZWlnaHRcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLndpZHRoMiA6ICQkLmhlaWdodDIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVCYXJGb3JTdWJjaGFydCA9IGZ1bmN0aW9uIChkdXJhdGlvbkZvckV4aXQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcztcbiAgICAgICAgJCQuY29udGV4dEJhciA9ICQkLmNvbnRleHQuc2VsZWN0QWxsKCcuJyArIENMQVNTLmJhcnMpLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5iYXIpXG4gICAgICAgICAgICAuZGF0YSgkJC5iYXJEYXRhLmJpbmQoJCQpKTtcbiAgICAgICAgJCQuY29udGV4dEJhci5lbnRlcigpLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsICQkLmNsYXNzQmFyLmJpbmQoJCQpKVxuICAgICAgICAgICAgLnN0eWxlKFwic3Ryb2tlXCIsICdub25lJylcbiAgICAgICAgICAgIC5zdHlsZShcImZpbGxcIiwgJCQuY29sb3IpO1xuICAgICAgICAkJC5jb250ZXh0QmFyXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsICQkLmluaXRpYWxPcGFjaXR5LmJpbmQoJCQpKTtcbiAgICAgICAgJCQuY29udGV4dEJhci5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uRm9yRXhpdClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWRyYXdCYXJGb3JTdWJjaGFydCA9IGZ1bmN0aW9uIChkcmF3QmFyT25TdWIsIHdpdGhUcmFuc2l0aW9uLCBkdXJhdGlvbikge1xuICAgICAgICAod2l0aFRyYW5zaXRpb24gPyB0aGlzLmNvbnRleHRCYXIudHJhbnNpdGlvbihNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkpLmR1cmF0aW9uKGR1cmF0aW9uKSA6IHRoaXMuY29udGV4dEJhcilcbiAgICAgICAgICAgIC5hdHRyKCdkJywgZHJhd0Jhck9uU3ViKVxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVMaW5lRm9yU3ViY2hhcnQgPSBmdW5jdGlvbiAoZHVyYXRpb25Gb3JFeGl0KSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXM7XG4gICAgICAgICQkLmNvbnRleHRMaW5lID0gJCQuY29udGV4dC5zZWxlY3RBbGwoJy4nICsgQ0xBU1MubGluZXMpLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5saW5lKVxuICAgICAgICAgICAgLmRhdGEoJCQubGluZURhdGEuYmluZCgkJCkpO1xuICAgICAgICAkJC5jb250ZXh0TGluZS5lbnRlcigpLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAkJC5jbGFzc0xpbmUuYmluZCgkJCkpXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICQkLmNvbG9yKTtcbiAgICAgICAgJCQuY29udGV4dExpbmVcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgJCQuaW5pdGlhbE9wYWNpdHkuYmluZCgkJCkpO1xuICAgICAgICAkJC5jb250ZXh0TGluZS5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uRm9yRXhpdClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWRyYXdMaW5lRm9yU3ViY2hhcnQgPSBmdW5jdGlvbiAoZHJhd0xpbmVPblN1Yiwgd2l0aFRyYW5zaXRpb24sIGR1cmF0aW9uKSB7XG4gICAgICAgICh3aXRoVHJhbnNpdGlvbiA/IHRoaXMuY29udGV4dExpbmUudHJhbnNpdGlvbihNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkpLmR1cmF0aW9uKGR1cmF0aW9uKSA6IHRoaXMuY29udGV4dExpbmUpXG4gICAgICAgICAgICAuYXR0cihcImRcIiwgZHJhd0xpbmVPblN1YilcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udXBkYXRlQXJlYUZvclN1YmNoYXJ0ID0gZnVuY3Rpb24gKGR1cmF0aW9uRm9yRXhpdCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBkMyA9ICQkLmQzO1xuICAgICAgICAkJC5jb250ZXh0QXJlYSA9ICQkLmNvbnRleHQuc2VsZWN0QWxsKCcuJyArIENMQVNTLmFyZWFzKS5zZWxlY3RBbGwoJy4nICsgQ0xBU1MuYXJlYSlcbiAgICAgICAgICAgIC5kYXRhKCQkLmxpbmVEYXRhLmJpbmQoJCQpKTtcbiAgICAgICAgJCQuY29udGV4dEFyZWEuZW50ZXIoKS5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCAkJC5jbGFzc0FyZWEuYmluZCgkJCkpXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsXCIsICQkLmNvbG9yKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCBmdW5jdGlvbiAoKSB7ICQkLm9yZ0FyZWFPcGFjaXR5ID0gK2QzLnNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScpOyByZXR1cm4gMDsgfSk7XG4gICAgICAgICQkLmNvbnRleHRBcmVhXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDApO1xuICAgICAgICAkJC5jb250ZXh0QXJlYS5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uRm9yRXhpdClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWRyYXdBcmVhRm9yU3ViY2hhcnQgPSBmdW5jdGlvbiAoZHJhd0FyZWFPblN1Yiwgd2l0aFRyYW5zaXRpb24sIGR1cmF0aW9uKSB7XG4gICAgICAgICh3aXRoVHJhbnNpdGlvbiA/IHRoaXMuY29udGV4dEFyZWEudHJhbnNpdGlvbihNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkpLmR1cmF0aW9uKGR1cmF0aW9uKSA6IHRoaXMuY29udGV4dEFyZWEpXG4gICAgICAgICAgICAuYXR0cihcImRcIiwgZHJhd0FyZWFPblN1YilcbiAgICAgICAgICAgIC5zdHlsZShcImZpbGxcIiwgdGhpcy5jb2xvcilcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgdGhpcy5vcmdBcmVhT3BhY2l0eSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5yZWRyYXdTdWJjaGFydCA9IGZ1bmN0aW9uICh3aXRoU3ViY2hhcnQsIHRyYW5zaXRpb25zLCBkdXJhdGlvbiwgZHVyYXRpb25Gb3JFeGl0LCBhcmVhSW5kaWNlcywgYmFySW5kaWNlcywgbGluZUluZGljZXMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgZDMgPSAkJC5kMywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgZHJhd0FyZWFPblN1YiwgZHJhd0Jhck9uU3ViLCBkcmF3TGluZU9uU3ViO1xuXG4gICAgICAgICQkLmNvbnRleHQuc3R5bGUoJ3Zpc2liaWxpdHknLCBjb25maWcuc3ViY2hhcnRfc2hvdyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKTtcblxuICAgICAgICAvLyBzdWJjaGFydFxuICAgICAgICBpZiAoY29uZmlnLnN1YmNoYXJ0X3Nob3cpIHtcbiAgICAgICAgICAgIC8vIHJlZmxlY3QgbWFpbiBjaGFydCB0byBleHRlbnQgb24gc3ViY2hhcnQgaWYgem9vbWVkXG4gICAgICAgICAgICBpZiAoZDMuZXZlbnQgJiYgZDMuZXZlbnQudHlwZSA9PT0gJ3pvb20nKSB7XG4gICAgICAgICAgICAgICAgJCQuYnJ1c2guZXh0ZW50KCQkLngub3JnRG9tYWluKCkpLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdXBkYXRlIHN1YmNoYXJ0IGVsZW1lbnRzIGlmIG5lZWRlZFxuICAgICAgICAgICAgaWYgKHdpdGhTdWJjaGFydCkge1xuXG4gICAgICAgICAgICAgICAgLy8gZXh0ZW50IHJlY3RcbiAgICAgICAgICAgICAgICBpZiAoISQkLmJydXNoLmVtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgJCQuYnJ1c2guZXh0ZW50KCQkLngub3JnRG9tYWluKCkpLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzZXR1cCBkcmF3ZXIgLSBNRU1POiB0aGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGF4aXMgdXBkYXRlZFxuICAgICAgICAgICAgICAgIGRyYXdBcmVhT25TdWIgPSAkJC5nZW5lcmF0ZURyYXdBcmVhKGFyZWFJbmRpY2VzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBkcmF3QmFyT25TdWIgPSAkJC5nZW5lcmF0ZURyYXdCYXIoYmFySW5kaWNlcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZHJhd0xpbmVPblN1YiA9ICQkLmdlbmVyYXRlRHJhd0xpbmUobGluZUluZGljZXMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgJCQudXBkYXRlQmFyRm9yU3ViY2hhcnQoZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICQkLnVwZGF0ZUxpbmVGb3JTdWJjaGFydChkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgJCQudXBkYXRlQXJlYUZvclN1YmNoYXJ0KGR1cmF0aW9uKTtcblxuICAgICAgICAgICAgICAgICQkLnJlZHJhd0JhckZvclN1YmNoYXJ0KGRyYXdCYXJPblN1YiwgZHVyYXRpb24sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAkJC5yZWRyYXdMaW5lRm9yU3ViY2hhcnQoZHJhd0xpbmVPblN1YiwgZHVyYXRpb24sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAkJC5yZWRyYXdBcmVhRm9yU3ViY2hhcnQoZHJhd0FyZWFPblN1YiwgZHVyYXRpb24sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucmVkcmF3Rm9yQnJ1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIHggPSAkJC54O1xuICAgICAgICAkJC5yZWRyYXcoe1xuICAgICAgICAgICAgd2l0aFRyYW5zaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgd2l0aFk6ICQkLmNvbmZpZy56b29tX3Jlc2NhbGUsXG4gICAgICAgICAgICB3aXRoU3ViY2hhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgd2l0aFVwZGF0ZVhEb21haW46IHRydWUsXG4gICAgICAgICAgICB3aXRoRGltZW5zaW9uOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgJCQuY29uZmlnLnN1YmNoYXJ0X29uYnJ1c2guY2FsbCgkJC5hcGksIHgub3JnRG9tYWluKCkpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4udHJhbnNmb3JtQ29udGV4dCA9IGZ1bmN0aW9uICh3aXRoVHJhbnNpdGlvbiwgdHJhbnNpdGlvbnMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgc3ViWEF4aXM7XG4gICAgICAgIGlmICh0cmFuc2l0aW9ucyAmJiB0cmFuc2l0aW9ucy5heGlzU3ViWCkge1xuICAgICAgICAgICAgc3ViWEF4aXMgPSB0cmFuc2l0aW9ucy5heGlzU3ViWDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YlhBeGlzID0gJCQuY29udGV4dC5zZWxlY3QoJy4nICsgQ0xBU1MuYXhpc1gpO1xuICAgICAgICAgICAgaWYgKHdpdGhUcmFuc2l0aW9uKSB7IHN1YlhBeGlzID0gc3ViWEF4aXMudHJhbnNpdGlvbigpOyB9XG4gICAgICAgIH1cbiAgICAgICAgJCQuY29udGV4dC5hdHRyKFwidHJhbnNmb3JtXCIsICQkLmdldFRyYW5zbGF0ZSgnY29udGV4dCcpKTtcbiAgICAgICAgc3ViWEF4aXMuYXR0cihcInRyYW5zZm9ybVwiLCAkJC5nZXRUcmFuc2xhdGUoJ3N1YngnKSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXREZWZhdWx0RXh0ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBleHRlbnQgPSBpc0Z1bmN0aW9uKGNvbmZpZy5heGlzX3hfZXh0ZW50KSA/IGNvbmZpZy5heGlzX3hfZXh0ZW50KCQkLmdldFhEb21haW4oJCQuZGF0YS50YXJnZXRzKSkgOiBjb25maWcuYXhpc194X2V4dGVudDtcbiAgICAgICAgaWYgKCQkLmlzVGltZVNlcmllcygpKSB7XG4gICAgICAgICAgICBleHRlbnQgPSBbJCQucGFyc2VEYXRlKGV4dGVudFswXSksICQkLnBhcnNlRGF0ZShleHRlbnRbMV0pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0ZW50O1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pbml0Wm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgZDMgPSAkJC5kMywgY29uZmlnID0gJCQuY29uZmlnLCBzdGFydEV2ZW50O1xuXG4gICAgICAgICQkLnpvb20gPSBkMy5iZWhhdmlvci56b29tKClcbiAgICAgICAgICAgIC5vbihcInpvb21zdGFydFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRFdmVudCA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50O1xuICAgICAgICAgICAgICAgICQkLnpvb20uYWx0RG9tYWluID0gZDMuZXZlbnQuc291cmNlRXZlbnQuYWx0S2V5ID8gJCQueC5vcmdEb21haW4oKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgY29uZmlnLnpvb21fb256b29tc3RhcnQuY2FsbCgkJC5hcGksIGQzLmV2ZW50LnNvdXJjZUV2ZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oXCJ6b29tXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkJC5yZWRyYXdGb3Jab29tLmNhbGwoJCQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignem9vbWVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBkMy5ldmVudC5zb3VyY2VFdmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiBjbGljaywgZG8gbm90aGluZy4gb3RoZXJ3aXNlLCBjbGljayBpbnRlcmFjdGlvbiB3aWxsIGJlIGNhbmNlbGVkLlxuICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBzdGFydEV2ZW50LmNsaWVudFggPT09IGV2ZW50LmNsaWVudFggJiYgc3RhcnRFdmVudC5jbGllbnRZID09PSBldmVudC5jbGllbnRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCQucmVkcmF3RXZlbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgJCQudXBkYXRlWm9vbSgpO1xuICAgICAgICAgICAgICAgIGNvbmZpZy56b29tX29uem9vbWVuZC5jYWxsKCQkLmFwaSwgJCQueC5vcmdEb21haW4oKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgJCQuem9vbS5zY2FsZSA9IGZ1bmN0aW9uIChzY2FsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5heGlzX3JvdGF0ZWQgPyB0aGlzLnkoc2NhbGUpIDogdGhpcy54KHNjYWxlKTtcbiAgICAgICAgfTtcbiAgICAgICAgJCQuem9vbS5vcmdTY2FsZUV4dGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBleHRlbnQgPSBjb25maWcuem9vbV9leHRlbnQgPyBjb25maWcuem9vbV9leHRlbnQgOiBbMSwgMTBdO1xuICAgICAgICAgICAgcmV0dXJuIFtleHRlbnRbMF0sIE1hdGgubWF4KCQkLmdldE1heERhdGFDb3VudCgpIC8gZXh0ZW50WzFdLCBleHRlbnRbMV0pXTtcbiAgICAgICAgfTtcbiAgICAgICAgJCQuem9vbS51cGRhdGVTY2FsZUV4dGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByYXRpbyA9IGRpZmZEb21haW4oJCQueC5vcmdEb21haW4oKSkgLyBkaWZmRG9tYWluKCQkLmdldFpvb21Eb21haW4oKSksXG4gICAgICAgICAgICAgICAgZXh0ZW50ID0gdGhpcy5vcmdTY2FsZUV4dGVudCgpO1xuICAgICAgICAgICAgdGhpcy5zY2FsZUV4dGVudChbZXh0ZW50WzBdICogcmF0aW8sIGV4dGVudFsxXSAqIHJhdGlvXSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFpvb21Eb21haW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZywgZDMgPSAkJC5kMyxcbiAgICAgICAgICAgIG1pbiA9IGQzLm1pbihbJCQub3JnWERvbWFpblswXSwgY29uZmlnLnpvb21feF9taW5dKSxcbiAgICAgICAgICAgIG1heCA9IGQzLm1heChbJCQub3JnWERvbWFpblsxXSwgY29uZmlnLnpvb21feF9tYXhdKTtcbiAgICAgICAgcmV0dXJuIFttaW4sIG1heF07XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi51cGRhdGVab29tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCB6ID0gJCQuY29uZmlnLnpvb21fZW5hYmxlZCA/ICQkLnpvb20gOiBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgJCQubWFpbi5zZWxlY3QoJy4nICsgQ0xBU1Muem9vbVJlY3QpLmNhbGwoeikub24oXCJkYmxjbGljay56b29tXCIsIG51bGwpO1xuICAgICAgICAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5ldmVudFJlY3QpLmNhbGwoeikub24oXCJkYmxjbGljay56b29tXCIsIG51bGwpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4ucmVkcmF3Rm9yWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgZDMgPSAkJC5kMywgY29uZmlnID0gJCQuY29uZmlnLCB6b29tID0gJCQuem9vbSwgeCA9ICQkLng7XG4gICAgICAgIGlmICghY29uZmlnLnpvb21fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkJC5maWx0ZXJUYXJnZXRzVG9TaG93KCQkLmRhdGEudGFyZ2V0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGQzLmV2ZW50LnNvdXJjZUV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnICYmIHpvb20uYWx0RG9tYWluKSB7XG4gICAgICAgICAgICB4LmRvbWFpbih6b29tLmFsdERvbWFpbik7XG4gICAgICAgICAgICB6b29tLnNjYWxlKHgpLnVwZGF0ZVNjYWxlRXh0ZW50KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCQkLmlzQ2F0ZWdvcml6ZWQoKSAmJiB4Lm9yZ0RvbWFpbigpWzBdID09PSAkJC5vcmdYRG9tYWluWzBdKSB7XG4gICAgICAgICAgICB4LmRvbWFpbihbJCQub3JnWERvbWFpblswXSAtIDFlLTEwLCB4Lm9yZ0RvbWFpbigpWzFdXSk7XG4gICAgICAgIH1cbiAgICAgICAgJCQucmVkcmF3KHtcbiAgICAgICAgICAgIHdpdGhUcmFuc2l0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHdpdGhZOiBjb25maWcuem9vbV9yZXNjYWxlLFxuICAgICAgICAgICAgd2l0aFN1YmNoYXJ0OiBmYWxzZSxcbiAgICAgICAgICAgIHdpdGhFdmVudFJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgd2l0aERpbWVuc2lvbjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkMy5ldmVudC5zb3VyY2VFdmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgICAgICAgJCQuY2FuY2VsQ2xpY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZy56b29tX29uem9vbS5jYWxsKCQkLmFwaSwgeC5vcmdEb21haW4oKSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdlbmVyYXRlQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZywgZDMgPSAkJC5kMyxcbiAgICAgICAgICAgIGNvbG9ycyA9IGNvbmZpZy5kYXRhX2NvbG9ycyxcbiAgICAgICAgICAgIHBhdHRlcm4gPSBub3RFbXB0eShjb25maWcuY29sb3JfcGF0dGVybikgPyBjb25maWcuY29sb3JfcGF0dGVybiA6IGQzLnNjYWxlLmNhdGVnb3J5MTAoKS5yYW5nZSgpLFxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjb25maWcuZGF0YV9jb2xvcixcbiAgICAgICAgICAgIGlkcyA9IFtdO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgdmFyIGlkID0gZC5pZCB8fCAoZC5kYXRhICYmIGQuZGF0YS5pZCkgfHwgZCwgY29sb3I7XG5cbiAgICAgICAgICAgIC8vIGlmIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAoY29sb3JzW2lkXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvcnNbaWRdKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgc3BlY2lmaWVkLCBjaG9vc2UgdGhhdCBjb2xvclxuICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JzW2lkXSkge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIG5vdCBzcGVjaWZpZWQsIGNob29zZSBmcm9tIHBhdHRlcm5cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpZCkgPCAwKSB7IGlkcy5wdXNoKGlkKTsgfVxuICAgICAgICAgICAgICAgIGNvbG9yID0gcGF0dGVybltpZHMuaW5kZXhPZihpZCkgJSBwYXR0ZXJuLmxlbmd0aF07XG4gICAgICAgICAgICAgICAgY29sb3JzW2lkXSA9IGNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBjYWxsYmFjayhjb2xvciwgZCkgOiBjb2xvcjtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdlbmVyYXRlTGV2ZWxDb2xvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgY29sb3JzID0gY29uZmlnLmNvbG9yX3BhdHRlcm4sXG4gICAgICAgICAgICB0aHJlc2hvbGQgPSBjb25maWcuY29sb3JfdGhyZXNob2xkLFxuICAgICAgICAgICAgYXNWYWx1ZSA9IHRocmVzaG9sZC51bml0ID09PSAndmFsdWUnLFxuICAgICAgICAgICAgdmFsdWVzID0gdGhyZXNob2xkLnZhbHVlcyAmJiB0aHJlc2hvbGQudmFsdWVzLmxlbmd0aCA/IHRocmVzaG9sZC52YWx1ZXMgOiBbXSxcbiAgICAgICAgICAgIG1heCA9IHRocmVzaG9sZC5tYXggfHwgMTAwO1xuICAgICAgICByZXR1cm4gbm90RW1wdHkoY29uZmlnLmNvbG9yX3RocmVzaG9sZCkgPyBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBpLCB2LCBjb2xvciA9IGNvbG9yc1tjb2xvcnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdiA9IGFzVmFsdWUgPyB2YWx1ZSA6ICh2YWx1ZSAqIDEwMCAvIG1heCk7XG4gICAgICAgICAgICAgICAgaWYgKHYgPCB2YWx1ZXNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2xvcjtcbiAgICAgICAgfSA6IG51bGw7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFlGb3JtYXQgPSBmdW5jdGlvbiAoZm9yQXJjKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsXG4gICAgICAgICAgICBmb3JtYXRGb3JZID0gZm9yQXJjICYmICEkJC5oYXNUeXBlKCdnYXVnZScpID8gJCQuZGVmYXVsdEFyY1ZhbHVlRm9ybWF0IDogJCQueUZvcm1hdCxcbiAgICAgICAgICAgIGZvcm1hdEZvclkyID0gZm9yQXJjICYmICEkJC5oYXNUeXBlKCdnYXVnZScpID8gJCQuZGVmYXVsdEFyY1ZhbHVlRm9ybWF0IDogJCQueTJGb3JtYXQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodiwgcmF0aW8sIGlkKSB7XG4gICAgICAgICAgICB2YXIgZm9ybWF0ID0gJCQuYXhpcy5nZXRJZChpZCkgPT09ICd5MicgPyBmb3JtYXRGb3JZMiA6IGZvcm1hdEZvclk7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0LmNhbGwoJCQsIHYsIHJhdGlvKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnlGb3JtYXQgPSBmdW5jdGlvbiAodikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLCBjb25maWcgPSAkJC5jb25maWcsXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuYXhpc195X3RpY2tfZm9ybWF0ID8gY29uZmlnLmF4aXNfeV90aWNrX2Zvcm1hdCA6ICQkLmRlZmF1bHRWYWx1ZUZvcm1hdDtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnkyRm9ybWF0ID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgY29uZmlnID0gJCQuY29uZmlnLFxuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLmF4aXNfeTJfdGlja19mb3JtYXQgPyBjb25maWcuYXhpc195Ml90aWNrX2Zvcm1hdCA6ICQkLmRlZmF1bHRWYWx1ZUZvcm1hdDtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmRlZmF1bHRWYWx1ZUZvcm1hdCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBpc1ZhbHVlKHYpID8gK3YgOiBcIlwiO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uZGVmYXVsdEFyY1ZhbHVlRm9ybWF0ID0gZnVuY3Rpb24gKHYsIHJhdGlvKSB7XG4gICAgICAgIHJldHVybiAocmF0aW8gKiAxMDApLnRvRml4ZWQoMSkgKyAnJSc7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5kYXRhTGFiZWxGb3JtYXQgPSBmdW5jdGlvbiAodGFyZ2V0SWQpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcywgZGF0YV9sYWJlbHMgPSAkJC5jb25maWcuZGF0YV9sYWJlbHMsXG4gICAgICAgICAgICBmb3JtYXQsIGRlZmF1bHRGb3JtYXQgPSBmdW5jdGlvbiAodikgeyByZXR1cm4gaXNWYWx1ZSh2KSA/ICt2IDogXCJcIjsgfTtcbiAgICAgICAgLy8gZmluZCBmb3JtYXQgYWNjb3JkaW5nIHRvIGF4aXMgaWRcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhX2xhYmVscy5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGRhdGFfbGFiZWxzLmZvcm1hdDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YV9sYWJlbHMuZm9ybWF0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKGRhdGFfbGFiZWxzLmZvcm1hdFt0YXJnZXRJZF0pIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSBkYXRhX2xhYmVscy5mb3JtYXRbdGFyZ2V0SWRdID09PSB0cnVlID8gZGVmYXVsdEZvcm1hdCA6IGRhdGFfbGFiZWxzLmZvcm1hdFt0YXJnZXRJZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcnOyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH07XG5cbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5oYXNDYWNoZXMgPSBmdW5jdGlvbiAoaWRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoISAoaWRzW2ldIGluIHRoaXMuY2FjaGUpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uYWRkQ2FjaGUgPSBmdW5jdGlvbiAoaWQsIHRhcmdldCkge1xuICAgICAgICB0aGlzLmNhY2hlW2lkXSA9IHRoaXMuY2xvbmVUYXJnZXQodGFyZ2V0KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldENhY2hlcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgdmFyIHRhcmdldHMgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlkc1tpXSBpbiB0aGlzLmNhY2hlKSB7IHRhcmdldHMucHVzaCh0aGlzLmNsb25lVGFyZ2V0KHRoaXMuY2FjaGVbaWRzW2ldXSkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfTtcblxuICAgIHZhciBDTEFTUyA9IGMzX2NoYXJ0X2ludGVybmFsX2ZuLkNMQVNTID0ge1xuICAgICAgICB0YXJnZXQ6ICdjMy10YXJnZXQnLFxuICAgICAgICBjaGFydDogJ2MzLWNoYXJ0JyxcbiAgICAgICAgY2hhcnRMaW5lOiAnYzMtY2hhcnQtbGluZScsXG4gICAgICAgIGNoYXJ0TGluZXM6ICdjMy1jaGFydC1saW5lcycsXG4gICAgICAgIGNoYXJ0QmFyOiAnYzMtY2hhcnQtYmFyJyxcbiAgICAgICAgY2hhcnRCYXJzOiAnYzMtY2hhcnQtYmFycycsXG4gICAgICAgIGNoYXJ0VGV4dDogJ2MzLWNoYXJ0LXRleHQnLFxuICAgICAgICBjaGFydFRleHRzOiAnYzMtY2hhcnQtdGV4dHMnLFxuICAgICAgICBjaGFydEFyYzogJ2MzLWNoYXJ0LWFyYycsXG4gICAgICAgIGNoYXJ0QXJjczogJ2MzLWNoYXJ0LWFyY3MnLFxuICAgICAgICBjaGFydEFyY3NUaXRsZTogJ2MzLWNoYXJ0LWFyY3MtdGl0bGUnLFxuICAgICAgICBjaGFydEFyY3NCYWNrZ3JvdW5kOiAnYzMtY2hhcnQtYXJjcy1iYWNrZ3JvdW5kJyxcbiAgICAgICAgY2hhcnRBcmNzR2F1Z2VVbml0OiAnYzMtY2hhcnQtYXJjcy1nYXVnZS11bml0JyxcbiAgICAgICAgY2hhcnRBcmNzR2F1Z2VNYXg6ICdjMy1jaGFydC1hcmNzLWdhdWdlLW1heCcsXG4gICAgICAgIGNoYXJ0QXJjc0dhdWdlTWluOiAnYzMtY2hhcnQtYXJjcy1nYXVnZS1taW4nLFxuICAgICAgICBzZWxlY3RlZENpcmNsZTogJ2MzLXNlbGVjdGVkLWNpcmNsZScsXG4gICAgICAgIHNlbGVjdGVkQ2lyY2xlczogJ2MzLXNlbGVjdGVkLWNpcmNsZXMnLFxuICAgICAgICBldmVudFJlY3Q6ICdjMy1ldmVudC1yZWN0JyxcbiAgICAgICAgZXZlbnRSZWN0czogJ2MzLWV2ZW50LXJlY3RzJyxcbiAgICAgICAgZXZlbnRSZWN0c1NpbmdsZTogJ2MzLWV2ZW50LXJlY3RzLXNpbmdsZScsXG4gICAgICAgIGV2ZW50UmVjdHNNdWx0aXBsZTogJ2MzLWV2ZW50LXJlY3RzLW11bHRpcGxlJyxcbiAgICAgICAgem9vbVJlY3Q6ICdjMy16b29tLXJlY3QnLFxuICAgICAgICBicnVzaDogJ2MzLWJydXNoJyxcbiAgICAgICAgZm9jdXNlZDogJ2MzLWZvY3VzZWQnLFxuICAgICAgICBkZWZvY3VzZWQ6ICdjMy1kZWZvY3VzZWQnLFxuICAgICAgICByZWdpb246ICdjMy1yZWdpb24nLFxuICAgICAgICByZWdpb25zOiAnYzMtcmVnaW9ucycsXG4gICAgICAgIHRpdGxlOiAnYzMtdGl0bGUnLFxuICAgICAgICB0b29sdGlwQ29udGFpbmVyOiAnYzMtdG9vbHRpcC1jb250YWluZXInLFxuICAgICAgICB0b29sdGlwOiAnYzMtdG9vbHRpcCcsXG4gICAgICAgIHRvb2x0aXBOYW1lOiAnYzMtdG9vbHRpcC1uYW1lJyxcbiAgICAgICAgc2hhcGU6ICdjMy1zaGFwZScsXG4gICAgICAgIHNoYXBlczogJ2MzLXNoYXBlcycsXG4gICAgICAgIGxpbmU6ICdjMy1saW5lJyxcbiAgICAgICAgbGluZXM6ICdjMy1saW5lcycsXG4gICAgICAgIGJhcjogJ2MzLWJhcicsXG4gICAgICAgIGJhcnM6ICdjMy1iYXJzJyxcbiAgICAgICAgY2lyY2xlOiAnYzMtY2lyY2xlJyxcbiAgICAgICAgY2lyY2xlczogJ2MzLWNpcmNsZXMnLFxuICAgICAgICBhcmM6ICdjMy1hcmMnLFxuICAgICAgICBhcmNzOiAnYzMtYXJjcycsXG4gICAgICAgIGFyZWE6ICdjMy1hcmVhJyxcbiAgICAgICAgYXJlYXM6ICdjMy1hcmVhcycsXG4gICAgICAgIGVtcHR5OiAnYzMtZW1wdHknLFxuICAgICAgICB0ZXh0OiAnYzMtdGV4dCcsXG4gICAgICAgIHRleHRzOiAnYzMtdGV4dHMnLFxuICAgICAgICBnYXVnZVZhbHVlOiAnYzMtZ2F1Z2UtdmFsdWUnLFxuICAgICAgICBncmlkOiAnYzMtZ3JpZCcsXG4gICAgICAgIGdyaWRMaW5lczogJ2MzLWdyaWQtbGluZXMnLFxuICAgICAgICB4Z3JpZDogJ2MzLXhncmlkJyxcbiAgICAgICAgeGdyaWRzOiAnYzMteGdyaWRzJyxcbiAgICAgICAgeGdyaWRMaW5lOiAnYzMteGdyaWQtbGluZScsXG4gICAgICAgIHhncmlkTGluZXM6ICdjMy14Z3JpZC1saW5lcycsXG4gICAgICAgIHhncmlkRm9jdXM6ICdjMy14Z3JpZC1mb2N1cycsXG4gICAgICAgIHlncmlkOiAnYzMteWdyaWQnLFxuICAgICAgICB5Z3JpZHM6ICdjMy15Z3JpZHMnLFxuICAgICAgICB5Z3JpZExpbmU6ICdjMy15Z3JpZC1saW5lJyxcbiAgICAgICAgeWdyaWRMaW5lczogJ2MzLXlncmlkLWxpbmVzJyxcbiAgICAgICAgYXhpczogJ2MzLWF4aXMnLFxuICAgICAgICBheGlzWDogJ2MzLWF4aXMteCcsXG4gICAgICAgIGF4aXNYTGFiZWw6ICdjMy1heGlzLXgtbGFiZWwnLFxuICAgICAgICBheGlzWTogJ2MzLWF4aXMteScsXG4gICAgICAgIGF4aXNZTGFiZWw6ICdjMy1heGlzLXktbGFiZWwnLFxuICAgICAgICBheGlzWTI6ICdjMy1heGlzLXkyJyxcbiAgICAgICAgYXhpc1kyTGFiZWw6ICdjMy1heGlzLXkyLWxhYmVsJyxcbiAgICAgICAgbGVnZW5kQmFja2dyb3VuZDogJ2MzLWxlZ2VuZC1iYWNrZ3JvdW5kJyxcbiAgICAgICAgbGVnZW5kSXRlbTogJ2MzLWxlZ2VuZC1pdGVtJyxcbiAgICAgICAgbGVnZW5kSXRlbUV2ZW50OiAnYzMtbGVnZW5kLWl0ZW0tZXZlbnQnLFxuICAgICAgICBsZWdlbmRJdGVtVGlsZTogJ2MzLWxlZ2VuZC1pdGVtLXRpbGUnLFxuICAgICAgICBsZWdlbmRJdGVtSGlkZGVuOiAnYzMtbGVnZW5kLWl0ZW0taGlkZGVuJyxcbiAgICAgICAgbGVnZW5kSXRlbUZvY3VzZWQ6ICdjMy1sZWdlbmQtaXRlbS1mb2N1c2VkJyxcbiAgICAgICAgZHJhZ2FyZWE6ICdjMy1kcmFnYXJlYScsXG4gICAgICAgIEVYUEFOREVEOiAnX2V4cGFuZGVkXycsXG4gICAgICAgIFNFTEVDVEVEOiAnX3NlbGVjdGVkXycsXG4gICAgICAgIElOQ0xVREVEOiAnX2luY2x1ZGVkXydcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdlbmVyYXRlQ2xhc3MgPSBmdW5jdGlvbiAocHJlZml4LCB0YXJnZXRJZCkge1xuICAgICAgICByZXR1cm4gXCIgXCIgKyBwcmVmaXggKyBcIiBcIiArIHByZWZpeCArIHRoaXMuZ2V0VGFyZ2V0U2VsZWN0b3JTdWZmaXgodGFyZ2V0SWQpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY2xhc3NUZXh0ID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDbGFzcyhDTEFTUy50ZXh0LCBkLmluZGV4KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzVGV4dHMgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUNsYXNzKENMQVNTLnRleHRzLCBkLmlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzU2hhcGUgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUNsYXNzKENMQVNTLnNoYXBlLCBkLmluZGV4KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzU2hhcGVzID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDbGFzcyhDTEFTUy5zaGFwZXMsIGQuaWQpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY2xhc3NMaW5lID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NTaGFwZShkKSArIHRoaXMuZ2VuZXJhdGVDbGFzcyhDTEFTUy5saW5lLCBkLmlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzTGluZXMgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGFzc1NoYXBlcyhkKSArIHRoaXMuZ2VuZXJhdGVDbGFzcyhDTEFTUy5saW5lcywgZC5pZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jbGFzc0NpcmNsZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsYXNzU2hhcGUoZCkgKyB0aGlzLmdlbmVyYXRlQ2xhc3MoQ0xBU1MuY2lyY2xlLCBkLmluZGV4KTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzQ2lyY2xlcyA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsYXNzU2hhcGVzKGQpICsgdGhpcy5nZW5lcmF0ZUNsYXNzKENMQVNTLmNpcmNsZXMsIGQuaWQpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY2xhc3NCYXIgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGFzc1NoYXBlKGQpICsgdGhpcy5nZW5lcmF0ZUNsYXNzKENMQVNTLmJhciwgZC5pbmRleCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jbGFzc0JhcnMgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGFzc1NoYXBlcyhkKSArIHRoaXMuZ2VuZXJhdGVDbGFzcyhDTEFTUy5iYXJzLCBkLmlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzQXJjID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NTaGFwZShkLmRhdGEpICsgdGhpcy5nZW5lcmF0ZUNsYXNzKENMQVNTLmFyYywgZC5kYXRhLmlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzQXJjcyA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsYXNzU2hhcGVzKGQuZGF0YSkgKyB0aGlzLmdlbmVyYXRlQ2xhc3MoQ0xBU1MuYXJjcywgZC5kYXRhLmlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzQXJlYSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsYXNzU2hhcGUoZCkgKyB0aGlzLmdlbmVyYXRlQ2xhc3MoQ0xBU1MuYXJlYSwgZC5pZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jbGFzc0FyZWFzID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NTaGFwZXMoZCkgKyB0aGlzLmdlbmVyYXRlQ2xhc3MoQ0xBU1MuYXJlYXMsIGQuaWQpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY2xhc3NSZWdpb24gPSBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUNsYXNzKENMQVNTLnJlZ2lvbiwgaSkgKyAnICcgKyAoJ2NsYXNzJyBpbiBkID8gZFsnY2xhc3MnXSA6ICcnKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzRXZlbnQgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUNsYXNzKENMQVNTLmV2ZW50UmVjdCwgZC5pbmRleCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jbGFzc1RhcmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICB2YXIgYWRkaXRpb25hbENsYXNzU3VmZml4ID0gJCQuY29uZmlnLmRhdGFfY2xhc3Nlc1tpZF0sIGFkZGl0aW9uYWxDbGFzcyA9ICcnO1xuICAgICAgICBpZiAoYWRkaXRpb25hbENsYXNzU3VmZml4KSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsQ2xhc3MgPSAnICcgKyBDTEFTUy50YXJnZXQgKyAnLScgKyBhZGRpdGlvbmFsQ2xhc3NTdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQkLmdlbmVyYXRlQ2xhc3MoQ0xBU1MudGFyZ2V0LCBpZCkgKyBhZGRpdGlvbmFsQ2xhc3M7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jbGFzc0ZvY3VzID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NGb2N1c2VkKGQpICsgdGhpcy5jbGFzc0RlZm9jdXNlZChkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzRm9jdXNlZCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiAnICcgKyAodGhpcy5mb2N1c2VkVGFyZ2V0SWRzLmluZGV4T2YoZC5pZCkgPj0gMCA/IENMQVNTLmZvY3VzZWQgOiAnJyk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jbGFzc0RlZm9jdXNlZCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiAnICcgKyAodGhpcy5kZWZvY3VzZWRUYXJnZXRJZHMuaW5kZXhPZihkLmlkKSA+PSAwID8gQ0xBU1MuZGVmb2N1c2VkIDogJycpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uY2xhc3NDaGFydFRleHQgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gQ0xBU1MuY2hhcnRUZXh0ICsgdGhpcy5jbGFzc1RhcmdldChkLmlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzQ2hhcnRMaW5lID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIENMQVNTLmNoYXJ0TGluZSArIHRoaXMuY2xhc3NUYXJnZXQoZC5pZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5jbGFzc0NoYXJ0QmFyID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIENMQVNTLmNoYXJ0QmFyICsgdGhpcy5jbGFzc1RhcmdldChkLmlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNsYXNzQ2hhcnRBcmMgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gQ0xBU1MuY2hhcnRBcmMgKyB0aGlzLmNsYXNzVGFyZ2V0KGQuZGF0YS5pZCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5nZXRUYXJnZXRTZWxlY3RvclN1ZmZpeCA9IGZ1bmN0aW9uICh0YXJnZXRJZCkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0SWQgfHwgdGFyZ2V0SWQgPT09IDAgPyAoJy0nICsgdGFyZ2V0SWQpLnJlcGxhY2UoL1tcXHM/IUAjJCVeJiooKV89KywuPD4nXCI6O1xcW1xcXVxcL3x+YHt9XFxcXF0vZywgJy0nKSA6ICcnO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uc2VsZWN0b3JUYXJnZXQgPSBmdW5jdGlvbiAoaWQsIHByZWZpeCkge1xuICAgICAgICByZXR1cm4gKHByZWZpeCB8fCAnJykgKyAnLicgKyBDTEFTUy50YXJnZXQgKyB0aGlzLmdldFRhcmdldFNlbGVjdG9yU3VmZml4KGlkKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnNlbGVjdG9yVGFyZ2V0cyA9IGZ1bmN0aW9uIChpZHMsIHByZWZpeCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICBpZHMgPSBpZHMgfHwgW107XG4gICAgICAgIHJldHVybiBpZHMubGVuZ3RoID8gaWRzLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuICQkLnNlbGVjdG9yVGFyZ2V0KGlkLCBwcmVmaXgpOyB9KSA6IG51bGw7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5zZWxlY3RvckxlZ2VuZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gJy4nICsgQ0xBU1MubGVnZW5kSXRlbSArIHRoaXMuZ2V0VGFyZ2V0U2VsZWN0b3JTdWZmaXgoaWQpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uc2VsZWN0b3JMZWdlbmRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gaWRzICYmIGlkcy5sZW5ndGggPyBpZHMubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gJCQuc2VsZWN0b3JMZWdlbmQoaWQpOyB9KSA6IG51bGw7XG4gICAgfTtcblxuICAgIHZhciBpc1ZhbHVlID0gYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNWYWx1ZSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB2IHx8IHYgPT09IDA7XG4gICAgfSxcbiAgICAgICAgaXNGdW5jdGlvbiA9IGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzRnVuY3Rpb24gPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nO1xuICAgICAgICB9LFxuICAgICAgICBpc1N0cmluZyA9IGMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzU3RyaW5nID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ3N0cmluZyc7XG4gICAgICAgIH0sXG4gICAgICAgIGlzVW5kZWZpbmVkID0gYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNVbmRlZmluZWQgPSBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgfSxcbiAgICAgICAgaXNEZWZpbmVkID0gYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNEZWZpbmVkID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdiAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIH0sXG4gICAgICAgIGNlaWwxMCA9IGMzX2NoYXJ0X2ludGVybmFsX2ZuLmNlaWwxMCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHYgLyAxMCkgKiAxMDtcbiAgICAgICAgfSxcbiAgICAgICAgYXNIYWxmUGl4ZWwgPSBjM19jaGFydF9pbnRlcm5hbF9mbi5hc0hhbGZQaXhlbCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG4pICsgMC41O1xuICAgICAgICB9LFxuICAgICAgICBkaWZmRG9tYWluID0gYzNfY2hhcnRfaW50ZXJuYWxfZm4uZGlmZkRvbWFpbiA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICByZXR1cm4gZFsxXSAtIGRbMF07XG4gICAgICAgIH0sXG4gICAgICAgIGlzRW1wdHkgPSBjM19jaGFydF9pbnRlcm5hbF9mbi5pc0VtcHR5ID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ3VuZGVmaW5lZCcgfHwgbyA9PT0gbnVsbCB8fCAoaXNTdHJpbmcobykgJiYgby5sZW5ndGggPT09IDApIHx8ICh0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobykubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm90RW1wdHkgPSBjM19jaGFydF9pbnRlcm5hbF9mbi5ub3RFbXB0eSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICByZXR1cm4gIWMzX2NoYXJ0X2ludGVybmFsX2ZuLmlzRW1wdHkobyk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldE9wdGlvbiA9IGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldE9wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25zLCBrZXksIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzRGVmaW5lZChvcHRpb25zW2tleV0pID8gb3B0aW9uc1trZXldIDogZGVmYXVsdFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBoYXNWYWx1ZSA9IGMzX2NoYXJ0X2ludGVybmFsX2ZuLmhhc1ZhbHVlID0gZnVuY3Rpb24gKGRpY3QsIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpY3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkaWN0W2tleV0gPT09IHZhbHVlKSB7IGZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNhbml0aXNlID0gYzNfY2hhcnRfaW50ZXJuYWxfZm4uc2FuaXRpc2UgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBzdHIucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKSA6IHN0cjtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UGF0aEJveCA9IGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdldFBhdGhCb3ggPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICAgICAgdmFyIGJveCA9IHBhdGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgaXRlbXMgPSBbcGF0aC5wYXRoU2VnTGlzdC5nZXRJdGVtKDApLCBwYXRoLnBhdGhTZWdMaXN0LmdldEl0ZW0oMSldLFxuICAgICAgICAgICAgICAgIG1pblggPSBpdGVtc1swXS54LCBtaW5ZID0gTWF0aC5taW4oaXRlbXNbMF0ueSwgaXRlbXNbMV0ueSk7XG4gICAgICAgICAgICByZXR1cm4ge3g6IG1pblgsIHk6IG1pblksIHdpZHRoOiBib3gud2lkdGgsIGhlaWdodDogYm94LmhlaWdodH07XG4gICAgICAgIH07XG5cbiAgICBjM19jaGFydF9mbi5mb2N1cyA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbCwgY2FuZGlkYXRlcztcblxuICAgICAgICB0YXJnZXRJZHMgPSAkJC5tYXBUb1RhcmdldElkcyh0YXJnZXRJZHMpO1xuICAgICAgICBjYW5kaWRhdGVzID0gJCQuc3ZnLnNlbGVjdEFsbCgkJC5zZWxlY3RvclRhcmdldHModGFyZ2V0SWRzLmZpbHRlcigkJC5pc1RhcmdldFRvU2hvdywgJCQpKSksXG5cbiAgICAgICAgdGhpcy5yZXZlcnQoKTtcbiAgICAgICAgdGhpcy5kZWZvY3VzKCk7XG4gICAgICAgIGNhbmRpZGF0ZXMuY2xhc3NlZChDTEFTUy5mb2N1c2VkLCB0cnVlKS5jbGFzc2VkKENMQVNTLmRlZm9jdXNlZCwgZmFsc2UpO1xuICAgICAgICBpZiAoJCQuaGFzQXJjVHlwZSgpKSB7XG4gICAgICAgICAgICAkJC5leHBhbmRBcmModGFyZ2V0SWRzKTtcbiAgICAgICAgfVxuICAgICAgICAkJC50b2dnbGVGb2N1c0xlZ2VuZCh0YXJnZXRJZHMsIHRydWUpO1xuXG4gICAgICAgICQkLmZvY3VzZWRUYXJnZXRJZHMgPSB0YXJnZXRJZHM7XG4gICAgICAgICQkLmRlZm9jdXNlZFRhcmdldElkcyA9ICQkLmRlZm9jdXNlZFRhcmdldElkcy5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0SWRzLmluZGV4T2YoaWQpIDwgMDtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLmRlZm9jdXMgPSBmdW5jdGlvbiAodGFyZ2V0SWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGNhbmRpZGF0ZXM7XG5cbiAgICAgICAgdGFyZ2V0SWRzID0gJCQubWFwVG9UYXJnZXRJZHModGFyZ2V0SWRzKTtcbiAgICAgICAgY2FuZGlkYXRlcyA9ICQkLnN2Zy5zZWxlY3RBbGwoJCQuc2VsZWN0b3JUYXJnZXRzKHRhcmdldElkcy5maWx0ZXIoJCQuaXNUYXJnZXRUb1Nob3csICQkKSkpLFxuXG4gICAgICAgIGNhbmRpZGF0ZXMuY2xhc3NlZChDTEFTUy5mb2N1c2VkLCBmYWxzZSkuY2xhc3NlZChDTEFTUy5kZWZvY3VzZWQsIHRydWUpO1xuICAgICAgICBpZiAoJCQuaGFzQXJjVHlwZSgpKSB7XG4gICAgICAgICAgICAkJC51bmV4cGFuZEFyYyh0YXJnZXRJZHMpO1xuICAgICAgICB9XG4gICAgICAgICQkLnRvZ2dsZUZvY3VzTGVnZW5kKHRhcmdldElkcywgZmFsc2UpO1xuXG4gICAgICAgICQkLmZvY3VzZWRUYXJnZXRJZHMgPSAkJC5mb2N1c2VkVGFyZ2V0SWRzLmZpbHRlcihmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRJZHMuaW5kZXhPZihpZCkgPCAwO1xuICAgICAgICB9KTtcbiAgICAgICAgJCQuZGVmb2N1c2VkVGFyZ2V0SWRzID0gdGFyZ2V0SWRzO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi5yZXZlcnQgPSBmdW5jdGlvbiAodGFyZ2V0SWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGNhbmRpZGF0ZXM7XG5cbiAgICAgICAgdGFyZ2V0SWRzID0gJCQubWFwVG9UYXJnZXRJZHModGFyZ2V0SWRzKTtcbiAgICAgICAgY2FuZGlkYXRlcyA9ICQkLnN2Zy5zZWxlY3RBbGwoJCQuc2VsZWN0b3JUYXJnZXRzKHRhcmdldElkcykpOyAvLyBzaG91bGQgYmUgZm9yIGFsbCB0YXJnZXRzXG5cbiAgICAgICAgY2FuZGlkYXRlcy5jbGFzc2VkKENMQVNTLmZvY3VzZWQsIGZhbHNlKS5jbGFzc2VkKENMQVNTLmRlZm9jdXNlZCwgZmFsc2UpO1xuICAgICAgICBpZiAoJCQuaGFzQXJjVHlwZSgpKSB7XG4gICAgICAgICAgICAkJC51bmV4cGFuZEFyYyh0YXJnZXRJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkJC5jb25maWcubGVnZW5kX3Nob3cpIHtcbiAgICAgICAgICAgICQkLnNob3dMZWdlbmQodGFyZ2V0SWRzLmZpbHRlcigkJC5pc0xlZ2VuZFRvU2hvdy5iaW5kKCQkKSkpO1xuICAgICAgICAgICAgJCQubGVnZW5kLnNlbGVjdEFsbCgkJC5zZWxlY3RvckxlZ2VuZHModGFyZ2V0SWRzKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQkLmQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKENMQVNTLmxlZ2VuZEl0ZW1Gb2N1c2VkKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jbGFzc2VkKENMQVNTLmxlZ2VuZEl0ZW1Gb2N1c2VkLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAkJC5mb2N1c2VkVGFyZ2V0SWRzID0gW107XG4gICAgICAgICQkLmRlZm9jdXNlZFRhcmdldElkcyA9IFtdO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi5zaG93ID0gZnVuY3Rpb24gKHRhcmdldElkcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCB0YXJnZXRzO1xuXG4gICAgICAgIHRhcmdldElkcyA9ICQkLm1hcFRvVGFyZ2V0SWRzKHRhcmdldElkcyk7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgICQkLnJlbW92ZUhpZGRlblRhcmdldElkcyh0YXJnZXRJZHMpO1xuICAgICAgICB0YXJnZXRzID0gJCQuc3ZnLnNlbGVjdEFsbCgkJC5zZWxlY3RvclRhcmdldHModGFyZ2V0SWRzKSk7XG5cbiAgICAgICAgdGFyZ2V0cy50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEsICdpbXBvcnRhbnQnKVxuICAgICAgICAgICAgLmNhbGwoJCQuZW5kYWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5zdHlsZSgnb3BhY2l0eScsIG51bGwpLnN0eWxlKCdvcGFjaXR5JywgMSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy53aXRoTGVnZW5kKSB7XG4gICAgICAgICAgICAkJC5zaG93TGVnZW5kKHRhcmdldElkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAkJC5yZWRyYXcoe3dpdGhVcGRhdGVPcmdYRG9tYWluOiB0cnVlLCB3aXRoVXBkYXRlWERvbWFpbjogdHJ1ZSwgd2l0aExlZ2VuZDogdHJ1ZX0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi5oaWRlID0gZnVuY3Rpb24gKHRhcmdldElkcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCB0YXJnZXRzO1xuXG4gICAgICAgIHRhcmdldElkcyA9ICQkLm1hcFRvVGFyZ2V0SWRzKHRhcmdldElkcyk7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgICQkLmFkZEhpZGRlblRhcmdldElkcyh0YXJnZXRJZHMpO1xuICAgICAgICB0YXJnZXRzID0gJCQuc3ZnLnNlbGVjdEFsbCgkJC5zZWxlY3RvclRhcmdldHModGFyZ2V0SWRzKSk7XG5cbiAgICAgICAgdGFyZ2V0cy50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAsICdpbXBvcnRhbnQnKVxuICAgICAgICAgICAgLmNhbGwoJCQuZW5kYWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5zdHlsZSgnb3BhY2l0eScsIG51bGwpLnN0eWxlKCdvcGFjaXR5JywgMCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy53aXRoTGVnZW5kKSB7XG4gICAgICAgICAgICAkJC5oaWRlTGVnZW5kKHRhcmdldElkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAkJC5yZWRyYXcoe3dpdGhVcGRhdGVPcmdYRG9tYWluOiB0cnVlLCB3aXRoVXBkYXRlWERvbWFpbjogdHJ1ZSwgd2l0aExlZ2VuZDogdHJ1ZX0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi50b2dnbGUgPSBmdW5jdGlvbiAodGFyZ2V0SWRzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcywgJCQgPSB0aGlzLmludGVybmFsO1xuICAgICAgICAkJC5tYXBUb1RhcmdldElkcyh0YXJnZXRJZHMpLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldElkKSB7XG4gICAgICAgICAgICAkJC5pc1RhcmdldFRvU2hvdyh0YXJnZXRJZCkgPyB0aGF0LmhpZGUodGFyZ2V0SWQsIG9wdGlvbnMpIDogdGhhdC5zaG93KHRhcmdldElkLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLnpvb20gPSBmdW5jdGlvbiAoZG9tYWluKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgIGlmICgkJC5pc1RpbWVTZXJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGRvbWFpbiA9IGRvbWFpbi5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuICQkLnBhcnNlRGF0ZSh4KTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkJC5icnVzaC5leHRlbnQoZG9tYWluKTtcbiAgICAgICAgICAgICQkLnJlZHJhdyh7d2l0aFVwZGF0ZVhEb21haW46IHRydWUsIHdpdGhZOiAkJC5jb25maWcuem9vbV9yZXNjYWxlfSk7XG4gICAgICAgICAgICAkJC5jb25maWcuem9vbV9vbnpvb20uY2FsbCh0aGlzLCAkJC54Lm9yZ0RvbWFpbigpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJCQuYnJ1c2guZXh0ZW50KCk7XG4gICAgfTtcbiAgICBjM19jaGFydF9mbi56b29tLmVuYWJsZSA9IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgICQkLmNvbmZpZy56b29tX2VuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgICAkJC51cGRhdGVBbmRSZWRyYXcoKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ZuLnVuem9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbDtcbiAgICAgICAgJCQuYnJ1c2guY2xlYXIoKS51cGRhdGUoKTtcbiAgICAgICAgJCQucmVkcmF3KHt3aXRoVXBkYXRlWERvbWFpbjogdHJ1ZX0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi56b29tLm1heCA9IGZ1bmN0aW9uIChtYXgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbCwgY29uZmlnID0gJCQuY29uZmlnLCBkMyA9ICQkLmQzO1xuICAgICAgICBpZiAobWF4ID09PSAwIHx8IG1heCkge1xuICAgICAgICAgICAgY29uZmlnLnpvb21feF9tYXggPSBkMy5tYXgoWyQkLm9yZ1hEb21haW5bMV0sIG1heF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy56b29tX3hfbWF4O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLnpvb20ubWluID0gZnVuY3Rpb24gKG1pbikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCBjb25maWcgPSAkJC5jb25maWcsIGQzID0gJCQuZDM7XG4gICAgICAgIGlmIChtaW4gPT09IDAgfHwgbWluKSB7XG4gICAgICAgICAgICBjb25maWcuem9vbV94X21pbiA9IGQzLm1pbihbJCQub3JnWERvbWFpblswXSwgbWluXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnLnpvb21feF9taW47XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4uem9vbS5yYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChyYW5nZS5tYXgpKSB7IHRoaXMuZG9tYWluLm1heChyYW5nZS5tYXgpOyB9XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHJhbmdlLm1pbikpIHsgdGhpcy5kb21haW4ubWluKHJhbmdlLm1pbik7IH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF4OiB0aGlzLmRvbWFpbi5tYXgoKSxcbiAgICAgICAgICAgICAgICBtaW46IHRoaXMuZG9tYWluLm1pbigpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLmxvYWQgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIC8vIHVwZGF0ZSB4cyBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKGFyZ3MueHMpIHtcbiAgICAgICAgICAgICQkLmFkZFhzKGFyZ3MueHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBuYW1lcyBpZiBleGlzdHNcbiAgICAgICAgaWYgKCduYW1lcycgaW4gYXJncykge1xuICAgICAgICAgICAgYzNfY2hhcnRfZm4uZGF0YS5uYW1lcy5iaW5kKHRoaXMpKGFyZ3MubmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBjbGFzc2VzIGlmIGV4aXN0c1xuICAgICAgICBpZiAoJ2NsYXNzZXMnIGluIGFyZ3MpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3MuY2xhc3NlcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuZGF0YV9jbGFzc2VzW2lkXSA9IGFyZ3MuY2xhc3Nlc1tpZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgY2F0ZWdvcmllcyBpZiBleGlzdHNcbiAgICAgICAgaWYgKCdjYXRlZ29yaWVzJyBpbiBhcmdzICYmICQkLmlzQ2F0ZWdvcml6ZWQoKSkge1xuICAgICAgICAgICAgY29uZmlnLmF4aXNfeF9jYXRlZ29yaWVzID0gYXJncy5jYXRlZ29yaWVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBheGVzIGlmIGV4aXN0c1xuICAgICAgICBpZiAoJ2F4ZXMnIGluIGFyZ3MpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3MuYXhlcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuZGF0YV9heGVzW2lkXSA9IGFyZ3MuYXhlc1tpZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgY29sb3JzIGlmIGV4aXN0c1xuICAgICAgICBpZiAoJ2NvbG9ycycgaW4gYXJncykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYXJncy5jb2xvcnMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmRhdGFfY29sb3JzW2lkXSA9IGFyZ3MuY29sb3JzW2lkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZSBjYWNoZSBpZiBleGlzdHNcbiAgICAgICAgaWYgKCdjYWNoZUlkcycgaW4gYXJncyAmJiAkJC5oYXNDYWNoZXMoYXJncy5jYWNoZUlkcykpIHtcbiAgICAgICAgICAgICQkLmxvYWQoJCQuZ2V0Q2FjaGVzKGFyZ3MuY2FjaGVJZHMpLCBhcmdzLmRvbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVubG9hZCBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCd1bmxvYWQnIGluIGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGRvIG5vdCB1bmxvYWQgaWYgdGFyZ2V0IHdpbGwgbG9hZCAoaW5jbHVkZWQgaW4gdXJsL3Jvd3MvY29sdW1ucylcbiAgICAgICAgICAgICQkLnVubG9hZCgkJC5tYXBUb1RhcmdldElkcygodHlwZW9mIGFyZ3MudW5sb2FkID09PSAnYm9vbGVhbicgJiYgYXJncy51bmxvYWQpID8gbnVsbCA6IGFyZ3MudW5sb2FkKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQkLmxvYWRGcm9tQXJncyhhcmdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCQubG9hZEZyb21BcmdzKGFyZ3MpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLnVubG9hZCA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBhcmdzID0ge2lkczogYXJnc307XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhcmdzID0ge2lkczogW2FyZ3NdfTtcbiAgICAgICAgfVxuICAgICAgICAkJC51bmxvYWQoJCQubWFwVG9UYXJnZXRJZHMoYXJncy5pZHMpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkJC5yZWRyYXcoe3dpdGhVcGRhdGVPcmdYRG9tYWluOiB0cnVlLCB3aXRoVXBkYXRlWERvbWFpbjogdHJ1ZSwgd2l0aExlZ2VuZDogdHJ1ZX0pO1xuICAgICAgICAgICAgaWYgKGFyZ3MuZG9uZSkgeyBhcmdzLmRvbmUoKTsgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4uZmxvdyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsXG4gICAgICAgICAgICB0YXJnZXRzLCBkYXRhLCBub3Rmb3VuZElkcyA9IFtdLCBvcmdEYXRhQ291bnQgPSAkJC5nZXRNYXhEYXRhQ291bnQoKSxcbiAgICAgICAgICAgIGRhdGFDb3VudCwgZG9tYWluLCBiYXNlVGFyZ2V0LCBiYXNlVmFsdWUsIGxlbmd0aCA9IDAsIHRhaWwgPSAwLCBkaWZmLCB0bztcblxuICAgICAgICBpZiAoYXJncy5qc29uKSB7XG4gICAgICAgICAgICBkYXRhID0gJCQuY29udmVydEpzb25Ub0RhdGEoYXJncy5qc29uLCBhcmdzLmtleXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3Mucm93cykge1xuICAgICAgICAgICAgZGF0YSA9ICQkLmNvbnZlcnRSb3dzVG9EYXRhKGFyZ3Mucm93cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJncy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBkYXRhID0gJCQuY29udmVydENvbHVtbnNUb0RhdGEoYXJncy5jb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRzID0gJCQuY29udmVydERhdGFUb1RhcmdldHMoZGF0YSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlL0FkZCBkYXRhXG4gICAgICAgICQkLmRhdGEudGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZSwgaSwgajtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHQuaWQgPT09IHRhcmdldHNbaV0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0LnZhbHVlc1t0LnZhbHVlcy5sZW5ndGggLSAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCA9IHQudmFsdWVzW3QudmFsdWVzLmxlbmd0aCAtIDFdLmluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSB0YXJnZXRzW2ldLnZhbHVlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW2ldLnZhbHVlc1tqXS5pbmRleCA9IHRhaWwgKyBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkJC5pc1RpbWVTZXJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHNbaV0udmFsdWVzW2pdLnggPSB0YWlsICsgajtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0LnZhbHVlcyA9IHQudmFsdWVzLmNvbmNhdCh0YXJnZXRzW2ldLnZhbHVlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpIHsgbm90Zm91bmRJZHMucHVzaCh0LmlkKTsgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBcHBlbmQgbnVsbCBmb3Igbm90IGZvdW5kIHRhcmdldHNcbiAgICAgICAgJCQuZGF0YS50YXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHZhciBpLCBqO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vdGZvdW5kSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHQuaWQgPT09IG5vdGZvdW5kSWRzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhaWwgPSB0LnZhbHVlc1t0LnZhbHVlcy5sZW5ndGggLSAxXS5pbmRleCArIDE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdC52YWx1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRhaWwgKyBqLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6ICQkLmlzVGltZVNlcmllcygpID8gJCQuZ2V0T3RoZXJUYXJnZXRYKHRhaWwgKyBqKSA6IHRhaWwgKyBqLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgbnVsbCB2YWx1ZXMgZm9yIG5ldyB0YXJnZXRcbiAgICAgICAgaWYgKCQkLmRhdGEudGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBtaXNzaW5nID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChpID0gJCQuZGF0YS50YXJnZXRzWzBdLnZhbHVlc1swXS5pbmRleDsgaSA8IHRhaWw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6ICQkLmlzVGltZVNlcmllcygpID8gJCQuZ2V0T3RoZXJUYXJnZXRYKGkpIDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0LnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIHYuaW5kZXggKz0gdGFpbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkJC5pc1RpbWVTZXJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdi54ICs9IHRhaWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0LnZhbHVlcyA9IG1pc3NpbmcuY29uY2F0KHQudmFsdWVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgICQkLmRhdGEudGFyZ2V0cyA9ICQkLmRhdGEudGFyZ2V0cy5jb25jYXQodGFyZ2V0cyk7IC8vIGFkZCByZW1haW5lZFxuXG4gICAgICAgIC8vIGNoZWNrIGRhdGEgY291bnQgYmVjYXVzZSBiZWhhdmlvciBuZWVkcyB0byBjaGFuZ2Ugd2hlbiBpdCdzIG9ubHkgb25lXG4gICAgICAgIGRhdGFDb3VudCA9ICQkLmdldE1heERhdGFDb3VudCgpO1xuICAgICAgICBiYXNlVGFyZ2V0ID0gJCQuZGF0YS50YXJnZXRzWzBdO1xuICAgICAgICBiYXNlVmFsdWUgPSBiYXNlVGFyZ2V0LnZhbHVlc1swXTtcblxuICAgICAgICAvLyBVcGRhdGUgbGVuZ3RoIHRvIGZsb3cgaWYgbmVlZGVkXG4gICAgICAgIGlmIChpc0RlZmluZWQoYXJncy50bykpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IDA7XG4gICAgICAgICAgICB0byA9ICQkLmlzVGltZVNlcmllcygpID8gJCQucGFyc2VEYXRlKGFyZ3MudG8pIDogYXJncy50bztcbiAgICAgICAgICAgIGJhc2VUYXJnZXQudmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAodi54IDwgdG8pIHsgbGVuZ3RoKys7IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChhcmdzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb25seSBvbmUgZGF0YSwgdXBkYXRlIHRoZSBkb21haW4gdG8gZmxvdyBmcm9tIGxlZnQgZWRnZSBvZiB0aGUgY2hhcnRcbiAgICAgICAgaWYgKCFvcmdEYXRhQ291bnQpIHtcbiAgICAgICAgICAgIGlmICgkJC5pc1RpbWVTZXJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChiYXNlVGFyZ2V0LnZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPSBiYXNlVGFyZ2V0LnZhbHVlc1tiYXNlVGFyZ2V0LnZhbHVlcy5sZW5ndGggLSAxXS54IC0gYmFzZVZhbHVlLng7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGlmZiA9IGJhc2VWYWx1ZS54IC0gJCQuZ2V0WERvbWFpbigkJC5kYXRhLnRhcmdldHMpWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlmZiA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb21haW4gPSBbYmFzZVZhbHVlLnggLSBkaWZmLCBiYXNlVmFsdWUueF07XG4gICAgICAgICAgICAkJC51cGRhdGVYRG9tYWluKG51bGwsIHRydWUsIHRydWUsIGZhbHNlLCBkb21haW4pO1xuICAgICAgICB9IGVsc2UgaWYgKG9yZ0RhdGFDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKCQkLmlzVGltZVNlcmllcygpKSB7XG4gICAgICAgICAgICAgICAgZGlmZiA9IChiYXNlVGFyZ2V0LnZhbHVlc1tiYXNlVGFyZ2V0LnZhbHVlcy5sZW5ndGggLSAxXS54IC0gYmFzZVZhbHVlLngpIC8gMjtcbiAgICAgICAgICAgICAgICBkb21haW4gPSBbbmV3IERhdGUoK2Jhc2VWYWx1ZS54IC0gZGlmZiksIG5ldyBEYXRlKCtiYXNlVmFsdWUueCArIGRpZmYpXTtcbiAgICAgICAgICAgICAgICAkJC51cGRhdGVYRG9tYWluKG51bGwsIHRydWUsIHRydWUsIGZhbHNlLCBkb21haW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRhcmdldHNcbiAgICAgICAgJCQudXBkYXRlVGFyZ2V0cygkJC5kYXRhLnRhcmdldHMpO1xuXG4gICAgICAgIC8vIFJlZHJhdyB3aXRoIG5ldyB0YXJnZXRzXG4gICAgICAgICQkLnJlZHJhdyh7XG4gICAgICAgICAgICBmbG93OiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGJhc2VWYWx1ZS5pbmRleCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogaXNWYWx1ZShhcmdzLmR1cmF0aW9uKSA/IGFyZ3MuZHVyYXRpb24gOiAkJC5jb25maWcudHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgICAgICAgICAgICAgICBkb25lOiBhcmdzLmRvbmUsXG4gICAgICAgICAgICAgICAgb3JnRGF0YUNvdW50OiBvcmdEYXRhQ291bnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2l0aExlZ2VuZDogdHJ1ZSxcbiAgICAgICAgICAgIHdpdGhUcmFuc2l0aW9uOiBvcmdEYXRhQ291bnQgPiAxLFxuICAgICAgICAgICAgd2l0aFRyaW1YRG9tYWluOiBmYWxzZSxcbiAgICAgICAgICAgIHdpdGhVcGRhdGVYQXhpczogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLmdlbmVyYXRlRmxvdyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMsIGNvbmZpZyA9ICQkLmNvbmZpZywgZDMgPSAkJC5kMztcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldHMgPSBhcmdzLnRhcmdldHMsXG4gICAgICAgICAgICAgICAgZmxvdyA9IGFyZ3MuZmxvdyxcbiAgICAgICAgICAgICAgICBkcmF3QmFyID0gYXJncy5kcmF3QmFyLFxuICAgICAgICAgICAgICAgIGRyYXdMaW5lID0gYXJncy5kcmF3TGluZSxcbiAgICAgICAgICAgICAgICBkcmF3QXJlYSA9IGFyZ3MuZHJhd0FyZWEsXG4gICAgICAgICAgICAgICAgY3ggPSBhcmdzLmN4LFxuICAgICAgICAgICAgICAgIGN5ID0gYXJncy5jeSxcbiAgICAgICAgICAgICAgICB4diA9IGFyZ3MueHYsXG4gICAgICAgICAgICAgICAgeEZvclRleHQgPSBhcmdzLnhGb3JUZXh0LFxuICAgICAgICAgICAgICAgIHlGb3JUZXh0ID0gYXJncy55Rm9yVGV4dCxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGFyZ3MuZHVyYXRpb247XG5cbiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVYLCBzY2FsZVggPSAxLCB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgZmxvd0luZGV4ID0gZmxvdy5pbmRleCxcbiAgICAgICAgICAgICAgICBmbG93TGVuZ3RoID0gZmxvdy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgZmxvd1N0YXJ0ID0gJCQuZ2V0VmFsdWVPbkluZGV4KCQkLmRhdGEudGFyZ2V0c1swXS52YWx1ZXMsIGZsb3dJbmRleCksXG4gICAgICAgICAgICAgICAgZmxvd0VuZCA9ICQkLmdldFZhbHVlT25JbmRleCgkJC5kYXRhLnRhcmdldHNbMF0udmFsdWVzLCBmbG93SW5kZXggKyBmbG93TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICBvcmdEb21haW4gPSAkJC54LmRvbWFpbigpLCBkb21haW4sXG4gICAgICAgICAgICAgICAgZHVyYXRpb25Gb3JGbG93ID0gZmxvdy5kdXJhdGlvbiB8fCBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICBkb25lID0gZmxvdy5kb25lIHx8IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgICAgICAgIHdhaXQgPSAkJC5nZW5lcmF0ZVdhaXQoKTtcblxuICAgICAgICAgICAgdmFyIHhncmlkID0gJCQueGdyaWQgfHwgZDMuc2VsZWN0QWxsKFtdKSxcbiAgICAgICAgICAgICAgICB4Z3JpZExpbmVzID0gJCQueGdyaWRMaW5lcyB8fCBkMy5zZWxlY3RBbGwoW10pLFxuICAgICAgICAgICAgICAgIG1haW5SZWdpb24gPSAkJC5tYWluUmVnaW9uIHx8IGQzLnNlbGVjdEFsbChbXSksXG4gICAgICAgICAgICAgICAgbWFpblRleHQgPSAkJC5tYWluVGV4dCB8fCBkMy5zZWxlY3RBbGwoW10pLFxuICAgICAgICAgICAgICAgIG1haW5CYXIgPSAkJC5tYWluQmFyIHx8IGQzLnNlbGVjdEFsbChbXSksXG4gICAgICAgICAgICAgICAgbWFpbkxpbmUgPSAkJC5tYWluTGluZSB8fCBkMy5zZWxlY3RBbGwoW10pLFxuICAgICAgICAgICAgICAgIG1haW5BcmVhID0gJCQubWFpbkFyZWEgfHwgZDMuc2VsZWN0QWxsKFtdKSxcbiAgICAgICAgICAgICAgICBtYWluQ2lyY2xlID0gJCQubWFpbkNpcmNsZSB8fCBkMy5zZWxlY3RBbGwoW10pO1xuXG4gICAgICAgICAgICAvLyBzZXQgZmxhZ1xuICAgICAgICAgICAgJCQuZmxvd2luZyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBoZWFkIGRhdGEgYWZ0ZXIgcmVuZGVyZWRcbiAgICAgICAgICAgICQkLmRhdGEudGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgZC52YWx1ZXMuc3BsaWNlKDAsIGZsb3dMZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB4IGRvbWFpbiB0byBnZW5lcmF0ZSBheGlzIGVsZW1lbnRzIGZvciBmbG93XG4gICAgICAgICAgICBkb21haW4gPSAkJC51cGRhdGVYRG9tYWluKHRhcmdldHMsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgLy8gdXBkYXRlIGVsZW1lbnRzIHJlbGF0ZWQgdG8geCBzY2FsZVxuICAgICAgICAgICAgaWYgKCQkLnVwZGF0ZVhHcmlkKSB7ICQkLnVwZGF0ZVhHcmlkKHRydWUpOyB9XG5cbiAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRyYW5zZm9ybSB0byBmbG93XG4gICAgICAgICAgICBpZiAoIWZsb3cub3JnRGF0YUNvdW50KSB7IC8vIGlmIGVtcHR5XG4gICAgICAgICAgICAgICAgaWYgKCQkLmRhdGEudGFyZ2V0c1swXS52YWx1ZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVggPSAkJC54KG9yZ0RvbWFpblswXSkgLSAkJC54KGRvbWFpblswXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCQkLmlzVGltZVNlcmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbG93U3RhcnQgPSAkJC5nZXRWYWx1ZU9uSW5kZXgoJCQuZGF0YS50YXJnZXRzWzBdLnZhbHVlcywgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbG93RW5kID0gJCQuZ2V0VmFsdWVPbkluZGV4KCQkLmRhdGEudGFyZ2V0c1swXS52YWx1ZXMsICQkLmRhdGEudGFyZ2V0c1swXS52YWx1ZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVYID0gJCQueChmbG93U3RhcnQueCkgLSAkJC54KGZsb3dFbmQueCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVYID0gZGlmZkRvbWFpbihkb21haW4pIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxvdy5vcmdEYXRhQ291bnQgPT09IDEgfHwgKGZsb3dTdGFydCAmJiBmbG93U3RhcnQueCkgPT09IChmbG93RW5kICYmIGZsb3dFbmQueCkpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVYID0gJCQueChvcmdEb21haW5bMF0pIC0gJCQueChkb21haW5bMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoJCQuaXNUaW1lU2VyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlWCA9ICgkJC54KG9yZ0RvbWFpblswXSkgLSAkJC54KGRvbWFpblswXSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVggPSAoJCQueChmbG93U3RhcnQueCkgLSAkJC54KGZsb3dFbmQueCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjYWxlWCA9IChkaWZmRG9tYWluKG9yZ0RvbWFpbikgLyBkaWZmRG9tYWluKGRvbWFpbikpO1xuICAgICAgICAgICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgdHJhbnNsYXRlWCArICcsMCkgc2NhbGUoJyArIHNjYWxlWCArICcsMSknO1xuXG4gICAgICAgICAgICAkJC5oaWRlWEdyaWRGb2N1cygpO1xuXG4gICAgICAgICAgICBkMy50cmFuc2l0aW9uKCkuZWFzZSgnbGluZWFyJykuZHVyYXRpb24oZHVyYXRpb25Gb3JGbG93KS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB3YWl0LmFkZCgkJC5heGVzLngudHJhbnNpdGlvbigpLmNhbGwoJCQueEF4aXMpKTtcbiAgICAgICAgICAgICAgICB3YWl0LmFkZChtYWluQmFyLnRyYW5zaXRpb24oKS5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pKTtcbiAgICAgICAgICAgICAgICB3YWl0LmFkZChtYWluTGluZS50cmFuc2l0aW9uKCkuYXR0cigndHJhbnNmb3JtJywgdHJhbnNmb3JtKSk7XG4gICAgICAgICAgICAgICAgd2FpdC5hZGQobWFpbkFyZWEudHJhbnNpdGlvbigpLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSkpO1xuICAgICAgICAgICAgICAgIHdhaXQuYWRkKG1haW5DaXJjbGUudHJhbnNpdGlvbigpLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSkpO1xuICAgICAgICAgICAgICAgIHdhaXQuYWRkKG1haW5UZXh0LnRyYW5zaXRpb24oKS5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pKTtcbiAgICAgICAgICAgICAgICB3YWl0LmFkZChtYWluUmVnaW9uLmZpbHRlcigkJC5pc1JlZ2lvbk9uWCkudHJhbnNpdGlvbigpLmF0dHIoJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSkpO1xuICAgICAgICAgICAgICAgIHdhaXQuYWRkKHhncmlkLnRyYW5zaXRpb24oKS5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pKTtcbiAgICAgICAgICAgICAgICB3YWl0LmFkZCh4Z3JpZExpbmVzLnRyYW5zaXRpb24oKS5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2FsbCh3YWl0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIHNoYXBlcyA9IFtdLCB0ZXh0cyA9IFtdLCBldmVudFJlY3RzID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZmxvd2VkIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgaWYgKGZsb3dMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsb3dMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVzLnB1c2goJy4nICsgQ0xBU1Muc2hhcGUgKyAnLScgKyAoZmxvd0luZGV4ICsgaSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHMucHVzaCgnLicgKyBDTEFTUy50ZXh0ICsgJy0nICsgKGZsb3dJbmRleCArIGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50UmVjdHMucHVzaCgnLicgKyBDTEFTUy5ldmVudFJlY3QgKyAnLScgKyAoZmxvd0luZGV4ICsgaSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQkLnN2Zy5zZWxlY3RBbGwoJy4nICsgQ0xBU1Muc2hhcGVzKS5zZWxlY3RBbGwoc2hhcGVzKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgJCQuc3ZnLnNlbGVjdEFsbCgnLicgKyBDTEFTUy50ZXh0cykuc2VsZWN0QWxsKHRleHRzKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgJCQuc3ZnLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5ldmVudFJlY3RzKS5zZWxlY3RBbGwoZXZlbnRSZWN0cykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICQkLnN2Zy5zZWxlY3QoJy4nICsgQ0xBU1MueGdyaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGRyYXcgYWdhaW4gZm9yIHJlbW92aW5nIGZsb3dlZCBlbGVtZW50cyBhbmQgcmV2ZXJ0aW5nIGF0dHJcbiAgICAgICAgICAgICAgICB4Z3JpZFxuICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgbnVsbClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJCQueGdyaWRBdHRyKTtcbiAgICAgICAgICAgICAgICB4Z3JpZExpbmVzXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKTtcbiAgICAgICAgICAgICAgICB4Z3JpZExpbmVzLnNlbGVjdCgnbGluZScpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKFwieDFcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/IDAgOiB4dilcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJ4MlwiLCBjb25maWcuYXhpc19yb3RhdGVkID8gJCQud2lkdGggOiB4dik7XG4gICAgICAgICAgICAgICAgeGdyaWRMaW5lcy5zZWxlY3QoJ3RleHQnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cihcInhcIiwgY29uZmlnLmF4aXNfcm90YXRlZCA/ICQkLndpZHRoIDogMClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJ5XCIsIHh2KTtcbiAgICAgICAgICAgICAgICBtYWluQmFyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cihcImRcIiwgZHJhd0Jhcik7XG4gICAgICAgICAgICAgICAgbWFpbkxpbmVcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKFwiZFwiLCBkcmF3TGluZSk7XG4gICAgICAgICAgICAgICAgbWFpbkFyZWFcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKFwiZFwiLCBkcmF3QXJlYSk7XG4gICAgICAgICAgICAgICAgbWFpbkNpcmNsZVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgbnVsbClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJjeFwiLCBjeClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJjeVwiLCBjeSk7XG4gICAgICAgICAgICAgICAgbWFpblRleHRcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgeEZvclRleHQpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgeUZvclRleHQpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbC1vcGFjaXR5JywgJCQub3BhY2l0eUZvclRleHQuYmluZCgkJCkpO1xuICAgICAgICAgICAgICAgIG1haW5SZWdpb25cbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpO1xuICAgICAgICAgICAgICAgIG1haW5SZWdpb24uc2VsZWN0KCdyZWN0JykuZmlsdGVyKCQkLmlzUmVnaW9uT25YKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cihcInhcIiwgJCQucmVnaW9uWC5iaW5kKCQkKSlcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCAkJC5yZWdpb25XaWR0aC5iaW5kKCQkKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmludGVyYWN0aW9uX2VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgJCQucmVkcmF3RXZlbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgZm9yIGVuZCBvZiBmbG93XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICAgICAgJCQuZmxvd2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLnNlbGVjdGVkID0gZnVuY3Rpb24gKHRhcmdldElkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGQzID0gJCQuZDM7XG4gICAgICAgIHJldHVybiBkMy5tZXJnZShcbiAgICAgICAgICAgICQkLm1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlcyArICQkLmdldFRhcmdldFNlbGVjdG9yU3VmZml4KHRhcmdldElkKSkuc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoQ0xBU1MuU0VMRUNURUQpOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQubWFwKGZ1bmN0aW9uIChkKSB7IHZhciBkYXRhID0gZC5fX2RhdGFfXzsgcmV0dXJuIGRhdGEuZGF0YSA/IGRhdGEuZGF0YSA6IGRhdGE7IH0pOyB9KVxuICAgICAgICApO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4uc2VsZWN0ID0gZnVuY3Rpb24gKGlkcywgaW5kaWNlcywgcmVzZXRPdGhlcikge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCBkMyA9ICQkLmQzLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIGlmICghIGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9lbmFibGVkKSB7IHJldHVybjsgfVxuICAgICAgICAkJC5tYWluLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5zaGFwZXMpLnNlbGVjdEFsbCgnLicgKyBDTEFTUy5zaGFwZSkuZWFjaChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgICAgdmFyIHNoYXBlID0gZDMuc2VsZWN0KHRoaXMpLCBpZCA9IGQuZGF0YSA/IGQuZGF0YS5pZCA6IGQuaWQsXG4gICAgICAgICAgICAgICAgdG9nZ2xlID0gJCQuZ2V0VG9nZ2xlKHRoaXMsIGQpLmJpbmQoJCQpLFxuICAgICAgICAgICAgICAgIGlzVGFyZ2V0SWQgPSBjb25maWcuZGF0YV9zZWxlY3Rpb25fZ3JvdXBlZCB8fCAhaWRzIHx8IGlkcy5pbmRleE9mKGlkKSA+PSAwLFxuICAgICAgICAgICAgICAgIGlzVGFyZ2V0SW5kZXggPSAhaW5kaWNlcyB8fCBpbmRpY2VzLmluZGV4T2YoaSkgPj0gMCxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkID0gc2hhcGUuY2xhc3NlZChDTEFTUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgICAvLyBsaW5lL2FyZWEgc2VsZWN0aW9uIG5vdCBzdXBwb3J0ZWQgeWV0XG4gICAgICAgICAgICBpZiAoc2hhcGUuY2xhc3NlZChDTEFTUy5saW5lKSB8fCBzaGFwZS5jbGFzc2VkKENMQVNTLmFyZWEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzVGFyZ2V0SWQgJiYgaXNUYXJnZXRJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZGF0YV9zZWxlY3Rpb25faXNzZWxlY3RhYmxlKGQpICYmICFpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZSh0cnVlLCBzaGFwZS5jbGFzc2VkKENMQVNTLlNFTEVDVEVELCB0cnVlKSwgZCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RlZmluZWQocmVzZXRPdGhlcikgJiYgcmVzZXRPdGhlcikge1xuICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZShmYWxzZSwgc2hhcGUuY2xhc3NlZChDTEFTUy5TRUxFQ1RFRCwgZmFsc2UpLCBkLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4udW5zZWxlY3QgPSBmdW5jdGlvbiAoaWRzLCBpbmRpY2VzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGQzID0gJCQuZDMsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKCEgY29uZmlnLmRhdGFfc2VsZWN0aW9uX2VuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICQkLm1haW4uc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlcykuc2VsZWN0QWxsKCcuJyArIENMQVNTLnNoYXBlKS5lYWNoKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgICAgICB2YXIgc2hhcGUgPSBkMy5zZWxlY3QodGhpcyksIGlkID0gZC5kYXRhID8gZC5kYXRhLmlkIDogZC5pZCxcbiAgICAgICAgICAgICAgICB0b2dnbGUgPSAkJC5nZXRUb2dnbGUodGhpcywgZCkuYmluZCgkJCksXG4gICAgICAgICAgICAgICAgaXNUYXJnZXRJZCA9IGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9ncm91cGVkIHx8ICFpZHMgfHwgaWRzLmluZGV4T2YoaWQpID49IDAsXG4gICAgICAgICAgICAgICAgaXNUYXJnZXRJbmRleCA9ICFpbmRpY2VzIHx8IGluZGljZXMuaW5kZXhPZihpKSA+PSAwLFxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQgPSBzaGFwZS5jbGFzc2VkKENMQVNTLlNFTEVDVEVEKTtcbiAgICAgICAgICAgIC8vIGxpbmUvYXJlYSBzZWxlY3Rpb24gbm90IHN1cHBvcnRlZCB5ZXRcbiAgICAgICAgICAgIGlmIChzaGFwZS5jbGFzc2VkKENMQVNTLmxpbmUpIHx8IHNoYXBlLmNsYXNzZWQoQ0xBU1MuYXJlYSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNUYXJnZXRJZCAmJiBpc1RhcmdldEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5kYXRhX3NlbGVjdGlvbl9pc3NlbGVjdGFibGUoZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZShmYWxzZSwgc2hhcGUuY2xhc3NlZChDTEFTUy5TRUxFQ1RFRCwgZmFsc2UpLCBkLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh0eXBlLCB0YXJnZXRJZHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBbJ3BpZScsICdkb251dCddLmluZGV4T2YodHlwZSkgPj0gMCA/IHt3aXRoVHJhbnNmb3JtOiB0cnVlfSA6IG51bGw7XG4gICAgICAgICQkLnRyYW5zZm9ybVRvKHRhcmdldElkcywgdHlwZSwgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ludGVybmFsX2ZuLnRyYW5zZm9ybVRvID0gZnVuY3Rpb24gKHRhcmdldElkcywgdHlwZSwgb3B0aW9uc0ZvclJlZHJhdykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLFxuICAgICAgICAgICAgd2l0aFRyYW5zaXRpb25Gb3JBeGlzID0gISQkLmhhc0FyY1R5cGUoKSxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zRm9yUmVkcmF3IHx8IHt3aXRoVHJhbnNpdGlvbkZvckF4aXM6IHdpdGhUcmFuc2l0aW9uRm9yQXhpc307XG4gICAgICAgIG9wdGlvbnMud2l0aFRyYW5zaXRpb25Gb3JUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgICAgICAgJCQudHJhbnNpdGluZyA9IGZhbHNlO1xuICAgICAgICAkJC5zZXRUYXJnZXRUeXBlKHRhcmdldElkcywgdHlwZSk7XG4gICAgICAgICQkLnVwZGF0ZVRhcmdldHMoJCQuZGF0YS50YXJnZXRzKTsgLy8gdGhpcyBpcyBuZWVkZWQgd2hlbiB0cmFuc2Zvcm1pbmcgdG8gYXJjXG4gICAgICAgICQkLnVwZGF0ZUFuZFJlZHJhdyhvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4uZ3JvdXBzID0gZnVuY3Rpb24gKGdyb3Vwcykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChncm91cHMpKSB7IHJldHVybiBjb25maWcuZGF0YV9ncm91cHM7IH1cbiAgICAgICAgY29uZmlnLmRhdGFfZ3JvdXBzID0gZ3JvdXBzO1xuICAgICAgICAkJC5yZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5kYXRhX2dyb3VwcztcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4ueGdyaWRzID0gZnVuY3Rpb24gKGdyaWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKCEgZ3JpZHMpIHsgcmV0dXJuIGNvbmZpZy5ncmlkX3hfbGluZXM7IH1cbiAgICAgICAgY29uZmlnLmdyaWRfeF9saW5lcyA9IGdyaWRzO1xuICAgICAgICAkJC5yZWRyYXdXaXRob3V0UmVzY2FsZSgpO1xuICAgICAgICByZXR1cm4gY29uZmlnLmdyaWRfeF9saW5lcztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ZuLnhncmlkcy5hZGQgPSBmdW5jdGlvbiAoZ3JpZHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbDtcbiAgICAgICAgcmV0dXJuIHRoaXMueGdyaWRzKCQkLmNvbmZpZy5ncmlkX3hfbGluZXMuY29uY2F0KGdyaWRzID8gZ3JpZHMgOiBbXSkpO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4ueGdyaWRzLnJlbW92ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHsgLy8gVE9ETzogbXVsdGlwbGVcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbDtcbiAgICAgICAgJCQucmVtb3ZlR3JpZExpbmVzKHBhcmFtcywgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLnlncmlkcyA9IGZ1bmN0aW9uIChncmlkcykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIGlmICghIGdyaWRzKSB7IHJldHVybiBjb25maWcuZ3JpZF95X2xpbmVzOyB9XG4gICAgICAgIGNvbmZpZy5ncmlkX3lfbGluZXMgPSBncmlkcztcbiAgICAgICAgJCQucmVkcmF3V2l0aG91dFJlc2NhbGUoKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5ncmlkX3lfbGluZXM7XG4gICAgfTtcbiAgICBjM19jaGFydF9mbi55Z3JpZHMuYWRkID0gZnVuY3Rpb24gKGdyaWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgIHJldHVybiB0aGlzLnlncmlkcygkJC5jb25maWcuZ3JpZF95X2xpbmVzLmNvbmNhdChncmlkcyA/IGdyaWRzIDogW10pKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ZuLnlncmlkcy5yZW1vdmUgPSBmdW5jdGlvbiAocGFyYW1zKSB7IC8vIFRPRE86IG11bHRpcGxlXG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgICQkLnJlbW92ZUdyaWRMaW5lcyhwYXJhbXMsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4ucmVnaW9ucyA9IGZ1bmN0aW9uIChyZWdpb25zKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKCFyZWdpb25zKSB7IHJldHVybiBjb25maWcucmVnaW9uczsgfVxuICAgICAgICBjb25maWcucmVnaW9ucyA9IHJlZ2lvbnM7XG4gICAgICAgICQkLnJlZHJhd1dpdGhvdXRSZXNjYWxlKCk7XG4gICAgICAgIHJldHVybiBjb25maWcucmVnaW9ucztcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ZuLnJlZ2lvbnMuYWRkID0gZnVuY3Rpb24gKHJlZ2lvbnMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbCwgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICBpZiAoIXJlZ2lvbnMpIHsgcmV0dXJuIGNvbmZpZy5yZWdpb25zOyB9XG4gICAgICAgIGNvbmZpZy5yZWdpb25zID0gY29uZmlnLnJlZ2lvbnMuY29uY2F0KHJlZ2lvbnMpO1xuICAgICAgICAkJC5yZWRyYXdXaXRob3V0UmVzY2FsZSgpO1xuICAgICAgICByZXR1cm4gY29uZmlnLnJlZ2lvbnM7XG4gICAgfTtcbiAgICBjM19jaGFydF9mbi5yZWdpb25zLnJlbW92ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGNvbmZpZyA9ICQkLmNvbmZpZyxcbiAgICAgICAgICAgIGR1cmF0aW9uLCBjbGFzc2VzLCByZWdpb25zO1xuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBkdXJhdGlvbiA9ICQkLmdldE9wdGlvbihvcHRpb25zLCBcImR1cmF0aW9uXCIsIGNvbmZpZy50cmFuc2l0aW9uX2R1cmF0aW9uKTtcbiAgICAgICAgY2xhc3NlcyA9ICQkLmdldE9wdGlvbihvcHRpb25zLCBcImNsYXNzZXNcIiwgW0NMQVNTLnJlZ2lvbl0pO1xuXG4gICAgICAgIHJlZ2lvbnMgPSAkJC5tYWluLnNlbGVjdCgnLicgKyBDTEFTUy5yZWdpb25zKS5zZWxlY3RBbGwoY2xhc3Nlcy5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuICcuJyArIGM7IH0pKTtcbiAgICAgICAgKGR1cmF0aW9uID8gcmVnaW9ucy50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pIDogcmVnaW9ucylcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG5cbiAgICAgICAgY29uZmlnLnJlZ2lvbnMgPSBjb25maWcucmVnaW9ucy5maWx0ZXIoZnVuY3Rpb24gKHJlZ2lvbikge1xuICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXJlZ2lvblsnY2xhc3MnXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVnaW9uWydjbGFzcyddLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzLmluZGV4T2YoYykgPj0gMCkgeyBmb3VuZCA9IHRydWU7IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuICFmb3VuZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZy5yZWdpb25zO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi5kYXRhID0gZnVuY3Rpb24gKHRhcmdldElkcykge1xuICAgICAgICB2YXIgdGFyZ2V0cyA9IHRoaXMuaW50ZXJuYWwuZGF0YS50YXJnZXRzO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRhcmdldElkcyA9PT0gJ3VuZGVmaW5lZCcgPyB0YXJnZXRzIDogdGFyZ2V0cy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQodGFyZ2V0SWRzKS5pbmRleE9mKHQuaWQpID49IDA7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4uZGF0YS5zaG93biA9IGZ1bmN0aW9uICh0YXJnZXRJZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWwuZmlsdGVyVGFyZ2V0c1RvU2hvdyh0aGlzLmRhdGEodGFyZ2V0SWRzKSk7XG4gICAgfTtcbiAgICBjM19jaGFydF9mbi5kYXRhLnZhbHVlcyA9IGZ1bmN0aW9uICh0YXJnZXRJZCkge1xuICAgICAgICB2YXIgdGFyZ2V0cywgdmFsdWVzID0gbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldElkKSB7XG4gICAgICAgICAgICB0YXJnZXRzID0gdGhpcy5kYXRhKHRhcmdldElkKTtcbiAgICAgICAgICAgIHZhbHVlcyA9IHRhcmdldHNbMF0gPyB0YXJnZXRzWzBdLnZhbHVlcy5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQudmFsdWU7IH0pIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4uZGF0YS5uYW1lcyA9IGZ1bmN0aW9uIChuYW1lcykge1xuICAgICAgICB0aGlzLmludGVybmFsLmNsZWFyTGVnZW5kSXRlbVRleHRCb3hDYWNoZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbC51cGRhdGVEYXRhQXR0cmlidXRlcygnbmFtZXMnLCBuYW1lcyk7XG4gICAgfTtcbiAgICBjM19jaGFydF9mbi5kYXRhLmNvbG9ycyA9IGZ1bmN0aW9uIChjb2xvcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWwudXBkYXRlRGF0YUF0dHJpYnV0ZXMoJ2NvbG9ycycsIGNvbG9ycyk7XG4gICAgfTtcbiAgICBjM19jaGFydF9mbi5kYXRhLmF4ZXMgPSBmdW5jdGlvbiAoYXhlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbC51cGRhdGVEYXRhQXR0cmlidXRlcygnYXhlcycsIGF4ZXMpO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi5jYXRlZ29yeSA9IGZ1bmN0aW9uIChpLCBjYXRlZ29yeSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uZmlnLmF4aXNfeF9jYXRlZ29yaWVzW2ldID0gY2F0ZWdvcnk7XG4gICAgICAgICAgICAkJC5yZWRyYXcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uZmlnLmF4aXNfeF9jYXRlZ29yaWVzW2ldO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4uY2F0ZWdvcmllcyA9IGZ1bmN0aW9uIChjYXRlZ29yaWVzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7IHJldHVybiBjb25maWcuYXhpc194X2NhdGVnb3JpZXM7IH1cbiAgICAgICAgY29uZmlnLmF4aXNfeF9jYXRlZ29yaWVzID0gY2F0ZWdvcmllcztcbiAgICAgICAgJCQucmVkcmF3KCk7XG4gICAgICAgIHJldHVybiBjb25maWcuYXhpc194X2NhdGVnb3JpZXM7XG4gICAgfTtcblxuICAgIC8vIFRPRE86IGZpeFxuICAgIGMzX2NoYXJ0X2ZuLmNvbG9yID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgIHJldHVybiAkJC5jb2xvcihpZCk7IC8vIG1vcmUgcGF0dGVybnNcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4ueCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAkJC51cGRhdGVUYXJnZXRYKCQkLmRhdGEudGFyZ2V0cywgeCk7XG4gICAgICAgICAgICAkJC5yZWRyYXcoe3dpdGhVcGRhdGVPcmdYRG9tYWluOiB0cnVlLCB3aXRoVXBkYXRlWERvbWFpbjogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkJC5kYXRhLnhzO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4ueHMgPSBmdW5jdGlvbiAoeHMpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbDtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICQkLnVwZGF0ZVRhcmdldFhzKCQkLmRhdGEudGFyZ2V0cywgeHMpO1xuICAgICAgICAgICAgJCQucmVkcmF3KHt3aXRoVXBkYXRlT3JnWERvbWFpbjogdHJ1ZSwgd2l0aFVwZGF0ZVhEb21haW46IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJCQuZGF0YS54cztcbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4uYXhpcyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIGMzX2NoYXJ0X2ZuLmF4aXMubGFiZWxzID0gZnVuY3Rpb24gKGxhYmVscykge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobGFiZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChheGlzSWQpIHtcbiAgICAgICAgICAgICAgICAkJC5heGlzLnNldExhYmVsVGV4dChheGlzSWQsIGxhYmVsc1theGlzSWRdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJCQuYXhpcy51cGRhdGVMYWJlbHMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiByZXR1cm4gc29tZSB2YWx1ZXM/XG4gICAgfTtcbiAgICBjM19jaGFydF9mbi5heGlzLm1heCA9IGZ1bmN0aW9uIChtYXgpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbCwgY29uZmlnID0gJCQuY29uZmlnO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXggPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVmFsdWUobWF4LngpKSB7IGNvbmZpZy5heGlzX3hfbWF4ID0gbWF4Lng7IH1cbiAgICAgICAgICAgICAgICBpZiAoaXNWYWx1ZShtYXgueSkpIHsgY29uZmlnLmF4aXNfeV9tYXggPSBtYXgueTsgfVxuICAgICAgICAgICAgICAgIGlmIChpc1ZhbHVlKG1heC55MikpIHsgY29uZmlnLmF4aXNfeTJfbWF4ID0gbWF4LnkyOyB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5heGlzX3lfbWF4ID0gY29uZmlnLmF4aXNfeTJfbWF4ID0gbWF4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCQucmVkcmF3KHt3aXRoVXBkYXRlT3JnWERvbWFpbjogdHJ1ZSwgd2l0aFVwZGF0ZVhEb21haW46IHRydWV9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogY29uZmlnLmF4aXNfeF9tYXgsXG4gICAgICAgICAgICAgICAgeTogY29uZmlnLmF4aXNfeV9tYXgsXG4gICAgICAgICAgICAgICAgeTI6IGNvbmZpZy5heGlzX3kyX21heFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgYzNfY2hhcnRfZm4uYXhpcy5taW4gPSBmdW5jdGlvbiAobWluKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWwsIGNvbmZpZyA9ICQkLmNvbmZpZztcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWluID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChpc1ZhbHVlKG1pbi54KSkgeyBjb25maWcuYXhpc194X21pbiA9IG1pbi54OyB9XG4gICAgICAgICAgICAgICAgaWYgKGlzVmFsdWUobWluLnkpKSB7IGNvbmZpZy5heGlzX3lfbWluID0gbWluLnk7IH1cbiAgICAgICAgICAgICAgICBpZiAoaXNWYWx1ZShtaW4ueTIpKSB7IGNvbmZpZy5heGlzX3kyX21pbiA9IG1pbi55MjsgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25maWcuYXhpc195X21pbiA9IGNvbmZpZy5heGlzX3kyX21pbiA9IG1pbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQkLnJlZHJhdyh7d2l0aFVwZGF0ZU9yZ1hEb21haW46IHRydWUsIHdpdGhVcGRhdGVYRG9tYWluOiB0cnVlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IGNvbmZpZy5heGlzX3hfbWluLFxuICAgICAgICAgICAgICAgIHk6IGNvbmZpZy5heGlzX3lfbWluLFxuICAgICAgICAgICAgICAgIHkyOiBjb25maWcuYXhpc195Ml9taW5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ZuLmF4aXMucmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQocmFuZ2UubWF4KSkgeyB0aGlzLmF4aXMubWF4KHJhbmdlLm1heCk7IH1cbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQocmFuZ2UubWluKSkgeyB0aGlzLmF4aXMubWluKHJhbmdlLm1pbik7IH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF4OiB0aGlzLmF4aXMubWF4KCksXG4gICAgICAgICAgICAgICAgbWluOiB0aGlzLmF4aXMubWluKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYzNfY2hhcnRfZm4ubGVnZW5kID0gZnVuY3Rpb24gKCkge307XG4gICAgYzNfY2hhcnRfZm4ubGVnZW5kLnNob3cgPSBmdW5jdGlvbiAodGFyZ2V0SWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgICQkLnNob3dMZWdlbmQoJCQubWFwVG9UYXJnZXRJZHModGFyZ2V0SWRzKSk7XG4gICAgICAgICQkLnVwZGF0ZUFuZFJlZHJhdyh7d2l0aExlZ2VuZDogdHJ1ZX0pO1xuICAgIH07XG4gICAgYzNfY2hhcnRfZm4ubGVnZW5kLmhpZGUgPSBmdW5jdGlvbiAodGFyZ2V0SWRzKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG4gICAgICAgICQkLmhpZGVMZWdlbmQoJCQubWFwVG9UYXJnZXRJZHModGFyZ2V0SWRzKSk7XG4gICAgICAgICQkLnVwZGF0ZUFuZFJlZHJhdyh7d2l0aExlZ2VuZDogdHJ1ZX0pO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi5yZXNpemUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsLCBjb25maWcgPSAkJC5jb25maWc7XG4gICAgICAgIGNvbmZpZy5zaXplX3dpZHRoID0gc2l6ZSA/IHNpemUud2lkdGggOiBudWxsO1xuICAgICAgICBjb25maWcuc2l6ZV9oZWlnaHQgPSBzaXplID8gc2l6ZS5oZWlnaHQgOiBudWxsO1xuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJCQgPSB0aGlzLmludGVybmFsO1xuICAgICAgICAkJC51cGRhdGVBbmRSZWRyYXcoe3dpdGhMZWdlbmQ6IHRydWUsIHdpdGhUcmFuc2l0aW9uOiBmYWxzZSwgd2l0aFRyYW5zaXRpb25Gb3JUcmFuc2Zvcm06IGZhbHNlfSk7XG4gICAgfTtcblxuICAgIGMzX2NoYXJ0X2ZuLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkJCA9IHRoaXMuaW50ZXJuYWw7XG5cbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoJCQuaW50ZXJ2YWxGb3JPYnNlcnZlSW5zZXJ0ZWQpO1xuXG4gICAgICAgIGlmICgkJC5yZXNpemVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoJCQucmVzaXplVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2luZG93LmRldGFjaEV2ZW50KSB7XG4gICAgICAgICAgICB3aW5kb3cuZGV0YWNoRXZlbnQoJ29ucmVzaXplJywgJCQucmVzaXplRnVuY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgJCQucmVzaXplRnVuY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSB3aW5kb3cub25yZXNpemU7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBubyBvbmUgZWxzZSByZW1vdmVkIG91ciB3cmFwcGVyIGFuZCByZW1vdmUgb3VyIHJlc2l6ZUZ1bmN0aW9uIGZyb20gaXRcbiAgICAgICAgICAgIGlmICh3cmFwcGVyICYmIHdyYXBwZXIuYWRkICYmIHdyYXBwZXIucmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5yZW1vdmUoJCQucmVzaXplRnVuY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJCQuc2VsZWN0Q2hhcnQuY2xhc3NlZCgnYzMnLCBmYWxzZSkuaHRtbChcIlwiKTtcblxuICAgICAgICAvLyBNRU1POiB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSByZWZlcmVuY2Ugb2Ygc29tZSBlbGVtZW50cyB3aWxsIG5vdCBiZSByZWxlYXNlZCwgdGhlbiBtZW1vcnkgbGVhayB3aWxsIGhhcHBlbi5cbiAgICAgICAgT2JqZWN0LmtleXMoJCQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgJCRba2V5XSA9IG51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBjM19jaGFydF9mbi50b29sdGlwID0gZnVuY3Rpb24gKCkge307XG4gICAgYzNfY2hhcnRfZm4udG9vbHRpcC5zaG93ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyICQkID0gdGhpcy5pbnRlcm5hbCwgaW5kZXgsIG1vdXNlO1xuXG4gICAgICAgIC8vIGRldGVybWluZSBtb3VzZSBwb3NpdGlvbiBvbiB0aGUgY2hhcnRcbiAgICAgICAgaWYgKGFyZ3MubW91c2UpIHtcbiAgICAgICAgICAgIG1vdXNlID0gYXJncy5tb3VzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRldGVybWluZSBmb2N1cyBkYXRhXG4gICAgICAgIGlmIChhcmdzLmRhdGEpIHtcbiAgICAgICAgICAgIGlmICgkJC5pc011bHRpcGxlWCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbXVsdGlwbGUgeHMsIHRhcmdldCBwb2ludCB3aWxsIGJlIGRldGVybWluZWQgYnkgbW91c2VcbiAgICAgICAgICAgICAgICBtb3VzZSA9IFskJC54KGFyZ3MuZGF0YS54KSwgJCQuZ2V0WVNjYWxlKGFyZ3MuZGF0YS5pZCkoYXJncy5kYXRhLnZhbHVlKV07XG4gICAgICAgICAgICAgICAgaW5kZXggPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGVuIHRvb2x0aXBfZ3JvdXBlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpc1ZhbHVlKGFyZ3MuZGF0YS5pbmRleCkgPyBhcmdzLmRhdGEuaW5kZXggOiAkJC5nZXRJbmRleEJ5WChhcmdzLmRhdGEueCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGFyZ3MueCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGluZGV4ID0gJCQuZ2V0SW5kZXhCeVgoYXJncy54KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJncy5pbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGluZGV4ID0gYXJncy5pbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtdWxhdGUgbW91c2UgZXZlbnRzIHRvIHNob3dcbiAgICAgICAgJCQuZGlzcGF0Y2hFdmVudCgnbW91c2VvdmVyJywgaW5kZXgsIG1vdXNlKTtcbiAgICAgICAgJCQuZGlzcGF0Y2hFdmVudCgnbW91c2Vtb3ZlJywgaW5kZXgsIG1vdXNlKTtcblxuICAgICAgICAkJC5jb25maWcudG9vbHRpcF9vbnNob3cuY2FsbCgkJCwgYXJncy5kYXRhKTtcbiAgICB9O1xuICAgIGMzX2NoYXJ0X2ZuLnRvb2x0aXAuaGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVE9ETzogZ2V0IHRhcmdldCBkYXRhIGJ5IGNoZWNraW5nIHRoZSBzdGF0ZSBvZiBmb2N1c1xuICAgICAgICB0aGlzLmludGVybmFsLmRpc3BhdGNoRXZlbnQoJ21vdXNlb3V0JywgMCk7XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbC5jb25maWcudG9vbHRpcF9vbmhpZGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgLy8gRmVhdHVyZXM6XG4gICAgLy8gMS4gY2F0ZWdvcnkgYXhpc1xuICAgIC8vIDIuIGNlaWwgdmFsdWVzIG9mIHRyYW5zbGF0ZS94L3kgdG8gaW50IGZvciBoYWxmIHBpeGVsIGFudGlhbGlhc2luZ1xuICAgIC8vIDMuIG11bHRpbGluZSB0aWNrIHRleHRcbiAgICB2YXIgdGlja1RleHRDaGFyU2l6ZTtcbiAgICBmdW5jdGlvbiBjM19heGlzKGQzLCBwYXJhbXMpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gZDMuc2NhbGUubGluZWFyKCksIG9yaWVudCA9IFwiYm90dG9tXCIsIGlubmVyVGlja1NpemUgPSA2LCBvdXRlclRpY2tTaXplLCB0aWNrUGFkZGluZyA9IDMsIHRpY2tWYWx1ZXMgPSBudWxsLCB0aWNrRm9ybWF0LCB0aWNrQXJndW1lbnRzO1xuXG4gICAgICAgIHZhciB0aWNrT2Zmc2V0ID0gMCwgdGlja0N1bGxpbmcgPSB0cnVlLCB0aWNrQ2VudGVyZWQ7XG5cbiAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICBvdXRlclRpY2tTaXplID0gcGFyYW1zLndpdGhPdXRlclRpY2sgPyA2IDogMDtcblxuICAgICAgICBmdW5jdGlvbiBheGlzWChzZWxlY3Rpb24sIHgpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgTWF0aC5jZWlsKHgoZCkgKyB0aWNrT2Zmc2V0KSArIFwiLCAwKVwiO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXhpc1koc2VsZWN0aW9uLCB5KSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24uYXR0cihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcInRyYW5zbGF0ZSgwLFwiICsgTWF0aC5jZWlsKHkoZCkpICsgXCIpXCI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzY2FsZUV4dGVudChkb21haW4pIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICByZXR1cm4gc3RhcnQgPCBzdG9wID8gWyBzdGFydCwgc3RvcCBdIDogWyBzdG9wLCBzdGFydCBdO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGlja3Moc2NhbGUpIHtcbiAgICAgICAgICAgIHZhciBpLCBkb21haW4sIHRpY2tzID0gW107XG4gICAgICAgICAgICBpZiAoc2NhbGUudGlja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGUudGlja3MuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluKCk7XG4gICAgICAgICAgICBmb3IgKGkgPSBNYXRoLmNlaWwoZG9tYWluWzBdKTsgaSA8IGRvbWFpblsxXTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGlja3MucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aWNrcy5sZW5ndGggPiAwICYmIHRpY2tzWzBdID4gMCkge1xuICAgICAgICAgICAgICAgIHRpY2tzLnVuc2hpZnQodGlja3NbMF0gLSAodGlja3NbMV0gLSB0aWNrc1swXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRpY2tzO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNvcHlTY2FsZSgpIHtcbiAgICAgICAgICAgIHZhciBuZXdTY2FsZSA9IHNjYWxlLmNvcHkoKSwgZG9tYWluO1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5pc0NhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluKCk7XG4gICAgICAgICAgICAgICAgbmV3U2NhbGUuZG9tYWluKFtkb21haW5bMF0sIGRvbWFpblsxXSAtIDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdTY2FsZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB0ZXh0Rm9ybWF0dGVkKHYpIHtcbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWQgPSB0aWNrRm9ybWF0ID8gdGlja0Zvcm1hdCh2KSA6IHY7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGZvcm1hdHRlZCAhPT0gJ3VuZGVmaW5lZCcgPyBmb3JtYXR0ZWQgOiAnJztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBnZXRTaXplRm9yMUNoYXIodGljaykge1xuICAgICAgICAgICAgaWYgKHRpY2tUZXh0Q2hhclNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGlja1RleHRDaGFyU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzaXplID0ge1xuICAgICAgICAgICAgICAgIGg6IDExLjUsXG4gICAgICAgICAgICAgICAgdzogNS41XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGljay5zZWxlY3QoJ3RleHQnKS50ZXh0KHRleHRGb3JtYXR0ZWQpLmVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYm94ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRGb3JtYXR0ZWQoZCksXG4gICAgICAgICAgICAgICAgICAgIGggPSBib3guaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3ID0gdGV4dCA/IChib3gud2lkdGggLyB0ZXh0Lmxlbmd0aCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGggJiYgdykge1xuICAgICAgICAgICAgICAgICAgICBzaXplLmggPSBoO1xuICAgICAgICAgICAgICAgICAgICBzaXplLncgPSB3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRleHQoJycpO1xuICAgICAgICAgICAgdGlja1RleHRDaGFyU2l6ZSA9IHNpemU7XG4gICAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB0cmFuc2l0aW9uaXNlKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy53aXRob3V0VHJhbnNpdGlvbiA/IHNlbGVjdGlvbiA6IGQzLnRyYW5zaXRpb24oc2VsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBheGlzKGcpIHtcbiAgICAgICAgICAgIGcuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGcgPSBheGlzLmcgPSBkMy5zZWxlY3QodGhpcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgc2NhbGUwID0gdGhpcy5fX2NoYXJ0X18gfHwgc2NhbGUsIHNjYWxlMSA9IHRoaXMuX19jaGFydF9fID0gY29weVNjYWxlKCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgdGlja3MgPSB0aWNrVmFsdWVzID8gdGlja1ZhbHVlcyA6IGdlbmVyYXRlVGlja3Moc2NhbGUxKSxcbiAgICAgICAgICAgICAgICAgICAgdGljayA9IGcuc2VsZWN0QWxsKFwiLnRpY2tcIikuZGF0YSh0aWNrcywgc2NhbGUxKSxcbiAgICAgICAgICAgICAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmluc2VydChcImdcIiwgXCIuZG9tYWluXCIpLmF0dHIoXCJjbGFzc1wiLCBcInRpY2tcIikuc3R5bGUoXCJvcGFjaXR5XCIsIDFlLTYpLFxuICAgICAgICAgICAgICAgICAgICAvLyBNRU1POiBObyBleGl0IHRyYW5zaXRpb24uIFRoZSByZWFzb24gaXMgdGhpcyB0cmFuc2l0aW9uIGFmZmVjdHMgbWF4IHRpY2sgd2lkdGggY2FsY3VsYXRpb24gYmVjYXVzZSBvbGQgdGljayB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB0aWNrcy5cbiAgICAgICAgICAgICAgICAgICAgdGlja0V4aXQgPSB0aWNrLmV4aXQoKS5yZW1vdmUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGlja1VwZGF0ZSA9IHRyYW5zaXRpb25pc2UodGljaykuc3R5bGUoXCJvcGFjaXR5XCIsIDEpLFxuICAgICAgICAgICAgICAgICAgICB0aWNrVHJhbnNmb3JtLCB0aWNrWCwgdGlja1k7XG5cbiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzY2FsZS5yYW5nZUV4dGVudCA/IHNjYWxlLnJhbmdlRXh0ZW50KCkgOiBzY2FsZUV4dGVudChzY2FsZS5yYW5nZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGcuc2VsZWN0QWxsKFwiLmRvbWFpblwiKS5kYXRhKFsgMCBdKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aFVwZGF0ZSA9IChwYXRoLmVudGVyKCkuYXBwZW5kKFwicGF0aFwiKS5hdHRyKFwiY2xhc3NcIiwgXCJkb21haW5cIiksIHRyYW5zaXRpb25pc2UocGF0aCkpO1xuICAgICAgICAgICAgICAgIHRpY2tFbnRlci5hcHBlbmQoXCJsaW5lXCIpO1xuICAgICAgICAgICAgICAgIHRpY2tFbnRlci5hcHBlbmQoXCJ0ZXh0XCIpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmVFbnRlciA9IHRpY2tFbnRlci5zZWxlY3QoXCJsaW5lXCIpLFxuICAgICAgICAgICAgICAgICAgICBsaW5lVXBkYXRlID0gdGlja1VwZGF0ZS5zZWxlY3QoXCJsaW5lXCIpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0RW50ZXIgPSB0aWNrRW50ZXIuc2VsZWN0KFwidGV4dFwiKSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dFVwZGF0ZSA9IHRpY2tVcGRhdGUuc2VsZWN0KFwidGV4dFwiKTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuaXNDYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrT2Zmc2V0ID0gTWF0aC5jZWlsKChzY2FsZTEoMSkgLSBzY2FsZTEoMCkpIC8gMik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2tYID0gdGlja0NlbnRlcmVkID8gMCA6IHRpY2tPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRpY2tZID0gdGlja0NlbnRlcmVkID8gdGlja09mZnNldCA6IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGlja09mZnNldCA9IHRpY2tYID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgdGV4dCwgdHNwYW4sIHNpemVGb3IxQ2hhciA9IGdldFNpemVGb3IxQ2hhcihnLnNlbGVjdCgnLnRpY2snKSksIGNvdW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciB0aWNrTGVuZ3RoID0gTWF0aC5tYXgoaW5uZXJUaWNrU2l6ZSwgMCkgKyB0aWNrUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IG9yaWVudCA9PT0gJ2xlZnQnIHx8IG9yaWVudCA9PT0gJ3JpZ2h0JztcblxuICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gY2F0ZWdvcnkgYXhpc1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNwbGl0VGlja1RleHQoZCwgbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpY2tUZXh0ID0gdGV4dEZvcm1hdHRlZChkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRleHQsIHNwYWNlSW5kZXgsIHRleHRXaWR0aCwgc3BsaXR0ZWQgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRpY2tUZXh0KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlja1RleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1heFdpZHRoIHx8IG1heFdpZHRoIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gaXNWZXJ0aWNhbCA/IDk1IDogcGFyYW1zLmlzQ2F0ZWdvcnkgPyAoTWF0aC5jZWlsKHNjYWxlMSh0aWNrc1sxXSkgLSBzY2FsZTEodGlja3NbMF0pKSAtIDEyKSA6IDExMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNwbGl0KHNwbGl0dGVkLCB0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRleHQgPSB0ZXh0LnN1YnN0cigwLCBpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFdpZHRoID0gc2l6ZUZvcjFDaGFyLncgKiBzdWJ0ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0ZXh0IHdpZHRoIGdldHMgb3ZlciB0aWNrIHdpZHRoLCBzcGxpdCBieSBzcGFjZSBpbmRleCBvciBjcnJlbnQgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4V2lkdGggPCB0ZXh0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR0ZWQuY29uY2F0KHRleHQuc3Vic3RyKDAsIHNwYWNlSW5kZXggPyBzcGFjZUluZGV4IDogaSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zbGljZShzcGFjZUluZGV4ID8gc3BhY2VJbmRleCArIDEgOiBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcGxpdHRlZC5jb25jYXQodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXQoc3BsaXR0ZWQsIHRpY2tUZXh0ICsgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gdHNwYW5EeShkLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkeSA9IHNpemVGb3IxQ2hhci5oO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudCA9PT0gJ2xlZnQnIHx8IG9yaWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5ID0gLSgoY291bnRzW2QuaW5kZXhdIC0gMSkgKiAoc2l6ZUZvcjFDaGFyLmggLyAyKSAtIDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeSA9IFwiLjcxZW1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gdGlja1NpemUoZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGlja1Bvc2l0aW9uID0gc2NhbGUoZCkgKyAodGlja0NlbnRlcmVkID8gMCA6IHRpY2tPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VbMF0gPCB0aWNrUG9zaXRpb24gJiYgdGlja1Bvc2l0aW9uIDwgcmFuZ2VbMV0gPyBpbm5lclRpY2tTaXplIDogMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGljay5zZWxlY3QoXCJ0ZXh0XCIpO1xuICAgICAgICAgICAgICAgIHRzcGFuID0gdGV4dC5zZWxlY3RBbGwoJ3RzcGFuJylcbiAgICAgICAgICAgICAgICAgICAgLmRhdGEoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcGxpdHRlZCA9IHBhcmFtcy50aWNrTXVsdGlsaW5lID8gc3BsaXRUaWNrVGV4dChkLCBwYXJhbXMudGlja1dpZHRoKSA6IFtdLmNvbmNhdCh0ZXh0Rm9ybWF0dGVkKGQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpXSA9IHNwbGl0dGVkLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcGxpdHRlZC5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBpbmRleDogaSwgc3BsaXR0ZWQ6IHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0c3Bhbi5lbnRlcigpLmFwcGVuZCgndHNwYW4nKTtcbiAgICAgICAgICAgICAgICB0c3Bhbi5leGl0KCkucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgdHNwYW4udGV4dChmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5zcGxpdHRlZDsgfSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgcm90YXRlID0gcGFyYW1zLnRpY2tUZXh0Um90YXRlO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gdGV4dEFuY2hvckZvclRleHQocm90YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcm90YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ21pZGRsZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZSA+IDAgPyBcInN0YXJ0XCIgOiBcImVuZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0ZXh0VHJhbnNmb3JtKHJvdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInJvdGF0ZShcIiArIHJvdGF0ZSArIFwiKVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkeEZvclRleHQocm90YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcm90YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gOCAqIE1hdGguc2luKE1hdGguUEkgKiAocm90YXRlIC8gMTgwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHlGb3JUZXh0KHJvdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpY2tMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDExLjUgLSAyLjUgKiAocm90YXRlIC8gMTUpICogKHJvdGF0ZSA+IDAgPyAxIDogLTEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN3aXRjaCAob3JpZW50KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gYXhpc1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW50ZXIuYXR0cihcInkyXCIsIGlubmVyVGlja1NpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVudGVyLmF0dHIoXCJ5XCIsIHRpY2tMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVVwZGF0ZS5hdHRyKFwieDFcIiwgdGlja1gpLmF0dHIoXCJ4MlwiLCB0aWNrWCkuYXR0cihcInkyXCIsIHRpY2tTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRVcGRhdGUuYXR0cihcInhcIiwgMCkuYXR0cihcInlcIiwgeUZvclRleHQocm90YXRlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoXCJ0ZXh0LWFuY2hvclwiLCB0ZXh0QW5jaG9yRm9yVGV4dChyb3RhdGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIHRleHRUcmFuc2Zvcm0ocm90YXRlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0c3Bhbi5hdHRyKCd4JywgMCkuYXR0cihcImR5XCIsIHRzcGFuRHkpLmF0dHIoJ2R4JywgZHhGb3JUZXh0KHJvdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKFwiZFwiLCBcIk1cIiArIHJhbmdlWzBdICsgXCIsXCIgKyBvdXRlclRpY2tTaXplICsgXCJWMEhcIiArIHJhbmdlWzFdICsgXCJWXCIgKyBvdXRlclRpY2tTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByb3RhdGVkIHRpY2sgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGF4aXNYO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVudGVyLmF0dHIoXCJ5MlwiLCAtaW5uZXJUaWNrU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW50ZXIuYXR0cihcInlcIiwgLXRpY2tMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVVwZGF0ZS5hdHRyKFwieDJcIiwgMCkuYXR0cihcInkyXCIsIC1pbm5lclRpY2tTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRVcGRhdGUuYXR0cihcInhcIiwgMCkuYXR0cihcInlcIiwgLXRpY2tMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zdHlsZShcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHNwYW4uYXR0cigneCcsIDApLmF0dHIoXCJkeVwiLCBcIjBlbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cihcImRcIiwgXCJNXCIgKyByYW5nZVswXSArIFwiLFwiICsgLW91dGVyVGlja1NpemUgKyBcIlYwSFwiICsgcmFuZ2VbMV0gKyBcIlZcIiArIC1vdXRlclRpY2tTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGF4aXNZO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVudGVyLmF0dHIoXCJ4MlwiLCAtaW5uZXJUaWNrU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW50ZXIuYXR0cihcInhcIiwgLXRpY2tMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVVwZGF0ZS5hdHRyKFwieDJcIiwgLWlubmVyVGlja1NpemUpLmF0dHIoXCJ5MVwiLCB0aWNrWSkuYXR0cihcInkyXCIsIHRpY2tZKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRVcGRhdGUuYXR0cihcInhcIiwgLXRpY2tMZW5ndGgpLmF0dHIoXCJ5XCIsIHRpY2tPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zdHlsZShcInRleHQtYW5jaG9yXCIsIFwiZW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHNwYW4uYXR0cigneCcsIC10aWNrTGVuZ3RoKS5hdHRyKFwiZHlcIiwgdHNwYW5EeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoXCJkXCIsIFwiTVwiICsgLW91dGVyVGlja1NpemUgKyBcIixcIiArIHJhbmdlWzBdICsgXCJIMFZcIiArIHJhbmdlWzFdICsgXCJIXCIgKyAtb3V0ZXJUaWNrU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gYXhpc1k7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW50ZXIuYXR0cihcIngyXCIsIGlubmVyVGlja1NpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVudGVyLmF0dHIoXCJ4XCIsIHRpY2tMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVVwZGF0ZS5hdHRyKFwieDJcIiwgaW5uZXJUaWNrU2l6ZSkuYXR0cihcInkyXCIsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFVwZGF0ZS5hdHRyKFwieFwiLCB0aWNrTGVuZ3RoKS5hdHRyKFwieVwiLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc3R5bGUoXCJ0ZXh0LWFuY2hvclwiLCBcInN0YXJ0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHNwYW4uYXR0cigneCcsIHRpY2tMZW5ndGgpLmF0dHIoXCJkeVwiLCB0c3BhbkR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cihcImRcIiwgXCJNXCIgKyBvdXRlclRpY2tTaXplICsgXCIsXCIgKyByYW5nZVswXSArIFwiSDBWXCIgKyByYW5nZVsxXSArIFwiSFwiICsgb3V0ZXJUaWNrU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2NhbGUxLnJhbmdlQmFuZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHNjYWxlMSwgZHggPSB4LnJhbmdlQmFuZCgpIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGUwID0gc2NhbGUxID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4KGQpICsgZHg7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzY2FsZTAucmFuZ2VCYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlMCA9IHNjYWxlMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aWNrRXhpdC5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMCk7XG4gICAgICAgICAgICAgICAgdGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBheGlzLnNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgeyByZXR1cm4gc2NhbGU7IH1cbiAgICAgICAgICAgIHNjYWxlID0geDtcbiAgICAgICAgICAgIHJldHVybiBheGlzO1xuICAgICAgICB9O1xuICAgICAgICBheGlzLm9yaWVudCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgcmV0dXJuIG9yaWVudDsgfVxuICAgICAgICAgICAgb3JpZW50ID0geCBpbiB7dG9wOiAxLCByaWdodDogMSwgYm90dG9tOiAxLCBsZWZ0OiAxfSA/IHggKyBcIlwiIDogXCJib3R0b21cIjtcbiAgICAgICAgICAgIHJldHVybiBheGlzO1xuICAgICAgICB9O1xuICAgICAgICBheGlzLnRpY2tGb3JtYXQgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgcmV0dXJuIHRpY2tGb3JtYXQ7IH1cbiAgICAgICAgICAgIHRpY2tGb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICByZXR1cm4gYXhpcztcbiAgICAgICAgfTtcbiAgICAgICAgYXhpcy50aWNrQ2VudGVyZWQgPSBmdW5jdGlvbiAoaXNDZW50ZXJlZCkge1xuICAgICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7IHJldHVybiB0aWNrQ2VudGVyZWQ7IH1cbiAgICAgICAgICAgIHRpY2tDZW50ZXJlZCA9IGlzQ2VudGVyZWQ7XG4gICAgICAgICAgICByZXR1cm4gYXhpcztcbiAgICAgICAgfTtcbiAgICAgICAgYXhpcy50aWNrT2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRpY2tPZmZzZXQ7XG4gICAgICAgIH07XG4gICAgICAgIGF4aXMudGlja0ludGVydmFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGludGVydmFsLCBsZW5ndGg7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmlzQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IHRpY2tPZmZzZXQgKiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gYXhpcy5nLnNlbGVjdCgncGF0aC5kb21haW4nKS5ub2RlKCkuZ2V0VG90YWxMZW5ndGgoKSAtIG91dGVyVGlja1NpemUgKiAyO1xuICAgICAgICAgICAgICAgIGludGVydmFsID0gbGVuZ3RoIC8gYXhpcy5nLnNlbGVjdEFsbCgnbGluZScpLnNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnZhbCA9PT0gSW5maW5pdHkgPyAwIDogaW50ZXJ2YWw7XG4gICAgICAgIH07XG4gICAgICAgIGF4aXMudGlja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgcmV0dXJuIHRpY2tBcmd1bWVudHM7IH1cbiAgICAgICAgICAgIHRpY2tBcmd1bWVudHMgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICByZXR1cm4gYXhpcztcbiAgICAgICAgfTtcbiAgICAgICAgYXhpcy50aWNrQ3VsbGluZyA9IGZ1bmN0aW9uIChjdWxsaW5nKSB7XG4gICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgcmV0dXJuIHRpY2tDdWxsaW5nOyB9XG4gICAgICAgICAgICB0aWNrQ3VsbGluZyA9IGN1bGxpbmc7XG4gICAgICAgICAgICByZXR1cm4gYXhpcztcbiAgICAgICAgfTtcbiAgICAgICAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRpY2tWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4KHNjYWxlLmRvbWFpbigpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7IHJldHVybiB0aWNrVmFsdWVzOyB9XG4gICAgICAgICAgICAgICAgdGlja1ZhbHVlcyA9IHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXhpcztcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfVxuXG4gICAgYzNfY2hhcnRfaW50ZXJuYWxfZm4uaXNTYWZhcmkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICByZXR1cm4gdWEuaW5kZXhPZignU2FmYXJpJykgPj0gMCAmJiB1YS5pbmRleE9mKCdDaHJvbWUnKSA8IDA7XG4gICAgfTtcbiAgICBjM19jaGFydF9pbnRlcm5hbF9mbi5pc0Nocm9tZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIHJldHVybiB1YS5pbmRleE9mKCdDaHJvbWUnKSA+PSAwO1xuICAgIH07XG5cbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cbiAgICAvLyBQaGFudG9tSlMgZG9lc24ndCBoYXZlIHN1cHBvcnQgZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3aGljaCBoYXMgY2F1c2VkIGNvbmZ1c2lvbi4gVXNlXG4gICAgLy8gdGhpcyBwb2x5ZmlsbCB0byBhdm9pZCB0aGUgY29uZnVzaW9uLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL2JpbmQjUG9seWZpbGxcblxuICAgIGlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHtcbiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24ob1RoaXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1XG4gICAgICAgICAgLy8gaW50ZXJuYWwgSXNDYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIC0gd2hhdCBpcyB0cnlpbmcgdG8gYmUgYm91bmQgaXMgbm90IGNhbGxhYmxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYUFyZ3MgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICBmVG9CaW5kID0gdGhpcyxcbiAgICAgICAgICAgIGZOT1AgICAgPSBmdW5jdGlvbigpIHt9LFxuICAgICAgICAgICAgZkJvdW5kICA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZlRvQmluZC5hcHBseSh0aGlzIGluc3RhbmNlb2YgZk5PUCA/IHRoaXMgOiBvVGhpcywgYUFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgZk5PUC5wcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcbiAgICAgICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBmTk9QKCk7XG5cbiAgICAgICAgcmV0dXJuIGZCb3VuZDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy9TVkdQYXRoU2VnIEFQSSBwb2x5ZmlsbFxuICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL3Byb2dlcnMvcGF0aHNlZ1xuICAgIC8vXG4gICAgLy9UaGlzIGlzIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIFNWR1BhdGhTZWcgYW5kIFNWR1BhdGhTZWdMaXN0IEFQSXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbVxuICAgIC8vU1ZHMiAoaHR0cHM6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy1zdmcvMjAxNUp1bi8wMDQ0Lmh0bWwpLCBpbmNsdWRpbmcgdGhlIGxhdGVzdCBzcGVjXG4gICAgLy9jaGFuZ2VzIHdoaWNoIHdlcmUgaW1wbGVtZW50ZWQgaW4gRmlyZWZveCA0MyBhbmQgQ2hyb21lIDQ2LlxuICAgIC8vQ2hyb21lIDQ4IHJlbW92ZXMgdGhlc2UgQVBJcywgc28gdGhpcyBwb2x5ZmlsbCBpcyByZXF1aXJlZC5cblxuICAgIChmdW5jdGlvbigpIHsgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgIGlmICghKFwiU1ZHUGF0aFNlZ1wiIGluIHdpbmRvdykpIHtcbiAgICAgICAgIC8vIFNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL3NpbmdsZS1wYWdlLmh0bWwjcGF0aHMtSW50ZXJmYWNlU1ZHUGF0aFNlZ1xuICAgICAgICAgd2luZG93LlNWR1BhdGhTZWcgPSBmdW5jdGlvbih0eXBlLCB0eXBlQXNMZXR0ZXIsIG93bmluZ1BhdGhTZWdMaXN0KSB7XG4gICAgICAgICAgICAgdGhpcy5wYXRoU2VnVHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgdGhpcy5wYXRoU2VnVHlwZUFzTGV0dGVyID0gdHlwZUFzTGV0dGVyO1xuICAgICAgICAgICAgIHRoaXMuX293bmluZ1BhdGhTZWdMaXN0ID0gb3duaW5nUGF0aFNlZ0xpc3Q7XG4gICAgICAgICB9XG5cbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19VTktOT1dOID0gMDtcbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19DTE9TRVBBVEggPSAxO1xuICAgICAgICAgU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19BQlMgPSAyO1xuICAgICAgICAgU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19SRUwgPSAzO1xuICAgICAgICAgU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19BQlMgPSA0O1xuICAgICAgICAgU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19SRUwgPSA1O1xuICAgICAgICAgU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fQ1VCSUNfQUJTID0gNjtcbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX1JFTCA9IDc7XG4gICAgICAgICBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfQUJTID0gODtcbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19SRUwgPSA5O1xuICAgICAgICAgU1ZHUGF0aFNlZy5QQVRIU0VHX0FSQ19BQlMgPSAxMDtcbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19BUkNfUkVMID0gMTE7XG4gICAgICAgICBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX0hPUklaT05UQUxfQUJTID0gMTI7XG4gICAgICAgICBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX0hPUklaT05UQUxfUkVMID0gMTM7XG4gICAgICAgICBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX0FCUyA9IDE0O1xuICAgICAgICAgU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19WRVJUSUNBTF9SRUwgPSAxNTtcbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX1NNT09USF9BQlMgPSAxNjtcbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX1NNT09USF9SRUwgPSAxNztcbiAgICAgICAgIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19TTU9PVEhfQUJTID0gMTg7XG4gICAgICAgICBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfU01PT1RIX1JFTCA9IDE5O1xuXG4gICAgICAgICAvLyBOb3RpZnkgb3duaW5nIFBhdGhTZWdMaXN0IG9uIGFueSBjaGFuZ2VzIHNvIHRoZXkgY2FuIGJlIHN5bmNocm9uaXplZCBiYWNrIHRvIHRoZSBwYXRoIGVsZW1lbnQuXG4gICAgICAgICBTVkdQYXRoU2VnLnByb3RvdHlwZS5fc2VnbWVudENoYW5nZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICBpZiAodGhpcy5fb3duaW5nUGF0aFNlZ0xpc3QpXG4gICAgICAgICAgICAgICAgIHRoaXMuX293bmluZ1BhdGhTZWdMaXN0LnNlZ21lbnRDaGFuZ2VkKHRoaXMpO1xuICAgICAgICAgfVxuXG4gICAgICAgICB3aW5kb3cuU1ZHUGF0aFNlZ0Nsb3NlUGF0aCA9IGZ1bmN0aW9uKG93bmluZ1BhdGhTZWdMaXN0KSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19DTE9TRVBBVEgsIFwielwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnQ2xvc2VQYXRoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ0Nsb3NlUGF0aC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnQ2xvc2VQYXRoXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnQ2xvc2VQYXRoLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXI7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdDbG9zZVBhdGgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0Nsb3NlUGF0aCh1bmRlZmluZWQpOyB9XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnTW92ZXRvQWJzID0gZnVuY3Rpb24ob3duaW5nUGF0aFNlZ0xpc3QsIHgsIHkpIHtcbiAgICAgICAgICAgICBTVkdQYXRoU2VnLmNhbGwodGhpcywgU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19BQlMsIFwiTVwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnTW92ZXRvQWJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ01vdmV0b0Ficy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnTW92ZXRvQWJzXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnTW92ZXRvQWJzLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXIgKyBcIiBcIiArIHRoaXMuX3ggKyBcIiBcIiArIHRoaXMuX3k7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdNb3ZldG9BYnMucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ01vdmV0b0Ficyh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3kpOyB9XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ01vdmV0b0Ficy5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ01vdmV0b0Ficy5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnTW92ZXRvUmVsID0gZnVuY3Rpb24ob3duaW5nUGF0aFNlZ0xpc3QsIHgsIHkpIHtcbiAgICAgICAgICAgICBTVkdQYXRoU2VnLmNhbGwodGhpcywgU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19SRUwsIFwibVwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnTW92ZXRvUmVsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ01vdmV0b1JlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnTW92ZXRvUmVsXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnTW92ZXRvUmVsLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXIgKyBcIiBcIiArIHRoaXMuX3ggKyBcIiBcIiArIHRoaXMuX3k7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdNb3ZldG9SZWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ01vdmV0b1JlbCh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3kpOyB9XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ01vdmV0b1JlbC5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ01vdmV0b1JlbC5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnTGluZXRvQWJzID0gZnVuY3Rpb24ob3duaW5nUGF0aFNlZ0xpc3QsIHgsIHkpIHtcbiAgICAgICAgICAgICBTVkdQYXRoU2VnLmNhbGwodGhpcywgU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19BQlMsIFwiTFwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvQWJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b0Ficy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnTGluZXRvQWJzXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvQWJzLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXIgKyBcIiBcIiArIHRoaXMuX3ggKyBcIiBcIiArIHRoaXMuX3k7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdMaW5ldG9BYnMucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b0Ficyh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3kpOyB9XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0xpbmV0b0Ficy5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0xpbmV0b0Ficy5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnTGluZXRvUmVsID0gZnVuY3Rpb24ob3duaW5nUGF0aFNlZ0xpc3QsIHgsIHkpIHtcbiAgICAgICAgICAgICBTVkdQYXRoU2VnLmNhbGwodGhpcywgU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19SRUwsIFwibFwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvUmVsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b1JlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnTGluZXRvUmVsXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvUmVsLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXIgKyBcIiBcIiArIHRoaXMuX3ggKyBcIiBcIiArIHRoaXMuX3k7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdMaW5ldG9SZWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b1JlbCh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3kpOyB9XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0xpbmV0b1JlbC5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0xpbmV0b1JlbC5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnQ3VydmV0b0N1YmljQWJzID0gZnVuY3Rpb24ob3duaW5nUGF0aFNlZ0xpc3QsIHgsIHksIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX0FCUywgXCJDXCIsIG93bmluZ1BhdGhTZWdMaXN0KTtcbiAgICAgICAgICAgICB0aGlzLl94ID0geDtcbiAgICAgICAgICAgICB0aGlzLl95ID0geTtcbiAgICAgICAgICAgICB0aGlzLl94MSA9IHgxO1xuICAgICAgICAgICAgIHRoaXMuX3kxID0geTE7XG4gICAgICAgICAgICAgdGhpcy5feDIgPSB4MjtcbiAgICAgICAgICAgICB0aGlzLl95MiA9IHkyO1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNWR1BhdGhTZWcucHJvdG90eXBlKTtcbiAgICAgICAgIFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBcIltvYmplY3QgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Fic11cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficy5wcm90b3R5cGUuX2FzUGF0aFN0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoU2VnVHlwZUFzTGV0dGVyICsgXCIgXCIgKyB0aGlzLl94MSArIFwiIFwiICsgdGhpcy5feTEgKyBcIiBcIiArIHRoaXMuX3gyICsgXCIgXCIgKyB0aGlzLl95MiArIFwiIFwiICsgdGhpcy5feCArIFwiIFwiICsgdGhpcy5feTsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b0N1YmljQWJzKHVuZGVmaW5lZCwgdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDEsIHRoaXMuX3kxLCB0aGlzLl94MiwgdGhpcy5feTIpOyB9XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficy5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficy5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficy5wcm90b3R5cGUsIFwieDFcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feDE7IH0sIHNldDogZnVuY3Rpb24oeDEpIHsgdGhpcy5feDEgPSB4MTsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljQWJzLnByb3RvdHlwZSwgXCJ5MVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95MTsgfSwgc2V0OiBmdW5jdGlvbih5MSkgeyB0aGlzLl95MSA9IHkxOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnMucHJvdG90eXBlLCBcIngyXCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3gyOyB9LCBzZXQ6IGZ1bmN0aW9uKHgyKSB7IHRoaXMuX3gyID0geDI7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0Ficy5wcm90b3R5cGUsIFwieTJcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feTI7IH0sIHNldDogZnVuY3Rpb24oeTIpIHsgdGhpcy5feTIgPSB5MjsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgd2luZG93LlNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNSZWwgPSBmdW5jdGlvbihvd25pbmdQYXRoU2VnTGlzdCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICAgICAgICAgICBTVkdQYXRoU2VnLmNhbGwodGhpcywgU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fQ1VCSUNfUkVMLCBcImNcIiwgb3duaW5nUGF0aFNlZ0xpc3QpO1xuICAgICAgICAgICAgIHRoaXMuX3ggPSB4O1xuICAgICAgICAgICAgIHRoaXMuX3kgPSB5O1xuICAgICAgICAgICAgIHRoaXMuX3gxID0geDE7XG4gICAgICAgICAgICAgdGhpcy5feTEgPSB5MTtcbiAgICAgICAgICAgICB0aGlzLl94MiA9IHgyO1xuICAgICAgICAgICAgIHRoaXMuX3kyID0geTI7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1JlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXIgKyBcIiBcIiArIHRoaXMuX3gxICsgXCIgXCIgKyB0aGlzLl95MSArIFwiIFwiICsgdGhpcy5feDIgKyBcIiBcIiArIHRoaXMuX3kyICsgXCIgXCIgKyB0aGlzLl94ICsgXCIgXCIgKyB0aGlzLl95OyB9XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNSZWwodW5kZWZpbmVkLCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl94MSwgdGhpcy5feTEsIHRoaXMuX3gyLCB0aGlzLl95Mik7IH1cbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsLnByb3RvdHlwZSwgXCJ4XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3g7IH0sIHNldDogZnVuY3Rpb24oeCkgeyB0aGlzLl94ID0geDsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsLnByb3RvdHlwZSwgXCJ5XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3k7IH0sIHNldDogZnVuY3Rpb24oeSkgeyB0aGlzLl95ID0geTsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsLnByb3RvdHlwZSwgXCJ4MVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94MTsgfSwgc2V0OiBmdW5jdGlvbih4MSkgeyB0aGlzLl94MSA9IHgxOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNSZWwucHJvdG90eXBlLCBcInkxXCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3kxOyB9LCBzZXQ6IGZ1bmN0aW9uKHkxKSB7IHRoaXMuX3kxID0geTE7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1JlbC5wcm90b3R5cGUsIFwieDJcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feDI7IH0sIHNldDogZnVuY3Rpb24oeDIpIHsgdGhpcy5feDIgPSB4MjsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsLnByb3RvdHlwZSwgXCJ5MlwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95MjsgfSwgc2V0OiBmdW5jdGlvbih5MikgeyB0aGlzLl95MiA9IHkyOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICB3aW5kb3cuU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMgPSBmdW5jdGlvbihvd25pbmdQYXRoU2VnTGlzdCwgeCwgeSwgeDEsIHkxKSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19BQlMsIFwiUVwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICAgICAgdGhpcy5feDEgPSB4MTtcbiAgICAgICAgICAgICB0aGlzLl95MSA9IHkxO1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTVkdQYXRoU2VnLnByb3RvdHlwZSk7XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0Ficy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0Fic11cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMucHJvdG90eXBlLl9hc1BhdGhTdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucGF0aFNlZ1R5cGVBc0xldHRlciArIFwiIFwiICsgdGhpcy5feDEgKyBcIiBcIiArIHRoaXMuX3kxICsgXCIgXCIgKyB0aGlzLl94ICsgXCIgXCIgKyB0aGlzLl95OyB9XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0Ficy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0Ficyh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3gxLCB0aGlzLl95MSk7IH1cbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0Ficy5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMucHJvdG90eXBlLCBcInlcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feTsgfSwgc2V0OiBmdW5jdGlvbih5KSB7IHRoaXMuX3kgPSB5OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljQWJzLnByb3RvdHlwZSwgXCJ4MVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94MTsgfSwgc2V0OiBmdW5jdGlvbih4MSkgeyB0aGlzLl94MSA9IHgxOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljQWJzLnByb3RvdHlwZSwgXCJ5MVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95MTsgfSwgc2V0OiBmdW5jdGlvbih5MSkgeyB0aGlzLl95MSA9IHkxOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICB3aW5kb3cuU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNSZWwgPSBmdW5jdGlvbihvd25pbmdQYXRoU2VnTGlzdCwgeCwgeSwgeDEsIHkxKSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19SRUwsIFwicVwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICAgICAgdGhpcy5feDEgPSB4MTtcbiAgICAgICAgICAgICB0aGlzLl95MSA9IHkxO1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNSZWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTVkdQYXRoU2VnLnByb3RvdHlwZSk7XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbF1cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNSZWwucHJvdG90eXBlLl9hc1BhdGhTdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucGF0aFNlZ1R5cGVBc0xldHRlciArIFwiIFwiICsgdGhpcy5feDEgKyBcIiBcIiArIHRoaXMuX3kxICsgXCIgXCIgKyB0aGlzLl94ICsgXCIgXCIgKyB0aGlzLl95OyB9XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbCh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3gxLCB0aGlzLl95MSk7IH1cbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbC5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNSZWwucHJvdG90eXBlLCBcInlcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feTsgfSwgc2V0OiBmdW5jdGlvbih5KSB7IHRoaXMuX3kgPSB5OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljUmVsLnByb3RvdHlwZSwgXCJ4MVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94MTsgfSwgc2V0OiBmdW5jdGlvbih4MSkgeyB0aGlzLl94MSA9IHgxOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljUmVsLnByb3RvdHlwZSwgXCJ5MVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95MTsgfSwgc2V0OiBmdW5jdGlvbih5MSkgeyB0aGlzLl95MSA9IHkxOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICB3aW5kb3cuU1ZHUGF0aFNlZ0FyY0FicyA9IGZ1bmN0aW9uKG93bmluZ1BhdGhTZWdMaXN0LCB4LCB5LCByMSwgcjIsIGFuZ2xlLCBsYXJnZUFyY0ZsYWcsIHN3ZWVwRmxhZykge1xuICAgICAgICAgICAgIFNWR1BhdGhTZWcuY2FsbCh0aGlzLCBTVkdQYXRoU2VnLlBBVEhTRUdfQVJDX0FCUywgXCJBXCIsIG93bmluZ1BhdGhTZWdMaXN0KTtcbiAgICAgICAgICAgICB0aGlzLl94ID0geDtcbiAgICAgICAgICAgICB0aGlzLl95ID0geTtcbiAgICAgICAgICAgICB0aGlzLl9yMSA9IHIxO1xuICAgICAgICAgICAgIHRoaXMuX3IyID0gcjI7XG4gICAgICAgICAgICAgdGhpcy5fYW5nbGUgPSBhbmdsZTtcbiAgICAgICAgICAgICB0aGlzLl9sYXJnZUFyY0ZsYWcgPSBsYXJnZUFyY0ZsYWc7XG4gICAgICAgICAgICAgdGhpcy5fc3dlZXBGbGFnID0gc3dlZXBGbGFnO1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0FyY0Ficy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNWR1BhdGhTZWcucHJvdG90eXBlKTtcbiAgICAgICAgIFNWR1BhdGhTZWdBcmNBYnMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBcIltvYmplY3QgU1ZHUGF0aFNlZ0FyY0Fic11cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0FyY0Ficy5wcm90b3R5cGUuX2FzUGF0aFN0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoU2VnVHlwZUFzTGV0dGVyICsgXCIgXCIgKyB0aGlzLl9yMSArIFwiIFwiICsgdGhpcy5fcjIgKyBcIiBcIiArIHRoaXMuX2FuZ2xlICsgXCIgXCIgKyAodGhpcy5fbGFyZ2VBcmNGbGFnID8gXCIxXCIgOiBcIjBcIikgKyBcIiBcIiArICh0aGlzLl9zd2VlcEZsYWcgPyBcIjFcIiA6IFwiMFwiKSArIFwiIFwiICsgdGhpcy5feCArIFwiIFwiICsgdGhpcy5feTsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0FyY0Ficy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQXJjQWJzKHVuZGVmaW5lZCwgdGhpcy5feCwgdGhpcy5feSwgdGhpcy5fcjEsIHRoaXMuX3IyLCB0aGlzLl9hbmdsZSwgdGhpcy5fbGFyZ2VBcmNGbGFnLCB0aGlzLl9zd2VlcEZsYWcpOyB9XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0FyY0Ficy5wcm90b3R5cGUsIFwieFwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94OyB9LCBzZXQ6IGZ1bmN0aW9uKHgpIHsgdGhpcy5feCA9IHg7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0FyY0Ficy5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0FyY0Ficy5wcm90b3R5cGUsIFwicjFcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcjE7IH0sIHNldDogZnVuY3Rpb24ocjEpIHsgdGhpcy5fcjEgPSByMTsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQXJjQWJzLnByb3RvdHlwZSwgXCJyMlwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9yMjsgfSwgc2V0OiBmdW5jdGlvbihyMikgeyB0aGlzLl9yMiA9IHIyOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdBcmNBYnMucHJvdG90eXBlLCBcImFuZ2xlXCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2FuZ2xlOyB9LCBzZXQ6IGZ1bmN0aW9uKGFuZ2xlKSB7IHRoaXMuX2FuZ2xlID0gYW5nbGU7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0FyY0Ficy5wcm90b3R5cGUsIFwibGFyZ2VBcmNGbGFnXCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2xhcmdlQXJjRmxhZzsgfSwgc2V0OiBmdW5jdGlvbihsYXJnZUFyY0ZsYWcpIHsgdGhpcy5fbGFyZ2VBcmNGbGFnID0gbGFyZ2VBcmNGbGFnOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdBcmNBYnMucHJvdG90eXBlLCBcInN3ZWVwRmxhZ1wiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zd2VlcEZsYWc7IH0sIHNldDogZnVuY3Rpb24oc3dlZXBGbGFnKSB7IHRoaXMuX3N3ZWVwRmxhZyA9IHN3ZWVwRmxhZzsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgd2luZG93LlNWR1BhdGhTZWdBcmNSZWwgPSBmdW5jdGlvbihvd25pbmdQYXRoU2VnTGlzdCwgeCwgeSwgcjEsIHIyLCBhbmdsZSwgbGFyZ2VBcmNGbGFnLCBzd2VlcEZsYWcpIHtcbiAgICAgICAgICAgICBTVkdQYXRoU2VnLmNhbGwodGhpcywgU1ZHUGF0aFNlZy5QQVRIU0VHX0FSQ19SRUwsIFwiYVwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICAgICAgdGhpcy5fcjEgPSByMTtcbiAgICAgICAgICAgICB0aGlzLl9yMiA9IHIyO1xuICAgICAgICAgICAgIHRoaXMuX2FuZ2xlID0gYW5nbGU7XG4gICAgICAgICAgICAgdGhpcy5fbGFyZ2VBcmNGbGFnID0gbGFyZ2VBcmNGbGFnO1xuICAgICAgICAgICAgIHRoaXMuX3N3ZWVwRmxhZyA9IHN3ZWVwRmxhZztcbiAgICAgICAgIH1cbiAgICAgICAgIFNWR1BhdGhTZWdBcmNSZWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTVkdQYXRoU2VnLnByb3RvdHlwZSk7XG4gICAgICAgICBTVkdQYXRoU2VnQXJjUmVsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gXCJbb2JqZWN0IFNWR1BhdGhTZWdBcmNSZWxdXCI7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdBcmNSZWwucHJvdG90eXBlLl9hc1BhdGhTdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucGF0aFNlZ1R5cGVBc0xldHRlciArIFwiIFwiICsgdGhpcy5fcjEgKyBcIiBcIiArIHRoaXMuX3IyICsgXCIgXCIgKyB0aGlzLl9hbmdsZSArIFwiIFwiICsgKHRoaXMuX2xhcmdlQXJjRmxhZyA/IFwiMVwiIDogXCIwXCIpICsgXCIgXCIgKyAodGhpcy5fc3dlZXBGbGFnID8gXCIxXCIgOiBcIjBcIikgKyBcIiBcIiArIHRoaXMuX3ggKyBcIiBcIiArIHRoaXMuX3k7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdBcmNSZWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0FyY1JlbCh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3IxLCB0aGlzLl9yMiwgdGhpcy5fYW5nbGUsIHRoaXMuX2xhcmdlQXJjRmxhZywgdGhpcy5fc3dlZXBGbGFnKTsgfVxuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdBcmNSZWwucHJvdG90eXBlLCBcInhcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feDsgfSwgc2V0OiBmdW5jdGlvbih4KSB7IHRoaXMuX3ggPSB4OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdBcmNSZWwucHJvdG90eXBlLCBcInlcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feTsgfSwgc2V0OiBmdW5jdGlvbih5KSB7IHRoaXMuX3kgPSB5OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdBcmNSZWwucHJvdG90eXBlLCBcInIxXCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3IxOyB9LCBzZXQ6IGZ1bmN0aW9uKHIxKSB7IHRoaXMuX3IxID0gcjE7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0FyY1JlbC5wcm90b3R5cGUsIFwicjJcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcjI7IH0sIHNldDogZnVuY3Rpb24ocjIpIHsgdGhpcy5fcjIgPSByMjsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQXJjUmVsLnByb3RvdHlwZSwgXCJhbmdsZVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9hbmdsZTsgfSwgc2V0OiBmdW5jdGlvbihhbmdsZSkgeyB0aGlzLl9hbmdsZSA9IGFuZ2xlOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdBcmNSZWwucHJvdG90eXBlLCBcImxhcmdlQXJjRmxhZ1wiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9sYXJnZUFyY0ZsYWc7IH0sIHNldDogZnVuY3Rpb24obGFyZ2VBcmNGbGFnKSB7IHRoaXMuX2xhcmdlQXJjRmxhZyA9IGxhcmdlQXJjRmxhZzsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQXJjUmVsLnByb3RvdHlwZSwgXCJzd2VlcEZsYWdcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc3dlZXBGbGFnOyB9LCBzZXQ6IGZ1bmN0aW9uKHN3ZWVwRmxhZykgeyB0aGlzLl9zd2VlcEZsYWcgPSBzd2VlcEZsYWc7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicyA9IGZ1bmN0aW9uKG93bmluZ1BhdGhTZWdMaXN0LCB4KSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19MSU5FVE9fSE9SSVpPTlRBTF9BQlMsIFwiSFwiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNWR1BhdGhTZWcucHJvdG90eXBlKTtcbiAgICAgICAgIFNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gXCJbb2JqZWN0IFNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicy5wcm90b3R5cGUuX2FzUGF0aFN0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoU2VnVHlwZUFzTGV0dGVyICsgXCIgXCIgKyB0aGlzLl94OyB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicyh1bmRlZmluZWQsIHRoaXMuX3gpOyB9XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxBYnMucHJvdG90eXBlLCBcInhcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feDsgfSwgc2V0OiBmdW5jdGlvbih4KSB7IHRoaXMuX3ggPSB4OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICB3aW5kb3cuU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwgPSBmdW5jdGlvbihvd25pbmdQYXRoU2VnTGlzdCwgeCkge1xuICAgICAgICAgICAgIFNWR1BhdGhTZWcuY2FsbCh0aGlzLCBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX0hPUklaT05UQUxfUkVMLCBcImhcIiwgb3duaW5nUGF0aFNlZ0xpc3QpO1xuICAgICAgICAgICAgIHRoaXMuX3ggPSB4O1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTVkdQYXRoU2VnLnByb3RvdHlwZSk7XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbFJlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbFJlbF1cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwucHJvdG90eXBlLl9hc1BhdGhTdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucGF0aFNlZ1R5cGVBc0xldHRlciArIFwiIFwiICsgdGhpcy5feDsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwodW5kZWZpbmVkLCB0aGlzLl94KTsgfVxuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsUmVsLnByb3RvdHlwZSwgXCJ4XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3g7IH0sIHNldDogZnVuY3Rpb24oeCkgeyB0aGlzLl94ID0geDsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgd2luZG93LlNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbEFicyA9IGZ1bmN0aW9uKG93bmluZ1BhdGhTZWdMaXN0LCB5KSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19MSU5FVE9fVkVSVElDQUxfQUJTLCBcIlZcIiwgb3duaW5nUGF0aFNlZ0xpc3QpO1xuICAgICAgICAgICAgIHRoaXMuX3kgPSB5O1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gXCJbb2JqZWN0IFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbEFic11cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXIgKyBcIiBcIiArIHRoaXMuX3k7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbEFicy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnTGluZXRvVmVydGljYWxBYnModW5kZWZpbmVkLCB0aGlzLl95KTsgfVxuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbEFicy5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWwgPSBmdW5jdGlvbihvd25pbmdQYXRoU2VnTGlzdCwgeSkge1xuICAgICAgICAgICAgIFNWR1BhdGhTZWcuY2FsbCh0aGlzLCBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX1JFTCwgXCJ2XCIsIG93bmluZ1BhdGhTZWdMaXN0KTtcbiAgICAgICAgICAgICB0aGlzLl95ID0geTtcbiAgICAgICAgIH1cbiAgICAgICAgIFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbFJlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNWR1BhdGhTZWcucHJvdG90eXBlKTtcbiAgICAgICAgIFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbFJlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWxdXCI7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbFJlbC5wcm90b3R5cGUuX2FzUGF0aFN0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoU2VnVHlwZUFzTGV0dGVyICsgXCIgXCIgKyB0aGlzLl95OyB9XG4gICAgICAgICBTVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsUmVsKHVuZGVmaW5lZCwgdGhpcy5feSk7IH1cbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWwucHJvdG90eXBlLCBcInlcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feTsgfSwgc2V0OiBmdW5jdGlvbih5KSB7IHRoaXMuX3kgPSB5OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICB3aW5kb3cuU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicyA9IGZ1bmN0aW9uKG93bmluZ1BhdGhTZWdMaXN0LCB4LCB5LCB4MiwgeTIpIHtcbiAgICAgICAgICAgICBTVkdQYXRoU2VnLmNhbGwodGhpcywgU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fQ1VCSUNfU01PT1RIX0FCUywgXCJTXCIsIG93bmluZ1BhdGhTZWdMaXN0KTtcbiAgICAgICAgICAgICB0aGlzLl94ID0geDtcbiAgICAgICAgICAgICB0aGlzLl95ID0geTtcbiAgICAgICAgICAgICB0aGlzLl94MiA9IHgyO1xuICAgICAgICAgICAgIHRoaXMuX3kyID0geTI7XG4gICAgICAgICB9XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU1ZHUGF0aFNlZy5wcm90b3R5cGUpO1xuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzXVwiOyB9XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzLnByb3RvdHlwZS5fYXNQYXRoU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnBhdGhTZWdUeXBlQXNMZXR0ZXIgKyBcIiBcIiArIHRoaXMuX3gyICsgXCIgXCIgKyB0aGlzLl95MiArIFwiIFwiICsgdGhpcy5feCArIFwiIFwiICsgdGhpcy5feTsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzKHVuZGVmaW5lZCwgdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDIsIHRoaXMuX3kyKTsgfVxuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhBYnMucHJvdG90eXBlLCBcInhcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feDsgfSwgc2V0OiBmdW5jdGlvbih4KSB7IHRoaXMuX3ggPSB4OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhBYnMucHJvdG90eXBlLCBcInlcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feTsgfSwgc2V0OiBmdW5jdGlvbih5KSB7IHRoaXMuX3kgPSB5OyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhBYnMucHJvdG90eXBlLCBcIngyXCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3gyOyB9LCBzZXQ6IGZ1bmN0aW9uKHgyKSB7IHRoaXMuX3gyID0geDI7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicy5wcm90b3R5cGUsIFwieTJcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5feTI7IH0sIHNldDogZnVuY3Rpb24oeTIpIHsgdGhpcy5feTIgPSB5MjsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgd2luZG93LlNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhSZWwgPSBmdW5jdGlvbihvd25pbmdQYXRoU2VnTGlzdCwgeCwgeSwgeDIsIHkyKSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX1NNT09USF9SRUwsIFwic1wiLCBvd25pbmdQYXRoU2VnTGlzdCk7XG4gICAgICAgICAgICAgdGhpcy5feCA9IHg7XG4gICAgICAgICAgICAgdGhpcy5feSA9IHk7XG4gICAgICAgICAgICAgdGhpcy5feDIgPSB4MjtcbiAgICAgICAgICAgICB0aGlzLl95MiA9IHkyO1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aFJlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNWR1BhdGhTZWcucHJvdG90eXBlKTtcbiAgICAgICAgIFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhSZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBcIltvYmplY3QgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aFJlbF1cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aFJlbC5wcm90b3R5cGUuX2FzUGF0aFN0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoU2VnVHlwZUFzTGV0dGVyICsgXCIgXCIgKyB0aGlzLl94MiArIFwiIFwiICsgdGhpcy5feTIgKyBcIiBcIiArIHRoaXMuX3ggKyBcIiBcIiArIHRoaXMuX3k7IH1cbiAgICAgICAgIFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhSZWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aFJlbCh1bmRlZmluZWQsIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3gyLCB0aGlzLl95Mik7IH1cbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoUmVsLnByb3RvdHlwZSwgXCJ4XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3g7IH0sIHNldDogZnVuY3Rpb24oeCkgeyB0aGlzLl94ID0geDsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoUmVsLnByb3RvdHlwZSwgXCJ5XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3k7IH0sIHNldDogZnVuY3Rpb24oeSkgeyB0aGlzLl95ID0geTsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoUmVsLnByb3RvdHlwZSwgXCJ4MlwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl94MjsgfSwgc2V0OiBmdW5jdGlvbih4MikgeyB0aGlzLl94MiA9IHgyOyB0aGlzLl9zZWdtZW50Q2hhbmdlZCgpOyB9LCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhSZWwucHJvdG90eXBlLCBcInkyXCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3kyOyB9LCBzZXQ6IGZ1bmN0aW9uKHkyKSB7IHRoaXMuX3kyID0geTI7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicyA9IGZ1bmN0aW9uKG93bmluZ1BhdGhTZWdMaXN0LCB4LCB5KSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19TTU9PVEhfQUJTLCBcIlRcIiwgb3duaW5nUGF0aFNlZ0xpc3QpO1xuICAgICAgICAgICAgIHRoaXMuX3ggPSB4O1xuICAgICAgICAgICAgIHRoaXMuX3kgPSB5O1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhBYnMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTVkdQYXRoU2VnLnByb3RvdHlwZSk7XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFic11cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhBYnMucHJvdG90eXBlLl9hc1BhdGhTdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucGF0aFNlZ1R5cGVBc0xldHRlciArIFwiIFwiICsgdGhpcy5feCArIFwiIFwiICsgdGhpcy5feTsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhBYnMucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhBYnModW5kZWZpbmVkLCB0aGlzLl94LCB0aGlzLl95KTsgfVxuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoQWJzLnByb3RvdHlwZSwgXCJ4XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3g7IH0sIHNldDogZnVuY3Rpb24oeCkgeyB0aGlzLl94ID0geDsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicy5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aFJlbCA9IGZ1bmN0aW9uKG93bmluZ1BhdGhTZWdMaXN0LCB4LCB5KSB7XG4gICAgICAgICAgICAgU1ZHUGF0aFNlZy5jYWxsKHRoaXMsIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19TTU9PVEhfUkVMLCBcInRcIiwgb3duaW5nUGF0aFNlZ0xpc3QpO1xuICAgICAgICAgICAgIHRoaXMuX3ggPSB4O1xuICAgICAgICAgICAgIHRoaXMuX3kgPSB5O1xuICAgICAgICAgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTVkdQYXRoU2VnLnByb3RvdHlwZSk7XG4gICAgICAgICBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aFJlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiW29iamVjdCBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aFJlbF1cIjsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwucHJvdG90eXBlLl9hc1BhdGhTdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucGF0aFNlZ1R5cGVBc0xldHRlciArIFwiIFwiICsgdGhpcy5feCArIFwiIFwiICsgdGhpcy5feTsgfVxuICAgICAgICAgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwodW5kZWZpbmVkLCB0aGlzLl94LCB0aGlzLl95KTsgfVxuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoUmVsLnByb3RvdHlwZSwgXCJ4XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3g7IH0sIHNldDogZnVuY3Rpb24oeCkgeyB0aGlzLl94ID0geDsgdGhpcy5fc2VnbWVudENoYW5nZWQoKTsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aFJlbC5wcm90b3R5cGUsIFwieVwiLCB7IGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl95OyB9LCBzZXQ6IGZ1bmN0aW9uKHkpIHsgdGhpcy5feSA9IHk7IHRoaXMuX3NlZ21lbnRDaGFuZ2VkKCk7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgIC8vIEFkZCBjcmVhdGVTVkdQYXRoU2VnKiBmdW5jdGlvbnMgdG8gU1ZHUGF0aEVsZW1lbnQuXG4gICAgICAgICAvLyBTcGVjOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9zaW5nbGUtcGFnZS5odG1sI3BhdGhzLUludGVyZmFjZVNWR1BhdGhFbGVtZW50LlxuICAgICAgICAgU1ZHUGF0aEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR1BhdGhTZWdDbG9zZVBhdGggPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ2xvc2VQYXRoKHVuZGVmaW5lZCk7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnTW92ZXRvQWJzID0gZnVuY3Rpb24oeCwgeSkgeyByZXR1cm4gbmV3IFNWR1BhdGhTZWdNb3ZldG9BYnModW5kZWZpbmVkLCB4LCB5KTsgfVxuICAgICAgICAgU1ZHUGF0aEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR1BhdGhTZWdNb3ZldG9SZWwgPSBmdW5jdGlvbih4LCB5KSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ01vdmV0b1JlbCh1bmRlZmluZWQsIHgsIHkpOyB9XG4gICAgICAgICBTVkdQYXRoRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0FicyA9IGZ1bmN0aW9uKHgsIHkpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnTGluZXRvQWJzKHVuZGVmaW5lZCwgeCwgeSk7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnTGluZXRvUmVsID0gZnVuY3Rpb24oeCwgeSkgeyByZXR1cm4gbmV3IFNWR1BhdGhTZWdMaW5ldG9SZWwodW5kZWZpbmVkLCB4LCB5KTsgfVxuICAgICAgICAgU1ZHUGF0aEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnMgPSBmdW5jdGlvbih4LCB5LCB4MSwgeTEsIHgyLCB5MikgeyByZXR1cm4gbmV3IFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnModW5kZWZpbmVkLCB4LCB5LCB4MSwgeTEsIHgyLCB5Mik7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsID0gZnVuY3Rpb24oeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsKHVuZGVmaW5lZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpOyB9XG4gICAgICAgICBTVkdQYXRoRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMgPSBmdW5jdGlvbih4LCB5LCB4MSwgeTEpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0Ficyh1bmRlZmluZWQsIHgsIHksIHgxLCB5MSk7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbCA9IGZ1bmN0aW9uKHgsIHksIHgxLCB5MSkgeyByZXR1cm4gbmV3IFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljUmVsKHVuZGVmaW5lZCwgeCwgeSwgeDEsIHkxKTsgfVxuICAgICAgICAgU1ZHUGF0aEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR1BhdGhTZWdBcmNBYnMgPSBmdW5jdGlvbih4LCB5LCByMSwgcjIsIGFuZ2xlLCBsYXJnZUFyY0ZsYWcsIHN3ZWVwRmxhZykgeyByZXR1cm4gbmV3IFNWR1BhdGhTZWdBcmNBYnModW5kZWZpbmVkLCB4LCB5LCByMSwgcjIsIGFuZ2xlLCBsYXJnZUFyY0ZsYWcsIHN3ZWVwRmxhZyk7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnQXJjUmVsID0gZnVuY3Rpb24oeCwgeSwgcjEsIHIyLCBhbmdsZSwgbGFyZ2VBcmNGbGFnLCBzd2VlcEZsYWcpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQXJjUmVsKHVuZGVmaW5lZCwgeCwgeSwgcjEsIHIyLCBhbmdsZSwgbGFyZ2VBcmNGbGFnLCBzd2VlcEZsYWcpOyB9XG4gICAgICAgICBTVkdQYXRoRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxBYnMgPSBmdW5jdGlvbih4KSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxBYnModW5kZWZpbmVkLCB4KTsgfVxuICAgICAgICAgU1ZHUGF0aEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsUmVsID0gZnVuY3Rpb24oeCkgeyByZXR1cm4gbmV3IFNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsUmVsKHVuZGVmaW5lZCwgeCk7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnTGluZXRvVmVydGljYWxBYnMgPSBmdW5jdGlvbih5KSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzKHVuZGVmaW5lZCwgeSk7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWwgPSBmdW5jdGlvbih5KSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsUmVsKHVuZGVmaW5lZCwgeSk7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzID0gZnVuY3Rpb24oeCwgeSwgeDIsIHkyKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicyh1bmRlZmluZWQsIHgsIHksIHgyLCB5Mik7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoUmVsID0gZnVuY3Rpb24oeCwgeSwgeDIsIHkyKSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aFJlbCh1bmRlZmluZWQsIHgsIHksIHgyLCB5Mik7IH1cbiAgICAgICAgIFNWR1BhdGhFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicyA9IGZ1bmN0aW9uKHgsIHkpIHsgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicyh1bmRlZmluZWQsIHgsIHkpOyB9XG4gICAgICAgICBTVkdQYXRoRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwgPSBmdW5jdGlvbih4LCB5KSB7IHJldHVybiBuZXcgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwodW5kZWZpbmVkLCB4LCB5KTsgfVxuICAgICB9XG5cbiAgICAgaWYgKCEoXCJTVkdQYXRoU2VnTGlzdFwiIGluIHdpbmRvdykpIHtcbiAgICAgICAgIC8vIFNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL3NpbmdsZS1wYWdlLmh0bWwjcGF0aHMtSW50ZXJmYWNlU1ZHUGF0aFNlZ0xpc3RcbiAgICAgICAgIHdpbmRvdy5TVkdQYXRoU2VnTGlzdCA9IGZ1bmN0aW9uKHBhdGhFbGVtZW50KSB7XG4gICAgICAgICAgICAgdGhpcy5fcGF0aEVsZW1lbnQgPSBwYXRoRWxlbWVudDtcbiAgICAgICAgICAgICB0aGlzLl9saXN0ID0gdGhpcy5fcGFyc2VQYXRoKHRoaXMuX3BhdGhFbGVtZW50LmdldEF0dHJpYnV0ZShcImRcIikpO1xuXG4gICAgICAgICAgICAgLy8gVXNlIGEgTXV0YXRpb25PYnNlcnZlciB0byBjYXRjaCBjaGFuZ2VzIHRvIHRoZSBwYXRoJ3MgXCJkXCIgYXR0cmlidXRlLlxuICAgICAgICAgICAgIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXJDb25maWcgPSB7IFwiYXR0cmlidXRlc1wiOiB0cnVlLCBcImF0dHJpYnV0ZUZpbHRlclwiOiBbXCJkXCJdIH07XG4gICAgICAgICAgICAgdGhpcy5fcGF0aEVsZW1lbnRNdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5fdXBkYXRlTGlzdEZyb21QYXRoTXV0YXRpb25zLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgIHRoaXMuX3BhdGhFbGVtZW50TXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuX3BhdGhFbGVtZW50LCB0aGlzLl9tdXRhdGlvbk9ic2VydmVyQ29uZmlnKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNWR1BhdGhTZWdMaXN0LnByb3RvdHlwZSwgXCJudW1iZXJPZkl0ZW1zXCIsIHtcbiAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1BhdGhTeW5jaHJvbml6ZWRUb0xpc3QoKTtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3QubGVuZ3RoO1xuICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgfSk7XG5cbiAgICAgICAgIC8vIEFkZCB0aGUgcGF0aFNlZ0xpc3QgYWNjZXNzb3JzIHRvIFNWR1BhdGhFbGVtZW50LlxuICAgICAgICAgLy8gU3BlYzogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvc2luZ2xlLXBhZ2UuaHRtbCNwYXRocy1JbnRlcmZhY2VTVkdBbmltYXRlZFBhdGhEYXRhXG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aEVsZW1lbnQucHJvdG90eXBlLCBcInBhdGhTZWdMaXN0XCIsIHtcbiAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3BhdGhTZWdMaXN0KVxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGF0aFNlZ0xpc3QgPSBuZXcgU1ZHUGF0aFNlZ0xpc3QodGhpcyk7XG4gICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXRoU2VnTGlzdDtcbiAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgIH0pO1xuICAgICAgICAgLy8gRklYTUU6IFRoZSBmb2xsb3dpbmcgYXJlIG5vdCBpbXBsZW1lbnRlZCBhbmQgc2ltcGx5IHJldHVybiBTVkdQYXRoRWxlbWVudC5wYXRoU2VnTGlzdC5cbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoRWxlbWVudC5wcm90b3R5cGUsIFwibm9ybWFsaXplZFBhdGhTZWdMaXN0XCIsIHsgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucGF0aFNlZ0xpc3Q7IH0sIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU1ZHUGF0aEVsZW1lbnQucHJvdG90eXBlLCBcImFuaW1hdGVkUGF0aFNlZ0xpc3RcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoU2VnTGlzdDsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTVkdQYXRoRWxlbWVudC5wcm90b3R5cGUsIFwiYW5pbWF0ZWROb3JtYWxpemVkUGF0aFNlZ0xpc3RcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoU2VnTGlzdDsgfSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgLy8gUHJvY2VzcyBhbnkgcGVuZGluZyBtdXRhdGlvbnMgdG8gdGhlIHBhdGggZWxlbWVudCBhbmQgdXBkYXRlIHRoZSBsaXN0IGFzIG5lZWRlZC5cbiAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdCBjYWxsIG9mIGFsbCBwdWJsaWMgZnVuY3Rpb25zIGFuZCBpcyBuZWVkZWQgYmVjYXVzZVxuICAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlcnMgYXJlIG5vdCBzeW5jaHJvbm91cyBzbyB3ZSBjYW4gaGF2ZSBwZW5kaW5nIGFzeW5jaHJvbm91cyBtdXRhdGlvbnMuXG4gICAgICAgICBTVkdQYXRoU2VnTGlzdC5wcm90b3R5cGUuX2NoZWNrUGF0aFN5bmNocm9uaXplZFRvTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxpc3RGcm9tUGF0aE11dGF0aW9ucyh0aGlzLl9wYXRoRWxlbWVudE11dGF0aW9uT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7XG4gICAgICAgICB9XG5cbiAgICAgICAgIFNWR1BhdGhTZWdMaXN0LnByb3RvdHlwZS5fdXBkYXRlTGlzdEZyb21QYXRoTXV0YXRpb25zID0gZnVuY3Rpb24obXV0YXRpb25SZWNvcmRzKSB7XG4gICAgICAgICAgICAgaWYgKCF0aGlzLl9wYXRoRWxlbWVudClcbiAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgIHZhciBoYXNQYXRoTXV0YXRpb25zID0gZmFsc2U7XG4gICAgICAgICAgICAgbXV0YXRpb25SZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuYXR0cmlidXRlTmFtZSA9PSBcImRcIilcbiAgICAgICAgICAgICAgICAgICAgIGhhc1BhdGhNdXRhdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgIGlmIChoYXNQYXRoTXV0YXRpb25zKVxuICAgICAgICAgICAgICAgICB0aGlzLl9saXN0ID0gdGhpcy5fcGFyc2VQYXRoKHRoaXMuX3BhdGhFbGVtZW50LmdldEF0dHJpYnV0ZShcImRcIikpO1xuICAgICAgICAgfVxuXG4gICAgICAgICAvLyBTZXJpYWxpemUgdGhlIGxpc3QgYW5kIHVwZGF0ZSB0aGUgcGF0aCdzICdkJyBhdHRyaWJ1dGUuXG4gICAgICAgICBTVkdQYXRoU2VnTGlzdC5wcm90b3R5cGUuX3dyaXRlTGlzdFRvUGF0aCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgIHRoaXMuX3BhdGhFbGVtZW50TXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgdGhpcy5fcGF0aEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZFwiLCBTVkdQYXRoU2VnTGlzdC5fcGF0aFNlZ0FycmF5QXNTdHJpbmcodGhpcy5fbGlzdCkpO1xuICAgICAgICAgICAgIHRoaXMuX3BhdGhFbGVtZW50TXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuX3BhdGhFbGVtZW50LCB0aGlzLl9tdXRhdGlvbk9ic2VydmVyQ29uZmlnKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgLy8gV2hlbiBhIHBhdGggc2VnbWVudCBjaGFuZ2VzIHRoZSBsaXN0IG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZCBiYWNrIHRvIHRoZSBwYXRoIGVsZW1lbnQuXG4gICAgICAgICBTVkdQYXRoU2VnTGlzdC5wcm90b3R5cGUuc2VnbWVudENoYW5nZWQgPSBmdW5jdGlvbihwYXRoU2VnKSB7XG4gICAgICAgICAgICAgdGhpcy5fd3JpdGVMaXN0VG9QYXRoKCk7XG4gICAgICAgICB9XG5cbiAgICAgICAgIFNWR1BhdGhTZWdMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgIHRoaXMuX2NoZWNrUGF0aFN5bmNocm9uaXplZFRvTGlzdCgpO1xuXG4gICAgICAgICAgICAgdGhpcy5fbGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHBhdGhTZWcpIHtcbiAgICAgICAgICAgICAgICAgcGF0aFNlZy5fb3duaW5nUGF0aFNlZ0xpc3QgPSBudWxsO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgIHRoaXMuX2xpc3QgPSBbXTtcbiAgICAgICAgICAgICB0aGlzLl93cml0ZUxpc3RUb1BhdGgoKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgU1ZHUGF0aFNlZ0xpc3QucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbihuZXdJdGVtKSB7XG4gICAgICAgICAgICAgdGhpcy5fY2hlY2tQYXRoU3luY2hyb25pemVkVG9MaXN0KCk7XG5cbiAgICAgICAgICAgICB0aGlzLl9saXN0ID0gW25ld0l0ZW1dO1xuICAgICAgICAgICAgIG5ld0l0ZW0uX293bmluZ1BhdGhTZWdMaXN0ID0gdGhpcztcbiAgICAgICAgICAgICB0aGlzLl93cml0ZUxpc3RUb1BhdGgoKTtcbiAgICAgICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgICAgIH1cblxuICAgICAgICAgU1ZHUGF0aFNlZ0xpc3QucHJvdG90eXBlLl9jaGVja1ZhbGlkSW5kZXggPSBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICAgICAgIGlmIChpc05hTihpbmRleCkgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubnVtYmVyT2ZJdGVtcylcbiAgICAgICAgICAgICAgICAgdGhyb3cgXCJJTkRFWF9TSVpFX0VSUlwiO1xuICAgICAgICAgfVxuXG4gICAgICAgICBTVkdQYXRoU2VnTGlzdC5wcm90b3R5cGUuZ2V0SXRlbSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgICAgICAgdGhpcy5fY2hlY2tQYXRoU3luY2hyb25pemVkVG9MaXN0KCk7XG5cbiAgICAgICAgICAgICB0aGlzLl9jaGVja1ZhbGlkSW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgIHJldHVybiB0aGlzLl9saXN0W2luZGV4XTtcbiAgICAgICAgIH1cblxuICAgICAgICAgU1ZHUGF0aFNlZ0xpc3QucHJvdG90eXBlLmluc2VydEl0ZW1CZWZvcmUgPSBmdW5jdGlvbihuZXdJdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgIHRoaXMuX2NoZWNrUGF0aFN5bmNocm9uaXplZFRvTGlzdCgpO1xuXG4gICAgICAgICAgICAgLy8gU3BlYzogSWYgdGhlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBudW1iZXJPZkl0ZW1zLCB0aGVuIHRoZSBuZXcgaXRlbSBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgIGlmIChpbmRleCA+IHRoaXMubnVtYmVyT2ZJdGVtcylcbiAgICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLm51bWJlck9mSXRlbXM7XG4gICAgICAgICAgICAgaWYgKG5ld0l0ZW0uX293bmluZ1BhdGhTZWdMaXN0KSB7XG4gICAgICAgICAgICAgICAgIC8vIFNWRzIgc3BlYyBzYXlzIHRvIG1ha2UgYSBjb3B5LlxuICAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3SXRlbS5jbG9uZSgpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB0aGlzLl9saXN0LnNwbGljZShpbmRleCwgMCwgbmV3SXRlbSk7XG4gICAgICAgICAgICAgbmV3SXRlbS5fb3duaW5nUGF0aFNlZ0xpc3QgPSB0aGlzO1xuICAgICAgICAgICAgIHRoaXMuX3dyaXRlTGlzdFRvUGF0aCgpO1xuICAgICAgICAgICAgIHJldHVybiBuZXdJdGVtO1xuICAgICAgICAgfVxuXG4gICAgICAgICBTVkdQYXRoU2VnTGlzdC5wcm90b3R5cGUucmVwbGFjZUl0ZW0gPSBmdW5jdGlvbihuZXdJdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgIHRoaXMuX2NoZWNrUGF0aFN5bmNocm9uaXplZFRvTGlzdCgpO1xuXG4gICAgICAgICAgICAgaWYgKG5ld0l0ZW0uX293bmluZ1BhdGhTZWdMaXN0KSB7XG4gICAgICAgICAgICAgICAgIC8vIFNWRzIgc3BlYyBzYXlzIHRvIG1ha2UgYSBjb3B5LlxuICAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3SXRlbS5jbG9uZSgpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB0aGlzLl9jaGVja1ZhbGlkSW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgIHRoaXMuX2xpc3RbaW5kZXhdID0gbmV3SXRlbTtcbiAgICAgICAgICAgICBuZXdJdGVtLl9vd25pbmdQYXRoU2VnTGlzdCA9IHRoaXM7XG4gICAgICAgICAgICAgdGhpcy5fd3JpdGVMaXN0VG9QYXRoKCk7XG4gICAgICAgICAgICAgcmV0dXJuIG5ld0l0ZW07XG4gICAgICAgICB9XG5cbiAgICAgICAgIFNWR1BhdGhTZWdMaXN0LnByb3RvdHlwZS5yZW1vdmVJdGVtID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgICB0aGlzLl9jaGVja1BhdGhTeW5jaHJvbml6ZWRUb0xpc3QoKTtcblxuICAgICAgICAgICAgIHRoaXMuX2NoZWNrVmFsaWRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl9saXN0W2luZGV4XTtcbiAgICAgICAgICAgICB0aGlzLl9saXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgdGhpcy5fd3JpdGVMaXN0VG9QYXRoKCk7XG4gICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICB9XG5cbiAgICAgICAgIFNWR1BhdGhTZWdMaXN0LnByb3RvdHlwZS5hcHBlbmRJdGVtID0gZnVuY3Rpb24obmV3SXRlbSkge1xuICAgICAgICAgICAgIHRoaXMuX2NoZWNrUGF0aFN5bmNocm9uaXplZFRvTGlzdCgpO1xuXG4gICAgICAgICAgICAgaWYgKG5ld0l0ZW0uX293bmluZ1BhdGhTZWdMaXN0KSB7XG4gICAgICAgICAgICAgICAgIC8vIFNWRzIgc3BlYyBzYXlzIHRvIG1ha2UgYSBjb3B5LlxuICAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3SXRlbS5jbG9uZSgpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB0aGlzLl9saXN0LnB1c2gobmV3SXRlbSk7XG4gICAgICAgICAgICAgbmV3SXRlbS5fb3duaW5nUGF0aFNlZ0xpc3QgPSB0aGlzO1xuICAgICAgICAgICAgIC8vIFRPRE86IE9wdGltaXplIHRoaXMgdG8ganVzdCBhcHBlbmQgdG8gdGhlIGV4aXN0aW5nIGF0dHJpYnV0ZS5cbiAgICAgICAgICAgICB0aGlzLl93cml0ZUxpc3RUb1BhdGgoKTtcbiAgICAgICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgICAgIH1cblxuICAgICAgICAgU1ZHUGF0aFNlZ0xpc3QuX3BhdGhTZWdBcnJheUFzU3RyaW5nID0gZnVuY3Rpb24ocGF0aFNlZ0FycmF5KSB7XG4gICAgICAgICAgICAgdmFyIHN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICBwYXRoU2VnQXJyYXkuZm9yRWFjaChmdW5jdGlvbihwYXRoU2VnKSB7XG4gICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBwYXRoU2VnLl9hc1BhdGhTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBcIiBcIiArIHBhdGhTZWcuX2FzUGF0aFN0cmluZygpO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgIH1cblxuICAgICAgICAgLy8gVGhpcyBjbG9zZWx5IGZvbGxvd3MgU1ZHUGF0aFBhcnNlcjo6cGFyc2VQYXRoIGZyb20gU291cmNlL2NvcmUvc3ZnL1NWR1BhdGhQYXJzZXIuY3BwLlxuICAgICAgICAgU1ZHUGF0aFNlZ0xpc3QucHJvdG90eXBlLl9wYXJzZVBhdGggPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgICBpZiAoIXN0cmluZyB8fCBzdHJpbmcubGVuZ3RoID09IDApXG4gICAgICAgICAgICAgICAgIHJldHVybiBbXTtcblxuICAgICAgICAgICAgIHZhciBvd25pbmdQYXRoU2VnTGlzdCA9IHRoaXM7XG5cbiAgICAgICAgICAgICB2YXIgQnVpbGRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICB0aGlzLnBhdGhTZWdMaXN0ID0gW107XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgQnVpbGRlci5wcm90b3R5cGUuYXBwZW5kU2VnbWVudCA9IGZ1bmN0aW9uKHBhdGhTZWcpIHtcbiAgICAgICAgICAgICAgICAgdGhpcy5wYXRoU2VnTGlzdC5wdXNoKHBhdGhTZWcpO1xuICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIHZhciBTb3VyY2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgdGhpcy5fc3RyaW5nID0gc3RyaW5nO1xuICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICB0aGlzLl9lbmRJbmRleCA9IHRoaXMuX3N0cmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ29tbWFuZCA9IFNWR1BhdGhTZWcuUEFUSFNFR19VTktOT1dOO1xuXG4gICAgICAgICAgICAgICAgIHRoaXMuX3NraXBPcHRpb25hbFNwYWNlcygpO1xuICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIFNvdXJjZS5wcm90b3R5cGUuX2lzQ3VycmVudFNwYWNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIHZhciBjaGFyYWN0ZXIgPSB0aGlzLl9zdHJpbmdbdGhpcy5fY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJhY3RlciA8PSBcIiBcIiAmJiAoY2hhcmFjdGVyID09IFwiIFwiIHx8IGNoYXJhY3RlciA9PSBcIlxcblwiIHx8IGNoYXJhY3RlciA9PSBcIlxcdFwiIHx8IGNoYXJhY3RlciA9PSBcIlxcclwiIHx8IGNoYXJhY3RlciA9PSBcIlxcZlwiKTtcbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBTb3VyY2UucHJvdG90eXBlLl9za2lwT3B0aW9uYWxTcGFjZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnJlbnRJbmRleCA8IHRoaXMuX2VuZEluZGV4ICYmIHRoaXMuX2lzQ3VycmVudFNwYWNlKCkpXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRJbmRleCA8IHRoaXMuX2VuZEluZGV4O1xuICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIFNvdXJjZS5wcm90b3R5cGUuX3NraXBPcHRpb25hbFNwYWNlc09yRGVsaW1pdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5kZXggPCB0aGlzLl9lbmRJbmRleCAmJiAhdGhpcy5faXNDdXJyZW50U3BhY2UoKSAmJiB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCkgIT0gXCIsXCIpXG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9za2lwT3B0aW9uYWxTcGFjZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRJbmRleCA8IHRoaXMuX2VuZEluZGV4ICYmIHRoaXMuX3N0cmluZy5jaGFyQXQodGhpcy5fY3VycmVudEluZGV4KSA9PSBcIixcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraXBPcHRpb25hbFNwYWNlcygpO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50SW5kZXggPCB0aGlzLl9lbmRJbmRleDtcbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBTb3VyY2UucHJvdG90eXBlLmhhc01vcmVEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50SW5kZXggPCB0aGlzLl9lbmRJbmRleDtcbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBTb3VyY2UucHJvdG90eXBlLnBlZWtTZWdtZW50VHlwZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICB2YXIgbG9va2FoZWFkID0gdGhpcy5fc3RyaW5nW3RoaXMuX2N1cnJlbnRJbmRleF07XG4gICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXRoU2VnVHlwZUZyb21DaGFyKGxvb2thaGVhZCk7XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgU291cmNlLnByb3RvdHlwZS5fcGF0aFNlZ1R5cGVGcm9tQ2hhciA9IGZ1bmN0aW9uKGxvb2thaGVhZCkge1xuICAgICAgICAgICAgICAgICBzd2l0Y2ggKGxvb2thaGVhZCkge1xuICAgICAgICAgICAgICAgICBjYXNlIFwiWlwiOlxuICAgICAgICAgICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNWR1BhdGhTZWcuUEFUSFNFR19DTE9TRVBBVEg7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19BQlM7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19SRUw7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19BQlM7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJsXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19SRUw7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJDXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fQ1VCSUNfQUJTO1xuICAgICAgICAgICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX1JFTDtcbiAgICAgICAgICAgICAgICAgY2FzZSBcIlFcIjpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfQUJTO1xuICAgICAgICAgICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19SRUw7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJBXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0FSQ19BQlM7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0FSQ19SRUw7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19IT1JJWk9OVEFMX0FCUztcbiAgICAgICAgICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX0hPUklaT05UQUxfUkVMO1xuICAgICAgICAgICAgICAgICBjYXNlIFwiVlwiOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNWR1BhdGhTZWcuUEFUSFNFR19MSU5FVE9fVkVSVElDQUxfQUJTO1xuICAgICAgICAgICAgICAgICBjYXNlIFwidlwiOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNWR1BhdGhTZWcuUEFUSFNFR19MSU5FVE9fVkVSVElDQUxfUkVMO1xuICAgICAgICAgICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX1NNT09USF9BQlM7XG4gICAgICAgICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fQ1VCSUNfU01PT1RIX1JFTDtcbiAgICAgICAgICAgICAgICAgY2FzZSBcIlRcIjpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfU01PT1RIX0FCUztcbiAgICAgICAgICAgICAgICAgY2FzZSBcInRcIjpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfU01PT1RIX1JFTDtcbiAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVkdQYXRoU2VnLlBBVEhTRUdfVU5LTk9XTjtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIFNvdXJjZS5wcm90b3R5cGUuX25leHRDb21tYW5kSGVscGVyID0gZnVuY3Rpb24obG9va2FoZWFkLCBwcmV2aW91c0NvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlbWFpbmluZyBjb29yZGluYXRlcyBpbiB0aGUgY3VycmVudCBjb21tYW5kLlxuICAgICAgICAgICAgICAgICBpZiAoKGxvb2thaGVhZCA9PSBcIitcIiB8fCBsb29rYWhlYWQgPT0gXCItXCIgfHwgbG9va2FoZWFkID09IFwiLlwiIHx8IChsb29rYWhlYWQgPj0gXCIwXCIgJiYgbG9va2FoZWFkIDw9IFwiOVwiKSkgJiYgcHJldmlvdXNDb21tYW5kICE9IFNWR1BhdGhTZWcuUEFUSFNFR19DTE9TRVBBVEgpIHtcbiAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NvbW1hbmQgPT0gU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19BQlMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNWR1BhdGhTZWcuUEFUSFNFR19MSU5FVE9fQUJTO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29tbWFuZCA9PSBTVkdQYXRoU2VnLlBBVEhTRUdfTU9WRVRPX1JFTClcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19SRUw7XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNDb21tYW5kO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHJldHVybiBTVkdQYXRoU2VnLlBBVEhTRUdfVU5LTk9XTjtcbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBTb3VyY2UucHJvdG90eXBlLmluaXRpYWxDb21tYW5kSXNNb3ZlVG8gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBhdGggaXMgZW1wdHkgaXQgaXMgc3RpbGwgdmFsaWQsIHNvIHJldHVybiB0cnVlLlxuICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzTW9yZURhdGEoKSlcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICB2YXIgY29tbWFuZCA9IHRoaXMucGVla1NlZ21lbnRUeXBlKCk7XG4gICAgICAgICAgICAgICAgIC8vIFBhdGggbXVzdCBzdGFydCB3aXRoIG1vdmVUby5cbiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQgPT0gU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19BQlMgfHwgY29tbWFuZCA9PSBTVkdQYXRoU2VnLlBBVEhTRUdfTU9WRVRPX1JFTDtcbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAvLyBQYXJzZSBhIG51bWJlciBmcm9tIGFuIFNWRyBwYXRoLiBUaGlzIHZlcnkgY2xvc2VseSBmb2xsb3dzIGdlbmVyaWNQYXJzZU51bWJlciguLi4pIGZyb20gU291cmNlL2NvcmUvc3ZnL1NWR1BhcnNlclV0aWxpdGllcy5jcHAuXG4gICAgICAgICAgICAgLy8gU3BlYzogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvc2luZ2xlLXBhZ2UuaHRtbCNwYXRocy1QYXRoRGF0YUJORlxuICAgICAgICAgICAgIFNvdXJjZS5wcm90b3R5cGUuX3BhcnNlTnVtYmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIHZhciBleHBvbmVudCA9IDA7XG4gICAgICAgICAgICAgICAgIHZhciBpbnRlZ2VyID0gMDtcbiAgICAgICAgICAgICAgICAgdmFyIGZyYWMgPSAxO1xuICAgICAgICAgICAgICAgICB2YXIgZGVjaW1hbCA9IDA7XG4gICAgICAgICAgICAgICAgIHZhciBzaWduID0gMTtcbiAgICAgICAgICAgICAgICAgdmFyIGV4cHNpZ24gPSAxO1xuXG4gICAgICAgICAgICAgICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5fY3VycmVudEluZGV4O1xuXG4gICAgICAgICAgICAgICAgIHRoaXMuX3NraXBPcHRpb25hbFNwYWNlcygpO1xuXG4gICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHNpZ24uXG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5kZXggPCB0aGlzLl9lbmRJbmRleCAmJiB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCkgPT0gXCIrXCIpXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fY3VycmVudEluZGV4IDwgdGhpcy5fZW5kSW5kZXggJiYgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpID09IFwiLVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAtMTtcbiAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5kZXggPT0gdGhpcy5fZW5kSW5kZXggfHwgKCh0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCkgPCBcIjBcIiB8fCB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCkgPiBcIjlcIikgJiYgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpICE9IFwiLlwiKSlcbiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBudW1iZXIgbXVzdCBiZSBvbmUgb2YgWzAtOSstLl0uXG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGludGVnZXIgcGFydCwgYnVpbGQgcmlnaHQtdG8tbGVmdC5cbiAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0SW50UGFydEluZGV4ID0gdGhpcy5fY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fY3VycmVudEluZGV4IDwgdGhpcy5fZW5kSW5kZXggJiYgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpID49IFwiMFwiICYmIHRoaXMuX3N0cmluZy5jaGFyQXQodGhpcy5fY3VycmVudEluZGV4KSA8PSBcIjlcIilcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCsrOyAvLyBBZHZhbmNlIHRvIGZpcnN0IG5vbi1kaWdpdC5cblxuICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudEluZGV4ICE9IHN0YXJ0SW50UGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbkludFBhcnRJbmRleCA9IHRoaXMuX2N1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICB2YXIgbXVsdGlwbGllciA9IDE7XG4gICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2NhbkludFBhcnRJbmRleCA+PSBzdGFydEludFBhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIgKz0gbXVsdGlwbGllciAqICh0aGlzLl9zdHJpbmcuY2hhckF0KHNjYW5JbnRQYXJ0SW5kZXgtLSkgLSBcIjBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllciAqPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGRlY2ltYWxzLlxuICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudEluZGV4IDwgdGhpcy5fZW5kSW5kZXggJiYgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpID09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXgrKztcblxuICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhIGxlYXN0IG9uZSBkaWdpdCBmb2xsb3dpbmcgdGhlIC5cbiAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5kZXggPj0gdGhpcy5fZW5kSW5kZXggfHwgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpIDwgXCIwXCIgfHwgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpID4gXCI5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50SW5kZXggPCB0aGlzLl9lbmRJbmRleCAmJiB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCkgPj0gXCIwXCIgJiYgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpIDw9IFwiOVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgKz0gKHRoaXMuX3N0cmluZy5jaGFyQXQodGhpcy5fY3VycmVudEluZGV4KyspIC0gXCIwXCIpICogKGZyYWMgKj0gMC4xKTtcbiAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGV4cG9uZW50IHBhcnQuXG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5kZXggIT0gc3RhcnRJbmRleCAmJiB0aGlzLl9jdXJyZW50SW5kZXggKyAxIDwgdGhpcy5fZW5kSW5kZXggJiYgKHRoaXMuX3N0cmluZy5jaGFyQXQodGhpcy5fY3VycmVudEluZGV4KSA9PSBcImVcIiB8fCB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCkgPT0gXCJFXCIpICYmICh0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCArIDEpICE9IFwieFwiICYmIHRoaXMuX3N0cmluZy5jaGFyQXQodGhpcy5fY3VycmVudEluZGV4ICsgMSkgIT0gXCJtXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXgrKztcblxuICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgc2lnbiBvZiB0aGUgZXhwb25lbnQuXG4gICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpID09IFwiK1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3N0cmluZy5jaGFyQXQodGhpcy5fY3VycmVudEluZGV4KSA9PSBcIi1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHNpZ24gPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhbiBleHBvbmVudC5cbiAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5kZXggPj0gdGhpcy5fZW5kSW5kZXggfHwgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpIDwgXCIwXCIgfHwgdGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpID4gXCI5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnJlbnRJbmRleCA8IHRoaXMuX2VuZEluZGV4ICYmIHRoaXMuX3N0cmluZy5jaGFyQXQodGhpcy5fY3VycmVudEluZGV4KSA+PSBcIjBcIiAmJiB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCkgPD0gXCI5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudCAqPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudCArPSAodGhpcy5fc3RyaW5nLmNoYXJBdCh0aGlzLl9jdXJyZW50SW5kZXgpIC0gXCIwXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgdmFyIG51bWJlciA9IGludGVnZXIgKyBkZWNpbWFsO1xuICAgICAgICAgICAgICAgICBudW1iZXIgKj0gc2lnbjtcblxuICAgICAgICAgICAgICAgICBpZiAoZXhwb25lbnQpXG4gICAgICAgICAgICAgICAgICAgICBudW1iZXIgKj0gTWF0aC5wb3coMTAsIGV4cHNpZ24gKiBleHBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT0gdGhpcy5fY3VycmVudEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICB0aGlzLl9za2lwT3B0aW9uYWxTcGFjZXNPckRlbGltaXRlcigpO1xuXG4gICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgU291cmNlLnByb3RvdHlwZS5fcGFyc2VBcmNGbGFnID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50SW5kZXggPj0gdGhpcy5fZW5kSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICB2YXIgZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICB2YXIgZmxhZ0NoYXIgPSB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX2N1cnJlbnRJbmRleCsrKTtcbiAgICAgICAgICAgICAgICAgaWYgKGZsYWdDaGFyID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICBlbHNlIGlmIChmbGFnQ2hhciA9PSBcIjFcIilcbiAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgIHRoaXMuX3NraXBPcHRpb25hbFNwYWNlc09yRGVsaW1pdGVyKCk7XG4gICAgICAgICAgICAgICAgIHJldHVybiBmbGFnO1xuICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIFNvdXJjZS5wcm90b3R5cGUucGFyc2VTZWdtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIHZhciBsb29rYWhlYWQgPSB0aGlzLl9zdHJpbmdbdGhpcy5fY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSB0aGlzLl9wYXRoU2VnVHlwZUZyb21DaGFyKGxvb2thaGVhZCk7XG4gICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09IFNWR1BhdGhTZWcuUEFUSFNFR19VTktOT1dOKSB7XG4gICAgICAgICAgICAgICAgICAgICAvLyBQb3NzaWJseSBhbiBpbXBsaWNpdCBjb21tYW5kLiBOb3QgYWxsb3dlZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjb21tYW5kLlxuICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzQ29tbWFuZCA9PSBTVkdQYXRoU2VnLlBBVEhTRUdfVU5LTk9XTilcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB0aGlzLl9uZXh0Q29tbWFuZEhlbHBlcihsb29rYWhlYWQsIHRoaXMuX3ByZXZpb3VzQ29tbWFuZCk7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBTVkdQYXRoU2VnLlBBVEhTRUdfVU5LTk9XTilcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleCsrO1xuICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNDb21tYW5kID0gY29tbWFuZDtcblxuICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfTU9WRVRPX1JFTDpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1ZHUGF0aFNlZ01vdmV0b1JlbChvd25pbmdQYXRoU2VnTGlzdCwgdGhpcy5fcGFyc2VOdW1iZXIoKSwgdGhpcy5fcGFyc2VOdW1iZXIoKSk7XG4gICAgICAgICAgICAgICAgIGNhc2UgU1ZHUGF0aFNlZy5QQVRIU0VHX01PVkVUT19BQlM6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNWR1BhdGhTZWdNb3ZldG9BYnMob3duaW5nUGF0aFNlZ0xpc3QsIHRoaXMuX3BhcnNlTnVtYmVyKCksIHRoaXMuX3BhcnNlTnVtYmVyKCkpO1xuICAgICAgICAgICAgICAgICBjYXNlIFNWR1BhdGhTZWcuUEFUSFNFR19MSU5FVE9fUkVMOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnTGluZXRvUmVsKG93bmluZ1BhdGhTZWdMaXN0LCB0aGlzLl9wYXJzZU51bWJlcigpLCB0aGlzLl9wYXJzZU51bWJlcigpKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX0FCUzpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b0Ficyhvd25pbmdQYXRoU2VnTGlzdCwgdGhpcy5fcGFyc2VOdW1iZXIoKSwgdGhpcy5fcGFyc2VOdW1iZXIoKSk7XG4gICAgICAgICAgICAgICAgIGNhc2UgU1ZHUGF0aFNlZy5QQVRIU0VHX0xJTkVUT19IT1JJWk9OVEFMX1JFTDpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwob3duaW5nUGF0aFNlZ0xpc3QsIHRoaXMuX3BhcnNlTnVtYmVyKCkpO1xuICAgICAgICAgICAgICAgICBjYXNlIFNWR1BhdGhTZWcuUEFUSFNFR19MSU5FVE9fSE9SSVpPTlRBTF9BQlM6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzKG93bmluZ1BhdGhTZWdMaXN0LCB0aGlzLl9wYXJzZU51bWJlcigpKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX1JFTDpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsUmVsKG93bmluZ1BhdGhTZWdMaXN0LCB0aGlzLl9wYXJzZU51bWJlcigpKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX0FCUzpcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzKG93bmluZ1BhdGhTZWdMaXN0LCB0aGlzLl9wYXJzZU51bWJlcigpKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfQ0xPU0VQQVRIOlxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2tpcE9wdGlvbmFsU3BhY2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNWR1BhdGhTZWdDbG9zZVBhdGgob3duaW5nUGF0aFNlZ0xpc3QpO1xuICAgICAgICAgICAgICAgICBjYXNlIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX0NVQklDX1JFTDpcbiAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSB7eDE6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHkxOiB0aGlzLl9wYXJzZU51bWJlcigpLCB4MjogdGhpcy5fcGFyc2VOdW1iZXIoKSwgeTI6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHg6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHk6IHRoaXMuX3BhcnNlTnVtYmVyKCl9O1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsKG93bmluZ1BhdGhTZWdMaXN0LCBwb2ludHMueCwgcG9pbnRzLnksIHBvaW50cy54MSwgcG9pbnRzLnkxLCBwb2ludHMueDIsIHBvaW50cy55Mik7XG4gICAgICAgICAgICAgICAgIGNhc2UgU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fQ1VCSUNfQUJTOlxuICAgICAgICAgICAgICAgICAgICAgdmFyIHBvaW50cyA9IHt4MTogdGhpcy5fcGFyc2VOdW1iZXIoKSwgeTE6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHgyOiB0aGlzLl9wYXJzZU51bWJlcigpLCB5MjogdGhpcy5fcGFyc2VOdW1iZXIoKSwgeDogdGhpcy5fcGFyc2VOdW1iZXIoKSwgeTogdGhpcy5fcGFyc2VOdW1iZXIoKX07XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnMob3duaW5nUGF0aFNlZ0xpc3QsIHBvaW50cy54LCBwb2ludHMueSwgcG9pbnRzLngxLCBwb2ludHMueTEsIHBvaW50cy54MiwgcG9pbnRzLnkyKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19DVUJJQ19TTU9PVEhfUkVMOlxuICAgICAgICAgICAgICAgICAgICAgdmFyIHBvaW50cyA9IHt4MjogdGhpcy5fcGFyc2VOdW1iZXIoKSwgeTI6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHg6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHk6IHRoaXMuX3BhcnNlTnVtYmVyKCl9O1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoUmVsKG93bmluZ1BhdGhTZWdMaXN0LCBwb2ludHMueCwgcG9pbnRzLnksIHBvaW50cy54MiwgcG9pbnRzLnkyKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19DVUJJQ19TTU9PVEhfQUJTOlxuICAgICAgICAgICAgICAgICAgICAgdmFyIHBvaW50cyA9IHt4MjogdGhpcy5fcGFyc2VOdW1iZXIoKSwgeTI6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHg6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHk6IHRoaXMuX3BhcnNlTnVtYmVyKCl9O1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzKG93bmluZ1BhdGhTZWdMaXN0LCBwb2ludHMueCwgcG9pbnRzLnksIHBvaW50cy54MiwgcG9pbnRzLnkyKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfUkVMOlxuICAgICAgICAgICAgICAgICAgICAgdmFyIHBvaW50cyA9IHt4MTogdGhpcy5fcGFyc2VOdW1iZXIoKSwgeTE6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHg6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHk6IHRoaXMuX3BhcnNlTnVtYmVyKCl9O1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbChvd25pbmdQYXRoU2VnTGlzdCwgcG9pbnRzLngsIHBvaW50cy55LCBwb2ludHMueDEsIHBvaW50cy55MSk7XG4gICAgICAgICAgICAgICAgIGNhc2UgU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX0FCUzpcbiAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSB7eDE6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHkxOiB0aGlzLl9wYXJzZU51bWJlcigpLCB4OiB0aGlzLl9wYXJzZU51bWJlcigpLCB5OiB0aGlzLl9wYXJzZU51bWJlcigpfTtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMob3duaW5nUGF0aFNlZ0xpc3QsIHBvaW50cy54LCBwb2ludHMueSwgcG9pbnRzLngxLCBwb2ludHMueTEpO1xuICAgICAgICAgICAgICAgICBjYXNlIFNWR1BhdGhTZWcuUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19TTU9PVEhfUkVMOlxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aFJlbChvd25pbmdQYXRoU2VnTGlzdCwgdGhpcy5fcGFyc2VOdW1iZXIoKSwgdGhpcy5fcGFyc2VOdW1iZXIoKSk7XG4gICAgICAgICAgICAgICAgIGNhc2UgU1ZHUGF0aFNlZy5QQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX1NNT09USF9BQlM6XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoQWJzKG93bmluZ1BhdGhTZWdMaXN0LCB0aGlzLl9wYXJzZU51bWJlcigpLCB0aGlzLl9wYXJzZU51bWJlcigpKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfQVJDX1JFTDpcbiAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSB7eDE6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHkxOiB0aGlzLl9wYXJzZU51bWJlcigpLCBhcmNBbmdsZTogdGhpcy5fcGFyc2VOdW1iZXIoKSwgYXJjTGFyZ2U6IHRoaXMuX3BhcnNlQXJjRmxhZygpLCBhcmNTd2VlcDogdGhpcy5fcGFyc2VBcmNGbGFnKCksIHg6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHk6IHRoaXMuX3BhcnNlTnVtYmVyKCl9O1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQXJjUmVsKG93bmluZ1BhdGhTZWdMaXN0LCBwb2ludHMueCwgcG9pbnRzLnksIHBvaW50cy54MSwgcG9pbnRzLnkxLCBwb2ludHMuYXJjQW5nbGUsIHBvaW50cy5hcmNMYXJnZSwgcG9pbnRzLmFyY1N3ZWVwKTtcbiAgICAgICAgICAgICAgICAgY2FzZSBTVkdQYXRoU2VnLlBBVEhTRUdfQVJDX0FCUzpcbiAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSB7eDE6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHkxOiB0aGlzLl9wYXJzZU51bWJlcigpLCBhcmNBbmdsZTogdGhpcy5fcGFyc2VOdW1iZXIoKSwgYXJjTGFyZ2U6IHRoaXMuX3BhcnNlQXJjRmxhZygpLCBhcmNTd2VlcDogdGhpcy5fcGFyc2VBcmNGbGFnKCksIHg6IHRoaXMuX3BhcnNlTnVtYmVyKCksIHk6IHRoaXMuX3BhcnNlTnVtYmVyKCl9O1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTVkdQYXRoU2VnQXJjQWJzKG93bmluZ1BhdGhTZWdMaXN0LCBwb2ludHMueCwgcG9pbnRzLnksIHBvaW50cy54MSwgcG9pbnRzLnkxLCBwb2ludHMuYXJjQW5nbGUsIHBvaW50cy5hcmNMYXJnZSwgcG9pbnRzLmFyY1N3ZWVwKTtcbiAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgIHRocm93IFwiVW5rbm93biBwYXRoIHNlZyB0eXBlLlwiXG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICAgdmFyIHNvdXJjZSA9IG5ldyBTb3VyY2Uoc3RyaW5nKTtcblxuICAgICAgICAgICAgIGlmICghc291cmNlLmluaXRpYWxDb21tYW5kSXNNb3ZlVG8oKSlcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgIHdoaWxlIChzb3VyY2UuaGFzTW9yZURhdGEoKSkge1xuICAgICAgICAgICAgICAgICB2YXIgcGF0aFNlZyA9IHNvdXJjZS5wYXJzZVNlZ21lbnQoKTtcbiAgICAgICAgICAgICAgICAgaWYgKCFwYXRoU2VnKVxuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZFNlZ21lbnQocGF0aFNlZyk7XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIucGF0aFNlZ0xpc3Q7XG4gICAgICAgICB9XG4gICAgIH1cbiAgICB9KCkpO1xuXG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFwiYzNcIiwgW1wiZDNcIl0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGMzOyB9KTtcbiAgICB9IGVsc2UgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgZXhwb3J0cyAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGMzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5jMyA9IGMzO1xuICAgIH1cblxufSkod2luZG93KTtcbiIsImFuZ3VsYXIubW9kdWxlKCd3YXRjaG1lbkNvbnRyb2xsZXJzJywgW10pOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcblxyXG4gIHZhciB3YXRjaG1lbkNvbnRyb2xsZXJzID0gYW5ndWxhci5tb2R1bGUoJ3dhdGNobWVuQ29udHJvbGxlcnMnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHNlcnZpY2VcclxuICAgKi9cclxuXHJcbiAgd2F0Y2htZW5Db250cm9sbGVycy5jb250cm9sbGVyKCdTZXJ2aWNlQWRkQ3RybCcsXHJcbiAgICBmdW5jdGlvbiAoXHJcbiAgICAgICAgJHNjb3BlLFxyXG4gICAgICAgICRzdGF0ZSxcclxuICAgICAgICAkZmlsdGVyLFxyXG4gICAgICAgICRzdGF0ZVBhcmFtcyxcclxuICAgICAgICBTZXJ2aWNlLFxyXG4gICAgICAgIFJlcG9ydFxyXG4gICAgKSB7XHJcbiAgICAgICRzY29wZS5zZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTtcclxuXHJcbiAgICAgICRzY29wZS5lZGl0U2VydmljZVRpdGxlID0gXCJOZXcgc2VydmljZVwiO1xyXG4gICAgICAvLyBkZWZhdWx0c1xyXG4gICAgICAkc2NvcGUuc2VydmljZS50aW1lb3V0ID0gMTAwMDA7XHJcbiAgICAgICRzY29wZS5zZXJ2aWNlLndhcm5pbmdUaHJlc2hvbGQgPSA1MDAwO1xyXG4gICAgICAkc2NvcGUuc2VydmljZS5pbnRlcnZhbCA9IDYwMDAwO1xyXG4gICAgICAkc2NvcGUuc2VydmljZS5mYWlsdXJlSW50ZXJ2YWwgPSAzMDAwMDtcclxuICAgICAgJHNjb3BlLnNlcnZpY2UuZmFpbHVyZXNUb0JlT3V0YWdlID0gMTtcclxuICAgICAgJHNjb3BlLnNlcnZpY2UucG9ydCA9IDgwO1xyXG4gICAgICAkc2NvcGUuc2VydmljZS5waW5nU2VydmljZU5hbWUgPSAnaHR0cC1oZWFkJztcclxuXHJcbiAgICAgICRzY29wZS5zYXZlID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAkc2NvcGUuc2VydmljZS5waW5nU2VydmljZU9wdGlvbnMgPSB7fTtcclxuICAgICAgICAkc2NvcGUuc2VydmljZS5waW5nU2VydmljZU9wdGlvbnNbJHNjb3BlLnNlcnZpY2UucGluZ1NlcnZpY2VOYW1lXSA9ICRzY29wZS5zZWxlY3RlZFBpbmdTZXJ2aWNlT3B0aW9ucztcclxuXHJcbiAgICAgICAgJHNjb3BlLnNlcnZpY2UuJHNhdmUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgUmVwb3J0LmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgICRzdGF0ZS5nbygnc2VydmljZXMnKTtcclxuICAgICAgICB9LCBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEuZXJyb3JzKSB7XHJcbiAgICAgICAgICAgICRzY29wZS5zZXJ2aWNlQWRkRXJyb3JzID0gcmVzcG9uc2UuZGF0YS5lcnJvcnM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAkc2NvcGUuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICRzdGF0ZS5nbygnc2VydmljZXMnKTtcclxuICAgICAgfTtcclxuXHJcbiAgICB9KTtcclxuXHJcbn0pKCk7XHJcbiIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcblxyXG4gIHZhciB3YXRjaG1lbkNvbnRyb2xsZXJzID0gYW5ndWxhci5tb2R1bGUoJ3dhdGNobWVuQ29udHJvbGxlcnMnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2VydmljZSBkZXRhaWxzXHJcbiAgICovXHJcblxyXG4gIHdhdGNobWVuQ29udHJvbGxlcnMuY29udHJvbGxlcignU2VydmljZURldGFpbEN0cmwnLFxyXG5cclxuICAgIGZ1bmN0aW9uIChcclxuICAgICAgICAkc2NvcGUsXHJcbiAgICAgICAgJGZpbHRlcixcclxuICAgICAgICAkc3RhdGVQYXJhbXMsXHJcbiAgICAgICAgUmVwb3J0LFxyXG4gICAgICAgIG5nVGFibGVVdGlscyxcclxuICAgICAgICB1c1NwaW5uZXJTZXJ2aWNlLFxyXG4gICAgICAgICR0aW1lb3V0KSB7XHJcblxyXG4gICAgICBmdW5jdGlvbiBnZXRDaGFydFNpemUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtoZWlnaHQ6IDIwMCwgd2lkdGg6ICQoJy5jaGFydC1jb250YWluZXInKS53aWR0aCgpfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZnVuY3Rpb24gbG9hZGluZygpe1xyXG4gICAgICAgIHVzU3Bpbm5lclNlcnZpY2Uuc3Bpbignc3Bpbm5lci0xJyk7XHJcbiAgICAgICAgJHNjb3BlLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBsb2FkZWQoKXtcclxuICAgICAgICB1c1NwaW5uZXJTZXJ2aWNlLnN0b3AoJ3NwaW5uZXItMScpO1xyXG4gICAgICAgICRzY29wZS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGVyckhhbmRsZXIgKGVycil7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICBsb2FkZWQoKTtcclxuICAgICAgICB2YXIgbXNnID0gZXJyLnN0YXR1c1RleHQ7XHJcbiAgICAgICAgaWYgKGVyci5kYXRhICYmIGVyci5kYXRhLmVycm9yKXtcclxuICAgICAgICAgIG1zZyA9IGVyci5kYXRhLmVycm9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkc2NvcGUuZXJyb3JMb2FkaW5nU2VydmljZSA9IG1zZztcclxuICAgICAgfVxyXG5cclxuICAgICAgbG9hZGluZygpO1xyXG4gICAgICAkc2NvcGUuc2VydmljZURldGFpbHMgPSBSZXBvcnQuZ2V0KHtpZDogJHN0YXRlUGFyYW1zLmlkfSwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICBsb2FkZWQoKTtcclxuICAgICAgICAkc2NvcGUubGF0ZXN0T3V0YWdlcyA9IGRhdGEuc3RhdHVzLmxhdGVzdE91dGFnZXM7XHJcblxyXG4gICAgICAgIC8vIGNoYXJ0aW5nXHJcbiAgICAgICAgdmFyIGxhdGVuY3lMYXN0SG91ciA9IGRhdGEuc3RhdHVzLmxhc3RIb3VyLmxhdGVuY3k7XHJcbiAgICAgICAgdmFyIGxhdGVuY3lMYXN0MjRIb3VycyA9IGRhdGEuc3RhdHVzLmxhc3QyNEhvdXJzLmxhdGVuY3k7XHJcbiAgICAgICAgdmFyIGxhdGVuY3lMYXN0V2VlayA9IGRhdGEuc3RhdHVzLmxhc3RXZWVrLmxhdGVuY3k7XHJcblxyXG4gICAgICAgIHZhciBtYXhMYXN0SG91ciA9IF8ubWF4KGxhdGVuY3lMYXN0SG91ci5saXN0LCBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgbWF4TGFzdDI0SG91cnMgPSBfLm1heChsYXRlbmN5TGFzdDI0SG91cnMubGlzdCwgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgIHJldHVybiBpdGVtLmw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIG1heExhc3RXZWVrID0gXy5tYXgobGF0ZW5jeUxhc3RXZWVrLmxpc3QsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICByZXR1cm4gaXRlbS5sO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YXIgbWF4ID0gXy5tYXgoW21heExhc3RIb3VyLmwsIG1heExhc3QyNEhvdXJzLmwsIG1heExhc3RXZWVrLmxdKTtcclxuXHJcbiAgICAgICAgdmFyIGNoYXJ0cyA9IFtdO1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHZhciBjaGFydFNpemUgPSBnZXRDaGFydFNpemUoKTtcclxuICAgICAgICAgIGlmIChsYXRlbmN5TGFzdEhvdXIubGlzdC5sZW5ndGggPiAwKSB7IC8vIGF0IGxlYXN0IG9uZSBzdWNjZXNzZnVsIHBpbmdcclxuICAgICAgICAgICAgJHNjb3BlLnNob3dMYXN0SG91ckNoYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2hhcnRzLnB1c2goQ2hhcnRpbmcucmVuZGVyKHtcclxuICAgICAgICAgICAgICB0aHJlc2hvbGQ6IGRhdGEuc2VydmljZS53YXJuaW5nVGhyZXNob2xkLFxyXG4gICAgICAgICAgICAgIGxhdGVuY3k6IGxhdGVuY3lMYXN0SG91ci5saXN0LFxyXG4gICAgICAgICAgICAgIG91dGFnZXM6IGRhdGEuc3RhdHVzLmxhc3RIb3VyLm91dGFnZXMsXHJcbiAgICAgICAgICAgICAgaWQ6ICcjY2hhcnQtbGFzdC1ob3VyJyxcclxuICAgICAgICAgICAgICBzaXplOiBjaGFydFNpemUsXHJcbiAgICAgICAgICAgICAgbWF4OiBtYXhcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChsYXRlbmN5TGFzdDI0SG91cnMubGlzdC5sZW5ndGggPiA4KSB7XHJcbiAgICAgICAgICAgICRzY29wZS5zaG93TGFzdDI0Q2hhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICBjaGFydHMucHVzaChDaGFydGluZy5yZW5kZXIoe1xyXG4gICAgICAgICAgICAgIHRocmVzaG9sZDogZGF0YS5zZXJ2aWNlLndhcm5pbmdUaHJlc2hvbGQsXHJcbiAgICAgICAgICAgICAgbGF0ZW5jeTogbGF0ZW5jeUxhc3QyNEhvdXJzLmxpc3QsXHJcbiAgICAgICAgICAgICAgb3V0YWdlczogZGF0YS5zdGF0dXMubGFzdDI0SG91cnMub3V0YWdlcyxcclxuICAgICAgICAgICAgICBpZDogJyNjaGFydC1sYXN0LTI0LWhvdXJzJyxcclxuICAgICAgICAgICAgICBzaXplOiBjaGFydFNpemUsXHJcbiAgICAgICAgICAgICAgbWF4OiBtYXhcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChsYXRlbmN5TGFzdFdlZWsubGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICRzY29wZS5zaG93TGFzdFdlZWtDaGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNoYXJ0cy5wdXNoKENoYXJ0aW5nLnJlbmRlcih7XHJcbiAgICAgICAgICAgICAgdGhyZXNob2xkOiBkYXRhLnNlcnZpY2Uud2FybmluZ1RocmVzaG9sZCxcclxuICAgICAgICAgICAgICBsYXRlbmN5OiBsYXRlbmN5TGFzdFdlZWsubGlzdCxcclxuICAgICAgICAgICAgICBvdXRhZ2VzOiBkYXRhLnN0YXR1cy5sYXN0V2Vlay5vdXRhZ2VzLFxyXG4gICAgICAgICAgICAgIGlkOiAnI2NoYXJ0LWxhc3Qtd2VlaycsXHJcbiAgICAgICAgICAgICAgc2l6ZTogY2hhcnRTaXplLFxyXG4gICAgICAgICAgICAgIHhfZm9ybWF0OiAnJWQvJW0nLFxyXG4gICAgICAgICAgICAgIG1heDogbWF4XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBmdW5jdGlvbiBvbldpbmRvd1Jlc2l6ZSAoKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgY2hhcnRzW2ldLnJlc2l6ZShnZXRDaGFydFNpemUoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICQod2luZG93KS5vZmYoXCJyZXNpemVcIiwgb25XaW5kb3dSZXNpemUpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgJCh3aW5kb3cpLnJlc2l6ZShvbldpbmRvd1Jlc2l6ZSk7XHJcblxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9LCBlcnJIYW5kbGVyKTtcclxuXHJcbiAgICAgICRzY29wZS5zaG93Q29uZmlnID0gZmFsc2U7XHJcbiAgICAgICRzY29wZS5pc0FkbWluID0gd2luZG93LmlzQWRtaW47XHJcblxyXG4gICAgICAkc2NvcGUuc2VydmljZXMgPSBSZXBvcnQucXVlcnkoZnVuY3Rpb24oKXsgIC8vIGZvciBzaWRlYmFyXHJcbiAgICAgICAgJHNjb3BlLnNlcnZpY2VzLnNvcnQoZnVuY3Rpb24oYSwgYil7XHJcbiAgICAgICAgICByZXR1cm4gYS5zdGF0dXMubGFzdDI0SG91cnMudXB0aW1lIC0gYi5zdGF0dXMubGFzdDI0SG91cnMudXB0aW1lOyB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG59KSgpO1xyXG4iLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAndXNlIHN0cmljdCc7XHJcblxyXG4gIHZhciB3YXRjaG1lbkNvbnRyb2xsZXJzID0gYW5ndWxhci5tb2R1bGUoJ3dhdGNobWVuQ29udHJvbGxlcnMnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHNlcnZpY2VcclxuICAgKi9cclxuXHJcbiAgd2F0Y2htZW5Db250cm9sbGVycy5jb250cm9sbGVyKCdTZXJ2aWNlRWRpdEN0cmwnLFxyXG5cclxuICAgIGZ1bmN0aW9uIChcclxuICAgICAgICAkc2NvcGUsXHJcbiAgICAgICAgJHN0YXRlLFxyXG4gICAgICAgICRmaWx0ZXIsXHJcbiAgICAgICAgJHN0YXRlUGFyYW1zLFxyXG4gICAgICAgIFNlcnZpY2UsXHJcbiAgICAgICAgUmVwb3J0LFxyXG4gICAgICAgIHVzU3Bpbm5lclNlcnZpY2VcclxuICAgICkge1xyXG5cclxuICAgICAgZnVuY3Rpb24gbG9hZGluZygpe1xyXG4gICAgICAgIHVzU3Bpbm5lclNlcnZpY2Uuc3Bpbignc3Bpbm5lci0xJyk7XHJcbiAgICAgICAgJHNjb3BlLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBsb2FkZWQoKXtcclxuICAgICAgICB1c1NwaW5uZXJTZXJ2aWNlLnN0b3AoJ3NwaW5uZXItMScpO1xyXG4gICAgICAgICRzY29wZS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxvYWRpbmcoKTtcclxuXHJcbiAgICAgICRzY29wZS5lZGl0U2VydmljZVRpdGxlID0gXCJVcGRhdGUgc2VydmljZVwiO1xyXG5cclxuICAgICAgJHNjb3BlLnNlcnZpY2UgPSBTZXJ2aWNlLmdldCh7aWQ6ICRzdGF0ZVBhcmFtcy5pZH0sIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgbG9hZGVkKCk7XHJcbiAgICAgIH0sIGZ1bmN0aW9uKGVycil7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICRzdGF0ZS5nbygnc2VydmljZXMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9hZGVkKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgJHNjb3BlLnNhdmUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICRzY29wZS5zZXJ2aWNlLnBpbmdTZXJ2aWNlT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgICRzY29wZS5zZXJ2aWNlLnBpbmdTZXJ2aWNlT3B0aW9uc1skc2NvcGUuc2VydmljZS5waW5nU2VydmljZU5hbWVdID0gJHNjb3BlLnNlbGVjdGVkUGluZ1NlcnZpY2VPcHRpb25zO1xyXG5cclxuICAgICAgICAkc2NvcGUuc2VydmljZS4kc2F2ZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBSZXBvcnQuY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgICAgJHN0YXRlLmdvKCdzZXJ2aWNlcycpO1xyXG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5lcnJvcnMpIHtcclxuICAgICAgICAgICAgJHNjb3BlLnNlcnZpY2VBZGRFcnJvcnMgPSByZXNwb25zZS5kYXRhLmVycm9ycztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgICRzY29wZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJHN0YXRlLmdvKCdzZXJ2aWNlcycpO1xyXG4gICAgICB9O1xyXG5cclxuICAgIH0pO1xyXG5cclxufSkoKTtcclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICB2YXIgU0VSVklDRVNfUE9MTElOR19JTlRFUlZBTCA9IDEwMDAwO1xyXG4gIHZhciB0aW1lcjtcclxuXHJcbiAgdmFyIHdhdGNobWVuQ29udHJvbGxlcnMgPSBhbmd1bGFyLm1vZHVsZSgnd2F0Y2htZW5Db250cm9sbGVycycpO1xyXG5cclxuICB3YXRjaG1lbkNvbnRyb2xsZXJzLmNvbnRyb2xsZXIoJ1NlcnZpY2VMaXN0Q3RybCcsXHJcbiAgICAgIGZ1bmN0aW9uIChcclxuICAgICAgICAgICRzY29wZSxcclxuICAgICAgICAgICRmaWx0ZXIsXHJcbiAgICAgICAgICAkdGltZW91dCxcclxuICAgICAgICAgIFJlcG9ydCxcclxuICAgICAgICAgIFNlcnZpY2UsXHJcbiAgICAgICAgICB1c1NwaW5uZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgbmdUYWJsZVV0aWxzXHJcbiAgICAgICkge1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZU5leHRUaWNrKCkge1xyXG4gICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHRpbWVyKTtcclxuICAgICAgICAgIHRpbWVyID0gJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZWxvYWQoc2NoZWR1bGVOZXh0VGljaywgbG9hZFNlcnZpY2VzRXJySGFuZGxlcik7XHJcbiAgICAgICAgICB9LCBTRVJWSUNFU19QT0xMSU5HX0lOVEVSVkFMKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGxvYWRTZXJ2aWNlc0VyckhhbmRsZXIoZXJyKSB7XHJcbiAgICAgICAgICAkc2NvcGUuZXJyb3JMb2FkaW5nU2VydmljZXMgPSBcIkVycm9yIGxvYWRpbmcgZGF0YSBmcm9tIHJlbW90ZSBzZXJ2ZXJcIjtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIHNjaGVkdWxlTmV4dFRpY2soKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlbG9hZChkb25lQ2IsIGVycm9ySGFuZGxlcikge1xyXG4gICAgICAgICAgUmVwb3J0LmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgICRzY29wZS5zZXJ2aWNlcyA9IFJlcG9ydC5xdWVyeShmdW5jdGlvbiAoc2VydmljZXMpIHtcclxuICAgICAgICAgICAgJHNjb3BlW2tleV0gPSBzZXJ2aWNlcztcclxuICAgICAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnJlbG9hZCgpO1xyXG5cclxuICAgICAgICAgICAgJHNjb3BlLmVycm9yTG9hZGluZ1NlcnZpY2VzID0gbnVsbDsgLy8gcmVzZXQgZXJyb3JcclxuICAgICAgICAgICAgdHJhbnNpdGlvbi5sb2FkZWQoKTtcclxuICAgICAgICAgICAgZG9uZUNiKCk7XHJcbiAgICAgICAgICB9LCBlcnJvckhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHRyYW5zaXRpb24gPSB7XHJcbiAgICAgICAgICBsb2FkaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHVzU3Bpbm5lclNlcnZpY2Uuc3Bpbignc3Bpbm5lci0xJyk7XHJcbiAgICAgICAgICAgICRzY29wZS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2FkZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdXNTcGlubmVyU2VydmljZS5zdG9wKCdzcGlubmVyLTEnKTtcclxuICAgICAgICAgICAgJHNjb3BlLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIga2V5ID0gJ3RhYmxlU2VydmljZXNEYXRhJztcclxuICAgICAgICAkc2NvcGVba2V5XSA9IFtdO1xyXG4gICAgICAgICRzY29wZS50YWJsZVBhcmFtcyA9IG5nVGFibGVVdGlscy5jcmVhdGVuZ1RhYmxlUGFyYW1zKGtleSwgJHNjb3BlLCAkZmlsdGVyKTtcclxuXHJcbiAgICAgICAgdmFyIGZpbHRlclRvTWVDaGVja2JveElzUHJlc2VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWx0ZXJSZXN0cmljdGVkVG9NZScpO1xyXG4gICAgICAgIGlmIChmaWx0ZXJUb01lQ2hlY2tib3hJc1ByZXNlbnQgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkge1xyXG4gICAgICAgICAgdmFyIGZpbHRlclRvTWVTdG9yZWRWYWx1ZSA9ICh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2ZpbHRlclJlc3RyaWN0ZWRUb01lJykgPT09ICd0cnVlJyk7XHJcbiAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBmaWx0ZXJUb01lQ2hlY2tib3hJc1ByZXNlbnQuY2hlY2tlZCA9IGZpbHRlclRvTWVTdG9yZWRWYWx1ZTtcclxuICAgICAgICAgICAgJHNjb3BlLmZpbHRlclJlc3RyaWN0ZWRUb01lID0gZmlsdGVyVG9NZVN0b3JlZFZhbHVlO1xyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkc2NvcGUuJHdhdGNoKCdmaWx0ZXJSZXN0cmljdGVkVG9NZScsXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2ZpbHRlclJlc3RyaWN0ZWRUb01lJywgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRyYW5zaXRpb24ubG9hZGluZygpO1xyXG5cclxuICAgICAgICAkc2NvcGUuc2VydmljZUZpbHRlciA9IGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgIGlmICgkc2NvcGUuZmlsdGVyUmVzdHJpY3RlZFRvTWUgJiYgIXJvdy5zZXJ2aWNlLmlzUmVzdHJpY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcm93LnNlcnZpY2UubmFtZS5pbmRleE9mKCRzY29wZS5xdWVyeSB8fCAnJykgPiAtMTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAkc2NvcGUuZGVsZXRlID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICBpZiAoY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHNlcnZpY2UgYW5kIGFsbCBpdHMgZGF0YT8nKSkge1xyXG4gICAgICAgICAgICBTZXJ2aWNlLmRlbGV0ZSh7aWQ6IGlkfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHJlbG9hZChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHNjb3BlLmVycm9yTG9hZGluZ1NlcnZpY2VzID0gXCJFcnJvciBsb2FkaW5nIGRhdGEgZnJvbSByZW1vdGUgc2VydmVyXCI7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICRzY29wZS5yZXNldCA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgaWYgKGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXNldCB0aGlzIHNlcnZpY2VcXCdzIGRhdGE/JykpIHtcclxuICAgICAgICAgICAgU2VydmljZS5yZXNldCh7aWQ6IGlkfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHJlbG9hZChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHNjb3BlLmVycm9yTG9hZGluZ1NlcnZpY2VzID0gXCJFcnJvciBsb2FkaW5nIGRhdGEgZnJvbSByZW1vdGUgc2VydmVyXCI7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJlbG9hZChzY2hlZHVsZU5leHRUaWNrLCBsb2FkU2VydmljZXNFcnJIYW5kbGVyKTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxufSkoKTtcclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICB3aW5kb3cuQ2hhcnRpbmcgPSB3aW5kb3cuQ2hhcnRpbmcgfHwge307XHJcblxyXG4gIHZhciBNSU5VVEUgPSA2MCAqIDEwMDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgYSBDMyBjaGFydFxyXG4gICAqIEBwYXJhbSBkYXRhXHJcbiAgICovXHJcbiAgQ2hhcnRpbmcucmVuZGVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuXHJcbiAgICB2YXIgbGF0ZW5jeURhdGEgPSBwYXJzZUFycmF5T2JqZWN0c0ZvckNoYXJ0aW5nKG9wdGlvbnMubGF0ZW5jeSwgJ3QnLCAnbCcpO1xyXG5cclxuICAgIHZhciBsYXRlbmN5U2VyaWUgPSBsYXRlbmN5RGF0YS5kYXRhO1xyXG4gICAgdmFyIHRpbWVTZXJpZSA9IGxhdGVuY3lEYXRhLnRpbWU7XHJcblxyXG4gICAgdGltZVNlcmllLnNwbGljZSgwLCAwLCAneCcpO1xyXG4gICAgbGF0ZW5jeVNlcmllLnNwbGljZSgwLCAwLCAnTGF0ZW5jeScpO1xyXG5cclxuICAgIHZhciBvdXRhZ2VzUmVnaW9ucyA9IFtdO1xyXG4gICAgaWYgKG9wdGlvbnMub3V0YWdlcykge1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMub3V0YWdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBvdXRhZ2UgPSBvcHRpb25zLm91dGFnZXNbaV07XHJcbiAgICAgICAgb3V0YWdlc1JlZ2lvbnMucHVzaCh7XHJcbiAgICAgICAgICBheGlzOiAneCcsXHJcbiAgICAgICAgICBzdGFydDogb3V0YWdlLnRpbWVzdGFtcCxcclxuICAgICAgICAgIGVuZDogb3V0YWdlLnRpbWVzdGFtcCArIG91dGFnZS5kb3dudGltZSxcclxuICAgICAgICAgIGNsYXNzOiAncmVnaW9uLW91dGFnZScsXHJcbiAgICAgICAgICBvcGFjaXR5OiAxXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVnaW9ucyA9IFtcclxuICAgICAge2F4aXM6ICd5Jywgc3RhcnQ6IG9wdGlvbnMudGhyZXNob2xkLCBjbGFzczogJ3JlZ2lvbi1sYXRlbmN5LXdhcm5pbmcnfSxcclxuICAgIF0uY29uY2F0KG91dGFnZXNSZWdpb25zKTtcclxuXHJcbiAgICByZXR1cm4gZ2VuZXJhdGVMYXRlbmN5Q2hhcnQoe1xyXG4gICAgICBzaXplOiBvcHRpb25zLnNpemUsXHJcbiAgICAgIGlkOiBvcHRpb25zLmlkLFxyXG4gICAgICB4X2Zvcm1hdDogb3B0aW9ucy54X2Zvcm1hdCxcclxuICAgICAgY29sdW1uczogW3RpbWVTZXJpZSwgbGF0ZW5jeVNlcmllXSxcclxuICAgICAgZ3JpZDoge1xyXG4gICAgICAgIHk6IHtcclxuICAgICAgICAgIGxpbmVzOiBbXHJcbiAgICAgICAgICAgIHt2YWx1ZTogb3B0aW9ucy50aHJlc2hvbGQsIHRleHQ6ICdsYXRlbmN5IHRocmVzaG9sZCcsIGNsYXNzOiAndGhyZXNob2xkJ31cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlZ2lvbnM6IHJlZ2lvbnMsXHJcbiAgICAgIG1heDogb3B0aW9ucy5tYXhcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIFt7dDogMTQyODIyMDgwMDAwMCwgbDogMTIzLjIzfV1cclxuICAgKlxyXG4gICAqIGludG9cclxuICAgKlxyXG4gICAqIHsgdGltZSA6IFsxNDI4MjIwODAwMDAwXSwgZGF0YTogWzEyM10gfVxyXG4gICAqXHJcbiAgICovXHJcbiAgZnVuY3Rpb24gcGFyc2VBcnJheU9iamVjdHNGb3JDaGFydGluZyhhcnIsIGZpZWxkVGltZSwgZmllbGREYXRhKSB7XHJcbiAgICB2YXIgdGltZSA9IFtdO1xyXG4gICAgdmFyIGxhdGVuY3kgPSBbXTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRpbWUucHVzaChbYXJyW2ldW2ZpZWxkVGltZV1dKTtcclxuICAgICAgbGF0ZW5jeS5wdXNoKE1hdGgucm91bmQoW2FycltpXVtmaWVsZERhdGFdXSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt0aW1lOiB0aW1lLCBkYXRhOiBsYXRlbmN5fTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdlbmVyYXRlTGF0ZW5jeUNoYXJ0IChvcHRpb25zKSB7XHJcblxyXG4gICAgcmV0dXJuIGMzLmdlbmVyYXRlKHtcclxuICAgICAgc2l6ZTogb3B0aW9ucy5zaXplLFxyXG4gICAgICBiaW5kdG86IG9wdGlvbnMuaWQsXHJcbiAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgIHNob3c6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICB4OiAneCcsXHJcbiAgICAgICAgY29sdW1uczogb3B0aW9ucy5jb2x1bW5zLFxyXG4gICAgICAgIHR5cGVzOiB7XHJcbiAgICAgICAgICBMYXRlbmN5OiAnYXJlYSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbG9yczoge1xyXG4gICAgICAgICAgTGF0ZW5jeTogJ2dyZWVuJ1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgYXhpczoge1xyXG4gICAgICAgIHk6IHtcclxuICAgICAgICAgIG1heDogaXNOYU4ob3B0aW9ucy5tYXgpID8gMCA6IG9wdGlvbnMubWF4LFxyXG4gICAgICAgICAgdGljazoge1xyXG4gICAgICAgICAgICB2YWx1ZXM6IFsyMDAsIDUwMCwgMTAwMCwgMjAwMCwgMzAwMCwgNDAwMCwgNTAwMCwgNzAwMCwgMTAwMDAsIDE1MDAwLCAyMDAwMCwgMzAwMDBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB4OiB7XHJcbiAgICAgICAgICB0eXBlOiAndGltZXNlcmllcycsXHJcbiAgICAgICAgICB0aWNrOiB7XHJcbiAgICAgICAgICAgIGZvcm1hdDogb3B0aW9ucy54X2Zvcm1hdCB8fCAnJUg6JU0nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBncmlkOiBvcHRpb25zLmdyaWQsXHJcbiAgICAgIHJlZ2lvbnM6IG9wdGlvbnMucmVnaW9ucyxcclxuICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgIGZvcm1hdDoge1xyXG4gICAgICAgICAgdGl0bGU6IGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZCkuZm9ybWF0KCdERC9NTU0vWVkgSEg6bW0nKSArICcgKCcgKyBtb21lbnQoZCkuZnJvbU5vdygpICsgJyknO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIHJhdGlvLCBpZCkge1xyXG4gICAgICAgICAgICBpZiAoaWQgPT0gJ091dGFnZXMnKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudC5kdXJhdGlvbih2YWx1ZSkuaHVtYW5pemUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyAnIG1zLic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG59KSgpO1xyXG4iLCJhbmd1bGFyLm1vZHVsZSgnd2F0Y2htZW5EaXJlY3RpdmVzJywgW10pOyIsInZhciB3YXRjaG1lbkRpcmVjdGl2ZXMgPSBhbmd1bGFyLm1vZHVsZSgnd2F0Y2htZW5EaXJlY3RpdmVzJyk7XHJcblxyXG53YXRjaG1lbkRpcmVjdGl2ZXMuZGlyZWN0aXZlKCdwaW5nU2VydmljZU9wdGlvbnMnLCBmdW5jdGlvbiAoUGluZ1BsdWdpbnMpIHtcclxuICByZXR1cm4ge1xyXG4gICAgcmVzdHJpY3Q6ICdFQScsIC8vRSA9IGVsZW1lbnQsIEEgPSBhdHRyaWJ1dGUsIEMgPSBjbGFzcywgTSA9IGNvbW1lbnRcclxuICAgIHRlbXBsYXRlVXJsOiAncGluZy1zZXJ2aWNlLW9wdGlvbnMuaHRtbCcsXHJcbiAgICBzY29wZTogZmFsc2UsXHJcbiAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUpIHtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY29wZS5waW5nU2VydmljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChzY29wZS5waW5nU2VydmljZXNbaV0ubmFtZSA9PT0gc2NvcGUuc2VydmljZS5waW5nU2VydmljZU5hbWUpIHtcclxuICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWRQaW5nU2VydmljZU9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgc2NvcGUucGluZ1NlcnZpY2VzW2ldLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAoc2NvcGUuc2VydmljZS5waW5nU2VydmljZU9wdGlvbnMgfHwge30pW3Njb3BlLnNlcnZpY2UucGluZ1NlcnZpY2VOYW1lXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzY29wZS5waW5nU2VydmljZXMgPSBQaW5nUGx1Z2lucy5xdWVyeShmdW5jdGlvbigpe1xyXG4gICAgICAgIHNjb3BlLiR3YXRjaCgnc2VydmljZS5waW5nU2VydmljZU5hbWUnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHVwZGF0ZU9wdGlvbnMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzY29wZS5oYXNQaW5nU2VydmljZU9wdGlvbnMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgIHJldHVybiAhYW5ndWxhci5lcXVhbHMoe30sIHNjb3BlLnNlbGVjdGVkUGluZ1NlcnZpY2VPcHRpb25zKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9O1xyXG59KTtcclxuIiwiKGZ1bmN0aW9uKCl7XHJcblxyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIC8qIEFwcCBNb2R1bGUgKi9cclxuXHJcbiAgICB2YXIgd2F0Y2htZW5BcHAgPSBhbmd1bGFyLm1vZHVsZSgnd2F0Y2htZW5BcHAnLCBbXHJcbiAgICAgICAgJ3VpLnJvdXRlcicsXHJcbiAgICAgICAgJ2FuZ3VsYXJTcGlubmVyJyxcclxuICAgICAgICAnbmdUYWJsZScsIC8vIHRhYmxlIHNvcnRpbmcgYW5kIHBhZ2luYXRpb25cclxuICAgICAgICAnYW5ndWxhck1vbWVudCcsXHJcbiAgICAgICAgJ2FuZ3VsYXJNU1RpbWUnLFxyXG4gICAgICAgICd3YXRjaG1lbkNvbnRyb2xsZXJzJyxcclxuICAgICAgICAnd2F0Y2htZW5EaXJlY3RpdmVzJyxcclxuICAgICAgICAnd2F0Y2htZW5GYWN0b3JpZXMnLFxyXG4gICAgICAgICduZ1Jlc291cmNlJ1xyXG4gICAgXSk7XHJcblxyXG4gICAgd2F0Y2htZW5BcHAuY29uZmlnKGZ1bmN0aW9uKCRzdGF0ZVByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlciwgJHVybFJvdXRlclByb3ZpZGVyKSB7XHJcblx0XHJcbiAgICAgICAgJGxvY2F0aW9uUHJvdmlkZXIuaHRtbDVNb2RlKHRydWUpO1xyXG5cclxuICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgnc2VydmljZXMnLCB7XHJcbiAgICAgICAgICAgIHVybDogJy9zZXJ2aWNlcycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnc2VydmljZS1saXN0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiAnU2VydmljZUxpc3RDdHJsJ1xyXG4gICAgICAgIH0pLnN0YXRlKCd2aWV3U2VydmljZScsIHtcclxuICAgICAgICAgICAgdXJsOiAnL3NlcnZpY2VzLzppZC92aWV3JyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdzZXJ2aWNlLWRldGFpbC5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogJ1NlcnZpY2VEZXRhaWxDdHJsJ1xyXG4gICAgICAgIH0pLnN0YXRlKCduZXdTZXJ2aWNlJywge1xyXG4gICAgICAgICAgICB1cmw6ICcvc2VydmljZXMvYWRkJyxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdzZXJ2aWNlLWVkaXQuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZXJ2aWNlQWRkQ3RybCdcclxuICAgICAgICB9KS5zdGF0ZSgnZWRpdFNlcnZpY2UnLCB7XHJcbiAgICAgICAgICAgIHVybDogJy9zZXJ2aWNlcy86aWQvZWRpdCcsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnc2VydmljZS1lZGl0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiAnU2VydmljZUVkaXRDdHJsJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkdXJsUm91dGVyUHJvdmlkZXIud2hlbignLycsICcvc2VydmljZXMnKTtcclxuICAgIH0pO1xyXG5cclxufSkoKTtcclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICBhbmd1bGFyLm1vZHVsZSgnd2F0Y2htZW5GYWN0b3JpZXMnLCBbXSk7XHJcblxyXG4gIHZhciBDQUNIRV9FWFBJUkFUSU9OID0gMzAwMDA7IC8vIG1zXHJcblxyXG4gIHZhciBmYWN0b3JpZXMgPSBhbmd1bGFyLm1vZHVsZSgnd2F0Y2htZW5GYWN0b3JpZXMnKTtcclxuICB2YXIgcmVwb3J0Q2FjaGU7XHJcbiAgdmFyIHBpbmdQbHVnaW5zQ2FjaGU7XHJcbiAgXHJcbiAgZmFjdG9yaWVzLmZhY3RvcnkoJ1JlcG9ydCcsIGZ1bmN0aW9uICgkcmVzb3VyY2UsICRjYWNoZUZhY3RvcnkpIHtcclxuICAgIHJlcG9ydENhY2hlID0gJGNhY2hlRmFjdG9yeSgnU2VydmljZXMnKTtcclxuXHJcbiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpe1xyXG4gICAgICByZXBvcnRDYWNoZS5yZW1vdmVBbGwoKTtcclxuICAgIH0sIENBQ0hFX0VYUElSQVRJT04pO1xyXG4gICAgXHJcbiAgICB2YXIgUmVwb3J0ID0gJHJlc291cmNlKCcvYXBpL3JlcG9ydC9zZXJ2aWNlcy86aWQnLCB7aWQ6ICdAaWQnfSwge1xyXG4gICAgICAnZ2V0JzogeyBtZXRob2Q6J0dFVCcsIGNhY2hlOiByZXBvcnRDYWNoZX0sXHJcbiAgICAgICdxdWVyeSc6IHsgbWV0aG9kOidHRVQnLCBpc0FycmF5OnRydWUsIGNhY2hlOiByZXBvcnRDYWNoZX1cclxuICAgIH0pO1xyXG5cclxuICAgIFJlcG9ydC5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAocmVwb3J0Q2FjaGUpIHtcclxuICAgICAgICByZXBvcnRDYWNoZS5yZW1vdmVBbGwoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gUmVwb3J0O1xyXG4gIH0pO1xyXG5cclxuICBmYWN0b3JpZXMuZmFjdG9yeSgnU2VydmljZScsIGZ1bmN0aW9uICgkcmVzb3VyY2UpIHtcclxuICAgIHJldHVybiAkcmVzb3VyY2UoJy9hcGkvc2VydmljZXMvOmlkJyxcclxuICAgICAgICB7aWQ6ICdAaWQnfSwge1xyXG5cclxuICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICogUmVzdCBzZXJ2aWNlIGRhdGFcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgcmVzZXQ6IHtcclxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIHVybDogJy9hcGkvc2VydmljZXMvOmlkL3Jlc2V0J1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZmFjdG9yaWVzLmZhY3RvcnkoJ1BpbmdQbHVnaW5zJywgZnVuY3Rpb24gKCRyZXNvdXJjZSwgJGNhY2hlRmFjdG9yeSkge1xyXG4gICAgcGluZ1BsdWdpbnNDYWNoZSA9ICRjYWNoZUZhY3RvcnkoJ1BpbmdQbHVnaW5zJyk7XHJcbiAgICByZXR1cm4gJHJlc291cmNlKCcvYXBpL3BsdWdpbnMvOmlkJyxcclxuICAgICAgICB7aWQ6ICdAaWQnfSwge1xyXG4gICAgICAgICAgJ3F1ZXJ5JzogeyBtZXRob2Q6J0dFVCcsIGlzQXJyYXk6dHJ1ZSwgY2FjaGU6IHBpbmdQbHVnaW5zQ2FjaGV9XHJcbiAgICAgICAgfSk7XHJcbiAgfSk7XHJcbn0pKCk7IiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICB2YXIgU0FWRV9QQVJBTVNfSU5fTE9DQUxTVE9SQUdFID0gdHJ1ZTtcclxuXHJcbiAgYW5ndWxhci5tb2R1bGUoJ3dhdGNobWVuRmFjdG9yaWVzJykuZmFjdG9yeSgnbmdUYWJsZVV0aWxzJywgZnVuY3Rpb24gKG5nVGFibGVQYXJhbXMpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbG9jYWwgc3RvcmVkIG9yIGRlZmF1bHQgcGFyYW1ldGVycyBmb3IgbmdUYWJsZS5cclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqIEBwYXJhbSBwYWdlU2l6ZVxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gcGFyYW1ldGVyc1xyXG4gICAgICovXHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RGVmYXVsdFBhcmFtZXRlcnMoa2V5KSB7XHJcbiAgICAgIHZhciBkZWZhdWx0cyA9IHtcInNvcnRpbmdcIjoge1wic3RhdHVzLmxhc3QyNEhvdXJzLnVwdGltZVwiOiBcImFzY1wifX07XHJcblxyXG4gICAgICBpZiAoU0FWRV9QQVJBTVNfSU5fTE9DQUxTVE9SQUdFICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpIHtcclxuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVuZ1RhYmxlUGFyYW1zKGtleSwgJHNjb3BlLCAkZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBuZXcgbmdUYWJsZVBhcmFtcyhnZXREZWZhdWx0UGFyYW1ldGVycyhrZXkpLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0b3RhbDogJHNjb3BlW2tleV0ubGVuZ3RoLCAvLyBsZW5ndGggb2YgZGF0YVxyXG4gICAgICAgICAgICBjb3VudHM6IFtdLFxyXG4gICAgICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiAoJGRlZmVyLCBwYXJhbXMpIHtcclxuICAgICAgICAgICAgICB2YXIgZGF0YSA9ICRzY29wZVtrZXldO1xyXG4gICAgICAgICAgICAgIHZhciBvcmRlcmVkRGF0YSA9IHBhcmFtcy5zb3J0aW5nKCkgPyAkZmlsdGVyKCdvcmRlckJ5JykoZGF0YSwgcGFyYW1zLm9yZGVyQnkoKSkgOiBkYXRhO1xyXG4gICAgICAgICAgICAgICRkZWZlci5yZXNvbHZlKG9yZGVyZWREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgICAgICAgc29ydGluZzogcGFyYW1zLnNvcnRpbmcoKVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY3JlYXRlbmdUYWJsZVBhcmFtczogY3JlYXRlbmdUYWJsZVBhcmFtc1xyXG4gICAgfTtcclxuXHJcbiAgfSk7XHJcblxyXG59KSgpOyJdfQ==